diff options
25 files changed, 9231 insertions, 6190 deletions
diff --git a/sys/i386/isa/sound/pss.c b/sys/i386/isa/sound/pss.c new file mode 100644 index 0000000..17acfb2 --- /dev/null +++ b/sys/i386/isa/sound/pss.c @@ -0,0 +1,693 @@ +/* + * sound/pss.c + * + * The low level driver for the Personal Sound System (ECHO ESC614). + * + * Copyright by Hannu Savolainen 1993 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. 2. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include <i386/isa/sound/sound_config.h> + +#if defined(CONFIG_PSS) && defined(CONFIG_AUDIO) + +/* + * PSS registers. + */ +#define REG(x) (devc->base+x) +#define PSS_DATA 0 +#define PSS_STATUS 2 +#define PSS_CONTROL 2 +#define PSS_ID 4 +#define PSS_IRQACK 4 +#define PSS_PIO 0x1a + +/* + * Config registers + */ +#define CONF_PSS 0x10 +#define CONF_WSS 0x12 +#define CONF_SB 0x13 +#define CONF_CDROM 0x16 +#define CONF_MIDI 0x18 + +/* + * Status bits. + */ +#define PSS_FLAG3 0x0800 +#define PSS_FLAG2 0x0400 +#define PSS_FLAG1 0x1000 +#define PSS_FLAG0 0x0800 +#define PSS_WRITE_EMPTY 0x8000 +#define PSS_READ_FULL 0x4000 + +#include "coproc.h" + +#ifdef PSS_HAVE_LD +#include "synth-ld.h" +#else +static int pss_synthLen = 0; +static u_char pss_synth[1] = +{0}; + +#endif + +typedef struct pss_config { + int base; + int irq; + int dma; + sound_os_info *osp; +} pss_config; + +static pss_config pss_data; +static pss_config *devc = &pss_data; + +static int pss_initialized = 0; +static int nonstandard_microcode = 0; + +int +probe_pss(struct address_info * hw_config) +{ + u_short id; + int irq, dma; + + devc->base = hw_config->io_base; + irq = devc->irq = hw_config->irq; + dma = devc->dma = hw_config->dma; + devc->osp = hw_config->osp; + + /* these are the possible addresses */ + if (devc->base != 0x220 && devc->base != 0x240 && + devc->base != 0x230 && devc->base != 0x250) + return 0; + + /* these are the possible irqs */ + if (irq != 3 && irq != 5 && irq != 7 && irq != 9 && + irq != 10 && irq != 11 && irq != 12) + return 0; + + /* and these are the possible dmas */ + if (dma != 5 && dma != 6 && dma != 7) + return 0; + + id = inb(REG(PSS_ID)); + + /* XXX the following test cannot possibly succeed! - lr970714 */ + if ((id >> 8) != 'E') { + /* + * printf ("No PSS signature detected at 0x%x (0x%x)\n", + * devc->base, id); + */ + return 0; + } + return 1; +} + +static int +set_irq(pss_config * devc, int dev, int irq) +{ + static u_short irq_bits[16] = + { + 0x0000, 0x0000, 0x0000, 0x0008, + 0x0000, 0x0010, 0x0000, 0x0018, + 0x0000, 0x0020, 0x0028, 0x0030, + 0x0038, 0x0000, 0x0000, 0x0000 + }; + + u_short tmp, bits; + + if (irq < 0 || irq > 15) + return 0; + + tmp = inb(REG(dev)) & ~0x38; /* Load confreg, mask IRQ bits out */ + + if ((bits = irq_bits[irq]) == 0 && irq != 0) { + printf("PSS: Invalid IRQ %d\n", irq); + return 0; + } + outw(REG(dev), tmp | bits); + return 1; +} + +static int +set_io_base(pss_config * devc, int dev, int base) +{ + u_short tmp = inb(REG(dev)) & 0x003f; + u_short bits = (base & 0x0ffc) << 4; + + outw(REG(dev), bits | tmp); + + return 1; +} + +static int +set_dma(pss_config * devc, int dev, int dma) +{ + static u_short dma_bits[8] = + { + 0x0001, 0x0002, 0x0000, 0x0003, + 0x0000, 0x0005, 0x0006, 0x0007 + }; + + u_short tmp, bits; + + if (dma < 0 || dma > 7) + return 0; + + tmp = inb(REG(dev)) & ~0x07; /* Load confreg, mask DMA bits out */ + + if ((bits = dma_bits[dma]) == 0 && dma != 4) { + printf("PSS: Invalid DMA %d\n", dma); + return 0; + } + outw(REG(dev), tmp | bits); + return 1; +} + +static int +pss_reset_dsp(pss_config * devc) +{ + u_long i, limit = get_time() + 10; + + outw(REG(PSS_CONTROL), 0x2000); + + for (i = 0; i < 32768 && get_time() < limit; i++) + inb(REG(PSS_CONTROL)); + + outw(REG(PSS_CONTROL), 0x0000); + + return 1; +} + +static int +pss_put_dspword(pss_config * devc, u_short word) +{ + int i, val; + + for (i = 0; i < 327680; i++) { + val = inb(REG(PSS_STATUS)); + if (val & PSS_WRITE_EMPTY) { + outw(REG(PSS_DATA), word); + return 1; + } + } + return 0; +} + +static int +pss_get_dspword(pss_config * devc, u_short *word) +{ + int i, val; + + for (i = 0; i < 327680; i++) { + val = inb(REG(PSS_STATUS)); + if (val & PSS_READ_FULL) { + *word = inb(REG(PSS_DATA)); + return 1; + } + } + + return 0; +} + +static int +pss_download_boot(pss_config * devc, u_char *block, int size, int flags) +{ + int i, limit, val, count; + + if (flags & CPF_FIRST) { + /* _____ Warn DSP software that a boot is coming */ + outw(REG(PSS_DATA), 0x00fe); + + limit = get_time() + 10; + + for (i = 0; i < 32768 && get_time() < limit; i++) + if (inb(REG(PSS_DATA)) == 0x5500) + break; + + outw(REG(PSS_DATA), *block++); + + pss_reset_dsp(devc); + } + count = 1; + while (1) { + int j; + + for (j = 0; j < 327670; j++) { + /* _____ Wait for BG to appear */ + if (inb(REG(PSS_STATUS)) & PSS_FLAG3) + break; + } + + if (j == 327670) { + /* It's ok we timed out when the file was empty */ + if (count >= size && flags & CPF_LAST) + break; + else { + printf("\nPSS: DownLoad timeout problems, byte %d=%d\n", + count, size); + return 0; + } + } + /* _____ Send the next byte */ + outw(REG(PSS_DATA), *block++); + count++; + } + + if (flags & CPF_LAST) { + /* _____ Why */ + outw(REG(PSS_DATA), 0); + + limit = get_time() + 10; + for (i = 0; i < 32768 && get_time() < limit; i++) + val = inb(REG(PSS_STATUS)); + + limit = get_time() + 10; + for (i = 0; i < 32768 && get_time() < limit; i++) { + val = inb(REG(PSS_STATUS)); + if (val & 0x4000) + break; + } + + /* now read the version */ + for (i = 0; i < 32000; i++) { + val = inb(REG(PSS_STATUS)); + if (val & PSS_READ_FULL) + break; + } + if (i == 32000) + return 0; + + val = inb(REG(PSS_DATA)); + /* + * printf("<PSS: microcode version %d.%d loaded>", val/16, + * val % 16); + */ + } + return 1; +} + +void +attach_pss(struct address_info * hw_config) +{ + u_short id; + char tmp[100]; + + devc->base = hw_config->io_base; + devc->irq = hw_config->irq; + devc->dma = hw_config->dma; + devc->osp = hw_config->osp; + + if (!probe_pss(hw_config)) + return; + + id = inb(REG(PSS_ID)) & 0x00ff; + + /* + * Disable all emulations. Will be enabled later (if required). + */ + outw(REG(CONF_PSS), 0x0000); + outw(REG(CONF_WSS), 0x0000); + outw(REG(CONF_SB), 0x0000); + outw(REG(CONF_MIDI), 0x0000); + outw(REG(CONF_CDROM), 0x0000); + +#if YOU_REALLY_WANT_TO_ALLOCATE_THESE_RESOURCES + if (0) { + printf("pss.c: Can't allocate DMA channel\n"); + return; + } + if (!set_irq(devc, CONF_PSS, devc->irq)) { + printf("PSS: IRQ error\n"); + return; + } + if (!set_dma(devc, CONF_PSS, devc->dma)) { + printf("PSS: DRQ error\n"); + return; + } +#endif + + pss_initialized = 1; + sprintf(tmp, "ECHO-PSS Rev. %d", id); + conf_printf(tmp, hw_config); + + return; +} + +int +probe_pss_mpu(struct address_info * hw_config) +{ + int timeout; + + if (!pss_initialized) + return 0; + + if (0) { + printf("PSS: MPU I/O port conflict\n"); + return 0; + } + if (!set_io_base(devc, CONF_MIDI, hw_config->io_base)) { + printf("PSS: MIDI base error.\n"); + return 0; + } + if (!set_irq(devc, CONF_MIDI, hw_config->irq)) { + printf("PSS: MIDI IRQ error.\n"); + return 0; + } + if (!pss_synthLen) { + printf("PSS: Can't enable MPU. MIDI synth microcode not available.\n"); + return 0; + } + if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST)) { + printf("PSS: Unable to load MIDI synth microcode to DSP.\n"); + return 0; + } + /* + * Finally wait until the DSP algorithm has initialized itself and + * deactivates receive interrupt. + */ + + for (timeout = 900000; timeout > 0; timeout--) { + if ((inb(hw_config->io_base + 1) & 0x80) == 0) /* Input data avail */ + inb(hw_config->io_base); /* Discard it */ + else + break; /* No more input */ + } + +#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) + return probe_mpu401(hw_config); +#else + return 0 +#endif +} + +static int +pss_coproc_open(void *dev_info, int sub_device) +{ + switch (sub_device) { + case COPR_MIDI: + + if (pss_synthLen == 0) { + printf("PSS: MIDI synth microcode not available.\n"); + return -(EIO); + } + if (nonstandard_microcode) + if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST)) { + printf("PSS: Unable to load MIDI synth microcode to DSP.\n"); + return -(EIO); + } + nonstandard_microcode = 0; + break; + + default:; + } + return 0; +} + +static void +pss_coproc_close(void *dev_info, int sub_device) +{ + return; +} + +static void +pss_coproc_reset(void *dev_info) +{ + if (pss_synthLen) + if (!pss_download_boot(devc, pss_synth, pss_synthLen, CPF_FIRST | CPF_LAST)) { + printf("PSS: Unable to load MIDI synth microcode to DSP.\n"); + } + nonstandard_microcode = 0; +} + +static int +download_boot_block(void *dev_info, copr_buffer * buf) +{ + if (buf->len <= 0 || buf->len > sizeof(buf->data)) + return -(EINVAL); + + if (!pss_download_boot(devc, buf->data, buf->len, buf->flags)) { + printf("PSS: Unable to load microcode block to DSP.\n"); + return -(EIO); + } + nonstandard_microcode = 1; /* The MIDI microcode has been + * overwritten */ + + return 0; +} + +static int +pss_coproc_ioctl(void *dev_info, u_int cmd, ioctl_arg arg, int local) +{ + /* printf("PSS coproc ioctl %x %x %d\n", cmd, arg, local); */ + + switch (cmd) { + case SNDCTL_COPR_RESET: + pss_coproc_reset(dev_info); + return 0; + break; + + case SNDCTL_COPR_LOAD: + { + copr_buffer *buf; + int err; + + buf = (copr_buffer *) malloc(sizeof(copr_buffer), M_TEMP, M_WAITOK); + if (buf == NULL) + return -(ENOSPC); + + bcopy(&(((char *) arg)[0]), (char *) buf, sizeof(*buf)); + err = download_boot_block(dev_info, buf); + free(buf, M_TEMP); + return err; + } + break; + + case SNDCTL_COPR_RDATA: + { + copr_debug_buf buf; + u_long flags; + u_short tmp; + + bcopy(&(((char *) arg)[0]), (char *) &buf, sizeof(buf)); + + flags = splhigh(); + if (!pss_put_dspword(devc, 0x00d0)) { + splx(flags); + return -(EIO); + } + if (!pss_put_dspword(devc, (u_short) (buf.parm1 & 0xffff))) { + splx(flags); + return -(EIO); + } + if (!pss_get_dspword(devc, &tmp)) { + splx(flags); + return -(EIO); + } + buf.parm1 = tmp; + splx(flags); + + bcopy(&buf, &(((char *) arg)[0]), sizeof(buf)); + return 0; + } + break; + + case SNDCTL_COPR_WDATA: + { + copr_debug_buf buf; + u_long flags; + u_short tmp; + + bcopy(&(((char *) arg)[0]), (char *) &buf, sizeof(buf)); + + flags = splhigh(); + if (!pss_put_dspword(devc, 0x00d1)) { + splx(flags); + return -(EIO); + } + if (!pss_put_dspword(devc, (u_short) (buf.parm1 & 0xffff))) { + splx(flags); + return -(EIO); + } + tmp = (u_int) buf.parm2 & 0xffff; + if (!pss_put_dspword(devc, tmp)) { + splx(flags); + return -(EIO); + } + splx(flags); + return 0; + } + break; + + case SNDCTL_COPR_WCODE: + { + copr_debug_buf buf; + u_long flags; + u_short tmp; + + bcopy(&(((char *) arg)[0]), (char *) &buf, sizeof(buf)); + + flags = splhigh(); + if (!pss_put_dspword(devc, 0x00d3)) { + splx(flags); + return -(EIO); + } + if (!pss_put_dspword(devc, (u_short) (buf.parm1 & 0xffff))) { + splx(flags); + return -(EIO); + } + tmp = ((u_int) buf.parm2 >> 8) & 0xffff; + if (!pss_put_dspword(devc, tmp)) { + splx(flags); + return -(EIO); + } + tmp = (u_int) buf.parm2 & 0x00ff; + if (!pss_put_dspword(devc, tmp)) { + splx(flags); + return -(EIO); + } + splx(flags); + return 0; + } + break; + + case SNDCTL_COPR_RCODE: + { + copr_debug_buf buf; + u_long flags; + u_short tmp; + + bcopy(&(((char *) arg)[0]), (char *) &buf, sizeof(buf)); + + flags = splhigh(); + if (!pss_put_dspword(devc, 0x00d2)) { + splx(flags); + return -(EIO); + } + if (!pss_put_dspword(devc, (u_short) (buf.parm1 & 0xffff))) { + splx(flags); + return -(EIO); + } + if (!pss_get_dspword(devc, &tmp)) { /* Read msb */ + splx(flags); + return -(EIO); + } + buf.parm1 = tmp << 8; + + if (!pss_get_dspword(devc, &tmp)) { /* Read lsb */ + splx(flags); + return -(EIO); + } + buf.parm1 |= tmp & 0x00ff; + + splx(flags); + + bcopy(&buf, &(((char *) arg)[0]), sizeof(buf)); + return 0; + } + break; + + default: + return -(EINVAL); + } + + return -(EINVAL); +} + +static coproc_operations pss_coproc_operations = +{ + "ADSP-2115", + pss_coproc_open, + pss_coproc_close, + pss_coproc_ioctl, + pss_coproc_reset, + &pss_data +}; + +void +attach_pss_mpu(struct address_info * hw_config) +{ + int prev_devs; + +#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) + prev_devs = num_midis; + attach_mpu401(hw_config); + + if (num_midis == (prev_devs + 1)) /* The MPU driver installed + * itself */ + midi_devs[prev_devs]->coproc = &pss_coproc_operations; +#endif +} + +int +probe_pss_mss(struct address_info * hw_config) +{ + int timeout; + + if (!pss_initialized) + return 0; + + if (0) { + printf("PSS: WSS I/O port conflict\n"); + return 0; + } + if (!set_io_base(devc, CONF_WSS, hw_config->io_base)) { + printf("PSS: WSS base error.\n"); + return 0; + } + if (!set_irq(devc, CONF_WSS, hw_config->irq)) { + printf("PSS: WSS IRQ error.\n"); + return 0; + } + if (!set_dma(devc, CONF_WSS, hw_config->dma)) { + printf("PSS: WSS DRQ error\n"); + return 0; + } + /* + * For some reason the card returns 0xff in the WSS status register + * immediately after boot. Propably MIDI+SB emulation algorithm + * downloaded to the ADSP2115 spends some time initializing the card. + * Let's try to wait until it finishes this task. + */ + for (timeout = 0; + timeout < 100000 && (inb(hw_config->io_base + 3) & 0x3f) != 0x04; + timeout++); + + return probe_mss(hw_config); +} + +void +attach_pss_mss(struct address_info * hw_config) +{ + int prev_devs; + long ret; + + prev_devs = num_audiodevs; + attach_mss(hw_config); + + /* Check if The MSS driver installed itself */ + if (num_audiodevs == (prev_devs + 1)) + audio_devs[prev_devs]->coproc = &pss_coproc_operations; +} + +#endif diff --git a/sys/i386/isa/sound/pss.h b/sys/i386/isa/sound/pss.h new file mode 100644 index 0000000..e020af6 --- /dev/null +++ b/sys/i386/isa/sound/pss.h @@ -0,0 +1,371 @@ +/****************************************************************************** + + def.h + + Version 1.3 11/2/93 + + Copyright (c) 1993 Analog Devices Inc. All rights reserved + +******************************************************************************/ +/* Port offsets from base port for Sound Blaster DSP */ +#define DSP_PORT_CMSD0 0x00 /* C/MS music voice 1-6 data port, write only */ +#define DSP_PORT_CMSR0 0x01 /* C/MS music voice 1-6 register port, write only */ +#define DSP_PORT_CMSD1 0x02 /* C/MS music voice 7-12 data port, write only */ +#define DSP_PORT_CMSR1 0x03 /* C/MS music voice 7-12 register port, write only */ + +#define DSP_PORT_STATUS 0x04 /* DSP Status bits, read only */ +#define DSP_PORT_CONTROL 0x04 /* DSP Control bits, write only */ +#define DSP_PORT_DATA_LSB 0x05 /* Read or write LSB of 16 bit data */ + + +#define DSP_PORT_RESET 0x06 /* DSP Reset, write only */ +#define DSP_PORT_07h 0x07 /* reserved port */ + +#define DSP_PORT_FMD0 0x08 /* FM music data/status port, read/write */ +#define DSP_PORT_FMR0 0x09 /* FM music data/status port, write only */ + +#define DSP_PORT_RDDATA 0x0A /* DSP Read data, read only reading signals DSP */ +#define DSP_PORT_0Bh 0x0B /* reserved port */ +#define DSP_PORT_WRDATA 0x0C /* DSP Write data or command, write */ +#define DSP_PORT_WRBUSY 0x0C /* DSP Write buffer status (bit 7), read */ +#define DSP_PORT_0Dh 0x0D /* reserved port */ +#define DSP_PORT_DATAAVAIL 0x0E /* DSP Data available status (bit 7), read only */ +#define DSP_PORT_INTERFACE 0x0E /* Sets DMA Channel and Interrupt, write only */ +#define DSP_PORT_0Fh 0x0F /* reserved port (used on Pro cards) */ + +#define ADDR_MASK 0x003f + +#define INT_MASK 0xffc7 +#define INT_3_BITS 0x0008 +#define INT_5_BITS 0x0010 +#define INT_7_BITS 0x0018 +#define INT_9_BITS 0x0020 +#define INT_10_BITS 0x0028 +#define INT_11_BITS 0x0030 +#define INT_12_BITS 0x0038 + +#define GAME_BIT 0x0400 +#define GAME_BIT_MASK 0xfbff + +#define INT_TEST_BIT 0x0200 +#define INT_TEST_PASS 0x0100 +#define INT_TEST_BIT_MASK 0xFDFF + +#define DMA_MASK 0xfff8 +#define DMA_0_BITS 0x0001 +#define DMA_1_BITS 0x0002 +#define DMA_3_BITS 0x0003 +#define DMA_5_BITS 0x0004 +#define DMA_6_BITS 0x0005 +#define DMA_7_BITS 0x0006 + +#define DMA_TEST_BIT 0x0080 +#define DMA_TEST_PASS 0x0040 +#define DMA_TEST_BIT_MASK 0xFF7F + + +/* Echo DSP Flags */ + +#define DSP_FLAG3 0x10 +#define DSP_FLAG2 0x08 +#define DSP_FLAG1 0x80 +#define DSP_FLAG0 0x40 + +#define PSS_CONFIG 0x10 +#define PSS_WSS_CONFIG 0x12 +#define SB_CONFIG 0x14 +#define MIDI_CONFIG 0x18 +#define CD_CONFIG 0x16 +#define UART_CONFIG 0x1a + +#define PSS_DATA 0x00 +#define PSS_STATUS 0x02 +#define PSS_CONTROL 0x02 +#define PSS_ID_VERS 0x04 + +#define PSS_FLAG3 0x0800 +#define PSS_FLAG2 0x0400 +#define PSS_FLAG1 0x1000 +#define PSS_FLAG0 0x0800 + +/*_____ WSS defines */ +#define WSS_BASE_ADDRESS 0x530 +#define WSS_CONFIG 0x0 +#define WSS_VERSION 0x03 +#define WSS_SP0 0x04 +#define WSS_SP1 0x05 +#define WSS_SP2 0x06 +#define WSS_SP3 0x07 + +/*_____ SoundPort register addresses */ + +#define SP_LIN_SOURCE_CTRL 0x00 +#define SP_RIN_SOURCE_CTRL 0x01 +#define SP_LIN_GAIN_CTRL 0x10 +#define SP_RIN_GAIN_CTRL 0x11 +#define SP_LAUX1_CTRL 0x02 +#define SP_RAUX1_CTRL 0x03 +#define SP_LAUX2_CTRL 0x04 +#define SP_RAUX2_CTRL 0x05 +#define SP_LOUT_CTRL 0x06 +#define SP_ROUT_CTRL 0x07 +#define SP_CLK_FORMAT 0x48 +#define SP_INT_CONF 0x09 +#define SP_INT_CONF_MCE 0x49 +#define SP_PIN_CTRL 0x0a +#define SP_TEST_INIT 0x0b +#define SP_MISC_CTRL 0x0c +#define SP_MIX_CTRL 0x0d +#define SP_DMA_UCNT 0x0e +#define SP_DMA_LCNT 0x0f + +/*_____ Gain constants */ + +#define GAIN_0 0x00 +#define GAIN_1_5 0x01 +#define GAIN_3 0x02 +#define GAIN_4_5 0x03 +#define GAIN_6 0x04 +#define GAIN_7_5 0x05 +#define GAIN_9 0x06 +#define GAIN_10_5 0x07 +#define GAIN_12 0x08 +#define GAIN_13_5 0x09 +#define GAIN_15 0x0a +#define GAIN_16_5 0x0b +#define GAIN_18 0x0c +#define GAIN_19_5 0x0d +#define GAIN_21 0x0e +#define GAIN_22_5 0x0f +#define MUTE 0XFFFF + +/*_____ Attenuation constants */ + +#define ATTEN_0 0x00 +#define ATTEN_1_5 0x01 +#define ATTEN_3 0x02 +#define ATTEN_4_5 0x03 +#define ATTEN_6 0x04 +#define ATTEN_7_5 0x05 +#define ATTEN_9 0x06 +#define ATTEN_10_5 0x07 +#define ATTEN_12 0x08 +#define ATTEN_13_5 0x09 +#define ATTEN_15 0x0a +#define ATTEN_16_5 0x0b +#define ATTEN_18 0x0c +#define ATTEN_19_5 0x0d +#define ATTEN_21 0x0e +#define ATTEN_22_5 0x0f + + +#define PSS_WRITE_EMPTY 0x8000 + +#define CD_POL_MASK 0xFFBF +#define CD_POL_BIT 0x0040 + + + +/****************************************************************************** + + host.h + + Version 1.2 9/27/93 + + Copyright (c) 1993 Analog Devices Inc. All rights reserved + +******************************************************************************/ +#define SB_WRITE_FULL 0x80 +#define SB_READ_FULL 0x80 +#define SB_WRITE_STATUS 0x0C +#define SB_READ_STATUS 0x0E +#define SB_READ_DATA 0x0A +#define SB_WRITE_DATA 0x0C + +#define PSS_DATA_REG 0x00 +#define PSS_STATUS_REG 0x02 +#define PSS_WRITE_EMPTY 0x8000 +#define PSS_READ_FULL 0x4000 + +/*_____ 1848 Sound Port bit defines */ + +#define SP_IN_INIT 0x80 +#define MODE_CHANGE_ENABLE 0x40 +#define MODE_CHANGE_MASK 0xbf +#define TRANSFER_DISABLE 0x20 +#define TRANSFER_DISABLE_MASK 0xdf +#define ADDRESS_MASK 0xf0 + +/*_____ Status bits */ +#define INTERRUPT_STATUS 0x01 +#define PLAYBACK_READY 0x02 +#define PLAYBACK_LEFT 0x04 +/*_____ pbright is not left */ +#define PLAYBACK_UPPER 0x08 +/*_____ bplower is not upper */ + +#define SAMPLE_OVERRUN 0x10 +#define SAMPLE_UNDERRUN 0x10 +#define CAPTURE_READY 0x20 +#define CAPTURE_LEFT 0x40 +/*_____ cpright is not left */ +#define CAPTURE_UPPER 0x08 +/*_____ cplower is not upper */ + +/*_____ Input & Output regs bits */ +#define LINE_INPUT 0x80 +#define AUX_INPUT 0x40 +#define MIC_INPUT 0x80 +#define MIXED_DAC_INPUT 0xC0 +#define INPUT_GAIN_MASK 0xf0 +#define INPUT_MIC_GAIN_ENABLE 0x20 +#define INPUT_MIC_GAIN_MASK 0xdf +#define INPUT_SOURCE_MASK 0x3f +#define AUX_INPUT_ATTEN_MASK 0xf0 +#define AUX_INPUT_MUTE 0x80 +#define AUX_INPUT_MUTE_MASK 0x7f +#define OUTPUT_MUTE 0x80 +#define OUTPUT_MUTE_MASK 0x7f +#define OUTPUT_ATTEN_MASK 0xc0 + +/*_____ Clock and Data format reg bits */ +#define CLOCK_SELECT_MASK 0xfe +#define CLOCK_XTAL2 0x01 +#define CLOCK_XTAL1 0x00 +#define CLOCK_FREQ_MASK 0xf1 +#define STEREO_MONO_MASK 0xef +#define STEREO 0x10 +#define AUDIO_MONO 0x00 +#define LINEAR_COMP_MASK 0xdf +#define LINEAR 0x00 +#define COMPANDED 0x20 +#define FORMAT_MASK 0xbf +#define PCM 0x00 +#define ULAW 0x00 +#define TWOS_COMP 0x40 +#define ALAW 0x40 + +/*_____ Interface Configuration reg bits */ +#define PLAYBACK_ENABLE 0x01 +#define PLAYBACK_ENABLE_MASK 0xfe +#define CAPTURE_ENABLE 0x02 +#define CAPTURE_ENABLE_MASK 0xfd +#define SINGLE_DMA 0x04 +#define SINGLE_DMA_MASK 0xfb +#define DUAL_DMA 0x00 +#define AUTO_CAL_ENABLE 0x08 +#define AUTO_CAL_DISABLE_MASK 0xf7 +#define PLAYBACK_PIO_ENABLE 0x40 +#define PLAYBACK_DMA_MASK 0xbf +#define CAPTURE_PIO_ENABLE 0x80 +#define CAPTURE_DMA_MASK 0x7f + +/*_____ Pin control bits */ +#define INTERRUPT_ENABLE 0x02 +#define INTERRUPT_MASK 0xfd + +/*_____ Test and init reg bits */ +#define OVERRANGE_LEFT_MASK 0xfc +#define OVERRANGE_RIGHT_MASK 0xf3 +#define DATA_REQUEST_STATUS 0x10 +#define AUTO_CAL_IN_PROG 0x20 +#define PLAYBACK_UNDERRUN 0x40 +#define CAPTURE_UNDERRUN 0x80 + +/*_____ Miscellaneous Control reg bits */ +#define ID_MASK 0xf0 + +/*_____ Digital Mix Control reg bits */ +#define DIGITAL_MIX1_MUTE_MASK 0xfe +#define MIX_ATTEN_MASK 0x03 + +/*_____ 1848 Sound Port reg defines */ + +#define SP_LEFT_INPUT_CONTROL 0x0 +#define SP_RIGHT_INPUT_CONTROL 0x1 +#define SP_LEFT_AUX1_CONTROL 0x2 +#define SP_RIGHT_AUX1_CONTROL 0x3 +#define SP_LEFT_AUX2_CONTROL 0x4 +#define SP_RIGHT_AUX2_CONTROL 0x5 +#define SP_LEFT_OUTPUT_CONTROL 0x6 +#define SP_RIGHT_OUTPUT_CONTROL 0x7 +#define SP_CLOCK_DATA_FORMAT 0x8 +#define SP_INTERFACE_CONFIG 0x9 +#define SP_PIN_CONTROL 0xA +#define SP_TEST_AND_INIT 0xB +#define SP_MISC_INFO 0xC +#define SP_DIGITAL_MIX 0xD +#define SP_UPPER_BASE_COUNT 0xE +#define SP_LOWER_BASE_COUNT 0xF + +#define HOST_SP_ADDR (0x534) +#define HOST_SP_DATA (0x535) + + +/****************************************************************************** + + phillips.h + + Version 1.2 9/27/93 + + Copyright (c) 1993 Analog Devices Inc. All rights reserved + +******************************************************************************/ +/*_____ Phillips control SW defines */ + +/*_____ Settings and ranges */ +#define VOLUME_MAX 6 +#define VOLUME_MIN (-64) +#define VOLUME_RANGE 70 +#define VOLUME_STEP 2 +#define BASS_MAX 15 +#define BASS_MIN (-12) +#define BASS_STEP 2 +#define BASS_RANGE 27 +#define TREBLE_MAX 12 +#define TREBLE_MIN (-12) +#define TREBLE_STEP 2 +#define TREBLE_RANGE 24 + +#define VOLUME_CONSTANT 252 +#define BASS_CONSTANT 246 +#define TREBLE_CONSTANT 246 + +/*_____ Software commands */ +#define SET_MASTER_COMMAND 0x0010 +#define MASTER_VOLUME_LEFT 0x0000 +#define MASTER_VOLUME_RIGHT 0x0100 +#define MASTER_BASS 0x0200 +#define MASTER_TREBLE 0x0300 +#define MASTER_SWITCH 0x0800 + +#define STEREO_MODE 0x00ce +#define PSEUDO_MODE 0x00d6 +#define SPATIAL_MODE 0x00de +#define MONO_MODE 0x00c6 + + +#define PSS_STEREO 0x00ce +#define PSS_PSEUDO 0x00d6 +#define PSS_SPATIAL 0x00de +#define PSS_MONO 0x00c6 + +#define PHILLIPS_VOL_MIN -64 +#define PHILLIPS_VOL_MAX 6 +#define PHILLIPS_VOL_DELTA 70 +#define PHILLIPS_VOL_INITIAL -20 +#define PHILLIPS_VOL_CONSTANT 252 +#define PHILLIPS_VOL_STEP 2 +#define PHILLIPS_BASS_MIN -12 +#define PHILLIPS_BASS_MAX 15 +#define PHILLIPS_BASS_DELTA 27 +#define PHILLIPS_BASS_INITIAL 0 +#define PHILLIPS_BASS_CONSTANT 246 +#define PHILLIPS_BASS_STEP 2 +#define PHILLIPS_TREBLE_MIN -12 +#define PHILLIPS_TREBLE_MAX 12 +#define PHILLIPS_TREBLE_DELTA 24 +#define PHILLIPS_TREBLE_INITIAL 0 +#define PHILLIPS_TREBLE_CONSTANT 246 +#define PHILLIPS_TREBLE_STEP 2 + diff --git a/sys/i386/isa/sound/sb16_dsp.c b/sys/i386/isa/sound/sb16_dsp.c index 16df9d5..1e94e15 100644 --- a/sys/i386/isa/sound/sb16_dsp.c +++ b/sys/i386/isa/sound/sb16_dsp.c @@ -1,12 +1,12 @@ /* * sound/sb16_dsp.c - * + * * The low level driver for the SoundBlaster DSP chip. - * + * * (C) 1993 J. Schubert (jsb@sth.ruhr-uni-bochum.de) - * + * * based on SB-driver by (C) Hannu Savolainen - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -14,7 +14,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -26,568 +26,486 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * */ #define DEB(x) #define DEB1(x) -/* - * #define DEB_DMARES - */ #include <i386/isa/sound/sound_config.h> -#include <i386/isa/sound/sb_defs.h> +#include "sb.h" #include <i386/isa/sound/sb_mixer.h> +#include <i386/isa/sound/sbcard.h> -#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB16) && !defined(EXCLUDE_SB) && !defined(EXCLUDE_AUDIO) && !defined(EXCLUDE_SBPRO) +#if defined(CONFIG_SB16) && (NSB > 0) && defined(CONFIG_AUDIO) && defined(CONFIG_SBPRO) -extern int sbc_base; -extern int sbc_major; -extern int sbc_minor; - -static int sb16_dsp_ok = 0; /* +extern sound_os_info *sb_osp; +extern int sbc_base; - * * * * Set to 1 after successful * - * * initialization */ +static int sb16_dsp_ok = 0; static int dsp_16bit = 0; static int dsp_stereo = 0; -static int dsp_current_speed = 8000; /* - - - * * * * DSP_DEFAULT_SPEED; */ +static int dsp_current_speed = 8000; static int dsp_busy = 0; static int dma16, dma8; -static unsigned long dsp_count = 0; - -static int irq_mode = IMODE_NONE; /* +static int trigger_bits = 0; +static u_long dsp_count = 0; - - * * * * IMODE_INPUT, IMODE_OUTPUT - * or * * IMODE_NONE */ +static int irq_mode = IMODE_NONE; static int my_dev = 0; static volatile int intr_active = 0; -static int sb16_dsp_open (int dev, int mode); -static void sb16_dsp_close (int dev); -static void sb16_dsp_output_block (int dev, unsigned long buf, int count, int intrflag, int dma_restart); -static void sb16_dsp_start_input (int dev, unsigned long buf, int count, int intrflag, int dma_restart); -static int sb16_dsp_ioctl (int dev, unsigned int cmd, unsigned int arg, int local); -static int sb16_dsp_prepare_for_input (int dev, int bsize, int bcount); -static int sb16_dsp_prepare_for_output (int dev, int bsize, int bcount); -static void sb16_dsp_reset (int dev); -static void sb16_dsp_halt (int dev); -static int dsp_set_speed (int); -static int dsp_set_stereo (int); -static void dsp_cleanup (void); +static int sb16_dsp_open(int dev, int mode); +static void sb16_dsp_close(int dev); +static void sb16_dsp_output_block(int dev, u_long buf, int count, int intrflag, int dma_restart); +static void sb16_dsp_start_input(int dev, u_long buf, int count, int intrflag, int dma_restart); +static int sb16_dsp_ioctl(int dev, u_int cmd, ioctl_arg arg, int local); +static int sb16_dsp_prepare_for_input(int dev, int bsize, int bcount); +static int sb16_dsp_prepare_for_output(int dev, int bsize, int bcount); +static void sb16_dsp_reset(int dev); +static void sb16_dsp_halt(int dev); +static void sb16_dsp_trigger(int dev, int bits); +static int dsp_set_speed(int); +static int dsp_set_stereo(int); +static void dsp_cleanup(void); static struct audio_operations sb16_dsp_operations = { - "SoundBlaster 16", - DMA_AUTOMODE, - AFMT_U8 | AFMT_S16_LE, - NULL, - sb16_dsp_open, - sb16_dsp_close, - sb16_dsp_output_block, - sb16_dsp_start_input, - sb16_dsp_ioctl, - sb16_dsp_prepare_for_input, - sb16_dsp_prepare_for_output, - sb16_dsp_reset, - sb16_dsp_halt, - NULL, - NULL + "SoundBlaster 16", + DMA_AUTOMODE, + AFMT_U8 | AFMT_S16_LE, + NULL, + sb16_dsp_open, + sb16_dsp_close, + sb16_dsp_output_block, + sb16_dsp_start_input, + sb16_dsp_ioctl, + sb16_dsp_prepare_for_input, + sb16_dsp_prepare_for_output, + sb16_dsp_reset, + sb16_dsp_halt, + NULL, + NULL, + NULL, + NULL, + sb16_dsp_trigger }; static int -sb_dsp_command01 (unsigned char val) +sb_dsp_command01(u_char val) { - int i = 1 << 16; + int i = 1 << 16; - while (--i & (!INB (DSP_STATUS) & 0x80)); - if (!i) - printk ("SB16 sb_dsp_command01 Timeout\n"); - return sb_dsp_command (val); + while (--i & (!inb(DSP_STATUS) & 0x80)); + if (!i) + printf("SB16 sb_dsp_command01 Timeout\n"); + return sb_dsp_command(val); } static int -dsp_set_speed (int mode) +dsp_set_speed(int mode) { - DEB (printk ("dsp_set_speed(%d)\n", mode)); - if (mode) - { - if (mode < 5000) - mode = 5000; - if (mode > 44100) - mode = 44100; - dsp_current_speed = mode; + DEB(printf("dsp_set_speed(%d)\n", mode)); + if (mode) { + RANGE (mode, 5000, 44100); + dsp_current_speed = mode; } - return mode; + return mode; } static int -dsp_set_stereo (int mode) +dsp_set_stereo(int mode) { - DEB (printk ("dsp_set_stereo(%d)\n", mode)); - - dsp_stereo = mode; - - return mode; + DEB(printf("dsp_set_stereo(%d)\n", mode)); + dsp_stereo = mode; + return mode; } static int -dsp_set_bits (int arg) +dsp_set_bits(int arg) { - DEB (printk ("dsp_set_bits(%d)\n", arg)); + DEB(printf("dsp_set_bits(%d)\n", arg)); - if (arg) - switch (arg) - { - case 8: - dsp_16bit = 0; - break; - case 16: - dsp_16bit = 1; - break; - default: - dsp_16bit = 0; - } - return dsp_16bit ? 16 : 8; + if (arg) + dsp_16bit = (arg == 16) ? 1 : 0 ; + return dsp_16bit ? 16 : 8; } static int -sb16_dsp_ioctl (int dev, unsigned int cmd, unsigned int arg, int local) +sb16_dsp_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) { - switch (cmd) - { + switch (cmd) { case SOUND_PCM_WRITE_RATE: - if (local) - return dsp_set_speed (arg); - return IOCTL_OUT (arg, dsp_set_speed (IOCTL_IN (arg))); + if (local) + return dsp_set_speed((int) arg); + return *(int *) arg = dsp_set_speed((*(int *) arg)); case SOUND_PCM_READ_RATE: - if (local) - return dsp_current_speed; - return IOCTL_OUT (arg, dsp_current_speed); + if (local) + return dsp_current_speed; + return *(int *) arg = dsp_current_speed; case SNDCTL_DSP_STEREO: - if (local) - return dsp_set_stereo (arg); - return IOCTL_OUT (arg, dsp_set_stereo (IOCTL_IN (arg))); + if (local) + return dsp_set_stereo((int) arg); + return *(int *) arg = dsp_set_stereo((*(int *) arg)); case SOUND_PCM_WRITE_CHANNELS: - if (local) - return dsp_set_stereo (arg - 1) + 1; - return IOCTL_OUT (arg, dsp_set_stereo (IOCTL_IN (arg) - 1) + 1); + if (local) + return dsp_set_stereo((int) arg - 1) + 1; + return *(int *) arg = dsp_set_stereo((*(int *) arg) - 1) + 1; case SOUND_PCM_READ_CHANNELS: - if (local) - return dsp_stereo + 1; - return IOCTL_OUT (arg, dsp_stereo + 1); + if (local) + return dsp_stereo + 1; + return *(int *) arg = dsp_stereo + 1; case SNDCTL_DSP_SETFMT: - if (local) - return dsp_set_bits (arg); - return IOCTL_OUT (arg, dsp_set_bits (IOCTL_IN (arg))); + if (local) + return dsp_set_bits((int) arg); + return *(int *) arg = dsp_set_bits((*(int *) arg)); case SOUND_PCM_READ_BITS: - if (local) - return dsp_16bit ? 16 : 8; - return IOCTL_OUT (arg, dsp_16bit ? 16 : 8); - - case SOUND_PCM_WRITE_FILTER: /* - * NOT YET IMPLEMENTED - */ - if (IOCTL_IN (arg) > 1) - return IOCTL_OUT (arg, RET_ERROR (EINVAL)); + if (local) + return dsp_16bit ? 16 : 8; + return *(int *) arg = dsp_16bit ? 16 : 8; + + case SOUND_PCM_WRITE_FILTER: /* NOT YET IMPLEMENTED */ + if ((*(int *) arg) > 1) + return *(int *) arg = -(EINVAL); + + case FIOASYNC: + if (local) + return 1; + return *(int *) arg = 1; + + case FIONBIO: + if (local) + return 1; + return *(int *) arg = 1; + default: - return RET_ERROR (EINVAL); + return -(EINVAL); } - return RET_ERROR (EINVAL); + return -(EINVAL); } static int -sb16_dsp_open (int dev, int mode) +sb16_dsp_open(int dev, int mode) { - int retval; + int retval; - DEB (printk ("sb16_dsp_open()\n")); - if (!sb16_dsp_ok) - { - printk ("SB16 Error: SoundBlaster board not installed\n"); - return RET_ERROR (ENXIO); + DEB(printf("sb16_dsp_open()\n")); + if (!sb16_dsp_ok) { + printf("SB16 Error: SoundBlaster board not installed\n"); + return -(ENXIO); } + if (intr_active) + return -(EBUSY); - if (intr_active) - return RET_ERROR (EBUSY); + sb_reset_dsp(); - retval = sb_get_irq (); - if (retval < 0) - return retval; + irq_mode = IMODE_NONE; + dsp_busy = 1; + trigger_bits = 0; - sb_reset_dsp (); - - if (ALLOC_DMA_CHN (dma8, "SB16 (8bit)")) - { - printk ("SB16: Unable to grab DMA%d\n", dma8); - sb_free_irq (); - return RET_ERROR (EBUSY); - } - - if (dma16 != dma8) - if (ALLOC_DMA_CHN (dma16, "SB16 (16bit)")) - { - printk ("SB16: Unable to grab DMA%d\n", dma16); - sb_free_irq (); - RELEASE_DMA_CHN (dma8); - return RET_ERROR (EBUSY); - } - - irq_mode = IMODE_NONE; - dsp_busy = 1; - - return 0; + return 0; } static void -sb16_dsp_close (int dev) +sb16_dsp_close(int dev) { - unsigned long flags; + u_long flags; + + DEB(printf("sb16_dsp_close()\n")); + sb_dsp_command01(0xd9); + sb_dsp_command01(0xd5); - DEB (printk ("sb16_dsp_close()\n")); - sb_dsp_command01 (0xd9); - sb_dsp_command01 (0xd5); + flags = splhigh(); - DISABLE_INTR (flags); - RELEASE_DMA_CHN (dma8); + audio_devs[dev]->dmachan1 = dma8; - if (dma16 != dma8) - RELEASE_DMA_CHN (dma16); - sb_free_irq (); - dsp_cleanup (); - dsp_busy = 0; - RESTORE_INTR (flags); + dsp_cleanup(); + dsp_busy = 0; + splx(flags); } static void -sb16_dsp_output_block (int dev, unsigned long buf, int count, int intrflag, int dma_restart) +sb16_dsp_output_block(int dev, u_long buf, int count, int intrflag, int dma_restart) { - unsigned long flags, cnt; - - cnt = count; - if (dsp_16bit) - cnt >>= 1; - cnt--; - -#ifdef DEB_DMARES - printk ("output_block: %x %d %d\n", buf, count, intrflag); - if (intrflag) - { - int pos, chan = audio_devs[dev]->dmachan; - - DISABLE_INTR (flags); - clear_dma_ff (chan); - disable_dma (chan); - pos = get_dma_residue (chan); - enable_dma (chan); - RESTORE_INTR (flags); - printk ("dmapos=%d %x\n", pos, pos); + u_long flags, cnt; + + cnt = count; + if (dsp_16bit) + cnt >>= 1; + cnt--; + if (audio_devs[dev]->flags & DMA_AUTOMODE && intrflag && cnt==dsp_count) { + irq_mode = IMODE_OUTPUT; + intr_active = 1; + return; /* Auto mode on. No need to react */ } -#endif - if (audio_devs[dev]->flags & DMA_AUTOMODE && - intrflag && - cnt == dsp_count) - { - irq_mode = IMODE_OUTPUT; - intr_active = 1; - return; /* - * Auto mode on. No need to react - */ - } - DISABLE_INTR (flags); + flags = splhigh(); - if (dma_restart) - { - sb16_dsp_halt (dev); - DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE); + if (dma_restart) { + + sb16_dsp_halt(dev); + DMAbuf_start_dma(dev, buf, count, 1); } - sb_dsp_command (0x41); - sb_dsp_command ((unsigned char) ((dsp_current_speed >> 8) & 0xff)); - sb_dsp_command ((unsigned char) (dsp_current_speed & 0xff)); - sb_dsp_command ((unsigned char) (dsp_16bit ? 0xb6 : 0xc6)); - sb_dsp_command ((unsigned char) ((dsp_stereo ? 0x20 : 0) + - (dsp_16bit ? 0x10 : 0))); - sb_dsp_command01 ((unsigned char) (cnt & 0xff)); - sb_dsp_command ((unsigned char) (cnt >> 8)); - - dsp_count = cnt; - irq_mode = IMODE_OUTPUT; - intr_active = 1; - RESTORE_INTR (flags); + + + sb_dsp_command(0x41); + sb_dsp_command((u_char) ((dsp_current_speed >> 8) & 0xff)); + sb_dsp_command((u_char) (dsp_current_speed & 0xff)); + sb_dsp_command((u_char) (dsp_16bit ? 0xb6 : 0xc6)); + dsp_count = cnt; + sb_dsp_command((u_char) ((dsp_stereo ? 0x20 : 0) + + (dsp_16bit ? 0x10 : 0))); + sb_dsp_command((u_char) (cnt & 0xff)); + sb_dsp_command((u_char) (cnt >> 8)); + + irq_mode = IMODE_OUTPUT; + intr_active = 1; + splx(flags); } static void -sb16_dsp_start_input (int dev, unsigned long buf, int count, int intrflag, int dma_restart) +sb16_dsp_start_input(int dev, u_long buf, int count, int intrflag, int dma_restart) { - unsigned long flags, cnt; - - cnt = count; - if (dsp_16bit) - cnt >>= 1; - cnt--; - -#ifdef DEB_DMARES - printk ("start_input: %x %d %d\n", buf, count, intrflag); - if (intrflag) - { - int pos, chan = audio_devs[dev]->dmachan; - - DISABLE_INTR (flags); - clear_dma_ff (chan); - disable_dma (chan); - pos = get_dma_residue (chan); - enable_dma (chan); - RESTORE_INTR (flags); - printk ("dmapos=%d %x\n", pos, pos); - } -#endif - if (audio_devs[dev]->flags & DMA_AUTOMODE && - intrflag && - cnt == dsp_count) - { - irq_mode = IMODE_INPUT; - intr_active = 1; - return; /* - * Auto mode on. No need to react - */ - } - DISABLE_INTR (flags); + u_long flags, cnt; - if (dma_restart) - { - sb_reset_dsp (); - DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ); + cnt = count; + if (dsp_16bit) + cnt >>= 1; + cnt--; + + if (audio_devs[dev]->flags & DMA_AUTOMODE && intrflag && cnt == dsp_count) { + irq_mode = IMODE_INPUT; + intr_active = 1; + return; /* Auto mode on. No need to react */ } + flags = splhigh(); - sb_dsp_command (0x42); - sb_dsp_command ((unsigned char) ((dsp_current_speed >> 8) & 0xff)); - sb_dsp_command ((unsigned char) (dsp_current_speed & 0xff)); - sb_dsp_command ((unsigned char) (dsp_16bit ? 0xbe : 0xce)); - sb_dsp_command ((unsigned char) ((dsp_stereo ? 0x20 : 0) + - (dsp_16bit ? 0x10 : 0))); - sb_dsp_command01 ((unsigned char) (cnt & 0xff)); - sb_dsp_command ((unsigned char) (cnt >> 8)); - - dsp_count = cnt; - irq_mode = IMODE_INPUT; - intr_active = 1; - RESTORE_INTR (flags); + if (dma_restart) { + sb_reset_dsp(); + DMAbuf_start_dma(dev, buf, count, 0); + } + sb_dsp_command(0x42); + sb_dsp_command((u_char) ((dsp_current_speed >> 8) & 0xff)); + sb_dsp_command((u_char) (dsp_current_speed & 0xff)); + sb_dsp_command((u_char) (dsp_16bit ? 0xbe : 0xce)); + dsp_count = cnt; + sb_dsp_command((u_char) ((dsp_stereo ? 0x20 : 0) + + (dsp_16bit ? 0x10 : 0))); + sb_dsp_command01((u_char) (cnt & 0xff)); + sb_dsp_command((u_char) (cnt >> 8)); + + irq_mode = IMODE_INPUT; + intr_active = 1; + splx(flags); } static int -sb16_dsp_prepare_for_input (int dev, int bsize, int bcount) +sb16_dsp_prepare_for_input(int dev, int bsize, int bcount) { - audio_devs[my_dev]->dmachan = dsp_16bit ? dma16 : dma8; - dsp_count = 0; - dsp_cleanup (); - return 0; + audio_devs[my_dev]->dmachan2 = dsp_16bit ? dma16 : dma8; + dsp_count = 0; + dsp_cleanup(); + if (dsp_16bit) + sb_dsp_command(0xd5); /* Halt DMA until trigger() is called */ + else + sb_dsp_command(0xd0); /* Halt DMA until trigger() is called */ + + trigger_bits = 0; + return 0; } static int -sb16_dsp_prepare_for_output (int dev, int bsize, int bcount) +sb16_dsp_prepare_for_output(int dev, int bsize, int bcount) { - audio_devs[my_dev]->dmachan = dsp_16bit ? dma16 : dma8; - dsp_count = 0; - dsp_cleanup (); - return 0; + int fudge = dsp_16bit ? dma16 : dma8; + + isa_dma_release( audio_devs[my_dev]->dmachan1 ); + isa_dma_acquire(fudge); + + audio_devs[my_dev]->dmachan1 = fudge; + dsp_count = 0; + dsp_cleanup(); + if (dsp_16bit) + sb_dsp_command(0xd5); /* Halt DMA until trigger() is called */ + else + sb_dsp_command(0xd0); /* Halt DMA until trigger() is called */ + + trigger_bits = 0; + return 0; +} + +static void +sb16_dsp_trigger(int dev, int bits) +{ + if (bits != 0) + bits = 1; + + if (bits == trigger_bits) /* No change */ + return; + + trigger_bits = bits; + + if (!bits) + sb_dsp_command(0xd0); /* Halt DMA */ + else if (bits & irq_mode) + sb_dsp_command(0xd4); /* Continue DMA */ } static void -dsp_cleanup (void) +dsp_cleanup(void) { - irq_mode = IMODE_NONE; - intr_active = 0; + irq_mode = IMODE_NONE; + intr_active = 0; } static void -sb16_dsp_reset (int dev) +sb16_dsp_reset(int dev) { - unsigned long flags; + u_long flags; - DISABLE_INTR (flags); + flags = splhigh(); - sb_reset_dsp (); - dsp_cleanup (); + sb_reset_dsp(); + dsp_cleanup(); - RESTORE_INTR (flags); + splx(flags); } static void -sb16_dsp_halt (int dev) +sb16_dsp_halt(int dev) { - if (dsp_16bit) - { - sb_dsp_command01 (0xd9); - sb_dsp_command01 (0xd5); - } - else - { - sb_dsp_command01 (0xda); - sb_dsp_command01 (0xd0); + + if (dsp_16bit) { + sb_dsp_command01(0xd9); + sb_dsp_command01(0xd5); + } else { + sb_dsp_command01(0xda); + sb_dsp_command01(0xd0); } - DMAbuf_reset_dma (dev); + + } static void -set_irq_hw (int level) +set_irq_hw(int level) { - int ival; + int ival; - switch (level) - { -#ifdef PC98 + switch (level) { case 5: - ival = 8; - break; - case 3: - ival = 1; - break; - case 10: - ival = 2; - break; -#else - case 5: - ival = 2; - break; + ival = 2; + break; case 7: - ival = 4; - break; + ival = 4; + break; case 9: - ival = 1; - break; + ival = 1; + break; case 10: - ival = 8; - break; -#endif + ival = 8; + break; default: - printk ("SB16_IRQ_LEVEL %d does not exist\n", level); - return; + printf("SB16_IRQ_LEVEL %d does not exist\n", level); + return; } - sb_setmixer (IRQ_NR, ival); + sb_setmixer(IRQ_NR, ival); } -long -sb16_dsp_init (long mem_start, struct address_info *hw_config) +void +sb16_dsp_init(struct address_info * hw_config) { - if (sbc_major < 4) - return mem_start; /* Not a SB16 */ + if (sbc_major < 4) + return; /* Not a SB16 */ - sprintf (sb16_dsp_operations.name, "SoundBlaster 16 %d.%d", sbc_major, sbc_minor); + sprintf(sb16_dsp_operations.name, "SoundBlaster 16 %d.%d", + sbc_major, sbc_minor); -#if defined(__FreeBSD__) - printk ("sbxvi0: <%s>", sb16_dsp_operations.name); -#else - printk (" <%s>", sb16_dsp_operations.name); -#endif + conf_printf(sb16_dsp_operations.name, hw_config); - if (num_audiodevs < MAX_AUDIO_DEV) - { - audio_devs[my_dev = num_audiodevs++] = &sb16_dsp_operations; - audio_devs[my_dev]->dmachan = hw_config->dma; - audio_devs[my_dev]->buffcount = 1; - audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; - } - else - printk ("SB: Too many DSP devices available\n"); - sb16_dsp_ok = 1; - return mem_start; + if (num_audiodevs < MAX_AUDIO_DEV) { + audio_devs[my_dev = num_audiodevs++] = &sb16_dsp_operations; + audio_devs[my_dev]->dmachan1 = dma8; + audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; + + } else + printf("SB: Too many DSP devices available\n"); + sb16_dsp_ok = 1; + return; } int -sb16_dsp_detect (struct address_info *hw_config) +sb16_dsp_detect(struct address_info * hw_config) { - struct address_info *sb_config; + struct address_info *sb_config; - if (sb16_dsp_ok) - return 0; /* Can't drive two cards */ + if (sb16_dsp_ok) + return 1; /* Can't drive two cards */ - if (!(sb_config = sound_getconf (SNDCARD_SB))) - { - printk ("SB16 Error: Plain SB not configured\n"); - return 0; + if (!(sb_config = sound_getconf(SNDCARD_SB))) { + printf("SB16 Error: Plain SB not configured\n"); + return 0; } + /* + * sb_setmixer(OPSW,0xf); if(sb_getmixer(OPSW)!=0xf) return 0; + */ - /* - * sb_setmixer(OPSW,0xf); if(sb_getmixer(OPSW)!=0xf) return 0; - */ + if (!sb_reset_dsp()) + return 0; - if (!sb_reset_dsp ()) - return 0; + if (sbc_major < 4) /* Set by the plain SB driver */ + return 0; /* Not a SB16 */ - if (sbc_major < 4) /* Set by the plain SB driver */ - return 0; /* Not a SB16 */ - -/* cause conflicts */ -/* hw_config->io_base = sb_config->io_base; */ -/* hw_config->irq = sb_config->irq; */ -#ifdef PC98 - hw_config->dma = sb_config->dma; -#else - if (hw_config->dma < 4) - if (hw_config->dma != sb_config->dma) - { - printk ("SB16 Error: Invalid DMA channel %d/%d\n", - sb_config->dma, hw_config->dma); - return 0; - } -#endif + if (hw_config->dma < 4) + if (hw_config->dma != sb_config->dma) { + printf("SB16 Error: Invalid DMA channel %d/%d\n", + sb_config->dma, hw_config->dma); + return 0; + } + dma16 = hw_config->dma; + dma8 = sb_config->dma; + /* hw_config->irq = 0; sb_config->irq; + hw_config->io_base = sb_config->io_base; + */ + set_irq_hw(sb_config->irq); - dma16 = hw_config->dma; - dma8 = sb_config->dma; - set_irq_hw (sb_config->irq); -#ifdef PC98 - sb_setmixer (DMA_NR, hw_config->dma == 0 ? 1 : 2); -#else - sb_setmixer (DMA_NR, (1 << hw_config->dma) | (1 << sb_config->dma)); -#endif + sb_setmixer(DMA_NR, (1 << hw_config->dma) | (1 << sb_config->dma)); - DEB (printk ("SoundBlaster 16: IRQ %d DMA %d OK\n", sb_config->irq, hw_config->dma)); + DEB(printf("SoundBlaster 16: IRQ %d DMA %d OK\n", + sb_config->irq, hw_config->dma)); - /* + /* * dsp_showmessage(0xe3,99); - */ - sb16_dsp_ok = 1; -/* return 0x10; */ - return -1; + */ + sb16_dsp_ok = 1; + return 1; } void -sb16_dsp_interrupt (int unused) +sb16_dsp_interrupt(int unused) { - int data; - - data = INB (DSP_DATA_AVL16); /* - * Interrupt acknowledge - */ - - if (intr_active) - switch (irq_mode) - { - case IMODE_OUTPUT: - intr_active = 0; - DMAbuf_outputintr (my_dev, 1); - break; + int data; - case IMODE_INPUT: - intr_active = 0; - DMAbuf_inputintr (my_dev); - break; + data = inb(DSP_DATA_AVL16); /* Interrupt acknowledge */ - default: - printk ("SoundBlaster: Unexpected interrupt\n"); - } -} + if (intr_active) + switch (irq_mode) { + case IMODE_OUTPUT: + DMAbuf_outputintr(my_dev, 1); + break; + case IMODE_INPUT: + DMAbuf_inputintr(my_dev); + break; + + default: + printf("SoundBlaster: Unexpected interrupt\n"); + } +} #endif diff --git a/sys/i386/isa/sound/sb16_midi.c b/sys/i386/isa/sound/sb16_midi.c index c1a6518..e7b5084 100644 --- a/sys/i386/isa/sound/sb16_midi.c +++ b/sys/i386/isa/sound/sb16_midi.c @@ -1,10 +1,10 @@ /* * sound/sb16_midi.c - * + * * The low level driver for the MPU-401 UART emulation of the SB16. - * + * * Copyright by Hannu Savolainen 1993 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -12,7 +12,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -24,33 +24,28 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * */ #include <i386/isa/sound/sound_config.h> +#include <i386/isa/sound/sbcard.h> -#ifdef CONFIGURE_SOUNDCARD +#if defined(CONFIG_SB) && defined(CONFIG_SB16) && defined(CONFIG_MIDI) -#if !defined(EXCLUDE_SB) && !defined(EXCLUDE_SB16) && !defined(EXCLUDE_MIDI) +#include "sb.h" -#include <i386/isa/sound/sb_defs.h> - -#ifdef PC98 -#define DATAPORT (sb16midi_base) -#define COMDPORT (sb16midi_base+0x100) -#define STATPORT (sb16midi_base+0x100) -#else #define DATAPORT (sb16midi_base) #define COMDPORT (sb16midi_base+1) #define STATPORT (sb16midi_base+1) -#endif -#define sb16midi_status() INB(STATPORT) +extern sound_os_info *sb_osp; + +#define sb16midi_status() inb( STATPORT) #define input_avail() (!(sb16midi_status()&INPUT_AVAIL)) #define output_ready() (!(sb16midi_status()&OUTPUT_READY)) -#define sb16midi_cmd(cmd) OUTB(cmd, COMDPORT) -#define sb16midi_read() INB(DATAPORT) -#define sb16midi_write(byte) OUTB(byte, DATAPORT) +#define sb16midi_cmd(cmd) outb( COMDPORT, cmd) +#define sb16midi_read() inb( DATAPORT) +#define sb16midi_write(byte) outb( DATAPORT, byte) #define OUTPUT_READY 0x40 #define INPUT_AVAIL 0x80 @@ -58,126 +53,118 @@ #define MPU_RESET 0xFF #define UART_MODE_ON 0x3F -extern int sbc_major; - static int sb16midi_opened = 0; static int sb16midi_base = 0x330; static int sb16midi_detected = 0; static int my_dev; extern int sbc_base; -static int reset_sb16midi (void); -static void (*midi_input_intr) (int dev, unsigned char data); +static int reset_sb16midi(void); +static void (*midi_input_intr) (int dev, u_char data); +static volatile u_char input_byte; static void -sb16midi_input_loop (void) +sb16midi_input_loop(void) { - while (input_avail ()) - { - unsigned char c = sb16midi_read (); - - if (sb16midi_opened & OPEN_READ) - midi_input_intr (my_dev, c); - } + while (input_avail()) { + u_char c = sb16midi_read(); + + if (c == MPU_ACK) + input_byte = c; + else if (sb16midi_opened & OPEN_READ && midi_input_intr) + midi_input_intr(my_dev, c); + } } void -sb16midiintr (int unit) +sb16midiintr(int unit) { - if (input_avail ()) - sb16midi_input_loop (); + if (input_avail()) + sb16midi_input_loop(); } static int -sb16midi_open (int dev, int mode, - void (*input) (int dev, unsigned char data), - void (*output) (int dev) +sb16midi_open(int dev, int mode, + void (*input) (int dev, u_char data), + void (*output) (int dev) ) { - if (sb16midi_opened) - { - return RET_ERROR (EBUSY); - } - - sb16midi_input_loop (); + if (sb16midi_opened) { + return -(EBUSY); + } + sb16midi_input_loop(); - midi_input_intr = input; - sb16midi_opened = mode; + midi_input_intr = input; + sb16midi_opened = mode; - return 0; + return 0; } static void -sb16midi_close (int dev) +sb16midi_close(int dev) { - sb16midi_opened = 0; + sb16midi_opened = 0; } static int -sb16midi_out (int dev, unsigned char midi_byte) +sb16midi_out(int dev, u_char midi_byte) { - int timeout; - unsigned long flags; + int timeout; + u_long flags; - /* - * Test for input since pending input seems to block the output. - */ + /* + * Test for input since pending input seems to block the output. + */ - DISABLE_INTR (flags); + flags = splhigh(); - if (input_avail ()) - sb16midi_input_loop (); + if (input_avail()) + sb16midi_input_loop(); - RESTORE_INTR (flags); + splx(flags); - /* - * Sometimes it takes about 13000 loops before the output becomes ready - * (After reset). Normally it takes just about 10 loops. - */ + /* + * Sometimes it takes about 13000 loops before the output becomes + * ready (After reset). Normally it takes just about 10 loops. + */ - for (timeout = 30000; timeout > 0 && !output_ready (); timeout--); /* - * Wait - */ + for (timeout = 30000; timeout > 0 && !output_ready(); timeout--); /* Wait */ - if (!output_ready ()) - { - printk ("MPU-401: Timeout\n"); - return 0; - } - - sb16midi_write (midi_byte); - return 1; + if (!output_ready()) { + printf("MPU-401: Timeout\n"); + return 0; + } + sb16midi_write(midi_byte); + return 1; } static int -sb16midi_start_read (int dev) +sb16midi_start_read(int dev) { - return 0; + return 0; } static int -sb16midi_end_read (int dev) +sb16midi_end_read(int dev) { - return 0; + return 0; } static int -sb16midi_ioctl (int dev, unsigned cmd, unsigned arg) +sb16midi_ioctl(int dev, u_int cmd, ioctl_arg arg) { - return RET_ERROR (EINVAL); + return -(EINVAL); } static void -sb16midi_kick (int dev) +sb16midi_kick(int dev) { } static int -sb16midi_buffer_status (int dev) +sb16midi_buffer_status(int dev) { - return 0; /* - * No data in buffers - */ + return 0; /* No data in buffers */ } #define MIDI_SYNTH_NAME "SoundBlaster 16 Midi" @@ -186,142 +173,127 @@ sb16midi_buffer_status (int dev) static struct midi_operations sb16midi_operations = { - {"SoundBlaster 16 Midi", 0, 0, SNDCARD_SB16MIDI}, - &std_midi_synth, - {0}, - sb16midi_open, - sb16midi_close, - sb16midi_ioctl, - sb16midi_out, - sb16midi_start_read, - sb16midi_end_read, - sb16midi_kick, - NULL, - sb16midi_buffer_status, - NULL + {"SoundBlaster 16 Midi", 0, 0, SNDCARD_SB16MIDI}, + &std_midi_synth, + {0}, + sb16midi_open, + sb16midi_close, + sb16midi_ioctl, + sb16midi_out, + sb16midi_start_read, + sb16midi_end_read, + sb16midi_kick, + NULL, + sb16midi_buffer_status, + NULL }; -long -attach_sb16midi (long mem_start, struct address_info *hw_config) +void +attach_sb16midi(struct address_info * hw_config) { - int ok, timeout; - unsigned long flags; - - sb16midi_base = hw_config->io_base; - - if (!sb16midi_detected) - return RET_ERROR (EIO); - - DISABLE_INTR (flags); - for (timeout = 30000; timeout < 0 && !output_ready (); timeout--); /* - * Wait - */ - sb16midi_cmd (UART_MODE_ON); - - ok = 0; - for (timeout = 50000; timeout > 0 && !ok; timeout--) - if (input_avail ()) - if (sb16midi_read () == MPU_ACK) - ok = 1; - - RESTORE_INTR (flags); - - if (num_midis >= MAX_MIDI_DEV) - { - printk ("Sound: Too many midi devices detected\n"); - return mem_start; - } - -#ifdef __FreeBSD__ - printk ("sbmidi0: <SoundBlaster 16 MPU-401>"); -#else - printk (" <SoundBlaster 16 MPU-401>"); -#endif - - std_midi_synth.midi_dev = my_dev = num_midis; - midi_devs[num_midis++] = &sb16midi_operations; - return mem_start; + int ok, timeout; + u_long flags; + + sb16midi_base = hw_config->io_base; + + if (!sb16midi_detected) + return; + + flags = splhigh(); + for (timeout = 30000; timeout < 0 && !output_ready(); timeout--); /* Wait */ + input_byte = 0; + sb16midi_cmd(UART_MODE_ON); + + ok = 0; + for (timeout = 50000; timeout > 0 && !ok; timeout--) + if (input_byte == MPU_ACK) + ok = 1; + else if (input_avail()) + if (sb16midi_read() == MPU_ACK) + ok = 1; + + splx(flags); + + if (num_midis >= MAX_MIDI_DEV) { + printf("Sound: Too many midi devices detected\n"); + return; + } + + conf_printf("SoundBlaster MPU-401", hw_config); + std_midi_synth.midi_dev = my_dev = num_midis; + midi_devs[num_midis++] = &sb16midi_operations; + return; } static int -reset_sb16midi (void) +reset_sb16midi(void) { - unsigned long flags; - int ok, timeout, n; + int ok, timeout, n; - /* - * Send the RESET command. Try again if no success at the first time. - */ + /* + * Send the RESET command. Try again if no success at the first time. + */ - ok = 0; + if (inb(STATPORT) == 0xff) + return 0; - DISABLE_INTR (flags); + ok = 0; - for (n = 0; n < 2 && !ok; n++) - { - for (timeout = 30000; timeout < 0 && !output_ready (); timeout--); /* - * Wait - */ - sb16midi_cmd (MPU_RESET); /* - * Send MPU-401 RESET Command - */ + /* flags = splhigh(); */ - /* - * Wait at least 25 msec. This method is not accurate so let's make the - * loop bit longer. Cannot sleep since this is called during boot. - */ + for (n = 0; n < 2 && !ok; n++) { + for (timeout = 30000; timeout < 0 && !output_ready(); timeout--); /* Wait */ + input_byte = 0; + sb16midi_cmd(MPU_RESET); /* Send MPU-401 RESET Command */ - for (timeout = 50000; timeout > 0 && !ok; timeout--) - if (input_avail ()) - if (sb16midi_read () == MPU_ACK) - ok = 1; + /* + * Wait at least 25 msec. This method is not accurate so + * let's make the loop bit longer. Cannot sleep since this is + * called during boot. + */ - } + for (timeout = 50000; timeout > 0 && !ok; timeout--) + if (input_byte == MPU_ACK) /* Interrupt */ + ok = 1; + else if (input_avail()) + if (sb16midi_read() == MPU_ACK) + ok = 1; - sb16midi_opened = 0; - if (ok) - sb16midi_input_loop (); /* - * Flush input before enabling interrupts - */ + } - RESTORE_INTR (flags); + sb16midi_opened = 0; + if (ok) + sb16midi_input_loop(); /* Flush input before enabling + * interrupts */ - return ok; + /* splx(flags); */ + + return ok; } int -probe_sb16midi (struct address_info *hw_config) +probe_sb16midi(struct address_info * hw_config) { - struct address_info *sb_config; - int ok = 0; - - if (!(sb_config = sound_getconf (SNDCARD_SB))) - { - printk ("SB16 Error: Plain SB not configured\n"); - return 0; - } + int ok = 0; + struct address_info *sb_config; - if (sbc_major < 4) - return 0; /* Not a SB16 */ + if (sbc_major < 4) + return 0; /* Not a SB16 */ - sb16midi_base = hw_config->io_base; + if (!(sb_config = sound_getconf(SNDCARD_SB))) { + printf("SB16 Error: Plain SB not configured\n"); + return 0; + } - if (sb_get_irq () < 0) - return 0; + sb16midi_base = hw_config->io_base; - ok = reset_sb16midi (); + ok = reset_sb16midi(); - sb16midi_detected = ok; - if (ok) { -/* cause conflicts */ -/* hw_config->irq = sb_config->irq; */ - return 2; - } else - return 0; + sb16midi_detected = ok; + return ok; } #endif -#endif diff --git a/sys/i386/isa/sound/sb_card.c b/sys/i386/isa/sound/sb_card.c index 37455d1..37da6b4 100644 --- a/sys/i386/isa/sound/sb_card.c +++ b/sys/i386/isa/sound/sb_card.c @@ -1,10 +1,10 @@ /* * sound/sb_card.c - * + * * Detection routine for the SoundBlaster cards. - * + * * Copyright by Hannu Savolainen 1993 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -12,7 +12,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -24,38 +24,44 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * Modified: Riccardo Facchetti 24 Mar 1995 - Added the Audio Excel DSP 16 + * initialization routine. * - * Modified: - * Riccardo Facchetti 24 Mar 1995 - * - Added the Audio Excel DSP 16 initialization routine. + * Major code cleanup - Luigi Rizzo (luigi@iet.unipi.it) 970711 */ #include <i386/isa/sound/sound_config.h> -#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB) +#if NSB > 0 +#include <i386/isa/sound/sbcard.h> -long -attach_sb_card (long mem_start, struct address_info *hw_config) +void +attach_sb_card(struct address_info * hw_config) { -#if !defined(EXCLUDE_AUDIO) || !defined(EXCLUDE_MIDI) - if (!sb_dsp_detect (hw_config)) - return mem_start; - mem_start = sb_dsp_init (mem_start, hw_config); +#if defined(CONFIG_AUDIO) || defined(CONFIG_MIDI) + +#if 0 + /* why do a detect during the attach ? XXX */ + if (!sb_dsp_detect(hw_config)) + return ; +#endif + sb_dsp_init(hw_config); #endif - return mem_start; + return ; } int -probe_sb (struct address_info *hw_config) +probe_sb(struct address_info * hw_config) { -#if !defined(EXCLUDE_AEDSP16) && defined(AEDSP16_SBPRO) - /* + +#if defined(CONFIG_AEDSP16) && defined(AEDSP16_SBPRO) + /* * Initialize Audio Excel DSP 16 to SBPRO. - */ - InitAEDSP16_SBPRO (hw_config); + */ + InitAEDSP16_SBPRO(hw_config); #endif - return sb_dsp_detect (hw_config); + return sb_dsp_detect(hw_config); } - #endif diff --git a/sys/i386/isa/sound/sb_dsp.c b/sys/i386/isa/sound/sb_dsp.c index d65ecbf..67c66f7 100644 --- a/sys/i386/isa/sound/sb_dsp.c +++ b/sys/i386/isa/sound/sb_dsp.c @@ -1,10 +1,10 @@ /* * sound/sb_dsp.c - * + * * The low level driver for the SoundBlaster DSP chip (SB1.0 to 2.1, SB Pro). - * + * * Copyright by Hannu Savolainen 1994 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -12,7 +12,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -24,27 +24,39 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * Modified: - * Hunyue Yau Jan 6 1994 - * Added code to support Sound Galaxy NX Pro - * - * JRA Gibson April 1995 - * Code added for MV ProSonic/Jazz 16 in 16 bit mode + * + * Modified: Hunyue Yau Jan 6 1994 Added code to support Sound Galaxy NX + * Pro + * + * JRA Gibson April 1995 Code added for MV ProSonic/Jazz 16 in 16 bit mode */ #include <i386/isa/sound/sound_config.h> -#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB) +#if (NSB > 0) -#include <i386/isa/sound/sb_defs.h> +#ifdef SM_WAVE +#define JAZZ16 +#endif + +#include <i386/isa/sound/sbcard.h> #include <i386/isa/sound/sb_mixer.h> +#include <machine/clock.h> + #undef SB_TEST_IRQ +/* + * XXX note -- only one sb-like device is supported until these + * variables are put in a struct sb_unit[] array + */ + int sbc_base = 0; -static int sbc_irq = 0; +int sbc_irq = 0; static int open_mode = 0; /* Read, write or both */ int Jazz16_detected = 0; +int sb_no_recording = 0; +static int dsp_count = 0; +static int trigger_bits; /* * The DSP channel can be used either for input or output. Variable @@ -54,768 +66,619 @@ int Jazz16_detected = 0; * future version of this driver. */ -int sb_dsp_ok = 0; /* - - - * * * * Set to 1 after successful - * initialization * */ +int sb_dsp_ok = 0; /* Set to 1 after successful init */ static int midi_disabled = 0; int sb_dsp_highspeed = 0; -int sbc_major = 1, sbc_minor = 0; /* - - - * * * * DSP version */ +int sbc_major = 1, sbc_minor = 0; /* DSP version */ static int dsp_stereo = 0; static int dsp_current_speed = DSP_DEFAULT_SPEED; static int sb16 = 0; -static int irq_verified = 0; int sb_midi_mode = NORMAL_MIDI; -int sb_midi_busy = 0; /* - - - * * * * 1 if the process has output - * to * * MIDI */ +int sb_midi_busy = 0; /* 1 if the process has output to * * + * MIDI */ int sb_dsp_busy = 0; -volatile int sb_irq_mode = IMODE_NONE; /* - +volatile int sb_irq_mode = IMODE_NONE; /* or IMODE_INPUT or IMODE_OUTPUT */ - * * * * IMODE_INPUT, * - * IMODE_OUTPUT * * or * - * IMODE_NONE */ -static volatile int irq_ok = 0; +static int dma8 = 1; -#ifdef JAZZ16 -/* 16 bit support - */ +#ifdef JAZZ16 /* 16 bit support for JAZZ16 */ static int dsp_16bit = 0; -static int dma8 = 1; static int dma16 = 5; -static int dsp_set_bits (int arg); -static int initialize_ProSonic16 (void); - -/* end of 16 bit support - */ -#endif +static int dsp_set_bits(int arg); +static int initialize_ProSonic16(void); +#endif /* end of 16 bit support for JAZZ16 */ int sb_duplex_midi = 0; static int my_dev = 0; volatile int sb_intr_active = 0; -static int dsp_speed (int); -static int dsp_set_stereo (int mode); +static int dsp_speed(int); +static int dsp_set_stereo(int mode); +static void sb_dsp_reset(int dev); +sound_os_info *sb_osp = NULL; -#if !defined(EXCLUDE_MIDI) || !defined(EXCLUDE_AUDIO) +#if defined(CONFIG_MIDI) || defined(CONFIG_AUDIO) /* * Common code for the midi and pcm functions */ int -sb_dsp_command (unsigned char val) +sb_dsp_command(u_char val) { - int i; - unsigned long limit; - - limit = GET_TIME () + HZ / 10; /* - * The timeout is 0.1 secods - */ - - /* - * Note! the i<500000 is an emergency exit. The sb_dsp_command() is sometimes - * called while interrupts are disabled. This means that the timer is - * disabled also. However the timeout situation is a abnormal condition. - * Normally the DSP should be ready to accept commands after just couple of - * loops. - */ - - for (i = 0; i < 500000 && GET_TIME () < limit; i++) - { - if ((INB (DSP_STATUS) & 0x80) == 0) - { - OUTB (val, DSP_COMMAND); - return 1; + int i; + u_long limit; + + limit = get_time() + hz / 10; /* The timeout is 0.1 secods */ + + /* + * Note! the i<500000 is an emergency exit. The sb_dsp_command() is + * sometimes called while interrupts are disabled. This means that + * the timer is disabled also. However the timeout situation is a + * abnormal condition. Normally the DSP should be ready to accept + * commands after just couple of loops. + */ + + for (i = 0; i < 500000 && get_time() < limit; i++) { + if ((inb(DSP_STATUS) & 0x80) == 0) { + outb(DSP_COMMAND, val); + return 1; } } - printk ("SoundBlaster: DSP Command(%x) Timeout.\n", val); - printk ("IRQ conflict???\n"); - return 0; + printf("SoundBlaster: DSP Command(0x%02x) timeout. IRQ conflict ?\n", val); + return 0; } void -sbintr (INT_HANDLER_PARMS (irq, dummy)) +sbintr(int irq) { - int status; - -#ifndef EXCLUDE_SBPRO - if (sb16) - { - unsigned char src = sb_getmixer (IRQ_STAT); /* Interrupt source register */ - -#ifndef EXCLUDE_SB16 - if (src & 3) - sb16_dsp_interrupt (irq); - -#ifndef EXCLUDE_MIDI - if (src & 4) - sb16midiintr (irq); /* - * SB MPU401 interrupt - */ -#endif - -#endif - - if (!(src & 1)) - return; /* - * Not a DSP interupt - */ + int status; + +#ifdef CONFIG_SBPRO + if (sb16) { + u_char src = sb_getmixer(IRQ_STAT); /* Interrupt source register */ +#ifdef CONFIG_SB16 + if (src & 3) + sb16_dsp_interrupt(irq); +#ifdef CONFIG_MIDI + if (src & 4) + sb16midiintr(irq); /* SB MPU401 interrupt */ +#endif /* CONFIG_MIDI */ +#endif /* CONFIG_SB16 */ + if (!(src & 1)) + return; /* Not a DSP interupt */ } +#endif /* CONFIG_SBPRO */ + + status = inb(DSP_DATA_AVAIL); /* Clear interrupt */ + + if (sb_intr_active) + switch (sb_irq_mode) { + case IMODE_OUTPUT: + sb_intr_active = 0; + DMAbuf_outputintr(my_dev, 1); + break; + + case IMODE_INPUT: + sb_intr_active = 0; + DMAbuf_inputintr(my_dev); + /* + * A complete buffer has been input. Let's start new one + */ + break; + + case IMODE_INIT: + sb_intr_active = 0; + break; + + case IMODE_MIDI: +#ifdef CONFIG_MIDI + sb_midi_interrupt(irq); #endif + break; - status = INB (DSP_DATA_AVAIL); /* - * Clear interrupt - */ - - if (sb_intr_active) - switch (sb_irq_mode) - { - case IMODE_OUTPUT: - sb_intr_active = 0; - DMAbuf_outputintr (my_dev, 1); - break; - - case IMODE_INPUT: - sb_intr_active = 0; - DMAbuf_inputintr (my_dev); - /* - * A complete buffer has been input. Let's start new one - */ - break; - - case IMODE_INIT: - sb_intr_active = 0; - irq_ok = 1; - break; - - case IMODE_MIDI: -#ifndef EXCLUDE_MIDI - sb_midi_interrupt (irq); -#endif - break; - - default: - printk ("SoundBlaster: Unexpected interrupt\n"); - } + default: + printf("SoundBlaster: Unexpected interrupt\n"); + } } -static int sb_irq_usecount = 0; int -sb_get_irq (void) +sb_reset_dsp(void) { - int ok; + int loopc; - if (!sb_irq_usecount) - if ((ok = snd_set_irq_handler (sbc_irq, sbintr, "SoundBlaster")) < 0) - return ok; + outb(DSP_RESET, 1); + DELAY(10); + outb(DSP_RESET, 0); + DELAY(30); - sb_irq_usecount++; - return 0; -} - -void -sb_free_irq (void) -{ - if (!sb_irq_usecount) - return; + for (loopc = 0; loopc < 100 && !(inb(DSP_DATA_AVAIL) & 0x80); loopc++) + DELAY(10); - sb_irq_usecount--; - - if (!sb_irq_usecount) - snd_release_irq (sbc_irq); -} + if (inb(DSP_READ) != 0xAA) { + printf("sb_reset_dsp failed\n"); + return 0; /* Sorry */ + } -int -sb_reset_dsp (void) -{ - int loopc; - - OUTB (1, DSP_RESET); - tenmicrosec (); - OUTB (0, DSP_RESET); - tenmicrosec (); - tenmicrosec (); - tenmicrosec (); - - for (loopc = 0; loopc < 1000 && !(INB (DSP_DATA_AVAIL) & 0x80); loopc++); /* - * Wait - * for - * data - * * - * available - * status - */ - - if (INB (DSP_READ) != 0xAA) - return 0; /* - * Sorry - */ - - return 1; + return 1; } #endif -#ifndef EXCLUDE_AUDIO +#ifdef CONFIG_AUDIO -static void -dsp_speaker (char state) +void +dsp_speaker(char state) { - if (state) - sb_dsp_command (DSP_CMD_SPKON); - else - sb_dsp_command (DSP_CMD_SPKOFF); + if (state) + sb_dsp_command(DSP_CMD_SPKON); + else + sb_dsp_command(DSP_CMD_SPKOFF); } static int -dsp_speed (int speed) +dsp_speed(int speed) { - unsigned char tconst; - unsigned long flags; - int max_speed = 44100; + u_char tconst; + u_long flags; + int max_speed = 44100; - if (speed < 4000) - speed = 4000; +printf("dsp_speed %d\n", speed); /* XXX lr 970601 */ + if (speed < 4000) + speed = 4000; - /* + /* * Older SB models don't support higher speeds than 22050. - */ + */ - if (sbc_major < 2 || - (sbc_major == 2 && sbc_minor == 0)) - max_speed = 22050; + if (sbc_major < 2 || (sbc_major == 2 && sbc_minor == 0)) + max_speed = 22050; - /* + /* * SB models earlier than SB Pro have low limit for the input speed. - */ - if (open_mode != OPEN_WRITE) /* Recording is possible */ - if (sbc_major < 3) /* Limited input speed with these cards */ - if (sbc_major == 2 && sbc_minor > 0) - max_speed = 15000; - else - max_speed = 13000; - - if (speed > max_speed) - speed = max_speed; /* - * Invalid speed - */ - - /* Logitech SoundMan Games and Jazz16 cards can support 44.1kHz stereo */ + */ + if (open_mode != OPEN_WRITE) /* Recording is possible */ + if (sbc_major < 3) /* Limited input speed with these cards */ + if (sbc_major == 2 && sbc_minor > 0) + max_speed = 15000; + else + max_speed = 13000; + + if (speed > max_speed) + speed = max_speed; /* Invalid speed */ + + /* + * Logitech SoundMan Games and Jazz16 cards can support 44.1kHz + * stereo + */ #if !defined (SM_GAMES) - /* - * Max. stereo speed is 22050 - */ - if (dsp_stereo && speed > 22050 && Jazz16_detected == 0) - speed = 22050; + /* + * Max. stereo speed is 22050 + */ + if (dsp_stereo && speed > 22050 && Jazz16_detected == 0) + speed = 22050; #endif - if ((speed > 22050) && sb_midi_busy) - { - printk ("SB Warning: High speed DSP not possible simultaneously with MIDI output\n"); - speed = 22050; + if ((speed > 22050) && sb_midi_busy) { + printf("SB Warning: High speed DSP not possible simultaneously with MIDI output\n"); + speed = 22050; } + if (dsp_stereo) + speed *= 2; - if (dsp_stereo) - speed *= 2; - - /* - * Now the speed should be valid - */ + /* + * Now the speed should be valid + */ - if (speed > 22050) - { /* - * High speed mode - */ - int tmp; + if (speed > 22050) { /* High speed mode */ + int tmp; - tconst = (unsigned char) ((65536 - - ((256000000 + speed / 2) / speed)) >> 8); - sb_dsp_highspeed = 1; + tconst = (u_char) ((65536 - ((256000000 + speed / 2) / speed)) >> 8); + sb_dsp_highspeed = 1; - DISABLE_INTR (flags); - if (sb_dsp_command (0x40)) - sb_dsp_command (tconst); - RESTORE_INTR (flags); + flags = splhigh(); + if (sb_dsp_command(DSP_CMD_TCONST)) + sb_dsp_command(tconst); + splx(flags); - tmp = 65536 - (tconst << 8); - speed = (256000000 + tmp / 2) / tmp; - } - else - { - int tmp; + tmp = 65536 - (tconst << 8); + speed = (256000000 + tmp / 2) / tmp; + } else { + int tmp; - sb_dsp_highspeed = 0; - tconst = (256 - ((1000000 + speed / 2) / speed)) & 0xff; + sb_dsp_highspeed = 0; + tconst = (256 - ((1000000 + speed / 2) / speed)) & 0xff; - DISABLE_INTR (flags); - if (sb_dsp_command (0x40)) /* - * Set time constant - */ - sb_dsp_command (tconst); - RESTORE_INTR (flags); + flags = splhigh(); + if (sb_dsp_command(DSP_CMD_TCONST)) /* Set time constant */ + sb_dsp_command(tconst); + splx(flags); - tmp = 256 - tconst; - speed = (1000000 + tmp / 2) / tmp; + tmp = 256 - tconst; + speed = (1000000 + tmp / 2) / tmp; } - if (dsp_stereo) - speed /= 2; + if (dsp_stereo) + speed /= 2; - dsp_current_speed = speed; - return speed; + dsp_current_speed = speed; +printf("dsp_speed done %d\n", speed); + return speed; } static int -dsp_set_stereo (int mode) +dsp_set_stereo(int mode) { - dsp_stereo = 0; + dsp_stereo = 0; -#ifdef EXCLUDE_SBPRO - return 0; +#ifndef CONFIG_SBPRO + return 0; #else - if (sbc_major < 3 || sb16) - return 0; /* - * Sorry no stereo - */ + if (sbc_major < 3 || sb16) + return 0; /* Sorry no stereo */ - if (mode && sb_midi_busy) - { - printk ("SB Warning: Stereo DSP not possible simultaneously with MIDI output\n"); - return 0; + if (mode && sb_midi_busy) { + printf("SB Warning: Stereo DSP not possible simultaneously with MIDI output\n"); + return 0; } - - dsp_stereo = !!mode; - return dsp_stereo; + dsp_stereo = !!mode; + return dsp_stereo; #endif } static void -sb_dsp_output_block (int dev, unsigned long buf, int count, - int intrflag, int restart_dma) +sb_dsp_output_block(int dev, u_long buf, int count, + int intrflag, int restart_dma) { - unsigned long flags; - - if (!sb_irq_mode) - dsp_speaker (ON); - - sb_irq_mode = IMODE_OUTPUT; - DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE); - - if (audio_devs[dev]->dmachan > 3) - count >>= 1; - count--; - - if (sb_dsp_highspeed) - { - DISABLE_INTR (flags); - if (sb_dsp_command (0x48)) /* - * High speed size - */ - { - sb_dsp_command ((unsigned char) (count & 0xff)); - sb_dsp_command ((unsigned char) ((count >> 8) & 0xff)); - sb_dsp_command (0x91); /* - * High speed 8 bit DAC - */ - } - else - printk ("SB Error: Unable to start (high speed) DAC\n"); - RESTORE_INTR (flags); - } - else - { - DISABLE_INTR (flags); - if (sb_dsp_command (0x14)) /* - * 8-bit DAC (DMA) - */ - { - sb_dsp_command ((unsigned char) (count & 0xff)); - sb_dsp_command ((unsigned char) ((count >> 8) & 0xff)); - } - else - printk ("SB Error: Unable to start DAC\n"); - RESTORE_INTR (flags); + u_long flags; + + if (!sb_irq_mode) + dsp_speaker(ON); + + DMAbuf_start_dma(dev, buf, count, 1); + + sb_irq_mode = 0; + + if (audio_devs[dev]->dmachan1 > 3) + count >>= 1; + count--; + dsp_count = count; + + sb_irq_mode = IMODE_OUTPUT; + if (sb_dsp_highspeed) { + flags = splhigh(); + if (sb_dsp_command(DSP_CMD_HSSIZE)) { /* High speed size */ + sb_dsp_command((u_char) (dsp_count & 0xff)); + sb_dsp_command((u_char) ((dsp_count >> 8) & 0xff)); + sb_dsp_command(DSP_CMD_HSDAC); /* High speed 8 bit DAC */ + } else + printf("SB Error: Unable to start (high speed) DAC\n"); + splx(flags); + } else { + flags = splhigh(); + if (sb_dsp_command(DSP_CMD_DAC8)) { /* 8-bit DAC (DMA) */ + sb_dsp_command((u_char) (dsp_count & 0xff)); + sb_dsp_command((u_char) ((dsp_count >> 8) & 0xff)); + } else + printf("SB Error: Unable to start DAC\n"); + splx(flags); } - sb_intr_active = 1; + sb_intr_active = 1; } static void -sb_dsp_start_input (int dev, unsigned long buf, int count, int intrflag, - int restart_dma) +sb_dsp_start_input(int dev, u_long buf, int count, int intrflag, + int restart_dma) { - /* - * Start a DMA input to the buffer pointed by dmaqtail - */ + u_long flags; - unsigned long flags; + if (sb_no_recording) { + printf("SB Error: This device doesn't support recording\n"); + return; + } + /* + * Start a DMA input to the buffer pointed by dmaqtail + */ + + if (!sb_irq_mode) + dsp_speaker(OFF); + + DMAbuf_start_dma(dev, buf, count, 0); + sb_irq_mode = 0; + + if (audio_devs[dev]->dmachan1 > 3) + count >>= 1; + count--; + dsp_count = count; + + sb_irq_mode = IMODE_INPUT; + if (sb_dsp_highspeed) { + flags = splhigh(); + if (sb_dsp_command(DSP_CMD_HSSIZE)) { /* High speed size */ + sb_dsp_command((u_char) (dsp_count & 0xff)); + sb_dsp_command((u_char) ((dsp_count >> 8) & 0xff)); + sb_dsp_command(DSP_CMD_HSADC); /* High speed 8 bit ADC */ + } else + printf("SB Error: Unable to start (high speed) ADC\n"); + splx(flags); + } else { + flags = splhigh(); + if (sb_dsp_command(DSP_CMD_ADC8)) { /* 8-bit ADC (DMA) */ + sb_dsp_command((u_char) (dsp_count & 0xff)); + sb_dsp_command((u_char) ((dsp_count >> 8) & 0xff)); + } else + printf("SB Error: Unable to start ADC\n"); + splx(flags); + } - if (!sb_irq_mode) - dsp_speaker (OFF); + sb_intr_active = 1; +} - sb_irq_mode = IMODE_INPUT; - DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ); +static void +sb_dsp_trigger(int dev, int bits) +{ + if (bits == trigger_bits) + return; - if (audio_devs[dev]->dmachan > 3) - count >>= 1; - count--; + if (!bits) + sb_dsp_command(0xd0); /* Halt DMA */ + else if (bits & sb_irq_mode) + sb_dsp_command(0xd4); /* Continue DMA */ - if (sb_dsp_highspeed) - { - DISABLE_INTR (flags); - if (sb_dsp_command (0x48)) /* - * High speed size - */ - { - sb_dsp_command ((unsigned char) (count & 0xff)); - sb_dsp_command ((unsigned char) ((count >> 8) & 0xff)); - sb_dsp_command (0x99); /* - * High speed 8 bit ADC - */ - } - else - printk ("SB Error: Unable to start (high speed) ADC\n"); - RESTORE_INTR (flags); - } - else - { - DISABLE_INTR (flags); - if (sb_dsp_command (0x24)) /* - * 8-bit ADC (DMA) - */ - { - sb_dsp_command ((unsigned char) (count & 0xff)); - sb_dsp_command ((unsigned char) ((count >> 8) & 0xff)); - } - else - printk ("SB Error: Unable to start ADC\n"); - RESTORE_INTR (flags); - } - - sb_intr_active = 1; + trigger_bits = bits; } static void -dsp_cleanup (void) +dsp_cleanup(void) { - sb_intr_active = 0; + sb_intr_active = 0; } static int -sb_dsp_prepare_for_input (int dev, int bsize, int bcount) +sb_dsp_prepare_for_input(int dev, int bsize, int bcount) { - dsp_cleanup (); - dsp_speaker (OFF); + dsp_cleanup(); + dsp_speaker(OFF); - if (sbc_major == 3) /* - * SB Pro - */ - { + if (sbc_major == 3) { /* SB Pro */ #ifdef JAZZ16 - /* Select correct dma channel - * for 16/8 bit acccess - */ - audio_devs[my_dev]->dmachan = dsp_16bit ? dma16 : dma8; - if (dsp_stereo) - sb_dsp_command (dsp_16bit ? 0xac : 0xa8); - else - sb_dsp_command (dsp_16bit ? 0xa4 : 0xa0); + /* + * Select correct dma channel for 16/8 bit acccess + */ + audio_devs[my_dev]->dmachan1 = dsp_16bit ? dma16 : dma8; + if (dsp_stereo) + sb_dsp_command(dsp_16bit ? 0xac : 0xa8); + else + sb_dsp_command(dsp_16bit ? 0xa4 : 0xa0); #else - /* 8 bit only cards use this - */ - if (dsp_stereo) - sb_dsp_command (0xa8); - else - sb_dsp_command (0xa0); + /* + * 8 bit only cards use this + */ + if (dsp_stereo) + sb_dsp_command(0xa8); + else + sb_dsp_command(0xa0); #endif - dsp_speed (dsp_current_speed); /* - * Speed must be recalculated if - * #channels * changes - */ + dsp_speed(dsp_current_speed); /* Speed must be recalculated + * if #channels * changes */ } - return 0; + trigger_bits = 0; + sb_dsp_command(DSP_CMD_DMAHALT); /* Halt DMA */ + return 0; } static int -sb_dsp_prepare_for_output (int dev, int bsize, int bcount) +sb_dsp_prepare_for_output(int dev, int bsize, int bcount) { - dsp_cleanup (); - dsp_speaker (ON); + dsp_cleanup(); + dsp_speaker(ON); -#ifndef EXCLUDE_SBPRO - if (sbc_major == 3) /* - * SB Pro - */ - { +#ifdef CONFIG_SBPRO + if (sbc_major == 3) { /* SB Pro */ #ifdef JAZZ16 - /* 16 bit specific instructions - */ - audio_devs[my_dev]->dmachan = dsp_16bit ? dma16 : dma8; - if (Jazz16_detected != 2) /* SM Wave */ - sb_mixer_set_stereo (dsp_stereo); - if (dsp_stereo) - sb_dsp_command (dsp_16bit ? 0xac : 0xa8); - else - sb_dsp_command (dsp_16bit ? 0xa4 : 0xa0); + /* + * 16 bit specific instructions + */ + audio_devs[my_dev]->dmachan1 = dsp_16bit ? dma16 : dma8; + if (Jazz16_detected != 2) /* SM Wave */ + sb_mixer_set_stereo(dsp_stereo); + if (dsp_stereo) + sb_dsp_command(dsp_16bit ? 0xac : 0xa8); + else + sb_dsp_command(dsp_16bit ? 0xa4 : 0xa0); #else - sb_mixer_set_stereo (dsp_stereo); + sb_mixer_set_stereo(dsp_stereo); #endif - dsp_speed (dsp_current_speed); /* - * Speed must be recalculated if - * #channels * changes - */ + dsp_speed(dsp_current_speed); /* Speed must be recalculated + * if #channels * changes */ } #endif - return 0; + trigger_bits = 0; + sb_dsp_command(DSP_CMD_DMAHALT); /* Halt DMA */ + return 0; } static void -sb_dsp_halt_xfer (int dev) +sb_dsp_halt_xfer(int dev) { } static int -verify_irq (void) +sb_dsp_open(int dev, int mode) { -#if 0 - DEFINE_WAIT_QUEUE (testq, testf); - - irq_ok = 0; + int retval; - if (sb_get_irq () == -1) - { - printk ("*** SB Error: Irq %d already in use\n", sbc_irq); - return 0; + if (!sb_dsp_ok) { + printf("SB Error: SoundBlaster board not installed\n"); + return -(ENXIO); } - - - sb_irq_mode = IMODE_INIT; - - sb_dsp_command (0xf2); /* - * This should cause immediate interrupt - */ - - DO_SLEEP (testq, testf, HZ / 5); - - sb_free_irq (); - - if (!irq_ok) - { - printk ("SB Warning: IRQ%d test not passed!", sbc_irq); - irq_ok = 1; - } -#else - irq_ok = 1; -#endif - return irq_ok; -} - -static int -sb_dsp_open (int dev, int mode) -{ - int retval; - - if (!sb_dsp_ok) - { - printk ("SB Error: SoundBlaster board not installed\n"); - return RET_ERROR (ENXIO); + if (sb_no_recording && mode & OPEN_READ) { + printf("SB Warning: Recording not supported by this device\n"); } - - if (sb_intr_active || (sb_midi_busy && sb_midi_mode == UART_MIDI)) - { - printk ("SB: PCM not possible during MIDI input\n"); - return RET_ERROR (EBUSY); - } - - if (!irq_verified) - { - verify_irq (); - irq_verified = 1; - } - else if (!irq_ok) - printk ("SB Warning: Incorrect IRQ setting %d\n", - sbc_irq); - - retval = sb_get_irq (); - if (retval) - return retval; - - /* Allocate 8 bit dma - */ - if (DMAbuf_open_dma (dev) < 0) - { - sb_free_irq (); - printk ("SB: DMA Busy\n"); - return RET_ERROR (EBUSY); + if (sb_intr_active || (sb_midi_busy && sb_midi_mode == UART_MIDI)) { + printf("SB: PCM not possible during MIDI input\n"); + return -(EBUSY); } + /* + * Allocate 8 bit dma + */ #ifdef JAZZ16 - /* Allocate 16 bit dma - */ - if (Jazz16_detected != 0) - if (dma16 != dma8) - { - if (ALLOC_DMA_CHN (dma16, "Jazz16 16 bit")) - { - sb_free_irq (); - RELEASE_DMA_CHN (dma8); - return RET_ERROR (EBUSY); - } - } + audio_devs[my_dev]->dmachan1 = dma8; + /* + * Allocate 16 bit dma + */ + if (Jazz16_detected != 0) + if (dma16 != dma8) { + if (0) { + return -(EBUSY); + } + } #endif - sb_irq_mode = IMODE_NONE; + sb_irq_mode = IMODE_NONE; - sb_dsp_busy = 1; - open_mode = mode; + sb_dsp_busy = 1; + open_mode = mode; - return 0; + return 0; } static void -sb_dsp_close (int dev) +sb_dsp_close(int dev) { #ifdef JAZZ16 - /* Release 16 bit dma channel - */ - if (Jazz16_detected) - RELEASE_DMA_CHN (dma16); + /* + * Release 16 bit dma channel + */ + if (Jazz16_detected) { + audio_devs[my_dev]->dmachan1 = dma8; + + } #endif - DMAbuf_close_dma (dev); - sb_free_irq (); - dsp_cleanup (); - dsp_speaker (OFF); - sb_dsp_busy = 0; - sb_dsp_highspeed = 0; - open_mode = 0; + dsp_cleanup(); + dsp_speaker(OFF); + sb_dsp_busy = 0; + sb_dsp_highspeed = 0; + open_mode = 0; } #ifdef JAZZ16 -/* Function dsp_set_bits() only required for 16 bit cards +/* + * Function dsp_set_bits() only required for 16 bit cards */ static int -dsp_set_bits (int arg) +dsp_set_bits(int arg) { - if (arg) - if (Jazz16_detected == 0) - dsp_16bit = 0; - else - switch (arg) - { - case 8: - dsp_16bit = 0; - break; - case 16: - dsp_16bit = 1; - break; - default: - dsp_16bit = 0; - } - return dsp_16bit ? 16 : 8; + if (arg) + if (Jazz16_detected == 0) + dsp_16bit = 0; + else + switch (arg) { + case 8: + dsp_16bit = 0; + break; + case 16: + dsp_16bit = 1; + break; + default: + dsp_16bit = 0; + } + return dsp_16bit ? 16 : 8; } -#endif /* ifdef JAZZ16 */ +#endif /* ifdef JAZZ16 */ static int -sb_dsp_ioctl (int dev, unsigned int cmd, unsigned int arg, int local) +sb_dsp_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) { - switch (cmd) - { + switch (cmd) { case SOUND_PCM_WRITE_RATE: - if (local) - return dsp_speed (arg); - return IOCTL_OUT (arg, dsp_speed (IOCTL_IN (arg))); - break; + if (local) + return dsp_speed((int) arg); + return *(int *) arg = dsp_speed((*(int *) arg)); + break; case SOUND_PCM_READ_RATE: - if (local) - return dsp_current_speed; - return IOCTL_OUT (arg, dsp_current_speed); - break; + if (local) + return dsp_current_speed; + return *(int *) arg = dsp_current_speed; + break; case SOUND_PCM_WRITE_CHANNELS: - if (local) - return dsp_set_stereo (arg - 1) + 1; - return IOCTL_OUT (arg, dsp_set_stereo (IOCTL_IN (arg) - 1) + 1); - break; + if (local) + return dsp_set_stereo((int) arg - 1) + 1; + return *(int *) arg = dsp_set_stereo((*(int *) arg) - 1) + 1; + break; case SOUND_PCM_READ_CHANNELS: - if (local) - return dsp_stereo + 1; - return IOCTL_OUT (arg, dsp_stereo + 1); - break; + if (local) + return dsp_stereo + 1; + return *(int *) arg = dsp_stereo + 1; + break; case SNDCTL_DSP_STEREO: - if (local) - return dsp_set_stereo (arg); - return IOCTL_OUT (arg, dsp_set_stereo (IOCTL_IN (arg))); - break; + if (local) + return dsp_set_stereo((int) arg); + return *(int *) arg = dsp_set_stereo((*(int *) arg)); + break; #ifdef JAZZ16 - /* Word size specific cases here. - * SNDCTL_DSP_SETFMT=SOUND_PCM_WRITE_BITS - */ + /* + * Word size specific cases here. + * SNDCTL_DSP_SETFMT=SOUND_PCM_WRITE_BITS + */ case SNDCTL_DSP_SETFMT: - if (local) - return dsp_set_bits (arg); - return IOCTL_OUT (arg, dsp_set_bits (IOCTL_IN (arg))); - break; + if (local) + return dsp_set_bits((int) arg); + return *(int *) arg = dsp_set_bits((*(int *) arg)); + break; case SOUND_PCM_READ_BITS: - if (local) - return dsp_16bit ? 16 : 8; - return IOCTL_OUT (arg, dsp_16bit ? 16 : 8); - break; + if (local) + return dsp_16bit ? 16 : 8; + return *(int *) arg = dsp_16bit ? 16 : 8; + break; #else case SOUND_PCM_WRITE_BITS: case SOUND_PCM_READ_BITS: - if (local) - return 8; - return IOCTL_OUT (arg, 8); /* - * Only 8 bits/sample supported - */ - break; -#endif /* ifdef JAZZ16 */ + if (local) + return 8; + return *(int *) (int) arg = 8; /* Only 8 bits/sample supported */ + break; +#endif /* ifdef JAZZ16 */ case SOUND_PCM_WRITE_FILTER: case SOUND_PCM_READ_FILTER: - return RET_ERROR (EINVAL); - break; + return -(EINVAL); + break; - default: - return RET_ERROR (EINVAL); + default:; } - return RET_ERROR (EINVAL); + return -(EINVAL); } static void -sb_dsp_reset (int dev) +sb_dsp_reset(int dev) { - unsigned long flags; + u_long flags; - DISABLE_INTR (flags); + flags = splhigh(); - sb_reset_dsp (); - dsp_speed (dsp_current_speed); - dsp_cleanup (); + sb_reset_dsp(); + dsp_speed(dsp_current_speed); + dsp_cleanup(); - RESTORE_INTR (flags); + splx(flags); } #endif @@ -824,429 +687,416 @@ sb_dsp_reset (int dev) #ifdef JAZZ16 /* - * Initialization of a Media Vision ProSonic 16 Soundcard. - * The function initializes a ProSonic 16 like PROS.EXE does for DOS. It sets - * the base address, the DMA-channels, interrupts and enables the joystickport. - * + * Initialization of a Media Vision ProSonic 16 Soundcard. The function + * initializes a ProSonic 16 like PROS.EXE does for DOS. It sets the base + * address, the DMA-channels, interrupts and enables the joystickport. + * * Also used by Jazz 16 (same card, different name) - * - * written 1994 by Rainer Vranken - * E-Mail: rvranken@polaris.informatik.uni-essen.de + * + * written 1994 by Rainer Vranken E-Mail: + * rvranken@polaris.informatik.uni-essen.de */ - -#ifndef MPU_BASE /* take default values if not specified */ -#define MPU_BASE 0x330 -#endif -#ifndef MPU_IRQ -#define MPU_IRQ 9 -#endif - -unsigned int -get_sb_byte (void) +u_int +get_sb_byte(void) { - int i; - - for (i = 1000; i; i--) - if (INB (DSP_DATA_AVAIL) & 0x80) - { - return INB (DSP_READ); - } + int i; - return 0xffff; + for (i = 1000; i; i--) + if (inb(DSP_DATA_AVAIL) & 0x80) { + return inb(DSP_READ); + } + return 0xffff; } #ifdef SM_WAVE /* * Logitech Soundman Wave detection and initialization by Hannu Savolainen. - * + * * There is a microcontroller (8031) in the SM Wave card for MIDI emulation. * it's located at address MPU_BASE+4. MPU_BASE+7 is a SM Wave specific * control register for MC reset, SCSI, OPL4 and DSP (future expansion) - * address decoding. Otherwise the SM Wave is just a ordinary MV Jazz16 - * based soundcard. + * address decoding. Otherwise the SM Wave is just a ordinary MV Jazz16 based + * soundcard. */ static void -smw_putmem (int base, int addr, unsigned char val) +smw_putmem(int base, int addr, u_char val) { - unsigned long flags; + u_long flags; - DISABLE_INTR (flags); + flags = splhigh(); - OUTB (addr & 0xff, base + 1); /* Low address bits */ - OUTB (addr >> 8, base + 2); /* High address bits */ - OUTB (val, base); /* Data */ + outb(base + 1, addr & 0xff); /* Low address bits */ + outb(base + 2, addr >> 8); /* High address bits */ + outb(base, val); /* Data */ - RESTORE_INTR (flags); + splx(flags); } -static unsigned char -smw_getmem (int base, int addr) +static u_char +smw_getmem(int base, int addr) { - unsigned long flags; - unsigned char val; + u_long flags; + u_char val; - DISABLE_INTR (flags); + flags = splhigh(); - OUTB (addr & 0xff, base + 1); /* Low address bits */ - OUTB (addr >> 8, base + 2); /* High address bits */ - val = INB (base); /* Data */ + outb(base + 1, addr & 0xff); /* Low address bits */ + outb(base + 2, addr >> 8); /* High address bits */ + val = inb(base); /* Data */ - RESTORE_INTR (flags); - return val; + splx(flags); + return val; } -static int -initialize_smw (void) -{ #ifdef SMW_MIDI0001_INCLUDED -#include <i386/isa/sound/smw-midi0001.h> +#include </sys/i386/isa/sound/smw-midi0001.h> #else - unsigned char smw_ucode[1]; - int smw_ucodeLen = 0; +u_char *smw_ucode = NULL; +int smw_ucodeLen = 0; #endif - int mp_base = MPU_BASE + 4; /* Microcontroller base */ - int i; - unsigned char control; - - /* - * Reset the microcontroller so that the RAM can be accessed - */ - - control = INB (MPU_BASE + 7); - OUTB (control | 3, MPU_BASE + 7); /* Set last two bits to 1 (?) */ - OUTB ((control & 0xfe) | 2, MPU_BASE + 7); /* xxxxxxx0 resets the mc */ - - for (i = 0; i < 300; i++) /* Wait at least 1ms */ - tenmicrosec (); - - OUTB (control & 0xfc, MPU_BASE + 7); /* xxxxxx00 enables RAM */ - - /* - * Detect microcontroller by probing the 8k RAM area - */ - smw_putmem (mp_base, 0, 0x00); - smw_putmem (mp_base, 1, 0xff); - tenmicrosec (); +static int +initialize_smw(int mpu_base) +{ - if (smw_getmem (mp_base, 0) != 0x00 || smw_getmem (mp_base, 1) != 0xff) - { - printk ("\nSM Wave: No microcontroller RAM detected (%02x, %02x)\n", - smw_getmem (mp_base, 0), smw_getmem (mp_base, 1)); - return 0; /* No RAM */ + int mp_base = mpu_base + 4; /* Microcontroller base */ + int i; + u_char control; + + + /* + * Reset the microcontroller so that the RAM can be accessed + */ + + control = inb(mpu_base + 7); + outb(mpu_base + 7, control | 3); /* Set last two bits to 1 (?) */ + outb(mpu_base + 7, (control & 0xfe) | 2); /* xxxxxxx0 resets the mc */ + DELAY(3000); /* Wait at least 1ms */ + + outb(mpu_base + 7, control & 0xfc); /* xxxxxx00 enables RAM */ + + /* + * Detect microcontroller by probing the 8k RAM area + */ + smw_putmem(mp_base, 0, 0x00); + smw_putmem(mp_base, 1, 0xff); + DELAY(10); + + if (smw_getmem(mp_base, 0) != 0x00 || smw_getmem(mp_base, 1) != 0xff) { + printf("\nSM Wave: No microcontroller RAM detected (%02x, %02x)\n", + smw_getmem(mp_base, 0), smw_getmem(mp_base, 1)); + return 0; /* No RAM */ } + /* + * There is RAM so assume it's really a SM Wave + */ + + if (smw_ucodeLen > 0) { + if (smw_ucodeLen != 8192) { + printf("\nSM Wave: Invalid microcode (MIDI0001.BIN) length\n"); + return 1; + } + /* + * Download microcode + */ - /* - * There is RAM so assume it's really a SM Wave - */ - -#ifdef SMW_MIDI0001_INCLUDED - if (smw_ucodeLen != 8192) - { - printk ("\nSM Wave: Invalid microcode (MIDI0001.BIN) length\n"); - return 1; - } -#endif - - /* - * Download microcode - */ - - for (i = 0; i < 8192; i++) - smw_putmem (mp_base, i, smw_ucode[i]); - - /* - * Verify microcode - */ + for (i = 0; i < 8192; i++) + smw_putmem(mp_base, i, smw_ucode[i]); - for (i = 0; i < 8192; i++) - if (smw_getmem (mp_base, i) != smw_ucode[i]) - { - printk ("SM Wave: Microcode verification failed\n"); - return 0; - } + /* + * Verify microcode + */ - control = 0; + for (i = 0; i < 8192; i++) + if (smw_getmem(mp_base, i) != smw_ucode[i]) { + printf("SM Wave: Microcode verification failed\n"); + return 0; + } + } + control = 0; #ifdef SMW_SCSI_IRQ - /* + /* * Set the SCSI interrupt (IRQ2/9, IRQ3 or IRQ10). The SCSI interrupt * is disabled by default. - * + * * Btw the Zilog 5380 SCSI controller is located at MPU base + 0x10. - */ - { - static unsigned char scsi_irq_bits[] = - {0, 0, 3, 1, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0}; + */ + { + static u_char scsi_irq_bits[] = + {0, 0, 3, 1, 0, 0, 0, 0, 0, 3, 2, 0, 0, 0, 0, 0}; - control |= scsi_irq_bits[SMW_SCSI_IRQ] << 6; - } + control |= scsi_irq_bits[SMW_SCSI_IRQ] << 6; + } #endif #ifdef SMW_OPL4_ENABLE - /* - * Make the OPL4 chip visible on the PC bus at 0x380. - * - * There is no need to enable this feature since VoxWare - * doesn't support OPL4 yet. Also there is no RAM in SM Wave so - * enabling OPL4 is pretty useless. - */ - control |= 0x10; /* Uses IRQ12 if bit 0x20 == 0 */ - /* control |= 0x20; Uncomment this if you want to use IRQ7 */ + /* + * Make the OPL4 chip visible on the PC bus at 0x380. + * + * There is no need to enable this feature since VoxWare doesn't support + * OPL4 yet. Also there is no RAM in SM Wave so enabling OPL4 is + * pretty useless. + */ + control |= 0x10; /* Uses IRQ12 if bit 0x20 == 0 */ + /* control |= 0x20; Uncomment this if you want to use IRQ7 */ #endif - OUTB (control | 0x03, MPU_BASE + 7); /* xxxxxx11 restarts */ - return 1; + outb(mpu_base + 7, control | 0x03); /* xxxxxx11 restarts */ + return 1; } #endif static int -initialize_ProSonic16 (void) +initialize_ProSonic16(void) { - int x; - static unsigned char int_translat[16] = - {0, 0, 2, 3, 0, 1, 0, 4, 0, 2, 5, 0, 0, 0, 0, 6}, dma_translat[8] = - {0, 1, 0, 2, 0, 3, 0, 4}; - - OUTB (0xAF, 0x201); /* ProSonic/Jazz16 wakeup */ - for (x = 0; x < 1000; ++x) /* wait 10 milliseconds */ - tenmicrosec (); - OUTB (0x50, 0x201); - OUTB ((sbc_base & 0x70) | ((MPU_BASE & 0x30) >> 4), 0x201); - - if (sb_reset_dsp ()) - { /* OK. We have at least a SB */ - - /* Check the version number of ProSonic (I guess) */ - - if (!sb_dsp_command (0xFA)) - return 1; - if (get_sb_byte () != 0x12) - return 1; - - if (sb_dsp_command (0xFB) && /* set DMA-channels and Interrupts */ - sb_dsp_command ((dma_translat[JAZZ_DMA16] << 4) | dma_translat[SBC_DMA]) && - sb_dsp_command ((int_translat[MPU_IRQ] << 4) | int_translat[sbc_irq])) - { - Jazz16_detected = 1; + int x; + static u_char int_translat[16] = + {0, 0, 2, 3, 0, 1, 0, 4, 0, 2, 5, 0, 0, 0, 0, 6}, + dma_translat[8] = + {0, 1, 0, 2, 0, 3, 0, 4}; + + struct address_info *mpu_config; + + int mpu_base, mpu_irq; + + if ((mpu_config = sound_getconf(SNDCARD_MPU401))) { + mpu_base = mpu_config->io_base; + mpu_irq = mpu_config->irq; + } else { + mpu_base = mpu_irq = 0; + } + + outb(0x201, 0xAF); /* ProSonic/Jazz16 wakeup */ + DELAY(15000); /* wait at least 10 milliseconds */ + outb(0x201, 0x50); + outb(0x201, (sbc_base & 0x70) | ((mpu_base & 0x30) >> 4)); + + if (sb_reset_dsp()) { /* OK. We have at least a SB */ + + /* Check the version number of ProSonic (I guess) */ + + if (!sb_dsp_command(0xFA)) + return 1; + if (get_sb_byte() != 0x12) + return 1; + + if (sb_dsp_command(0xFB) && /* set DMA-channels and Interrupts */ + sb_dsp_command((dma_translat[JAZZ_DMA16]<<4)|dma_translat[dma8]) && + sb_dsp_command((int_translat[mpu_irq]<<4)|int_translat[sbc_irq])) { + Jazz16_detected = 1; + if (mpu_base == 0) + printf("Jazz16: No MPU401 devices configured - MIDI port not initialized\n"); + #ifdef SM_WAVE - if (initialize_smw ()) - Jazz16_detected = 2; + if (mpu_base != 0) + if (initialize_smw(mpu_base)) + Jazz16_detected = 2; #endif - sb_dsp_disable_midi (); + sb_dsp_disable_midi(); } - - return 1; /* There was at least a SB */ + return 1; /* There was at least a SB */ } - return 0; /* No SB or ProSonic16 detected */ + return 0; /* No SB or ProSonic16 detected */ } -#endif /* ifdef JAZZ16 */ +#endif /* ifdef JAZZ16 */ int -sb_dsp_detect (struct address_info *hw_config) +sb_dsp_detect(struct address_info * hw_config) { - sbc_base = hw_config->io_base; - sbc_irq = hw_config->irq; + sbc_base = hw_config->io_base; + sbc_irq = hw_config->irq; + sb_osp = hw_config->osp; + + + if (sb_dsp_ok) + return 0; /* Already initialized */ + dma8 = hw_config->dma; - if (sb_dsp_ok) - return 0; /* - * Already initialized - */ #ifdef JAZZ16 - dma8 = hw_config->dma; - dma16 = JAZZ_DMA16; + dma16 = JAZZ_DMA16; - if (!initialize_ProSonic16 ()) - return 0; + if (!initialize_ProSonic16()) + return 0; #else - if (!sb_reset_dsp ()) - return 0; -#endif - -#ifdef PC98 - switch (sbc_irq) - { - case 3: - sb_setmixer (IRQ_NR, 1); - break; - case 5: - sb_setmixer (IRQ_NR, 8); - break; - case 10: - sb_setmixer (IRQ_NR, 2); - break; - } - switch (hw_config->dma) - { - case 0: - sb_setmixer (DMA_NR, 1); - break; - case 3: - sb_setmixer (DMA_NR, 2); - break; - } + if (!sb_reset_dsp()) + return 0; #endif - return 0x10; /* - * Detected - */ + return 1; /* Detected */ } -#ifndef EXCLUDE_AUDIO +#ifdef CONFIG_AUDIO static struct audio_operations sb_dsp_operations = { - "SoundBlaster", - NOTHING_SPECIAL, - AFMT_U8, /* Just 8 bits. Poor old SB */ - NULL, - sb_dsp_open, - sb_dsp_close, - sb_dsp_output_block, - sb_dsp_start_input, - sb_dsp_ioctl, - sb_dsp_prepare_for_input, - sb_dsp_prepare_for_output, - sb_dsp_reset, - sb_dsp_halt_xfer, - NULL, /* local_qlen */ - NULL /* copy_from_user */ + "SoundBlaster", + NOTHING_SPECIAL, + AFMT_U8, /* Just 8 bits. Poor old SB */ + NULL, + sb_dsp_open, + sb_dsp_close, + sb_dsp_output_block, + sb_dsp_start_input, + sb_dsp_ioctl, + sb_dsp_prepare_for_input, + sb_dsp_prepare_for_output, + sb_dsp_reset, + sb_dsp_halt_xfer, + NULL, /* local_qlen */ + NULL, /* copy_from_user */ + NULL, + NULL, + sb_dsp_trigger }; #endif -long -sb_dsp_init (long mem_start, struct address_info *hw_config) +void +sb_dsp_init(struct address_info * hw_config) { - int i; - int mixer_type = 0; + int i; + char *fmt = NULL ; - sbc_major = sbc_minor = 0; - sb_dsp_command (0xe1); /* - * Get version - */ +#ifdef CONFIG_SBPRO + int mixer_type = 0; - for (i = 1000; i; i--) - { - if (INB (DSP_DATA_AVAIL) & 0x80) - { /* - * wait for Data Ready - */ - if (sbc_major == 0) - sbc_major = INB (DSP_READ); - else - { - sbc_minor = INB (DSP_READ); - break; +#endif + + sb_osp = hw_config->osp; + sbc_major = sbc_minor = 0; + sb_dsp_command(DSP_CMD_GETVER); /* Get version */ + + for (i = 10000; i; i--) { /* perhaps wait longer on a fast machine ? */ + if (inb(DSP_DATA_AVAIL) & 0x80) { /* wait for Data Ready */ + if (sbc_major == 0) + sbc_major = inb(DSP_READ); + else { + sbc_minor = inb(DSP_READ); + break; } - } + } else + DELAY(20); } - if (sbc_major == 2 || sbc_major == 3) - sb_duplex_midi = 1; + if (sbc_major == 0) { + printf("\n\nFailed to get SB version (%x) - possible I/O conflict\n\n", + inb(DSP_DATA_AVAIL)); + sbc_major = 1; + } + if (sbc_major == 2 || sbc_major == 3) + sb_duplex_midi = 1; - if (sbc_major == 4) - sb16 = 1; + if (sbc_major == 4) + sb16 = 1; -#ifndef EXCLUDE_SBPRO - if (sbc_major >= 3) - mixer_type = sb_mixer_init (sbc_major); -#else - if (sbc_major >= 3) - printk ("\n\n\n\nNOTE! SB Pro support is required with your soundcard!\n\n\n"); -#endif + if (sbc_major == 3 && sbc_minor == 1) { + int ess_major = 0, ess_minor = 0; -#ifndef EXCLUDE_YM3812 + /* + * Try to detect ESS chips. + */ -#ifdef PC98 - if (sbc_major > 3 || - (sbc_major == 3 && INB (0x28d2) == 0x00)) -#else - if (sbc_major > 3 || - (sbc_major == 3 && INB (0x388) == 0x00)) /* Should be 0x06 if not OPL-3 */ -#endif - enable_opl3_mode (OPL3_LEFT, OPL3_RIGHT, OPL3_BOTH); -#endif + sb_dsp_command(DSP_CMD_GETID); /* Return identification bytes. */ -#ifndef EXCLUDE_AUDIO - if (sbc_major >= 3) - { - if (Jazz16_detected) - { - if (Jazz16_detected == 2) - sprintf (sb_dsp_operations.name, "SoundMan Wave %d.%d", sbc_major, sbc_minor); - else - sprintf (sb_dsp_operations.name, "MV Jazz16 %d.%d", sbc_major, sbc_minor); - sb_dsp_operations.format_mask |= AFMT_S16_LE; /* Hurrah, 16 bits */ - } - else -#ifdef __SGNXPRO__ - if (mixer_type == 2) - { - sprintf (sb_dsp_operations.name, "Sound Galaxy NX Pro %d.%d", sbc_major, sbc_minor); + for (i = 1000; i; i--) { + if (inb(DSP_DATA_AVAIL) & 0x80) { /* wait for Data Ready */ + if (ess_major == 0) + ess_major = inb(DSP_READ); + else { + ess_minor = inb(DSP_READ); + break; + } + } } - else -#endif - if (sbc_major == 4) - { - sprintf (sb_dsp_operations.name, "SoundBlaster 16 %d.%d", sbc_major, sbc_minor); - } - else - { - sprintf (sb_dsp_operations.name, "SoundBlaster Pro %d.%d", sbc_major, sbc_minor); - } - } - else - { - sprintf (sb_dsp_operations.name, "SoundBlaster %d.%d", sbc_major, sbc_minor); + if (ess_major == 0x48 && (ess_minor & 0xf0) == 0x80) + printf("Hmm... Could this be an ESS488 based card (rev %d)\n", + ess_minor & 0x0f); + else if (ess_major == 0x68 && (ess_minor & 0xf0) == 0x80) + printf("Hmm... Could this be an ESS688 based card (rev %d)\n", + ess_minor & 0x0f); } + if (snd_set_irq_handler(sbc_irq, sbintr, sb_osp) < 0) + printf("sb_dsp: Can't allocate IRQ\n");; -#if defined(__FreeBSD__) - printk ("sb0: <%s>", sb_dsp_operations.name); +#ifdef CONFIG_SBPRO + if (sbc_major >= 3) + mixer_type = sb_mixer_init(sbc_major); #else - printk (" <%s>", sb_dsp_operations.name); + if (sbc_major >= 3) + printf("\nNOTE! SB Pro support required with your soundcard!\n"); #endif -#if !defined(EXCLUDE_SB16) && !defined(EXCLUDE_SBPRO) - if (!sb16) /* - * There is a better driver for SB16 - */ -#endif - if (num_audiodevs < MAX_AUDIO_DEV) - { - audio_devs[my_dev = num_audiodevs++] = &sb_dsp_operations; - audio_devs[my_dev]->buffcount = DSP_BUFFCOUNT; - audio_devs[my_dev]->buffsize = ( - (sbc_major > 2 || sbc_major == 2 && sbc_minor > 0) ? - 16 : 8) * 1024; - audio_devs[my_dev]->dmachan = hw_config->dma; - } - else - printk ("SB: Too many DSP devices available\n"); -#else - printk (" <SoundBlaster (configured without audio support)>"); -#endif -#ifndef EXCLUDE_MIDI - if (!midi_disabled && !sb16) /* - * Midi don't work in the SB emulation mode * - * of PAS, SB16 has better midi interface - */ - sb_midi_init (sbc_major); +#ifdef CONFIG_AUDIO + if (sbc_major >= 3) { + if (Jazz16_detected) { + if (Jazz16_detected == 2) + fmt = "SoundMan Wave %d.%d"; + else + fmt = "MV Jazz16 %d.%d"; + sb_dsp_operations.format_mask |= AFMT_S16_LE; /* 16 bits */ + } else +#ifdef __SGNXPRO__ + if (mixer_type == 2) + fmt = "Sound Galaxy NX Pro %d.%d" ; + else +#endif /* __SGNXPRO__ */ + if (sbc_major == 4) + fmt = "SoundBlaster 16 %d.%d"; + else + fmt = "SoundBlaster Pro %d.%d"; + } else { + fmt = "SoundBlaster %d.%d" ; + } + + sprintf(sb_dsp_operations.name, fmt, sbc_major, sbc_minor); + conf_printf(sb_dsp_operations.name, hw_config); + +#if defined(CONFIG_SB16) && defined(CONFIG_SBPRO) + if (!sb16) /* There is a better driver for SB16 */ +#endif /* CONFIG_SB16 && CONFIG_SBPRO */ + if (num_audiodevs < MAX_AUDIO_DEV) { + audio_devs[my_dev = num_audiodevs++] = &sb_dsp_operations; + audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; + dma8 = audio_devs[my_dev]->dmachan1 = hw_config->dma; + audio_devs[my_dev]->dmachan2 = -1; +#ifdef JAZZ16 + /* + * Allocate 16 bit dma + */ + if (Jazz16_detected != 0) + if (dma16 != dma8) { + if (0) { + printf("Jazz16: Can't allocate 16 bit DMA channel\n"); + } + } +#endif /* JAZZ16 */ + } else + printf("SB: Too many DSP devices available\n"); +#else + conf_printf("SoundBlaster (configured without audio support)", hw_config); #endif - sb_dsp_ok = 1; - return mem_start; +#ifdef CONFIG_MIDI + if (!midi_disabled && !sb16) { + /* + * Midi don't work in the SB emulation mode of PAS, + * SB16 has better midi interface + */ + sb_midi_init(sbc_major); + } +#endif /* CONFIG_MIDI */ + sb_dsp_ok = 1; } void -sb_dsp_disable_midi (void) +sb_dsp_disable_midi(void) { - midi_disabled = 1; + midi_disabled = 1; } - #endif diff --git a/sys/i386/isa/sound/sb_midi.c b/sys/i386/isa/sound/sb_midi.c index 96fdcb9..a1d50bd 100644 --- a/sys/i386/isa/sound/sb_midi.c +++ b/sys/i386/isa/sound/sb_midi.c @@ -1,10 +1,10 @@ /* * sound/sb_dsp.c - * + * * The low level driver for the SoundBlaster DS chips. - * + * * Copyright by Hannu Savolainen 1993 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -12,7 +12,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -24,14 +24,14 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * */ #include <i386/isa/sound/sound_config.h> -#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB) && !defined(EXCLUDE_MIDI) +#if (NSND > 0) && defined(CONFIG_SB) && defined(CONFIG_MIDI) -#include <i386/isa/sound/sb_defs.h> +#include <i386/isa/sound/sbcard.h> #undef SB_TEST_IRQ /* @@ -46,167 +46,133 @@ extern int sb_dsp_ok; /* Set to 1 atfer successful initialization */ extern int sbc_base; extern int sb_midi_mode; -extern int sb_midi_busy; /* - - - * * * * 1 if the process has output to MIDI - * - */ +extern int sb_midi_busy; /* 1 if the process has output to MIDI */ extern int sb_dsp_busy; extern int sb_dsp_highspeed; extern volatile int sb_irq_mode; extern int sb_duplex_midi; extern int sb_intr_active; -static int input_opened = 0; +int input_opened = 0; static int my_dev; -void (*midi_input_intr) (int dev, unsigned char data); +extern sound_os_info *sb_osp; + +void (*midi_input_intr) (int dev, u_char data); static int -sb_midi_open (int dev, int mode, - void (*input) (int dev, unsigned char data), - void (*output) (int dev) -) +sb_midi_open(int dev, int mode, void (*input) (int dev, u_char data), + void (*output) (int dev)) { - int ret; + int ret; - if (!sb_dsp_ok) - { - printk ("SB Error: MIDI hardware not installed\n"); - return RET_ERROR (ENXIO); + if (!sb_dsp_ok) { + printf("SB Error: MIDI hardware not installed\n"); + return -(ENXIO); } + if (sb_midi_busy) + return -(EBUSY); - if (sb_midi_busy) - return RET_ERROR (EBUSY); - - if (mode != OPEN_WRITE && !sb_duplex_midi) - { - if (num_midis == 1) - printk ("SoundBlaster: Midi input not currently supported\n"); - return RET_ERROR (EPERM); + if (mode != OPEN_WRITE && !sb_duplex_midi) { + if (num_midis == 1) + printf("SoundBlaster: Midi input not currently supported\n"); + return -(EPERM); } - - sb_midi_mode = NORMAL_MIDI; - if (mode != OPEN_WRITE) - { - if (sb_dsp_busy || sb_intr_active) - return RET_ERROR (EBUSY); - sb_midi_mode = UART_MIDI; + sb_midi_mode = NORMAL_MIDI; + if (mode != OPEN_WRITE) { + if (sb_dsp_busy || sb_intr_active) + return -(EBUSY); + sb_midi_mode = UART_MIDI; } - - if (sb_dsp_highspeed) - { - printk ("SB Error: Midi output not possible during stereo or high speed audio\n"); - return RET_ERROR (EBUSY); + if (sb_dsp_highspeed) { + printf("SB Error: Midi output not possible during stereo or high speed audio\n"); + return -(EBUSY); } + if (sb_midi_mode == UART_MIDI) { + sb_irq_mode = IMODE_MIDI; - if (sb_midi_mode == UART_MIDI) - { - sb_irq_mode = IMODE_MIDI; - - sb_reset_dsp (); - - if (!sb_dsp_command (0x35)) - return RET_ERROR (EIO); /* - * Enter the UART mode - */ - sb_intr_active = 1; - - if ((ret = sb_get_irq ()) < 0) - { - sb_reset_dsp (); - return 0; /* - * IRQ not free - */ - } - input_opened = 1; - midi_input_intr = input; - } + sb_reset_dsp(); + + if (!sb_dsp_command(0x35)) + return -(EIO); /* Enter the UART mode */ + sb_intr_active = 1; - sb_midi_busy = 1; + input_opened = 1; + midi_input_intr = input; + } + sb_midi_busy = 1; - return 0; + return 0; } static void -sb_midi_close (int dev) +sb_midi_close(int dev) { - if (sb_midi_mode == UART_MIDI) - { - sb_reset_dsp (); /* - * The only way to kill the UART mode - */ - sb_free_irq (); + if (sb_midi_mode == UART_MIDI) { + sb_reset_dsp(); /* The only way to kill the UART mode */ } - sb_intr_active = 0; - sb_midi_busy = 0; - input_opened = 0; + sb_intr_active = 0; + sb_midi_busy = 0; + input_opened = 0; } static int -sb_midi_out (int dev, unsigned char midi_byte) +sb_midi_out(int dev, u_char midi_byte) { - unsigned long flags; - - if (sb_midi_mode == NORMAL_MIDI) - { - DISABLE_INTR (flags); - if (sb_dsp_command (0x38)) - sb_dsp_command (midi_byte); - else - printk ("SB Error: Unable to send a MIDI byte\n"); - RESTORE_INTR (flags); - } - else - sb_dsp_command (midi_byte); /* - * UART write - */ - - return 1; + u_long flags; + + if (sb_midi_mode == NORMAL_MIDI) { + flags = splhigh(); + if (sb_dsp_command(0x38)) + sb_dsp_command(midi_byte); + else + printf("SB Error: Unable to send a MIDI byte\n"); + splx(flags); + } else + sb_dsp_command(midi_byte); /* UART write */ + + return 1; } static int -sb_midi_start_read (int dev) +sb_midi_start_read(int dev) { - if (sb_midi_mode != UART_MIDI) - { - printk ("SoundBlaster: MIDI input not implemented.\n"); - return RET_ERROR (EPERM); + if (sb_midi_mode != UART_MIDI) { + printf("SoundBlaster: MIDI input not implemented.\n"); + return -(EPERM); } - return 0; + return 0; } static int -sb_midi_end_read (int dev) +sb_midi_end_read(int dev) { - if (sb_midi_mode == UART_MIDI) - { - sb_reset_dsp (); - sb_intr_active = 0; + if (sb_midi_mode == UART_MIDI) { + sb_reset_dsp(); + sb_intr_active = 0; } - return 0; + return 0; } static int -sb_midi_ioctl (int dev, unsigned cmd, unsigned arg) +sb_midi_ioctl(int dev, u_int cmd, ioctl_arg arg) { - return RET_ERROR (EPERM); + return -(EPERM); } void -sb_midi_interrupt (int dummy) +sb_midi_interrupt(int dummy) { - unsigned long flags; - unsigned char data; + u_long flags; + u_char data; - DISABLE_INTR (flags); + flags = splhigh(); - data = INB (DSP_READ); - if (input_opened) - midi_input_intr (my_dev, data); + data = inb(DSP_READ); + if (input_opened) + midi_input_intr(my_dev, data); - RESTORE_INTR (flags); + splx(flags); } #define MIDI_SYNTH_NAME "SoundBlaster Midi" @@ -215,39 +181,31 @@ sb_midi_interrupt (int dummy) static struct midi_operations sb_midi_operations = { - {"SoundBlaster", 0, 0, SNDCARD_SB}, - &std_midi_synth, - {0}, - sb_midi_open, - sb_midi_close, - sb_midi_ioctl, - sb_midi_out, - sb_midi_start_read, - sb_midi_end_read, - NULL, /* - * Kick - */ - NULL, /* - * command - */ - NULL, /* - * buffer_status - */ - NULL + {"SoundBlaster", 0, 0, SNDCARD_SB}, + &std_midi_synth, + {0}, + sb_midi_open, + sb_midi_close, + sb_midi_ioctl, + sb_midi_out, + sb_midi_start_read, + sb_midi_end_read, + NULL, /* Kick */ + NULL, /* command */ + NULL, /* buffer_status */ + NULL }; void -sb_midi_init (int model) +sb_midi_init(int model) { - if (num_midis >= MAX_MIDI_DEV) - { - printk ("Sound: Too many midi devices detected\n"); - return; + if (num_midis >= MAX_MIDI_DEV) { + printf("Sound: Too many midi devices detected\n"); + return; } - - std_midi_synth.midi_dev = num_midis; - my_dev = num_midis; - midi_devs[num_midis++] = &sb_midi_operations; + std_midi_synth.midi_dev = num_midis; + my_dev = num_midis; + midi_devs[num_midis++] = &sb_midi_operations; } #endif diff --git a/sys/i386/isa/sound/sb_mixer.c b/sys/i386/isa/sound/sb_mixer.c index dc34c09..14db176 100644 --- a/sys/i386/isa/sound/sb_mixer.c +++ b/sys/i386/isa/sound/sb_mixer.c @@ -1,11 +1,10 @@ - /* * sound/sb_mixer.c - * + * * The low level mixer driver for the SoundBlaster Pro and SB16 cards. - * + * * Copyright by Hannu Savolainen 1994 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -13,7 +12,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -25,25 +24,24 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * Modified: - * Hunyue Yau Jan 6 1994 - * Added code to support the Sound Galaxy NX Pro mixer. - * + * + * Modified: Hunyue Yau Jan 6 1994 Added code to support the Sound Galaxy + * NX Pro mixer. + * */ #include <i386/isa/sound/sound_config.h> -#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB) && !defined(EXCLUDE_SBPRO) +#if (NSB > 0) && defined(CONFIG_SBPRO) #define __SB_MIXER_C__ -#include <i386/isa/sound/sb_defs.h> +#include <i386/isa/sound/sbcard.h> #include <i386/isa/sound/sb_mixer.h> #undef SB_TEST_IRQ extern int sbc_base; -extern int sbc_major; extern int Jazz16_detected; +extern sound_os_info *sb_osp; static int mixer_initialized = 0; @@ -55,533 +53,477 @@ static int mixer_caps; static mixer_tab *iomap; void -sb_setmixer (unsigned int port, unsigned int value) +sb_setmixer(u_int port, u_int value) { - unsigned long flags; - - DISABLE_INTR (flags); - OUTB ((unsigned char) (port & 0xff), MIXER_ADDR); /* - * Select register - */ - tenmicrosec (); - OUTB ((unsigned char) (value & 0xff), MIXER_DATA); - tenmicrosec (); - RESTORE_INTR (flags); + u_long flags; + + flags = splhigh(); /* XXX ouch... */ + outb(MIXER_ADDR, (u_char) (port & 0xff)); /* Select register */ + DELAY(10); + outb(MIXER_DATA, (u_char) (value & 0xff)); + DELAY(10); + splx(flags); } int -sb_getmixer (unsigned int port) +sb_getmixer(u_int port) { - int val; - unsigned long flags; - - DISABLE_INTR (flags); - OUTB ((unsigned char) (port & 0xff), MIXER_ADDR); /* - * Select register - */ - tenmicrosec (); - val = INB (MIXER_DATA); - tenmicrosec (); - RESTORE_INTR (flags); - - return val; + int val; + u_long flags; + + flags = splhigh(); + outb(MIXER_ADDR, (u_char) (port & 0xff)); /* Select register */ + DELAY(10); + val = inb(MIXER_DATA); + DELAY(10); + splx(flags); + + return val; } void -sb_mixer_set_stereo (int mode) +sb_mixer_set_stereo(int mode) { - if (!mixer_initialized) - return; + if (!mixer_initialized) + return; - sb_setmixer (OUT_FILTER, ((sb_getmixer (OUT_FILTER) & ~STEREO_DAC) - | (mode ? STEREO_DAC : MONO_DAC))); + sb_setmixer(OUT_FILTER, ((sb_getmixer(OUT_FILTER) & ~STEREO_DAC) + | (mode ? STEREO_DAC : MONO_DAC))); } /* * Returns: - * 0 No mixer detected. - * 1 Only a plain Sound Blaster Pro style mixer detected. - * 2 The Sound Galaxy NX Pro mixer detected. + * 0 No mixer detected. + * 1 Only a plain Sound Blaster Pro style mixer detected. + * 2 The Sound Galaxy NX Pro mixer detected. */ static int -detect_mixer (void) +detect_mixer(void) { -#ifdef __SGNXPRO__ - int oldbass, oldtreble; +#ifdef __SGNXPRO__ + int oldbass, oldtreble; + extern int sbc_major; #endif - int retcode = 1; - - /* - * Detect the mixer by changing parameters of two volume channels. If the - * values read back match with the values written, the mixer is there (is - * it?) - */ - sb_setmixer (FM_VOL, 0xff); - sb_setmixer (VOC_VOL, 0x33); - - if (sb_getmixer (FM_VOL) != 0xff) - return 0; /* - * No match - */ - if (sb_getmixer (VOC_VOL) != 0x33) - return 0; + int retcode = 1; -#ifdef __SGNXPRO__ - /* Attempt to detect the SG NX Pro by check for valid bass/treble - * registers. - */ - oldbass = sb_getmixer (BASS_LVL); - oldtreble = sb_getmixer (TREBLE_LVL); + /* + * Detect the mixer by changing parameters of two volume channels. If + * the values read back match with the values written, the mixer is + * there (is it?) + */ + sb_setmixer(FM_VOL, 0xff); + sb_setmixer(VOC_VOL, 0x33); - sb_setmixer (BASS_LVL, 0xaa); - sb_setmixer (TREBLE_LVL, 0x55); + if (sb_getmixer(FM_VOL) != 0xff) + return 0; /* No match */ + if (sb_getmixer(VOC_VOL) != 0x33) + return 0; - if ((sb_getmixer (BASS_LVL) != 0xaa) || - (sb_getmixer (TREBLE_LVL) != 0x55)) - { - retcode = 1; /* 1 == Only SB Pro detected */ - } - else - retcode = 2; /* 2 == SG NX Pro detected */ - /* Restore register in either case since SG NX Pro has EEPROM with - * 'preferred' values stored. - */ - sb_setmixer (BASS_LVL, oldbass); - sb_setmixer (TREBLE_LVL, oldtreble); - - /* +#ifdef __SGNXPRO__ + /* + * Attempt to detect the SG NX Pro by check for valid bass/treble + * registers. + */ + oldbass = sb_getmixer(BASS_LVL); + oldtreble = sb_getmixer(TREBLE_LVL); + + sb_setmixer(BASS_LVL, 0xaa); + sb_setmixer(TREBLE_LVL, 0x55); + + if ((sb_getmixer(BASS_LVL) != 0xaa) || + (sb_getmixer(TREBLE_LVL) != 0x55)) { + retcode = 1; /* 1 == Only SB Pro detected */ + } else + retcode = 2; /* 2 == SG NX Pro detected */ + /* + * Restore register in either case since SG NX Pro has EEPROM with + * 'preferred' values stored. + */ + sb_setmixer(BASS_LVL, oldbass); + sb_setmixer(TREBLE_LVL, oldtreble); + + /* * If the SB version is 3.X (SB Pro), assume we have a SG NX Pro 16. * In this case it's good idea to disable the Disney Sound Source - * compatibility mode. It's useless and just causes noise every time the - * LPT-port is accessed. - * + * compatibility mode. It's useless and just causes noise every time + * the LPT-port is accessed. + * * Also place the card into WSS mode. - */ - if (sbc_major == 3) - { - OUTB (0x01, sbc_base + 0x1c); - OUTB (0x00, sbc_base + 0x1a); + */ + if (sbc_major == 3) { + outb(sbc_base + 0x1c, 0x01); + outb(sbc_base + 0x1a, 0x00); } - #endif - return retcode; + return retcode; } static void -change_bits (unsigned char *regval, int dev, int chn, int newval) +change_bits(u_char *regval, int dev, int chn, int newval) { - unsigned char mask; - int shift; - - mask = (1 << (*iomap)[dev][chn].nbits) - 1; - newval = (int) ((newval * mask) + 50) / 100; /* - * Scale it - */ - - shift = (*iomap)[dev][chn].bitoffs - (*iomap)[dev][LEFT_CHN].nbits + 1; - - *regval &= ~(mask << shift); /* - * Filter out the previous value - */ - *regval |= (newval & mask) << shift; /* - * Set the new value - */ + u_char mask; + int shift; + + mask = (1 << (*iomap)[dev][chn].nbits) - 1; + newval = (int) ((newval * mask) + 50) / 100; /* Scale it */ + + shift = (*iomap)[dev][chn].bitoffs - (*iomap)[dev][LEFT_CHN].nbits + 1; + + *regval &= ~(mask << shift); /* Filter out the previous value */ + *regval |= (newval & mask) << shift; /* Set the new value */ } static int -sb_mixer_get (int dev) +sb_mixer_get(int dev) { - if (!((1 << dev) & supported_devices)) - return RET_ERROR (EINVAL); + if (!((1 << dev) & supported_devices)) + return -(EINVAL); - return levels[dev]; + return levels[dev]; } #ifdef JAZZ16 -static char smw_mix_regs[] = /* Left mixer registers */ +static char smw_mix_regs[] =/* Left mixer registers */ { - 0x0b, /* SOUND_MIXER_VOLUME */ - 0x0d, /* SOUND_MIXER_BASS */ - 0x0d, /* SOUND_MIXER_TREBLE */ - 0x05, /* SOUND_MIXER_SYNTH */ - 0x09, /* SOUND_MIXER_PCM */ - 0x00, /* SOUND_MIXER_SPEAKER */ - 0x03, /* SOUND_MIXER_LINE */ - 0x01, /* SOUND_MIXER_MIC */ - 0x07, /* SOUND_MIXER_CD */ - 0x00, /* SOUND_MIXER_IMIX */ - 0x00, /* SOUND_MIXER_ALTPCM */ - 0x00, /* SOUND_MIXER_RECLEV */ - 0x00, /* SOUND_MIXER_IGAIN */ - 0x00, /* SOUND_MIXER_OGAIN */ - 0x00, /* SOUND_MIXER_LINE1 */ - 0x00, /* SOUND_MIXER_LINE2 */ - 0x00 /* SOUND_MIXER_LINE3 */ + 0x0b, /* SOUND_MIXER_VOLUME */ + 0x0d, /* SOUND_MIXER_BASS */ + 0x0d, /* SOUND_MIXER_TREBLE */ + 0x05, /* SOUND_MIXER_SYNTH */ + 0x09, /* SOUND_MIXER_PCM */ + 0x00, /* SOUND_MIXER_SPEAKER */ + 0x03, /* SOUND_MIXER_LINE */ + 0x01, /* SOUND_MIXER_MIC */ + 0x07, /* SOUND_MIXER_CD */ + 0x00, /* SOUND_MIXER_IMIX */ + 0x00, /* SOUND_MIXER_ALTPCM */ + 0x00, /* SOUND_MIXER_RECLEV */ + 0x00, /* SOUND_MIXER_IGAIN */ + 0x00, /* SOUND_MIXER_OGAIN */ + 0x00, /* SOUND_MIXER_LINE1 */ + 0x00, /* SOUND_MIXER_LINE2 */ + 0x00 /* SOUND_MIXER_LINE3 */ }; static void -smw_mixer_init (void) +smw_mixer_init(void) { - int i; + int i; - sb_setmixer (0x00, 0x18); /* Mute unused (Telephone) line */ - sb_setmixer (0x10, 0x38); /* Config register 2 */ + sb_setmixer(0x00, 0x18);/* Mute unused (Telephone) line */ + sb_setmixer(0x10, 0x38);/* Config register 2 */ - supported_devices = 0; - for (i = 0; i < sizeof (smw_mix_regs); i++) - if (smw_mix_regs[i] != 0) - supported_devices |= (1 << i); + supported_devices = 0; + for (i = 0; i < sizeof(smw_mix_regs); i++) + if (smw_mix_regs[i] != 0) + supported_devices |= (1 << i); - supported_rec_devices = supported_devices & - ~(SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_PCM | - SOUND_MASK_VOLUME); + supported_rec_devices = supported_devices & + ~(SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_PCM | + SOUND_MASK_VOLUME); } static int -smw_mixer_set (int dev, int value) +smw_mixer_set(int dev, int value) { - int left = value & 0x000000ff; - int right = (value & 0x0000ff00) >> 8; - int reg, val; + int left = value & 0x000000ff; + int right = (value & 0x0000ff00) >> 8; + int reg, val; - if (left > 100) - left = 100; - if (right > 100) - right = 100; + if (left > 100) + left = 100; + if (right > 100) + right = 100; - if (dev > 31) - return RET_ERROR (EINVAL); + if (dev > 31) + return -(EINVAL); - if (!(supported_devices & (1 << dev))) /* Not supported */ - return RET_ERROR (EINVAL); + if (!(supported_devices & (1 << dev))) /* Not supported */ + return -(EINVAL); - switch (dev) - { + switch (dev) { case SOUND_MIXER_VOLUME: - sb_setmixer (0x0b, 96 - (96 * left / 100)); /* 96=mute, 0=max */ - sb_setmixer (0x0c, 96 - (96 * right / 100)); - break; + sb_setmixer(0x0b, 96 - (96 * left / 100)); /* 96=mute, 0=max */ + sb_setmixer(0x0c, 96 - (96 * right / 100)); + break; case SOUND_MIXER_BASS: case SOUND_MIXER_TREBLE: - levels[dev] = left | (right << 8); + levels[dev] = left | (right << 8); - /* Set left bass and treble values */ - val = ((levels[SOUND_MIXER_TREBLE] & 0xff) * 16 / 100) << 4; - val |= ((levels[SOUND_MIXER_BASS] & 0xff) * 16 / 100) & 0x0f; - sb_setmixer (0x0d, val); + /* Set left bass and treble values */ + val = ((levels[SOUND_MIXER_TREBLE] & 0xff) * 16 / 100) << 4; + val |= ((levels[SOUND_MIXER_BASS] & 0xff) * 16 / 100) & 0x0f; + sb_setmixer(0x0d, val); - /* Set right bass and treble values */ - val = (((levels[SOUND_MIXER_TREBLE] >> 8) & 0xff) * 16 / 100) << 4; - val |= (((levels[SOUND_MIXER_BASS] >> 8) & 0xff) * 16 / 100) & 0x0f; - sb_setmixer (0x0e, val); - break; + /* Set right bass and treble values */ + val = (((levels[SOUND_MIXER_TREBLE] >> 8) & 0xff) * 16 / 100) << 4; + val |= (((levels[SOUND_MIXER_BASS] >> 8) & 0xff) * 16 / 100) & 0x0f; + sb_setmixer(0x0e, val); + break; default: - reg = smw_mix_regs[dev]; - if (reg == 0) - return RET_ERROR (EINVAL); - sb_setmixer (reg, (24 - (24 * left / 100)) | 0x20); /* 24=mute, 0=max */ - sb_setmixer (reg + 1, (24 - (24 * right / 100)) | 0x40); + reg = smw_mix_regs[dev]; + if (reg == 0) + return -(EINVAL); + sb_setmixer(reg, (24 - (24 * left / 100)) | 0x20); /* 24=mute, 0=max */ + sb_setmixer(reg + 1, (24 - (24 * right / 100)) | 0x40); } - levels[dev] = left | (right << 8); - return left | (right << 8); + levels[dev] = left | (right << 8); + return left | (right << 8); } #endif static int -sb_mixer_set (int dev, int value) +sb_mixer_set(int dev, int value) { - int left = value & 0x000000ff; - int right = (value & 0x0000ff00) >> 8; + int left = value & 0x000000ff; + int right = (value & 0x0000ff00) >> 8; - int regoffs; - unsigned char val; + int regoffs; + u_char val; #ifdef JAZZ16 - if (Jazz16_detected == 2) - return smw_mixer_set (dev, value); + if (Jazz16_detected == 2) + return smw_mixer_set(dev, value); #endif - if (left > 100) - left = 100; - if (right > 100) - right = 100; + if (left > 100) + left = 100; + if (right > 100) + right = 100; - if (dev > 31) - return RET_ERROR (EINVAL); + if (dev > 31) + return -(EINVAL); - if (!(supported_devices & (1 << dev))) /* - * Not supported - */ - return RET_ERROR (EINVAL); + if (!(supported_devices & (1 << dev))) /* Not supported */ + return -(EINVAL); - regoffs = (*iomap)[dev][LEFT_CHN].regno; + regoffs = (*iomap)[dev][LEFT_CHN].regno; - if (regoffs == 0) - return RET_ERROR (EINVAL); + if (regoffs == 0) + return -(EINVAL); - val = sb_getmixer (regoffs); - change_bits (&val, dev, LEFT_CHN, left); + val = sb_getmixer(regoffs); + change_bits(&val, dev, LEFT_CHN, left); - levels[dev] = left | (left << 8); + levels[dev] = left | (left << 8); - if ((*iomap)[dev][RIGHT_CHN].regno != regoffs) /* - * Change register - */ - { - sb_setmixer (regoffs, val); /* - * Save the old one - */ - regoffs = (*iomap)[dev][RIGHT_CHN].regno; + if ((*iomap)[dev][RIGHT_CHN].regno != regoffs) { /* Change register */ + sb_setmixer(regoffs, val); /* Save the old one */ + regoffs = (*iomap)[dev][RIGHT_CHN].regno; - if (regoffs == 0) - return left | (left << 8); /* - * Just left channel present - */ + if (regoffs == 0) + return left | (left << 8); /* Just left channel present */ - val = sb_getmixer (regoffs); /* - * Read the new one - */ + val = sb_getmixer(regoffs); /* Read the new one */ } + change_bits(&val, dev, RIGHT_CHN, right); - change_bits (&val, dev, RIGHT_CHN, right); - - sb_setmixer (regoffs, val); + sb_setmixer(regoffs, val); - levels[dev] = left | (right << 8); - return left | (right << 8); + levels[dev] = left | (right << 8); + return left | (right << 8); } static void -set_recsrc (int src) +set_recsrc(int src) { - sb_setmixer (RECORD_SRC, (sb_getmixer (RECORD_SRC) & ~7) | (src & 0x7)); + sb_setmixer(RECORD_SRC, (sb_getmixer(RECORD_SRC) & ~7) | (src & 0x7)); } static int -set_recmask (int mask) +set_recmask(int mask) { - int devmask, i; - unsigned char regimageL, regimageR; + int devmask, i; + u_char regimageL, regimageR; - devmask = mask & supported_rec_devices; + devmask = mask & supported_rec_devices; - switch (mixer_model) - { + switch (mixer_model) { case 3: - if (devmask != SOUND_MASK_MIC && - devmask != SOUND_MASK_LINE && - devmask != SOUND_MASK_CD) - { /* - * More than one devices selected. Drop the * - * previous selection - */ - devmask &= ~recmask; + if (devmask != SOUND_MASK_MIC && devmask != SOUND_MASK_LINE && + devmask != SOUND_MASK_CD) { + /* + * More than one devices selected. Drop the previous + * selection + */ + devmask &= ~recmask; } - - if (devmask != SOUND_MASK_MIC && - devmask != SOUND_MASK_LINE && - devmask != SOUND_MASK_CD) - { /* - * More than one devices selected. Default to - * * mic - */ - devmask = SOUND_MASK_MIC; + if (devmask != SOUND_MASK_MIC && devmask != SOUND_MASK_LINE && + devmask != SOUND_MASK_CD) { + /* More than one devices selected. Default to mic */ + devmask = SOUND_MASK_MIC; } - - - if (devmask ^ recmask) /* - * Input source changed - */ - { - switch (devmask) - { + if (devmask ^ recmask) { /* Input source changed */ + switch (devmask) { case SOUND_MASK_MIC: - set_recsrc (SRC_MIC); - break; + set_recsrc(SRC_MIC); + break; case SOUND_MASK_LINE: - set_recsrc (SRC_LINE); - break; + set_recsrc(SRC_LINE); + break; case SOUND_MASK_CD: - set_recsrc (SRC_CD); - break; + set_recsrc(SRC_CD); + break; default: - set_recsrc (SRC_MIC); + set_recsrc(SRC_MIC); } } - - break; + break; case 4: - if (!devmask) - devmask = SOUND_MASK_MIC; - - regimageL = regimageR = 0; - for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) - if ((1 << i) & devmask) - { - regimageL |= sb16_recmasks_L[i]; - regimageR |= sb16_recmasks_R[i]; - } - sb_setmixer (SB16_IMASK_L, regimageL); - sb_setmixer (SB16_IMASK_R, regimageR); - break; + if (!devmask) + devmask = SOUND_MASK_MIC; + + regimageL = regimageR = 0; + for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) + if ((1 << i) & devmask) { + regimageL |= sb16_recmasks_L[i]; + regimageR |= sb16_recmasks_R[i]; + } + sb_setmixer(SB16_IMASK_L, regimageL); + sb_setmixer(SB16_IMASK_R, regimageR); + break; } - recmask = devmask; - return recmask; + recmask = devmask; + return recmask; } static int -sb_mixer_ioctl (int dev, unsigned int cmd, unsigned int arg) +sb_mixer_ioctl(int dev, u_int cmd, ioctl_arg arg) { - if (((cmd >> 8) & 0xff) == 'M') - { - if (cmd & IOC_IN) - switch (cmd & 0xff) - { - case SOUND_MIXER_RECSRC: - return IOCTL_OUT (arg, set_recmask (IOCTL_IN (arg))); - break; - - default: - - return IOCTL_OUT (arg, sb_mixer_set (cmd & 0xff, IOCTL_IN (arg))); - } - else - switch (cmd & 0xff) /* - * Return parameters - */ - { - - case SOUND_MIXER_RECSRC: - return IOCTL_OUT (arg, recmask); - break; - - case SOUND_MIXER_DEVMASK: - return IOCTL_OUT (arg, supported_devices); - break; - - case SOUND_MIXER_STEREODEVS: - if (Jazz16_detected) - return IOCTL_OUT (arg, supported_devices); - else - return IOCTL_OUT (arg, supported_devices & - ~(SOUND_MASK_MIC | SOUND_MASK_SPEAKER)); - break; - - case SOUND_MIXER_RECMASK: - return IOCTL_OUT (arg, supported_rec_devices); - break; - - case SOUND_MIXER_CAPS: - return IOCTL_OUT (arg, mixer_caps); - break; - - default: - return IOCTL_OUT (arg, sb_mixer_get (cmd & 0xff)); - } - } - else - return RET_ERROR (EINVAL); + if (((cmd >> 8) & 0xff) == 'M') { + if (cmd & IOC_IN) + switch (cmd & 0xff) { + case SOUND_MIXER_RECSRC: + return *(int *) arg = set_recmask((*(int *) arg)); + break; + + default: + return *(int *) arg = sb_mixer_set(cmd & 0xff, (*(int *) arg)); + } + else + switch (cmd & 0xff) { /* Return parameters */ + + case SOUND_MIXER_RECSRC: + return *(int *) arg = recmask; + break; + + case SOUND_MIXER_DEVMASK: + return *(int *) arg = supported_devices; + break; + + case SOUND_MIXER_STEREODEVS: + if (Jazz16_detected) + return *(int *) arg = supported_devices; + else + return *(int *) arg = supported_devices & ~(SOUND_MASK_MIC | SOUND_MASK_SPEAKER); + break; + + case SOUND_MIXER_RECMASK: + return *(int *) arg = supported_rec_devices; + break; + + case SOUND_MIXER_CAPS: + return *(int *) arg = mixer_caps; + break; + + default: + return *(int *) arg = sb_mixer_get(cmd & 0xff); + } + } else + return -(EINVAL); } static struct mixer_operations sb_mixer_operations = { - "SoundBlaster", - sb_mixer_ioctl + "SoundBlaster", + sb_mixer_ioctl }; static void -sb_mixer_reset (void) +sb_mixer_reset(void) { - int i; + int i; - for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) - sb_mixer_set (i, levels[i]); - set_recmask (SOUND_MASK_MIC); + for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) + sb_mixer_set(i, levels[i]); + set_recmask(SOUND_MASK_MIC); } /* - * Returns a code depending on whether a SG NX Pro was detected. - * 1 == Plain SB Pro - * 2 == SG NX Pro detected. - * 3 == SB16 - * + * Returns a code depending on whether a SG NX Pro was detected. 1 == Plain + * SB Pro 2 == SG NX Pro detected. 3 == SB16 + * * Used to update message. */ int -sb_mixer_init (int major_model) +sb_mixer_init(int major_model) { - int mixer_type = 0; + int mixer_type = 0; - sb_setmixer (0x00, 0); /* Reset mixer */ + sb_setmixer(0x00, 0); /* Reset mixer */ - if (!(mixer_type = detect_mixer ())) - return 0; /* No mixer. Why? */ + if (!(mixer_type = detect_mixer())) + return 0; /* No mixer. Why? */ - mixer_initialized = 1; - mixer_model = major_model; + mixer_initialized = 1; + mixer_model = major_model; - switch (major_model) - { + switch (major_model) { case 3: - mixer_caps = SOUND_CAP_EXCL_INPUT; + mixer_caps = SOUND_CAP_EXCL_INPUT; #ifdef JAZZ16 - if (Jazz16_detected == 2) /* SM Wave */ - { - supported_devices = 0; - supported_rec_devices = 0; - iomap = &sbpro_mix; - smw_mixer_init (); - mixer_type = 1; - } - else + if (Jazz16_detected == 2) { /* SM Wave */ + supported_devices = 0; + supported_rec_devices = 0; + iomap = &sbpro_mix; + smw_mixer_init(); + mixer_type = 1; + } else #endif #ifdef __SGNXPRO__ - if (mixer_type == 2) /* A SGNXPRO was detected */ - { - supported_devices = SGNXPRO_MIXER_DEVICES; - supported_rec_devices = SGNXPRO_RECORDING_DEVICES; - iomap = &sgnxpro_mix; - } - else + if (mixer_type == 2) { /* A SGNXPRO was detected */ + supported_devices = SGNXPRO_MIXER_DEVICES; + supported_rec_devices = SGNXPRO_RECORDING_DEVICES; + iomap = &sgnxpro_mix; + } else #endif { - supported_devices = SBPRO_MIXER_DEVICES; - supported_rec_devices = SBPRO_RECORDING_DEVICES; - iomap = &sbpro_mix; - mixer_type = 1; + supported_devices = SBPRO_MIXER_DEVICES; + supported_rec_devices = SBPRO_RECORDING_DEVICES; + iomap = &sbpro_mix; + mixer_type = 1; } - break; + break; case 4: - mixer_caps = 0; - supported_devices = SB16_MIXER_DEVICES; - supported_rec_devices = SB16_RECORDING_DEVICES; - iomap = &sb16_mix; - mixer_type = 3; - break; + mixer_caps = 0; + supported_devices = SB16_MIXER_DEVICES; + supported_rec_devices = SB16_RECORDING_DEVICES; + iomap = &sb16_mix; + mixer_type = 3; + break; default: - printk ("SB Warning: Unsupported mixer type\n"); - return 0; - } + printf("SB Warning: Unsupported mixer type\n"); + return 0; + } - if (num_mixers < MAX_MIXER_DEV) - mixer_devs[num_mixers++] = &sb_mixer_operations; - sb_mixer_reset (); - return mixer_type; + if (num_mixers < MAX_MIXER_DEV) + mixer_devs[num_mixers++] = &sb_mixer_operations; + sb_mixer_reset(); + return mixer_type; } #endif diff --git a/sys/i386/isa/sound/sb_mixer.h b/sys/i386/isa/sound/sb_mixer.h index b712eea..155d6c7 100644 --- a/sys/i386/isa/sound/sb_mixer.h +++ b/sys/i386/isa/sound/sb_mixer.h @@ -24,10 +24,9 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * Modified: - * Hunyue Yau Jan 6 1994 - * Added defines for the Sound Galaxy NX Pro mixer. + * + * Modified: Hunyue Yau Jan 6 1994 Added defines for the Sound Galaxy NX Pro + * mixer. * */ @@ -39,10 +38,10 @@ #define SBPRO_MIXER_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_PCM | SOUND_MASK_LINE | SOUND_MASK_MIC | \ SOUND_MASK_CD | SOUND_MASK_VOLUME) -/* SG NX Pro has treble and bass settings on the mixer. The 'speaker' - * channel is the COVOX/DisneySoundSource emulation volume control - * on the mixer. It does NOT control speaker volume. Should have own - * mask eventually? +/* + * SG NX Pro has treble and bass settings on the mixer. The 'speaker' channel + * is the COVOX/DisneySoundSource emulation volume control on the mixer. It + * does NOT control speaker volume. Should have own mask eventually? */ #define SGNXPRO_MIXER_DEVICES (SBPRO_MIXER_DEVICES|SOUND_MASK_BASS| \ SOUND_MASK_TREBLE|SOUND_MASK_SPEAKER ) @@ -61,7 +60,7 @@ * NOTE! RECORD_SRC == IN_FILTER */ -/* +/* * Mixer registers of SB Pro */ #define VOC_VOL 0x04 @@ -80,7 +79,7 @@ #define OPSW 0x3c /* - * Additional registers on the SG NX Pro + * Additional registers on the SG NX Pro */ #define COVOX_VOL 0x42 #define TREBLE_LVL 0x44 @@ -104,9 +103,9 @@ #define RIGHT_CHN 1 struct mixer_def { - unsigned int regno: 8; - unsigned int bitoffs:4; - unsigned int nbits:4; + unsigned int regno:8; + unsigned int bitoffs:4; + unsigned int nbits:4; }; @@ -117,136 +116,136 @@ typedef struct mixer_def mixer_ent; {{reg_l, bit_l, len_l}, {reg_r, bit_r, len_r}} #ifdef __SB_MIXER_C__ -static mixer_tab sbpro_mix = { -MIX_ENT(SOUND_MIXER_VOLUME, 0x22, 7, 4, 0x22, 3, 4), -MIX_ENT(SOUND_MIXER_BASS, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_TREBLE, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_SYNTH, 0x26, 7, 4, 0x26, 3, 4), -MIX_ENT(SOUND_MIXER_PCM, 0x04, 7, 4, 0x04, 3, 4), -MIX_ENT(SOUND_MIXER_SPEAKER, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_LINE, 0x2e, 7, 4, 0x2e, 3, 4), -MIX_ENT(SOUND_MIXER_MIC, 0x0a, 2, 3, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_CD, 0x28, 7, 4, 0x28, 3, 4), -MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_RECLEV, 0x00, 0, 0, 0x00, 0, 0) +mixer_tab sbpro_mix = { + MIX_ENT(SOUND_MIXER_VOLUME, 0x22, 7, 4, 0x22, 3, 4), + MIX_ENT(SOUND_MIXER_BASS, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_TREBLE, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_SYNTH, 0x26, 7, 4, 0x26, 3, 4), + MIX_ENT(SOUND_MIXER_PCM, 0x04, 7, 4, 0x04, 3, 4), + MIX_ENT(SOUND_MIXER_SPEAKER, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_LINE, 0x2e, 7, 4, 0x2e, 3, 4), + MIX_ENT(SOUND_MIXER_MIC, 0x0a, 2, 3, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_CD, 0x28, 7, 4, 0x28, 3, 4), + MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_RECLEV, 0x00, 0, 0, 0x00, 0, 0) }; #ifdef __SGNXPRO__ -static mixer_tab sgnxpro_mix = { -MIX_ENT(SOUND_MIXER_VOLUME, 0x22, 7, 4, 0x22, 3, 4), -MIX_ENT(SOUND_MIXER_BASS, 0x46, 2, 3, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_TREBLE, 0x44, 2, 3, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_SYNTH, 0x26, 7, 4, 0x26, 3, 4), -MIX_ENT(SOUND_MIXER_PCM, 0x04, 7, 4, 0x04, 3, 4), -MIX_ENT(SOUND_MIXER_SPEAKER, 0x42, 2, 3, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_LINE, 0x2e, 7, 4, 0x2e, 3, 4), -MIX_ENT(SOUND_MIXER_MIC, 0x0a, 2, 3, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_CD, 0x28, 7, 4, 0x28, 3, 4), -MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_RECLEV, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_IGAIN, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_OGAIN, 0x00, 0, 0, 0x00, 0, 0) +mixer_tab sgnxpro_mix = { + MIX_ENT(SOUND_MIXER_VOLUME, 0x22, 7, 4, 0x22, 3, 4), + MIX_ENT(SOUND_MIXER_BASS, 0x46, 2, 3, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_TREBLE, 0x44, 2, 3, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_SYNTH, 0x26, 7, 4, 0x26, 3, 4), + MIX_ENT(SOUND_MIXER_PCM, 0x04, 7, 4, 0x04, 3, 4), + MIX_ENT(SOUND_MIXER_SPEAKER, 0x42, 2, 3, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_LINE, 0x2e, 7, 4, 0x2e, 3, 4), + MIX_ENT(SOUND_MIXER_MIC, 0x0a, 2, 3, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_CD, 0x28, 7, 4, 0x28, 3, 4), + MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_RECLEV, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_IGAIN, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_OGAIN, 0x00, 0, 0, 0x00, 0, 0) }; #endif -static mixer_tab sb16_mix = { -MIX_ENT(SOUND_MIXER_VOLUME, 0x30, 7, 5, 0x31, 7, 5), -MIX_ENT(SOUND_MIXER_BASS, 0x46, 7, 4, 0x47, 7, 4), -MIX_ENT(SOUND_MIXER_TREBLE, 0x44, 7, 4, 0x45, 7, 4), -MIX_ENT(SOUND_MIXER_SYNTH, 0x34, 7, 5, 0x35, 7, 5), -MIX_ENT(SOUND_MIXER_PCM, 0x32, 7, 5, 0x33, 7, 5), -MIX_ENT(SOUND_MIXER_SPEAKER, 0x3b, 7, 2, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_LINE, 0x38, 7, 5, 0x39, 7, 5), -MIX_ENT(SOUND_MIXER_MIC, 0x3a, 7, 5, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_CD, 0x36, 7, 5, 0x37, 7, 5), -MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0), -MIX_ENT(SOUND_MIXER_RECLEV, 0x3f, 7, 2, 0x40, 7, 2), /* Obsolete. Use IGAIN */ -MIX_ENT(SOUND_MIXER_IGAIN, 0x3f, 7, 2, 0x40, 7, 2), -MIX_ENT(SOUND_MIXER_OGAIN, 0x41, 7, 2, 0x42, 7, 2) +mixer_tab sb16_mix = { + MIX_ENT(SOUND_MIXER_VOLUME, 0x30, 7, 5, 0x31, 7, 5), + MIX_ENT(SOUND_MIXER_BASS, 0x46, 7, 4, 0x47, 7, 4), + MIX_ENT(SOUND_MIXER_TREBLE, 0x44, 7, 4, 0x45, 7, 4), + MIX_ENT(SOUND_MIXER_SYNTH, 0x34, 7, 5, 0x35, 7, 5), + MIX_ENT(SOUND_MIXER_PCM, 0x32, 7, 5, 0x33, 7, 5), + MIX_ENT(SOUND_MIXER_SPEAKER, 0x3b, 7, 2, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_LINE, 0x38, 7, 5, 0x39, 7, 5), + MIX_ENT(SOUND_MIXER_MIC, 0x3a, 7, 5, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_CD, 0x36, 7, 5, 0x37, 7, 5), + MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0), + MIX_ENT(SOUND_MIXER_RECLEV, 0x3f, 7, 2, 0x40, 7, 2), /* Obsolete. Use IGAIN */ + MIX_ENT(SOUND_MIXER_IGAIN, 0x3f, 7, 2, 0x40, 7, 2), + MIX_ENT(SOUND_MIXER_OGAIN, 0x41, 7, 2, 0x42, 7, 2) }; -#ifdef SM_GAMES /* Master volume is lower and PCM & FM volumes - higher than with SB Pro. This improves the - sound quality */ +#ifdef SM_GAMES /* Master volume is lower and PCM & FM + * volumes higher than with SB Pro. This + * improves the sound quality */ static unsigned short levels[SOUND_MIXER_NRDEVICES] = { - 0x2020, /* Master Volume */ - 0x4b4b, /* Bass */ - 0x4b4b, /* Treble */ - 0x6464, /* FM */ - 0x6464, /* PCM */ - 0x4b4b, /* PC Speaker */ - 0x4b4b, /* Ext Line */ - 0x0000, /* Mic */ - 0x4b4b, /* CD */ - 0x4b4b, /* Recording monitor */ - 0x4b4b, /* SB PCM */ - 0x4b4b, /* Recording level */ - 0x4b4b, /* Input gain */ - 0x4b4b}; /* Output gain */ - -#else /* If the user selected just plain SB Pro */ + 0x2020, /* Master Volume */ + 0x4b4b, /* Bass */ + 0x4b4b, /* Treble */ + 0x6464, /* FM */ + 0x6464, /* PCM */ + 0x4b4b, /* PC Speaker */ + 0x4b4b, /* Ext Line */ + 0x0000, /* Mic */ + 0x4b4b, /* CD */ + 0x4b4b, /* Recording monitor */ + 0x4b4b, /* SB PCM */ + 0x4b4b, /* Recording level */ + 0x4b4b, /* Input gain */ +0x4b4b}; /* Output gain */ + +#else /* If the user selected just plain SB Pro */ static unsigned short levels[SOUND_MIXER_NRDEVICES] = { - 0x5a5a, /* Master Volume */ - 0x4b4b, /* Bass */ - 0x4b4b, /* Treble */ - 0x4b4b, /* FM */ - 0x4b4b, /* PCM */ - 0x4b4b, /* PC Speaker */ - 0x4b4b, /* Ext Line */ - 0x1010, /* Mic */ - 0x4b4b, /* CD */ - 0x4b4b, /* Recording monitor */ - 0x4b4b, /* SB PCM */ - 0x4b4b, /* Recording level */ - 0x4b4b, /* Input gain */ - 0x4b4b}; /* Output gain */ -#endif /* SM_GAMES */ + 0x5a5a, /* Master Volume */ + 0x4b4b, /* Bass */ + 0x4b4b, /* Treble */ + 0x4b4b, /* FM */ + 0x4b4b, /* PCM */ + 0x4b4b, /* PC Speaker */ + 0x4b4b, /* Ext Line */ + 0x1010, /* Mic */ + 0x4b4b, /* CD */ + 0x4b4b, /* Recording monitor */ + 0x4b4b, /* SB PCM */ + 0x4b4b, /* Recording level */ + 0x4b4b, /* Input gain */ +0x4b4b}; /* Output gain */ +#endif /* SM_GAMES */ static unsigned char sb16_recmasks_L[SOUND_MIXER_NRDEVICES] = { - 0x00, /* SOUND_MIXER_VOLUME */ - 0x00, /* SOUND_MIXER_BASS */ - 0x00, /* SOUND_MIXER_TREBLE */ - 0x40, /* SOUND_MIXER_SYNTH */ - 0x00, /* SOUND_MIXER_PCM */ - 0x00, /* SOUND_MIXER_SPEAKER */ - 0x10, /* SOUND_MIXER_LINE */ - 0x01, /* SOUND_MIXER_MIC */ - 0x04, /* SOUND_MIXER_CD */ - 0x00, /* SOUND_MIXER_IMIX */ - 0x00, /* SOUND_MIXER_ALTPCM */ - 0x00, /* SOUND_MIXER_RECLEV */ - 0x00, /* SOUND_MIXER_IGAIN */ - 0x00 /* SOUND_MIXER_OGAIN */ + 0x00, /* SOUND_MIXER_VOLUME */ + 0x00, /* SOUND_MIXER_BASS */ + 0x00, /* SOUND_MIXER_TREBLE */ + 0x40, /* SOUND_MIXER_SYNTH */ + 0x00, /* SOUND_MIXER_PCM */ + 0x00, /* SOUND_MIXER_SPEAKER */ + 0x10, /* SOUND_MIXER_LINE */ + 0x01, /* SOUND_MIXER_MIC */ + 0x04, /* SOUND_MIXER_CD */ + 0x00, /* SOUND_MIXER_IMIX */ + 0x00, /* SOUND_MIXER_ALTPCM */ + 0x00, /* SOUND_MIXER_RECLEV */ + 0x00, /* SOUND_MIXER_IGAIN */ + 0x00 /* SOUND_MIXER_OGAIN */ }; static unsigned char sb16_recmasks_R[SOUND_MIXER_NRDEVICES] = { - 0x00, /* SOUND_MIXER_VOLUME */ - 0x00, /* SOUND_MIXER_BASS */ - 0x00, /* SOUND_MIXER_TREBLE */ - 0x20, /* SOUND_MIXER_SYNTH */ - 0x00, /* SOUND_MIXER_PCM */ - 0x00, /* SOUND_MIXER_SPEAKER */ - 0x08, /* SOUND_MIXER_LINE */ - 0x01, /* SOUND_MIXER_MIC */ - 0x02, /* SOUND_MIXER_CD */ - 0x00, /* SOUND_MIXER_IMIX */ - 0x00, /* SOUND_MIXER_ALTPCM */ - 0x00, /* SOUND_MIXER_RECLEV */ - 0x00, /* SOUND_MIXER_IGAIN */ - 0x00 /* SOUND_MIXER_OGAIN */ + 0x00, /* SOUND_MIXER_VOLUME */ + 0x00, /* SOUND_MIXER_BASS */ + 0x00, /* SOUND_MIXER_TREBLE */ + 0x20, /* SOUND_MIXER_SYNTH */ + 0x00, /* SOUND_MIXER_PCM */ + 0x00, /* SOUND_MIXER_SPEAKER */ + 0x08, /* SOUND_MIXER_LINE */ + 0x01, /* SOUND_MIXER_MIC */ + 0x02, /* SOUND_MIXER_CD */ + 0x00, /* SOUND_MIXER_IMIX */ + 0x00, /* SOUND_MIXER_ALTPCM */ + 0x00, /* SOUND_MIXER_RECLEV */ + 0x00, /* SOUND_MIXER_IGAIN */ + 0x00 /* SOUND_MIXER_OGAIN */ }; /* - * Recording sources (SB Pro) + * Recording sources (SB Pro) */ #define SRC_MIC 1 /* Select Microphone recording source */ diff --git a/sys/i386/isa/sound/sbcard.h b/sys/i386/isa/sound/sbcard.h new file mode 100644 index 0000000..464128c --- /dev/null +++ b/sys/i386/isa/sound/sbcard.h @@ -0,0 +1,54 @@ +/* + * file: sbcard.h + */ + +extern int sbc_major, sbc_minor ; +/* + * sound blaster registers + */ + +#define DSP_RESET (sbc_base + 0x6) +#define DSP_READ (sbc_base + 0xA) +#define DSP_WRITE (sbc_base + 0xC) +#define DSP_COMMAND (sbc_base + 0xC) +#define DSP_STATUS (sbc_base + 0xC) +#define DSP_DATA_AVAIL (sbc_base + 0xE) +#define DSP_DATA_AVL16 (sbc_base + 0xF) +#define MIXER_ADDR (sbc_base + 0x4) +#define MIXER_DATA (sbc_base + 0x5) +#define OPL3_LEFT (sbc_base + 0x0) +#define OPL3_RIGHT (sbc_base + 0x2) +#define OPL3_BOTH (sbc_base + 0x8) + +/* + * DSP Commands. There are many, and in many cases they are used explicitly + */ + +#define DSP_CMD_SPKON 0xD1 +#define DSP_CMD_SPKOFF 0xD3 +#define DSP_CMD_DMAON 0xD0 /* ??? the comment says Halt DMA */ +#define DSP_CMD_DMAOFF 0xD4 /* ??? comment says continue dma */ + +#define DSP_CMD_DMAHALT 0xD0 +#define DSP_CMD_TCONST 0x40 /* set time constant */ +#define DSP_CMD_HSSIZE 0x48 /* high speed dma count */ +#define DSP_CMD_HSDAC 0x91 /* high speed dac */ +#define DSP_CMD_HSADC 0x99 /* high speed adc */ +#define DSP_CMD_DAC8 0x14 /* 8-bit dac (dma count) */ +#define DSP_CMD_ADC8 0x24 /* 8-bit adc (dma count) */ + +#define DSP_CMD_GETVER 0xE1 +#define DSP_CMD_GETID 0xE7 /* return id bytes */ + +#if 0 /*** unknown ***/ + +#endif + +#define IMODE_NONE 0 +#define IMODE_OUTPUT PCM_ENABLE_OUTPUT +#define IMODE_INPUT PCM_ENABLE_INPUT +#define IMODE_INIT 3 +#define IMODE_MIDI 4 + +#define NORMAL_MIDI 0 +#define UART_MIDI 1 diff --git a/sys/i386/isa/sound/sequencer.c b/sys/i386/isa/sound/sequencer.c index bf50bd7..ef86ed7 100644 --- a/sys/i386/isa/sound/sequencer.c +++ b/sys/i386/isa/sound/sequencer.c @@ -1,10 +1,10 @@ /* * sound/sequencer.c - * + * * The sequencer personality manager. - * + * * Copyright by Hannu Savolainen 1993 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -12,7 +12,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -24,18 +24,19 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * */ #define SEQUENCER_C #include <i386/isa/sound/sound_config.h> -#include <i386/isa/sound/midi_ctrl.h> -extern void seq_drain_midi_queues __P((void)); +#if NSND > 0 + +#ifdef CONFIG_SEQUENCER -#ifdef CONFIGURE_SOUNDCARD +#include <i386/isa/sound/midi_ctrl.h> -#ifndef EXCLUDE_SEQUENCER +void seq_drain_midi_queues(void); static int sequencer_ok = 0; static struct sound_timer_operations *tmr; @@ -50,1375 +51,1313 @@ static int max_mididev = 0; static int max_synthdev = 0; /* - * The seq_mode gives the operating mode of the sequencer: - * 1 = level1 (the default) - * 2 = level2 (extended capabilites) + * The seq_mode gives the operating mode of the sequencer: 1 = level1 (the + * default) 2 = level2 (extended capabilites) */ #define SEQ_1 1 #define SEQ_2 2 static int seq_mode = SEQ_1; -DEFINE_WAIT_QUEUE (seq_sleeper, seq_sleep_flag); -DEFINE_WAIT_QUEUE (midi_sleeper, midi_sleep_flag); +static int *seq_sleeper = NULL; +static volatile struct snd_wait seq_sleep_flag = {0}; +static int *midi_sleeper = NULL; +static volatile struct snd_wait midi_sleep_flag = {0}; -static int midi_opened[MAX_MIDI_DEV] = -{0}; -static int midi_written[MAX_MIDI_DEV] = -{0}; +static int midi_opened[MAX_MIDI_DEV] = {0}; +static int midi_written[MAX_MIDI_DEV] = {0}; -static unsigned long prev_input_time = 0; -static int prev_event_time; -static unsigned long seq_time = 0; +u_long prev_input_time = 0; +int prev_event_time; +u_long seq_time = 0; #include <i386/isa/sound/tuning.h> #define EV_SZ 8 #define IEV_SZ 8 -static unsigned char *queue = NULL; -static unsigned char *iqueue = NULL; +static u_char *queue = NULL; +static u_char *iqueue = NULL; static volatile int qhead = 0, qtail = 0, qlen = 0; static volatile int iqhead = 0, iqtail = 0, iqlen = 0; static volatile int seq_playing = 0; -static int sequencer_busy = 0; +static volatile int sequencer_busy = 0; static int output_treshold; static int pre_event_timeout; -static unsigned synth_open_mask; +static u_int synth_open_mask; -static int seq_queue (unsigned char *note, char nonblock); -static void seq_startplay (void); -static int seq_sync (void); -static void seq_reset (void); +static int seq_queue(u_char *note, char nonblock); +static void seq_startplay(void); +static int seq_sync(void); +static void seq_reset(void); static int pmgr_present[MAX_SYNTH_DEV] = {0}; +static struct callout_handle sequencertimeout_ch + = CALLOUT_HANDLE_INITIALIZER(&sequencertimeout_ch); #if MAX_SYNTH_DEV > 15 #error Too many synthesizer devices enabled. #endif +/* + * sound_timer stuff -- originally in soundcard.c + * + * A negative value means a relative timeout in |count| ticks. + * A positive value is used for what ? + * + * In any case, this is only used in sequencer.c + */ + +static int timer_running = 0; + +void +request_sound_timer(int count) +{ + static int current = 0; + int tmp = count; + + if (count < 0) + sequencertimeout_ch = timeout(sequencer_timer, 0, -count); + else { + + if (count < current) + current = 0; /* Timer restarted */ + + count = count - current; + current = tmp; + if (!count) + count = 1; + sequencertimeout_ch = timeout(sequencer_timer, 0, count); + } + timer_running = 1; +} + +void +sound_stop_timer(void) +{ + if (timer_running) + untimeout( sequencer_timer, 0, sequencertimeout_ch); + timer_running = 0; +} + int -sequencer_read (int dev, struct fileinfo *file, snd_rw_buf * buf, int count) +sequencer_read(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) { - int c = count, p = 0; - int ev_len; - unsigned long flags; + int c = count, p = 0; + int ev_len; + u_long flags; - dev = dev >> 4; + dev = dev >> 4; - ev_len = seq_mode == SEQ_1 ? 4 : 8; + ev_len = seq_mode == SEQ_1 ? 4 : 8; - if (dev) /* - * Patch manager device - */ - return pmgr_read (dev - 1, file, buf, count); + if (dev) /* Patch manager device */ + return pmgr_read(dev - 1, file, buf, count); - DISABLE_INTR (flags); - if (!iqlen) - { - if (ISSET_FILE_FLAG (file, O_NONBLOCK)) - { - RESTORE_INTR (flags); - return RET_ERROR (EAGAIN); - } + flags = splhigh(); + if (!iqlen) { + int flag, chn; - DO_SLEEP (midi_sleeper, midi_sleep_flag, pre_event_timeout); - if (!iqlen) - { - RESTORE_INTR (flags); - return 0; + midi_sleeper = &chn; + DO_SLEEP(chn, midi_sleep_flag, pre_event_timeout); + + if (!iqlen) { + splx(flags); + return 0; } } + while (iqlen && c >= ev_len) { - while (iqlen && c >= ev_len) - { - - COPY_TO_USER (buf, p, &iqueue[iqhead * IEV_SZ], ev_len); - p += ev_len; - c -= ev_len; + if (uiomove((char *) &iqueue[iqhead * IEV_SZ], ev_len, buf)) + printf("sb: Bad copyout()!\n"); + p += ev_len; + c -= ev_len; - iqhead = (iqhead + 1) % SEQ_MAX_QUEUE; - iqlen--; + iqhead = (iqhead + 1) % SEQ_MAX_QUEUE; + iqlen--; } - RESTORE_INTR (flags); + splx(flags); - return count - c; + return count - c; } static void -sequencer_midi_output (int dev) +sequencer_midi_output(int dev) { - /* - * Currently NOP - */ + /* + * Currently NOP + */ } void -seq_copy_to_input (unsigned char *event, int len) +seq_copy_to_input(u_char *event, int len) { - unsigned long flags; + u_long flags; - /* + /* * Verify that the len is valid for the current mode. - */ + */ - if (len != 4 && len != 8) - return; - if ((seq_mode == SEQ_1) != (len == 4)) - return; + if (len != 4 && len != 8) + return; + if ((seq_mode == SEQ_1) != (len == 4)) + return; - if (iqlen >= (SEQ_MAX_QUEUE - 1)) - return; /* Overflow */ + if (iqlen >= (SEQ_MAX_QUEUE - 1)) + return; /* Overflow */ - DISABLE_INTR (flags); - memcpy (&iqueue[iqtail * IEV_SZ], event, len); - iqlen++; - iqtail = (iqtail + 1) % SEQ_MAX_QUEUE; + flags = splhigh(); + bcopy(event, &iqueue[iqtail * IEV_SZ], len); + iqlen++; + iqtail = (iqtail + 1) % SEQ_MAX_QUEUE; - if (SOMEONE_WAITING (midi_sleeper, midi_sleep_flag)) - { - WAKE_UP (midi_sleeper, midi_sleep_flag); + if ((midi_sleep_flag.mode & WK_SLEEP)) { + midi_sleep_flag.mode = WK_WAKEUP; + wakeup(midi_sleeper); } - RESTORE_INTR (flags); -#if defined(__FreeBSD__) - if (selinfo[0].si_pid) - selwakeup(&selinfo[0]); -#endif + splx(flags); } static void -sequencer_midi_input (int dev, unsigned char data) +sequencer_midi_input(int dev, u_char data) { - unsigned int tstamp; - unsigned char event[4]; + u_int tstamp; + u_char event[4]; - if (data == 0xfe) /* Ignore active sensing */ - return; + if (data == 0xfe) /* Ignore active sensing */ + return; - tstamp = GET_TIME () - seq_time; - if (tstamp != prev_input_time) - { - tstamp = (tstamp << 8) | SEQ_WAIT; + tstamp = get_time() - seq_time; + if (tstamp != prev_input_time) { + tstamp = (tstamp << 8) | SEQ_WAIT; - seq_copy_to_input ((unsigned char *) &tstamp, 4); - prev_input_time = tstamp; + seq_copy_to_input((u_char *) &tstamp, 4); + prev_input_time = tstamp; } + event[0] = SEQ_MIDIPUTC; + event[1] = data; + event[2] = dev; + event[3] = 0; - event[0] = SEQ_MIDIPUTC; - event[1] = data; - event[2] = dev; - event[3] = 0; - - seq_copy_to_input (event, 4); + seq_copy_to_input(event, 4); } void -seq_input_event (unsigned char *event, int len) +seq_input_event(u_char *event, int len) { - unsigned long this_time; + u_long this_time; - if (seq_mode == SEQ_2) - this_time = tmr->get_time (tmr_no); - else - this_time = GET_TIME () - seq_time; + if (seq_mode == SEQ_2) + this_time = tmr->get_time(tmr_no); + else + this_time = get_time() - seq_time; - if (this_time != prev_input_time) - { - unsigned char tmp_event[8]; + if (this_time != prev_input_time) { + u_char tmp_event[8]; - tmp_event[0] = EV_TIMING; - tmp_event[1] = TMR_WAIT_ABS; - tmp_event[2] = 0; - tmp_event[3] = 0; - *(unsigned long *) &tmp_event[4] = this_time; + tmp_event[0] = EV_TIMING; + tmp_event[1] = TMR_WAIT_ABS; + tmp_event[2] = 0; + tmp_event[3] = 0; + *(u_long *) &tmp_event[4] = this_time; - seq_copy_to_input (tmp_event, 8); - prev_input_time = this_time; + seq_copy_to_input(tmp_event, 8); + prev_input_time = this_time; } - - seq_copy_to_input (event, len); + seq_copy_to_input(event, len); } int -sequencer_write (int dev, struct fileinfo *file, snd_rw_buf * buf, int count) +sequencer_write(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) { - unsigned char event[EV_SZ], ev_code; - int p = 0, c, ev_size; - int err; - int mode = file->mode & O_ACCMODE; + u_char event[EV_SZ], ev_code; + int p = 0, c, ev_size; + int err; + int mode = file->mode & O_ACCMODE; - dev = dev >> 4; + dev = dev >> 4; - DEB (printk ("sequencer_write(dev=%d, count=%d)\n", dev, count)); + DEB(printf("sequencer_write(dev=%d, count=%d)\n", dev, count)); - if (mode == OPEN_READ) - return RET_ERROR (EIO); + if (mode == OPEN_READ) + return -(EIO); - if (dev) /* - * Patch manager device - */ - return pmgr_write (dev - 1, file, buf, count); + if (dev) + return pmgr_write(dev - 1, file, buf, count); - c = count; + c = count; - while (c >= 4) - { - COPY_FROM_USER (event, buf, p, 4); - ev_code = event[0]; + while (c >= 4) { - if (ev_code == SEQ_FULLSIZE) - { - int err; + if (uiomove((char *) event, 4, buf)) + printf("sb: Bad copyin()!\n"); + ev_code = event[0]; - dev = *(unsigned short *) &event[2]; - if (dev < 0 || dev >= max_synthdev) - return RET_ERROR (ENXIO); + if (ev_code == SEQ_FULLSIZE) { + int err; - if (!(synth_open_mask & (1 << dev))) - return RET_ERROR (ENXIO); + dev = *(u_short *) &event[2]; + if (dev < 0 || dev >= max_synthdev) + return -(ENXIO); - err = synth_devs[dev]->load_patch (dev, *(short *) &event[0], buf, p + 4, c, 0); - if (err < 0) - return err; + if (!(synth_open_mask & (1 << dev))) + return -(ENXIO); - return err; - } + err = synth_devs[dev]->load_patch(dev, + *(short *) &event[0], buf, p + 4, c, 0); + if (err < 0) + return err; - if (ev_code >= 128) - { - if (seq_mode == SEQ_2 && ev_code == SEQ_EXTENDED) - { - printk ("Sequencer: Invalid level 2 event %x\n", ev_code); - return RET_ERROR (EINVAL); + return err; + } + if (ev_code >= 128) { + if (seq_mode == SEQ_2 && ev_code == SEQ_EXTENDED) { + printf("Sequencer: Invalid level 2 event %x\n", ev_code); + return -(EINVAL); } + ev_size = 8; - ev_size = 8; - - if (c < ev_size) - { - if (!seq_playing) - seq_startplay (); - return count - c; + if (c < ev_size) { + if (!seq_playing) + seq_startplay(); + return count - c; } - - COPY_FROM_USER (&event[4], buf, p + 4, 4); - - } - else - { - if (seq_mode == SEQ_2) - { - printk ("Sequencer: 4 byte event in level 2 mode\n"); - return RET_ERROR (EINVAL); + if (uiomove((char *) &event[4], 4, buf)) + printf("sb: Bad copyin()!\n"); + } else { + if (seq_mode == SEQ_2) { + printf("Sequencer: 4 byte event in level 2 mode\n"); + return -(EINVAL); } - ev_size = 4; + ev_size = 4; } - if (event[0] == SEQ_MIDIPUTC) - { + if (event[0] == SEQ_MIDIPUTC) { - if (!midi_opened[event[2]]) - { - int mode; - int dev = event[2]; + if (!midi_opened[event[2]]) { + int mode; + int dev = event[2]; - if (dev >= max_mididev) - { - printk ("Sequencer Error: Nonexistent MIDI device %d\n", dev); - return RET_ERROR (ENXIO); + if (dev >= max_mididev) { + printf("Sequencer Error: Nonexistent MIDI device %d\n",dev); + return -(ENXIO); } + mode = file->mode & O_ACCMODE; - mode = file->mode & O_ACCMODE; - - if ((err = midi_devs[dev]->open (dev, mode, - sequencer_midi_input, sequencer_midi_output)) < 0) - { - seq_reset (); - printk ("Sequencer Error: Unable to open Midi #%d\n", dev); - return err; + if ((err = midi_devs[dev]->open(dev, mode, + sequencer_midi_input, sequencer_midi_output)) < 0) { + seq_reset(); + printf("Sequencer Error: Unable to open Midi #%d\n", dev); + return err; } - - midi_opened[dev] = 1; + midi_opened[dev] = 1; } - } + if (!seq_queue(event, 0)) { + int processed = count - c; - if (!seq_queue (event, ISSET_FILE_FLAG (file, O_NONBLOCK))) - { - int processed = count - c; + if (!seq_playing) + seq_startplay(); - if (!seq_playing) - seq_startplay (); - - if (!processed && ISSET_FILE_FLAG (file, O_NONBLOCK)) - return RET_ERROR (EAGAIN); - else - return processed; + if (!processed && 0) + return -(EAGAIN); + else + return processed; } - - p += ev_size; - c -= ev_size; + p += ev_size; + c -= ev_size; } - if (!seq_playing) - seq_startplay (); + if (!seq_playing) + seq_startplay(); - return count; /* This will "eat" chunks shorter than 4 bytes (if written - * alone) Should we really do that ? - */ + return count; /* This will "eat" chunks shorter than 4 bytes + * (if written alone) Should we really do that ? + */ } static int -seq_queue (unsigned char *note, char nonblock) +seq_queue(u_char *note, char nonblock) { - /* - * Test if there is space in the queue - */ + /* + * Test if there is space in the queue + */ - if (qlen >= SEQ_MAX_QUEUE) - if (!seq_playing) - seq_startplay (); /* - * Give chance to drain the queue - */ + if (qlen >= SEQ_MAX_QUEUE) + if (!seq_playing) + seq_startplay(); /* Give chance to drain the queue */ - if (!nonblock && qlen >= SEQ_MAX_QUEUE && !SOMEONE_WAITING (seq_sleeper, seq_sleep_flag)) - { - /* - * Sleep until there is enough space on the queue - */ - DO_SLEEP (seq_sleeper, seq_sleep_flag, 0); - } + if (!nonblock && qlen >= SEQ_MAX_QUEUE && + !(seq_sleep_flag.mode & WK_SLEEP)) { + /* + * Sleep until there is enough space on the queue + */ + + int chn; + + + seq_sleeper = &chn; + DO_SLEEP(chn, seq_sleep_flag, 0); - if (qlen >= SEQ_MAX_QUEUE) - { - return 0; /* - * To be sure - */ } - memcpy (&queue[qtail * EV_SZ], note, EV_SZ); + if (qlen >= SEQ_MAX_QUEUE) + return 0; /* To be sure */ + bcopy(note, &queue[qtail * EV_SZ], EV_SZ); - qtail = (qtail + 1) % SEQ_MAX_QUEUE; - qlen++; + qtail = (qtail + 1) % SEQ_MAX_QUEUE; + qlen++; - return 1; + return 1; } static int -extended_event (unsigned char *q) +extended_event(u_char *q) { - int dev = q[2]; + int dev = q[2]; - if (dev < 0 || dev >= max_synthdev) - return RET_ERROR (ENXIO); + if (dev < 0 || dev >= max_synthdev) + return -(ENXIO); - if (!(synth_open_mask & (1 << dev))) - return RET_ERROR (ENXIO); + if (!(synth_open_mask & (1 << dev))) + return -(ENXIO); - switch (q[1]) - { + switch (q[1]) { case SEQ_NOTEOFF: - synth_devs[dev]->kill_note (dev, q[3], q[4], q[5]); - break; + synth_devs[dev]->kill_note(dev, q[3], q[4], q[5]); + break; case SEQ_NOTEON: - if (q[4] > 127 && q[4] != 255) - return 0; + if (q[4] > 127 && q[4] != 255) + return 0; - synth_devs[dev]->start_note (dev, q[3], q[4], q[5]); - break; + synth_devs[dev]->start_note(dev, q[3], q[4], q[5]); + break; case SEQ_PGMCHANGE: - synth_devs[dev]->set_instr (dev, q[3], q[4]); - break; + synth_devs[dev]->set_instr(dev, q[3], q[4]); + break; case SEQ_AFTERTOUCH: - synth_devs[dev]->aftertouch (dev, q[3], q[4]); - break; + synth_devs[dev]->aftertouch(dev, q[3], q[4]); + break; case SEQ_BALANCE: - synth_devs[dev]->panning (dev, q[3], (char) q[4]); - break; + synth_devs[dev]->panning(dev, q[3], (char) q[4]); + break; case SEQ_CONTROLLER: - synth_devs[dev]->controller (dev, q[3], q[4], *(short *) &q[5]); - break; + synth_devs[dev]->controller(dev, q[3], q[4], *(short *) &q[5]); + break; case SEQ_VOLMODE: - if (synth_devs[dev]->volume_method != NULL) - synth_devs[dev]->volume_method (dev, q[3]); - break; + if (synth_devs[dev]->volume_method != NULL) + synth_devs[dev]->volume_method(dev, q[3]); + break; default: - return RET_ERROR (EINVAL); + return -(EINVAL); } - return 0; + return 0; } static int -find_voice (int dev, int chn, int note) +find_voice(int dev, int chn, int note) { - unsigned short key; - int i; + u_short key; + int i; - key = (chn << 8) | (note + 1); + key = (chn << 8) | (note + 1); - for (i = 0; i < synth_devs[dev]->alloc.max_voice; i++) - if (synth_devs[dev]->alloc.map[i] == key) - return i; + for (i = 0; i < synth_devs[dev]->alloc.max_voice; i++) + if (synth_devs[dev]->alloc.map[i] == key) + return i; - return -1; + return -1; } static int -alloc_voice (int dev, int chn, int note) +alloc_voice(int dev, int chn, int note) { - unsigned short key; - int voice; + u_short key; + int voice; - key = (chn << 8) | (note + 1); + key = (chn << 8) | (note + 1); - voice = synth_devs[dev]->alloc_voice (dev, chn, note, - &synth_devs[dev]->alloc); - synth_devs[dev]->alloc.map[voice] = key; - synth_devs[dev]->alloc.alloc_times[voice] = - synth_devs[dev]->alloc.timestamp++; - return voice; + voice = synth_devs[dev]->alloc_voice(dev, chn, note, + &synth_devs[dev]->alloc); + synth_devs[dev]->alloc.map[voice] = key; + synth_devs[dev]->alloc.alloc_times[voice] = + synth_devs[dev]->alloc.timestamp++; + return voice; } static void -seq_chn_voice_event (unsigned char *event) +seq_chn_voice_event(u_char *event) { - unsigned char dev = event[1]; - unsigned char cmd = event[2]; - unsigned char chn = event[3]; - unsigned char note = event[4]; - unsigned char parm = event[5]; - int voice = -1; - - if ((int) dev > max_synthdev) - return; - if (!(synth_open_mask & (1 << dev))) - return; - if (!synth_devs[dev]) - return; - - if (seq_mode == SEQ_2) - { - if (synth_devs[dev]->alloc_voice) - voice = find_voice (dev, chn, note); + u_char dev = event[1]; + u_char cmd = event[2]; + u_char chn = event[3]; + u_char note = event[4]; + u_char parm = event[5]; + int voice = -1; + + if ((int) dev > max_synthdev) + return; + if (!(synth_open_mask & (1 << dev))) + return; + if (!synth_devs[dev]) + return; - if (cmd == MIDI_NOTEON && parm == 0) - { - cmd = MIDI_NOTEOFF; - parm = 64; + if (seq_mode == SEQ_2) { + if (synth_devs[dev]->alloc_voice) + voice = find_voice(dev, chn, note); + + if (cmd == MIDI_NOTEON && parm == 0) { + cmd = MIDI_NOTEOFF; + parm = 64; } } - - switch (cmd) - { + switch (cmd) { case MIDI_NOTEON: - if (note > 127 && note != 255) /* Not a seq2 feature */ - return; + if (note > 127 && note != 255) /* Not a seq2 feature */ + return; - if (voice == -1 && seq_mode == SEQ_2 && synth_devs[dev]->alloc_voice) - { /* Internal synthesizer (FM, GUS, etc) */ - voice = alloc_voice (dev, chn, note); + if (voice == -1 && seq_mode == SEQ_2 && synth_devs[dev]->alloc_voice) { + /* Internal synthesizer (FM, GUS, etc) */ + voice = alloc_voice(dev, chn, note); } + if (voice == -1) + voice = chn; - if (voice == -1) - voice = chn; - - if (seq_mode == SEQ_2 && dev < num_synths) - { - /* - * The MIDI channel 10 is a percussive channel. Use the note - * number to select the proper patch (128 to 255) to play. - */ + if (seq_mode == SEQ_2 && (int) dev < num_synths) { + /* + * The MIDI channel 10 is a percussive channel. Use + * the note number to select the proper patch (128 to + * 255) to play. + */ - if (chn == 9) - { - synth_devs[dev]->set_instr (dev, voice, 128 + note); - note = 60; /* Middle C */ + if (chn == 9) { + synth_devs[dev]->set_instr(dev, voice, 128 + note); + note = 60; /* Middle C */ } } - - if (seq_mode == SEQ_2) - { - synth_devs[dev]->setup_voice (dev, voice, chn); - } - - synth_devs[dev]->start_note (dev, voice, note, parm); - break; + if (seq_mode == SEQ_2) + synth_devs[dev]->setup_voice(dev, voice, chn); + synth_devs[dev]->start_note(dev, voice, note, parm); + break; case MIDI_NOTEOFF: - if (voice == -1) - voice = chn; - synth_devs[dev]->kill_note (dev, voice, note, parm); - break; + if (voice == -1) + voice = chn; + synth_devs[dev]->kill_note(dev, voice, note, parm); + break; case MIDI_KEY_PRESSURE: - if (voice == -1) - voice = chn; - synth_devs[dev]->aftertouch (dev, voice, parm); - break; + if (voice == -1) + voice = chn; + synth_devs[dev]->aftertouch(dev, voice, parm); + break; default:; } } static void -seq_chn_common_event (unsigned char *event) +seq_chn_common_event(u_char *event) { - unsigned char dev = event[1]; - unsigned char cmd = event[2]; - unsigned char chn = event[3]; - unsigned char p1 = event[4]; - - /* unsigned char p2 = event[5]; */ - unsigned short w14 = *(short *) &event[6]; - - if ((int) dev > max_synthdev) - return; - if (!(synth_open_mask & (1 << dev))) - return; - if (!synth_devs[dev]) - return; - - switch (cmd) - { + u_char dev = event[1]; + u_char cmd = event[2]; + u_char chn = event[3]; + u_char p1 = event[4]; + + /* u_char p2 = event[5]; */ + u_short w14 = *(short *) &event[6]; + + if ((int) dev > max_synthdev) + return; + if (!(synth_open_mask & (1 << dev))) + return; + if (!synth_devs[dev]) + return; + + switch (cmd) { case MIDI_PGM_CHANGE: - if (seq_mode == SEQ_2) - { - synth_devs[dev]->chn_info[chn].pgm_num = p1; - if (dev >= num_synths) - synth_devs[dev]->set_instr (dev, chn, p1); - } - else - synth_devs[dev]->set_instr (dev, chn, p1); + if (seq_mode == SEQ_2) { + synth_devs[dev]->chn_info[chn].pgm_num = p1; + if ((int) dev >= num_synths) + synth_devs[dev]->set_instr(dev, chn, p1); + } else + synth_devs[dev]->set_instr(dev, chn, p1); - break; + break; case MIDI_CTL_CHANGE: + if (seq_mode == SEQ_2) { + if (chn > 15 || p1 > 127) + break; - if (seq_mode == SEQ_2) - { - if (chn > 15 || p1 > 127) - break; - - synth_devs[dev]->chn_info[chn].controllers[p1] = w14 & 0x7f; - - if (dev < num_synths) - { - int val = w14 & 0x7f; - int i, key; - - if (p1 < 64) /* Combine MSB and LSB */ - { - val = ((synth_devs[dev]-> - chn_info[chn].controllers[p1 & ~32] & 0x7f) << 7) - | (synth_devs[dev]-> - chn_info[chn].controllers[p1 | 32] & 0x7f); - p1 &= ~32; - } + synth_devs[dev]->chn_info[chn].controllers[p1] = w14 & 0x7f; - /* Handle all playing notes on this channel */ + if (p1 < 32) /* Setting MSB should clear LSB to 0 */ + synth_devs[dev]->chn_info[chn].controllers[p1 + 32] = 0; - key = (chn << 8); + if ((int) dev < num_synths) { + int val = w14 & 0x7f; + int i, key; - for (i = 0; i < synth_devs[dev]->alloc.max_voice; i++) - if ((synth_devs[dev]->alloc.map[i] & 0xff00) == key) - synth_devs[dev]->controller (dev, i, p1, val); - } - else - synth_devs[dev]->controller (dev, chn, p1, w14); - } - else /* Mode 1 */ - synth_devs[dev]->controller (dev, chn, p1, w14); - break; + if (p1 < 64) { /* Combine MSB and LSB */ + val = ((synth_devs[dev]-> + chn_info[chn].controllers[p1 & ~32] & 0x7f) << 7) + | (synth_devs[dev]-> + chn_info[chn].controllers[p1 | 32] & 0x7f); + p1 &= ~32; + } + /* Handle all playing notes on this channel */ + + key = ((int) chn << 8); + + for (i = 0; i < synth_devs[dev]->alloc.max_voice; i++) + if ((synth_devs[dev]->alloc.map[i] & 0xff00) == key) + synth_devs[dev]->controller(dev, i, p1, val); + } else + synth_devs[dev]->controller(dev, chn, p1, w14); + } else /* Mode 1 */ + synth_devs[dev]->controller(dev, chn, p1, w14); + break; case MIDI_PITCH_BEND: - if (seq_mode == SEQ_2) - { - synth_devs[dev]->chn_info[chn].bender_value = w14; + if (seq_mode == SEQ_2) { + synth_devs[dev]->chn_info[chn].bender_value = w14; - if (dev < num_synths) - { /* Handle all playing notes on this channel */ - int i, key; + if ((int) dev < num_synths) { /* Handle all playing + * notes on this channel */ + int i, key; - key = (chn << 8); + key = (chn << 8); - for (i = 0; i < synth_devs[dev]->alloc.max_voice; i++) - if ((synth_devs[dev]->alloc.map[i] & 0xff00) == key) - synth_devs[dev]->bender (dev, i, w14); - } - else - synth_devs[dev]->bender (dev, chn, w14); - } - else /* MODE 1 */ - synth_devs[dev]->bender (dev, chn, w14); - break; + for (i = 0; i < synth_devs[dev]->alloc.max_voice; i++) + if ((synth_devs[dev]->alloc.map[i] & 0xff00) == key) + synth_devs[dev]->bender(dev, i, w14); + } else + synth_devs[dev]->bender(dev, chn, w14); + } else /* MODE 1 */ + synth_devs[dev]->bender(dev, chn, w14); + break; default:; } } static int -seq_timing_event (unsigned char *event) +seq_timing_event(u_char *event) { - unsigned char cmd = event[1]; - unsigned int parm = *(int *) &event[4]; + u_char cmd = event[1]; + u_int parm = *(int *) &event[4]; - if (seq_mode == SEQ_2) - { - int ret; + if (seq_mode == SEQ_2) { + int ret; - if ((ret = tmr->event (tmr_no, event)) == TIMER_ARMED) - { - if ((SEQ_MAX_QUEUE - qlen) >= output_treshold) - { - unsigned long flags; - - DISABLE_INTR (flags); - if (SOMEONE_WAITING (seq_sleeper, seq_sleep_flag)) - { - WAKE_UP (seq_sleeper, seq_sleep_flag); + if ((ret = tmr->event(tmr_no, event)) == TIMER_ARMED) { + if ((SEQ_MAX_QUEUE - qlen) >= output_treshold) { + u_long flags; + + flags = splhigh(); + if ((seq_sleep_flag.mode & WK_SLEEP)) { + seq_sleep_flag.mode = WK_WAKEUP; + wakeup(seq_sleeper); } - RESTORE_INTR (flags); -#if defined(__FreeBSD__) - /* must issue a wakeup for anyone waiting (select) XXX */ -#endif + splx(flags); } } - return ret; + return ret; } - - switch (cmd) - { + switch (cmd) { case TMR_WAIT_REL: - parm += prev_event_time; + parm += prev_event_time; - /* - * NOTE! No break here. Execution of TMR_WAIT_REL continues in the - * next case (TMR_WAIT_ABS) - */ + /* + * NOTE! No break here. Execution of TMR_WAIT_REL continues + * in the next case (TMR_WAIT_ABS) + */ case TMR_WAIT_ABS: - if (parm > 0) - { - long time; + if (parm > 0) { + long time; - seq_playing = 1; - time = parm; - prev_event_time = time; + seq_playing = 1; + time = parm; + prev_event_time = time; - request_sound_timer (time); + request_sound_timer(time); - if ((SEQ_MAX_QUEUE - qlen) >= output_treshold) - { - unsigned long flags; + if ((SEQ_MAX_QUEUE - qlen) >= output_treshold) { + u_long flags; - DISABLE_INTR (flags); - if (SOMEONE_WAITING (seq_sleeper, seq_sleep_flag)) - { - WAKE_UP (seq_sleeper, seq_sleep_flag); + flags = splhigh(); + if ((seq_sleep_flag.mode & WK_SLEEP)) { + seq_sleep_flag.mode = WK_WAKEUP; + wakeup(seq_sleeper); } - RESTORE_INTR (flags); -#if defined(__FreeBSD__) - /* must issue a wakeup for select XXX */ -#endif + splx(flags); } - - return TIMER_ARMED; + return TIMER_ARMED; } - break; + break; case TMR_START: - seq_time = GET_TIME (); - prev_input_time = 0; - prev_event_time = 0; - break; + seq_time = get_time(); + prev_input_time = 0; + prev_event_time = 0; + break; case TMR_STOP: - break; + break; case TMR_CONTINUE: - break; + break; case TMR_TEMPO: - break; + break; case TMR_ECHO: - if (seq_mode == SEQ_2) - seq_copy_to_input (event, 8); - else - { - parm = (parm << 8 | SEQ_ECHO); - seq_copy_to_input ((unsigned char *) &parm, 4); + if (seq_mode == SEQ_2) + seq_copy_to_input(event, 8); + else { + parm = (parm << 8 | SEQ_ECHO); + seq_copy_to_input((u_char *) &parm, 4); } - break; + break; default:; } - return TIMER_NOT_ARMED; + return TIMER_NOT_ARMED; +} + +static void +seq_local_event(u_char *event) +{ + u_char cmd = event[1]; + u_int parm = *((u_int *) &event[4]); + + switch (cmd) { + case LOCL_STARTAUDIO: +#ifdef CONFIG_AUDIO + DMAbuf_start_devices(parm); +#endif + break; + + default:; + } } static void -seq_local_event (unsigned char *event) +seq_sysex_message(u_char *event) { - /* unsigned char cmd = event[1]; */ + int dev = event[1]; + int i, l = 0; + u_char *buf = &event[2]; + + if ((int) dev > max_synthdev) + return; + if (!(synth_open_mask & (1 << dev))) + return; + if (!synth_devs[dev]) + return; + if (!synth_devs[dev]->send_sysex) + return; + + l = 0; + for (i = 0; i < 6 && buf[i] != 0xff; i++) + l = i + 1; - printk ("seq_local_event() called. WHY????????\n"); + if (l > 0) + synth_devs[dev]->send_sysex(dev, buf, l); } static int -play_event (unsigned char *q) +play_event(u_char *q) { - /* - * NOTE! This routine returns - * 0 = normal event played. - * 1 = Timer armed. Suspend playback until timer callback. - * 2 = MIDI output buffer full. Restore queue and suspend until timer - */ - unsigned long *delay; - - switch (q[0]) - { + /* + * NOTE! This routine returns 0 = normal event played. 1 = Timer + * armed. Suspend playback until timer callback. 2 = MIDI output + * buffer full. Restore queue and suspend until timer + */ + u_long *delay; + + switch (q[0]) { case SEQ_NOTEOFF: - if (synth_open_mask & (1 << 0)) - if (synth_devs[0]) - synth_devs[0]->kill_note (0, q[1], 255, q[3]); - break; + if (synth_open_mask & (1 << 0)) + if (synth_devs[0]) + synth_devs[0]->kill_note(0, q[1], 255, q[3]); + break; case SEQ_NOTEON: - if (q[4] < 128 || q[4] == 255) - if (synth_open_mask & (1 << 0)) - if (synth_devs[0]) - synth_devs[0]->start_note (0, q[1], q[2], q[3]); - break; + if (q[4] < 128 || q[4] == 255) + if (synth_open_mask & (1 << 0)) + if (synth_devs[0]) + synth_devs[0]->start_note(0, q[1], q[2], q[3]); + break; case SEQ_WAIT: - delay = (unsigned long *) q; /* - * Bytes 1 to 3 are containing the * - * delay in GET_TIME() - */ - *delay = (*delay >> 8) & 0xffffff; + delay = (u_long *) q; /* Bytes 1 to 3 are + * containing the * delay in + * get_time() */ + *delay = (*delay >> 8) & 0xffffff; - if (*delay > 0) - { - long time; + if (*delay > 0) { + long time; - seq_playing = 1; - time = *delay; - prev_event_time = time; + seq_playing = 1; + time = *delay; + prev_event_time = time; - request_sound_timer (time); + request_sound_timer(time); - if ((SEQ_MAX_QUEUE - qlen) >= output_treshold) - { - unsigned long flags; + if ((SEQ_MAX_QUEUE - qlen) >= output_treshold) { + u_long flags; - DISABLE_INTR (flags); - if (SOMEONE_WAITING (seq_sleeper, seq_sleep_flag)) - { - WAKE_UP (seq_sleeper, seq_sleep_flag); + flags = splhigh(); + if ((seq_sleep_flag.mode & WK_SLEEP)) { + seq_sleep_flag.mode = WK_WAKEUP; + wakeup(seq_sleeper); } - RESTORE_INTR (flags); -#if defined(__FreeBSD__) - /* must issue a wakeup for selects XXX */ -#endif + splx(flags); } - /* - * The timer is now active and will reinvoke this function - * after the timer expires. Return to the caller now. - */ - return 1; + /* + * The timer is now active and will reinvoke this + * function after the timer expires. Return to the + * caller now. + */ + return 1; } - break; + break; case SEQ_PGMCHANGE: - if (synth_open_mask & (1 << 0)) - if (synth_devs[0]) - synth_devs[0]->set_instr (0, q[1], q[2]); - break; - - case SEQ_SYNCTIMER: /* - * Reset timer - */ - seq_time = GET_TIME (); - prev_input_time = 0; - prev_event_time = 0; - break; - - case SEQ_MIDIPUTC: /* - * Put a midi character - */ - if (midi_opened[q[2]]) - { - int dev; - - dev = q[2]; - - if (!midi_devs[dev]->putc (dev, q[1])) - { - /* - * Output FIFO is full. Wait one timer cycle and try again. - */ - - seq_playing = 1; - request_sound_timer (-1); - return 2; - } - else - midi_written[dev] = 1; + if (synth_open_mask & (1 << 0)) + if (synth_devs[0]) + synth_devs[0]->set_instr(0, q[1], q[2]); + break; + + case SEQ_SYNCTIMER: /* Reset timer */ + seq_time = get_time(); + prev_input_time = 0; + prev_event_time = 0; + break; + + case SEQ_MIDIPUTC: /* Put a midi character */ + if (midi_opened[q[2]]) { + int dev; + + dev = q[2]; + + if (!midi_devs[dev]->putc(dev, q[1])) { + /* + * Output FIFO is full. Wait one timer cycle and try again. + */ + + seq_playing = 1; + request_sound_timer(-1); + return 2; + } else + midi_written[dev] = 1; } - break; + break; case SEQ_ECHO: - seq_copy_to_input (q, 4); /* - * Echo back to the process - */ - break; + seq_copy_to_input(q, 4); /* Echo back to the process */ + break; case SEQ_PRIVATE: - if ((int) q[1] < max_synthdev) - synth_devs[q[1]]->hw_control (q[1], q); - break; + if ((int) q[1] < max_synthdev) + synth_devs[q[1]]->hw_control(q[1], q); + break; case SEQ_EXTENDED: - extended_event (q); - break; + extended_event(q); + break; case EV_CHN_VOICE: - seq_chn_voice_event (q); - break; + seq_chn_voice_event(q); + break; case EV_CHN_COMMON: - seq_chn_common_event (q); - break; + seq_chn_common_event(q); + break; case EV_TIMING: - if (seq_timing_event (q) == TIMER_ARMED) - { - return 1; + if (seq_timing_event(q) == TIMER_ARMED) { + return 1; } - break; + break; case EV_SEQ_LOCAL: - seq_local_event (q); - break; + seq_local_event(q); + break; + + case EV_SYSEX: + seq_sysex_message(q); + break; default:; } - return 0; + return 0; } static void -seq_startplay (void) +seq_startplay(void) { - unsigned long flags; - int this_one, action; + u_long flags; + int this_one, action; - while (qlen > 0) - { + while (qlen > 0) { - DISABLE_INTR (flags); - qhead = ((this_one = qhead) + 1) % SEQ_MAX_QUEUE; - qlen--; - RESTORE_INTR (flags); + flags = splhigh(); + qhead = ((this_one = qhead) + 1) % SEQ_MAX_QUEUE; + qlen--; + splx(flags); - seq_playing = 1; + seq_playing = 1; - if ((action = play_event (&queue[this_one * EV_SZ]))) - { /* Suspend playback. Next timer routine invokes this routine again */ - if (action == 2) - { - qlen++; - qhead = this_one; + if ((action = play_event(&queue[this_one * EV_SZ]))) { + /* + * Suspend playback. Next timer routine invokes this routine again + */ + if (action == 2) { + qlen++; + qhead = this_one; } - return; + return; } - } - seq_playing = 0; + seq_playing = 0; - if ((SEQ_MAX_QUEUE - qlen) >= output_treshold) - { - unsigned long flags; + if ((SEQ_MAX_QUEUE - qlen) >= output_treshold) { + u_long flags; - DISABLE_INTR (flags); - if (SOMEONE_WAITING (seq_sleeper, seq_sleep_flag)) - { - WAKE_UP (seq_sleeper, seq_sleep_flag); + flags = splhigh(); + if ((seq_sleep_flag.mode & WK_SLEEP)) { + seq_sleep_flag.mode = WK_WAKEUP; + wakeup(seq_sleeper); } - RESTORE_INTR (flags); -#if defined(__FreeBSD__) - /* must issue a wakeup for selects XXX */ -#endif + splx(flags); } } static void -reset_controllers (int dev, unsigned char *controller, int update_dev) +reset_controllers(int dev, u_char *controller, int update_dev) { - int i; + int i; - for (i = 0; i < 128; i++) - controller[i] = ctrl_def_values[i]; + for (i = 0; i < 128; i++) + controller[i] = ctrl_def_values[i]; } static void -setup_mode2 (void) +setup_mode2(void) { - int dev; + int dev; - max_synthdev = num_synths; + max_synthdev = num_synths; - for (dev = 0; dev < num_midis; dev++) - if (midi_devs[dev]->converter != NULL) - { - synth_devs[max_synthdev++] = - midi_devs[dev]->converter; - } + for (dev = 0; dev < num_midis; dev++) + if (midi_devs[dev]->converter != NULL) + synth_devs[max_synthdev++] = midi_devs[dev]->converter; + for (dev = 0; dev < max_synthdev; dev++) { + int chn; - for (dev = 0; dev < max_synthdev; dev++) - { - int chn; - - for (chn = 0; chn < 16; chn++) - { - synth_devs[dev]->chn_info[chn].pgm_num = 0; - reset_controllers (dev, - synth_devs[dev]->chn_info[chn].controllers, - 0); - synth_devs[dev]->chn_info[chn].bender_value = (1 << 7); /* Neutral */ + for (chn = 0; chn < 16; chn++) { + synth_devs[dev]->chn_info[chn].pgm_num = 0; + reset_controllers(dev, + synth_devs[dev]->chn_info[chn].controllers, 0); + synth_devs[dev]->chn_info[chn].bender_value = (1<<7); /* Neutral */ } } - max_mididev = 0; - seq_mode = SEQ_2; + max_mididev = 0; + seq_mode = SEQ_2; } int -sequencer_open (int dev, struct fileinfo *file) +sequencer_open(int dev, struct fileinfo * file) { - int retval, mode, i; - int level, tmp; + int retval, mode, i; + int level, tmp; + u_long flags; - level = ((dev & 0x0f) == SND_DEV_SEQ2) ? 2 : 1; + level = ((dev & 0x0f) == SND_DEV_SEQ2) ? 2 : 1; - dev = dev >> 4; - mode = file->mode & O_ACCMODE; + dev = dev >> 4; + mode = file->mode & O_ACCMODE; - DEB (printk ("sequencer_open(dev=%d)\n", dev)); + DEB(printf("sequencer_open(dev=%d)\n", dev)); - if (!sequencer_ok) - { - printk ("Soundcard: Sequencer not initialized\n"); - return RET_ERROR (ENXIO); + if (!sequencer_ok) { + printf("Soundcard: Sequencer not initialized\n"); + return -(ENXIO); } + if (dev) { /* Patch manager device */ + int err; - if (dev) /* - * Patch manager device - */ - { - int err; + printf("Patch manager interface is currently broken. Sorry\n"); + return -(ENXIO); - dev--; + dev--; - if (dev >= MAX_SYNTH_DEV) - return RET_ERROR (ENXIO); - if (pmgr_present[dev]) - return RET_ERROR (EBUSY); - if ((err = pmgr_open (dev)) < 0) - return err; /* - * Failed - */ + if (dev >= MAX_SYNTH_DEV) + return -(ENXIO); + if (pmgr_present[dev]) + return -(EBUSY); + if ((err = pmgr_open(dev)) < 0) + return err; - pmgr_present[dev] = 1; - return err; + pmgr_present[dev] = 1; + return err; } - - if (sequencer_busy) - { - printk ("Sequencer busy\n"); - return RET_ERROR (EBUSY); + flags = splhigh(); + if (sequencer_busy) { + printf("Sequencer busy\n"); + splx(flags); + return -(EBUSY); } + sequencer_busy = 1; + splx(flags); - max_mididev = num_midis; - max_synthdev = num_synths; - pre_event_timeout = 0; - seq_mode = SEQ_1; + max_mididev = num_midis; + max_synthdev = num_synths; + pre_event_timeout = 0; + seq_mode = SEQ_1; - if (pending_timer != -1) - { - tmr_no = pending_timer; - pending_timer = -1; + if (pending_timer != -1) { + tmr_no = pending_timer; + pending_timer = -1; } - - if (tmr_no == -1) /* Not selected yet */ - { - int i, best; - - best = -1; - for (i = 0; i < num_sound_timers; i++) - if (sound_timer_devs[i]->priority > best) - { - tmr_no = i; - best = sound_timer_devs[i]->priority; - } - - if (tmr_no == -1) /* Should not be */ - tmr_no = 0; + if (tmr_no == -1) { /* Not selected yet */ + int i, best; + + best = -1; + for (i = 0; i < num_sound_timers; i++) + if (sound_timer_devs[i]->priority > best) { + tmr_no = i; + best = sound_timer_devs[i]->priority; + } + if (tmr_no == -1) /* Should not be */ + tmr_no = 0; } + tmr = sound_timer_devs[tmr_no]; - tmr = sound_timer_devs[tmr_no]; - - if (level == 2) - { - if (tmr == NULL) - { - printk ("sequencer: No timer for level 2\n"); - return RET_ERROR (ENXIO); + if (level == 2) { + if (tmr == NULL) { + printf("sequencer: No timer for level 2\n"); + sequencer_busy = 0; + return -(ENXIO); } - setup_mode2 (); + setup_mode2(); } + if (seq_mode == SEQ_1 && (mode == OPEN_READ || mode == OPEN_READWRITE)) + if (!max_mididev) { + printf("Sequencer: No Midi devices. Input not possible\n"); + sequencer_busy = 0; + return -(ENXIO); + } + if (!max_synthdev && !max_mididev) + return -(ENXIO); - if (seq_mode == SEQ_1 && (mode == OPEN_READ || mode == OPEN_READWRITE)) - if (!max_mididev) - { - printk ("Sequencer: No Midi devices. Input not possible\n"); - return RET_ERROR (ENXIO); - } + synth_open_mask = 0; - if (!max_synthdev && !max_mididev) - return RET_ERROR (ENXIO); + for (i = 0; i < max_mididev; i++) { + midi_opened[i] = 0; + midi_written[i] = 0; + } - synth_open_mask = 0; + /* + * if (mode == OPEN_WRITE || mode == OPEN_READWRITE) + */ + for (i = 0; i < max_synthdev; i++) /* Open synth devices */ + if ((tmp = synth_devs[i]->open(i, mode)) < 0) { + printf("Sequencer: Warning! Cannot open synth device #%d (%d)\n", + i, tmp); + if (synth_devs[i]->midi_dev) + printf("(Maps to MIDI dev #%d)\n", synth_devs[i]->midi_dev); + } else { + synth_open_mask |= (1 << i); + if (synth_devs[i]->midi_dev) /* Is a midi interface */ + midi_opened[synth_devs[i]->midi_dev] = 1; + } - for (i = 0; i < max_mididev; i++) - { - midi_opened[i] = 0; - midi_written[i] = 0; - } + seq_time = get_time(); + prev_input_time = 0; + prev_event_time = 0; - /* - * if (mode == OPEN_WRITE || mode == OPEN_READWRITE) - */ - for (i = 0; i < max_synthdev; i++) /* - * Open synth devices - */ - if ((tmp = synth_devs[i]->open (i, mode)) < 0) - { - printk ("Sequencer: Warning! Cannot open synth device #%d (%d)\n", i, tmp); - if (synth_devs[i]->midi_dev) - printk ("(Maps to MIDI dev #%d)\n", synth_devs[i]->midi_dev); - } - else - { - synth_open_mask |= (1 << i); - if (synth_devs[i]->midi_dev) /* - * Is a midi interface - */ - midi_opened[synth_devs[i]->midi_dev] = 1; - } - - seq_time = GET_TIME (); - prev_input_time = 0; - prev_event_time = 0; - - if (seq_mode == SEQ_1 && (mode == OPEN_READ || mode == OPEN_READWRITE)) - { /* - * Initialize midi input devices - */ - for (i = 0; i < max_mididev; i++) - if (!midi_opened[i]) - { - if ((retval = midi_devs[i]->open (i, mode, + if (seq_mode == SEQ_1 && (mode == OPEN_READ || mode == OPEN_READWRITE)) { + /* Initialize midi input devices */ + for (i = 0; i < max_mididev; i++) + if (!midi_opened[i]) { + if ((retval = midi_devs[i]->open(i, mode, sequencer_midi_input, sequencer_midi_output)) >= 0) - midi_opened[i] = 1; - } + midi_opened[i] = 1; + } } - - if (seq_mode == SEQ_2) - { - tmr->open (tmr_no, seq_mode); + if (seq_mode == SEQ_2) { + tmr->open(tmr_no, seq_mode); } + seq_sleep_flag.aborting = 0; + seq_sleep_flag.mode = WK_NONE; + midi_sleep_flag.aborting = 0; + midi_sleep_flag.mode = WK_NONE; + output_treshold = SEQ_MAX_QUEUE / 2; - sequencer_busy = 1; - RESET_WAIT_QUEUE (seq_sleeper, seq_sleep_flag); - RESET_WAIT_QUEUE (midi_sleeper, midi_sleep_flag); - output_treshold = SEQ_MAX_QUEUE / 2; - - for (i = 0; i < num_synths; i++) - if (pmgr_present[i]) - pmgr_inform (i, PM_E_OPENED, 0, 0, 0, 0); + for (i = 0; i < num_synths; i++) + if (pmgr_present[i]) + pmgr_inform(i, PM_E_OPENED, 0, 0, 0, 0); - return 0; + return 0; } void -seq_drain_midi_queues (void) +seq_drain_midi_queues(void) { - int i, n; + int i, n; - /* - * Give the Midi drivers time to drain their output queues - */ + /* + * Give the Midi drivers time to drain their output queues + */ - n = 1; + n = 1; + + while (!(seq_sleep_flag.aborting) && n) { + n = 0; + + for (i = 0; i < max_mididev; i++) + if (midi_opened[i] && midi_written[i]) + if (midi_devs[i]->buffer_status != NULL) + if (midi_devs[i]->buffer_status(i)) + n++; + + /* + * Let's have a delay + */ + if (n) { + int chn; + + seq_sleeper = &chn; + DO_SLEEP(chn, seq_sleep_flag, hz / 10); - while (!PROCESS_ABORTING (seq_sleeper, seq_sleep_flag) && n) - { - n = 0; - - for (i = 0; i < max_mididev; i++) - if (midi_opened[i] && midi_written[i]) - if (midi_devs[i]->buffer_status != NULL) - if (midi_devs[i]->buffer_status (i)) - n++; - - /* - * Let's have a delay - */ - if (n) - { - DO_SLEEP (seq_sleeper, seq_sleep_flag, HZ / 10); } } } void -sequencer_release (int dev, struct fileinfo *file) +sequencer_release(int dev, struct fileinfo * file) { - int i; - int mode = file->mode & O_ACCMODE; + int i; + int mode = file->mode & O_ACCMODE; - dev = dev >> 4; + dev = dev >> 4; - DEB (printk ("sequencer_release(dev=%d)\n", dev)); + DEB(printf("sequencer_release(dev=%d)\n", dev)); - if (dev) /* - * Patch manager device - */ - { - dev--; - pmgr_release (dev); - pmgr_present[dev] = 0; - return; + if (dev) { /* Patch manager device */ + dev--; + pmgr_release(dev); + pmgr_present[dev] = 0; + return; } + /* + * Wait until the queue is empty (if we don't have nonblock) + */ - /* - * * Wait until the queue is empty (if we don't have nonblock) - */ - - if (mode != OPEN_READ && !ISSET_FILE_FLAG (file, O_NONBLOCK)) - while (!PROCESS_ABORTING (seq_sleeper, seq_sleep_flag) && qlen) - { - seq_sync (); - } - - if (mode != OPEN_READ) - seq_drain_midi_queues (); /* - * Ensure the output queues are empty - */ - seq_reset (); - if (mode != OPEN_READ) - seq_drain_midi_queues (); /* - * Flush the all notes off messages - */ - - for (i = 0; i < max_synthdev; i++) - if (synth_open_mask & (1 << i)) /* - * Actually opened - */ - if (synth_devs[i]) - { - synth_devs[i]->close (i); - - if (synth_devs[i]->midi_dev) - midi_opened[synth_devs[i]->midi_dev] = 0; + if (mode != OPEN_READ && !0) + while (!(seq_sleep_flag.aborting) && qlen) { + seq_sync(); } - for (i = 0; i < num_synths; i++) - if (pmgr_present[i]) - pmgr_inform (i, PM_E_CLOSED, 0, 0, 0, 0); + if (mode != OPEN_READ) + seq_drain_midi_queues(); /* Ensure the output queues are empty */ + seq_reset(); + if (mode != OPEN_READ) + seq_drain_midi_queues(); /* Flush the all notes off messages */ - for (i = 0; i < max_mididev; i++) - if (midi_opened[i]) - midi_devs[i]->close (i); + for (i = 0; i < max_synthdev; i++) + if (synth_open_mask & (1 << i)) /* Actually opened */ + if (synth_devs[i]) { + synth_devs[i]->close(i); - if (seq_mode == SEQ_2) - tmr->close (tmr_no); + if (synth_devs[i]->midi_dev) + midi_opened[synth_devs[i]->midi_dev] = 0; + } + for (i = 0; i < num_synths; i++) + if (pmgr_present[i]) + pmgr_inform(i, PM_E_CLOSED, 0, 0, 0, 0); + + for (i = 0; i < max_mididev; i++) + if (midi_opened[i]) + midi_devs[i]->close(i); + + if (seq_mode == SEQ_2) + tmr->close(tmr_no); - sequencer_busy = 0; + sequencer_busy = 0; } static int -seq_sync (void) +seq_sync(void) { - unsigned long flags; + u_long flags; - if (qlen && !seq_playing && !PROCESS_ABORTING (seq_sleeper, seq_sleep_flag)) - seq_startplay (); + if (qlen && !seq_playing && !(seq_sleep_flag.aborting)) + seq_startplay(); + + flags = splhigh(); + if (qlen && !(seq_sleep_flag.mode & WK_SLEEP)) { + int chn; + + seq_sleeper = &chn; + DO_SLEEP(chn, seq_sleep_flag, 0); - DISABLE_INTR (flags); - if (qlen && !SOMEONE_WAITING (seq_sleeper, seq_sleep_flag)) - { - DO_SLEEP (seq_sleeper, seq_sleep_flag, 0); } - RESTORE_INTR (flags); + splx(flags); - return qlen; + return qlen; } static void -midi_outc (int dev, unsigned char data) +midi_outc(int dev, u_char data) { - /* - * NOTE! Calls sleep(). Don't call this from interrupt. - */ + /* + * NOTE! Calls sleep(). Don't call this from interrupt. + */ - int n; - unsigned long flags; + int n; + u_long flags; - /* - * This routine sends one byte to the Midi channel. - * If the output Fifo is full, it waits until there - * is space in the queue - */ + /* + * This routine sends one byte to the Midi channel. If the output + * Fifo is full, it waits until there is space in the queue + */ - n = 3 * HZ; /* Timeout */ + n = 3 * hz; /* Timeout */ - DISABLE_INTR (flags); - while (n && !midi_devs[dev]->putc (dev, data)) - { - DO_SLEEP (seq_sleeper, seq_sleep_flag, 4); - n--; + flags = splhigh(); + while (n && !midi_devs[dev]->putc(dev, data)) { + int chn; + seq_sleeper = &chn; + DO_SLEEP(chn, seq_sleep_flag, 4); + + n--; } - RESTORE_INTR (flags); + splx(flags); } static void -seq_reset (void) +seq_reset(void) { - /* - * NOTE! Calls sleep(). Don't call this from interrupt. - */ - - int i; - int chn; - unsigned long flags; - - sound_stop_timer (); - seq_time = GET_TIME (); - prev_input_time = 0; - prev_event_time = 0; + /* + * NOTE! Calls sleep(). Don't call this from interrupt. + */ - qlen = qhead = qtail = 0; - iqlen = iqhead = iqtail = 0; + int i; + int chn; + u_long flags; - for (i = 0; i < max_synthdev; i++) - if (synth_open_mask & (1 << i)) - if (synth_devs[i]) - synth_devs[i]->reset (i); + sound_stop_timer(); + seq_time = get_time(); + prev_input_time = 0; + prev_event_time = 0; - if (seq_mode == SEQ_2) - { + qlen = qhead = qtail = 0; + iqlen = iqhead = iqtail = 0; - for (chn = 0; chn < 16; chn++) - for (i = 0; i < max_synthdev; i++) - if (synth_open_mask & (1 << i)) + for (i = 0; i < max_synthdev; i++) + if (synth_open_mask & (1 << i)) if (synth_devs[i]) - { - synth_devs[i]->controller (i, chn, 123, 0); /* All notes off */ - synth_devs[i]->controller (i, chn, 121, 0); /* Reset all ctl */ - synth_devs[i]->bender (i, chn, 1 << 13); /* Bender off */ - } - - } - else - /* seq_mode == SEQ_1 */ - { - for (i = 0; i < max_mididev; i++) - if (midi_written[i]) /* - * Midi used. Some notes may still be playing - */ - { - /* - * Sending just a ACTIVE SENSING message should be enough to stop all - * playing notes. Since there are devices not recognizing the - * active sensing, we have to send some all notes off messages also. - */ - midi_outc (i, 0xfe); + synth_devs[i]->reset(i); + + if (seq_mode == SEQ_2) { + for (chn = 0; chn < 16; chn++) + for (i = 0; i < max_synthdev; i++) + if ( (synth_open_mask & (1 << i)) && (synth_devs[i]) ) { + synth_devs[i]->controller(i, chn,123,0);/* All notes off */ + synth_devs[i]->controller(i, chn,121,0);/* Reset all ctl */ + synth_devs[i]->bender(i, chn, 1 << 13); /* Bender off */ + } - for (chn = 0; chn < 16; chn++) - { - midi_outc (i, - (unsigned char) (0xb0 + (chn & 0x0f))); /* control change */ - midi_outc (i, 0x7b); /* All notes off */ - midi_outc (i, 0); /* Dummy parameter */ - } + } else { /* seq_mode == SEQ_1 */ + for (i = 0; i < max_mididev; i++) + if (midi_written[i]) { + /* Midi used. Some notes may still be playing */ + /* + * Sending just a ACTIVE SENSING message + * should be enough to stop all playing + * notes. Since there are devices not + * recognizing the active sensing, we have to + * send some all notes off messages also. + */ + midi_outc(i, 0xfe); + + for (chn = 0; chn < 16; chn++) { + midi_outc(i, (u_char) (0xb0 + (chn & 0x0f))); /* control change */ + midi_outc(i, 0x7b); /* All notes off */ + midi_outc(i, 0); /* Dummy parameter */ + } - midi_devs[i]->close (i); + midi_devs[i]->close(i); - midi_written[i] = 0; - midi_opened[i] = 0; - } + midi_written[i] = 0; + midi_opened[i] = 0; + } } - seq_playing = 0; + seq_playing = 0; - DISABLE_INTR (flags); - if (SOMEONE_WAITING (seq_sleeper, seq_sleep_flag)) - { - /* printk ("Sequencer Warning: Unexpected sleeping process - Waking up\n"); */ - WAKE_UP (seq_sleeper, seq_sleep_flag); + flags = splhigh(); + if ((seq_sleep_flag.mode & WK_SLEEP)) { + seq_sleep_flag.mode = WK_WAKEUP; + wakeup(seq_sleeper); } - RESTORE_INTR (flags); + splx(flags); } static void -seq_panic (void) +seq_panic(void) { - /* - * This routine is called by the application in case the user - * wants to reset the system to the default state. - */ + /* + * This routine is called by the application in case the user wants + * to reset the system to the default state. + */ - seq_reset (); + seq_reset(); - /* + /* * Since some of the devices don't recognize the active sensing and * all notes off messages, we have to shut all notes manually. - * - * TO BE IMPLEMENTED LATER - */ + * + * TO BE IMPLEMENTED LATER + */ - /* + /* * Also return the controllers to their default states - */ + */ } int -sequencer_ioctl (int dev, struct fileinfo *file, - unsigned int cmd, unsigned int arg) +sequencer_ioctl(int dev, struct fileinfo * file, + u_int cmd, ioctl_arg arg) { - int midi_dev, orig_dev; - int mode = file->mode & O_ACCMODE; + int midi_dev, orig_dev; + int mode = file->mode & O_ACCMODE; - orig_dev = dev = dev >> 4; + orig_dev = dev = dev >> 4; - switch (cmd) - { + switch (cmd) { case SNDCTL_TMR_TIMEBASE: case SNDCTL_TMR_TEMPO: case SNDCTL_TMR_START: @@ -1426,542 +1365,423 @@ sequencer_ioctl (int dev, struct fileinfo *file, case SNDCTL_TMR_CONTINUE: case SNDCTL_TMR_METRONOME: case SNDCTL_TMR_SOURCE: - if (dev) /* Patch manager */ - return RET_ERROR (EIO); + if (dev) /* Patch manager */ + return -(EIO); - if (seq_mode != SEQ_2) - return RET_ERROR (EINVAL); - return tmr->ioctl (tmr_no, cmd, arg); - break; + if (seq_mode != SEQ_2) + return -(EINVAL); + return tmr->ioctl(tmr_no, cmd, arg); + break; case SNDCTL_TMR_SELECT: - if (dev) /* Patch manager */ - return RET_ERROR (EIO); + if (dev) /* Patch manager */ + return -(EIO); - if (seq_mode != SEQ_2) - return RET_ERROR (EINVAL); - pending_timer = IOCTL_IN (arg); + if (seq_mode != SEQ_2) + return -(EINVAL); + pending_timer = (*(int *) arg); - if (pending_timer < 0 || pending_timer >= num_sound_timers) - { - pending_timer = -1; - return RET_ERROR (EINVAL); + if (pending_timer < 0 || pending_timer >= num_sound_timers) { + pending_timer = -1; + return -(EINVAL); } - - return IOCTL_OUT (arg, pending_timer); - break; + return *(int *) arg = pending_timer; + break; case SNDCTL_SEQ_PANIC: - seq_panic (); - break; + seq_panic(); + break; case SNDCTL_SEQ_SYNC: - if (dev) /* - * Patch manager - */ - return RET_ERROR (EIO); - - if (mode == OPEN_READ) - return 0; - while (qlen && !PROCESS_ABORTING (seq_sleeper, seq_sleep_flag)) - seq_sync (); - if (qlen) - return RET_ERROR (EINTR); - else - return 0; - break; + if (dev) /* Patch manager */ + return -(EIO); + + if (mode == OPEN_READ) + return 0; + while (qlen && !(seq_sleep_flag.aborting)) + seq_sync(); + if (qlen) + return -(EINTR); + else + return 0; + break; case SNDCTL_SEQ_RESET: - if (dev) /* - * Patch manager - */ - return RET_ERROR (EIO); + if (dev) /* Patch manager */ + return -(EIO); - seq_reset (); - return 0; - break; + seq_reset(); + return 0; + break; case SNDCTL_SEQ_TESTMIDI: - if (dev) /* - * Patch manager - */ - return RET_ERROR (EIO); + if (dev) /* Patch manager */ + return -(EIO); - midi_dev = IOCTL_IN (arg); - if (midi_dev >= max_mididev) - return RET_ERROR (ENXIO); + midi_dev = (*(int *) arg); + if (midi_dev >= max_mididev) + return -(ENXIO); - if (!midi_opened[midi_dev]) - { - int err, mode; + if (!midi_opened[midi_dev]) { + int err, mode; - mode = file->mode & O_ACCMODE; - if ((err = midi_devs[midi_dev]->open (midi_dev, mode, - sequencer_midi_input, - sequencer_midi_output)) < 0) - return err; + mode = file->mode & O_ACCMODE; + if ((err = midi_devs[midi_dev]->open(midi_dev, mode, + sequencer_midi_input, sequencer_midi_output)) < 0) + return err; } + midi_opened[midi_dev] = 1; - midi_opened[midi_dev] = 1; - - return 0; - break; + return 0; + break; case SNDCTL_SEQ_GETINCOUNT: - if (dev) /* - * Patch manager - */ - return RET_ERROR (EIO); + if (dev) /* Patch manager */ + return -(EIO); - if (mode == OPEN_WRITE) - return 0; - return IOCTL_OUT (arg, iqlen); - break; + if (mode == OPEN_WRITE) + return 0; + return *(int *) arg = iqlen; + break; case SNDCTL_SEQ_GETOUTCOUNT: - if (mode == OPEN_READ) - return 0; - return IOCTL_OUT (arg, SEQ_MAX_QUEUE - qlen); - break; + if (mode == OPEN_READ) + return 0; + return *(int *) arg = SEQ_MAX_QUEUE - qlen; + break; case SNDCTL_SEQ_CTRLRATE: - if (dev) /* Patch manager */ - return RET_ERROR (EIO); + if (dev) /* Patch manager */ + return -(EIO); - /* - * If *arg == 0, just return the current rate - */ - if (seq_mode == SEQ_2) - return tmr->ioctl (tmr_no, cmd, arg); + /* + * If *arg == 0, just return the current rate + */ + if (seq_mode == SEQ_2) + return tmr->ioctl(tmr_no, cmd, arg); - if (IOCTL_IN (arg) != 0) - return RET_ERROR (EINVAL); + if ((*(int *) arg) != 0) + return -(EINVAL); - return IOCTL_OUT (arg, HZ); - break; + return *(int *) arg = hz; + break; case SNDCTL_SEQ_RESETSAMPLES: - dev = IOCTL_IN (arg); - if (dev < 0 || dev >= num_synths) - return RET_ERROR (ENXIO); - - if (!(synth_open_mask & (1 << dev)) && !orig_dev) - return RET_ERROR (EBUSY); + { + int err; - if (!orig_dev && pmgr_present[dev]) - pmgr_inform (dev, PM_E_PATCH_RESET, 0, 0, 0, 0); + dev = (*(int *) arg); + if (dev < 0 || dev >= num_synths) + return -(ENXIO); + if (!(synth_open_mask & (1 << dev)) && !orig_dev) + return -(EBUSY); + if (!orig_dev && pmgr_present[dev]) + pmgr_inform(dev, PM_E_PATCH_RESET, 0, 0, 0, 0); - return synth_devs[dev]->ioctl (dev, cmd, arg); - break; + err = synth_devs[dev]->ioctl(dev, cmd, arg); + return err; + } + break; case SNDCTL_SEQ_NRSYNTHS: - return IOCTL_OUT (arg, max_synthdev); - break; + return *(int *) arg = max_synthdev; + break; case SNDCTL_SEQ_NRMIDIS: - return IOCTL_OUT (arg, max_mididev); - break; + return *(int *) arg = max_mididev; + break; case SNDCTL_SYNTH_MEMAVL: - { - int dev = IOCTL_IN (arg); + { + int dev = (*(int *) arg); - if (dev < 0 || dev >= num_synths) - return RET_ERROR (ENXIO); + if (dev < 0 || dev >= num_synths) + return -(ENXIO); - if (!(synth_open_mask & (1 << dev)) && !orig_dev) - return RET_ERROR (EBUSY); + if (!(synth_open_mask & (1 << dev)) && !orig_dev) + return -(EBUSY); - return IOCTL_OUT (arg, synth_devs[dev]->ioctl (dev, cmd, arg)); - } - break; + return *(int *) arg = synth_devs[dev]->ioctl(dev, cmd, arg); + } + break; case SNDCTL_FM_4OP_ENABLE: - { - int dev = IOCTL_IN (arg); + { + int dev = (*(int *) arg); - if (dev < 0 || dev >= num_synths) - return RET_ERROR (ENXIO); + if (dev < 0 || dev >= num_synths) + return -(ENXIO); - if (!(synth_open_mask & (1 << dev))) - return RET_ERROR (ENXIO); + if (!(synth_open_mask & (1 << dev))) + return -(ENXIO); - synth_devs[dev]->ioctl (dev, cmd, arg); - return 0; - } - break; + synth_devs[dev]->ioctl(dev, cmd, arg); + return 0; + } + break; case SNDCTL_SYNTH_INFO: - { - struct synth_info inf; - int dev; + { + struct synth_info inf; + int dev; - IOCTL_FROM_USER ((char *) &inf, (char *) arg, 0, sizeof (inf)); - dev = inf.device; + bcopy(&(((char *) arg)[0]), (char *) &inf, sizeof(inf)); + dev = inf.device; - if (dev < 0 || dev >= max_synthdev) - return RET_ERROR (ENXIO); + if (dev < 0 || dev >= max_synthdev) + return -(ENXIO); - if (!(synth_open_mask & (1 << dev)) && !orig_dev) - return RET_ERROR (EBUSY); + if (!(synth_open_mask & (1 << dev)) && !orig_dev) + return -(EBUSY); - return synth_devs[dev]->ioctl (dev, cmd, arg); - } - break; + return synth_devs[dev]->ioctl(dev, cmd, arg); + } + break; case SNDCTL_SEQ_OUTOFBAND: - { - struct seq_event_rec event; - unsigned long flags; + { + struct seq_event_rec event; + u_long flags; - IOCTL_FROM_USER ((char *) &event, (char *) arg, 0, sizeof (event)); + bcopy(&(((char *) arg)[0]), (char *) &event, sizeof(event)); - DISABLE_INTR (flags); - play_event (event.arr); - RESTORE_INTR (flags); + flags = splhigh(); + play_event(event.arr); + splx(flags); - return 0; - } - break; + return 0; + } + break; case SNDCTL_MIDI_INFO: - { - struct midi_info inf; - int dev; + { + struct midi_info inf; + int dev; - IOCTL_FROM_USER ((char *) &inf, (char *) arg, 0, sizeof (inf)); - dev = inf.device; + bcopy(&(((char *) arg)[0]), (char *) &inf, sizeof(inf)); + dev = inf.device; - if (dev < 0 || dev >= max_mididev) - return RET_ERROR (ENXIO); + if (dev < 0 || dev >= max_mididev) + return -(ENXIO); - IOCTL_TO_USER ((char *) arg, 0, (char *) &(midi_devs[dev]->info), sizeof (inf)); - return 0; - } - break; + bcopy((char *) &(midi_devs[dev]->info), &(((char *) arg)[0]), sizeof(inf)); + return 0; + } + break; case SNDCTL_PMGR_IFACE: - { - struct patmgr_info *inf; - int dev, err; - - if ((inf = (struct patmgr_info *) KERNEL_MALLOC (sizeof (*inf))) == NULL) - { - printk ("patmgr: Can't allocate memory for a message\n"); - return RET_ERROR (EIO); - } - - IOCTL_FROM_USER ((char *) inf, (char *) arg, 0, sizeof (*inf)); - dev = inf->device; - - if (dev < 0 || dev >= num_synths) - { - KERNEL_FREE (inf); - return RET_ERROR (ENXIO); - } - - if (!synth_devs[dev]->pmgr_interface) - { - KERNEL_FREE (inf); - return RET_ERROR (ENXIO); - } - - if ((err = synth_devs[dev]->pmgr_interface (dev, inf)) == -1) - { - KERNEL_FREE (inf); - return err; - } - - IOCTL_TO_USER ((char *) arg, 0, (char *) inf, sizeof (*inf)); - KERNEL_FREE (inf); - return 0; - } - break; + { + struct patmgr_info *inf; + int dev, err; - case SNDCTL_PMGR_ACCESS: - { - struct patmgr_info *inf; - int dev, err; - - if ((inf = (struct patmgr_info *) KERNEL_MALLOC (sizeof (*inf))) == NULL) - { - printk ("patmgr: Can't allocate memory for a message\n"); - return RET_ERROR (EIO); - } - - IOCTL_FROM_USER ((char *) inf, (char *) arg, 0, sizeof (*inf)); - dev = inf->device; - - if (dev < 0 || dev >= num_synths) - { - KERNEL_FREE (inf); - return RET_ERROR (ENXIO); - } - - if (!pmgr_present[dev]) - { - KERNEL_FREE (inf); - return RET_ERROR (ESRCH); - } - - if ((err = pmgr_access (dev, inf)) < 0) - { - KERNEL_FREE (inf); - return err; - } + if ((inf = (struct patmgr_info *) malloc(sizeof(*inf), M_TEMP, M_WAITOK)) == NULL) { + printf("patmgr: Can't allocate memory for a message\n"); + return -(EIO); + } + bcopy(&(((char *) arg)[0]), (char *) inf, sizeof(*inf)); + dev = inf->device; - IOCTL_TO_USER ((char *) arg, 0, (char *) inf, sizeof (*inf)); - KERNEL_FREE (inf); - return 0; - } - break; - - case SNDCTL_SEQ_TRESHOLD: - { - int tmp = IOCTL_IN (arg); - - if (dev) /* - * Patch manager - */ - return RET_ERROR (EIO); - - if (tmp < 1) - tmp = 1; - if (tmp >= SEQ_MAX_QUEUE) - tmp = SEQ_MAX_QUEUE - 1; - output_treshold = tmp; - return 0; - } - break; + if (dev < 0 || dev >= num_synths) { + free(inf, M_TEMP); + return -(ENXIO); + } + if (!synth_devs[dev]->pmgr_interface) { + free(inf, M_TEMP); + return -(ENXIO); + } + if ((err = synth_devs[dev]->pmgr_interface(dev, inf)) == -1) { + free(inf, M_TEMP); + return err; + } + bcopy((char *) inf, &(((char *) arg)[0]), sizeof(*inf)); + free(inf, M_TEMP); + return 0; + } + break; - case SNDCTL_MIDI_PRETIME: - { - int val = IOCTL_IN (arg); + case SNDCTL_PMGR_ACCESS: + { + struct patmgr_info *inf; + int dev, err; - if (val < 0) - val = 0; + if ((inf = (struct patmgr_info *) malloc(sizeof(*inf), M_TEMP, M_WAITOK)) == NULL) { + printf("patmgr: Can't allocate memory for a message\n"); + return -(EIO); + } + bcopy(&(((char *) arg)[0]), (char *) inf, sizeof(*inf)); + dev = inf->device; - val = (HZ * val) / 10; - pre_event_timeout = val; - return IOCTL_OUT (arg, val); - } - break; + if (dev < 0 || dev >= num_synths) { + free(inf, M_TEMP); + return -(ENXIO); + } + if (!pmgr_present[dev]) { + free(inf, M_TEMP); + return -(ESRCH); + } + if ((err = pmgr_access(dev, inf)) < 0) { + free(inf, M_TEMP); + return err; + } + bcopy((char *) inf, &(((char *) arg)[0]), sizeof(*inf)); + free(inf, M_TEMP); + return 0; + } + break; - default: - if (dev) /* - * Patch manager - */ - return RET_ERROR (EIO); - - if (mode == OPEN_READ) - return RET_ERROR (EIO); - - if (!synth_devs[0]) - return RET_ERROR (ENXIO); - if (!(synth_open_mask & (1 << 0))) - return RET_ERROR (ENXIO); - return synth_devs[0]->ioctl (0, cmd, arg); - break; - } + case SNDCTL_SEQ_THRESHOLD: + { + int tmp = (*(int *) arg); - return RET_ERROR (EINVAL); -} + if (dev)/* Patch manager */ + return -(EIO); -#ifdef ALLOW_SELECT -int -sequencer_poll (int dev, struct fileinfo *file, int events, select_table * wait) -{ - unsigned long flags; - int revents = 0; + if (tmp < 1) + tmp = 1; + if (tmp >= SEQ_MAX_QUEUE) + tmp = SEQ_MAX_QUEUE - 1; + output_treshold = tmp; + return 0; + } + break; - dev = dev >> 4; + case SNDCTL_MIDI_PRETIME: + { + int val = (*(int *) arg); - DISABLE_INTR (flags); + if (val < 0) + val = 0; - if (events & (POLLIN | POLLRDNORM)) - if (!iqlen) - selrecord(wait, &selinfo[dev]); - else { - revents |= events & (POLLIN | POLLRDNORM); - midi_sleep_flag.mode &= ~WK_SLEEP; - } + val = (hz * val) / 10; + pre_event_timeout = val; + return *(int *) arg = val; + } + break; - if (events & (POLLOUT | POLLWRNORM)) - if (qlen >= SEQ_MAX_QUEUE) - selrecord(wait, &selinfo[dev]); - else { - revents |= events & (POLLOUT | POLLWRNORM); - seq_sleep_flag.mode &= ~WK_SLEEP; + default: + if (dev) /* Patch manager */ + return -(EIO); + + if (mode == OPEN_READ) + return -(EIO); + + if (!synth_devs[0]) + return -(ENXIO); + if (!(synth_open_mask & (1 << 0))) + return -(ENXIO); + return synth_devs[0]->ioctl(0, cmd, arg); + break; } - RESTORE_INTR (flags); - - return (revents); + return -(EINVAL); } -#endif void -sequencer_timer (void *arg) +sequencer_timer(void *dummy) { - seq_startplay (); + seq_startplay(); } int -note_to_freq (int note_num) +note_to_freq(int note_num) { - /* - * This routine converts a midi note to a frequency (multiplied by 1000) - */ + /* + * This routine converts a midi note to a frequency (multiplied by + * 1000) + */ - int note, octave, note_freq; - int notes[] = - { - 261632, 277189, 293671, 311132, 329632, 349232, - 369998, 391998, 415306, 440000, 466162, 493880 - }; + int note, octave, note_freq; + int notes[] = + { + 261632, 277189, 293671, 311132, 329632, 349232, + 369998, 391998, 415306, 440000, 466162, 493880 + }; #define BASE_OCTAVE 5 - octave = note_num / 12; - note = note_num % 12; + octave = note_num / 12; + note = note_num % 12; - note_freq = notes[note]; + note_freq = notes[note]; - if (octave < BASE_OCTAVE) - note_freq >>= (BASE_OCTAVE - octave); - else if (octave > BASE_OCTAVE) - note_freq <<= (octave - BASE_OCTAVE); + if (octave < BASE_OCTAVE) + note_freq >>= (BASE_OCTAVE - octave); + else if (octave > BASE_OCTAVE) + note_freq <<= (octave - BASE_OCTAVE); - /* - * note_freq >>= 1; - */ + /* + * note_freq >>= 1; + */ - return note_freq; + return note_freq; } -unsigned long -compute_finetune (unsigned long base_freq, int bend, int range) +u_long +compute_finetune(u_long base_freq, int bend, int range) { - unsigned long amount; - int negative, semitones, cents, multiplier = 1; + u_long amount; + int negative, semitones, cents, multiplier = 1; - if (!bend) - return base_freq; - if (!range) - return base_freq; + if (!bend) + return base_freq; + if (!range) + return base_freq; - if (!base_freq) - return base_freq; + if (!base_freq) + return base_freq; - if (range >= 8192) - range = 8191; + if (range >= 8192) + range = 8192; - bend = bend * range / 8192; - if (!bend) - return base_freq; + bend = bend * range / 8192; + if (!bend) + return base_freq; - negative = bend < 0 ? 1 : 0; + negative = bend < 0 ? 1 : 0; - if (bend < 0) - bend *= -1; - if (bend > range) - bend = range; + if (bend < 0) + bend *= -1; + if (bend > range) + bend = range; - /* - if (bend > 2399) - bend = 2399; - */ - while (bend > 2399) - { - multiplier *= 4; - bend -= 2400; + /* + * if (bend > 2399) bend = 2399; + */ + while (bend > 2399) { + multiplier *= 4; + bend -= 2400; } - semitones = bend / 100; - cents = bend % 100; - - amount = (int) (semitone_tuning[semitones] * multiplier * cent_tuning[cents]) - / 10000; - - if (negative) - return (base_freq * 10000) / amount; /* - * Bend down - */ - else - return (base_freq * amount) / 10000; /* - * Bend up - */ -} - - -long -sequencer_init (long mem_start) -{ - - sequencer_ok = 1; - PERMANENT_MALLOC (unsigned char *, queue, SEQ_MAX_QUEUE * EV_SZ, mem_start); - PERMANENT_MALLOC (unsigned char *, iqueue, SEQ_MAX_QUEUE * IEV_SZ, mem_start); + semitones = bend / 100; + cents = bend % 100; - return mem_start; -} - -#else -/* - * Stub version - */ -int -sequencer_read (int dev, struct fileinfo *file, snd_rw_buf * buf, int count) -{ - return RET_ERROR (EIO); -} + amount = (int) (semitone_tuning[semitones] * multiplier * cent_tuning[cents]) + / 10000; -int -sequencer_write (int dev, struct fileinfo *file, snd_rw_buf * buf, int count) -{ - return RET_ERROR (EIO); + if (negative) + return (base_freq * 10000) / amount; /* Bend down */ + else + return (base_freq * amount) / 10000; /* Bend up */ } -int -sequencer_open (int dev, struct fileinfo *file) -{ - return RET_ERROR (ENXIO); -} void -sequencer_release (int dev, struct fileinfo *file) +sequencer_init() { -} -int -sequencer_ioctl (int dev, struct fileinfo *file, - unsigned int cmd, unsigned int arg) -{ - return RET_ERROR (EIO); -} -int -sequencer_lseek (int dev, struct fileinfo *file, off_t offset, int orig) -{ - return RET_ERROR (EIO); -} + sequencer_ok = 1; -long -sequencer_init (long mem_start) -{ - return mem_start; -} + queue = (u_char *) malloc(SEQ_MAX_QUEUE * EV_SZ, M_DEVBUF, M_NOWAIT); + if (!queue) + panic("SOUND: Cannot allocate memory\n"); -#ifdef ALLOW_SELECT -int -sequencer_poll (int dev, struct fileinfo *file, int events, select_table * wait) -{ - return (events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLHUP)); + iqueue = (u_char *) malloc(SEQ_MAX_QUEUE * IEV_SZ, M_DEVBUF, M_NOWAIT); + if (!iqueue) + panic("SOUND: Cannot allocate memory\n"); } #endif - -#endif - #endif diff --git a/sys/i386/isa/sound/sound_calls.h b/sys/i386/isa/sound/sound_calls.h index 28fcc4d..c0b0721 100644 --- a/sys/i386/isa/sound/sound_calls.h +++ b/sys/i386/isa/sound/sound_calls.h @@ -8,16 +8,17 @@ int DMAbuf_getwrbuffer(int dev, char **buf, int *size, int dontblock); int DMAbuf_getrdbuffer(int dev, char **buf, int *len, int dontblock); int DMAbuf_rmchars(int dev, int buff_no, int c); int DMAbuf_start_output(int dev, int buff_no, int l); -int DMAbuf_ioctl(int dev, unsigned int cmd, unsigned int arg, int local); -long DMAbuf_init(long mem_start); -int DMAbuf_start_dma (int dev, unsigned long physaddr, int count, int dma_mode); +int DMAbuf_ioctl(int dev, u_int cmd, ioctl_arg arg, int local); +void DMAbuf_init(void); +int DMAbuf_start_dma (int dev, u_long physaddr, int count, int dma_mode); int DMAbuf_open_dma (int dev); void DMAbuf_close_dma (int dev); void DMAbuf_reset_dma (int dev); void DMAbuf_inputintr(int dev); void DMAbuf_outputintr(int dev, int underflow_flag); +void DMAbuf_start_devices(u_int devmask); #ifdef ALLOW_SELECT -int DMAbuf_poll(int dev, struct fileinfo *file, int events, select_table * wait); +int DMAbuf_select(int dev, struct fileinfo *file, int sel_type, select_table * wait); #endif /* @@ -29,12 +30,12 @@ int audio_write (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); int audio_open (int dev, struct fileinfo *file); void audio_release (int dev, struct fileinfo *file); int audio_ioctl (int dev, struct fileinfo *file, - unsigned int cmd, unsigned int arg); + u_int cmd, ioctl_arg arg); int audio_lseek (int dev, struct fileinfo *file, off_t offset, int orig); -long audio_init (long mem_start); +/* long audio_init (void); */ #ifdef ALLOW_SELECT -int audio_poll(int dev, struct fileinfo *file, int events, select_table * wait); +int audio_poll(int dev, struct fileinfo *file, int events, select_table * wait); #endif /* @@ -46,18 +47,15 @@ int sequencer_write (int dev, struct fileinfo *file, snd_rw_buf *buf, int count) int sequencer_open (int dev, struct fileinfo *file); void sequencer_release (int dev, struct fileinfo *file); int sequencer_ioctl (int dev, struct fileinfo *file, - unsigned int cmd, unsigned int arg); + u_int cmd, ioctl_arg arg); int sequencer_lseek (int dev, struct fileinfo *file, off_t offset, int orig); -long sequencer_init (long mem_start); -void sequencer_timer(void *arg); +void sequencer_init (void); +void sequencer_timer(void *dummy); int note_to_freq(int note_num); -unsigned long compute_finetune(unsigned long base_freq, int bend, int range); -void seq_input_event(unsigned char *event, int len); -void seq_copy_to_input (unsigned char *event, int len); +u_long compute_finetune(u_long base_freq, int bend, int range); +void seq_input_event(u_char *event, int len); +void seq_copy_to_input (u_char *event, int len); -#ifdef ALLOW_SELECT -int sequencer_poll(int dev, struct fileinfo *file, int events, select_table * wait); -#endif /* * System calls for the /dev/midi @@ -68,25 +66,9 @@ int MIDIbuf_write (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); int MIDIbuf_open (int dev, struct fileinfo *file); void MIDIbuf_release (int dev, struct fileinfo *file); int MIDIbuf_ioctl (int dev, struct fileinfo *file, - unsigned int cmd, unsigned int arg); + u_int cmd, ioctl_arg arg); int MIDIbuf_lseek (int dev, struct fileinfo *file, off_t offset, int orig); -void MIDIbuf_bytes_received(int dev, unsigned char *buf, int count); -long MIDIbuf_init(long mem_start); - -#ifdef ALLOW_SELECT -int MIDIbuf_poll(int dev, struct fileinfo *file, int events, select_table * wait); -#endif - -/* - * System calls for the generic midi interface. - * - */ - -long CMIDI_init (long mem_start); -int CMIDI_open (int dev, struct fileinfo *file); -int CMIDI_write (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); -int CMIDI_read (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); -int CMIDI_close (int dev, struct fileinfo *file); +void MIDIbuf_bytes_received(int dev, u_char *buf, int count); /* * @@ -94,40 +76,39 @@ int CMIDI_close (int dev, struct fileinfo *file); */ /* From soundcard.c */ -long soundcard_init(long mem_start); -void tenmicrosec(void); +void soundcard_init(void); +void tenmicrosec(int); void request_sound_timer (int count); void sound_stop_timer(void); -int snd_set_irq_handler (int interrupt_level, INT_HANDLER_PROTO(), char *name); -void snd_release_irq(int vect); +int snd_ioctl_return(int *addr, int value); +int snd_set_irq_handler (int int_lvl, void(*hndlr)(int), sound_os_info *osp); void sound_dma_malloc(int dev); void sound_dma_free(int dev); +void conf_printf(char *name, struct address_info *hw_config); +void conf_printf2(char *name, int base, int irq, int dma, int dma2); /* From sound_switch.c */ int sound_read_sw (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); int sound_write_sw (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); int sound_open_sw (int dev, struct fileinfo *file); void sound_release_sw (int dev, struct fileinfo *file); -int sound_ioctl_sw (int dev, struct fileinfo *file, - unsigned int cmd, unsigned long arg); +int sound_ioctl_sw (int dev, struct fileinfo *file, u_int cmd, ioctl_arg arg); /* From sb_dsp.c */ int sb_dsp_detect (struct address_info *hw_config); -long sb_dsp_init (long mem_start, struct address_info *hw_config); +void sb_dsp_init (struct address_info *hw_config); void sb_dsp_disable_midi(void); -int sb_get_irq(void); -void sb_free_irq(void); -int sb_dsp_command (unsigned char val); +int sb_dsp_command (u_char val); int sb_reset_dsp (void); /* From sb16_dsp.c */ void sb16_dsp_interrupt (int irq); -long sb16_dsp_init(long mem_start, struct address_info *hw_config); +void sb16_dsp_init(struct address_info *hw_config); int sb16_dsp_detect(struct address_info *hw_config); /* From sb16_midi.c */ void sb16midiintr (int unit); -long attach_sb16midi(long mem_start, struct address_info * hw_config); +void attach_sb16midi(struct address_info * hw_config); int probe_sb16midi(struct address_info *hw_config); void sb_midi_interrupt(int dummy); @@ -135,73 +116,76 @@ void sb_midi_interrupt(int dummy); void sb_midi_init(int model); /* From sb_mixer.c */ -void sb_setmixer (unsigned int port, unsigned int value); -int sb_getmixer (unsigned int port); +void sb_setmixer (u_int port, u_int value); +int sb_getmixer (u_int port); void sb_mixer_set_stereo(int mode); int sb_mixer_init(int major_model); /* From opl3.c */ -int opl3_detect (int ioaddr); -long opl3_init(long mem_start); +int opl3_detect (int ioaddr, sound_os_info *osp); +void opl3_init(int ioaddr, sound_os_info *osp); /* From sb_card.c */ -long attach_sb_card(long mem_start, struct address_info *hw_config); +void attach_sb_card(struct address_info *hw_config); int probe_sb(struct address_info *hw_config); +/* From awe_wave.c */ +void attach_awe_obsolete(struct address_info *hw_config); +int probe_awe_obsolete(struct address_info *hw_config); + /* From adlib_card.c */ -long attach_adlib_card(long mem_start, struct address_info *hw_config); +void attach_adlib_card(struct address_info *hw_config); int probe_adlib(struct address_info *hw_config); -/* from awe_wave.c */ -long attach_awe_obsolete(long mem_start, struct address_info *hw_config); -int probe_awe_obsolete(struct address_info *hw_config); - /* From pas_card.c */ -long attach_pas_card(long mem_start, struct address_info *hw_config); +void attach_pas_card(struct address_info *hw_config); int probe_pas(struct address_info *hw_config); int pas_set_intr(int mask); int pas_remove_intr(int mask); -unsigned char pas_read(int ioaddr); -void pas_write(unsigned char data, int ioaddr); +u_char pas_read(int ioaddr); +void pas_write(u_char data, int ioaddr); /* From pas_audio.c */ -void pas_pcm_interrupt(unsigned char status, int cause); -long pas_pcm_init(long mem_start, struct address_info *hw_config); +void pas_pcm_interrupt(u_char status, int cause); +void pas_pcm_init(struct address_info *hw_config); /* From pas_mixer.c */ int pas_init_mixer(void); /* From pas_midi.c */ -long pas_midi_init(long mem_start); +void pas_midi_init(void); void pas_midi_interrupt(void); /* From gus_card.c */ -long attach_gus_card(long mem_start, struct address_info * hw_config); +void attach_gus_card(struct address_info * hw_config); int probe_gus(struct address_info *hw_config); int gus_set_midi_irq(int num); -long attach_gus_db16(long mem_start, struct address_info * hw_config); +/*void gusintr(int irq); */ +void attach_gus_db16(struct address_info * hw_config); int probe_gus_db16(struct address_info *hw_config); /* From gus_wave.c */ int gus_wave_detect(int baseaddr); -long gus_wave_init(long mem_start, int irq, int dma, int dma_read); +void gus_wave_init(struct address_info *hw_config); void gus_voice_irq(void); -void gus_write8(int reg, unsigned int data); +u_char gus_read8 (int reg); +void gus_write8(int reg, u_int data); void guswave_dma_irq(void); void gus_delay(void); -int gus_default_mixer_ioctl (int dev, unsigned int cmd, unsigned int arg); +int gus_default_mixer_ioctl (int dev, u_int cmd, ioctl_arg arg); +void gus_timer_command (u_int addr, u_int val); /* From gus_midi.c */ -long gus_midi_init(long mem_start); +void gus_midi_init(void); void gus_midi_interrupt(int dummy); /* From mpu401.c */ -long attach_mpu401(long mem_start, struct address_info * hw_config); +void attach_mpu401(struct address_info * hw_config); int probe_mpu401(struct address_info *hw_config); -void mpuintr(INT_HANDLER_PARMS(irq, dummy)); +void mpuintr(int irq); /* From uart6850.c */ -long attach_uart6850(long mem_start, struct address_info * hw_config); +void attach_uart6850(struct address_info * hw_config); int probe_uart6850(struct address_info *hw_config); /* From opl3.c */ @@ -213,51 +197,51 @@ void pmgr_release(int dev); int pmgr_read (int dev, struct fileinfo *file, snd_rw_buf * buf, int count); int pmgr_write (int dev, struct fileinfo *file, snd_rw_buf * buf, int count); int pmgr_access(int dev, struct patmgr_info *rec); -int pmgr_inform(int dev, int event, unsigned long parm1, unsigned long parm2, - unsigned long parm3, unsigned long parm4); +int pmgr_inform(int dev, int event, u_long parm1, u_long parm2, + u_long parm3, u_long parm4); /* From ics2101.c */ -long ics2101_mixer_init(long mem_start); +void ics2101_mixer_init(void); /* From sound_timer.c */ -void sound_timer_init(int io_base); void sound_timer_interrupt(void); +void sound_timer_syncinterval(u_int new_usecs); /* From ad1848.c */ -void ad1848_init (char *name, int io_base, int irq, int dma_playback, int dma_capture); -int ad1848_detect (int io_base); -void ad1848_interrupt (INT_HANDLER_PARMS(irq, dummy)); -long attach_ms_sound(long mem_start, struct address_info * hw_config); -int probe_ms_sound(struct address_info *hw_config); +void ad1848_init (char *name, int io_base, int irq, int dma_playback, int dma_capture, int share_dma, sound_os_info *osp); + +int ad1848_detect (int io_base, int *flags, sound_os_info *osp); +#define AD_F_CS4231 0x0001 /* Returned if a CS4232 (or compatible) detected */ +#define AD_F_CS4248 0x0001 /* Returned if a CS4248 (or compatible) detected */ + +void ad1848_interrupt (int irq); +void attach_mss(struct address_info * hw_config); +int probe_mss(struct address_info *hw_config); +void attach_pnp_ad1848(struct address_info * hw_config); +int probe_pnp_ad1848(struct address_info *hw_config); /* From pss.c */ int probe_pss (struct address_info *hw_config); -long attach_pss (long mem_start, struct address_info *hw_config); +void attach_pss (struct address_info *hw_config); int probe_pss_mpu (struct address_info *hw_config); -long attach_pss_mpu (long mem_start, struct address_info *hw_config); +void attach_pss_mpu (struct address_info *hw_config); int probe_pss_mss (struct address_info *hw_config); -long attach_pss_mss (long mem_start, struct address_info *hw_config); +void attach_pss_mss (struct address_info *hw_config); /* From sscape.c */ int probe_sscape (struct address_info *hw_config); -long attach_sscape (long mem_start, struct address_info *hw_config); -int probe_ss_ms_sound (struct address_info *hw_config); -long attach_ss_ms_sound(long mem_start, struct address_info * hw_config); +void attach_sscape (struct address_info *hw_config); +int probe_ss_mss(struct address_info *hw_config); +void attach_ss_mss(struct address_info * hw_config); int pss_read (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); int pss_write (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); int pss_open (int dev, struct fileinfo *file); void pss_release (int dev, struct fileinfo *file); int pss_ioctl (int dev, struct fileinfo *file, - unsigned int cmd, unsigned int arg); + u_int cmd, ioctl_arg arg); int pss_lseek (int dev, struct fileinfo *file, off_t offset, int orig); -long pss_init(long mem_start); - -#ifdef PC98 -/* From pcm86.c */ -int probe_pcm86(struct address_info *hw_config); -long attach_pcm86(long mem_start, struct address_info *hw_config); -#endif PC98 +void pss_init(void); /* From aedsp16.c */ int InitAEDSP16_SBPRO(struct address_info *hw_config); @@ -265,12 +249,35 @@ int InitAEDSP16_MSS(struct address_info *hw_config); int InitAEDSP16_MPU401(struct address_info *hw_config); /* From midi_synth.c */ -void do_midi_msg (int synthno, unsigned char *msg, int mlen); +void do_midi_msg (int synthno, u_char *msg, int mlen); /* From trix.c */ -long attach_trix_wss (long mem_start, struct address_info *hw_config); +void attach_trix_wss (struct address_info *hw_config); int probe_trix_wss (struct address_info *hw_config); -long attach_trix_sb (long mem_start, struct address_info *hw_config); +void attach_trix_sb (struct address_info *hw_config); int probe_trix_sb (struct address_info *hw_config); -long attach_trix_mpu (long mem_start, struct address_info *hw_config); +void attach_trix_mpu (struct address_info *hw_config); int probe_trix_mpu (struct address_info *hw_config); + +/* From mad16.c */ +void attach_mad16 (struct address_info *hw_config); +int probe_mad16 (struct address_info *hw_config); +void attach_mad16_mpu (struct address_info *hw_config); +int probe_mad16_mpu (struct address_info *hw_config); +int mad16_sb_dsp_detect (struct address_info *hw_config); +void mad16_sb_dsp_init (struct address_info *hw_config); + +/* From cs4232.c */ + +int probe_cs4232 (struct address_info *hw_config); +void attach_cs4232 (struct address_info *hw_config); +int probe_cs4232_mpu (struct address_info *hw_config); +void attach_cs4232_mpu (struct address_info *hw_config); + +/* From maui.c */ +void attach_maui(struct address_info * hw_config); +int probe_maui(struct address_info *hw_config); + +/* From sound_pnp.c */ +void sound_pnp_init(void); +void sound_pnp_disconnect(void); diff --git a/sys/i386/isa/sound/sound_config.h b/sys/i386/isa/sound/sound_config.h index 938495f..a802763 100644 --- a/sys/i386/isa/sound/sound_config.h +++ b/sys/i386/isa/sound/sound_config.h @@ -2,8 +2,7 @@ * * A driver for Soundcards, misc configuration parameters. * - * - * Copyright by Hannu Savolainen 1993 + * Copyright by Hannu Savolainen 1995 * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -28,43 +27,27 @@ * */ -#include <i386/isa/sound/local.h> -#include <i386/isa/sound/os.h> -#include <i386/isa/sound/soundvers.h> - -#if !defined(PSS_MPU_BASE) && defined(EXCLUDE_SSCAPE) && defined(EXCLUDE_TRIX) -#define EXCLUDE_MPU_EMU -#endif - -#if defined(ISC) || defined(SCO) || defined(SVR42) -#define GENERIC_SYSV -#endif - /* - * Disable the AD1848 driver if there are no other drivers requiring it. + * many variables should be reduced to a range. Here define a macro */ -#if defined(EXCLUDE_GUS16) && defined(EXCLUDE_MSS) && defined(EXCLUDE_PSS) && defined(EXCLUDE_GUSMAX) && defined(EXCLUDE_SSCAPE) && defined(EXCLUDE_TRIX) -#define EXCLUDE_AD1848 -#endif - -#ifdef PSS_MSS_BASE -#undef EXCLUDE_AD1848 -#endif - +#define RANGE(var, low, high) (var) = \ + ((var)<(low)?(low) : (var)>(high)?(high) : (var)) + #undef CONFIGURE_SOUNDCARD #undef DYNAMIC_BUFFER -#ifdef KERNEL_SOUNDCARD +#include <i386/isa/sound/local.h> + #define CONFIGURE_SOUNDCARD #define DYNAMIC_BUFFER #undef LOADABLE_SOUNDCARD -#endif -#ifdef EXCLUDE_SEQUENCER -#define EXCLUDE_MIDI -#define EXCLUDE_YM3812 -#define EXCLUDE_OPL3 +#include <i386/isa/sound/os.h> +#include <i386/isa/sound/soundvers.h> + +#if defined(ISC) || defined(SCO) || defined(SVR42) +#define GENERIC_SYSV #endif #ifndef SND_DEFAULT_ENABLE @@ -73,180 +56,6 @@ #ifdef CONFIGURE_SOUNDCARD -/* ****** IO-address, DMA and IRQ settings **** - -If your card has nonstandard I/O address or IRQ number, change defines - for the following settings in your kernel Makefile */ - -#ifndef SBC_BASE -#ifdef PC98 -#define SBC_BASE 0x20d2 /* 0x20d2 is the factory default. */ -#else -#define SBC_BASE 0x220 /* 0x220 is the factory default. */ -#endif -#endif - -#ifndef SBC_IRQ -#ifdef PC98 -#define SBC_IRQ 10 /* IQR10 is not the factory default on PC9821. */ -#else -#define SBC_IRQ 5 /* IQR5 is the factory default. */ -#endif -#endif - -#ifndef SBC_DMA -#ifdef PC98 -#define SBC_DMA 3 -#else -#define SBC_DMA 1 -#endif -#endif - -#ifndef SB16_DMA -#ifdef PC98 -#define SB16_DMA 3 -#else -#define SB16_DMA 6 -#endif -#endif - -#ifndef SB16MIDI_BASE -#ifdef PC98 -#define SB16MIDI_BASE 0x80d2 -#else -#define SB16MIDI_BASE 0x300 -#endif -#endif - -#ifndef AWE32_BASE -#define AWE32_BASE 0x620 /* Default = 0x620-3, 0xA20-3, 0xE20-3 */ -#endif - -#ifndef PAS_BASE -#define PAS_BASE 0x388 -#endif - -#ifndef PAS_IRQ -#define PAS_IRQ 5 -#endif - -#ifndef PAS_DMA -#define PAS_DMA 3 -#endif - -#ifndef GUS_BASE -#define GUS_BASE 0x220 -#endif - -#ifndef GUS_IRQ -#define GUS_IRQ 15 -#endif - -#ifndef GUS_MIDI_IRQ -#define GUS_MIDI_IRQ GUS_IRQ -#endif - -#ifndef GUS_DMA -#define GUS_DMA 6 -#endif - -#ifndef GUS_DMA_READ -#define GUS_DMA_READ 3 -#endif - -#ifndef MPU_BASE -#define MPU_BASE 0x330 -#endif - -#ifndef MPU_IRQ -#define MPU_IRQ 9 -#endif - -/* Echo Personal Sound System */ -#ifndef PSS_BASE -#define PSS_BASE 0x220 /* 0x240 or */ -#endif - -#ifndef PSS_IRQ -#define PSS_IRQ 7 -#endif - -#ifndef PSS_DMA -#define PSS_DMA 1 -#endif - -#ifndef MSS_BASE -#define MSS_BASE 0 -#endif - -#ifndef MSS_DMA -#define MSS_DMA 0 -#endif - -#ifndef MSS_IRQ -#define MSS_IRQ 0 -#endif - -#ifndef GUS16_BASE -#define GUS16_BASE 0 -#endif - -#ifndef GUS16_DMA -#define GUS16_DMA 0 -#endif - -#ifndef GUS16_IRQ -#define GUS16_IRQ 0 -#endif - -#ifndef SSCAPE_BASE -#define SSCAPE_BASE 0 -#endif - -#ifndef SSCAPE_DMA -#define SSCAPE_DMA 0 -#endif - -#ifndef SSCAPE_IRQ -#define SSCAPE_IRQ 0 -#endif - -#ifndef SSCAPE_MSS_BASE -#define SSCAPE_MSS_BASE 0 -#endif - -#ifndef SSCAPE_MSS_DMA -#define SSCAPE_MSS_DMA 0 -#endif - -#ifndef SSCAPE_MSS_IRQ -#define SSCAPE_MSS_IRQ 0 -#endif - -#ifndef TRIX_BASE -#define TRIX_BASE 0x530 -#endif - -#ifndef TRIX_IRQ -#define TRIX_IRQ 10 -#endif - -#ifndef TRIX_DMA -#define TRIX_DMA 1 -#endif - -#ifndef U6850_BASE -#define U6850_BASE 0x330 -#endif - -#ifndef U6850_IRQ -#define U6850_IRQ 5 -#endif - -#ifndef U6850_DMA -#define U6850_DMA 1 -#endif - #ifndef MAX_REALTIME_FACTOR #define MAX_REALTIME_FACTOR 4 #endif @@ -260,22 +69,34 @@ If your card has nonstandard I/O address or IRQ number, change defines 4k for SB. If you change the DSP_BUFFSIZE, don't modify this file. - Use the make config command instead. */ + Use the make config command instead. Seems to allow only 4K, 16K, + 32K, 64K. + */ #ifndef DSP_BUFFSIZE -#define DSP_BUFFSIZE (4096) +#define DSP_BUFFSIZE (32760) #endif #ifndef DSP_BUFFCOUNT -#define DSP_BUFFCOUNT 2 /* 2 is recommended. */ +#define DSP_BUFFCOUNT 1 /* 1 is recommended. */ #endif -#define DMA_AUTOINIT 0x10 +#define DMA_AUTOINIT 0x10 /* XXX never used */ -#ifdef PC98 -#define FM_MONO 0x28d2 /* This is the I/O address used by AdLib */ -#else #define FM_MONO 0x388 /* This is the I/O address used by AdLib */ + +#ifndef AWE32_BASE +#define AWE32_BASE 0x620 /* Default = 0x620-3, 0xA20-3, 0xE20-3 */ +#endif + +#ifndef PAS_BASE +#define PAS_BASE 0x388 +#endif + +#ifdef JAZZ16 +#ifndef JAZZ_DMA16 +#define JAZZ_DMA16 5 +#endif #endif /* SEQ_MAX_QUEUE is the maximum number of sequencer events buffered by the @@ -295,6 +116,7 @@ If your card has nonstandard I/O address or IRQ number, change defines */ #define SND_NDEVS 256 /* Number of supported devices */ + #define SND_DEV_CTL 0 /* Control port /dev/mixer */ #define SND_DEV_SEQ 1 /* Sequencer output /dev/sequencer (FM synthesizer and MIDI output) */ @@ -304,7 +126,7 @@ If your card has nonstandard I/O address or IRQ number, change defines #define SND_DEV_DSP16 5 /* Like /dev/dsp but 16 bits/sample */ #define SND_DEV_STATUS 6 /* /dev/sndstat */ /* #7 not in use now. Was in 2.4. Free for use after v3.0. */ -#define SND_DEV_SEQ2 8 /* /dev/sequecer, level 2 interface */ +#define SND_DEV_SEQ2 8 /* /dev/sequencer, level 2 interface */ #define SND_DEV_SNDPROC 9 /* /dev/sndproc for programmable devices */ #define SND_DEV_PSS SND_DEV_SNDPROC @@ -320,34 +142,38 @@ If your card has nonstandard I/O address or IRQ number, change defines #define MAX_TIMER_DEV 3 struct fileinfo { - int mode; /* Open mode */ - DECLARE_FILE(); /* Reference to file-flags. OS-dependent. */ - }; + int mode; /* Open mode */ + int flags; + int dummy; /* Reference to file-flags. OS-dependent. */ +}; struct address_info { int io_base; int irq; - int dma; /* write dma channel */ - int dma_read; /* read dma channel */ + int dma; + int dma2; int always_detect; /* 1=Trust me, it's there */ + char *name; + sound_os_info *osp; /* OS specific info */ + int card_subtype; /* Driver specific. Usually 0 */ }; #define SYNTH_MAX_VOICES 32 struct voice_alloc_info { - int max_voice; - int used_voices; - int ptr; /* For device specific use */ - unsigned short map[SYNTH_MAX_VOICES]; /* (ch << 8) | (note+1) */ - int timestamp; - int alloc_times[SYNTH_MAX_VOICES]; - }; + int max_voice; + int used_voices; + int ptr; /* For device specific use */ + unsigned short map[SYNTH_MAX_VOICES]; /* (ch << 8) | (note+1) */ + int timestamp; + int alloc_times[SYNTH_MAX_VOICES]; +}; struct channel_info { - int pgm_num; - int bender_value; - unsigned char controllers[128]; - }; + int pgm_num; + int bender_value; + unsigned char controllers[128]; +}; /* * Process wakeup reasons @@ -358,9 +184,9 @@ struct channel_info { #define WK_SIGNAL 0x04 #define WK_SLEEP 0x08 -#define OPEN_READ 1 -#define OPEN_WRITE 2 -#define OPEN_READWRITE 3 +#define OPEN_READ PCM_ENABLE_INPUT +#define OPEN_WRITE PCM_ENABLE_OUTPUT +#define OPEN_READWRITE (OPEN_READ|OPEN_WRITE) #include <i386/isa/sound/sound_calls.h> #include <i386/isa/sound/dev_table.h> @@ -368,9 +194,9 @@ struct channel_info { #ifndef DEB #define DEB(x) #endif - -#ifndef AUDIO_DDB -#define AUDIO_DDB(x) +#ifndef DDB +/* #define DDB(x) x XXX */ +#define DDB(x) #endif #define TIMER_ARMED 121234 diff --git a/sys/i386/isa/sound/sound_pnp.c b/sys/i386/isa/sound/sound_pnp.c new file mode 100644 index 0000000..d3d278b --- /dev/null +++ b/sys/i386/isa/sound/sound_pnp.c @@ -0,0 +1,186 @@ +/* + * sound/sound_pnp.c + * + * PnP soundcard support (Linux spesific) + * + * Copyright by Hannu Savolainen 1995 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. 2. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ +#include <i386/isa/sound/sound_config.h> + +/* + * XXX check what to use in place of CONFIG_PNP + */ +#if (NSND > 0) && defined(CONFIG_PNP) + +#include <linux/pnp.h> + +static struct pnp_sounddev *pnp_devs[20] = { NULL }; + +static int max_pnpdevs = 20; +static int nr_pnpdevs = 0; +static int pnp_sig = 0; + +void +install_pnp_sounddrv(struct pnp_sounddev * drv) +{ + if (nr_pnpdevs < max_pnpdevs) { + pnp_devs[nr_pnpdevs++] = drv; + } else + printf("Sound: More than 20 PnP drivers defined\n"); +} + +void +cs4232_pnp(void *parm) +{ + struct pnp_dev *dev = (struct pnp_dev *) parm; + char *name; + + int portmask = 0x00, irqmask = 0x01, dmamask = 0x03; + int opl3_driver, wss_driver; + + printf("CS4232 driver waking up\n"); + + if (dev->card && dev->card->name) + name = dev->card->name; + else + name = "PnP WSS"; + + if ((wss_driver = sndtable_identify_card("AD1848"))) + portmask |= 0x01; /* MSS */ + else + printf("Sound: MSS/WSS device detected but no driver enabled\n"); + + if ((opl3_driver = sndtable_identify_card("OPL3"))) + portmask |= 0x02; /* OPL3 */ + else + printf("Sound: OPL3/4 device detected but no driver enabled\n"); + + printf("WSS driver %d, OPL3 driver %d\n", wss_driver, opl3_driver); + + if (!portmask) /* No drivers available */ + return; + + if (!pnp_allocate_device(pnp_sig, dev, portmask, irqmask, dmamask, 0x00)) + printf("Device activation failed\n"); + else { + struct address_info hw_config; + int wss_base, opl3_base; + int irq; + int dma1, dma2; + + printf("Device activation OK\n"); + wss_base = pnp_get_port(dev, 0); + opl3_base = pnp_get_port(dev, 1); + irq = pnp_get_irq(dev, 0); + dma1 = pnp_get_dma(dev, 0); + dma2 = pnp_get_dma(dev, 1); + + printf("I/O0 %03x\n", wss_base); + printf("I/O1 %03x\n", opl3_base); + printf("IRQ %d\n", irq); + printf("DMA0 %d\n", dma1); + printf("DMA1 %d\n", dma2); + + if (opl3_base && opl3_driver) { + hw_config.io_base = opl3_base; + hw_config.irq = 0; + hw_config.dma = -1; + hw_config.dma2 = -1; + hw_config.always_detect = 0; + hw_config.name = ""; + hw_config.osp = NULL; + hw_config.card_subtype = 0; + + if (sndtable_probe(opl3_driver, &hw_config)) + sndtable_init_card(opl3_driver, &hw_config); + + } + if (wss_base && wss_driver) { + hw_config.io_base = wss_base; + hw_config.irq = irq; + hw_config.dma = dma1; + hw_config.dma2 = (dma2 == NO_DMA) ? dma1 : dma2; + hw_config.always_detect = 0; + hw_config.name = name; + hw_config.osp = NULL; + hw_config.card_subtype = 0; + + if (sndtable_probe(wss_driver, &hw_config)) + sndtable_init_card(wss_driver, &hw_config); + + } + } +} + +static int +pnp_activate(int id, struct pnp_dev * dev) +{ + int i; + + for (i = 0; i < nr_pnpdevs; i++) + if (pnp_devs[i]->id == id) { + + printf("PnP dev: %08x, %s\n", id, pnp_devid2asc(id)); + + pnp_devs[i]->setup((void *) dev); + return 1; + } + return 0; +} + +void +sound_pnp_init(void) +{ + static struct pnp_sounddev cs4232_dev = + {PNP_DEVID('C', 'S', 'C', 0x0000), cs4232_pnp, "CS4232"}; + + struct pnp_dev *dev; + + install_pnp_sounddrv(&cs4232_dev); + + dev = NULL; + + if ((pnp_sig = pnp_connect("sound")) == -1) { + printf("Sound: Can't connect to kernel PnP services.\n"); + return; + } + while ((dev = pnp_get_next_device(pnp_sig, dev)) != NULL) { + if (!pnp_activate(dev->key, dev)) { + /* Scan all compatible devices */ + + int i; + + for (i = 0; i < dev->ncompat; i++) + if (pnp_activate(dev->compat_keys[i], dev)) + break; + } + } +} + +void +sound_pnp_disconnect(void) +{ + pnp_disconnect(pnp_sig); +} +#endif diff --git a/sys/i386/isa/sound/sound_switch.c b/sys/i386/isa/sound/sound_switch.c index 83994e0..763a10c 100644 --- a/sys/i386/isa/sound/sound_switch.c +++ b/sys/i386/isa/sound/sound_switch.c @@ -1,10 +1,10 @@ /* * sound/sound_switch.c - * + * * The system call switch - * + * * Copyright by Hannu Savolainen 1993 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -12,7 +12,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -24,27 +24,14 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * */ #include <i386/isa/sound/sound_config.h> -#ifdef CONFIGURE_SOUNDCARD +#if NSND > 0 -struct sbc_device - { - int usecount; - }; - -static struct sbc_device sbc_devices[SND_NDEVS] = -{ - {0}}; - -static int in_use = 0; /* - - - * * * * Total # of open device files - * (excluding * * * minor 0) */ +#define SNDSTAT_BUF_SIZE 4000 /* * /dev/sndstatus -device @@ -54,491 +41,459 @@ static int status_len, status_ptr; static int status_busy = 0; static int -put_status (char *s) +put_status(char *s) { - int l; + int l = strlen(s); - for (l = 0; l < 256, s[l]; l++); /* - * l=strlen(s); - */ + if (status_len + l >= SNDSTAT_BUF_SIZE) + return 0; - if (status_len + l >= 4000) - return 0; - - memcpy (&status_buf[status_len], s, l); - status_len += l; + bcopy(s, &status_buf[status_len], l); + status_len += l; - return 1; + return 1; } +/* + * in principle, we never overflow the buffer. But... if radix=2 ... + * and if smaller... lr970711 + */ + static int -put_status_int (unsigned int val, int radix) +put_status_int(u_int val, int radix) { - int l, v; + int l, v; + static char hx[] = "0123456789abcdef"; + char buf[33]; /* int is 32 bit+null, in base 2 */ - static char hx[] = "0123456789abcdef"; - char buf[11]; + if (radix < 2 || radix > 16) /* better than panic */ + return put_status("???"); - if (!val) - return put_status ("0"); + if (!val) + return put_status("0"); - l = 0; - buf[10] = 0; + l = 0; + buf[10] = 0; - while (val) - { - v = val % radix; - val = val / radix; + while (val) { + v = val % radix; + val = val / radix; - buf[9 - l] = hx[v]; - l++; + buf[9 - l] = hx[v]; + l++; } - if (status_len + l >= 4000) - return 0; + if (status_len + l >= SNDSTAT_BUF_SIZE) + return 0; - memcpy (&status_buf[status_len], &buf[10 - l], l); - status_len += l; + bcopy(&buf[10 - l], &status_buf[status_len], l); + status_len += l; - return 1; + return 1; } static void -init_status (void) +init_status(void) { - /* - * Write the status information to the status_buf and update status_len. - * There is a limit of 4000 bytes for the data. - */ - - int i; - - status_ptr = 0; - - put_status ("VoxWare Sound Driver:" SOUND_VERSION_STRING - " (" SOUND_CONFIG_DATE " " SOUND_CONFIG_BY "@" - SOUND_CONFIG_HOST "." SOUND_CONFIG_DOMAIN ")" - "\n"); - - if (!put_status ("Config options: ")) - return; - if (!put_status_int (SELECTED_SOUND_OPTIONS, 16)) - return; - - if (!put_status ("\n\nInstalled drivers: \n")) - return; - - for (i = 0; i < (num_sound_drivers - 1); i++) - { - if (!put_status ("Type ")) - return; - if (!put_status_int (sound_drivers[i].card_type, 10)) - return; - if (!put_status (": ")) - return; - if (!put_status (sound_drivers[i].name)) - return; - - if (!put_status ("\n")) - return; - } - - if (!put_status ("\n\nCard config: \n")) - return; + /* + * Write the status information to the status_buf and update + * status_len. There is a limit of SNDSTAT_BUF_SIZE bytes for the data. + * put_status handles this and returns 0 in case of failure. Since + * it never oveflows the buffer, we do not care to check. + */ - for (i = 0; i < (num_sound_cards - 1); i++) - { - int drv; + int i; - if (!snd_installed_cards[i].enabled) - if (!put_status ("(")) - return; + status_ptr = 0; - /* - * if (!put_status_int(snd_installed_cards[i].card_type, 10)) return; - * if (!put_status (": ")) return; - */ - - if ((drv = snd_find_driver (snd_installed_cards[i].card_type)) != -1) - if (!put_status (sound_drivers[drv].name)) - return; - - if (!put_status (" at 0x")) - return; - if (!put_status_int (snd_installed_cards[i].config.io_base, 16)) - return; - if (!put_status (" irq ")) - return; - if (!put_status_int (snd_installed_cards[i].config.irq, 10)) - return; -#ifdef PC98 - if (snd_installed_cards[i].config.dma >= 0) { -#endif - if (!put_status (" drq ")) - return; - if (!put_status_int (snd_installed_cards[i].config.dma, 10)) - return; -#ifdef PC98 - } +#ifdef SOUND_UNAME_A + put_status("VoxWare Sound Driver:" SOUND_VERSION_STRING + " (" SOUND_CONFIG_DATE " " SOUND_CONFIG_BY ",\n" + SOUND_UNAME_A ")\n"); +#else + put_status("VoxWare Sound Driver:" SOUND_VERSION_STRING + " (" SOUND_CONFIG_DATE " " SOUND_CONFIG_BY "@" + SOUND_CONFIG_HOST "." SOUND_CONFIG_DOMAIN ")\n"); #endif - if (!snd_installed_cards[i].enabled) - if (!put_status (")")) - return; - - if (!put_status ("\n")) + put_status("Config options: ") ; + /* put_status_int(SELECTED_SOUND_OPTIONS, 16) ; */ + put_status("\n\nInstalled drivers: \n") ; + + for (i = 0; i < num_sound_drivers; i++) + if (sound_drivers[i].card_type != 0) { + put_status("Type ") ; + put_status_int(sound_drivers[i].card_type, 10); + put_status(": ") ; + put_status(sound_drivers[i].name) ; + put_status("\n") ; + } + put_status("\n\nCard config: \n") ; + + for (i = 0; i < num_sound_cards; i++) + if (snd_installed_cards[i].card_type != 0) { + int drv, tmp; + + if (!snd_installed_cards[i].enabled) + put_status("(") ; + + if ((drv = snd_find_driver(snd_installed_cards[i].card_type)) != -1) + put_status(sound_drivers[drv].name) ; + + put_status(" at 0x") ; + put_status_int(snd_installed_cards[i].config.io_base, 16); + + put_status(" irq ") ; + tmp = snd_installed_cards[i].config.irq; + if (tmp < 0) + tmp = -tmp; + put_status_int(tmp, 10) ; + + if (snd_installed_cards[i].config.dma != -1) { + put_status(" drq ") ; + put_status_int(snd_installed_cards[i].config.dma, 10) ; + if (snd_installed_cards[i].config.dma2 != -1) { + put_status(",") ; + put_status_int(snd_installed_cards[i].config.dma2, 10) ; + } + } + if (!snd_installed_cards[i].enabled) + put_status(")") ; + + put_status("\n") ; + } + if (!sound_started) { + put_status("\n\n***** Sound driver not started *****\n\n"); return; } - -#ifdef EXCLUDE_AUDIO - if (!put_status ("\nAudio devices: NOT ENABLED IN CONFIG\n")) - return; +#ifndef CONFIG_AUDIO + put_status("\nAudio devices: NOT ENABLED IN CONFIG\n") ; #else - if (!put_status ("\nAudio devices:\n")) - return; + put_status("\nAudio devices:\n") ; - for (i = 0; i < num_audiodevs; i++) - { - if (!put_status_int (i, 10)) - return; - if (!put_status (": ")) - return; - if (!put_status (audio_devs[i]->name)) - return; - if (!put_status ("\n")) - return; + for (i = 0; i < num_audiodevs; i++) { + put_status_int(i, 10) ; + put_status(": ") ; + put_status(audio_devs[i]->name) ; + + if (audio_devs[i]->flags & DMA_DUPLEX) + put_status(" (DUPLEX)") ; + + put_status("\n") ; } #endif -#ifdef EXCLUDE_SEQUENCER - if (!put_status ("\nSynth devices: NOT ENABLED IN CONFIG\n")) - return; +#ifndef CONFIG_SEQUENCER + put_status("\nSynth devices: NOT ENABLED IN CONFIG\n"); #else - if (!put_status ("\nSynth devices:\n")) - return; + put_status("\nSynth devices:\n") ; - for (i = 0; i < num_synths; i++) - { - if (!put_status_int (i, 10)) - return; - if (!put_status (": ")) - return; - if (!put_status (synth_devs[i]->info->name)) - return; - if (!put_status ("\n")) - return; + for (i = 0; i < num_synths; i++) { + put_status_int(i, 10) ; + put_status(": ") ; + put_status(synth_devs[i]->info->name) ; + put_status("\n") ; } #endif -#ifdef EXCLUDE_MIDI - if (!put_status ("\nMidi devices: NOT ENABLED IN CONFIG\n")) - return; +#ifndef CONFIG_MIDI + put_status("\nMidi devices: NOT ENABLED IN CONFIG\n") ; #else - if (!put_status ("\nMidi devices:\n")) - return; + put_status("\nMidi devices:\n") ; - for (i = 0; i < num_midis; i++) - { - if (!put_status_int (i, 10)) - return; - if (!put_status (": ")) - return; - if (!put_status (midi_devs[i]->info.name)) - return; - if (!put_status ("\n")) - return; + for (i = 0; i < num_midis; i++) { + put_status_int(i, 10) ; + put_status(": ") ; + put_status(midi_devs[i]->info.name) ; + put_status("\n") ; } #endif - if (!put_status ("\nTimers:\n")) - return; + put_status("\nTimers:\n"); - for (i = 0; i < num_sound_timers; i++) - { - if (!put_status_int (i, 10)) - return; - if (!put_status (": ")) - return; - if (!put_status (sound_timer_devs[i]->info.name)) - return; - if (!put_status ("\n")) - return; + for (i = 0; i < num_sound_timers; i++) { + put_status_int(i, 10); + put_status(": "); + put_status(sound_timer_devs[i]->info.name); + put_status("\n"); } - if (!put_status ("\nMixers:\n")) - return; + put_status("\nMixers:\n"); - for (i = 0; i < num_mixers; i++) - { - if (!put_status_int (i, 10)) - return; - if (!put_status (": ")) - return; - if (!put_status (mixer_devs[i]->name)) - return; - if (!put_status ("\n")) - return; + for (i = 0; i < num_mixers; i++) { + put_status_int(i, 10); + put_status(": "); + put_status(mixer_devs[i]->name); + put_status("\n"); } } static int -read_status (snd_rw_buf * buf, int count) +read_status(snd_rw_buf * buf, int count) { - /* - * Return at most 'count' bytes from the status_buf. - */ - int l, c; + /* + * Return at most 'count' bytes from the status_buf. + */ + int l, c; - l = count; - c = status_len - status_ptr; + l = count; + c = status_len - status_ptr; - if (l > c) - l = c; - if (l <= 0) - return 0; + if (l > c) + l = c; + if (l <= 0) + return 0; - COPY_TO_USER (buf, 0, &status_buf[status_ptr], l); - status_ptr += l; - return l; + if (uiomove(&status_buf[status_ptr], l, buf)) { + printf("sb: Bad copyout()!\n"); + }; + status_ptr += l; + + return l; } int -sound_read_sw (int dev, struct fileinfo *file, snd_rw_buf * buf, int count) +sound_read_sw(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) { - DEB (printk ("sound_read_sw(dev=%d, count=%d)\n", dev, count)); + DEB(printf("sound_read_sw(dev=%d, count=%d)\n", dev, count)); - switch (dev & 0x0f) - { + switch (dev & 0x0f) { case SND_DEV_STATUS: - return read_status (buf, count); - break; + return read_status(buf, count); + break; +#ifdef CONFIG_AUDIO case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: - return audio_read (dev, file, buf, count); - break; + return audio_read(dev, file, buf, count); + break; +#endif +#ifdef CONFIG_SEQUENCER case SND_DEV_SEQ: case SND_DEV_SEQ2: - return sequencer_read (dev, file, buf, count); - break; + return sequencer_read(dev, file, buf, count); + break; +#endif -#ifndef EXCLUDE_MIDI +#ifdef CONFIG_MIDI case SND_DEV_MIDIN: - return MIDIbuf_read (dev, file, buf, count); + return MIDIbuf_read(dev, file, buf, count); #endif default: - printk ("Sound: Undefined minor device %d\n", dev); + printf("Sound: Undefined minor device %d\n", dev); } - return RET_ERROR (EPERM); + return -(EPERM); } int -sound_write_sw (int dev, struct fileinfo *file, snd_rw_buf * buf, int count) +sound_write_sw(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) { - DEB (printk ("sound_write_sw(dev=%d, count=%d)\n", dev, count)); + DEB(printf("sound_write_sw(dev=%d, count=%d)\n", dev, count)); - switch (dev & 0x0f) - { + switch (dev & 0x0f) { +#ifdef CONFIG_SEQUENCER case SND_DEV_SEQ: case SND_DEV_SEQ2: - return sequencer_write (dev, file, buf, count); - break; + return sequencer_write(dev, file, buf, count); + break; +#endif +#ifdef CONFIG_AUDIO case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: - return audio_write (dev, file, buf, count); - break; + return audio_write(dev, file, buf, count); + break; +#endif -#ifndef EXCLUDE_MIDI +#ifdef CONFIG_MIDI case SND_DEV_MIDIN: - return MIDIbuf_write (dev, file, buf, count); + return MIDIbuf_write(dev, file, buf, count); #endif default: - return RET_ERROR (EPERM); + return -(EPERM); } - return count; + return count; } int -sound_open_sw (int dev, struct fileinfo *file) +sound_open_sw(int dev, struct fileinfo * file) { - int retval; + int retval; - DEB (printk ("sound_open_sw(dev=%d) : usecount=%d\n", dev, sbc_devices[dev].usecount)); + DEB(printf("sound_open_sw(dev=%d)\n", dev)); - if ((dev >= SND_NDEVS) || (dev < 0)) - { - printk ("Invalid minor device %d\n", dev); - return RET_ERROR (ENXIO); + if ((dev >= SND_NDEVS) || (dev < 0)) { + printf("Invalid minor device %d\n", dev); + return -(ENXIO); } - - switch (dev & 0x0f) - { + switch (dev & 0x0f) { case SND_DEV_STATUS: - if (status_busy) - return RET_ERROR (EBUSY); - status_busy = 1; - if ((status_buf = (char *) KERNEL_MALLOC (4000)) == NULL) - return RET_ERROR (EIO); - status_len = status_ptr = 0; - init_status (); - break; + if (status_busy) + return -(EBUSY); + status_busy = 1; + if ((status_buf = (char *) malloc(SNDSTAT_BUF_SIZE, M_TEMP, M_WAITOK)) == NULL) + return -(EIO); + status_len = status_ptr = 0; + init_status(); + break; case SND_DEV_CTL: - return 0; - break; + return 0; + break; +#ifdef CONFIG_SEQUENCER case SND_DEV_SEQ: case SND_DEV_SEQ2: - if ((retval = sequencer_open (dev, file)) < 0) - return retval; - break; + if ((retval = sequencer_open(dev, file)) < 0) + return retval; + break; +#endif -#ifndef EXCLUDE_MIDI +#ifdef CONFIG_MIDI case SND_DEV_MIDIN: - if ((retval = MIDIbuf_open (dev, file)) < 0) - return retval; - break; + if ((retval = MIDIbuf_open(dev, file)) < 0) + return retval; + break; #endif +#ifdef CONFIG_AUDIO case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: - if ((retval = audio_open (dev, file)) < 0) - return retval; - break; + if ((retval = audio_open(dev, file)) < 0) + return retval; + break; +#endif default: - printk ("Invalid minor device %d\n", dev); - return RET_ERROR (ENXIO); + printf("Invalid minor device %d\n", dev); + return -(ENXIO); } - sbc_devices[dev].usecount++; - in_use++; - - return 0; + return 0; } void -sound_release_sw (int dev, struct fileinfo *file) +sound_release_sw(int dev, struct fileinfo * file) { - DEB (printk ("sound_release_sw(dev=%d)\n", dev)); + DEB(printf("sound_release_sw(dev=%d)\n", dev)); - switch (dev & 0x0f) - { + switch (dev & 0x0f) { case SND_DEV_STATUS: - if (status_buf) - KERNEL_FREE (status_buf); - status_buf = NULL; - status_busy = 0; - break; + if (status_buf) + free(status_buf, M_TEMP); + status_buf = NULL; + status_busy = 0; + break; case SND_DEV_CTL: - break; + break; +#ifdef CONFIG_SEQUENCER case SND_DEV_SEQ: case SND_DEV_SEQ2: - sequencer_release (dev, file); - break; + sequencer_release(dev, file); + break; +#endif -#ifndef EXCLUDE_MIDI +#ifdef CONFIG_MIDI case SND_DEV_MIDIN: - MIDIbuf_release (dev, file); - break; + MIDIbuf_release(dev, file); + break; #endif +#ifdef CONFIG_AUDIO case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: - audio_release (dev, file); - break; + audio_release(dev, file); + break; +#endif default: - printk ("Sound error: Releasing unknown device 0x%02x\n", dev); + printf("Sound error: Releasing unknown device 0x%02x\n", dev); } - - sbc_devices[dev].usecount--; - in_use--; } int -sound_ioctl_sw (int dev, struct fileinfo *file, - unsigned int cmd, unsigned long arg) +sound_ioctl_sw(int dev, struct fileinfo * file, u_int cmd, ioctl_arg arg) { - DEB (printk ("sound_ioctl_sw(dev=%d, cmd=0x%x, arg=0x%x)\n", dev, cmd, arg)); - - if ((cmd >> 8) & 0xff == 'M' && num_mixers > 0) /* Mixer ioctl */ - if ((dev & 0x0f) != SND_DEV_CTL) - { - int dtype = dev & 0x0f; - int mixdev; - - switch (dtype) - { - case SND_DEV_DSP: - case SND_DEV_DSP16: - case SND_DEV_AUDIO: - mixdev = audio_devs[dev >> 4]->mixer_dev; - if (mixdev < 0 || mixdev >= num_mixers) - return RET_ERROR (ENXIO); - return mixer_devs[mixdev]->ioctl (mixdev, cmd, arg); - break; - - default: - return mixer_devs[0]->ioctl (0, cmd, arg); - } - } + DEB(printf("sound_ioctl_sw(dev=%d, cmd=0x%x, arg=0x%x)\n", dev, cmd, arg)); + + if (((cmd >> 8) & 0xff) == 'M' && num_mixers > 0) /* Mixer ioctl */ + if ((dev & 0x0f) != SND_DEV_CTL) { + int dtype = dev & 0x0f; + int mixdev; + + switch (dtype) { +#ifdef CONFIG_AUDIO + case SND_DEV_DSP: + case SND_DEV_DSP16: + case SND_DEV_AUDIO: + mixdev = audio_devs[dev >> 4]->mixer_dev; + if (mixdev < 0 || mixdev >= num_mixers) + return -(ENXIO); + return mixer_devs[mixdev]->ioctl(mixdev, cmd, arg); + break; +#endif - switch (dev & 0x0f) - { + default: + return mixer_devs[0]->ioctl(0, cmd, arg); + } + } + switch (dev & 0x0f) { case SND_DEV_CTL: - if (!num_mixers) - return RET_ERROR (ENXIO); + if (!num_mixers) + return -(ENXIO); - dev = dev >> 4; + dev = dev >> 4; - if (dev >= num_mixers) - return RET_ERROR (ENXIO); + if (dev >= num_mixers) + return -(ENXIO); - return mixer_devs[dev]->ioctl (dev, cmd, arg); - break; + return mixer_devs[dev]->ioctl(dev, cmd, arg); + break; +#ifdef CONFIG_SEQUENCER case SND_DEV_SEQ: case SND_DEV_SEQ2: - return sequencer_ioctl (dev, file, cmd, arg); - break; + return sequencer_ioctl(dev, file, cmd, arg); + break; +#endif +#ifdef CONFIG_AUDIO case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: - return audio_ioctl (dev, file, cmd, arg); - break; + return audio_ioctl(dev, file, cmd, arg); + break; +#endif -#ifndef EXCLUDE_MIDI +#ifdef CONFIG_MIDI case SND_DEV_MIDIN: - return MIDIbuf_ioctl (dev, file, cmd, arg); - break; + return MIDIbuf_ioctl(dev, file, cmd, arg); + break; #endif default: - return RET_ERROR (EPERM); - break; + return -(EPERM); + break; } - return RET_ERROR (EPERM); + return -(EPERM); } #endif diff --git a/sys/i386/isa/sound/sound_timer.c b/sys/i386/isa/sound/sound_timer.c index b887375..8450b2d 100644 --- a/sys/i386/isa/sound/sound_timer.c +++ b/sys/i386/isa/sound/sound_timer.c @@ -1,11 +1,8 @@ /* * sound/sound_timer.c - * - * Timer for the level 2 interface of the /dev/sequencer. Uses the - * 80 and 320 usec timers of OPL-3 (PAS16 only) and GUS. - * + * * Copyright by Hannu Savolainen 1993 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -13,7 +10,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -25,381 +22,322 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * */ #define SEQUENCER_C #include <i386/isa/sound/sound_config.h> -#ifdef CONFIGURE_SOUNDCARD +#if NSND > 0 -#if !defined(EXCLUDE_SEQUENCER) && (!defined(EXCLUDE_GUS) || (!defined(EXCLUDE_PAS) && !defined(EXCLUDE_YM3812))) +#if defined(CONFIG_SEQUENCER) static volatile int initialized = 0, opened = 0, tmr_running = 0; static volatile time_t tmr_offs, tmr_ctr; -static volatile unsigned long ticks_offs; +static volatile u_long ticks_offs; static volatile int curr_tempo, curr_timebase; -static volatile unsigned long curr_ticks; -static volatile unsigned long next_event_time; -static unsigned long prev_event_time; -static volatile int select_addr, data_addr; -static volatile int curr_timer = 0; -static volatile unsigned long usecs_per_tmr; /* Length of the current interval */ +static volatile u_long curr_ticks; +static volatile u_long next_event_time; +static u_long prev_event_time; +static volatile u_long usecs_per_tmr; /* Length of the current interval */ +static struct sound_lowlev_timer *tmr = NULL; -static void -timer_command (unsigned int addr, unsigned int val) +static u_long +tmr2ticks(int tmr_value) { - int i; + /* + * Convert timer ticks to MIDI ticks + */ - OUTB ((unsigned char) (addr & 0xff), select_addr); + u_long tmp; + u_long scale; - for (i = 0; i < 2; i++) - INB (select_addr); + tmp = tmr_value * usecs_per_tmr; /* Convert to usecs */ - OUTB ((unsigned char) (val & 0xff), data_addr); + scale = (60 * 1000000) / (curr_tempo * curr_timebase); /* usecs per MIDI tick */ - for (i = 0; i < 2; i++) - INB (select_addr); + return (tmp + (scale / 2)) / scale; } static void -arm_timer (int timer, unsigned int interval) -{ - - curr_timer = timer; - - if (timer == 1) - { - gus_write8 (0x46, 256 - interval); /* Set counter for timer 1 */ - gus_write8 (0x45, 0x04); /* Enable timer 1 IRQ */ - timer_command (0x04, 0x01); /* Start timer 1 */ - } - else - { - gus_write8 (0x47, 256 - interval); /* Set counter for timer 2 */ - gus_write8 (0x45, 0x08); /* Enable timer 2 IRQ */ - timer_command (0x04, 0x02); /* Start timer 2 */ - } -} - -static unsigned long -tmr2ticks (int tmr_value) +reprogram_timer(void) { - /* - * Convert timer ticks to MIDI ticks - */ + u_long usecs_per_tick; - unsigned long tmp; - unsigned long scale; + usecs_per_tick = (60 * 1000000) / (curr_tempo * curr_timebase); - tmp = tmr_value * usecs_per_tmr; /* Convert to usecs */ - - scale = (60 * 1000000) / (curr_tempo * curr_timebase); /* usecs per MIDI tick */ + /* + * Don't kill the system by setting too high timer rate + */ + if (usecs_per_tick < 2000) + usecs_per_tick = 2000; - return (tmp + (scale / 2)) / scale; + usecs_per_tmr = tmr->tmr_start(tmr->dev, usecs_per_tick); } -static void -reprogram_timer (void) +void +sound_timer_syncinterval(u_int new_usecs) { - unsigned long usecs_per_tick; - int timer_no, resolution; - int divisor; - - usecs_per_tick = (60 * 1000000) / (curr_tempo * curr_timebase); - - /* - * Don't kill the system by setting too high timer rate - */ - if (usecs_per_tick < 2000) - usecs_per_tick = 2000; - - if (usecs_per_tick > (256 * 80)) - { - timer_no = 2; - resolution = 320; /* usec */ - } - else - { - timer_no = 1; - resolution = 80; /* usec */ - } - - divisor = (usecs_per_tick + (resolution / 2)) / resolution; - usecs_per_tmr = divisor * resolution; - - arm_timer (timer_no, divisor); + /* + * This routine is called by the hardware level if the clock + * frequency has changed for some reason. + */ + tmr_offs = tmr_ctr; + ticks_offs += tmr2ticks(tmr_ctr); + tmr_ctr = 0; + + usecs_per_tmr = new_usecs; } static void -tmr_reset (void) +tmr_reset(void) { - unsigned long flags; - - DISABLE_INTR (flags); - tmr_offs = 0; - ticks_offs = 0; - tmr_ctr = 0; - next_event_time = 0xffffffff; - prev_event_time = 0; - curr_ticks = 0; - RESTORE_INTR (flags); + u_long flags; + + flags = splhigh(); + tmr_offs = 0; + ticks_offs = 0; + tmr_ctr = 0; + next_event_time = 0xffffffff; + prev_event_time = 0; + curr_ticks = 0; + splx(flags); } static int -timer_open (int dev, int mode) +timer_open(int dev, int mode) { - if (opened) - return RET_ERROR (EBUSY); + if (opened) + return -(EBUSY); - tmr_reset (); - curr_tempo = 60; - curr_timebase = HZ; - opened = 1; - reprogram_timer (); + tmr_reset(); + curr_tempo = 60; + curr_timebase = hz; + opened = 1; + reprogram_timer(); - return 0; + return 0; } static void -timer_close (int dev) +timer_close(int dev) { - opened = tmr_running = 0; - gus_write8 (0x45, 0); /* Disable both timers */ + opened = tmr_running = 0; + tmr->tmr_disable(tmr->dev); } static int -timer_event (int dev, unsigned char *event) +timer_event(int dev, u_char *event) { - unsigned char cmd = event[1]; - unsigned long parm = *(int *) &event[4]; + u_char cmd = event[1]; + u_long parm = *(int *) &event[4]; - switch (cmd) - { + switch (cmd) { case TMR_WAIT_REL: - parm += prev_event_time; + parm += prev_event_time; case TMR_WAIT_ABS: - if (parm > 0) - { - long time; + if (parm > 0) { + long time; - if (parm <= curr_ticks) /* It's the time */ - return TIMER_NOT_ARMED; + if (parm <= curr_ticks) /* It's the time */ + return TIMER_NOT_ARMED; - time = parm; - next_event_time = prev_event_time = time; + time = parm; + next_event_time = prev_event_time = time; - return TIMER_ARMED; + return TIMER_ARMED; } - break; + break; case TMR_START: - tmr_reset (); - tmr_running = 1; - reprogram_timer (); - break; + tmr_reset(); + tmr_running = 1; + reprogram_timer(); + break; case TMR_STOP: - tmr_running = 0; - break; + tmr_running = 0; + break; case TMR_CONTINUE: - tmr_running = 1; - reprogram_timer (); - break; + tmr_running = 1; + reprogram_timer(); + break; case TMR_TEMPO: - if (parm) - { - if (parm < 8) - parm = 8; - if (parm > 250) - parm = 250; - tmr_offs = tmr_ctr; - ticks_offs += tmr2ticks (tmr_ctr); - tmr_ctr = 0; - curr_tempo = parm; - reprogram_timer (); + if (parm) { + if (parm < 8) + parm = 8; + if (parm > 250) + parm = 250; + tmr_offs = tmr_ctr; + ticks_offs += tmr2ticks(tmr_ctr); + tmr_ctr = 0; + curr_tempo = parm; + reprogram_timer(); } - break; + break; case TMR_ECHO: - seq_copy_to_input (event, 8); - break; + seq_copy_to_input(event, 8); + break; default:; } - return TIMER_NOT_ARMED; + return TIMER_NOT_ARMED; } -static unsigned long -timer_get_time (int dev) +static u_long +timer_get_time(int dev) { - if (!opened) - return 0; + if (!opened) + return 0; - return curr_ticks; + return curr_ticks; } static int -timer_ioctl (int dev, - unsigned int cmd, unsigned int arg) +timer_ioctl(int dev, u_int cmd, ioctl_arg arg) { - switch (cmd) - { + switch (cmd) { case SNDCTL_TMR_SOURCE: - return IOCTL_OUT (arg, TMR_INTERNAL); - break; + return *(int *) arg = TMR_INTERNAL; + break; case SNDCTL_TMR_START: - tmr_reset (); - tmr_running = 1; - return 0; - break; + tmr_reset(); + tmr_running = 1; + return 0; + break; case SNDCTL_TMR_STOP: - tmr_running = 0; - return 0; - break; + tmr_running = 0; + return 0; + break; case SNDCTL_TMR_CONTINUE: - tmr_running = 1; - return 0; - break; + tmr_running = 1; + return 0; + break; case SNDCTL_TMR_TIMEBASE: - { - int val = IOCTL_IN (arg); - - if (val) - { - if (val < 1) - val = 1; - if (val > 1000) - val = 1000; - curr_timebase = val; - } - - return IOCTL_OUT (arg, curr_timebase); - } - break; + { + int val = (*(int *) arg); + + if (val) { + if (val < 1) + val = 1; + if (val > 1000) + val = 1000; + curr_timebase = val; + } + return *(int *) arg = curr_timebase; + } + break; case SNDCTL_TMR_TEMPO: - { - int val = IOCTL_IN (arg); - - if (val) - { - if (val < 8) - val = 8; - if (val > 250) - val = 250; - tmr_offs = tmr_ctr; - ticks_offs += tmr2ticks (tmr_ctr); - tmr_ctr = 0; - curr_tempo = val; - reprogram_timer (); - } - - return IOCTL_OUT (arg, curr_tempo); - } - break; + { + int val = (*(int *) arg); + + if (val) { + if (val < 8) + val = 8; + if (val > 250) + val = 250; + tmr_offs = tmr_ctr; + ticks_offs += tmr2ticks(tmr_ctr); + tmr_ctr = 0; + curr_tempo = val; + reprogram_timer(); + } + return *(int *) arg = curr_tempo; + } + break; case SNDCTL_SEQ_CTRLRATE: - if (IOCTL_IN (arg) != 0) /* Can't change */ - return RET_ERROR (EINVAL); + if ((*(int *) arg) != 0) /* Can't change */ + return -(EINVAL); - return IOCTL_OUT (arg, ((curr_tempo * curr_timebase) + 30) / 60); - break; + return *(int *) arg = ((curr_tempo * curr_timebase) + 30) / 60; + break; case SNDCTL_TMR_METRONOME: - /* NOP */ - break; + /* NOP */ + break; - default: + default:; } - return RET_ERROR (EINVAL); + return -(EINVAL); } static void -timer_arm (int dev, long time) +timer_arm(int dev, long time) { - if (time < 0) - time = curr_ticks + 1; - else if (time <= curr_ticks) /* It's the time */ - return; + if (time < 0) + time = curr_ticks + 1; + else if (time <= curr_ticks) /* It's the time */ + return; - next_event_time = prev_event_time = time; + next_event_time = prev_event_time = time; - return; + return; } static struct sound_timer_operations sound_timer = { - {"OPL-3/GUS Timer", 0}, - 1, /* Priority */ - 0, /* Local device link */ - timer_open, - timer_close, - timer_event, - timer_get_time, - timer_ioctl, - timer_arm + {"GUS Timer", 0}, + 1, /* Priority */ + 0, /* Local device link */ + timer_open, + timer_close, + timer_event, + timer_get_time, + timer_ioctl, + timer_arm }; void -sound_timer_interrupt (void) +sound_timer_interrupt(void) { - gus_write8 (0x45, 0); /* Ack IRQ */ - timer_command (4, 0x80); /* Reset IRQ flags */ + if (!opened) + return; - if (!opened) - return; - - if (curr_timer == 1) - gus_write8 (0x45, 0x04); /* Start timer 1 again */ - else - gus_write8 (0x45, 0x08); /* Start timer 2 again */ + tmr->tmr_restart(tmr->dev); - if (!tmr_running) - return; + if (!tmr_running) + return; - tmr_ctr++; - curr_ticks = ticks_offs + tmr2ticks (tmr_ctr); + tmr_ctr++; + curr_ticks = ticks_offs + tmr2ticks(tmr_ctr); - if (curr_ticks >= next_event_time) - { - next_event_time = 0xffffffff; - sequencer_timer (NULL); + if (curr_ticks >= next_event_time) { + next_event_time = 0xffffffff; + sequencer_timer(0); } } void -sound_timer_init (int io_base) +sound_timer_init(struct sound_lowlev_timer * t, char *name) { - int n; + int n; - if (initialized) - return; /* There is already a similar timer */ + if (initialized || t == NULL) + return; /* There is already a similar timer */ - select_addr = io_base; - data_addr = io_base + 1; + initialized = 1; + tmr = t; - initialized = 1; + if (num_sound_timers >= MAX_TIMER_DEV) + n = 0; /* Overwrite the system timer */ + else + n = num_sound_timers++; -#if 1 - if (num_sound_timers >= MAX_TIMER_DEV) - n = 0; /* Overwrite the system timer */ - else - n = num_sound_timers++; -#else - n = 0; -#endif + strcpy(sound_timer.info.name, name); - sound_timer_devs[n] = &sound_timer; + sound_timer_devs[n] = &sound_timer; } #endif diff --git a/sys/i386/isa/sound/soundcard.c b/sys/i386/isa/sound/soundcard.c index 95eefb9..37601f0 100644 --- a/sys/i386/isa/sound/soundcard.c +++ b/sys/i386/isa/sound/soundcard.c @@ -1,599 +1,595 @@ /* * sound/386bsd/soundcard.c * - * Soundcard driver for FreeBSD. + * Soundcard driver for 386BSD. * * Copyright by Hannu Savolainen 1993 - * + * * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * modification, are permitted provided that the following conditions are + * met: 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. 2. + * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $Id: soundcard.c,v 1.53 1997/09/14 03:12:54 peter Exp $ + * */ #include <i386/isa/sound/sound_config.h> + +#if NSND > 0 /* from "snd.h" */ #include <vm/vm.h> +#include <vm/vm_kern.h> +#include <vm/vm_param.h> +#include <vm/pmap.h> #include <vm/vm_extern.h> - -#ifdef CONFIGURE_SOUNDCARD +#include <sys/mman.h> #include <i386/isa/sound/dev_table.h> -#ifdef DEVFS -#include <sys/devfsext.h> -#endif /*DEVFS*/ +#include <i386/isa/isa_device.h> +#include <i386/isa/isa.h> -#define FIX_RETURN(ret) { \ - int tmp_ret = (ret); \ - if (tmp_ret<0) return -tmp_ret; else return 0; \ - } -static int timer_running = 0; -static struct callout_handle timer_ch; +/* +** Register definitions for DMA controller 1 (channels 0..3): +*/ +#define DMA1_CHN(c) (IO_DMA1 + 1*(2*(c))) /* addr reg for channel c */ +#define DMA1_SMSK (IO_DMA1 + 1*10) /* single mask register */ +#define DMA1_MODE (IO_DMA1 + 1*11) /* mode register */ +#define DMA1_FFC (IO_DMA1 + 1*12) /* clear first/last FF */ + +/* +** Register definitions for DMA controller 2 (channels 4..7): +*/ +#define DMA2_CHN(c) (IO_DMA2 + 2*(2*(c))) /* addr reg for channel c */ +#define DMA2_SMSK (IO_DMA2 + 2*10) /* single mask register */ +#define DMA2_MODE (IO_DMA2 + 2*11) /* mode register */ +#define DMA2_FFC (IO_DMA2 + 2*12) /* clear first/last FF */ + -static int soundcards_installed = 0; /* Number of installed - * soundcards */ +#define FIX_RETURN(ret) {if ((ret)<0) return -(ret); else return 0;} + +static int soundcards_installed = 0; /* Number of installed soundcards */ static int soundcard_configured = 0; static struct fileinfo files[SND_NDEVS]; +struct selinfo selinfo[SND_NDEVS >> 4]; -#ifdef DEVFS -static void * snd_devfs_token[SND_NDEVS]; -static void * sndstat_devfs_token; -#endif -struct selinfo selinfo[SND_NDEVS >> 4]; +void sndintr __P((int unit)); +int sndprobe __P((struct isa_device *)); +int sndattach __P((struct isa_device *)); +int sndmmap __P((dev_t dev, int offset, int nprot )); -static int sndprobe (struct isa_device *dev); -static int sndattach (struct isa_device *dev); -static void sound_mem_init(void); +static d_open_t sndopen; +static d_close_t sndclose; +static d_ioctl_t sndioctl; +static d_read_t sndread; +static d_write_t sndwrite; +static d_poll_t sndpoll; -static d_open_t sndopen; -static d_close_t sndclose; -static d_read_t sndread; -static d_write_t sndwrite; -static d_ioctl_t sndioctl; -static d_poll_t sndpoll; +static char driver_name[] = "snd"; #define CDEV_MAJOR 30 -static struct cdevsw snd_cdevsw = - { sndopen, sndclose, sndread, sndwrite, /*30*/ - sndioctl, nostop, nullreset, nodevtotty,/* sound */ - sndpoll, nommap, NULL, "snd", NULL, -1 }; - -struct isa_driver opldriver = {sndprobe, sndattach, "opl"}; -struct isa_driver sbdriver = {sndprobe, sndattach, "sb"}; -struct isa_driver sbxvidriver = {sndprobe, sndattach, "sbxvi"}; -struct isa_driver sbmididriver = {sndprobe, sndattach, "sbmidi"}; -struct isa_driver awedriver = {sndprobe, sndattach, "awe"}; -struct isa_driver pasdriver = {sndprobe, sndattach, "pas"}; -struct isa_driver mpudriver = {sndprobe, sndattach, "mpu"}; -struct isa_driver gusdriver = {sndprobe, sndattach, "gus"}; -struct isa_driver gusxvidriver = {sndprobe, sndattach, "gusxvi"}; -struct isa_driver gusmaxdriver = {sndprobe, sndattach, "gusmax"}; -struct isa_driver uartdriver = {sndprobe, sndattach, "uart"}; -struct isa_driver mssdriver = {sndprobe, sndattach, "mss"}; -#ifdef PC98 -struct isa_driver pcmdriver = {sndprobe, sndattach, "pcm"}; -#endif +static struct cdevsw snd_cdevsw = { + sndopen, sndclose, sndread, sndwrite, + sndioctl, nxstop, nxreset, nxdevtotty, + sndpoll, sndmmap, nxstrategy, driver_name, + NULL, -1, +}; -static int -ipri_to_irq (unsigned short ipri); -void -adintr(INT_HANDLER_PARMS(unit,dummy)) -{ -#ifndef EXCLUDE_AD1848 - static short unit_to_irq[4] = { -1, -1, -1, -1 }; - struct isa_device *dev; - - if (unit_to_irq [unit] > 0) - ad1848_interrupt(INT_HANDLER_CALL (unit_to_irq [unit])); - else { - dev = find_isadev (isa_devtab_null, &mssdriver, unit); - if (!dev) - printk ("ad1848: Couldn't determine unit\n"); - else { - unit_to_irq [unit] = ipri_to_irq (dev->id_irq); - ad1848_interrupt(INT_HANDLER_CALL (unit_to_irq [unit])); - } - } -#endif -} -unsigned -long + +static void sound_mem_init(void); + +/* + * for each "device XXX" entry in the config file, we have + * a struct isa_driver which is linked into isa_devtab_null[] + * + * XXX It is a bit stupid to call the generic routine so many times and + * switch then to the specific one, but the alternative way would be + * to replicate some code in the probe/attach routines. + */ + +struct isa_driver opldriver = {sndprobe, sndattach, "opl"}; +struct isa_driver trixdriver = {sndprobe, sndattach, "trix"}; +struct isa_driver trixsbdriver = {sndprobe, sndattach, "trixsb"}; +struct isa_driver sbdriver = {sndprobe, sndattach, "sb"}; +struct isa_driver sbxvidriver = {sndprobe, sndattach, "sbxvi"}; +struct isa_driver sbmididriver = {sndprobe, sndattach, "sbmidi"}; +struct isa_driver awedriver = {sndprobe, sndattach, "awe"}; +struct isa_driver pasdriver = {sndprobe, sndattach, "pas"}; +struct isa_driver mpudriver = {sndprobe, sndattach, "mpu"}; +struct isa_driver gusdriver = {sndprobe, sndattach, "gus"}; +struct isa_driver gusxvidriver = {sndprobe, sndattach, "gusxvi"}; +struct isa_driver gusmaxdriver = {sndprobe, sndattach, "gusmax"}; +struct isa_driver uartdriver = {sndprobe, sndattach, "uart"}; +struct isa_driver mssdriver = {sndprobe, sndattach, "mss"}; + +/* XXX does this work ? lr 970714 */ +struct isa_driver sscapedriver = {sndprobe, sndattach, "ss_mss"}; + +short ipri_to_irq(u_short ipri); + +u_long get_time(void) { -struct timeval timecopy; -int x; - - x = splclock(); - timecopy = time; - splx(x); - return timecopy.tv_usec/(1000000/HZ) + - (unsigned long)timecopy.tv_sec*HZ; + struct timeval timecopy; + int x; + + x = splclock(); + timecopy = time; + splx(x); + return timecopy.tv_usec / (1000000 / hz) + + (u_long) timecopy.tv_sec * hz; } - -static int -sndread (dev_t dev, struct uio *buf, int ioflag) +int +sndmmap( dev_t dev, int offset, int nprot ) { - int count = buf->uio_resid; + int unit; + struct dma_buffparms * dmap; - dev = minor (dev); + dev = minor(dev) >> 4; + if (dev > 0 ) return (-1); - FIX_RETURN (sound_read_sw (dev, &files[dev], buf, count)); + dmap = audio_devs[dev]->dmap_out; + + if (nprot & PROT_EXEC) + return( -1 ); + dmap->mapping_flags |= DMA_MAP_MAPPED ; + return( i386_btop(vtophys(dmap->raw_buf) + offset) ); } + static int -sndwrite (dev_t dev, struct uio *buf, int ioflag) +sndread(dev_t dev, struct uio * buf, int flag) { - int count = buf->uio_resid; + int count = buf->uio_resid; + + dev = minor(dev); + FIX_RETURN(sound_read_sw(dev, &files[dev], buf, count)); +} + - dev = minor (dev); +static int +sndwrite(dev_t dev, struct uio * buf, int flag) +{ + int count = buf->uio_resid; - FIX_RETURN (sound_write_sw (dev, &files[dev], buf, count)); + dev = minor(dev); + FIX_RETURN(sound_write_sw(dev, &files[dev], buf, count)); } static int -sndopen (dev_t dev, int flags, int fmt, struct proc *p) +sndopen(dev_t dev, int flags, int mode, struct proc * p) { - dev = minor (dev); + int retval; + struct fileinfo tmp_file; - if (!soundcard_configured && dev) - { - printk ("SoundCard Error: The soundcard system has not been configured\n"); - FIX_RETURN (-ENODEV); + dev = minor(dev); + if (!soundcard_configured && dev) { + printf("SoundCard Error: soundcard system has not been configured\n"); + return ENODEV ; } + tmp_file.mode = 0; - files[dev].mode = 0; + if (flags & FREAD && flags & FWRITE) + tmp_file.mode = OPEN_READWRITE; + else if (flags & FREAD) + tmp_file.mode = OPEN_READ; + else if (flags & FWRITE) + tmp_file.mode = OPEN_WRITE; - if (flags & FREAD && flags & FWRITE) - files[dev].mode = OPEN_READWRITE; - else if (flags & FREAD) - files[dev].mode = OPEN_READ; - else if (flags & FWRITE) - files[dev].mode = OPEN_WRITE; + selinfo[dev >> 4].si_pid = 0; + selinfo[dev >> 4].si_flags = 0; + if ((retval = sound_open_sw(dev, &tmp_file)) < 0) + FIX_RETURN(retval); - selinfo[dev >> 4].si_pid = 0; - selinfo[dev >> 4].si_flags = 0; + bcopy((char *) &tmp_file, (char *) &files[dev], sizeof(tmp_file)); - FIX_RETURN(sound_open_sw (dev, &files[dev])); + FIX_RETURN(retval); } + static int -sndclose (dev_t dev, int flags, int fmt, struct proc *p) +sndclose(dev_t dev, int flags, int mode, struct proc * p) { + dev = minor(dev); + sound_release_sw(dev, &files[dev]); - dev = minor (dev); - - sound_release_sw(dev, &files[dev]); - FIX_RETURN (0); + return 0 ; } static int -sndioctl (dev_t dev, int cmd, caddr_t arg, int flags, struct proc *p) +sndioctl(dev_t dev, int cmd, caddr_t arg, int mode, struct proc * p) { - dev = minor (dev); - - FIX_RETURN (sound_ioctl_sw (dev, &files[dev], cmd, (unsigned int) arg)); + dev = minor(dev); + FIX_RETURN(sound_ioctl_sw(dev, &files[dev], cmd, arg)); } -static int -sndpoll (dev_t dev, int events, struct proc *p) +int +sndpoll(dev_t dev, int events, struct proc * p) { - dev = minor (dev); + dev = minor(dev); + dev = minor(dev); - DEB (printk ("snd_poll(dev=%d, rw=%d, pid=%d)\n", dev, rw, p->p_pid)); + /* printf ("snd_select(dev=%d, rw=%d, pid=%d)\n", dev, rw, p->p_pid); */ #ifdef ALLOW_SELECT - switch (dev & 0x0f) - { -#ifndef EXCLUDE_SEQUENCER + switch (dev & 0x0f) { +#ifdef EXCLUDE_SEQUENCER case SND_DEV_SEQ: case SND_DEV_SEQ2: - return sequencer_poll (dev, &files[dev], events, p); - break; + return sequencer_poll(dev, &files[dev], events, p); + break; #endif -#ifndef EXCLUDE_MIDI +#ifdef EXCLUDE_MIDI case SND_DEV_MIDIN: - return MIDIbuf_poll (dev, &files[dev], events, p); - break; + return MIDIbuf_poll(dev, &files[dev], events, p); + break; #endif -#ifndef EXCLUDE_AUDIO +#ifdef CONFIG_AUDIO case SND_DEV_DSP: case SND_DEV_DSP16: case SND_DEV_AUDIO: - return audio_poll (dev, &files[dev], events, p); - break; + + return audio_poll(dev, &files[dev], events, p); + break; #endif default: - return 0; + return 0; } -#endif +#endif /* ALLOW_SELECT */ + DEB(printf("sound_ioctl(dev=%d, cmd=0x%x, arg=0x%x)\n", dev, cmd, arg)); - return 0; + return 0 ; } -static int -ipri_to_irq (unsigned short ipri) +/* XXX this should become ffs(ipri), perhaps -1 lr 970705 */ +short +ipri_to_irq(u_short ipri) { - /* - * Converts the ipri (bitmask) to the corresponding irq number - */ - int irq; + /* + * Converts the ipri (bitmask) to the corresponding irq number + */ + int irq; - for (irq = 0; irq < 16; irq++) - if (ipri == (1 << irq)) - return irq; + for (irq = 0; irq < 16; irq++) + if (ipri == (1 << irq)) + return irq; - return -1; /* Invalid argument */ + return -1; /* Invalid argument */ } static int -driver_to_voxunit(struct isa_driver *driver) +driver_to_voxunit(struct isa_driver * driver) { - /* converts a sound driver pointer into the equivalent - VoxWare device unit number */ - if(driver == &opldriver) - return(SNDCARD_ADLIB); - else if(driver == &sbdriver) - return(SNDCARD_SB); - else if(driver == &pasdriver) - return(SNDCARD_PAS); - else if(driver == &gusdriver) - return(SNDCARD_GUS); - else if(driver == &mpudriver) - return(SNDCARD_MPU401); - else if(driver == &sbxvidriver) - return(SNDCARD_SB16); - else if(driver == &sbmididriver) - return(SNDCARD_SB16MIDI); - else if(driver == &awedriver) - return(SNDCARD_AWE32); - else if(driver == &uartdriver) - return(SNDCARD_UART6850); - else if(driver == &gusdriver) - return(SNDCARD_GUS16); - else if(driver == &mssdriver) - return(SNDCARD_MSS); -#ifdef PC98 - else if(driver == &pcmdriver) - return(SNDCARD_PCM86); -#endif - else - return(0); + /* + * converts a sound driver pointer into the equivalent VoxWare device + * unit number + */ + if (driver == &opldriver) + return (SNDCARD_ADLIB); + else if (driver == &sbdriver) + return (SNDCARD_SB); + else if (driver == &pasdriver) + return (SNDCARD_PAS); + else if (driver == &gusdriver) + return (SNDCARD_GUS); + else if (driver == &mpudriver) + return (SNDCARD_MPU401); + else if (driver == &sbxvidriver) + return (SNDCARD_SB16); + else if (driver == &sbmididriver) + return (SNDCARD_SB16MIDI); + else if(driver == &awedriver) + return(SNDCARD_AWE32); + else if (driver == &uartdriver) + return (SNDCARD_UART6850); + else if (driver == &gusdriver) + return (SNDCARD_GUS16); + else if (driver == &mssdriver) + return (SNDCARD_MSS); + else if (driver == &trixdriver) + return (SNDCARD_TRXPRO); + else if (driver == &trixsbdriver) + return (SNDCARD_TRXPRO_SB); + else if (driver == &sscapedriver) + return (SNDCARD_SSCAPE_MSS); + else + return (0); } -static int -sndprobe (struct isa_device *dev) +/* + * very dirty: tmp_osp is allocated in sndprobe, and used at the next + * call in sndattach + */ + +static sound_os_info *temp_osp; + +/* + * sndprobe is called for each isa_device. From here, a voxware unit + * number is determined, and the appropriate probe routine is selected. + * The parameters from the config line are passed to the hw_config struct. + */ + +int +sndprobe(struct isa_device * dev) { - struct address_info hw_config; - int unit; - - unit = driver_to_voxunit(dev->id_driver); - hw_config.io_base = dev->id_iobase; - hw_config.irq = ipri_to_irq (dev->id_irq); - hw_config.dma = dev->id_drq; - hw_config.dma_read = dev->id_flags; /* misuse the flags field for read dma*/ - - if(unit) { - int result; - - result = sndtable_probe (unit, &hw_config); - dev->id_iobase = hw_config.io_base; - dev->id_irq = hw_config.irq == -1 ? 0 : (1 << hw_config.irq); - dev->id_drq = hw_config.dma; - - return result; - } else - return 0; + struct address_info hw_config; + int unit; + + temp_osp = (sound_os_info *)malloc(sizeof(sound_os_info), + M_DEVBUF, M_NOWAIT); + if (!temp_osp) + panic("SOUND: Cannot allocate memory\n"); + + /* + * get config info from the kernel config. These may be overridden + * by the local autoconfiguration routines though (e.g. pnp stuff). + */ + + hw_config.io_base = dev->id_iobase; + hw_config.irq = ipri_to_irq(dev->id_irq); + hw_config.dma = dev->id_drq; + + /* + * misuse the flags field for read dma. Note that, to use 0 as + * read dma channel, one of the high bits should be set. lr970705 XXX + */ + + if (dev->id_flags != 0) + hw_config.dma2 = dev->id_flags & 0x7; + else + hw_config.dma2 = -1; + + hw_config.always_detect = 0; + hw_config.name = NULL; + hw_config.card_subtype = 0; + + temp_osp->unit = dev->id_unit; + hw_config.osp = temp_osp; + unit = driver_to_voxunit(dev->id_driver); + + if (sndtable_probe(unit, &hw_config)) { + dev->id_iobase = hw_config.io_base; + dev->id_irq = hw_config.irq == -1 ? 0 : (1 << hw_config.irq); + dev->id_drq = hw_config.dma; + + if (hw_config.dma != hw_config.dma2 && ( hw_config.dma2 != -1)) + dev->id_flags = hw_config.dma2 | 0x100; /* XXX lr */ + else + dev->id_flags = 0; + return TRUE; + } + return 0; } -static int -sndattach (struct isa_device *dev) +int +sndattach(struct isa_device * dev) { - int unit; - int minor; - int voxunit; - static int midi_initialized = 0; - static int seq_initialized = 0; - unsigned long mem_start = 0xefffffffUL; - struct address_info hw_config; - - unit = dev->id_unit; - voxunit = driver_to_voxunit(dev->id_driver); - hw_config.io_base = dev->id_iobase; - hw_config.irq = ipri_to_irq (dev->id_irq); - hw_config.dma = dev->id_drq; - hw_config.dma_read = dev->id_flags; /* misuse the flags field for read dma*/ - - if(!voxunit) - return FALSE; - if (!sndtable_init_card (voxunit, &hw_config)) - { - printf (" <Driver not configured>"); - return FALSE; + int unit; + static int midi_initialized = 0; + static int seq_initialized = 0; + struct address_info hw_config; + + unit = driver_to_voxunit(dev->id_driver); + hw_config.io_base = dev->id_iobase; + hw_config.irq = ipri_to_irq(dev->id_irq); + hw_config.dma = dev->id_drq; + + /* misuse the flags field for read dma */ + if (dev->id_flags != 0) + hw_config.dma2 = dev->id_flags & 0x7; + else + hw_config.dma2 = -1; + + hw_config.card_subtype = 0; + hw_config.osp = temp_osp; + + if (!unit) + return FALSE; + + if (!(sndtable_init_card(unit, &hw_config))) { /* init card */ + printf(" <Driver not configured>"); + return FALSE; } + /* + * Init the high level sound driver + */ - /* - * Init the high level sound driver - */ - - if (!(soundcards_installed = sndtable_get_cardcount ())) - { - printf (" <No such hardware>"); - return FALSE; /* No cards detected */ + if (!(soundcards_installed = sndtable_get_cardcount())) { + DDB(printf("No drivers actually installed\n")); + return FALSE; /* No cards detected */ } + printf("\n"); - printf("\n"); - -#ifndef EXCLUDE_AUDIO - if (num_audiodevs) /* Audio devices present */ - { - mem_start = DMAbuf_init (mem_start); - mem_start = audio_init (mem_start); - sound_mem_init (); +#ifdef CONFIG_AUDIO + if (num_audiodevs) { /* Audio devices present */ + DMAbuf_init(); + sound_mem_init(); } - - soundcard_configured = 1; + soundcard_configured = 1; #endif -#ifndef EXCLUDE_MIDI - if (num_midis && !midi_initialized) - { - midi_initialized = 1; - mem_start = MIDIbuf_init (mem_start); - } -#endif + if (num_midis && !midi_initialized) + midi_initialized = 1; -#ifndef EXCLUDE_SEQUENCER - if ((num_midis + num_synths) && !seq_initialized) - { - seq_initialized = 1; - mem_start = sequencer_init (mem_start); + if ((num_midis + num_synths) && !seq_initialized) { + seq_initialized = 1; + sequencer_init(); } -#endif -#ifdef DEVFS -/* XXX */ /* should only create devices if that card has them */ - if ( ! sndstat_devfs_token) - { - sndstat_devfs_token = - devfs_add_devswf(&snd_cdevsw, SND_DEV_STATUS, DV_CHR, UID_ROOT, - GID_WHEEL, 0600, "sndstat"); - } - - minor = (unit << 4)+SND_DEV_CTL; - if ( ! snd_devfs_token[minor]) { - snd_devfs_token[minor] = - devfs_add_devswf(&snd_cdevsw, minor, DV_CHR, UID_ROOT, - GID_WHEEL, 0600, "mixer%d", unit); - } + dev_t dev; -#ifndef EXCLUDE_SEQUENCER - minor = (unit << 4)+SND_DEV_SEQ; - if ( ! snd_devfs_token[minor]) - { - snd_devfs_token[minor] = - devfs_add_devswf(&snd_cdevsw, minor, DV_CHR, UID_ROOT, - GID_WHEEL, 0600, "sequencer%d", unit); - } - - minor = (unit << 4)+SND_DEV_SEQ2; - if ( ! snd_devfs_token[minor]) - { - snd_devfs_token[minor] = - devfs_add_devswf(&snd_cdevsw, minor, DV_CHR, UID_ROOT, - GID_WHEEL, 0600, "music%d", unit); + dev = makedev(CDEV_MAJOR, 0); + cdevsw_add(&dev, &snd_cdevsw, NULL); } -#endif -#ifndef EXCLUDE_MIDI - minor = (unit << 4)+SND_DEV_MIDIN; - if ( ! snd_devfs_token[minor]) - { - snd_devfs_token[minor] = - devfs_add_devswf(&snd_cdevsw, minor, DV_CHR, UID_ROOT, - GID_WHEEL, 0600, "midi%d", unit); - } -#endif -#ifndef EXCLUDE_AUDIO - minor = (unit << 4)+SND_DEV_DSP; - if ( ! snd_devfs_token[minor]) - { - snd_devfs_token[minor] = - devfs_add_devswf(&snd_cdevsw, minor, DV_CHR, UID_ROOT, - GID_WHEEL, 0600, "dsp%d", unit); - } + return TRUE; +} - minor = (unit << 4)+SND_DEV_AUDIO; - if ( ! snd_devfs_token[minor]) - { - snd_devfs_token[minor] = - devfs_add_devswf(&snd_cdevsw, minor, DV_CHR, UID_ROOT, - GID_WHEEL, 0600, "audio%d", unit); - } - minor = (unit << 4)+SND_DEV_DSP16; - if ( ! snd_devfs_token[minor]) - { - snd_devfs_token[minor] = - devfs_add_devswf(&snd_cdevsw, minor, DV_CHR, UID_ROOT, - GID_WHEEL, 0600, "dspW%d", unit); +#ifdef CONFIG_AUDIO + +static void +alloc_dmap(int dev, int chan, struct dma_buffparms * dmap) +{ + char *tmpbuf; + int i; + + tmpbuf = contigmalloc(audio_devs[dev]->buffsize, M_DEVBUF, M_NOWAIT, + 0ul, 0xfffffful, 1ul, chan & 4 ? 0x20000ul : 0x10000ul); + if (tmpbuf == NULL) + printf("soundcard buffer alloc failed \n"); + + if (tmpbuf == NULL) { + printf("snd: Unable to allocate %d bytes of buffer\n", + 2 * (int) audio_devs[dev]->buffsize); + return; } + dmap->raw_buf = tmpbuf; + /* + * Use virtual address as the physical address, since isa_dmastart + * performs the phys address computation. + */ + + dmap->raw_buf_phys = (u_long) tmpbuf; + for (i = 0; i < audio_devs[dev]->buffsize; i++) *tmpbuf++ = 0x80; + +} + +static void +sound_mem_init(void) +{ + int dev; + static u_long dsp_init_mask = 0; + + for (dev = 0; dev < num_audiodevs; dev++) /* Enumerate devices */ + if (!(dsp_init_mask & (1 << dev))) /* Not already done */ + if (audio_devs[dev]->dmachan1 >= 0) { + dsp_init_mask |= (1 << dev); + audio_devs[dev]->buffsize = DSP_BUFFSIZE; + /* Now allocate the buffers */ + alloc_dmap(dev, audio_devs[dev]->dmachan1, + audio_devs[dev]->dmap_out); + if (audio_devs[dev]->flags & DMA_DUPLEX) + alloc_dmap(dev, audio_devs[dev]->dmachan2, + audio_devs[dev]->dmap_in); + } /* for dev */ +} + #endif - minor = (unit << 4)+SND_DEV_SNDPROC; - if ( ! snd_devfs_token[minor]) - { - snd_devfs_token[minor] = - devfs_add_devswf(&snd_cdevsw, minor, DV_CHR, UID_ROOT, - GID_WHEEL, 0600, "pss%d", unit); + +int +snd_ioctl_return(int *addr, int value) +{ + if (value < 0) + return value; /* Error */ + suword(addr, value); + return 0; +} + +#define MAX_UNIT 50 +typedef void (*irq_proc_t) (int irq); +static irq_proc_t irq_proc[MAX_UNIT] = {NULL}; +static int irq_irq[MAX_UNIT] = {0}; + +int +snd_set_irq_handler(int int_lvl, void (*hndlr) (int), sound_os_info * osp) +{ + if (osp->unit >= MAX_UNIT) { + printf("Sound error: Unit number too high (%d)\n", osp->unit); + return 0; } -#endif /* DEVFS */ - return TRUE; + irq_proc[osp->unit] = hndlr; + irq_irq[osp->unit] = int_lvl; + return 1; } void -tenmicrosec (void) +sndintr(int unit) { - int i; + if ( (unit >= MAX_UNIT) || (irq_proc[unit] == NULL) ) + return; - for (i = 0; i < 16; i++) - inb (0x80); + irq_proc[unit] (irq_irq[unit]); /* Call the installed handler */ } -#ifndef EXCLUDE_SEQUENCER void -request_sound_timer (int count) +conf_printf(char *name, struct address_info * hw_config) { - static int current = 0; - int tmp = count; - - if (count < 0) - timeout (sequencer_timer, 0, -count); - else - { + if (!trace_init) + return; - if (count < current) - current = 0; /* Timer restarted */ + printf("<%s> ", name); + if (hw_config->io_base != -1 ) + printf("at 0x%03x", hw_config->io_base); - count = count - current; + if (hw_config->irq != -1 ) + printf(" irq %d", hw_config->irq); - current = tmp; + if (hw_config->dma != -1 || hw_config->dma2 != -1) { + printf(" dma %d", hw_config->dma); + if (hw_config->dma2 != -1) + printf(",%d", hw_config->dma2); + } - if (!count) - count = 1; - timer_ch = timeout (sequencer_timer, 0, count); - } - timer_running = 1; } void -sound_stop_timer (void) +conf_printf2(char *name, int base, int irq, int dma, int dma2) { - if (timer_running) - untimeout (sequencer_timer, 0, timer_ch); - timer_running = 0; -} -#endif + if (!trace_init) + return; -#ifndef EXCLUDE_AUDIO -static void -sound_mem_init (void) -{ - int dev; - unsigned long dma_pagesize; - struct dma_buffparms *dmap; - static unsigned long dsp_init_mask = 0; - - for (dev = 0; dev < num_audiodevs; dev++) /* Enumerate devices */ - if (!(dsp_init_mask & (1 << dev))) /* Not already done */ -#ifdef PC98 - if (audio_devs[dev]->buffcount > 0 && audio_devs[dev]->dmachan >= 0) -#else - if (audio_devs[dev]->buffcount > 0 && audio_devs[dev]->dmachan > 0) -#endif - { - dsp_init_mask |= (1 << dev); - dmap = audio_devs[dev]->dmap; - - if (audio_devs[dev]->flags & DMA_AUTOMODE) - audio_devs[dev]->buffcount = 1; - - audio_devs[dev]->buffsize &= ~0xfff; /* Truncate to n*4k */ - - if (audio_devs[dev]->dmachan > 3 && audio_devs[dev]->buffsize > 65536) - dma_pagesize = 131072; /* 128k */ - else - dma_pagesize = 65536; - - /* More sanity checks */ - - if (audio_devs[dev]->buffsize > dma_pagesize) - audio_devs[dev]->buffsize = dma_pagesize; - if (audio_devs[dev]->buffsize < 4096) - audio_devs[dev]->buffsize = 4096; - - /* Now allocate the buffers */ - - for (dmap->raw_count = 0; dmap->raw_count < audio_devs[dev]->buffcount; dmap->raw_count++) - { - char *tmpbuf = (char *)vm_page_alloc_contig(audio_devs[dev]->buffsize, 0ul, 0xfffffful, dma_pagesize); - - if (tmpbuf == NULL) - { - printk ("snd: Unable to allocate %ld bytes of buffer\n", - audio_devs[dev]->buffsize); - return; - } - - dmap->raw_buf[dmap->raw_count] = tmpbuf; - /* - * Use virtual address as the physical address, since - * isa_dmastart performs the phys address computation. - */ - dmap->raw_buf_phys[dmap->raw_count] = - (unsigned long) dmap->raw_buf[dmap->raw_count]; - } - } /* for dev */ + printf("<%s> at 0x%03x", name, base); -} + if (irq) + printf(" irq %d", irq); + + if (dma != -1 || dma2 != -1) { + printf(" dma %d", dma); + if (dma2 != -1) + printf(",%d", dma2); + } -#endif -int -snd_set_irq_handler (int interrupt_level, INT_HANDLER_PROTO(), char *name) -{ - return 1; } -void -snd_release_irq(int vect) +void tenmicrosec (int j) { + int i, k; + for (k = 0; k < j/10 ; k++) { + for (i = 0; i < 16; i++) + inb (0x80); + } } -static snd_devsw_installed = 0; +#endif /* NSND > 0 */ -static void -snd_drvinit(void *unused) -{ - dev_t dev; - if( ! snd_devsw_installed ) { - dev = makedev(CDEV_MAJOR, 0); - cdevsw_add(&dev,&snd_cdevsw, NULL); - snd_devsw_installed = 1; - } -} - -SYSINIT(snddev,SI_SUB_DRIVERS,SI_ORDER_MIDDLE+CDEV_MAJOR,snd_drvinit,NULL) -#endif diff --git a/sys/i386/isa/sound/soundvers.h b/sys/i386/isa/sound/soundvers.h index ca892e8..66ca10d 100644 --- a/sys/i386/isa/sound/soundvers.h +++ b/sys/i386/isa/sound/soundvers.h @@ -1 +1,2 @@ -#define SOUND_VERSION_STRING "3.0-beta-950506" +#define SOUND_VERSION_STRING "3.5-alpha15-970902" +#define SOUND_INTERNAL_VERSION 0x030518 diff --git a/sys/i386/isa/sound/sscape.c b/sys/i386/isa/sound/sscape.c index 23d39ce..3ba866e 100644 --- a/sys/i386/isa/sound/sscape.c +++ b/sys/i386/isa/sound/sscape.c @@ -1,10 +1,10 @@ /* * sound/sscape.c - * + * * Low level driver for Ensoniq Soundscape - * + * * Copyright by Hannu Savolainen 1994 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -12,7 +12,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -24,17 +24,17 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * */ #include <i386/isa/sound/sound_config.h> -#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SSCAPE) +#if NSSCAPE > 0 #include <i386/isa/sound/coproc.h> /* - * I/O ports + * I/O ports */ #define MIDI_DATA 0 #define MIDI_CTRL 1 @@ -46,7 +46,7 @@ #define ODIE_DATA 5 /* - * Indirect registers + * Indirect registers */ #define GA_INTSTAT_REG 0 #define GA_INTENA_REG 1 @@ -75,6 +75,10 @@ #define CMD_GET_BOARD_TYPE 0x82 #define CMD_SET_CONTROL 0x88 #define CMD_GET_CONTROL 0x89 +#define CTL_MASTER_VOL 0 +#define CTL_MIC_MODE 2 +#define CTL_SYNTH_VOL 4 +#define CTL_WAVE_VOL 7 #define CMD_SET_MT32 0x96 #define CMD_GET_MT32 0x97 #define CMD_SET_EXTMIDI 0x9b @@ -82,748 +86,689 @@ #define CMD_ACK 0x80 -typedef struct sscape_info - { - int base, irq, dma; - int ok; /* Properly detected */ - int dma_allocated; - int my_audiodev; - int opened; - } +typedef struct sscape_info { + int base, irq, dma; + int ok; /* Properly detected */ + int failed; + int dma_allocated; + int my_audiodev; + int opened; + sound_os_info *osp; +} -sscape_info; + sscape_info; static struct sscape_info dev_info = {0}; static struct sscape_info *devc = &dev_info; -DEFINE_WAIT_QUEUE (sscape_sleeper, sscape_sleep_flag); +static int *sscape_sleeper = NULL; +static volatile struct snd_wait sscape_sleep_flag = +{0}; -#ifdef REVEAL_SPEA -/* Spea and Reveal have assigned interrupt bits differently than Ensoniq */ -static char valid_interrupts[] = +/* Some older cards have assigned interrupt bits differently than new ones */ +static char valid_interrupts_old[] = {9, 7, 5, 15}; -#else -static char valid_interrupts[] = +static char valid_interrupts_new[] = {9, 5, 7, 10}; +static char *valid_interrupts = valid_interrupts_new; + +#ifdef REVEAL_SPEA +static char old_hardware = 1; + +#else +static char old_hardware = 0; + #endif -static unsigned char -sscape_read (struct sscape_info *devc, int reg) +static u_char +sscape_read(struct sscape_info * devc, int reg) { - unsigned long flags; - unsigned char val; - - DISABLE_INTR (flags); - OUTB (reg, PORT (ODIE_ADDR)); - val = INB (PORT (ODIE_DATA)); - RESTORE_INTR (flags); - return val; + u_long flags; + u_char val; + + flags = splhigh(); + outb(PORT(ODIE_ADDR), reg); + val = inb(PORT(ODIE_DATA)); + splx(flags); + return val; } static void -sscape_write (struct sscape_info *devc, int reg, int data) +sscape_write(struct sscape_info * devc, int reg, int data) { - unsigned long flags; + u_long flags; - DISABLE_INTR (flags); - OUTB (reg, PORT (ODIE_ADDR)); - OUTB (data, PORT (ODIE_DATA)); - RESTORE_INTR (flags); + flags = splhigh(); + outb(PORT(ODIE_ADDR), reg); + outb(PORT(ODIE_DATA), data); + splx(flags); } static void -host_open (struct sscape_info *devc) +host_open(struct sscape_info * devc) { - OUTB (0x00, PORT (HOST_CTRL)); /* Put the board to the host mode */ + outb(PORT(HOST_CTRL), 0x00); /* Put the board to the host mode */ } static void -host_close (struct sscape_info *devc) +host_close(struct sscape_info * devc) { - OUTB (0x03, PORT (HOST_CTRL)); /* Put the board to the MIDI mode */ + outb(PORT(HOST_CTRL), 0x03); /* Put the board to the MIDI mode */ } static int -host_write (struct sscape_info *devc, unsigned char *data, int count) +host_write(struct sscape_info * devc, u_char *data, int count) { - unsigned long flags; - int i, timeout; + u_long flags; + int i, timeout_val; - DISABLE_INTR (flags); + flags = splhigh(); - /* - * Send the command and data bytes - */ + /* + * Send the command and data bytes + */ - for (i = 0; i < count; i++) - { - for (timeout = 10000; timeout > 0; timeout--) - if (INB (PORT (HOST_CTRL)) & TX_READY) - break; + for (i = 0; i < count; i++) { + for (timeout_val = 10000; timeout_val > 0; timeout_val--) + if (inb(PORT(HOST_CTRL)) & TX_READY) + break; - if (timeout <= 0) - { - RESTORE_INTR (flags); - return 0; + if (timeout_val <= 0) { + splx(flags); + return 0; + } + outb(PORT(HOST_DATA), data[i]); } - OUTB (data[i], PORT (HOST_DATA)); - } + splx(flags); - RESTORE_INTR (flags); - - return 1; + return 1; } static int -host_read (struct sscape_info *devc) +host_read(struct sscape_info * devc) { - unsigned long flags; - int timeout; - unsigned char data; - - DISABLE_INTR (flags); + u_long flags; + int timeout_val; + u_char data; - /* - * Read a byte - */ + flags = splhigh(); - for (timeout = 10000; timeout > 0; timeout--) - if (INB (PORT (HOST_CTRL)) & RX_READY) - break; + /* + * Read a byte + */ - if (timeout <= 0) - { - RESTORE_INTR (flags); - return -1; - } + for (timeout_val = 10000; timeout_val > 0; timeout_val--) + if (inb(PORT(HOST_CTRL)) & RX_READY) + break; - data = INB (PORT (HOST_DATA)); + if (timeout_val <= 0) { + splx(flags); + return -1; + } + data = inb(PORT(HOST_DATA)); - RESTORE_INTR (flags); + splx(flags); - return data; + return data; } static int -host_command1 (struct sscape_info *devc, int cmd) +host_command1(struct sscape_info * devc, int cmd) { - unsigned char buf[10]; + u_char buf[10]; - buf[0] = (unsigned char) (cmd & 0xff); + buf[0] = (u_char) (cmd & 0xff); - return host_write (devc, buf, 1); + return host_write(devc, buf, 1); } static int -host_command2 (struct sscape_info *devc, int cmd, int parm1) +host_command2(struct sscape_info * devc, int cmd, int parm1) { - unsigned char buf[10]; + u_char buf[10]; - buf[0] = (unsigned char) (cmd & 0xff); - buf[1] = (unsigned char) (parm1 & 0xff); + buf[0] = (u_char) (cmd & 0xff); + buf[1] = (u_char) (parm1 & 0xff); - return host_write (devc, buf, 2); + return host_write(devc, buf, 2); } static int -host_command3 (struct sscape_info *devc, int cmd, int parm1, int parm2) +host_command3(struct sscape_info * devc, int cmd, int parm1, int parm2) { - unsigned char buf[10]; + u_char buf[10]; - buf[0] = (unsigned char) (cmd & 0xff); - buf[1] = (unsigned char) (parm1 & 0xff); - buf[2] = (unsigned char) (parm2 & 0xff); + buf[0] = (u_char) (cmd & 0xff); + buf[1] = (u_char) (parm1 & 0xff); + buf[2] = (u_char) (parm2 & 0xff); - return host_write (devc, buf, 3); + return host_write(devc, buf, 3); } static void -set_mt32 (struct sscape_info *devc, int value) +set_mt32(struct sscape_info * devc, int value) { - host_open (devc); - host_command2 (devc, CMD_SET_MT32, - value ? 1 : 0); - if (host_read (devc) != CMD_ACK) - { - printk ("SNDSCAPE: Setting MT32 mode failed\n"); - } - host_close (devc); + host_open(devc); + host_command2(devc, CMD_SET_MT32, + value ? 1 : 0); + if (host_read(devc) != CMD_ACK) { + printf("SNDSCAPE: Setting MT32 mode failed\n"); + } + host_close(devc); +} + +static void +set_control(struct sscape_info * devc, int ctrl, int value) +{ + host_open(devc); + host_command3(devc, CMD_SET_CONTROL, ctrl, value); + if (host_read(devc) != CMD_ACK) { + printf("SNDSCAPE: Setting control (%d) failed\n", ctrl); + } + host_close(devc); } static int -get_board_type (struct sscape_info *devc) +get_board_type(struct sscape_info * devc) { - int tmp; - - host_open (devc); - if (!host_command1 (devc, CMD_GET_BOARD_TYPE)) - tmp = -1; - else - tmp = host_read (devc); - host_close (devc); - return tmp; + int tmp; + + host_open(devc); + if (!host_command1(devc, CMD_GET_BOARD_TYPE)) + tmp = -1; + else + tmp = host_read(devc); + host_close(devc); + return tmp; } void -sscapeintr (INT_HANDLER_PARMS (irq, dummy)) +sscapeintr(int irq) { - unsigned char bits, tmp; - static int debug = 0; + u_char bits, tmp; + static int debug = 0; - printk ("sscapeintr(0x%02x)\n", (bits = sscape_read (devc, GA_INTSTAT_REG))); - if (SOMEONE_WAITING (sscape_sleeper, sscape_sleep_flag)) - { - WAKE_UP (sscape_sleeper, sscape_sleep_flag); + printf("sscapeintr(0x%02x)\n", (bits = sscape_read(devc, GA_INTSTAT_REG))); + if ((sscape_sleep_flag.mode & WK_SLEEP)) { + sscape_sleep_flag.mode = WK_WAKEUP; + wakeup(sscape_sleeper); } - - if (bits & 0x02) /* Host interface interrupt */ - { - printk ("SSCAPE: Host interrupt, data=%02x\n", host_read (devc)); + if (bits & 0x02) { /* Host interface interrupt */ + printf("SSCAPE: Host interrupt, data=%02x\n", host_read(devc)); } - -#if (!defined(EXCLUDE_MPU401) || !defined(EXCLUDE_MPU_EMU)) && !defined(EXCLUDE_MIDI) - if (bits & 0x01) - { - mpuintr (INT_HANDLER_CALL (irq)); - if (debug++ > 10) /* Temporary debugging hack */ - { - sscape_write (devc, GA_INTENA_REG, 0x00); /* Disable all interrupts */ +#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) + if (bits & 0x01) { + mpuintr(irq); + if (debug++ > 10) { /* Temporary debugging hack */ + sscape_write(devc, GA_INTENA_REG, 0x00); /* Disable all interr. */ } } #endif - /* + /* * Acknowledge interrupts (toggle the interrupt bits) - */ - - tmp = sscape_read (devc, GA_INTENA_REG); - sscape_write (devc, GA_INTENA_REG, (~bits & 0x0e) | (tmp & 0xf1)); - -} - -static void -sscape_enable_intr (struct sscape_info *devc, unsigned intr_bits) -{ - unsigned char temp, orig; - - temp = orig = sscape_read (devc, GA_INTENA_REG); - temp |= intr_bits; - temp |= 0x80; /* Master IRQ enable */ - - if (temp == orig) - return; /* No change */ + */ - sscape_write (devc, GA_INTENA_REG, temp); + tmp = sscape_read(devc, GA_INTENA_REG); + sscape_write(devc, GA_INTENA_REG, (~bits & 0x0e) | (tmp & 0xf1)); } -static void -sscape_disable_intr (struct sscape_info *devc, unsigned intr_bits) -{ - unsigned char temp, orig; - - temp = orig = sscape_read (devc, GA_INTENA_REG); - temp &= ~intr_bits; - if ((temp & ~0x80) == 0x00) - temp = 0x00; /* Master IRQ disable */ - if (temp == orig) - return; /* No change */ - - sscape_write (devc, GA_INTENA_REG, temp); -} static void -do_dma (struct sscape_info *devc, int dma_chan, unsigned long buf, int blk_size, int mode) +do_dma(struct sscape_info * devc, int dma_chan, u_long buf, int blk_size, int mode) { - unsigned char temp; + u_char temp; - if (dma_chan != SSCAPE_DMA_A) - { - printk ("SSCAPE: Tried to use DMA channel != A. Why?\n"); - return; + if (dma_chan != SSCAPE_DMA_A) { + printf("SSCAPE: Tried to use DMA channel != A. Why?\n"); + return; } + DMAbuf_start_dma(devc->my_audiodev, buf, blk_size, mode); - DMAbuf_start_dma (devc->my_audiodev, - buf, - blk_size, mode); - - temp = devc->dma << 4; /* Setup DMA channel select bits */ - if (devc->dma <= 3) - temp |= 0x80; /* 8 bit DMA channel */ + temp = devc->dma << 4; /* Setup DMA channel select bits */ + if (devc->dma <= 3) + temp |= 0x80; /* 8 bit DMA channel */ - temp |= 1; /* Trigger DMA */ - sscape_write (devc, GA_DMAA_REG, temp); - temp &= 0xfe; /* Clear DMA trigger */ - sscape_write (devc, GA_DMAA_REG, temp); + temp |= 1; /* Trigger DMA */ + sscape_write(devc, GA_DMAA_REG, temp); + temp &= 0xfe; /* Clear DMA trigger */ + sscape_write(devc, GA_DMAA_REG, temp); } static int -verify_mpu (struct sscape_info *devc) +verify_mpu(struct sscape_info * devc) { - /* + /* * The SoundScape board could be in three modes (MPU, 8250 and host). * If the card is not in the MPU mode, enabling the MPU driver will * cause infinite loop (the driver believes that there is always some * received data in the buffer. - * + * * Detect this by looking if there are more than 10 received MIDI bytes * (0x00) in the buffer. - */ + */ - int i; + int i; - for (i = 0; i < 10; i++) - { - if (INB (devc->base + HOST_CTRL) & 0x80) - return 1; + for (i = 0; i < 10; i++) { + if (inb(devc->base + HOST_CTRL) & 0x80) + return 1; - if (INB (devc->base) != 0x00) - return 1; + if (inb(devc->base) != 0x00) + return 1; } - printk ("SoundScape: The device is not in the MPU-401 mode\n"); - return 0; + printf("SoundScape: The device is not in the MPU-401 mode\n"); + return 0; } static int -sscape_coproc_open (void *dev_info, int sub_device) +sscape_coproc_open(void *dev_info, int sub_device) { - if (sub_device == COPR_MIDI) - { - set_mt32 (devc, 0); - if (!verify_mpu (devc)) - return RET_ERROR (EIO); + if (sub_device == COPR_MIDI) { + set_mt32(devc, 0); + if (!verify_mpu(devc)) + return -(EIO); } - - return 0; + sscape_sleep_flag.aborting = 0; + sscape_sleep_flag.mode = WK_NONE; + return 0; } static void -sscape_coproc_close (void *dev_info, int sub_device) +sscape_coproc_close(void *dev_info, int sub_device) { - struct sscape_info *devc = dev_info; - unsigned long flags; + struct sscape_info *devc = dev_info; + u_long flags; - DISABLE_INTR (flags); - if (devc->dma_allocated) - { - sscape_write (devc, GA_DMAA_REG, 0x20); /* DMA channel disabled */ -#ifndef EXCLUDE_NATIVE_PCM - DMAbuf_close_dma (devc->my_audiodev); + flags = splhigh(); + if (devc->dma_allocated) { + sscape_write(devc, GA_DMAA_REG, 0x20); /* DMA channel disabled */ +#ifdef CONFIG_NATIVE_PCM #endif - devc->dma_allocated = 0; + devc->dma_allocated = 0; } - RESET_WAIT_QUEUE (sscape_sleeper, sscape_sleep_flag); - RESTORE_INTR (flags); + sscape_sleep_flag.aborting = 0; + sscape_sleep_flag.mode = WK_NONE; + splx(flags); - return; + return; } static void -sscape_coproc_reset (void *dev_info) +sscape_coproc_reset(void *dev_info) { } static int -sscape_download_boot (struct sscape_info *devc, unsigned char *block, int size, int flag) +sscape_download_boot(struct sscape_info * devc, u_char *block, int size, int flag) { - unsigned long flags; - unsigned char temp; - int done, timeout; - - if (flag & CPF_FIRST) - { - /* - * First block. Have to allocate DMA and to reset the board - * before continuing. - */ - - DISABLE_INTR (flags); - if (devc->dma_allocated == 0) - { -#ifndef EXCLUDE_NATIVE_PCM - if (DMAbuf_open_dma (devc->my_audiodev) < 0) - { - RESTORE_INTR (flags); - return 0; - } -#endif - - devc->dma_allocated = 1; + u_long flags; + u_char temp; + int done, timeout_val; + + if (flag & CPF_FIRST) { + /* + * First block. Have to allocate DMA and to reset the board + * before continuing. + */ + + flags = splhigh(); + if (devc->dma_allocated == 0) { + devc->dma_allocated = 1; } - RESTORE_INTR (flags); + splx(flags); - sscape_write (devc, GA_HMCTL_REG, - (temp = sscape_read (devc, GA_HMCTL_REG)) & 0x3f); /*Reset */ + sscape_write(devc, GA_HMCTL_REG, + (temp = sscape_read(devc, GA_HMCTL_REG)) & 0x3f); /* Reset */ - for (timeout = 10000; timeout > 0; timeout--) - sscape_read (devc, GA_HMCTL_REG); /* Delay */ + for (timeout_val = 10000; timeout_val > 0; timeout_val--) + sscape_read(devc, GA_HMCTL_REG); /* Delay */ - /* Take board out of reset */ - sscape_write (devc, GA_HMCTL_REG, - (temp = sscape_read (devc, GA_HMCTL_REG)) | 0x80); + /* Take board out of reset */ + sscape_write(devc, GA_HMCTL_REG, + (temp = sscape_read(devc, GA_HMCTL_REG)) | 0x80); } - - /* + /* * Transfer one code block using DMA - */ - memcpy (audio_devs[devc->my_audiodev]->dmap->raw_buf[0], block, size); - - DISABLE_INTR (flags); -/******** INTERRUPTS DISABLED NOW ********/ - do_dma (devc, SSCAPE_DMA_A, - audio_devs[devc->my_audiodev]->dmap->raw_buf_phys[0], - size, DMA_MODE_WRITE); - - /* - * Wait until transfer completes. - */ - RESET_WAIT_QUEUE (sscape_sleeper, sscape_sleep_flag); - done = 0; - timeout = 100; - while (!done && timeout-- > 0) - { - int resid; + */ + bcopy(block, audio_devs[devc->my_audiodev]->dmap_out->raw_buf, size); + + flags = splhigh(); + /******** INTERRUPTS DISABLED NOW ********/ + do_dma(devc, SSCAPE_DMA_A, + audio_devs[devc->my_audiodev]->dmap_out->raw_buf_phys, + size, 1); + + /* + * Wait until transfer completes. + */ + sscape_sleep_flag.aborting = 0; + sscape_sleep_flag.mode = WK_NONE; + done = 0; + timeout_val = 100; + while (!done && timeout_val-- > 0) { + int resid; + int chn; + sscape_sleeper = &chn; + DO_SLEEP(chn, sscape_sleep_flag, 1); - DO_SLEEP (sscape_sleeper, sscape_sleep_flag, 1); - clear_dma_ff (devc->dma); - if ((resid = get_dma_residue (devc->dma)) == 0) done = 1; } - RESTORE_INTR (flags); - if (!done) - return 0; + splx(flags); + if (!done) + return 0; - if (flag & CPF_LAST) - { - /* - * Take the board out of reset - */ - OUTB (0x00, PORT (HOST_CTRL)); - OUTB (0x00, PORT (MIDI_CTRL)); - - temp = sscape_read (devc, GA_HMCTL_REG); - temp |= 0x40; - sscape_write (devc, GA_HMCTL_REG, temp); /* Kickstart the board */ - - /* - * Wait until the ODB wakes up - */ - - DISABLE_INTR (flags); - done = 0; - timeout = 5 * HZ; - while (!done && timeout-- > 0) - { - DO_SLEEP (sscape_sleeper, sscape_sleep_flag, 1); - if (INB (PORT (HOST_DATA)) == 0xff) /* OBP startup acknowledge */ + if (flag & CPF_LAST) { + /* + * Take the board out of reset + */ + outb(PORT(HOST_CTRL), 0x00); + outb(PORT(MIDI_CTRL), 0x00); + + temp = sscape_read(devc, GA_HMCTL_REG); + temp |= 0x40; + sscape_write(devc, GA_HMCTL_REG, temp); /* Kickstart the board */ + + /* + * Wait until the ODB wakes up + */ + + flags = splhigh(); + done = 0; + timeout_val = 5 * hz; + while (!done && timeout_val-- > 0) { + int chn; + + sscape_sleeper = &chn; + DO_SLEEP(chn, sscape_sleep_flag, 1); + + if (inb(PORT(HOST_DATA)) == 0xff) /* OBP startup acknowledge */ done = 1; } - RESTORE_INTR (flags); - if (!done) - { - printk ("SoundScape: The OBP didn't respond after code download\n"); - return 0; + splx(flags); + if (!done) { + printf("SoundScape: The OBP didn't respond after code download\n"); + return 0; } + flags = splhigh(); + done = 0; + timeout_val = 5 * hz; + while (!done && timeout_val-- > 0) { + int chn; - DISABLE_INTR (flags); - done = 0; - timeout = 5 * HZ; - while (!done && timeout-- > 0) - { - DO_SLEEP (sscape_sleeper, sscape_sleep_flag, 1); - if (INB (PORT (HOST_DATA)) == 0xfe) /* Host startup acknowledge */ + sscape_sleeper = &chn; + DO_SLEEP(chn, sscape_sleep_flag, 1); + + if (inb(PORT(HOST_DATA)) == 0xfe) /* Host startup acknowledge */ done = 1; } - RESTORE_INTR (flags); - if (!done) - { - printk ("SoundScape: OBP Initialization failed.\n"); - return 0; + splx(flags); + if (!done) { + printf("SoundScape: OBP Initialization failed.\n"); + return 0; } + printf("SoundScape board of type %d initialized OK\n", + get_board_type(devc)); - printk ("SoundScape board of type %d initialized OK\n", - get_board_type (devc)); + set_control(devc, CTL_MASTER_VOL, 100); + set_control(devc, CTL_SYNTH_VOL, 100); #ifdef SSCAPE_DEBUG3 - /* - * Temporary debugging aid. Print contents of the registers after - * downloading the code. - */ - { - int i; + /* + * Temporary debugging aid. Print contents of the registers + * after downloading the code. + */ + { + int i; - for (i = 0; i < 13; i++) - printk ("I%d = %02x (new value)\n", i, sscape_read (devc, i)); - } + for (i = 0; i < 13; i++) + printf("I%d = %02x (new value)\n", i, sscape_read(devc, i)); + } #endif } - - return 1; + return 1; } static int -download_boot_block (void *dev_info, copr_buffer * buf) +download_boot_block(void *dev_info, copr_buffer * buf) { - if (buf->len <= 0 || buf->len > sizeof (buf->data)) - return RET_ERROR (EINVAL); + if (buf->len <= 0 || buf->len > sizeof(buf->data)) + return -(EINVAL); - if (!sscape_download_boot (devc, buf->data, buf->len, buf->flags)) - { - printk ("SSCAPE: Unable to load microcode block to the OBP.\n"); - return RET_ERROR (EIO); + if (!sscape_download_boot(devc, buf->data, buf->len, buf->flags)) { + printf("SSCAPE: Unable to load microcode block to the OBP.\n"); + return -(EIO); } - - return 0; + return 0; } static int -sscape_coproc_ioctl (void *dev_info, unsigned int cmd, unsigned int arg, int local) +sscape_coproc_ioctl(void *dev_info, u_int cmd, ioctl_arg arg, int local) { - switch (cmd) - { + switch (cmd) { case SNDCTL_COPR_RESET: - sscape_coproc_reset (dev_info); - return 0; - break; + sscape_coproc_reset(dev_info); + return 0; + break; case SNDCTL_COPR_LOAD: - { - copr_buffer *buf; - int err; - - buf = (copr_buffer *) KERNEL_MALLOC (sizeof (copr_buffer)); - IOCTL_FROM_USER ((char *) buf, (char *) arg, 0, sizeof (*buf)); - err = download_boot_block (dev_info, buf); - KERNEL_FREE (buf); - return err; - } - break; + { + copr_buffer *buf; + int err; + + buf = (copr_buffer *) malloc(sizeof(copr_buffer), M_TEMP, M_WAITOK); + if (buf == NULL) + return -(ENOSPC); + bcopy(&(((char *) arg)[0]), (char *) buf, sizeof(*buf)); + err = download_boot_block(dev_info, buf); + free(buf, M_TEMP); + return err; + } + break; default: - return RET_ERROR (EINVAL); + return -(EINVAL); } - return RET_ERROR (EINVAL); } static coproc_operations sscape_coproc_operations = { - "SoundScape M68K", - sscape_coproc_open, - sscape_coproc_close, - sscape_coproc_ioctl, - sscape_coproc_reset, - &dev_info + "SoundScape M68K", + sscape_coproc_open, + sscape_coproc_close, + sscape_coproc_ioctl, + sscape_coproc_reset, + &dev_info }; static int -sscape_audio_open (int dev, int mode) +sscape_audio_open(int dev, int mode) { - unsigned long flags; - sscape_info *devc = (sscape_info *) audio_devs[dev]->devc; + u_long flags; + sscape_info *devc = (sscape_info *) audio_devs[dev]->devc; - DISABLE_INTR (flags); - if (devc->opened) - { - RESTORE_INTR (flags); - return RET_ERROR (EBUSY); + flags = splhigh(); + if (devc->opened) { + splx(flags); + return -(EBUSY); } - - if (devc->dma_allocated == 0) + devc->opened = 1; + splx(flags); +#ifdef SSCAPE_DEBUG4 + /* + * Temporary debugging aid. Print contents of the registers when the + * device is opened. + */ { - int err; - - if ((err = DMAbuf_open_dma (devc->my_audiodev)) < 0) - { - RESTORE_INTR (flags); - return err; - } + int i; - devc->dma_allocated = 1; + for (i = 0; i < 13; i++) + printf("I%d = %02x\n", i, sscape_read(devc, i)); } - - devc->opened = 1; - RESTORE_INTR (flags); -#ifdef SSCAPE_DEBUG4 - /* - * Temporary debugging aid. Print contents of the registers - * when the device is opened. - */ - { - int i; - - for (i = 0; i < 13; i++) - printk ("I%d = %02x\n", i, sscape_read (devc, i)); - } #endif - return 0; + return 0; } static void -sscape_audio_close (int dev) +sscape_audio_close(int dev) { - unsigned long flags; - sscape_info *devc = (sscape_info *) audio_devs[dev]->devc; + u_long flags; + sscape_info *devc = (sscape_info *) audio_devs[dev]->devc; - DEB (printk ("sscape_audio_close(void)\n")); + DEB(printf("sscape_audio_close(void)\n")); - DISABLE_INTR (flags); + flags = splhigh(); - if (devc->dma_allocated) - { - sscape_write (devc, GA_DMAA_REG, 0x20); /* DMA channel disabled */ - DMAbuf_close_dma (dev); - devc->dma_allocated = 0; - } - devc->opened = 0; + devc->opened = 0; - RESTORE_INTR (flags); + splx(flags); } static int -set_speed (sscape_info * devc, int arg) +set_speed(sscape_info * devc, int arg) { - return 8000; + return 8000; } static int -set_channels (sscape_info * devc, int arg) +set_channels(sscape_info * devc, int arg) { - return 1; + return 1; } static int -set_format (sscape_info * devc, int arg) +set_format(sscape_info * devc, int arg) { - return AFMT_U8; + return AFMT_U8; } static int -sscape_audio_ioctl (int dev, unsigned int cmd, unsigned int arg, int local) +sscape_audio_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) { - sscape_info *devc = (sscape_info *) audio_devs[dev]->devc; + sscape_info *devc = (sscape_info *) audio_devs[dev]->devc; - switch (cmd) - { + switch (cmd) { case SOUND_PCM_WRITE_RATE: - if (local) - return set_speed (devc, arg); - return IOCTL_OUT (arg, set_speed (devc, IOCTL_IN (arg))); + if (local) + return set_speed(devc, (int) arg); + return *(int *) arg = set_speed(devc, (*(int *) arg)); case SOUND_PCM_READ_RATE: - if (local) - return 8000; - return IOCTL_OUT (arg, 8000); + if (local) + return 8000; + return *(int *) arg = 8000; case SNDCTL_DSP_STEREO: - if (local) - return set_channels (devc, arg + 1) - 1; - return IOCTL_OUT (arg, set_channels (devc, IOCTL_IN (arg) + 1) - 1); + if (local) + return set_channels(devc, (int) arg + 1) - 1; + return *(int *) arg = set_channels(devc, (*(int *) arg) + 1) - 1; case SOUND_PCM_WRITE_CHANNELS: - if (local) - return set_channels (devc, arg); - return IOCTL_OUT (arg, set_channels (devc, IOCTL_IN (arg))); + if (local) + return set_channels(devc, (int) arg); + return *(int *) arg = set_channels(devc, (*(int *) arg)); case SOUND_PCM_READ_CHANNELS: - if (local) - return 1; - return IOCTL_OUT (arg, 1); + if (local) + return 1; + return *(int *) arg = 1; case SNDCTL_DSP_SAMPLESIZE: - if (local) - return set_format (devc, arg); - return IOCTL_OUT (arg, set_format (devc, IOCTL_IN (arg))); + if (local) + return set_format(devc, (int) arg); + return *(int *) arg = set_format(devc, (*(int *) arg)); case SOUND_PCM_READ_BITS: - if (local) - return 8; - return IOCTL_OUT (arg, 8); + if (local) + return 8; + return *(int *) arg = 8; default:; } - return RET_ERROR (EINVAL); + return -(EINVAL); } static void -sscape_audio_output_block (int dev, unsigned long buf, int count, int intrflag, int dma_restart) +sscape_audio_output_block(int dev, u_long buf, int count, int intrflag, int dma_restart) { } static void -sscape_audio_start_input (int dev, unsigned long buf, int count, int intrflag, int dma_restart) +sscape_audio_start_input(int dev, u_long buf, int count, int intrflag, int dma_restart) { } static int -sscape_audio_prepare_for_input (int dev, int bsize, int bcount) +sscape_audio_prepare_for_input(int dev, int bsize, int bcount) { - return 0; + return 0; } static int -sscape_audio_prepare_for_output (int dev, int bsize, int bcount) +sscape_audio_prepare_for_output(int dev, int bsize, int bcount) { - return 0; + return 0; } static void -sscape_audio_halt (int dev) +sscape_audio_halt(int dev) { } static void -sscape_audio_reset (int dev) +sscape_audio_reset(int dev) { - sscape_audio_halt (dev); + sscape_audio_halt(dev); } static struct audio_operations sscape_audio_operations = { - "Ensoniq SoundScape channel A", - 0, - AFMT_U8 | AFMT_S16_LE, - NULL, - sscape_audio_open, - sscape_audio_close, - sscape_audio_output_block, - sscape_audio_start_input, - sscape_audio_ioctl, - sscape_audio_prepare_for_input, - sscape_audio_prepare_for_output, - sscape_audio_reset, - sscape_audio_halt, - NULL, - NULL + "Not functional", + 0, + AFMT_U8 | AFMT_S16_LE, + NULL, + sscape_audio_open, + sscape_audio_close, + sscape_audio_output_block, + sscape_audio_start_input, + sscape_audio_ioctl, + sscape_audio_prepare_for_input, + sscape_audio_prepare_for_output, + sscape_audio_reset, + sscape_audio_halt, + NULL, + NULL }; -long -attach_sscape (long mem_start, struct address_info *hw_config) +static int sscape_detected = 0; + +void +attach_sscape(struct address_info * hw_config) { - int my_dev; + int my_dev; #ifndef SSCAPE_REGS - /* + /* * Config register values for Spea/V7 Media FX and Ensoniq S-2000. - * These values are card - * dependent. If you have another SoundScape based card, you have to - * find the correct values. Do the following: - * - Compile this driver with SSCAPE_DEBUG1 defined. - * - Shut down and power off your machine. - * - Boot with DOS so that the SSINIT.EXE program is run. - * - Warm boot to {Linux|SYSV|BSD} and write down the lines displayed - * when detecting the SoundScape. - * - Modify the following list to use the values printed during boot. - * Undefine the SSCAPE_DEBUG1 - */ + * These values are card dependent. If you have another SoundScape + * based card, you have to find the correct values. Do the following: + * - Compile this driver with SSCAPE_DEBUG1 defined. - Shut down and + * power off your machine. - Boot with DOS so that the SSINIT.EXE + * program is run. - Warm boot to {Linux|SYSV|BSD} and write down the + * lines displayed when detecting the SoundScape. - Modify the + * following list to use the values printed during boot. Undefine the + * SSCAPE_DEBUG1 + */ #define SSCAPE_REGS { \ /* I0 */ 0x00, \ 0xf0, /* Note! Ignored. Set always to 0xf0 */ \ @@ -833,288 +778,279 @@ attach_sscape (long mem_start, struct address_info *hw_config) 0x10, \ 0x00, \ 0x2e, /* I7 MEM config A. Likely to vary between models */ \ - 0x00, /* I8 MEM config A. Likely to vary between models */ \ + 0x00, /* I8 MEM config B. Likely to vary between models */ \ /* I9 */ 0x40 /* Ignored */ \ } #endif - unsigned long flags; - static unsigned char regs[10] = SSCAPE_REGS; + u_long flags; + static u_char regs[10] = SSCAPE_REGS; - int i, irq_bits = 0xff; + int i, irq_bits = 0xff; - if (!probe_sscape (hw_config)) - return mem_start; + if (sscape_detected != hw_config->io_base) + return; - printk (" <Ensoniq Soundscape>"); + if (old_hardware) { + valid_interrupts = valid_interrupts_old; + conf_printf("Ensoniq Soundscape (old)", hw_config); + } else + conf_printf("Ensoniq Soundscape", hw_config); - for (i = 0; i < sizeof (valid_interrupts); i++) - if (hw_config->irq == valid_interrupts[i]) - { - irq_bits = i; - break; - } - - if (hw_config->irq > 15 || (regs[4] = irq_bits == 0xff)) - { - printk ("Invalid IRQ%d\n", hw_config->irq); - return mem_start; + for (i = 0; i < sizeof(valid_interrupts); i++) + if (hw_config->irq == valid_interrupts[i]) { + irq_bits = i; + break; + } + if (hw_config->irq > 15 || (regs[4] = irq_bits == 0xff)) { + printf("Invalid IRQ%d\n", hw_config->irq); + return; } + flags = splhigh(); + + for (i = 1; i < 10; i++) + switch (i) { + case 1: /* Host interrupt enable */ + sscape_write(devc, i, 0xf0); /* All interrupts enabled */ + break; + + case 2: /* DMA A status/trigger register */ + case 3: /* DMA B status/trigger register */ + sscape_write(devc, i, 0x20); /* DMA channel disabled */ + break; + + case 4: /* Host interrupt config reg */ + sscape_write(devc, i, 0xf0 | (irq_bits << 2) | irq_bits); + break; + + case 5: /* Don't destroy CD-ROM DMA config bits (0xc0) */ + sscape_write(devc, i, (regs[i] & 0x3f) | + (sscape_read(devc, i) & 0xc0)); + break; + + case 6: /* CD-ROM config. Don't touch. */ + break; + + case 9: /* Master control reg. Don't modify CR-ROM + * bits. Disable SB emul */ + sscape_write(devc, i, (sscape_read(devc, i) & 0xf0) | 0x00); + break; + + default: + sscape_write(devc, i, regs[i]); + } - DISABLE_INTR (flags); - - for (i = 1; i < 10; i++) - switch (i) - { - case 1: /* Host interrupt enable */ - sscape_write (devc, i, 0xf0); /* All interrupts enabled */ - break; - - case 2: /* DMA A status/trigger register */ - case 3: /* DMA B status/trigger register */ - sscape_write (devc, i, 0x20); /* DMA channel disabled */ - break; - - case 4: /* Host interrupt config reg */ - sscape_write (devc, i, 0xf0 | (irq_bits << 2) | irq_bits); - break; - - case 5: /* Don't destroy CD-ROM DMA config bits (0xc0) */ - sscape_write (devc, i, (regs[i] & 0x3f) | - (sscape_read (devc, i) & 0x0c)); - break; - - case 6: /* CD-ROM config. Don't touch. */ - break; - - case 9: /* Master control reg. Don't modify CR-ROM bits. Disable SB emul */ - sscape_write (devc, i, - (sscape_read (devc, i) & 0xf0) | 0x00); - break; - - default: - sscape_write (devc, i, regs[i]); - } - - RESTORE_INTR (flags); + splx(flags); #ifdef SSCAPE_DEBUG2 - /* + /* * Temporary debugging aid. Print contents of the registers after * changing them. - */ - { - int i; + */ + { + int i; - for (i = 0; i < 13; i++) - printk ("I%d = %02x (new value)\n", i, sscape_read (devc, i)); - } + for (i = 0; i < 13; i++) + printf("I%d = %02x (new value)\n", i, sscape_read(devc, i)); + } #endif -#if !defined(EXCLUDE_MIDI) && !defined(EXCLUDE_MPU_EMU) - hw_config->always_detect = 1; - if (probe_mpu401 (hw_config)) +#if defined(CONFIG_MIDI) && defined(CONFIG_MPU_EMU) + if (probe_mpu401(hw_config)) + hw_config->always_detect = 1; { - int prev_devs; + int prev_devs; - prev_devs = num_midis; - mem_start = attach_mpu401 (mem_start, hw_config); + prev_devs = num_midis; + attach_mpu401(hw_config); - if (num_midis == (prev_devs + 1)) /* The MPU driver installed itself */ - midi_devs[prev_devs]->coproc = &sscape_coproc_operations; + if (num_midis == (prev_devs + 1)) /* The MPU driver + * installed itself */ + midi_devs[prev_devs]->coproc = &sscape_coproc_operations; } #endif #ifndef EXCLUDE_NATIVE_PCM - /* Not supported yet */ - -#ifndef EXCLUDE_AUDIO - if (num_audiodevs < MAX_AUDIO_DEV) - { - audio_devs[my_dev = num_audiodevs++] = &sscape_audio_operations; - audio_devs[my_dev]->dmachan = hw_config->dma; - audio_devs[my_dev]->buffcount = 1; - audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; - audio_devs[my_dev]->devc = devc; - devc->my_audiodev = my_dev; - devc->opened = 0; - audio_devs[my_dev]->coproc = &sscape_coproc_operations; - if (snd_set_irq_handler (hw_config->irq, sscapeintr, "SoundScape") < 0) - printk ("Error: Can't allocate IRQ for SoundScape\n"); - - sscape_write (devc, GA_INTENA_REG, 0x80); /* Master IRQ enable */ - } - else - printk ("SoundScape: More than enough audio devices detected\n"); + /* Not supported yet */ + +#ifdef CONFIG_AUDIO + if (num_audiodevs < MAX_AUDIO_DEV) { + audio_devs[my_dev = num_audiodevs++] = &sscape_audio_operations; + audio_devs[my_dev]->dmachan1 = hw_config->dma; + audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; + audio_devs[my_dev]->devc = devc; + devc->my_audiodev = my_dev; + devc->opened = 0; + audio_devs[my_dev]->coproc = &sscape_coproc_operations; + if (snd_set_irq_handler(hw_config->irq, sscapeintr, devc->osp) < 0) + printf("Error: Can't allocate IRQ for SoundScape\n"); + sscape_write(devc, GA_INTENA_REG, 0x80); /* Master IRQ enable */ + } else + printf("SoundScape: More than enough audio devices detected\n"); #endif #endif - devc->ok = 1; - return mem_start; + devc->ok = 1; + devc->failed = 0; + return; } int -probe_sscape (struct address_info *hw_config) +probe_sscape(struct address_info * hw_config) { - unsigned char save; - - devc->base = hw_config->io_base; - devc->irq = hw_config->irq; - devc->dma = hw_config->dma; - - /* - * First check that the address register of "ODIE" is - * there and that it has exactly 4 writeable bits. - * First 4 bits - */ - if ((save = INB (PORT (ODIE_ADDR))) & 0xf0) - return 0; + u_char save; - OUTB (0x00, PORT (ODIE_ADDR)); - if (INB (PORT (ODIE_ADDR)) != 0x00) - return 0; + devc->failed = 1; + devc->base = hw_config->io_base; + devc->irq = hw_config->irq; + devc->dma = hw_config->dma; + devc->osp = hw_config->osp; - OUTB (0xff, PORT (ODIE_ADDR)); - if (INB (PORT (ODIE_ADDR)) != 0x0f) - return 0; + if (sscape_detected != 0 && sscape_detected != hw_config->io_base) + return 0; + + /* + * First check that the address register of "ODIE" is there and that + * it has exactly 4 writeable bits. First 4 bits + */ + if ((save = inb(PORT(ODIE_ADDR))) & 0xf0) + return 0; + + outb(PORT(ODIE_ADDR), 0x00); + if (inb(PORT(ODIE_ADDR)) != 0x00) + return 0; + + outb(PORT(ODIE_ADDR), 0xff); + if (inb(PORT(ODIE_ADDR)) != 0x0f) + return 0; - OUTB (save, PORT (ODIE_ADDR)); + outb(PORT(ODIE_ADDR), save); - /* + /* * Now verify that some indirect registers return zero on some bits. - * This may break the driver with some future revisions of "ODIE" but... - */ + * This may break the driver with some future revisions of "ODIE" + * but... + */ - if (sscape_read (devc, 0) & 0x0c) - return 0; + if (sscape_read(devc, 0) & 0x0c) + return 0; - if (sscape_read (devc, 1) & 0x0f) - return 0; + if (sscape_read(devc, 1) & 0x0f) + return 0; - if (sscape_read (devc, 5) & 0x0f) - return 0; + if (sscape_read(devc, 5) & 0x0f) + return 0; #ifdef SSCAPE_DEBUG1 - /* + /* * Temporary debugging aid. Print contents of the registers before * changing them. - */ - { - int i; + */ + { + int i; - for (i = 0; i < 13; i++) - printk ("I%d = %02x (old value)\n", i, sscape_read (devc, i)); - } + for (i = 0; i < 13; i++) + printf("I%d = %02x (old value)\n", i, sscape_read(devc, i)); + } #endif - return 1; + if (old_hardware) { /* Check that it's really an old Spea/Reveal card. */ + u_char tmp; + int cc; + + if (!((tmp = sscape_read(devc, GA_HMCTL_REG)) & 0xc0)) { + sscape_write(devc, GA_HMCTL_REG, tmp | 0x80); + for (cc = 0; cc < 200000; ++cc) + inb(devc->base + ODIE_ADDR); + } else + old_hardware = 0; + } + if (0) { + printf("sscape.c: Can't allocate DMA channel\n"); + return 0; + } + sscape_detected = hw_config->io_base; + + return 1; } int -probe_ss_ms_sound (struct address_info *hw_config) +probe_ss_mss(struct address_info * hw_config) { - int i, irq_bits = 0xff; + int i, irq_bits = 0xff; - if (devc->ok == 0) - { - printk ("SoundScape: Invalid initialization order.\n"); - return 0; - } + if (devc->failed) + return 0; - for (i = 0; i < sizeof (valid_interrupts); i++) - if (hw_config->irq == valid_interrupts[i]) - { - irq_bits = i; - break; - } -#ifdef REVEAL_SPEA - { - int tmp, status = 0; - int cc; - - if (!((tmp = sscape_read (devc, GA_HMCTL_REG)) & 0xc0)) - { - sscape_write (devc, GA_HMCTL_REG, tmp | 0x80); - for (cc = 0; cc < 200000; ++cc) - INB (devc->base + ODIE_ADDR); - } - } -#endif - - if (hw_config->irq > 15 || irq_bits == 0xff) - { - printk ("SoundScape: Invalid MSS IRQ%d\n", hw_config->irq); - return 0; + if (devc->ok == 0) { + printf("SoundScape: Invalid initialization order.\n"); + return 0; } - - return ad1848_detect (hw_config->io_base); + for (i = 0; i < sizeof(valid_interrupts); i++) + if (hw_config->irq == valid_interrupts[i]) { + irq_bits = i; + break; + } + if (hw_config->irq > 15 || irq_bits == 0xff) { + printf("SoundScape: Invalid MSS IRQ%d\n", hw_config->irq); + return 0; + } + return ad1848_detect(hw_config->io_base, NULL, hw_config->osp); } -long -attach_ss_ms_sound (long mem_start, struct address_info *hw_config) +void +attach_ss_mss(struct address_info * hw_config) { - /* - * This routine configures the SoundScape card for use with the - * Win Sound System driver. The AD1848 codec interface uses the CD-ROM + /* + * This routine configures the SoundScape card for use with the Win + * Sound System driver. The AD1848 codec interface uses the CD-ROM * config registers of the "ODIE". - */ - - int i, irq_bits = 0xff; + */ -#ifdef EXCLUDE_NATIVE_PCM - int prev_devs = num_audiodevs; + int i, irq_bits = 0xff; +#ifndef CONFIG_NATIVE_PCM + int prev_devs = num_audiodevs; #endif - /* + /* * Setup the DMA polarity. - */ - sscape_write (devc, GA_DMACFG_REG, 0x50); + */ + sscape_write(devc, GA_DMACFG_REG, 0x50); - /* + /* * Take the gate-arry off of the DMA channel. - */ - sscape_write (devc, GA_DMAB_REG, 0x20); + */ + sscape_write(devc, GA_DMAB_REG, 0x20); - /* + /* * Init the AD1848 (CD-ROM) config reg. - */ - - for (i = 0; i < sizeof (valid_interrupts); i++) - if (hw_config->irq == valid_interrupts[i]) - { - irq_bits = i; - break; - } - - sscape_write (devc, GA_CDCFG_REG, 0x89 | (hw_config->dma << 4) | - (irq_bits << 1)); - - if (hw_config->irq == devc->irq) - printk ("SoundScape: Warning! The WSS mode can't share IRQ with MIDI\n"); + */ - ad1848_init ("SoundScape", hw_config->io_base, - hw_config->irq, - hw_config->dma, - hw_config->dma); - -#ifdef EXCLUDE_NATIVE_PCM - if (num_audiodevs == (prev_devs + 1)) /* The AD1848 driver installed itself */ - audio_devs[prev_devs]->coproc = &sscape_coproc_operations; -#endif -#ifdef SSCAPE_DEBUG5 - /* - * Temporary debugging aid. Print contents of the registers - * after the AD1848 device has been initialized. - */ - { - int i; - - for (i = 0; i < 13; i++) - printk ("I%d = %02x\n", i, sscape_read (devc, i)); - } + for (i = 0; i < sizeof(valid_interrupts); i++) + if (hw_config->irq == valid_interrupts[i]) { + irq_bits = i; + break; + } + sscape_write(devc, GA_CDCFG_REG, 0x89 | (hw_config->dma << 4) | + (irq_bits << 1)); + + if (hw_config->irq == devc->irq) + printf("SoundScape: Warning! WSS mode can't share IRQ with MIDI\n"); + + ad1848_init("SoundScape", hw_config->io_base, + hw_config->irq, + hw_config->dma, + hw_config->dma, + 0, + devc->osp); + +#ifndef CONFIG_NATIVE_PCM + /* Check if the AD1848 driver installed itself */ + if (num_audiodevs == (prev_devs + 1)) + audio_devs[prev_devs]->coproc = &sscape_coproc_operations; #endif - return mem_start; + return; } #endif diff --git a/sys/i386/isa/sound/sys_timer.c b/sys/i386/isa/sound/sys_timer.c index 74b42b2..a605dfc 100644 --- a/sys/i386/isa/sound/sys_timer.c +++ b/sys/i386/isa/sound/sys_timer.c @@ -1,11 +1,11 @@ /* * sound/sys_timer.c - * - * The default timer for the Level 2 sequencer interface - * Uses the (100HZ) timer of kernel. - * + * + * The default timer for the Level 2 sequencer interface. + * Uses the (100hz) timer of kernel. + * * Copyright by Hannu Savolainen 1993 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -13,7 +13,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -25,280 +25,252 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * */ #define SEQUENCER_C #include <i386/isa/sound/sound_config.h> -#ifdef CONFIGURE_SOUNDCARD +#if NSND > 0 -#ifndef EXCLUDE_SEQUENCER +#if defined(CONFIG_SEQUENCER) static volatile int opened = 0, tmr_running = 0; static volatile time_t tmr_offs, tmr_ctr; -static volatile unsigned long ticks_offs; +static volatile u_long ticks_offs; static volatile int curr_tempo, curr_timebase; -static volatile unsigned long curr_ticks; -static volatile unsigned long next_event_time; -static unsigned long prev_event_time; +static volatile u_long curr_ticks; +static volatile u_long next_event_time; +static u_long prev_event_time; -static void poll_def_tmr (void *dummy); +static void poll_def_tmr(void *dummy); -DEFINE_TIMER (def_tmr, poll_def_tmr); - -static unsigned long -tmr2ticks (int tmr_value) +static u_long +tmr2ticks(int tmr_value) { - /* - * Convert system timer ticks (HZ) to MIDI ticks - */ - - unsigned long tmp; - unsigned long scale; - - tmp = (tmr_value * 1000) / HZ; /* Convert to msecs */ - - scale = (60 * 1000) / (curr_tempo * curr_timebase); /* msecs per MIDI tick */ + /* + * Convert system timer ticks (hz) to MIDI ticks (divide # of MIDI + * ticks/minute by # of system ticks/minute). + */ - return (tmp + (scale / 2)) / scale; + return ((tmr_value * curr_tempo * curr_timebase) + (30 * hz)) / (60 * hz); } static void -poll_def_tmr (void *dummy) +poll_def_tmr(void *dummy) { - if (opened) - { - ACTIVATE_TIMER (def_tmr, poll_def_tmr, 1); + if (opened) { - if (tmr_running) - { - tmr_ctr++; - curr_ticks = ticks_offs + tmr2ticks (tmr_ctr); + timeout( poll_def_tmr, 0, 1);; + + if (tmr_running) { + tmr_ctr++; + curr_ticks = ticks_offs + tmr2ticks(tmr_ctr); - if (curr_ticks >= next_event_time) - { - next_event_time = 0xffffffff; - sequencer_timer (NULL); + if (curr_ticks >= next_event_time) { + next_event_time = 0xffffffff; + sequencer_timer(0); } } } } static void -tmr_reset (void) +tmr_reset(void) { - unsigned long flags; - - DISABLE_INTR (flags); - tmr_offs = 0; - ticks_offs = 0; - tmr_ctr = 0; - next_event_time = 0xffffffff; - prev_event_time = 0; - curr_ticks = 0; - RESTORE_INTR (flags); + u_long flags; + + flags = splhigh(); + tmr_offs = 0; + ticks_offs = 0; + tmr_ctr = 0; + next_event_time = 0xffffffff; + prev_event_time = 0; + curr_ticks = 0; + splx(flags); } static int -def_tmr_open (int dev, int mode) +def_tmr_open(int dev, int mode) { - if (opened) - return RET_ERROR (EBUSY); + if (opened) + return -(EBUSY); - tmr_reset (); - curr_tempo = 60; - curr_timebase = HZ; - opened = 1; + tmr_reset(); + curr_tempo = 60; + curr_timebase = hz; + opened = 1; - ACTIVATE_TIMER (def_tmr, poll_def_tmr, 1); + timeout( poll_def_tmr, 0, 1);; - return 0; + return 0; } static void -def_tmr_close (int dev) +def_tmr_close(int dev) { - opened = tmr_running = 0; + opened = tmr_running = 0; } static int -def_tmr_event (int dev, unsigned char *event) +def_tmr_event(int dev, u_char *event) { - unsigned char cmd = event[1]; - unsigned long parm = *(int *) &event[4]; + u_char cmd = event[1]; + u_long parm = *(int *) &event[4]; - switch (cmd) - { + switch (cmd) { case TMR_WAIT_REL: - parm += prev_event_time; + parm += prev_event_time; case TMR_WAIT_ABS: - if (parm > 0) - { - long time; + if (parm > 0) { + long time; - if (parm <= curr_ticks) /* It's the time */ - return TIMER_NOT_ARMED; + if (parm <= curr_ticks) /* It's the time */ + return TIMER_NOT_ARMED; - time = parm; - next_event_time = prev_event_time = time; + time = parm; + next_event_time = prev_event_time = time; - return TIMER_ARMED; + return TIMER_ARMED; } - break; + break; case TMR_START: - tmr_reset (); - tmr_running = 1; - break; + tmr_reset(); + tmr_running = 1; + break; case TMR_STOP: - tmr_running = 0; - break; + tmr_running = 0; + break; case TMR_CONTINUE: - tmr_running = 1; - break; + tmr_running = 1; + break; case TMR_TEMPO: - if (parm) - { - if (parm < 8) - parm = 8; - if (parm > 250) - parm = 250; - tmr_offs = tmr_ctr; - ticks_offs += tmr2ticks (tmr_ctr); - tmr_ctr = 0; - curr_tempo = parm; + if (parm) { + RANGE (parm, 8, 360) ; + tmr_offs = tmr_ctr; + ticks_offs += tmr2ticks(tmr_ctr); + tmr_ctr = 0; + curr_tempo = parm; } - break; + break; case TMR_ECHO: - seq_copy_to_input (event, 8); - break; + seq_copy_to_input(event, 8); + break; default:; } - return TIMER_NOT_ARMED; + return TIMER_NOT_ARMED; } -static unsigned long -def_tmr_get_time (int dev) +static u_long +def_tmr_get_time(int dev) { - if (!opened) - return 0; + if (!opened) + return 0; - return curr_ticks; + return curr_ticks; } static int -def_tmr_ioctl (int dev, - unsigned int cmd, unsigned int arg) +def_tmr_ioctl(int dev, u_int cmd, ioctl_arg arg) { - switch (cmd) - { + switch (cmd) { case SNDCTL_TMR_SOURCE: - return IOCTL_OUT (arg, TMR_INTERNAL); - break; + return *(int *) arg = TMR_INTERNAL; + break; case SNDCTL_TMR_START: - tmr_reset (); - tmr_running = 1; - return 0; - break; + tmr_reset(); + tmr_running = 1; + return 0; + break; case SNDCTL_TMR_STOP: - tmr_running = 0; - return 0; - break; + tmr_running = 0; + return 0; + break; case SNDCTL_TMR_CONTINUE: - tmr_running = 1; - return 0; - break; + tmr_running = 1; + return 0; + break; case SNDCTL_TMR_TIMEBASE: - { - int val = IOCTL_IN (arg); - - if (val) - { - if (val < 1) - val = 1; - if (val > 1000) - val = 1000; - curr_timebase = val; - } - - return IOCTL_OUT (arg, curr_timebase); - } - break; + { + int val = (*(int *) arg); - case SNDCTL_TMR_TEMPO: - { - int val = IOCTL_IN (arg); - - if (val) - { - if (val < 8) - val = 8; - if (val > 250) - val = 250; - tmr_offs = tmr_ctr; - ticks_offs += tmr2ticks (tmr_ctr); - tmr_ctr = 0; - curr_tempo = val; - } + if (val) { + RANGE (val, 1, 1000) ; + curr_timebase = val; + } + return *(int *) arg = curr_timebase; + } + break; - return IOCTL_OUT (arg, curr_tempo); - } - break; + case SNDCTL_TMR_TEMPO: + { + int val = (*(int *) arg); + + if (val) { + RANGE (val, 8, 250) ; + tmr_offs = tmr_ctr; + ticks_offs += tmr2ticks(tmr_ctr); + tmr_ctr = 0; + curr_tempo = val; + } + return *(int *) arg = curr_tempo; + } + break; case SNDCTL_SEQ_CTRLRATE: - if (IOCTL_IN (arg) != 0) /* Can't change */ - return RET_ERROR (EINVAL); + if ((*(int *) arg) != 0) /* Can't change */ + return -(EINVAL); - return IOCTL_OUT (arg, ((curr_tempo * curr_timebase) + 30) / 60); - break; + return *(int *) arg = ((curr_tempo * curr_timebase) + 30) / 60; + break; case SNDCTL_TMR_METRONOME: - /* NOP */ - break; + /* NOP */ + break; default:; } - return RET_ERROR (EINVAL); + return -(EINVAL); } static void -def_tmr_arm (int dev, long time) +def_tmr_arm(int dev, long time) { - if (time < 0) - time = curr_ticks + 1; - else if (time <= curr_ticks) /* It's the time */ - return; + if (time < 0) + time = curr_ticks + 1; + else if (time <= curr_ticks) /* It's the time */ + return; - next_event_time = prev_event_time = time; + next_event_time = prev_event_time = time; - return; + return; } struct sound_timer_operations default_sound_timer = { - {"System Timer", 0}, - 0, /* Priority */ - 0, /* Local device link */ - def_tmr_open, - def_tmr_close, - def_tmr_event, - def_tmr_get_time, - def_tmr_ioctl, - def_tmr_arm + {"System clock", 0}, + 0, /* Priority */ + 0, /* Local device link */ + def_tmr_open, + def_tmr_close, + def_tmr_event, + def_tmr_get_time, + def_tmr_ioctl, + def_tmr_arm }; #endif -#endif +#endif /* NSND > 0 */ diff --git a/sys/i386/isa/sound/trix.c b/sys/i386/isa/sound/trix.c index 21ca20a..818ad5f 100644 --- a/sys/i386/isa/sound/trix.c +++ b/sys/i386/isa/sound/trix.c @@ -1,11 +1,10 @@ /* * sound/trix.c - * - * Low level driver for the MediaTriX AudioTriX Pro - * (MT-0002-PC Control Chip) - * + * + * Low level driver for the MediaTriX AudioTriX Pro (MT-0002-PC Control Chip) + * * Copyright by Hannu Savolainen 1995 - * + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -13,7 +12,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -25,299 +24,345 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * */ #include <i386/isa/sound/sound_config.h> -#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_TRIX) +#if NTRIX > 0 #ifdef INCLUDE_TRIX_BOOT #include <i386/isa/sound/trix_boot.h> #endif +#if (NSB > 0) +extern int sb_no_recording; +#endif + static int kilroy_was_here = 0; /* Don't detect twice */ static int sb_initialized = 0; -static int mpu_initialized = 0; -static unsigned char -trix_read (int addr) +static sound_os_info *trix_osp = NULL; + +static u_char +trix_read(int addr) { - OUTB ((unsigned char) addr, 0x390); /* MT-0002-PC ASIC address */ - return INB (0x391); /* MT-0002-PC ASIC data */ + outb(0x390, (u_char) addr); /* MT-0002-PC ASIC address */ + return inb(0x391); /* MT-0002-PC ASIC data */ } static void -trix_write (int addr, int data) +trix_write(int addr, int data) { - OUTB ((unsigned char) addr, 0x390); /* MT-0002-PC ASIC address */ - OUTB ((unsigned char) data, 0x391); /* MT-0002-PC ASIC data */ + outb(0x390, (u_char) addr); /* MT-0002-PC ASIC address */ + outb(0x391, (u_char) data); /* MT-0002-PC ASIC data */ } static void -download_boot (int base) +download_boot(int base) { - int i = 0, n = sizeof (trix_boot); - - trix_write (0xf8, 0x00); /* ??????? */ - OUTB (0x01, base + 6); /* Clear the internal data pointer */ - OUTB (0x00, base + 6); /* Restart */ - - /* - * Write the boot code to the RAM upload/download register. - * Each write increments the internal data pointer. - */ - OUTB (0x01, base + 6); /* Clear the internal data pointer */ - OUTB (0x1A, 0x390); /* Select RAM download/upload port */ - - for (i = 0; i < n; i++) - OUTB (trix_boot[i], 0x391); - for (i = n; i < 10016; i++) /* Clear up to first 16 bytes of data RAM */ - OUTB (0x00, 0x391); - OUTB (0x00, base + 6); /* Reset */ - OUTB (0x50, 0x390); /* ?????? */ +#ifdef INCLUDE_TRIX_BOOT + int i = 0, n = sizeof(trix_boot); + + trix_write(0xf8, 0x00); /* ??????? */ + outb(base + 6, 0x01); /* Clear the internal data pointer */ + outb(base + 6, 0x00); /* Restart */ + + /* + * Write the boot code to the RAM upload/download register. Each + * write increments the internal data pointer. + */ + outb(base + 6, 0x01); /* Clear the internal data pointer */ + outb(0x390, 0x1A); /* Select RAM download/upload port */ + + for (i = 0; i < n; i++) + outb(0x391, trix_boot[i]); + for (i = n; i < 10016; i++) /* Clear up to first 16 bytes of data RAM */ + outb(0x391, 0x00); + outb(base + 6, 0x00); /* Reset */ + outb(0x390, 0x50); /* ?????? */ +#endif + } static int -trix_set_wss_port (struct address_info *hw_config) +trix_set_wss_port(struct address_info * hw_config) { - unsigned char addr_bits; + u_char addr_bits; - if (kilroy_was_here) /* Already initialized */ - return 0; + if (0) { + printf("AudioTriX: Config port I/O conflict\n"); + return 0; + } + if (kilroy_was_here) /* Already initialized */ + return 0; - kilroy_was_here = 1; + if (trix_read(0x15) != 0x71) { /* No asic signature */ + DDB(printf("No AudioTriX ASIC signature found\n")); + return 0; + } - if (trix_read (0x15) != 0x71) /* No asic signature */ - return 0; + kilroy_was_here = 1; - /* - * Disable separate wave playback and recording DMA channels since - * the driver doesn't support duplex mode yet. - */ + /* + * Reset some registers. + */ - trix_write (0x13, trix_read (0x13) & ~0x80); - trix_write (0x14, trix_read (0x14) & ~0x80); + trix_write(0x13, 0); + trix_write(0x14, 0); - /* + /* * Configure the ASIC to place the codec to the proper I/O location - */ + */ - switch (hw_config->io_base) - { + switch (hw_config->io_base) { case 0x530: - addr_bits = 0; - break; + addr_bits = 0; + break; case 0x604: - addr_bits = 1; - break; + addr_bits = 1; + break; case 0xE80: - addr_bits = 2; - break; + addr_bits = 2; + break; case 0xF40: - addr_bits = 3; - break; + addr_bits = 3; + break; default: - return 0; + return 0; } - trix_write (0x19, (trix_read (0x19) & 0x03) | addr_bits); - return 1; + trix_write(0x19, (trix_read(0x19) & 0x03) | addr_bits); + return 1; } /* - * Probe and attach routines for the Windows Sound System mode of - * AudioTriX Pro + * Probe and attach routines for the Windows Sound System mode of AudioTriX + * Pro */ int -probe_trix_wss (struct address_info *hw_config) +probe_trix_wss(struct address_info * hw_config) { - /* - * Check if the IO port returns valid signature. The original MS Sound - * system returns 0x04 while some cards (AudioTriX Pro for example) - * return 0x00. - */ - if (!trix_set_wss_port (hw_config)) - return 0; - - if ((INB (hw_config->io_base + 3) & 0x3f) != 0x00) - { - DDB (printk ("No MSS signature detected on port 0x%x\n", hw_config->io_base)); - return 0; + /* + * Check if the IO port returns valid signature. The original MS + * Sound system returns 0x04 while some cards (AudioTriX Pro for + * example) return 0x00. + */ + + if (0) { + printf("AudioTriX: MSS I/O port conflict\n"); + return 0; } + trix_osp = hw_config->osp; - if (hw_config->irq > 11) - { - printk ("AudioTriX: Bad WSS IRQ %d\n", hw_config->irq); - return 0; - } + if (!trix_set_wss_port(hw_config)) + return 0; - if (hw_config->dma != 0 && hw_config->dma != 1 && hw_config->dma != 3) - { - printk ("AudioTriX: Bad WSS DMA %d\n", hw_config->dma); - return 0; + if ((inb(hw_config->io_base + 3) & 0x3f) != 0x00) { + DDB(printf("No MSS signature detected on port 0x%x\n", + hw_config->io_base)); + return 0; } - - /* + if (hw_config->irq > 11) { + printf("AudioTriX: Bad WSS IRQ %d\n", hw_config->irq); + return 0; + } + if (hw_config->dma != 0 && hw_config->dma != 1 && hw_config->dma != 3) { + printf("AudioTriX: Bad WSS DMA %d\n", hw_config->dma); + return 0; + } + if (hw_config->dma2 != -1) + if (hw_config->dma2 != 0 && hw_config->dma2 != 1 && hw_config->dma2 != 3) { + printf("AudioTriX: Bad capture DMA %d\n", hw_config->dma2); + return 0; + } + /* * Check that DMA0 is not in use with a 8 bit board. - */ + */ - if (hw_config->dma == 0 && INB (hw_config->io_base + 3) & 0x80) - { - printk ("AudioTriX: Can't use DMA0 with a 8 bit card\n"); - return 0; + if (hw_config->dma == 0 && inb(hw_config->io_base + 3) & 0x80) { + printf("AudioTriX: Can't use DMA0 with a 8 bit card\n"); + return 0; } - - if (hw_config->irq > 7 && hw_config->irq != 9 && INB (hw_config->io_base + 3) & 0x80) - { - printk ("AudioTriX: Can't use IRQ%d with a 8 bit card\n", hw_config->irq); - return 0; + if (hw_config->irq > 7 && hw_config->irq != 9 && inb(hw_config->io_base + 3) & 0x80) { + printf("AudioTriX: Can't use IRQ%d with a 8 bit card\n", hw_config->irq); + return 0; } - - return ad1848_detect (hw_config->io_base + 4); + return ad1848_detect(hw_config->io_base + 4, NULL, hw_config->osp); } -long -attach_trix_wss (long mem_start, struct address_info *hw_config) +void +attach_trix_wss(struct address_info * hw_config) { - static unsigned char interrupt_bits[12] = - {-1, -1, -1, -1, -1, -1, -1, 0x08, -1, 0x10, 0x18, 0x20}; - char bits; + static u_char interrupt_bits[12] = + {-1, -1, -1, -1, -1, -1, -1, 0x08, -1, 0x10, 0x18, 0x20}; + char bits; - static unsigned char dma_bits[4] = - {1, 2, 0, 3}; + static u_char dma_bits[4] = + {1, 2, 0, 3}; - int config_port = hw_config->io_base + 0, version_port = hw_config->io_base + 3; + int config_port = hw_config->io_base + 0, + version_port = hw_config->io_base + 3; + int dma1 = hw_config->dma, dma2 = hw_config->dma2; - if (!kilroy_was_here) - return mem_start; + trix_osp = hw_config->osp; - /* + if (!kilroy_was_here) { + DDB(printf("AudioTriX: Attach called but not probed yet???\n")); + return ; + } + /* * Set the IRQ and DMA addresses. - */ + */ + + bits = interrupt_bits[hw_config->irq]; + if (bits == -1) { + printf("AudioTriX: Bad IRQ (%d)\n", hw_config->irq); + return ; + } + outb(config_port, bits | 0x40); + if ((inb(version_port) & 0x40) == 0) + printf("[IRQ Conflict?]"); - bits = interrupt_bits[hw_config->irq]; - if (bits == -1) - return mem_start; + if (hw_config->dma2 == -1) { /* Single DMA mode */ + bits |= dma_bits[dma1]; + dma2 = dma1; + } else { + u_char tmp; - OUTB (bits | 0x40, config_port); - if ((INB (version_port) & 0x40) == 0) - printk ("[IRQ Conflict?]"); + tmp = trix_read(0x13) & ~30; + trix_write(0x13, tmp | 0x80 | (dma1 << 4)); - OUTB (bits | dma_bits[hw_config->dma], config_port); /* Write IRQ+DMA setup */ + tmp = trix_read(0x14) & ~30; + trix_write(0x14, tmp | 0x80 | (dma2 << 4)); + } + + outb(config_port, bits);/* Write IRQ+DMA setup */ - ad1848_init ("AudioTriX Pro", hw_config->io_base + 4, - hw_config->irq, - hw_config->dma, - hw_config->dma); - return mem_start; + ad1848_init("AudioTriX Pro", hw_config->io_base + 4, + hw_config->irq, + dma1, + dma2, + 0, + hw_config->osp); + return ; } int -probe_trix_sb (struct address_info *hw_config) +probe_trix_sb(struct address_info * hw_config) { - - int tmp; - unsigned char conf; - static char irq_translate[] = - {-1, -1, -1, 0, 1, 2, -1, 3}; + int tmp; + u_char conf; + static char irq_translate[] = {-1, -1, -1, 0, 1, 2, -1, 3}; #ifndef INCLUDE_TRIX_BOOT - return 0; /* No boot code -> no fun */ + return 0; /* No boot code -> no fun */ #endif - if (!kilroy_was_here) - return 0; /* AudioTriX Pro has not been detected earlier */ + if (!kilroy_was_here) + return 0; /* AudioTriX Pro has not been detected earlier */ - if (sb_initialized) - return 0; + if (sb_initialized) + return 0; - if (hw_config->io_base & 0xffffff8f != 0x200) - return 0; + if ((hw_config->io_base & 0xffffff8f) != 0x200) + return 0; - tmp = hw_config->irq; - if (tmp > 7) - return 0; - if (irq_translate[tmp] == -1) - return 0; + tmp = hw_config->irq; + if (tmp > 7) + return 0; + if (irq_translate[tmp] == -1) + return 0; - tmp = hw_config->dma; - if (tmp != 1 && tmp != 3) - return 0; + tmp = hw_config->dma; + if (tmp != 1 && tmp != 3) + return 0; - conf = 0x84; /* DMA and IRQ enable */ - conf |= hw_config->io_base & 0x70; /* I/O address bits */ - conf |= irq_translate[hw_config->irq]; - if (hw_config->dma == 3) - conf |= 0x08; - trix_write (0x1b, conf); + conf = 0x84; /* DMA and IRQ enable */ + conf |= hw_config->io_base & 0x70; /* I/O address bits */ + conf |= irq_translate[hw_config->irq]; + if (hw_config->dma == 3) + conf |= 0x08; + trix_write(0x1b, conf); - download_boot (hw_config->io_base); - sb_initialized = 1; + download_boot(hw_config->io_base); + sb_initialized = 1; - return 1; + return 1; } -long -attach_trix_sb (long mem_start, struct address_info *hw_config) +void +attach_trix_sb(struct address_info * hw_config) { - printk (" <AudioTriX>"); - return mem_start; +#if (NSB > 0) + sb_dsp_disable_midi(); + sb_no_recording = 1; +#endif + conf_printf("AudioTriX (SB)", hw_config); } -long -attach_trix_mpu (long mem_start, struct address_info *hw_config) +void +attach_trix_mpu(struct address_info * hw_config) { - return attach_mpu401 (mem_start, hw_config); +#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) + attach_mpu401(hw_config); +#endif } int -probe_trix_mpu (struct address_info *hw_config) +probe_trix_mpu(struct address_info * hw_config) { - unsigned char conf; - static char irq_bits[] = - {-1, -1, -1, 1, 2, 3, -1, 4, -1, 5}; - - if (!kilroy_was_here) - return 0; /* AudioTriX Pro has not been detected earlier */ - - if (!sb_initialized) - return 0; - - if (mpu_initialized) - return 0; +#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) + u_char conf; + static char irq_bits[] = {-1, -1, -1, 1, 2, 3, -1, 4, -1, 5}; - if (hw_config->irq > 9) - return 0; - - if (irq_bits[hw_config->irq] == -1) - return 0; - - switch (hw_config->io_base) - { + if (!kilroy_was_here) { + DDB(printf("Trix: WSS and SB modes must be initialized before MPU\n")); + return 0; /* AudioTriX Pro has not been detected earlier */ + } + if (!sb_initialized) { + DDB(printf("Trix: SB mode must be initialized before MPU\n")); + return 0; + } + if (mpu_initialized) { + DDB(printf("Trix: MPU mode already initialized\n")); + return 0; + } + if (hw_config->irq > 9) { + printf("AudioTriX: Bad MPU IRQ %d\n", hw_config->irq); + return 0; + } + if (irq_bits[hw_config->irq] == -1) { + printf("AudioTriX: Bad MPU IRQ %d\n", hw_config->irq); + return 0; + } + switch (hw_config->io_base) { case 0x330: - conf = 0x00; - break; + conf = 0x00; + break; case 0x370: - conf = 0x04; - break; + conf = 0x04; + break; case 0x3b0: - conf = 0x08; - break; + conf = 0x08; + break; case 0x3f0: - conf = 0x0c; - break; + conf = 0x0c; + break; default: - return 0; /* Invalid port */ + return 0; /* Invalid port */ } - conf |= irq_bits[hw_config->irq] << 4; + conf |= irq_bits[hw_config->irq] << 4; - trix_write (0x19, (trix_read (0x19) & 0x83) | conf); + trix_write(0x19, (trix_read(0x19) & 0x83) | conf); - mpu_initialized = 1; + mpu_initialized = 1; - return probe_mpu401 (hw_config); + return probe_mpu401(hw_config); +#else + return 0; +#endif } #endif diff --git a/sys/i386/isa/sound/trix_boot.h b/sys/i386/isa/sound/trix_boot.h new file mode 100644 index 0000000..d6bd16a --- /dev/null +++ b/sys/i386/isa/sound/trix_boot.h @@ -0,0 +1,2488 @@ +/* + * Computer generated file. Do not edit. + */ +static unsigned char trix_boot[] = { +0x80,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x40,0xe1,0x00,0x00, +0x00,0x00,0x00,0x02,0x44,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x44,0xcb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x74,0x00,0xa2,0xe3,0x92,0xd3,0xa2,0xe4,0x92,0xd4,0x75,0x81,0x45,0x12,0x3d,0x2e, +0xd2,0xaa,0xd2,0xaf,0x12,0x04,0xb9,0x7e,0x97,0x7f,0x54,0x90,0x00,0x00,0x02,0x0e, +0x14,0x80,0xfe,0x12,0x00,0x5c,0x12,0x03,0xc7,0x02,0x00,0x74,0xd0,0x00,0xd0,0x01, +0xc0,0x02,0xc0,0x03,0xc0,0x01,0xc0,0x00,0x8b,0x82,0x8a,0x83,0xe0,0xcc,0xfa,0xa3, +0xe0,0xcd,0xfb,0x22,0xd0,0x82,0xd0,0x83,0xf5,0xf0,0xea,0xf0,0xa3,0xeb,0xf0,0xe5, +0xf0,0x22,0xeb,0x33,0xe4,0x95,0xe0,0xfa,0xed,0x33,0xe4,0x95,0xe0,0xfc,0xec,0x33, +0xea,0x6c,0x13,0xc0,0xe0,0x12,0x03,0xcf,0xd0,0xf0,0x60,0x0c,0x30,0xf6,0x02,0xaa, +0xf0,0xea,0x33,0xb3,0xe4,0xfa,0x33,0xfb,0x22,0x7a,0x00,0x7c,0x00,0x12,0x03,0xcf, +0x60,0x05,0xb3,0xe4,0xfa,0x33,0xfb,0x22,0xeb,0x33,0xe4,0x95,0xe0,0xfa,0xed,0x33, +0xe4,0x95,0xe0,0xfc,0xec,0x33,0xea,0x6c,0x13,0xc0,0xe0,0x12,0x03,0xcf,0xd0,0xe0, +0x30,0xe6,0x01,0xfa,0xe4,0xca,0x23,0x54,0x01,0xfb,0x22,0x7a,0x00,0x7c,0x00,0x12, +0x03,0xcf,0xe4,0xfa,0x33,0xfb,0x22,0xeb,0x33,0xe4,0x95,0xe0,0xfa,0xed,0x33,0xe4, +0x95,0xe0,0xfc,0xec,0x33,0xea,0x6c,0x13,0xc0,0xe0,0x12,0x03,0xcf,0xd0,0xe0,0x30, +0xe6,0x01,0xfa,0xe4,0xca,0xf4,0x23,0x54,0x01,0xfb,0x22,0x7a,0x00,0x7c,0x00,0x12, +0x03,0xcf,0xe4,0xfa,0xb3,0x33,0xfb,0x22,0x7a,0x00,0x7c,0x00,0x12,0x03,0xcf,0x0b, +0x60,0x04,0xe4,0xfa,0x33,0xfb,0xeb,0x22,0x7a,0x00,0x7c,0x00,0x12,0x03,0xcf,0x0b, +0x60,0x03,0xe4,0xfa,0xfb,0xeb,0x22,0x7a,0x00,0x7c,0x00,0x12,0x03,0xcf,0x60,0x04, +0xe4,0xfa,0x04,0xfb,0xeb,0x22,0xd0,0x83,0xd0,0x82,0xe4,0x93,0xf5,0xf0,0xa3,0xe4, +0x93,0xa3,0xc0,0x82,0xc0,0x83,0xb8,0x03,0x0a,0xc0,0x04,0xc0,0x05,0xc0,0x00,0x78, +0x04,0x80,0x08,0xc0,0x02,0xc0,0x03,0xc0,0x00,0x78,0x02,0xa6,0xf0,0x08,0xf6,0x12, +0x03,0xd8,0xd0,0x00,0xb8,0x03,0x05,0xd0,0x05,0xd0,0x04,0x22,0x8b,0x05,0x8a,0x04, +0xd0,0x03,0xd0,0x02,0x22,0xd0,0x83,0xd0,0x82,0x12,0x02,0x14,0x80,0x0e,0xd0,0x83, +0xd0,0x82,0x12,0x02,0x14,0xc3,0xe4,0x99,0xf9,0xe4,0x98,0xf8,0xc0,0x82,0xc0,0x83, +0x8a,0x83,0x8b,0x82,0xc0,0x82,0xc0,0x83,0x80,0x28,0x78,0x00,0x79,0x01,0x80,0x04, +0x78,0xff,0x79,0xff,0xd0,0x83,0xd0,0x82,0xe4,0x93,0xa3,0xc0,0x82,0xc0,0x83,0x8a, +0x83,0x8b,0x82,0xb4,0x01,0x05,0xe0,0x29,0xfb,0xf0,0x22,0xc0,0x82,0xc0,0x83,0xb4, +0x02,0x13,0xe0,0xfa,0xa3,0xe0,0x29,0xfb,0xea,0x38,0xfa,0xd0,0x83,0xd0,0x82,0xf0, +0xa3,0xeb,0xf0,0x4a,0x22,0x75,0xf0,0x04,0xc0,0x00,0x78,0x02,0xe0,0xf6,0x08,0xa3, +0xd5,0xf0,0xf9,0x29,0xfd,0xd0,0x00,0xec,0x38,0xfc,0xeb,0x38,0xfb,0xea,0x38,0xfa, +0xd0,0x83,0xd0,0x82,0x75,0xf0,0x04,0x78,0x02,0xe6,0xf0,0xa3,0x08,0xd5,0xf0,0xf9, +0x4c,0x4b,0x4a,0x22,0xe4,0x93,0xf8,0xa3,0xe4,0x93,0xf9,0xa3,0x22,0xd0,0x83,0xd0, +0x82,0x12,0x02,0x14,0x80,0x0e,0xd0,0x83,0xd0,0x82,0x12,0x02,0x14,0xc3,0xe4,0x99, +0xf9,0xe4,0x98,0xf8,0xc0,0x82,0xc0,0x83,0x8a,0x83,0x8b,0x82,0xc0,0x82,0xc0,0x83, +0x80,0x2a,0x78,0x00,0x79,0x01,0x80,0x04,0x78,0xff,0x79,0xff,0xd0,0x83,0xd0,0x82, +0xe4,0x93,0xa3,0xc0,0x82,0xc0,0x83,0x8a,0x83,0x8b,0x82,0xb4,0x01,0x07,0xe0,0x29, +0xf0,0xc3,0x99,0xfb,0x22,0xc0,0x82,0xc0,0x83,0xb4,0x02,0x19,0xe0,0xfa,0xa3,0xe0, +0x29,0xfb,0xea,0x38,0xfa,0xd0,0x83,0xd0,0x82,0xf0,0xa3,0xeb,0xf0,0xc3,0x99,0xfb, +0xea,0x98,0xfa,0x4b,0x22,0x75,0xf0,0x04,0xc0,0x00,0x78,0x02,0xe0,0xf6,0x08,0xa3, +0xd5,0xf0,0xf9,0x29,0xfd,0xd0,0x00,0xec,0x38,0xfc,0xeb,0x38,0xfb,0xea,0x38,0xfa, +0xd0,0x83,0xd0,0x82,0x75,0xf0,0x04,0xc0,0x00,0x78,0x02,0xe6,0xf0,0xa3,0x08,0xd5, +0xf0,0xf9,0xd0,0x00,0xc3,0x99,0xfd,0xec,0x98,0xfc,0xeb,0x98,0xfb,0xea,0x98,0xfa, +0x4b,0x4c,0x4d,0x22,0xeb,0x60,0x11,0x24,0xf0,0x50,0x04,0xe4,0xfa,0xfb,0x22,0xec, +0xc3,0x13,0xfc,0xed,0x13,0xfd,0xdb,0xf7,0x8c,0x02,0x8d,0x03,0xea,0x4b,0x22,0xeb, +0x60,0x11,0x24,0xf0,0x50,0x04,0xe4,0xfa,0xfb,0x22,0xed,0xc3,0x33,0xfd,0xec,0x33, +0xfc,0xdb,0xf7,0x8c,0x02,0x8d,0x03,0xea,0x4b,0x22,0xea,0x5c,0xfa,0xeb,0x5d,0xfb, +0x4a,0x22,0xea,0x4c,0xfa,0xeb,0x4d,0xfb,0x4a,0x22,0x8a,0x83,0x8b,0x82,0xed,0xf0, +0xfb,0x22,0x8a,0x83,0x8b,0x82,0xec,0xf0,0xfa,0xa3,0xed,0xf0,0xfb,0x4a,0x22,0xc0, +0x03,0xc0,0x02,0x12,0x05,0xf9,0xd0,0x83,0xd0,0x82,0x78,0x04,0x79,0x02,0xe7,0xf0, +0x09,0xa3,0xd8,0xfa,0x4c,0x4b,0x4a,0x22,0x78,0x03,0x79,0x01,0x80,0x08,0x79,0x02, +0x80,0x02,0x79,0x04,0x78,0x02,0xd0,0x83,0xd0,0x82,0xe4,0x93,0x2b,0xf5,0xf0,0xa3, +0xe4,0x93,0x3a,0x80,0x27,0x78,0x03,0x79,0x01,0x80,0x14,0x78,0x05,0x79,0x01,0x80, +0x0e,0x79,0x02,0x80,0x08,0x78,0x04,0x79,0x02,0x80,0x04,0x79,0x04,0x78,0x02,0xd0, +0x83,0xd0,0x82,0xe4,0x93,0x2f,0xf5,0xf0,0xa3,0xe4,0x93,0x3e,0xa3,0xc0,0x82,0xc0, +0x83,0xf5,0x83,0x85,0xf0,0x82,0x75,0xf0,0x00,0xe0,0xf6,0x42,0xf0,0x08,0xa3,0xd9, +0xf8,0xe5,0xf0,0x22,0x78,0x03,0x79,0x01,0x80,0x08,0x79,0x02,0x80,0x02,0x79,0x04, +0x78,0x02,0xd0,0x83,0xd0,0x82,0xe4,0x93,0x2f,0xf5,0xf0,0xa3,0xe4,0x93,0x3e,0xa3, +0xc0,0x82,0xc0,0x83,0xf5,0x83,0x85,0xf0,0x82,0x75,0xf0,0x00,0xe6,0xf0,0xa3,0x08, +0x42,0xf0,0xd9,0xf8,0xe5,0xf0,0x22,0xeb,0x2d,0xfb,0xea,0x3c,0xfa,0x4b,0x22,0xed, +0xc3,0x9b,0xfb,0xec,0x9a,0xfa,0x4b,0x22,0xeb,0x8c,0xf0,0xa4,0xca,0x8d,0xf0,0xa4, +0x2a,0xfa,0xeb,0x8d,0xf0,0xa4,0xfb,0xe5,0xf0,0x2a,0xfa,0x4b,0x22,0x79,0x00,0xea, +0x30,0xe7,0x07,0x79,0x01,0x78,0x03,0x12,0x04,0x5f,0xec,0x30,0xe7,0x08,0x63,0x01, +0x01,0x78,0x05,0x12,0x04,0x5f,0xc0,0x01,0x12,0x04,0x25,0xd0,0x01,0xb9,0x01,0x05, +0x78,0x05,0x12,0x04,0x5f,0x8c,0x02,0x8d,0x03,0xea,0x4b,0x22,0xe4,0xc3,0x9b,0xfb, +0xe4,0x9a,0xfa,0x4b,0x22,0xbb,0x00,0x04,0xba,0x00,0x01,0x22,0x78,0x00,0x79,0x00, +0x74,0x10,0xc0,0xe0,0xc3,0xed,0x33,0xfd,0xec,0x33,0xfc,0xe9,0x33,0xf9,0xe8,0x33, +0xf8,0xc3,0xe9,0x9b,0xf5,0xf0,0xe8,0x9a,0x40,0x0b,0xf8,0xa9,0xf0,0xed,0x24,0x01, +0xfd,0xec,0x34,0x00,0xfc,0xd0,0xe0,0x14,0xc0,0xe0,0x70,0xd8,0xd0,0xe0,0x22,0xe4, +0xc3,0x96,0xf6,0x18,0xe4,0x96,0xf6,0x22,0xd0,0x83,0xd0,0x82,0xe4,0x93,0xf8,0xa3, +0xe4,0x93,0xf9,0xa3,0xe4,0x93,0xfc,0xa3,0xe4,0x93,0xfd,0xa3,0xc3,0xeb,0x99,0xf9, +0xea,0x98,0xf8,0x20,0xe7,0x08,0xc3,0xed,0x9b,0xec,0x9a,0x30,0xe7,0x0d,0xe4,0x93, +0xf5,0xf0,0xa3,0xe4,0x93,0xa3,0xc0,0xe0,0xc0,0xf0,0x22,0xa3,0xa3,0xe9,0x29,0x50, +0x02,0x05,0x83,0x25,0x82,0xf5,0x82,0xe5,0x83,0x38,0x28,0xf5,0x83,0xe4,0x93,0xf5, +0xf0,0xa3,0xe4,0x93,0xc0,0xe0,0xc0,0xf0,0x22,0x90,0x46,0xc2,0xaa,0x83,0xab,0x82, +0x90,0x42,0x80,0x12,0x05,0x14,0x90,0x9b,0x15,0xaa,0x83,0xab,0x82,0x90,0x9b,0x15, +0x12,0x05,0x1f,0x60,0x2c,0xc0,0x02,0xc0,0x03,0xc0,0x82,0xc0,0x83,0x78,0x02,0x79, +0x04,0xe4,0x93,0xf6,0xa3,0x08,0xd9,0xf9,0x8b,0x82,0x8a,0x83,0x8c,0x02,0x8d,0x03, +0x12,0x05,0x14,0xd0,0x83,0xd0,0x82,0xd0,0x03,0xd0,0x02,0xa3,0xa3,0xa3,0xa3,0x80, +0xcf,0x12,0x05,0x28,0x9b,0x15,0x4c,0x83,0x46,0xc2,0x12,0x05,0x28,0x9b,0x15,0x9b, +0x15,0x95,0x54,0x22,0x12,0x05,0x1f,0x70,0x01,0x22,0xe4,0xf0,0xa3,0x80,0xf5,0xeb, +0x65,0x82,0x70,0x03,0xea,0x65,0x83,0x22,0xd0,0x83,0xd0,0x82,0x78,0x02,0x79,0x06, +0xe4,0x93,0xf6,0xa3,0x08,0xd9,0xf9,0xc0,0x82,0xc0,0x83,0x8d,0x82,0x8c,0x83,0x12, +0x05,0x1f,0x60,0x13,0xe4,0x93,0xa3,0xad,0x82,0xac,0x83,0x8f,0x82,0x8e,0x83,0xf0, +0xa3,0xaf,0x82,0xae,0x83,0x80,0xe4,0x22,0x60,0x19,0xc0,0x00,0xc0,0x01,0xc0,0x83, +0xc0,0x82,0xf8,0x54,0x01,0x24,0x02,0xf9,0x12,0x06,0x00,0xd0,0x82,0xd0,0x83,0xd0, +0x01,0xd0,0x00,0xef,0x25,0x82,0xfd,0xee,0x35,0x83,0xfc,0xc3,0xef,0x99,0xf5,0x82, +0xff,0xee,0x98,0xfe,0xf5,0x83,0xd0,0x02,0xd0,0x03,0xd0,0xe0,0xf0,0xa3,0xd0,0xe0, +0xf0,0xa3,0xec,0xf0,0xa3,0xed,0xf0,0xc0,0x03,0xc0,0x02,0x22,0x8e,0x83,0x8f,0x82, +0xe0,0xf5,0xf0,0xa3,0xe0,0xc0,0xe0,0xc0,0xf0,0xa3,0xe0,0xfe,0xa3,0xe0,0xff,0x22, +0xd0,0x01,0xd0,0x00,0xd0,0xe0,0xd0,0xf0,0xc0,0x00,0xc0,0x01,0xc0,0xf0,0xc0,0xe0, +0x22,0x78,0x01,0x79,0x03,0x02,0x06,0x00,0x78,0x01,0x79,0x05,0x02,0x06,0x00,0x78, +0x02,0x79,0x02,0x02,0x06,0x00,0x78,0x02,0x79,0x04,0x02,0x06,0x00,0x78,0x01,0x79, +0x03,0x02,0x06,0x13,0x78,0x01,0x79,0x05,0x02,0x06,0x13,0x78,0x02,0x79,0x02,0x02, +0x06,0x13,0x78,0x02,0x79,0x04,0x02,0x06,0x13,0x78,0x04,0x79,0x02,0x02,0x06,0x13, +0xef,0xc3,0x98,0xff,0xee,0x94,0x00,0xfe,0x8f,0x82,0x8e,0x83,0xe7,0xf0,0xa3,0x09, +0xd8,0xfa,0x22,0xc0,0xe0,0x8f,0x82,0x8e,0x83,0xe0,0xf7,0xa3,0x09,0xd8,0xfa,0xae, +0x83,0xaf,0x82,0xd0,0xe0,0x22,0x74,0x02,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12, +0x03,0x61,0x04,0x00,0x90,0x42,0x80,0xea,0xf0,0xeb,0xa3,0xf0,0x7b,0x00,0x12,0x05, +0xc1,0x7b,0x05,0x12,0x05,0xc1,0x7b,0x01,0x90,0x00,0x03,0x12,0x0d,0x73,0x7b,0x02, +0x12,0x05,0xc1,0x7b,0x05,0x12,0x05,0xc1,0x7b,0x01,0x90,0x00,0x03,0x12,0x0d,0x73, +0x90,0x00,0x00,0x12,0x0d,0xed,0x7b,0xf9,0x90,0x42,0x0c,0xeb,0xf0,0x90,0x42,0x0c, +0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b,0x60, +0x1a,0x7b,0x00,0x12,0x05,0xc1,0x90,0x42,0x0c,0xe0,0xfb,0x90,0x00,0x02,0x12,0x0c, +0xe7,0x7b,0x0c,0x7a,0x42,0x12,0x02,0x48,0x01,0x80,0xd2,0x7b,0x1b,0x12,0x05,0xc1, +0x7b,0xf8,0x90,0x00,0x02,0x12,0x0c,0xe7,0x7b,0x01,0x7a,0x00,0x02,0x05,0x9c,0xe4, +0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04, +0x12,0x05,0x58,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x20,0xeb,0x2d,0xfb,0x90, +0x42,0x0d,0xeb,0xf0,0x7b,0x82,0x7a,0x42,0x8b,0x05,0x8a,0x04,0x90,0x42,0x0d,0xe0, +0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x8b,0x05,0x7b,0xfe, +0xeb,0x5d,0xfb,0x8b,0x05,0x12,0x03,0x55,0x05,0x00,0xeb,0x4d,0xfb,0x12,0x05,0xc1, +0x90,0x42,0x0d,0xe0,0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x7b,0xe8,0x8b,0x05,0x7b, +0x0d,0x7a,0x42,0x8a,0x83,0x8b,0x82,0xe0,0x2d,0xf0,0xfb,0x12,0x03,0x55,0x06,0x00, +0x12,0x05,0xc1,0x90,0x42,0x0d,0xe0,0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x02,0x05, +0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x7b,0x00,0x7a,0x00,0x90,0x42, +0x0f,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x0f,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05, +0x8a,0x04,0x7b,0xe8,0x7a,0x03,0x12,0x00,0xc4,0x60,0x1a,0x90,0x00,0x00,0x12,0x0d, +0xed,0x8b,0x05,0x7b,0x02,0xeb,0x5d,0x70,0x02,0x80,0x0a,0x7b,0x0f,0x7a,0x42,0x12, +0x02,0x42,0x02,0x80,0xd1,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0x8b,0x05,0x8a,0x04, +0x7b,0x80,0x7a,0x00,0x12,0x03,0xc7,0x90,0x42,0x0e,0xeb,0xf0,0x74,0x05,0x2f,0xfb, +0xe4,0x3e,0xfa,0x12,0x02,0x42,0x02,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x8b,0x05,0x7b, +0x3f,0xeb,0x5d,0xfb,0x12,0x05,0xc1,0x90,0x42,0x0e,0xe0,0xfb,0x90,0x00,0x02,0x12, +0x0c,0xe7,0x7b,0x18,0x8b,0x05,0x7b,0x0e,0x7a,0x42,0x8a,0x83,0x8b,0x82,0xe0,0x2d, +0xf0,0xfb,0x74,0x05,0x2f,0xfb,0xe4,0x3e,0xfa,0x12,0x02,0x42,0x02,0x8a,0x83,0x8b, +0x82,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x0e,0xe0,0xfb,0x90,0x00,0x02,0x12,0x0c, +0xe7,0x7b,0x18,0x8b,0x05,0x7b,0x0e,0x7a,0x42,0x8a,0x83,0x8b,0x82,0xe0,0x2d,0xf0, +0xfb,0x74,0x05,0x2f,0xfb,0xe4,0x3e,0xfa,0x12,0x02,0x42,0x02,0x8a,0x83,0x8b,0x82, +0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x0e,0xe0,0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7, +0x7b,0x18,0x8b,0x05,0x7b,0x0e,0x7a,0x42,0x8a,0x83,0x8b,0x82,0xe0,0x2d,0xf0,0xfb, +0x74,0x05,0x2f,0xfb,0xe4,0x3e,0xfa,0x12,0x02,0x42,0x02,0x8a,0x83,0x8b,0x82,0xe0, +0xfb,0x12,0x05,0xc1,0x90,0x42,0x0e,0xe0,0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x7b, +0x18,0x8b,0x05,0x7b,0x0e,0x7a,0x42,0x8a,0x83,0x8b,0x82,0xe0,0x2d,0xf0,0xfb,0x74, +0x05,0x2f,0xfb,0xe4,0x3e,0xfa,0x12,0x02,0x42,0x02,0x8a,0x83,0x8b,0x82,0xe0,0xfb, +0x8b,0x05,0x7b,0x07,0xeb,0x5d,0xfb,0x12,0x05,0xc1,0x90,0x42,0x0e,0xe0,0xfb,0x90, +0x00,0x02,0x12,0x0c,0xe7,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05, +0x58,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x50,0xeb,0x2d,0xfb,0x90,0x42,0x11, +0xeb,0xf0,0x12,0x03,0x55,0x05,0x00,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x12, +0x02,0xdf,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x06,0x00,0x12,0x05,0xd6,0x8b,0x05, +0x7b,0x01,0xeb,0x5d,0xfb,0x12,0x05,0xf2,0x7a,0x00,0x12,0x03,0x02,0x12,0x05,0xc1, +0x90,0x42,0x11,0xe0,0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x02,0x05,0x9c,0x74,0x01, +0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x68, +0xeb,0x2d,0xfb,0x90,0x42,0x12,0xeb,0xf0,0x7b,0x82,0x7a,0x42,0x8b,0x05,0x8a,0x04, +0x90,0x42,0x12,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb, +0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0x30,0x7a,0xff,0x12,0x02,0xfa,0x8b,0x05,0x8a, +0x04,0x12,0x03,0x55,0x05,0x00,0x12,0x05,0xd6,0x8b,0x05,0x7b,0x0f,0xeb,0x5d,0xfb, +0x12,0x05,0xf2,0x7a,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x80,0x7a,0x00, +0x12,0x03,0x02,0x12,0x05,0xf2,0x12,0x03,0x02,0x12,0x05,0xc1,0x90,0x42,0x12,0xe0, +0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04, +0x12,0x05,0x58,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x68,0xeb,0x2d,0xfb,0x90, +0x42,0x13,0xeb,0xf0,0x7b,0x82,0x7a,0x42,0x8b,0x05,0x8a,0x04,0x90,0x42,0x13,0xe0, +0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05, +0x8a,0x04,0x7b,0x7f,0x7a,0xff,0x12,0x02,0xfa,0x12,0x05,0xc1,0x90,0x42,0x13,0xe0, +0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04, +0x12,0x05,0x58,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x38,0xeb,0x2d,0xfb,0x90, +0x42,0x14,0xeb,0xf0,0x7b,0x82,0x7a,0x42,0x8b,0x05,0x8a,0x04,0x90,0x42,0x14,0xe0, +0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05, +0x8a,0x04,0x7b,0x08,0x7a,0xff,0x12,0x02,0xfa,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55, +0x05,0x00,0x7a,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x12,0x02,0xdf, +0x12,0x05,0xf2,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0xf0,0x7a,0x00,0x12,0x02, +0xfa,0x12,0x05,0xf2,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x12,0x03,0x61,0x08,0x00, +0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x07,0x12,0x02,0xc4,0x12,0x05,0xf2,0x12, +0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x07,0x7a,0x00,0x12,0x02,0xfa,0x12,0x05,0xf2, +0x12,0x03,0x02,0x12,0x05,0xf2,0x12,0x03,0x02,0x12,0x05,0xc1,0x90,0x42,0x14,0xe0, +0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x7b,0xe8,0x8b,0x05,0x7b,0x14,0x7a,0x42,0x8a, +0x83,0x8b,0x82,0xe0,0x2d,0xf0,0xfb,0x7b,0x82,0x7a,0x42,0x8b,0x05,0x8a,0x04,0x90, +0x42,0x14,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a, +0x00,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a,0xff,0x12,0x02,0xfa,0x8b,0x05,0x8a,0x04, +0x12,0x03,0x61,0x06,0x00,0x7a,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x01, +0x12,0x02,0xdf,0x12,0x05,0xf2,0x12,0x03,0x02,0x12,0x05,0xc1,0x90,0x42,0x14,0xe0, +0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04, +0x12,0x05,0x58,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x68,0xeb,0x2d,0xfb,0x90, +0x42,0x15,0xeb,0xf0,0x7b,0x82,0x7a,0x42,0x8b,0x05,0x8a,0x04,0x90,0x42,0x15,0xe0, +0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x8b,0x05,0x7b,0xf0, +0xeb,0x5d,0xfb,0x8b,0x05,0x12,0x03,0x55,0x05,0x00,0x12,0x05,0xc8,0x8b,0x05,0x7b, +0x0f,0xeb,0x5d,0xfb,0x12,0x05,0xe4,0xeb,0x4d,0xfb,0x12,0x05,0xc1,0x90,0x42,0x15, +0xe0,0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79, +0x04,0x12,0x05,0x58,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x68,0xeb,0x2d,0xfb, +0x90,0x42,0x16,0xeb,0xf0,0x7b,0x82,0x7a,0x42,0x8b,0x05,0x8a,0x04,0x90,0x42,0x16, +0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x8b,0x05,0x7b, +0xbf,0xeb,0x5d,0xfb,0x8b,0x05,0x12,0x03,0x55,0x05,0x00,0x8d,0x03,0x60,0x0d,0x8b, +0x05,0x7b,0x40,0x90,0x42,0x17,0xeb,0xf0,0x8d,0x03,0x80,0x0b,0x8b,0x05,0x7b,0x00, +0x90,0x42,0x17,0xeb,0xf0,0x8d,0x03,0x8b,0x05,0x90,0x42,0x17,0xe0,0xfb,0xeb,0x4d, +0xfb,0x12,0x05,0xc1,0x90,0x42,0x16,0xe0,0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x02, +0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03,0x55,0x04,0x00, +0x8b,0x05,0x7b,0x68,0xeb,0x2d,0xfb,0x90,0x42,0x18,0xeb,0xf0,0x7b,0x82,0x7a,0x42, +0x8b,0x05,0x8a,0x04,0x90,0x42,0x18,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83, +0x8b,0x82,0xe0,0xfb,0x8b,0x05,0x7b,0xdf,0xeb,0x5d,0xfb,0x8b,0x05,0x12,0x03,0x55, +0x05,0x00,0x8d,0x03,0x60,0x0d,0x8b,0x05,0x7b,0x20,0x90,0x42,0x19,0xeb,0xf0,0x8d, +0x03,0x80,0x0b,0x8b,0x05,0x7b,0x00,0x90,0x42,0x19,0xeb,0xf0,0x8d,0x03,0x8b,0x05, +0x90,0x42,0x19,0xe0,0xfb,0xeb,0x4d,0xfb,0x12,0x05,0xc1,0x90,0x42,0x18,0xe0,0xfb, +0x90,0x00,0x02,0x12,0x0c,0xe7,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12, +0x05,0x58,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x68,0xeb,0x2d,0xfb,0x90,0x42, +0x1a,0xeb,0xf0,0x7b,0x82,0x7a,0x42,0x8b,0x05,0x8a,0x04,0x90,0x42,0x1a,0xe0,0xfb, +0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x8b,0x05,0x7b,0xef,0xeb, +0x5d,0xfb,0x8b,0x05,0x12,0x03,0x55,0x05,0x00,0x8d,0x03,0x60,0x0d,0x8b,0x05,0x7b, +0x10,0x90,0x42,0x1b,0xeb,0xf0,0x8d,0x03,0x80,0x0b,0x8b,0x05,0x7b,0x00,0x90,0x42, +0x1b,0xeb,0xf0,0x8d,0x03,0x8b,0x05,0x90,0x42,0x1b,0xe0,0xfb,0xeb,0x4d,0xfb,0x12, +0x05,0xc1,0x90,0x42,0x1a,0xe0,0xfb,0x90,0x00,0x02,0x12,0x0c,0xe7,0x02,0x05,0x9c, +0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03,0x55,0x04,0x00,0x8b,0x05, +0x7b,0x38,0xeb,0x2d,0xfb,0x90,0x42,0x1c,0xeb,0xf0,0x7b,0x82,0x7a,0x42,0x8b,0x05, +0x8a,0x04,0x90,0x42,0x1c,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82, +0xe0,0xfb,0x8b,0x05,0x7b,0xf7,0xeb,0x5d,0xfb,0x8b,0x05,0x12,0x03,0x55,0x05,0x00, +0x8d,0x03,0x60,0x0d,0x8b,0x05,0x7b,0x08,0x90,0x42,0x1d,0xeb,0xf0,0x8d,0x03,0x80, +0x0b,0x8b,0x05,0x7b,0x00,0x90,0x42,0x1d,0xeb,0xf0,0x8d,0x03,0x8b,0x05,0x90,0x42, +0x1d,0xe0,0xfb,0xeb,0x4d,0xfb,0x12,0x05,0xc1,0x90,0x42,0x1c,0xe0,0xfb,0x90,0x00, +0x02,0x12,0x0c,0xe7,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58, +0xc2,0xb4,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x90,0x46,0xc2,0xe0,0xfa,0xa3,0xe0, +0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00,0x12,0x03,0xc7,0x12, +0x05,0xe4,0x12,0x03,0x0a,0x12,0x03,0x55,0x05,0x00,0x8b,0x05,0x90,0x46,0xc2,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x05,0x7a,0x00,0x12, +0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0x8b, +0x05,0x8a,0x04,0x7b,0x00,0x7a,0x01,0x12,0x00,0xc4,0x60,0x22,0x12,0x03,0x55,0x05, +0x00,0x8b,0x05,0x7b,0x82,0x7a,0x42,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x12,0x03, +0x55,0x05,0x00,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0xd2,0xb4, +0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0xc2,0xb4,0x12,0x03, +0x55,0x04,0x00,0x60,0x09,0x7b,0x02,0x90,0x42,0x20,0xeb,0xf0,0x80,0x07,0x7b,0x00, +0x90,0x42,0x20,0xeb,0xf0,0x90,0x42,0x20,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04, +0x90,0x46,0xc2,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xc7,0x90,0x42,0x1e,0xea,0xf0, +0xeb,0xa3,0xf0,0x12,0x03,0x55,0x05,0x00,0x8b,0x05,0x90,0x42,0x1e,0xe0,0xfa,0xa3, +0xe0,0xfb,0x12,0x03,0x0a,0x12,0x03,0x55,0x06,0x00,0x8b,0x05,0x90,0x42,0x1e,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a,0x00,0x12, +0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0xd2,0xb4,0x02,0x05,0x9c,0xe4,0x78,0x00, +0x79,0x04,0x12,0x05,0x58,0xc2,0xb4,0x90,0x46,0xc2,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a, +0x83,0x8b,0x82,0xe0,0xfb,0x90,0x42,0x21,0xeb,0xf0,0xd2,0xb4,0x90,0x42,0x21,0xe0, +0xfb,0x02,0x05,0x9c,0xe4,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x90,0x00,0x00,0x12, +0x0e,0x2f,0x90,0x00,0x00,0x12,0x42,0x7e,0x7b,0x00,0x7a,0x00,0x02,0x05,0x9c,0xe4, +0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x90,0x00,0x00,0x12,0x1a,0xf2,0x02,0x05,0x9c, +0xe4,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0xab,0x87,0x90,0x42,0x22,0xeb,0xf0,0x7b, +0x7f,0x8b,0x05,0x7b,0x22,0x7a,0x42,0x8a,0x83,0x8b,0x82,0xe0,0x5d,0xf0,0xfb,0x90, +0x42,0x22,0xe0,0xfb,0x8b,0x87,0xab,0x89,0x90,0x42,0x22,0xeb,0xf0,0x90,0x42,0x22, +0xe0,0xfb,0x8b,0x05,0x7b,0x0f,0xeb,0x5d,0xfb,0x8b,0x05,0x7b,0x20,0xeb,0x4d,0xfb, +0x90,0x42,0x22,0xeb,0xf0,0x90,0x42,0x22,0xe0,0xfb,0x8b,0x89,0x7b,0xfe,0x8b,0x8d, +0x7b,0x00,0x8b,0x8b,0xd2,0x8e,0xc2,0x9f,0xd2,0x9e,0xc2,0x9d,0xd2,0x9c,0xd2,0xac, +0x7b,0x00,0x7a,0x00,0x02,0x05,0x9c,0xe4,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x90, +0x43,0x84,0xe0,0xfb,0x8b,0x05,0x7b,0x0f,0xeb,0x5d,0xfb,0x90,0x42,0x27,0xeb,0xf0, +0x90,0x43,0x85,0xe0,0xfb,0x90,0x42,0x28,0xeb,0xf0,0x90,0x43,0x86,0xe0,0xfb,0x90, +0x42,0x29,0xeb,0xf0,0x7b,0x87,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0, +0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05, +0x8a,0x04,0x7b,0x07,0x12,0x02,0xdf,0x8b,0x05,0x8a,0x04,0x7b,0x97,0x7a,0x43,0x12, +0x05,0xd6,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7, +0x12,0x05,0xf2,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x90,0x42, +0x23,0xea,0xf0,0xeb,0xa3,0xf0,0x7b,0xa7,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42, +0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00, +0x8b,0x05,0x8a,0x04,0x7b,0x07,0x12,0x02,0xdf,0x8b,0x05,0x8a,0x04,0x7b,0xb7,0x7a, +0x43,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12, +0x03,0xc7,0x12,0x05,0xf2,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7, +0x90,0x42,0x25,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x28,0xe0,0xfb,0x7a,0x00,0x12, +0x04,0x68,0x00,0x06,0x00,0x7f,0x15,0x60,0x10,0x7c,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x11,0x72,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x12,0x68,0x13,0x4e, +0x14,0x34,0x14,0x78,0x14,0xbc,0x15,0x00,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60, +0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x60,0x15,0x44, +0x15,0x60,0x15,0x52,0x15,0x52,0x15,0x52,0x15,0x52,0x15,0x52,0x7b,0xc7,0x7a,0x43, +0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83, +0x8b,0x82,0xe0,0x60,0x6e,0x7b,0x87,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27, +0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b, +0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b,0x60,0x45,0x7b,0x97,0x7a,0x43, +0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83, +0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01, +0x3b,0x60,0x1e,0x90,0x42,0x29,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x23,0xe0,0xfa, +0xa3,0xe0,0xfb,0x12,0x05,0xcf,0x90,0x42,0x27,0xe0,0xfb,0x90,0x00,0x04,0x12,0x28, +0xf4,0x80,0x6c,0x7b,0xa7,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb, +0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a, +0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b,0x60,0x45,0x7b,0xb7,0x7a,0x43,0x8b,0x05, +0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82, +0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b,0x60, +0x1e,0x90,0x42,0x29,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x25,0xe0,0xfa,0xa3,0xe0, +0xfb,0x12,0x05,0xc1,0x90,0x42,0x27,0xe0,0xfb,0x90,0x00,0x03,0x12,0x33,0xda,0x02, +0x16,0x7b,0x7b,0xc7,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a, +0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0x60,0x6e,0x7b,0x87,0x7a,0x43,0x8b, +0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b, +0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b, +0x60,0x45,0x7b,0x97,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a, +0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04, +0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b,0x60,0x1e,0x90,0x42,0x29,0xe0,0xfb,0x12,0x05, +0xc1,0x90,0x42,0x23,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x27,0xe0, +0xfb,0x90,0x00,0x03,0x12,0x33,0xb6,0x80,0x6c,0x7b,0xa7,0x7a,0x43,0x8b,0x05,0x8a, +0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0, +0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b,0x60,0x45, +0x7b,0xb7,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12, +0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff, +0x7a,0x00,0x12,0x01,0x3b,0x60,0x1e,0x90,0x42,0x29,0xe0,0xfb,0x12,0x05,0xc1,0x90, +0x42,0x25,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x27,0xe0,0xfb,0x90, +0x00,0x03,0x12,0x33,0xe6,0x02,0x16,0x7b,0x7b,0xc7,0x7a,0x43,0x8b,0x05,0x8a,0x04, +0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0x60, +0x66,0x7b,0x87,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00, +0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b, +0xff,0x7a,0x00,0x12,0x01,0x3b,0x60,0x3d,0x7b,0x97,0x7a,0x43,0x8b,0x05,0x8a,0x04, +0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb, +0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b,0x60,0x16,0x90, +0x42,0x23,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x27,0xe0,0xfb,0x90, +0x00,0x02,0x12,0x33,0xc2,0x80,0x64,0x7b,0xa7,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90, +0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a, +0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b,0x60,0x3d,0x7b,0xb7, +0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7, +0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00, +0x12,0x01,0x3b,0x60,0x16,0x90,0x42,0x25,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc1, +0x90,0x42,0x27,0xe0,0xfb,0x90,0x00,0x02,0x12,0x33,0xf2,0x02,0x16,0x7b,0x7b,0xc7, +0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7, +0x8a,0x83,0x8b,0x82,0xe0,0x60,0x66,0x7b,0x87,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90, +0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a, +0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b,0x60,0x3d,0x7b,0x97, +0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7, +0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00, +0x12,0x01,0x3b,0x60,0x16,0x90,0x42,0x23,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc1, +0x90,0x42,0x27,0xe0,0xfb,0x90,0x00,0x02,0x12,0x33,0xce,0x80,0x64,0x7b,0xa7,0x7a, +0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a, +0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12, +0x01,0x3b,0x60,0x3d,0x7b,0xb7,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0, +0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05, +0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x3b,0x60,0x16,0x90,0x42,0x25,0xe0,0xfa, +0xa3,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x27,0xe0,0xfb,0x90,0x00,0x02,0x12,0x33, +0xfe,0x02,0x16,0x7b,0x90,0x42,0x29,0xe0,0xfb,0x8b,0x05,0x7b,0xb7,0x7a,0x43,0x12, +0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7, +0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x00,0x8b,0x05,0x7b,0xc7,0x7a,0x43,0x12,0x05, +0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x12, +0x05,0xe4,0x12,0x03,0x0a,0x02,0x16,0x7b,0x90,0x42,0x29,0xe0,0xfb,0x8b,0x05,0x7b, +0xa7,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a, +0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x00,0x8b,0x05,0x7b,0xc7, +0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00, +0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x02,0x16,0x7b,0x90,0x42,0x29,0xe0, +0xfb,0x8b,0x05,0x7b,0x97,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42, +0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x01, +0x8b,0x05,0x7b,0xc7,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27, +0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x02,0x16,0x7b, +0x90,0x42,0x29,0xe0,0xfb,0x8b,0x05,0x7b,0x87,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05, +0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12, +0x03,0x0a,0x7b,0x01,0x8b,0x05,0x7b,0xc7,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a, +0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03, +0x0a,0x02,0x16,0x7b,0x90,0x42,0x27,0xe0,0xfb,0x90,0x00,0x01,0x12,0x32,0x3e,0x02, +0x16,0x7b,0x90,0x42,0x27,0xe0,0xfb,0x90,0x00,0x01,0x12,0x31,0x8a,0x02,0x16,0x7b, +0x90,0x42,0x28,0xe0,0xfb,0x8b,0x05,0x7b,0x20,0x12,0x00,0xdb,0x60,0x66,0x90,0x42, +0x29,0xe0,0xfb,0x8b,0x05,0x7b,0xd7,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04, +0x90,0x42,0x27,0xe0,0xfb,0x7a,0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x20,0x12,0x03, +0xc7,0x12,0x05,0xe4,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x28,0xe0,0xfb, +0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x90,0x42,0x29,0xe0,0xfb, +0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0x07,0x12,0x02,0xdf,0x12,0x05,0xcf,0x90,0x42, +0x28,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x27,0xe0,0xfb,0x90,0x00,0x04,0x12,0x34, +0xed,0x02,0x16,0x7b,0x90,0x42,0x28,0xe0,0xfb,0x8b,0x05,0x7b,0x40,0x12,0x00,0xdb, +0x60,0x6e,0x7b,0xe0,0x8b,0x05,0x7b,0x28,0x7a,0x42,0x8a,0x83,0x8b,0x82,0xe0,0x2d, +0xf0,0xfb,0x7b,0xd7,0x7a,0x43,0x8b,0x05,0x8a,0x04,0x90,0x42,0x27,0xe0,0xfb,0x7a, +0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x20,0x12,0x03,0xc7,0x8b,0x05,0x8a,0x04,0x90, +0x42,0x28,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a, +0x00,0x8b,0x05,0x8a,0x04,0x7b,0x07,0x12,0x02,0xdf,0x8b,0x05,0x8a,0x04,0x90,0x42, +0x29,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xcf,0x90,0x42,0x28,0xe0,0xfb, +0x12,0x05,0xc1,0x90,0x42,0x27,0xe0,0xfb,0x90,0x00,0x04,0x12,0x34,0xed,0x80,0x2b, +0x90,0x43,0x85,0xe0,0xfb,0x8b,0x05,0x7b,0x60,0x12,0x00,0xdb,0x60,0x1d,0x90,0x42, +0x29,0xe0,0xfb,0x7a,0x00,0x12,0x05,0xcf,0x90,0x42,0x28,0xe0,0xfb,0x12,0x05,0xc1, +0x90,0x42,0x27,0xe0,0xfb,0x90,0x00,0x04,0x12,0x34,0xed,0x02,0x05,0x9c,0x74,0x01, +0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x90,0x43,0x83,0xe0,0xfb,0x8b,0x05,0x7b,0x00, +0x12,0x01,0x28,0x60,0x03,0x02,0x05,0x9c,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b, +0x85,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x82,0x7a,0x43,0x12,0x02, +0x42,0x01,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x90,0x43,0x83, +0xe0,0xfb,0x8b,0x05,0x90,0x43,0x82,0xe0,0xfb,0x12,0x01,0x37,0x60,0x03,0x02,0x05, +0x9c,0x7b,0x00,0x90,0x43,0x82,0xeb,0xf0,0x90,0x43,0x84,0xe0,0xfb,0x7a,0x00,0x8b, +0x05,0x8a,0x04,0x7b,0xf0,0x7a,0x00,0x12,0x02,0xfa,0x12,0x04,0x68,0x00,0x80,0x00, +0xe0,0x18,0xae,0x17,0xb5,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x17,0xda,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0x2e,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0x52,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0x5a,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0x76,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18,0xae,0x18, +0xae,0x18,0xae,0x18,0x92,0x90,0x43,0x86,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x43,0x85, +0xe0,0xfb,0x12,0x05,0xc1,0x90,0x43,0x84,0xe0,0xfb,0x8b,0x05,0x7b,0x0f,0xeb,0x5d, +0xfb,0x90,0x00,0x03,0x12,0x26,0xe4,0x02,0x18,0xae,0x90,0x43,0x86,0xe0,0xfb,0x8b, +0x05,0x7b,0x00,0x12,0x01,0x28,0x60,0x21,0x7b,0x40,0x12,0x05,0xc1,0x90,0x43,0x85, +0xe0,0xfb,0x12,0x05,0xc1,0x90,0x43,0x84,0xe0,0xfb,0x8b,0x05,0x7b,0x0f,0xeb,0x5d, +0xfb,0x90,0x00,0x03,0x12,0x26,0xe4,0x80,0x22,0x90,0x43,0x86,0xe0,0xfb,0x12,0x05, +0xc1,0x90,0x43,0x85,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x43,0x84,0xe0,0xfb,0x8b,0x05, +0x7b,0x0f,0xeb,0x5d,0xfb,0x90,0x00,0x03,0x12,0x21,0x57,0x02,0x18,0xae,0x90,0x43, +0x86,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x43,0x85,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x43, +0x84,0xe0,0xfb,0x8b,0x05,0x7b,0x0f,0xeb,0x5d,0xfb,0x90,0x00,0x03,0x12,0x27,0xd2, +0x80,0x5c,0x90,0x00,0x00,0x12,0x0e,0xa7,0x80,0x54,0x90,0x43,0x85,0xe0,0xfb,0x12, +0x05,0xc1,0x90,0x43,0x84,0xe0,0xfb,0x8b,0x05,0x7b,0x0f,0xeb,0x5d,0xfb,0x90,0x00, +0x02,0x12,0x27,0xea,0x80,0x38,0x90,0x43,0x85,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x43, +0x84,0xe0,0xfb,0x8b,0x05,0x7b,0x0f,0xeb,0x5d,0xfb,0x90,0x00,0x02,0x12,0x27,0xde, +0x80,0x1c,0x90,0x43,0x86,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x43,0x84,0xe0,0xfb,0x8b, +0x05,0x7b,0x0f,0xeb,0x5d,0xfb,0x90,0x00,0x02,0x12,0x3b,0xc3,0x80,0x00,0x02,0x05, +0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03,0x55,0x04,0x00,0x7a, +0x00,0x12,0x04,0x68,0x00,0xf0,0x00,0xff,0x19,0x56,0x18,0xea,0x19,0x1a,0x19,0x31, +0x19,0x1a,0x19,0x03,0x19,0x03,0x19,0x03,0x18,0xfb,0x19,0x56,0x19,0x56,0x19,0x56, +0x19,0x56,0x19,0x56,0x19,0x56,0x19,0x56,0x19,0x48,0x7b,0x01,0x90,0x45,0xd7,0xeb, +0xf0,0x7b,0xf0,0x90,0x00,0x01,0x12,0x2a,0x68,0x80,0x5b,0x7b,0xf7,0x90,0x00,0x01, +0x12,0x2a,0x68,0x7b,0x00,0x90,0x43,0x84,0xeb,0xf0,0x7b,0x00,0x90,0x43,0x83,0xeb, +0xf0,0x7b,0x00,0x90,0x43,0x82,0xeb,0xf0,0x80,0x3c,0x7b,0x00,0x90,0x43,0x84,0xeb, +0xf0,0x7b,0x01,0x90,0x43,0x83,0xeb,0xf0,0x7b,0x00,0x90,0x43,0x82,0xeb,0xf0,0x80, +0x25,0x7b,0x00,0x90,0x43,0x84,0xeb,0xf0,0x7b,0x02,0x90,0x43,0x83,0xeb,0xf0,0x7b, +0x00,0x90,0x43,0x82,0xeb,0xf0,0x80,0x0e,0x90,0x46,0xc4,0xe0,0x60,0x06,0x90,0x00, +0x00,0x12,0x1a,0xf2,0x80,0x00,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12, +0x05,0x58,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0x80,0x7a, +0x00,0x12,0x00,0xf3,0x60,0x1b,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0x8b,0x05,0x8a, +0x04,0x7b,0xf8,0x7a,0x00,0x12,0x00,0xc4,0x60,0x07,0x7b,0x00,0x90,0x45,0xd7,0xeb, +0xf0,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xf0,0x7a,0x00, +0x12,0x02,0xfa,0x12,0x04,0x68,0x00,0x80,0x00,0xf0,0x1a,0xcf,0x1a,0x8e,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0x8e,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0x8e,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0x8e,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xa8,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xa8,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0x8e,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf, +0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xcf,0x1a,0xc2,0x12,0x03, +0x55,0x04,0x00,0x90,0x43,0x84,0xeb,0xf0,0x7b,0x00,0x90,0x43,0x82,0xeb,0xf0,0x7b, +0x02,0x90,0x43,0x83,0xeb,0xf0,0x80,0x47,0x12,0x03,0x55,0x04,0x00,0x90,0x43,0x84, +0xeb,0xf0,0x7b,0x00,0x90,0x43,0x82,0xeb,0xf0,0x7b,0x01,0x90,0x43,0x83,0xeb,0xf0, +0x80,0x2d,0x12,0x03,0x55,0x04,0x00,0x90,0x00,0x01,0x12,0x18,0xb1,0x80,0x20,0x90, +0x45,0xd7,0xe0,0x60,0x0d,0x12,0x03,0x55,0x04,0x00,0x90,0x00,0x01,0x12,0x2a,0x68, +0x80,0x0b,0x12,0x03,0x55,0x04,0x00,0x90,0x00,0x01,0x12,0x16,0x7e,0x80,0x00,0x02, +0x05,0x9c,0xe4,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x90,0x00,0x00,0x12,0x2a,0x57, +0x7b,0x00,0x90,0x43,0x82,0xeb,0xf0,0x7b,0x00,0x90,0x43,0x83,0xeb,0xf0,0x7b,0x00, +0x90,0x43,0x84,0xeb,0xf0,0x7b,0x00,0x90,0x45,0xd7,0xeb,0xf0,0x7b,0x00,0x7a,0x00, +0x90,0x42,0x2a,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x2a,0xe0,0xfa,0xa3,0xe0,0xfb, +0x8b,0x05,0x8a,0x04,0x7b,0x10,0x7a,0x00,0x12,0x00,0xc4,0x70,0x03,0x02,0x1c,0x52, +0x7b,0xff,0x8b,0x05,0x7b,0x87,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90, +0x42,0x2a,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a, +0x7b,0xff,0x8b,0x05,0x7b,0x97,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90, +0x42,0x2a,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a, +0x7b,0xff,0x8b,0x05,0x7b,0xa7,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90, +0x42,0x2a,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a, +0x7b,0xff,0x8b,0x05,0x7b,0xb7,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90, +0x42,0x2a,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a, +0x7b,0x00,0x8b,0x05,0x7b,0xc7,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90, +0x42,0x2a,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a, +0x7b,0x00,0x7a,0x00,0x90,0x42,0x2c,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x2c,0xe0, +0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x20,0x7a,0x00,0x12,0x00,0xc4,0x60, +0x46,0x7b,0x00,0x8b,0x05,0x7b,0xd7,0x7a,0x43,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04, +0x90,0x42,0x2a,0xe0,0xfa,0xa3,0xe0,0xfb,0x78,0x03,0x12,0x01,0x46,0x00,0x20,0x12, +0x03,0xc7,0x12,0x05,0xe4,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x2c,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x2c,0x7a, +0x42,0x12,0x02,0x42,0x02,0x80,0xa5,0x7b,0x2a,0x7a,0x42,0x12,0x02,0x42,0x02,0x02, +0x1b,0x28,0x02,0x05,0x9c,0x74,0x02,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03, +0x61,0x04,0x00,0x12,0x03,0x38,0x04,0x00,0x8b,0x05,0x7b,0x04,0x7c,0x00,0x12,0x02, +0xc4,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xf8,0x7a,0xff,0x12,0x03,0xc7,0x90,0x42, +0x2e,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x2e,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05, +0x8a,0x04,0x7b,0x0c,0x7a,0x00,0x12,0x03,0xd8,0x8b,0x05,0x8a,0x04,0x12,0x03,0x61, +0x04,0x00,0x12,0x03,0x38,0x05,0x00,0x12,0x05,0xd6,0x8b,0x05,0x7b,0x7f,0xeb,0x5d, +0xfb,0x12,0x05,0xf2,0x7a,0x00,0x12,0x03,0xcf,0x90,0x42,0x2e,0xea,0xf0,0xeb,0xa3, +0xf0,0x90,0x42,0x2e,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x80,0x7a, +0x00,0x12,0x03,0xd8,0x8b,0x05,0x8a,0x04,0x12,0x03,0x61,0x04,0x00,0x12,0x03,0x38, +0x07,0x00,0x12,0x05,0xd6,0x8b,0x05,0x7b,0x7f,0xeb,0x5d,0xfb,0x12,0x05,0xf2,0x7a, +0x00,0x12,0x03,0xc7,0x8b,0x05,0x8a,0x04,0x7b,0xc0,0x7a,0xff,0x12,0x03,0xc7,0x90, +0x42,0x2e,0xea,0xf0,0xeb,0xa3,0xf0,0x7b,0x00,0x7a,0x36,0x8b,0x05,0x8a,0x04,0x7b, +0x2e,0x7a,0x42,0x12,0x00,0x53,0x90,0x42,0x2e,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05, +0x8a,0x04,0x12,0x03,0x61,0x04,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x08, +0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xf2,0x12,0x03,0x12,0x02,0x05,0x9c,0xe4,0x78, +0x00,0x79,0x04,0x12,0x05,0x58,0x7b,0x14,0x7a,0x00,0x90,0x00,0x02,0x12,0x06,0x26, +0x90,0x88,0x43,0xe0,0x70,0x03,0x02,0x1e,0x84,0x7b,0x00,0x90,0x88,0x43,0xeb,0xf0, +0x7b,0x00,0x7a,0x00,0x90,0x42,0x34,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x34,0xe0, +0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x80,0x7a,0x00,0x12,0x00,0xc4,0x70, +0x03,0x02,0x1e,0x84,0x7b,0xc1,0x7a,0x4a,0x8b,0x05,0x8a,0x04,0x90,0x42,0x34,0xe0, +0xfa,0xa3,0xe0,0xfb,0xeb,0x2b,0xfb,0xea,0x3a,0xfa,0x12,0x03,0xc7,0x8a,0x83,0x8b, +0x82,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x42,0x3e,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42, +0x3e,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x00,0x7a,0x00,0x12,0x01, +0x3b,0x60,0x0e,0x90,0x42,0x3e,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x00,0x02,0x12,0x1c, +0x55,0x7b,0xb3,0x7a,0x7f,0x8b,0x05,0x8a,0x04,0x90,0x42,0x34,0xe0,0xfa,0xa3,0xe0, +0xfb,0xeb,0x2b,0xfb,0xea,0x3a,0xfa,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfa, +0xa3,0xe0,0xfb,0x90,0x42,0x3c,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x3c,0xe0,0xfa, +0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00,0x12,0x03,0xc7,0x90,0x42, +0x3a,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x3c,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83, +0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x90,0x42,0x36,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42, +0x36,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x00,0x7a,0x00,0x12,0x00, +0x8e,0x60,0x36,0x90,0x42,0x3a,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x3e,0x02,0x00, +0x90,0x42,0x3e,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x3e,0xe0,0xfa,0xa3,0xe0,0xfb, +0x90,0x00,0x02,0x12,0x1c,0x55,0x7b,0x36,0x7a,0x42,0x12,0x02,0x48,0x02,0x7b,0x3a, +0x7a,0x42,0x12,0x02,0x1d,0x00,0x04,0x80,0xb5,0x7b,0x34,0x7a,0x42,0x12,0x02,0x42, +0x02,0x02,0x1d,0x6c,0x7b,0x00,0x7a,0x00,0x90,0x42,0x34,0xea,0xf0,0xeb,0xa3,0xf0, +0x90,0x42,0x34,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x10,0x7a,0x00, +0x12,0x00,0xc4,0x70,0x03,0x02,0x1f,0x26,0x90,0x42,0x34,0xe0,0xfa,0xa3,0xe0,0xfb, +0x8b,0x05,0x7b,0xe0,0x7a,0x45,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x34, +0xe0,0xfa,0xa3,0xe0,0xfb,0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x12, +0x05,0xe4,0x12,0x03,0x0a,0x7b,0x00,0x8b,0x05,0x7b,0xe0,0x7a,0x45,0x12,0x05,0xc8, +0x8b,0x05,0x8a,0x04,0x90,0x42,0x34,0xe0,0xfa,0xa3,0xe0,0xfb,0x78,0x03,0x12,0x01, +0x46,0x00,0x0e,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04, +0x7b,0x01,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x90,0x42,0x34, +0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x00,0x01,0x12,0x32,0x3e,0x7b,0x34,0x7a,0x42,0x12, +0x02,0x42,0x02,0x02,0x1e,0x90,0x7b,0x00,0x7a,0x00,0x90,0x42,0x34,0xea,0xf0,0xeb, +0xa3,0xf0,0x90,0x42,0x34,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x18, +0x7a,0x00,0x12,0x00,0xc4,0x70,0x03,0x02,0x20,0xf4,0x7b,0xff,0x8b,0x05,0x7b,0x02, +0x7a,0x00,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x34,0xe0,0xfa,0xa3,0xe0, +0xfb,0x78,0x03,0x12,0x01,0x46,0x00,0x0a,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x05, +0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12, +0x03,0x0a,0x7b,0x80,0x8b,0x05,0x7b,0x02,0x7a,0x00,0x12,0x05,0xc8,0x8b,0x05,0x8a, +0x04,0x90,0x42,0x34,0xe0,0xfa,0xa3,0xe0,0xfb,0x78,0x03,0x12,0x01,0x46,0x00,0x0a, +0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x02,0x7a, +0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x00,0x7a,0x00,0x8b,0x05, +0x8a,0x04,0x7b,0x02,0x7a,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x90,0x42,0x34, +0xe0,0xfa,0xa3,0xe0,0xfb,0x78,0x03,0x12,0x01,0x46,0x00,0x0a,0x12,0x03,0xc7,0x12, +0x05,0xf2,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00,0x12,0x03,0xc7, +0x12,0x05,0xf2,0x12,0x03,0x12,0x90,0x42,0x34,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05, +0x7b,0x02,0x7a,0x00,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x34,0xe0,0xfa, +0xa3,0xe0,0xfb,0x78,0x03,0x12,0x01,0x46,0x00,0x0a,0x12,0x03,0xc7,0x12,0x05,0xe4, +0x12,0x03,0x0a,0x7b,0x02,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x90,0x42,0x34,0xe0,0xfa, +0xa3,0xe0,0xfb,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0xff,0x12,0x03, +0xc7,0x12,0x05,0xf2,0x78,0x03,0x12,0x01,0x46,0x00,0x0a,0x12,0x03,0xc7,0x8b,0x05, +0x8a,0x04,0x7b,0x02,0x7a,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x90,0x42,0x34, +0xe0,0xfa,0xa3,0xe0,0xfb,0x78,0x03,0x12,0x01,0x46,0x00,0x0a,0x12,0x03,0xc7,0x12, +0x05,0xf2,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x06,0x7a,0x00,0x12,0x03,0xc7, +0x12,0x05,0xf2,0x12,0x03,0x12,0x7b,0x02,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x90,0x42, +0x34,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a, +0x00,0x12,0x03,0xc7,0x12,0x05,0xf2,0x78,0x03,0x12,0x01,0x46,0x00,0x0a,0x12,0x03, +0xc7,0x8b,0x05,0x8a,0x04,0x7b,0x02,0x7a,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04, +0x90,0x42,0x34,0xe0,0xfa,0xa3,0xe0,0xfb,0x78,0x03,0x12,0x01,0x46,0x00,0x0a,0x12, +0x03,0xc7,0x12,0x05,0xf2,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x08,0x7a,0x00, +0x12,0x03,0xc7,0x12,0x05,0xf2,0x12,0x03,0x12,0x7b,0x34,0x7a,0x42,0x12,0x02,0x42, +0x02,0x02,0x1f,0x32,0x7b,0x00,0x7a,0x00,0x90,0x00,0x08,0xea,0xf0,0xeb,0xa3,0xf0, +0x7b,0x00,0x7a,0x00,0x90,0x00,0xf0,0xea,0xf0,0xeb,0xa3,0xf0,0x7b,0x02,0x7a,0x00, +0x90,0x45,0xd8,0xea,0xf0,0xeb,0xa3,0xf0,0x7b,0xe8,0x7a,0x00,0x90,0x45,0xda,0xea, +0xf0,0xeb,0xa3,0xf0,0x7b,0x00,0x7a,0x00,0x90,0x45,0xde,0xea,0xf0,0xeb,0xa3,0xf0, +0x90,0x45,0xdc,0xea,0xf0,0xeb,0xa3,0xf0,0x7b,0x12,0x90,0x46,0xc0,0xeb,0xf0,0x7b, +0x01,0x7a,0x00,0x02,0x05,0x9c,0xe4,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x90,0x00, +0x00,0x12,0x06,0xaf,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58, +0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x09,0x12,0x01,0x28,0x60,0x16,0x12,0x03, +0x55,0x06,0x00,0x12,0x05,0xc1,0x12,0x03,0x55,0x06,0x00,0x90,0x00,0x02,0x12,0x24, +0x93,0x02,0x05,0x9c,0x7b,0xe0,0x7a,0x45,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x04, +0x00,0x7a,0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x90,0x42,0x42, +0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x42,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38, +0x01,0x00,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xff,0x7a,0x00,0x12,0x01,0x2c,0x60, +0x03,0x02,0x05,0x9c,0x7b,0xb3,0x7a,0x7f,0x8b,0x05,0x8a,0x04,0x90,0x42,0x42,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x01,0x00,0x7a,0x00,0xeb,0x2b,0xfb,0xea,0x3a, +0xfa,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x42,0x48, +0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x48,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a, +0x04,0x7b,0x04,0x7a,0x00,0x12,0x03,0xc7,0x90,0x42,0x46,0xea,0xf0,0xeb,0xa3,0xf0, +0x90,0x42,0x48,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x90,0x42, +0x44,0xeb,0xf0,0x90,0x42,0x44,0xe0,0xfb,0x8b,0x05,0x7b,0x00,0x12,0x00,0x82,0x70, +0x03,0x02,0x24,0x90,0x90,0x42,0x46,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82, +0xe0,0xfb,0x8b,0x05,0x12,0x03,0x55,0x05,0x00,0x12,0x00,0xa9,0x70,0x19,0x90,0x42, +0x46,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x01,0x00,0x8b,0x05,0x12,0x03,0x55, +0x05,0x00,0x12,0x00,0xdb,0x60,0x03,0x02,0x24,0x7c,0x90,0x42,0x46,0xe0,0xfa,0xa3, +0xe0,0xfb,0x12,0x03,0x3e,0x02,0x00,0x90,0x42,0x4a,0xea,0xf0,0xeb,0xa3,0xf0,0x90, +0x00,0x00,0x12,0x3a,0xeb,0x90,0x42,0x40,0xea,0xf0,0xeb,0xa3,0xf0,0x8b,0x05,0x8a, +0x04,0x7b,0x00,0x7a,0x00,0x12,0x01,0x2c,0x60,0x03,0x02,0x05,0x9c,0x90,0x42,0x40, +0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x02,0x00,0x8b,0x05,0x7b,0x80,0x12,0x01, +0x37,0x60,0x14,0x90,0x42,0x40,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0, +0xfb,0x90,0x00,0x01,0x12,0x39,0xf6,0x90,0x42,0x40,0xe0,0xfa,0xa3,0xe0,0xfb,0x12, +0x03,0x3e,0x04,0x00,0x8b,0x05,0x8a,0x04,0x90,0x42,0x4a,0xe0,0xfa,0xa3,0xe0,0xfb, +0x12,0x01,0x3b,0x60,0x63,0x90,0x42,0x4a,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38, +0x03,0x00,0x12,0x05,0xc1,0x90,0x42,0x4a,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38, +0x04,0x00,0x8b,0x05,0x7b,0x01,0xeb,0x5d,0xfb,0x12,0x05,0xc1,0x90,0x42,0x40,0xe0, +0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x90,0x00,0x03,0x12,0x39,0x8b, +0x90,0x42,0x4a,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x90,0x42,0x40,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00,0x12, +0x03,0xc7,0x12,0x05,0xf2,0x12,0x03,0x12,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x90, +0x42,0x40,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x01, +0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x12,0x03,0x55,0x05,0x00, +0x8b,0x05,0x90,0x42,0x40,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a, +0x04,0x7b,0x02,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x12,0x03, +0x55,0x06,0x00,0x8b,0x05,0x90,0x42,0x40,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8, +0x8b,0x05,0x8a,0x04,0x7b,0x03,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03, +0x0a,0x90,0x42,0x42,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x0d,0x00,0x8b,0x05, +0x7b,0x01,0xeb,0x5d,0xfb,0x12,0x05,0xc1,0x90,0x42,0x40,0xe0,0xfa,0xa3,0xe0,0xfb, +0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x90,0x00,0x02,0x12,0x3a,0x0d,0x90,0x42,0x40,0xe0, +0xfa,0xa3,0xe0,0xfb,0x90,0x00,0x02,0x12,0x3b,0x2b,0x90,0x42,0x40,0xe0,0xfa,0xa3, +0xe0,0xfb,0x90,0x00,0x02,0x12,0x2d,0x5b,0x90,0x42,0x4a,0xe0,0xfa,0xa3,0xe0,0xfb, +0x8b,0x05,0x8a,0x04,0x7b,0x0b,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xcf,0x90,0x42, +0x40,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x90,0x00,0x03,0x12, +0x38,0xd9,0x90,0x42,0x4a,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb, +0x8b,0x05,0x7b,0x04,0x7c,0x00,0x12,0x02,0xc4,0x90,0x42,0x45,0xeb,0xf0,0x90,0x42, +0x45,0xe0,0xfb,0x8b,0x05,0x7b,0x00,0x12,0x01,0x28,0x60,0x12,0x90,0x42,0x42,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x09,0x00,0x90,0x42,0x45,0xeb,0xf0,0x90,0x42, +0x45,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x40,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83, +0x8b,0x82,0xe0,0xfb,0x90,0x00,0x02,0x12,0x39,0xd9,0x80,0x14,0x7b,0x44,0x7a,0x42, +0x12,0x02,0x48,0x01,0x7b,0x46,0x7a,0x42,0x12,0x02,0x1d,0x00,0x04,0x02,0x22,0x23, +0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x7b,0xc1,0x7a,0x4a, +0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0xeb,0x2b,0xfb,0xea,0x3a, +0xfa,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x42,0x51, +0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x51,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a, +0x04,0x7b,0x00,0x7a,0x00,0x12,0x01,0x2c,0x60,0x03,0x02,0x05,0x9c,0x7b,0x5e,0x7a, +0x46,0x90,0x42,0x4e,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x00,0x00,0x12,0x3a,0xeb,0x90, +0x42,0x4c,0xea,0xf0,0xeb,0xa3,0xf0,0x8b,0x05,0x8a,0x04,0x7b,0x00,0x7a,0x00,0x12, +0x01,0x2c,0x60,0x03,0x02,0x05,0x9c,0x90,0x42,0x4c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12, +0x03,0x38,0x02,0x00,0x8b,0x05,0x7b,0x80,0x12,0x01,0x37,0x60,0x14,0x90,0x42,0x4c, +0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x90,0x00,0x01,0x12,0x39, +0xf6,0x90,0x42,0x4c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x3e,0x04,0x00,0x8b,0x05, +0x8a,0x04,0x90,0x42,0x51,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x01,0x3b,0x60,0x63,0x90, +0x42,0x51,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x03,0x00,0x12,0x05,0xc1,0x90, +0x42,0x51,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x04,0x00,0x8b,0x05,0x7b,0x01, +0xeb,0x5d,0xfb,0x12,0x05,0xc1,0x90,0x42,0x4c,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83, +0x8b,0x82,0xe0,0xfb,0x90,0x00,0x03,0x12,0x39,0x8b,0x90,0x42,0x51,0xe0,0xfa,0xa3, +0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x90,0x42,0x4c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05, +0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xf2,0x12, +0x03,0x12,0x7b,0x09,0x8b,0x05,0x90,0x42,0x4c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05, +0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12, +0x03,0x0a,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x90,0x42,0x4c,0xe0,0xfa,0xa3,0xe0, +0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x02,0x7a,0x00,0x12,0x03,0xc7,0x12, +0x05,0xe4,0x12,0x03,0x0a,0x12,0x03,0x55,0x05,0x00,0x8b,0x05,0x90,0x42,0x4c,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x03,0x7a,0x00,0x12, +0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x90,0x42,0x4e,0xe0,0xfa,0xa3,0xe0,0xfb, +0x12,0x03,0x38,0x0d,0x00,0x8b,0x05,0x7b,0x01,0xeb,0x5d,0xfb,0x12,0x05,0xc1,0x90, +0x42,0x4c,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x90,0x00,0x02, +0x12,0x3a,0x0d,0x90,0x42,0x4c,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x00,0x02,0x12,0x3b, +0x2b,0x90,0x42,0x4c,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x00,0x02,0x12,0x2d,0x5b,0x90, +0x42,0x51,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x0b,0x7a,0x00,0x12, +0x03,0xc7,0x12,0x05,0xcf,0x90,0x42,0x4c,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b, +0x82,0xe0,0xfb,0x90,0x00,0x03,0x12,0x38,0xd9,0x90,0x42,0x51,0xe0,0xfa,0xa3,0xe0, +0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x8b,0x05,0x7b,0x04,0x7c,0x00,0x12,0x02,0xc4, +0x90,0x42,0x50,0xeb,0xf0,0x90,0x42,0x50,0xe0,0xfb,0x8b,0x05,0x7b,0x00,0x12,0x01, +0x28,0x60,0x12,0x90,0x42,0x4e,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x09,0x00, +0x90,0x42,0x50,0xeb,0xf0,0x90,0x42,0x50,0xe0,0xfb,0x12,0x05,0xc1,0x90,0x42,0x4c, +0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x90,0x00,0x02,0x12,0x39, +0xd9,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x7b,0xe0,0x7a, +0x45,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0x78,0x03,0x12,0x01, +0x46,0x00,0x0e,0x12,0x03,0xc7,0x12,0x03,0x38,0x0d,0x00,0x8b,0x05,0x7b,0x00,0xeb, +0x5d,0xfb,0x90,0x42,0x57,0xeb,0xf0,0x90,0x45,0xdc,0xe0,0xfa,0xa3,0xe0,0xfb,0x90, +0x42,0x53,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x53,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b, +0x05,0x8a,0x04,0x7b,0x00,0x7a,0x00,0x12,0x01,0x3b,0x70,0x03,0x02,0x27,0xcf,0x90, +0x42,0x53,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x3e,0x08,0x00,0x90,0x42,0x55,0xea, +0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x53,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x01, +0x00,0x8b,0x05,0x12,0x03,0x55,0x04,0x00,0x12,0x01,0x28,0x60,0x4f,0x90,0x42,0x53, +0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x02,0x00,0x8b,0x05,0x12,0x03,0x55,0x05, +0x00,0x12,0x01,0x28,0x60,0x36,0x90,0x42,0x57,0xe0,0x60,0x22,0x7b,0x81,0x8b,0x05, +0x90,0x42,0x53,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b, +0x02,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x80,0x0e,0x90,0x42, +0x53,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x00,0x02,0x12,0x31,0x2c,0x90,0x42,0x55,0xe0, +0xfa,0xa3,0xe0,0xfb,0x90,0x42,0x53,0xea,0xf0,0xeb,0xa3,0xf0,0x02,0x27,0x27,0x02, +0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x02,0x05,0x9c,0x74,0x01, +0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04, +0x12,0x05,0x58,0x90,0x42,0x00,0xe0,0x60,0x4f,0x7b,0xd4,0x7a,0x94,0x8b,0x05,0x8a, +0x04,0x12,0x03,0x55,0x05,0x00,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0, +0xfb,0x8b,0x05,0x7b,0xe0,0x7a,0x45,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x12,0x03, +0x55,0x05,0x00,0x7a,0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x12, +0x05,0xe4,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a,0x00,0x12,0x03,0xc7, +0x12,0x05,0xe4,0x12,0x03,0x0a,0x80,0x3a,0x12,0x03,0x55,0x05,0x00,0x8b,0x05,0x7b, +0xe0,0x7a,0x45,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x05,0x00,0x7a, +0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x05, +0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12, +0x03,0x0a,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03, +0x55,0x04,0x00,0x8b,0x05,0x7b,0x09,0x12,0x01,0x28,0x60,0x03,0x02,0x05,0x9c,0x7b, +0xe0,0x7a,0x45,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0x78,0x03, +0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x90,0x42,0x58,0xea,0xf0,0xeb,0xa3,0xf0, +0x12,0x03,0x55,0x05,0x00,0x8b,0x05,0x90,0x42,0x58,0xe0,0xfa,0xa3,0xe0,0xfb,0x12, +0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4, +0x12,0x03,0x0a,0x90,0x42,0x58,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x00,0x02,0x12,0x3b, +0xe5,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03,0x55, +0x04,0x00,0x8b,0x05,0x7b,0x09,0x12,0x01,0x28,0x60,0x03,0x02,0x05,0x9c,0x12,0x03, +0x61,0x05,0x00,0x12,0x04,0x68,0x00,0x00,0x00,0x02,0x2a,0x54,0x29,0x22,0x29,0x74, +0x29,0xe2,0x12,0x03,0x55,0x07,0x00,0x8b,0x05,0x7b,0x0c,0x12,0x00,0xa9,0x60,0x07, +0x7b,0x0c,0x12,0x03,0x94,0x07,0x00,0x12,0x03,0x55,0x07,0x00,0x8b,0x05,0x7b,0xe0, +0x7a,0x45,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x05,0x00,0x7a,0x00, +0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x05,0xc8, +0x8b,0x05,0x8a,0x04,0x7b,0x05,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03, +0x0a,0x02,0x2a,0x54,0x7b,0xe0,0x7a,0x45,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x04, +0x00,0x7a,0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x90,0x42,0x5a, +0xea,0xf0,0xeb,0xa3,0xf0,0x12,0x03,0x55,0x07,0x00,0xeb,0x33,0xe4,0x95,0xe0,0xfa, +0x8b,0x05,0x8a,0x04,0x7b,0xc0,0x7a,0xff,0x12,0x03,0xc7,0x8b,0x05,0x8a,0x04,0x7b, +0x01,0x12,0x02,0xdf,0x8b,0x05,0x90,0x42,0x5a,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05, +0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x08,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12, +0x03,0x0a,0x90,0x42,0x5a,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x00,0x02,0x12,0x3b,0xe5, +0x80,0x72,0x7b,0xe0,0x7a,0x45,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x04,0x00,0x7a, +0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x90,0x42,0x5a,0xea,0xf0, +0xeb,0xa3,0xf0,0x12,0x03,0x55,0x07,0x00,0xeb,0x33,0xe4,0x95,0xe0,0xfa,0x8b,0x05, +0x8a,0x04,0x7b,0xc0,0x7a,0xff,0x12,0x03,0xc7,0x8b,0x05,0x8a,0x04,0x7b,0x80,0x7a, +0x00,0x12,0x03,0xd8,0x8b,0x05,0x8a,0x04,0x90,0x42,0x5a,0xe0,0xfa,0xa3,0xe0,0xfb, +0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x06,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05, +0xf2,0x12,0x03,0x12,0x90,0x42,0x5a,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x00,0x02,0x12, +0x3b,0xe5,0x80,0x00,0x02,0x05,0x9c,0xe4,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x90, +0x00,0x00,0x12,0x1d,0x3e,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05, +0x58,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0xf0,0x7a,0x00, +0x12,0x01,0x2c,0x60,0x09,0x7b,0x01,0x90,0x46,0xc1,0xeb,0xf0,0x80,0x5b,0x90,0x46, +0xc1,0xe0,0xfb,0x8b,0x05,0x7b,0x02,0x12,0x01,0x28,0x60,0x0a,0x7b,0xc1,0x7a,0x46, +0x12,0x02,0x42,0x01,0x80,0x43,0x90,0x46,0xc1,0xe0,0xfb,0x8b,0x05,0x7b,0x05,0x12, +0x01,0x18,0x60,0x35,0x7b,0x44,0x7a,0x88,0x8b,0x05,0x8a,0x04,0x90,0x46,0xc1,0xe0, +0xfb,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x8b,0x05,0x12,0x03, +0x55,0x04,0x00,0x12,0x01,0x28,0x60,0x0a,0x7b,0xc1,0x7a,0x46,0x12,0x02,0x42,0x01, +0x80,0x07,0x7b,0xe7,0x90,0x46,0xc1,0xeb,0xf0,0x90,0x46,0xc1,0xe0,0xfb,0x8b,0x05, +0x7b,0x06,0x12,0x01,0x28,0x60,0x06,0x90,0x00,0x00,0x12,0x1a,0xf2,0x02,0x05,0x9c, +0x74,0x02,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03,0x61,0x04,0x00,0x8a,0x83, +0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x12,0x03,0x61,0x06,0x00,0x12, +0x00,0x8e,0x60,0x26,0x12,0x03,0x61,0x04,0x00,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a, +0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04, +0x7b,0x80,0x7a,0xff,0x12,0x03,0xc7,0x02,0x05,0x9c,0x7b,0x00,0x7a,0x00,0x90,0x42, +0x5c,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x5c,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05, +0x8a,0x04,0x7b,0x03,0x7a,0x00,0x12,0x00,0xc4,0x70,0x03,0x02,0x2d,0x2a,0x12,0x03, +0x61,0x04,0x00,0x8b,0x05,0x8a,0x04,0x90,0x42,0x5c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12, +0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xf2, +0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x12, +0x03,0x61,0x06,0x00,0x12,0x00,0x8e,0x70,0x03,0x02,0x2d,0x1f,0x12,0x03,0x61,0x04, +0x00,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00,0x12,0x03,0xc7,0x8b,0x05,0x8a,0x04, +0x90,0x42,0x5c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0, +0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x7b,0x80,0x7a,0xff,0x12,0x03,0xc7,0x8b,0x05, +0x8a,0x04,0x12,0x03,0x61,0x04,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x90,0x42, +0x5c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xc7,0x12,0x05,0xf2,0x8a,0x83,0x8b,0x82, +0xe0,0xfb,0x7a,0x00,0x12,0x04,0x1c,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x12,0x03, +0x61,0x08,0x00,0x12,0x03,0xc7,0x12,0x05,0xf2,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04, +0x12,0x03,0x61,0x06,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00, +0x12,0x03,0xc7,0x12,0x05,0xf2,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x90,0x42,0x5c, +0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a,0x00, +0x12,0x03,0xc7,0x12,0x05,0xf2,0x12,0x03,0xc7,0x12,0x05,0xf2,0x8a,0x83,0x8b,0x82, +0xe0,0xfb,0x7a,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x12,0x03,0x61,0x08,0x00, +0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05, +0xf2,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x90,0x42,0x5c,0xe0,0xfa,0xa3,0xe0,0xfb, +0x12,0x03,0xc7,0x12,0x05,0xf2,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x12,0x03, +0xcf,0x12,0x05,0xf2,0x12,0x03,0xd8,0x12,0x05,0xf2,0x12,0x05,0xd6,0x8b,0x05,0x8a, +0x04,0x12,0x03,0x61,0x06,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x90,0x42,0x5c, +0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a,0x00, +0x12,0x03,0xc7,0x12,0x05,0xf2,0x12,0x03,0xc7,0x12,0x05,0xf2,0x8a,0x83,0x8b,0x82, +0xe0,0xfb,0x7a,0x00,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x12,0x03,0x61,0x08,0x00, +0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x90,0x42,0x5c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12, +0x03,0xc7,0x12,0x05,0xf2,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x12,0x03,0xcf, +0x12,0x05,0xf2,0x12,0x03,0xed,0x12,0x05,0xf2,0x12,0x03,0xc7,0x02,0x05,0x9c,0x7b, +0x5c,0x7a,0x42,0x12,0x02,0x42,0x02,0x02,0x2b,0x56,0x12,0x03,0x61,0x04,0x00,0x8b, +0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00,0x12,0x03,0xc7,0x8b,0x05,0x8a,0x04,0x7b,0x03, +0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x8b,0x05,0x8a, +0x04,0x7b,0x80,0x7a,0xff,0x12,0x03,0xc7,0x02,0x05,0x9c,0x74,0x02,0x78,0x00,0x79, +0x04,0x12,0x05,0x58,0x12,0x03,0x61,0x04,0x00,0x12,0x03,0x3e,0x04,0x00,0x12,0x03, +0x38,0x02,0x00,0x90,0x42,0x5e,0xeb,0xf0,0x7b,0x00,0x7a,0x00,0x90,0x42,0x61,0xea, +0xf0,0xeb,0xa3,0xf0,0x7b,0xb3,0x7a,0x80,0x8b,0x05,0x8a,0x04,0x90,0x42,0x5e,0xe0, +0xfb,0x12,0x05,0xd6,0x8b,0x05,0x7b,0x04,0x7c,0x00,0x12,0x02,0xc4,0x12,0x05,0xf2, +0x7a,0x00,0xeb,0x2b,0xfb,0xea,0x3a,0xfa,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0, +0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x12,0x03,0x61,0x04,0x00,0x12,0x03,0x38, +0x03,0x00,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x7a,0x00,0x90, +0x42,0x5f,0xea,0xf0,0xeb,0xa3,0xf0,0x12,0x03,0x61,0x04,0x00,0x12,0x03,0x38,0x01, +0x00,0x8b,0x05,0x7b,0x09,0x12,0x01,0x37,0x70,0x03,0x02,0x2e,0x7b,0x12,0x03,0x61, +0x04,0x00,0x12,0x03,0x3e,0x04,0x00,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x8b,0x05,0x7b, +0x0f,0xeb,0x5d,0xfb,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x90,0x42,0x5e,0xe0,0xfb,0x12, +0x05,0xd6,0x8b,0x05,0x7b,0x0f,0xeb,0x5d,0xfb,0x12,0x05,0xf2,0x7a,0x00,0x12,0x05, +0xd6,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x12,0x02,0xdf,0x12,0x05,0xf2,0x12,0x03,0xc7, +0x8b,0x05,0x8a,0x04,0x7b,0x5f,0x7a,0x42,0x12,0x00,0x53,0x12,0x03,0x61,0x04,0x00, +0x12,0x03,0x38,0x02,0x00,0x7a,0x00,0x12,0x05,0xcf,0x7b,0xcb,0x7a,0x80,0x8b,0x05, +0x8a,0x04,0x12,0x03,0x61,0x06,0x00,0x12,0x03,0x3e,0x04,0x00,0x12,0x03,0x38,0x10, +0x00,0x7a,0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x08,0x12,0x03,0xc7,0x90,0x00,0x04, +0x12,0x2b,0x00,0x90,0x42,0x61,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x5f,0xe0,0xfa, +0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x7e,0x7a,0x00,0x12,0x00,0x8e,0x60,0x0c, +0x7b,0x7e,0x7a,0x00,0x90,0x42,0x5f,0xea,0xf0,0xeb,0xa3,0xf0,0x12,0x03,0x61,0x04, +0x00,0x12,0x03,0x3e,0x04,0x00,0x12,0x03,0x38,0x0a,0x00,0x8b,0x05,0x7b,0x01,0x7c, +0x00,0x12,0x02,0xc4,0x7a,0x00,0x12,0x04,0x1c,0x8b,0x05,0x8a,0x04,0x7b,0x7f,0x7a, +0x00,0x12,0x03,0xc7,0x90,0x42,0x63,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x61,0xe0, +0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x63,0x7a,0x42,0x12,0x00,0x53,0x90, +0x42,0x63,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x7f,0x7a,0x00,0x12, +0x00,0x8e,0x60,0x0c,0x7b,0x7f,0x7a,0x00,0x90,0x42,0x63,0xea,0xf0,0xeb,0xa3,0xf0, +0x90,0x42,0x63,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x01,0x7a,0x00, +0x12,0x00,0xc4,0x60,0x0c,0x7b,0x01,0x7a,0x00,0x90,0x42,0x63,0xea,0xf0,0xeb,0xa3, +0xf0,0x7b,0x7f,0x7a,0x00,0x8b,0x05,0x8a,0x04,0x90,0x42,0x5f,0xe0,0xfa,0xa3,0xe0, +0xfb,0x12,0x03,0xcf,0x8b,0x05,0x8a,0x04,0x90,0x42,0x63,0xe0,0xfa,0xa3,0xe0,0xfb, +0x12,0x03,0xd8,0x8b,0x05,0x8a,0x04,0x7b,0x7f,0x7a,0x00,0x12,0x03,0xed,0x90,0x42, +0x63,0xea,0xf0,0xeb,0xa3,0xf0,0x7b,0xe0,0x7a,0x45,0x8b,0x05,0x8a,0x04,0x12,0x03, +0x61,0x04,0x00,0x12,0x03,0x38,0x01,0x00,0x7a,0x00,0x78,0x03,0x12,0x01,0x46,0x00, +0x0e,0x12,0x03,0xc7,0x12,0x03,0x38,0x0c,0x00,0x7a,0x00,0x12,0x04,0x1c,0x8b,0x05, +0x8a,0x04,0x7b,0x7f,0x7a,0x00,0x12,0x03,0xc7,0x8b,0x05,0x8a,0x04,0x90,0x42,0x63, +0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xd8,0x8b,0x05,0x8a,0x04,0x7b,0x7f,0x7a,0x00, +0x12,0x03,0xed,0x90,0x42,0x63,0xea,0xf0,0xeb,0xa3,0xf0,0x7b,0x7f,0x7a,0x00,0x8b, +0x05,0x8a,0x04,0x90,0x42,0x63,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0xcf,0x90,0x42, +0x63,0xea,0xf0,0xeb,0xa3,0xf0,0x12,0x03,0x61,0x04,0x00,0x12,0x03,0x38,0x01,0x00, +0x8b,0x05,0x7b,0x09,0x12,0x01,0x28,0x60,0x12,0x90,0x46,0xc0,0xe0,0xfb,0x7a,0x00, +0x8b,0x05,0x8a,0x04,0x7b,0x63,0x7a,0x42,0x12,0x00,0x53,0x90,0x42,0x63,0xe0,0xfa, +0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x7e,0x7a,0x00,0x12,0x00,0x8e,0x60,0x0c, +0x7b,0x7e,0x7a,0x00,0x90,0x42,0x63,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x63,0xe0, +0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x00,0x7a,0x00,0x12,0x00,0xc4,0x60, +0x0c,0x7b,0x00,0x7a,0x00,0x90,0x42,0x63,0xea,0xf0,0xeb,0xa3,0xf0,0x7b,0x01,0x12, +0x05,0xc1,0x90,0x42,0x63,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc1,0x12,0x03,0x61, +0x06,0x00,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x90,0x00,0x03,0x12,0x39,0xbc,0x02,0x05, +0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x7b,0x4a,0x7a,0x88,0x8b,0x05, +0x8a,0x04,0x7b,0xe0,0x7a,0x45,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55, +0x06,0x00,0x7a,0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x12,0x05, +0xf2,0x12,0x03,0x38,0x03,0x00,0x7a,0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0, +0xfb,0x8b,0x05,0x7b,0xe0,0x7a,0x45,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x12,0x03, +0x55,0x05,0x00,0x7a,0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x12, +0x05,0xe4,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x0c,0x7a,0x00,0x12,0x03,0xc7, +0x12,0x05,0xe4,0x12,0x03,0x0a,0x90,0x45,0xdc,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x42, +0x65,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x65,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05, +0x8a,0x04,0x7b,0x00,0x7a,0x00,0x12,0x01,0x3b,0x60,0x3e,0x90,0x42,0x65,0xe0,0xfa, +0xa3,0xe0,0xfb,0x12,0x03,0x38,0x01,0x00,0x8b,0x05,0x12,0x03,0x55,0x04,0x00,0x12, +0x01,0x28,0x60,0x0e,0x90,0x42,0x65,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x00,0x02,0x12, +0x2d,0x5b,0x90,0x42,0x65,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x3e,0x08,0x00,0x90, +0x42,0x65,0xea,0xf0,0xeb,0xa3,0xf0,0x80,0xad,0x02,0x05,0x9c,0x74,0x02,0x78,0x00, +0x79,0x04,0x12,0x05,0x58,0x12,0x03,0x61,0x04,0x00,0x8a,0x83,0x8b,0x82,0xe0,0xfb, +0x90,0x00,0x01,0x12,0x39,0xf6,0x7b,0x80,0x8b,0x05,0x12,0x03,0x61,0x04,0x00,0x12, +0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x02,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4, +0x12,0x03,0x0a,0x12,0x03,0x61,0x04,0x00,0x12,0x05,0xcf,0x7b,0xdc,0x7a,0x45,0x90, +0x00,0x04,0x12,0x3a,0x87,0x12,0x03,0x61,0x04,0x00,0x12,0x05,0xcf,0x7b,0xd8,0x7a, +0x45,0x90,0x00,0x04,0x12,0x3a,0x30,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04, +0x12,0x05,0x58,0x90,0x45,0xdc,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x42,0x67,0xea,0xf0, +0xeb,0xa3,0xf0,0x90,0x42,0x67,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b, +0x00,0x7a,0x00,0x12,0x01,0x3b,0x60,0x4e,0x90,0x42,0x67,0xe0,0xfa,0xa3,0xe0,0xfb, +0x12,0x03,0x3e,0x08,0x00,0x90,0x42,0x69,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x67, +0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x01,0x00,0x8b,0x05,0x12,0x03,0x55,0x04, +0x00,0x12,0x01,0x28,0x60,0x0e,0x90,0x42,0x67,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x00, +0x02,0x12,0x31,0x2c,0x90,0x42,0x69,0xe0,0xfa,0xa3,0xe0,0xfb,0x90,0x42,0x67,0xea, +0xf0,0xeb,0xa3,0xf0,0x80,0x9d,0x02,0x05,0x9c,0xe4,0x78,0x00,0x79,0x04,0x12,0x05, +0x58,0x7b,0x00,0x90,0x42,0x6b,0xeb,0xf0,0x90,0x42,0x6b,0xe0,0xfb,0x8b,0x05,0x7b, +0x10,0x12,0x00,0xdb,0x60,0x15,0x90,0x42,0x6b,0xe0,0xfb,0x90,0x00,0x01,0x12,0x31, +0x8a,0x7b,0x6b,0x7a,0x42,0x12,0x02,0x42,0x01,0x80,0xdd,0x02,0x05,0x9c,0x74,0x01, +0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x7b,0xe0,0x7a,0x45,0x8b,0x05,0x8a,0x04,0x12, +0x03,0x55,0x04,0x00,0x7a,0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7, +0x90,0x42,0x6c,0xea,0xf0,0xeb,0xa3,0xf0,0x7b,0x00,0x8b,0x05,0x90,0x42,0x6c,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x02,0x7a,0x00,0x12, +0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x64,0x8b,0x05,0x90,0x42,0x6c,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x03,0x7a,0x00,0x12, +0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x40,0x8b,0x05,0x90,0x42,0x6c,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x04,0x7a,0x00,0x12, +0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x02,0x8b,0x05,0x90,0x42,0x6c,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x05,0x7a,0x00,0x12, +0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x00,0x7a,0x00,0x8b,0x05,0x8a,0x04, +0x90,0x42,0x6c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xd6,0x8b,0x05,0x8a,0x04,0x7b, +0x06,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xf2,0x12,0x03,0x12,0x7b,0x00,0x8b,0x05, +0x90,0x42,0x6c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b, +0x08,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x00,0x8b,0x05, +0x90,0x42,0x6c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b, +0x09,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x00,0x8b,0x05, +0x90,0x42,0x6c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b, +0x0d,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x7b,0x00,0x7a,0x00, +0x8b,0x05,0x8a,0x04,0x90,0x42,0x6c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xd6,0x8b, +0x05,0x8a,0x04,0x7b,0x0a,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xf2,0x12,0x03,0x12, +0x90,0x88,0xae,0xe0,0xfb,0x8b,0x05,0x90,0x42,0x6c,0xe0,0xfa,0xa3,0xe0,0xfb,0x12, +0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x0c,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4, +0x12,0x03,0x0a,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x02, +0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x02,0x05,0x9c,0x74,0x01, +0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04, +0x12,0x05,0x58,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x02, +0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x02,0x05,0x9c,0x74,0x01, +0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x02,0x05,0x9c,0x74,0x01,0x78,0x00,0x79,0x04, +0x12,0x05,0x58,0x7b,0x33,0x7a,0x88,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x05,0x00, +0x12,0x05,0xd6,0x8b,0x05,0x7b,0x03,0x7c,0x00,0x12,0x02,0xc4,0x12,0x05,0xf2,0x7a, +0x00,0x12,0x03,0xc7,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x90,0x42,0x70,0xeb,0xf0,0x90, +0x42,0x70,0xe0,0xfb,0x8b,0x05,0x7b,0xe0,0x7a,0x45,0x12,0x05,0xc8,0x8b,0x05,0x8a, +0x04,0x12,0x03,0x55,0x05,0x00,0x7a,0x00,0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12, +0x03,0xc7,0x12,0x05,0xe4,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b,0x09,0x7a,0x00, +0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x90,0x45,0xdc,0xe0,0xfa,0xa3,0xe0, +0xfb,0x90,0x42,0x6e,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x6e,0xe0,0xfa,0xa3,0xe0, +0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x00,0x7a,0x00,0x12,0x01,0x3b,0x60,0x4c,0x90,0x42, +0x6e,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x01,0x00,0x8b,0x05,0x12,0x03,0x55, +0x04,0x00,0x12,0x01,0x28,0x60,0x1c,0x90,0x42,0x70,0xe0,0xfb,0x12,0x05,0xc1,0x90, +0x42,0x6e,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x90,0x00,0x02, +0x12,0x0a,0xaa,0x90,0x42,0x6e,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x3e,0x08,0x00, +0x90,0x42,0x6e,0xea,0xf0,0xeb,0xa3,0xf0,0x80,0x9f,0x02,0x05,0x9c,0x74,0x01,0x78, +0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03,0x55,0x05,0x00,0x7a,0x00,0x12,0x04,0x68, +0x00,0x07,0x00,0x5b,0x36,0x9b,0x35,0xb0,0x36,0x9b,0x36,0x9b,0x36,0x33,0x36,0x9b, +0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b, +0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b, +0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b, +0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b, +0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b, +0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b, +0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x61,0x36,0x9b,0x36,0x9b,0x36,0x9b, +0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b, +0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b, +0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x9b,0x36,0x86, +0x7b,0xe0,0x7a,0x45,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0x78, +0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x8b,0x05,0x8a,0x04,0x7b,0x03,0x7a, +0x00,0x12,0x03,0xc7,0x90,0x42,0x71,0xea,0xf0,0xeb,0xa3,0xf0,0x12,0x03,0x61,0x06, +0x00,0x8b,0x05,0x8a,0x04,0x7b,0x07,0x12,0x02,0xc4,0x8b,0x05,0x8a,0x04,0x7b,0x7c, +0x7a,0x00,0x12,0x02,0xfa,0x90,0x42,0x73,0xeb,0xf0,0x90,0x42,0x71,0xe0,0xfa,0xa3, +0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb,0x8b,0x05,0x90,0x42,0x73,0xe0,0xfb,0x12, +0x01,0x37,0x60,0x1d,0x90,0x42,0x73,0xe0,0xfb,0x8b,0x05,0x90,0x42,0x71,0xe0,0xfa, +0xa3,0xe0,0xfb,0x12,0x03,0x0a,0x12,0x03,0x55,0x04,0x00,0x90,0x00,0x01,0x12,0x30, +0x51,0x80,0x68,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x09,0x12,0x01,0x28,0x60, +0x02,0x80,0x58,0x12,0x03,0x61,0x06,0x00,0x8b,0x05,0x8a,0x04,0x7b,0x07,0x12,0x02, +0xc4,0x12,0x05,0xc1,0x12,0x03,0x55,0x05,0x00,0x90,0x00,0x02,0x12,0x34,0x0a,0x80, +0x3a,0x12,0x03,0x55,0x04,0x00,0x8b,0x05,0x7b,0x09,0x12,0x01,0x28,0x60,0x02,0x80, +0x2a,0x12,0x03,0x61,0x06,0x00,0x12,0x05,0xc1,0x12,0x03,0x55,0x05,0x00,0x90,0x00, +0x02,0x12,0x37,0xa0,0x80,0x15,0x12,0x03,0x61,0x06,0x00,0x12,0x05,0xc1,0x12,0x03, +0x55,0x05,0x00,0x90,0x00,0x02,0x12,0x36,0x9e,0x80,0x00,0x02,0x05,0x9c,0x74,0x01, +0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03,0x55,0x05,0x00,0x8b,0x05,0x7b,0x40, +0x12,0x01,0x0b,0x60,0x09,0x7b,0x01,0x90,0x42,0x79,0xeb,0xf0,0x80,0x07,0x7b,0x00, +0x90,0x42,0x79,0xeb,0xf0,0x90,0x42,0x79,0xe0,0xfb,0x90,0x42,0x76,0xeb,0xf0,0x7b, +0xe0,0x7a,0x45,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x04,0x00,0x7a,0x00,0x78,0x03, +0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x90,0x42,0x77,0xea,0xf0,0xeb,0xa3,0xf0, +0x90,0x42,0x77,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x0d,0x00,0x8b,0x05,0x7b, +0xfe,0xeb,0x5d,0xfb,0x8b,0x05,0x90,0x42,0x76,0xe0,0xfb,0xeb,0x4d,0xfb,0x8b,0x05, +0x90,0x42,0x77,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a,0x04,0x7b, +0x0d,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x90,0x45,0xdc,0xe0, +0xfa,0xa3,0xe0,0xfb,0x90,0x42,0x74,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x74,0xe0, +0xfa,0xa3,0xe0,0xfb,0x8b,0x05,0x8a,0x04,0x7b,0x00,0x7a,0x00,0x12,0x01,0x3b,0x60, +0x4c,0x90,0x42,0x74,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x01,0x00,0x8b,0x05, +0x12,0x03,0x55,0x04,0x00,0x12,0x01,0x28,0x60,0x1c,0x90,0x42,0x76,0xe0,0xfb,0x12, +0x05,0xc1,0x90,0x42,0x74,0xe0,0xfa,0xa3,0xe0,0xfb,0x8a,0x83,0x8b,0x82,0xe0,0xfb, +0x90,0x00,0x02,0x12,0x3a,0x0d,0x90,0x42,0x74,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03, +0x3e,0x08,0x00,0x90,0x42,0x74,0xea,0xf0,0xeb,0xa3,0xf0,0x80,0x9f,0x02,0x05,0x9c, +0x74,0x01,0x78,0x00,0x79,0x04,0x12,0x05,0x58,0x12,0x03,0x55,0x05,0x00,0x8b,0x05, +0x7b,0x40,0x12,0x01,0x0b,0x60,0x09,0x7b,0x00,0x90,0x42,0x7f,0xeb,0xf0,0x80,0x07, +0x7b,0x00,0x90,0x42,0x7f,0xeb,0xf0,0x90,0x42,0x7f,0xe0,0xfb,0x90,0x42,0x7a,0xeb, +0xf0,0x7b,0xe0,0x7a,0x45,0x8b,0x05,0x8a,0x04,0x12,0x03,0x55,0x04,0x00,0x7a,0x00, +0x78,0x03,0x12,0x01,0x46,0x00,0x0e,0x12,0x03,0xc7,0x90,0x42,0x7b,0xea,0xf0,0xeb, +0xa3,0xf0,0x90,0x42,0x7b,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x0d,0x00,0x8b, +0x05,0x7b,0xff,0xeb,0x5d,0xfb,0x8b,0x05,0x90,0x42,0x7a,0xe0,0xfb,0xeb,0x4d,0xfb, +0x8b,0x05,0x90,0x42,0x7b,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x05,0xc8,0x8b,0x05,0x8a, +0x04,0x7b,0x0d,0x7a,0x00,0x12,0x03,0xc7,0x12,0x05,0xe4,0x12,0x03,0x0a,0x90,0x42, +0x7a,0xe0,0x60,0x03,0x02,0x38,0xb0,0x90,0x45,0xdc,0xe0,0xfa,0xa3,0xe0,0xfb,0x90, +0x42,0x7d,0xea,0xf0,0xeb,0xa3,0xf0,0x90,0x42,0x7d,0xe0,0xfa,0xa3,0xe0,0xfb,0x8b, +0x05,0x8a,0x04,0x7b,0x00,0x7a,0x00,0x12,0x01,0x3b,0x60,0x54,0x90,0x42,0x7d,0xe0, +0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38,0x01,0x00,0x8b,0x05,0x12,0x03,0x55,0x04,0x00, +0x12,0x01,0x28,0x60,0x24,0x90,0x42,0x7d,0xe0,0xfa,0xa3,0xe0,0xfb,0x12,0x03,0x38, +0x02,0x00,0x8b,0x05,0x7b,0x81,0x12,0x01,0x28,0x60,0x0e,0x90,0x42,0x7d,0xe0,0xfa, +0xa3,0xe0,0xfb,0x90,0x00,0x02,0x12,0x31,0x2c,0x90,0x42,0x7d,0xe0,0xfa,0xa3,0xe0, +0xfb,0x12,0x03,0x3e,0x08,0x00,0x90,0x42,0x7d,0xea,0xf0,0xeb,0xa3,0xf0,0x80,0x97, +0x02,0x05,0x9c,0x8b,0xf0,0x12,0x05,0xdd,0xa9,0x03,0xa8,0xf0,0x80,0x00,0xc2,0xb4, +0x90,0xff,0xc4,0xe8,0xf0,0xa3,0xe9,0x00,0xf0,0x74,0x82,0x28,0xf5,0x82,0x74,0x42, +0x34,0x00,0xf5,0x83,0xe9,0xf0,0xd2,0xb4,0x22,0xc2,0xb4,0x7c,0x03,0x7d,0xe8,0x90, +0xff,0xc0,0xe0,0x30,0xe1,0x04,0xdd,0xf7,0xdc,0xf5,0xd2,0xb4,0x12,0x05,0xf2,0xeb, +0x24,0x80,0xf5,0xf0,0xa8,0xf0,0x8c,0x83,0x8d,0x82,0xe0,0xa3,0xac,0x83,0xad,0x82, +0x54,0x3f,0xf9,0x12,0x38,0xbe,0xe5,0xf0,0x24,0x18,0xf5,0xf0,0x7a,0x03,0xa8,0xf0, +0x8c,0x83,0x8d,0x82,0xe0,0xa3,0xac,0x83,0xad,0x82,0xf9,0x12,0x38,0xbe,0xe5,0xf0, +0x24,0x18,0xf5,0xf0,0xda,0xe8,0xa8,0xf0,0x8c,0x83,0x8d,0x82,0xe0,0xa3,0xac,0x83, +0xad,0x82,0x54,0x07,0xf9,0x02,0x38,0xbe,0x22,0xc0,0x03,0x12,0x05,0xe4,0x12,0x05, +0xeb,0xd0,0x00,0xa9,0x05,0x80,0x00,0xe8,0x24,0x38,0xfc,0x74,0x82,0x2c,0xf5,0x82, +0x74,0x42,0x34,0x00,0xf5,0x83,0xe0,0x54,0x08,0xfd,0xe9,0x54,0x0f,0xc4,0x4d,0xfd, +0xeb,0x33,0xea,0x33,0x54,0x07,0x4d,0xf9,0xa8,0x04,0x12,0x38,0xbe,0xec,0xc3,0x94, +0x18,0xfc,0x24,0x82,0xf5,0x82,0x74,0x42,0x34,0x00,0xf5,0x83,0xe0,0x54,0x01,0xfd, +0xeb,0xc3,0x33,0x4d,0xa8,0x04,0xf9,0x02,0x38,0xbe,0x22,0x12,0x05,0xe4,0xc0,0x05, +0x12,0x05,0xe4,0xaa,0x05,0xd0,0x01,0xa8,0x03,0x80,0x00,0xe8,0x24,0x20,0xf8,0x74, +0x82,0x28,0xf5,0x82,0x74,0x42,0x34,0x00,0xf5,0x83,0xe0,0x54,0xfe,0x49,0xf9,0x12, +0x38,0xbe,0xe8,0x24,0xe8,0xf8,0xa9,0x02,0x02,0x38,0xbe,0x22,0x12,0x05,0xe4,0xc0, +0x05,0x12,0x05,0xe4,0xaa,0x05,0xd0,0x01,0xa8,0x03,0x80,0x00,0xe8,0x24,0x50,0xf8, +0xea,0x13,0xe9,0x33,0xf9,0x02,0x38,0xbe,0x22,0x12,0x05,0xe4,0xeb,0x24,0x68,0xf8, +0x74,0x82,0x28,0xf5,0x82,0x74,0x42,0x34,0x00,0xf5,0x83,0xe0,0x54,0x30,0x44,0x80, +0x4d,0xf9,0x02,0x38,0xbe,0x22,0xeb,0x24,0x68,0xf8,0x74,0x82,0x28,0xf5,0x82,0x74, +0x42,0x34,0x00,0xf5,0x83,0xe0,0x54,0x7f,0xf9,0x02,0x38,0xbe,0x22,0x12,0x05,0xe4, +0x80,0x00,0xeb,0x24,0x38,0xf8,0x74,0x82,0x28,0xf5,0x82,0x74,0x42,0x34,0x00,0xf5, +0x83,0xe0,0xbd,0x00,0x05,0x54,0xf7,0x02,0x3a,0x2c,0x44,0x08,0xf9,0x02,0x38,0xbe, +0x12,0x05,0xf2,0xac,0x05,0x02,0x3a,0x38,0x75,0xa0,0x00,0xeb,0x24,0x01,0xf5,0x82, +0xea,0x34,0x00,0xf5,0x83,0xe0,0x70,0x1f,0xec,0xf0,0xe5,0x82,0x24,0x02,0xf5,0x82, +0xe5,0x83,0x34,0x00,0xf5,0x83,0xec,0xf0,0xec,0x24,0x07,0xf8,0xe4,0xf2,0xec,0x24, +0x09,0xf8,0xe4,0xf2,0x02,0x3a,0x86,0xeb,0x24,0x03,0xf5,0x82,0xea,0x34,0x00,0xf5, +0x83,0xe0,0xf9,0x24,0x09,0xf8,0xec,0xf2,0xec,0x24,0x09,0xf8,0xe4,0xf2,0xec,0x24, +0x07,0xf8,0xe9,0xf2,0xec,0xf0,0x22,0x12,0x05,0xf2,0xac,0x05,0x02,0x3a,0x8f,0x75, +0xa0,0x00,0xec,0x24,0x09,0xf8,0xe2,0x70,0x13,0xeb,0x24,0x03,0xf5,0x82,0xea,0x34, +0x00,0xf5,0x83,0xec,0x24,0x07,0xf8,0xe2,0xf0,0x02,0x3a,0xbe,0xec,0x24,0x07,0xf8, +0xe2,0xf5,0xf0,0xec,0x24,0x09,0xf8,0xe2,0x24,0x07,0xf8,0xe5,0xf0,0xf2,0xec,0x24, +0x07,0xf8,0xe2,0x70,0x13,0xeb,0x24,0x01,0xf5,0x82,0xea,0x34,0x00,0xf5,0x83,0xec, +0x24,0x09,0xf8,0xe2,0xf0,0x02,0x3a,0xea,0xec,0x24,0x09,0xf8,0xe2,0xf5,0xf0,0xec, +0x24,0x07,0xf8,0xe2,0x24,0x09,0xf8,0xe5,0xf0,0xf2,0x22,0x90,0x45,0xd9,0xe0,0x60, +0x16,0xf5,0x25,0x7a,0x45,0x7b,0xd8,0xfc,0x12,0x3a,0x8f,0x7a,0x45,0x7b,0xdc,0xac, +0x25,0x12,0x3a,0x38,0x02,0x3b,0x26,0x90,0x45,0xdd,0xe0,0x60,0x16,0xf5,0x25,0x7a, +0x45,0x7b,0xdc,0xfc,0x12,0x3a,0x8f,0x7a,0x45,0x7b,0xdc,0xac,0x25,0x12,0x3a,0x38, +0x02,0x3b,0x26,0x75,0x25,0x00,0x7a,0x00,0xab,0x25,0x22,0x75,0xa0,0x00,0xeb,0x24, +0x02,0xf8,0xe2,0xc3,0x13,0xfc,0xe4,0x92,0xe7,0xfd,0xeb,0x24,0x05,0xf8,0xe2,0x24, +0x05,0x92,0xd5,0xf5,0x82,0xeb,0x24,0x04,0xf8,0xe2,0xa2,0xd5,0x34,0x00,0xf5,0x83, +0xe0,0x30,0xe7,0x04,0x7c,0x1e,0x7d,0x00,0xe5,0x82,0x24,0x03,0xf5,0x82,0xe5,0x83, +0x34,0x00,0xf5,0x83,0xe0,0xf9,0xa3,0xe0,0x2d,0xfd,0xe9,0x3c,0xfc,0xeb,0x24,0x01, +0xf8,0xe2,0x75,0xf0,0x0e,0xa4,0x24,0xea,0xf5,0x82,0xe5,0xf0,0x34,0x45,0xf5,0x83, +0xe0,0xf9,0xa3,0xe0,0x2d,0xfd,0xe9,0x3c,0xfc,0xed,0xc3,0x94,0x00,0xec,0x94,0x60, +0x40,0x04,0x7c,0x5f,0x7d,0xff,0xed,0x33,0xec,0x33,0x75,0xf0,0x0c,0x84,0x94,0x08, +0xfa,0xed,0xc3,0x33,0x24,0xca,0xf5,0x82,0xe5,0xf0,0x34,0x88,0xf5,0x83,0xe0,0xfc, +0xa3,0xe0,0xfd,0xeb,0x24,0x00,0xf8,0xe2,0xf8,0xa9,0x02,0xaa,0x04,0xab,0x05,0x12, +0x39,0x47,0x22,0x12,0x05,0xe4,0x80,0x00,0xbb,0x09,0x01,0x22,0xeb,0x75,0xf0,0x0e, +0xa4,0x24,0xe4,0xf5,0x82,0xe5,0xf0,0x34,0x45,0xf5,0x83,0xed,0xf0,0xa9,0x03,0xaa, +0x83,0xab,0x82,0x80,0x12,0x8b,0x82,0x8a,0x83,0xe0,0xf9,0x80,0x00,0x74,0x04,0x2b, +0xf5,0x82,0xea,0x34,0x00,0xf5,0x83,0xe0,0x24,0xc0,0xc3,0x33,0x92,0xd5,0x50,0x02, +0xf4,0x04,0xfb,0x89,0x24,0xe5,0x82,0x24,0x01,0xf5,0x82,0xe5,0x83,0x34,0x00,0xf5, +0x83,0xe0,0x8b,0xf0,0xa4,0x30,0xd5,0x0a,0xf4,0x24,0x01,0xc5,0xf0,0xf4,0x34,0x00, +0xc5,0xf0,0xaa,0xf0,0xfb,0x74,0x01,0x25,0x82,0xf5,0x82,0xe5,0x83,0x34,0x00,0xf5, +0x83,0xe0,0xfc,0xa3,0xe0,0xfd,0x74,0x01,0x25,0x82,0xf5,0x82,0xe5,0x83,0x34,0x00, +0xf5,0x83,0xe0,0xa2,0xe7,0x92,0xd5,0x2d,0xfd,0xec,0x75,0xf0,0x00,0x30,0xd5,0x03, +0x75,0xf0,0xff,0x35,0xf0,0xfc,0xed,0x2b,0xfd,0xec,0x3a,0xfc,0xe5,0x82,0x24,0x02, +0xf5,0x82,0xe5,0x83,0x34,0x00,0xf5,0x83,0xec,0xf0,0xa3,0xed,0xf0,0x90,0x45,0xdd, +0xe0,0xf5,0x23,0x75,0xa0,0x00,0x60,0x16,0x24,0x01,0xf8,0xe2,0xb5,0x24,0x05,0xab, +0x23,0x12,0x3b,0x2b,0xe5,0x23,0x24,0x09,0xf8,0xe2,0xf5,0x23,0x80,0xe5,0x22,0x75, +0xa0,0x00,0xeb,0x24,0x04,0xf8,0xe2,0xf5,0xf0,0xe8,0x04,0xf8,0xe2,0x24,0x0a,0xf5, +0x82,0xe5,0xf0,0x34,0x00,0xf5,0x83,0xc0,0x83,0xc0,0x82,0xe0,0xc3,0x13,0xfa,0x79, +0x00,0xeb,0x24,0x01,0xf8,0xe2,0xfc,0x75,0xf0,0x0e,0xa4,0x24,0xec,0xf5,0x82,0xe5, +0xf0,0x34,0x45,0xf5,0x83,0xe0,0x2a,0xfa,0xe9,0x34,0x00,0xf9,0xd0,0xe0,0x24,0xf8, +0xf5,0x82,0xd0,0xe0,0x34,0xff,0xf5,0x83,0xe0,0xc4,0x54,0x0f,0xc3,0x33,0x24,0xb3, +0xf5,0x82,0x74,0x80,0x34,0x00,0xf5,0x83,0xe0,0xf5,0xf0,0xa3,0xe0,0xf5,0x82,0x85, +0xf0,0x83,0xeb,0x24,0x03,0xf8,0xe2,0x25,0x82,0xf5,0x82,0xe5,0x83,0x34,0x00,0xf5, +0x83,0xe0,0x2a,0xfa,0xe9,0x34,0x00,0xf9,0xbc,0x09,0x0a,0x90,0x46,0xc0,0xe0,0x2a, +0xfa,0xe9,0x34,0x00,0xf9,0xc3,0xea,0x94,0x7e,0xe9,0x94,0x00,0x40,0x02,0x7a,0x7e, +0xeb,0x24,0x00,0xf8,0xe2,0xf8,0xa9,0x02,0x7a,0x01,0x12,0x39,0xcc,0x22,0x74,0xaa, +0x90,0xff,0xe1,0xf0,0x12,0x40,0x19,0x12,0x4c,0x48,0x22,0x12,0x40,0x3d,0xc3,0x33, +0x40,0x05,0x90,0x3d,0x59,0x80,0x03,0x90,0x3e,0x59,0xf5,0xf0,0x93,0xc5,0xf0,0xa3, +0x93,0x85,0xf0,0x83,0xf5,0x82,0xe4,0x73,0x22,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x3f,0x5f,0x40,0x16,0x40,0x16,0x40, +0x16,0x3f,0x67,0x40,0x16,0x3f,0x6d,0x3f,0x73,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x3f,0x79,0x40,0x16,0x40,0x16,0x40, +0x16,0x3f,0x81,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x3f,0x87,0x3f,0x8f,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x3f,0x92,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x3f,0x98,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x3f,0x9e,0x3f,0xa4,0x3f,0xaa,0x3f,0xb0,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x3f,0x59,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x3f,0xb6,0x3f,0xc1,0x40,0x16,0x3f, +0xc4,0x3f,0xc7,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x3f,0xcc,0x3f,0xd6,0x3f,0xe3,0x40, +0x16,0x3f,0xf5,0x40,0x16,0x40,0x16,0x40,0x16,0x3f,0xfd,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x05,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x0e,0x40,0x16,0x40,0x16,0x40, +0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x40,0x16,0x12,0x40,0xb7,0x02,0x3d,0x58,0x12, +0x40,0x2a,0xf5,0x90,0x02,0x3d,0x58,0x12,0x40,0xa7,0x02,0x3d,0x58,0x12,0x40,0x9f, +0x02,0x3d,0x58,0x12,0x40,0x9f,0x02,0x3d,0x58,0x74,0x00,0x12,0x40,0x42,0x02,0x3d, +0x58,0x12,0x40,0xaf,0x02,0x3d,0x58,0x74,0xf8,0x12,0x40,0x42,0x02,0x3d,0x58,0x02, +0x3d,0x58,0x12,0x40,0x2a,0x02,0x3d,0x58,0x12,0x40,0xbf,0x02,0x3d,0x58,0x12,0x40, +0x87,0x02,0x3d,0x58,0x12,0x40,0x93,0x02,0x3d,0x58,0x12,0x40,0x9f,0x02,0x3d,0x58, +0x12,0x40,0x9f,0x02,0x3d,0x58,0xc2,0xa9,0x74,0x00,0x90,0xff,0xe4,0xf0,0x02,0x3d, +0x58,0x02,0x3d,0x58,0x02,0x3d,0x58,0xd2,0xa9,0x02,0x3d,0x58,0x12,0x40,0x2a,0xf4, +0x12,0x40,0x42,0x02,0x3d,0x58,0x74,0x01,0x12,0x40,0x42,0x74,0x05,0x12,0x40,0x42, +0x02,0x3d,0x58,0x12,0x40,0x2a,0x12,0x4c,0x4e,0x12,0x40,0x42,0x74,0x01,0x90,0xff, +0xe4,0xf0,0x02,0x3d,0x58,0x12,0x40,0x2a,0xf5,0x26,0x02,0x3d,0x58,0xe5,0x26,0x12, +0x40,0x42,0x02,0x3d,0x58,0x74,0x01,0x90,0xff,0xe5,0xf0,0x02,0x3d,0x58,0x74,0x00, +0x12,0x40,0x42,0x02,0x3d,0x58,0x02,0x3d,0x58,0xe5,0x89,0x54,0xf0,0x44,0x02,0xf5, +0x89,0x75,0x8c,0x83,0x75,0x8a,0x83,0xd2,0x8c,0x22,0x90,0xff,0xe2,0x75,0x27,0x00, +0x75,0x28,0x00,0xe0,0x20,0xe0,0x06,0xd5,0x27,0xf9,0xd5,0x28,0xf6,0x90,0xff,0xe0, +0xe0,0x22,0xc0,0xe0,0x90,0xff,0xe3,0x75,0x27,0x00,0x75,0x28,0x00,0xe0,0x30,0xe0, +0x06,0xd5,0x27,0xf9,0xd5,0x28,0xf6,0xd0,0xe0,0x90,0xff,0xe1,0xf0,0x22,0x12,0x40, +0x2a,0xf5,0x2a,0x12,0x40,0x2a,0xf5,0x29,0x30,0x08,0x14,0xc2,0x09,0xe5,0x2a,0x20, +0xe0,0x02,0xd2,0x09,0xe5,0x29,0xc3,0x13,0xf5,0x29,0xe5,0x2a,0x13,0xf5,0x2a,0xe4, +0x90,0xff,0xe4,0xf0,0xd2,0xa9,0x22,0xc2,0x00,0xc2,0x07,0xd2,0x01,0xd2,0x05,0xc2, +0x06,0x80,0xcb,0xc2,0x00,0xc2,0x07,0xd2,0x01,0xd2,0x05,0xd2,0x06,0x80,0xbf,0xc2, +0x00,0xc2,0x07,0xd2,0x01,0x80,0xb7,0xc2,0x00,0xc2,0x07,0xc2,0x01,0x80,0xaf,0xd2, +0x00,0xc2,0x07,0xc2,0x01,0x80,0xa7,0xc2,0x00,0xc2,0x01,0xd2,0x07,0x80,0x9f,0x12, +0x40,0x2a,0xc2,0x08,0xb4,0xce,0x00,0x40,0x04,0xc3,0x33,0xd2,0x08,0xc3,0x94,0x80, +0x40,0x06,0xc2,0x03,0x33,0x02,0x40,0xdc,0x24,0x80,0xd2,0x03,0xf5,0x8c,0xf5,0x8a, +0x22,0x30,0x03,0x07,0xb2,0x04,0x20,0x04,0x02,0x80,0x76,0x30,0x00,0x03,0x02,0x42, +0x4b,0x20,0x01,0x6e,0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xc0,0xe0,0x20,0x07,0x43,0x30, +0x08,0x21,0x30,0x09,0x05,0xc2,0x09,0x02,0x41,0x23,0x74,0x01,0x90,0xff,0xe4,0xf0, +0x90,0xff,0xd2,0x75,0x27,0x00,0x75,0x28,0x00,0xe0,0x30,0xe4,0x06,0xd5,0x27,0xf9, +0xd5,0x28,0xf6,0x74,0x01,0x90,0xff,0xe4,0xf0,0x90,0xff,0xd2,0x75,0x27,0x00,0x75, +0x28,0x00,0xe0,0x30,0xe4,0x06,0xd5,0x27,0xf9,0xd5,0x28,0xf6,0x90,0xff,0xe4,0xe0, +0xf5,0x90,0xe5,0x2a,0xc3,0x94,0x01,0xf5,0x2a,0xe5,0x29,0x94,0x00,0xf5,0x29,0x50, +0x08,0xc2,0xa9,0x74,0x01,0x90,0xff,0xe5,0xf0,0xd0,0xe0,0xd0,0x82,0xd0,0x83,0xd0, +0xd0,0x32,0xc0,0xd0,0xc0,0x82,0xc0,0x83,0xc0,0xe0,0x30,0x05,0x36,0x74,0x01,0x90, +0xff,0xe4,0xf0,0x90,0xff,0xd2,0x75,0x27,0x00,0x75,0x28,0x00,0xe0,0x30,0xe4,0x06, +0xd5,0x27,0xf9,0xd5,0x28,0xf6,0x90,0xff,0xe4,0xe0,0xf5,0x2b,0xe5,0x2a,0xc3,0x94, +0x01,0xf5,0x2a,0xe5,0x29,0x94,0x00,0xf5,0x29,0x50,0x08,0xc2,0xa9,0x74,0x01,0x90, +0xff,0xe5,0xf0,0x30,0x06,0x0e,0x85,0x2b,0x2c,0x75,0x2d,0x01,0x85,0x2b,0x90,0xc2, +0x06,0x02,0x42,0x3a,0xb2,0x05,0xe5,0x2b,0xc4,0xf5,0x2b,0x85,0x2d,0x2f,0xe5,0x2d, +0xc3,0x33,0xf5,0x2e,0xe5,0x2b,0x30,0xe0,0x06,0xe5,0x2f,0x25,0x2e,0xf5,0x2f,0xe5, +0x2e,0xc3,0x33,0xf5,0x2e,0xe5,0x2b,0x30,0xe1,0x06,0xe5,0x2f,0x25,0x2e,0xf5,0x2f, +0xe5,0x2e,0xc3,0x33,0xf5,0x2e,0xe5,0x2b,0x30,0xe2,0x06,0xe5,0x2f,0x25,0x2e,0xf5, +0x2f,0xe5,0x2b,0x30,0xe3,0x11,0xe5,0x2f,0xc3,0x13,0xc3,0xc5,0x2c,0x95,0x2c,0x50, +0x02,0x74,0x00,0xf5,0x2c,0x80,0x0c,0xe5,0x2f,0xc3,0x13,0x25,0x2c,0x50,0x02,0x74, +0xff,0xf5,0x2c,0xe5,0x2b,0x54,0x07,0x24,0x29,0x83,0x30,0xe0,0x06,0xe5,0x2d,0xc3, +0x13,0x80,0x07,0x30,0xe1,0x11,0xe5,0x2d,0xc3,0x33,0x70,0x02,0x74,0x01,0xb4,0x09, +0x00,0x40,0x02,0x74,0x08,0xf5,0x2d,0x85,0x2c,0x90,0xd0,0xe0,0xd0,0x83,0xd0,0x82, +0xd0,0xd0,0x32,0x01,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0xc0,0xe0,0x90,0xff,0xe1,0xe4,0xf0,0x74,0x01,0x90,0xff,0xe4,0xf0,0xe5,0x2a, +0xc3,0x94,0x01,0xf5,0x2a,0xe5,0x29,0x94,0x00,0xf5,0x29,0x50,0x08,0xc2,0xa9,0x74, +0x01,0x90,0xff,0xe5,0xf0,0xd0,0xe0,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0x32,0x90,0x01, +0x00,0xe4,0xf0,0xa3,0xf0,0xe4,0xf5,0x30,0xf5,0x31,0xf5,0x32,0xf5,0x33,0xe4,0xf5, +0x34,0xf5,0x35,0xf5,0x36,0xf5,0x37,0xe4,0xf5,0x3c,0xf5,0x3d,0xf5,0x3e,0xf5,0x3f, +0xe4,0xf5,0x38,0xf5,0x39,0xf5,0x3a,0xf5,0x3b,0xc2,0x14,0xc2,0x15,0xc2,0x16,0x90, +0x42,0x08,0xe0,0xb4,0x41,0x07,0xa3,0xe0,0xb4,0x50,0x02,0x80,0x1d,0x90,0x42,0x08, +0x74,0x41,0xf0,0xa3,0x74,0x50,0xf0,0x90,0x42,0x01,0x74,0x0a,0xf0,0xc2,0x10,0xd2, +0x11,0xc2,0x12,0xd2,0x13,0x90,0x42,0x00,0xe4,0xf0,0xe4,0x90,0x42,0x02,0xf0,0x90, +0x42,0x03,0xf0,0x90,0x00,0x00,0x12,0x0e,0x40,0x90,0xff,0xd0,0xe0,0x90,0xff,0xd1, +0xe0,0x90,0xff,0xe0,0xe0,0x90,0xff,0xe4,0xe0,0xd2,0xaa,0xd2,0xaf,0x30,0x16,0x18, +0xc2,0x16,0x90,0x00,0x00,0x12,0x32,0x09,0xc2,0xaf,0x85,0x3a,0x38,0x85,0x3b,0x39, +0x85,0x32,0x30,0x85,0x33,0x31,0xd2,0xaf,0x30,0x11,0x36,0x90,0xff,0xd2,0xe0,0x30, +0xe6,0x2f,0xe5,0x3d,0xb5,0x3f,0x08,0xe5,0x3c,0xb5,0x3e,0x03,0xc3,0x80,0x1c,0xe5, +0x3c,0x24,0x00,0xf5,0x82,0x74,0x32,0x35,0x3d,0xf5,0x83,0xe5,0x3c,0x24,0x01,0xf5, +0x3c,0xe5,0x3d,0x34,0x00,0x54,0x0f,0xf5,0x3d,0xe0,0xd3,0x50,0x04,0x90,0xff,0xd0, +0xf0,0xe5,0x39,0xb5,0x3b,0x08,0xe5,0x38,0xb5,0x3a,0x03,0xc3,0x80,0x1c,0xe5,0x38, +0x24,0x00,0xf5,0x82,0x74,0x22,0x35,0x39,0xf5,0x83,0xe5,0x38,0x24,0x01,0xf5,0x38, +0xe5,0x39,0x34,0x00,0x54,0x0f,0xf5,0x39,0xe0,0xd3,0x50,0x14,0x30,0x13,0x0b,0xc0, +0xe0,0xfb,0x90,0x00,0x01,0x12,0x19,0x59,0xd0,0xe0,0x30,0x12,0x03,0x12,0x44,0x00, +0xe5,0x31,0xb5,0x33,0x08,0xe5,0x30,0xb5,0x32,0x03,0xc3,0x80,0x1c,0xe5,0x30,0x24, +0x00,0xf5,0x82,0x74,0x02,0x35,0x31,0xf5,0x83,0xe5,0x30,0x24,0x01,0xf5,0x30,0xe5, +0x31,0x34,0x00,0x54,0x0f,0xf5,0x31,0xe0,0xd3,0x50,0x42,0x30,0x10,0x0b,0xc0,0xe0, +0xfb,0x90,0x00,0x01,0x12,0x19,0x59,0xd0,0xe0,0x30,0x11,0x31,0xf5,0xf0,0xe5,0x3e, +0x24,0x01,0xf5,0x42,0xe5,0x3f,0x34,0x00,0x54,0x0f,0xf5,0x43,0xb5,0x3d,0x08,0xe5, +0x42,0xb5,0x3c,0x03,0xd3,0x80,0x16,0x74,0x00,0x25,0x3e,0xf5,0x82,0x74,0x32,0x35, +0x3f,0xf5,0x83,0xe5,0xf0,0xf0,0x85,0x42,0x3e,0x85,0x43,0x3f,0xc3,0x02,0x42,0xfd, +0xc2,0xaf,0x20,0x14,0x06,0xf5,0x99,0xd2,0x14,0x80,0x31,0xf5,0xf0,0xe5,0x36,0x24, +0x01,0xf5,0x42,0xe5,0x37,0x34,0x00,0x54,0x0f,0xf5,0x43,0xb5,0x35,0x08,0xe5,0x42, +0xb5,0x34,0x03,0xd3,0x80,0x16,0x74,0x00,0x25,0x36,0xf5,0x82,0x74,0x12,0x35,0x37, +0xf5,0x83,0xe5,0xf0,0xf0,0x85,0x42,0x36,0x85,0x43,0x37,0xc3,0xd2,0xaf,0x22,0xc0, +0xd0,0xc0,0xe0,0xc0,0xf0,0xc0,0x83,0xc0,0x82,0x90,0xff,0xd2,0xe0,0x20,0xe4,0x12, +0x90,0xff,0xe2,0xe0,0x20,0xe0,0x06,0x90,0xff,0xe4,0xe0,0x80,0x63,0x12,0x3d,0x3b, +0x80,0x5e,0x30,0xe7,0x4f,0x90,0xff,0xd0,0xe0,0xf5,0xf0,0xe5,0x3a,0x24,0x01,0xf5, +0x40,0xe5,0x3b,0x34,0x00,0x54,0x0f,0xf5,0x41,0xb5,0x39,0x08,0xe5,0x40,0xb5,0x38, +0x03,0xd3,0x80,0x16,0x74,0x00,0x25,0x3a,0xf5,0x82,0x74,0x22,0x35,0x3b,0xf5,0x83, +0xe5,0xf0,0xf0,0x85,0x40,0x3a,0x85,0x41,0x3b,0xc3,0x50,0x24,0xd2,0x16,0x85,0x3a, +0x38,0x85,0x3b,0x39,0x90,0x42,0x0b,0xe0,0x24,0x01,0xf0,0x90,0x42,0x0a,0xe0,0x34, +0x00,0xf0,0x80,0x0c,0x30,0xe5,0x09,0x90,0xff,0xd1,0xe0,0xf5,0xf0,0x12,0x45,0x50, +0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0xd0,0xd0,0x32,0xc0,0xd0,0xc0,0xe0,0xc0, +0xf0,0xc0,0x83,0xc0,0x82,0x30,0x99,0x35,0xc2,0x99,0xe5,0x35,0xb5,0x37,0x08,0xe5, +0x34,0xb5,0x36,0x03,0xc3,0x80,0x1c,0xe5,0x34,0x24,0x00,0xf5,0x82,0x74,0x12,0x35, +0x35,0xf5,0x83,0xe5,0x34,0x24,0x01,0xf5,0x34,0xe5,0x35,0x34,0x00,0x54,0x0f,0xf5, +0x35,0xe0,0xd3,0x50,0x06,0xf5,0x99,0xd2,0x14,0x80,0x02,0xc2,0x14,0x30,0x98,0x35, +0xe5,0x99,0xc2,0x98,0xf5,0xf0,0xe5,0x32,0x24,0x01,0xf5,0x40,0xe5,0x33,0x34,0x00, +0x54,0x0f,0xf5,0x41,0xb5,0x31,0x08,0xe5,0x40,0xb5,0x30,0x03,0xd3,0x80,0x16,0x74, +0x00,0x25,0x32,0xf5,0x82,0x74,0x02,0x35,0x33,0xf5,0x83,0xe5,0xf0,0xf0,0x85,0x40, +0x32,0x85,0x41,0x33,0xc3,0xd0,0x82,0xd0,0x83,0xd0,0xf0,0xd0,0xe0,0xd0,0xd0,0x32, +0x20,0x15,0x06,0x90,0xff,0xd0,0x74,0xfe,0xf0,0x90,0x42,0x03,0xe0,0xb4,0x00,0x4e, +0x90,0x42,0x02,0xe0,0x70,0x1b,0xe5,0xf0,0xb4,0x3f,0x05,0xd2,0x15,0x02,0x47,0x47, +0xb4,0xff,0x05,0xc2,0x15,0x02,0x47,0x47,0xb4,0xb9,0x05,0xd2,0x16,0x02,0x47,0x47, +0xe0,0x24,0xca,0xf5,0x82,0x74,0x94,0x34,0x00,0xf5,0x83,0xe0,0xc3,0x95,0xf0,0x60, +0x08,0x90,0x42,0x02,0xe4,0xf0,0x02,0x47,0x47,0x90,0x42,0x02,0xe0,0x04,0xf0,0x24, +0xf8,0x70,0x08,0xe4,0xf0,0x90,0x42,0x03,0x74,0x01,0xf0,0x02,0x47,0x47,0xb4,0x01, +0x74,0x90,0x42,0x03,0xe5,0xf0,0xb4,0x00,0x06,0x74,0x02,0xf0,0x02,0x47,0x47,0xb4, +0x01,0x06,0x74,0x03,0xf0,0x02,0x47,0x47,0xb4,0x02,0x06,0x74,0x04,0xf0,0x02,0x47, +0x47,0xb4,0x03,0x1d,0x90,0x42,0x0a,0x74,0x00,0xf0,0xa3,0xf0,0x90,0x42,0x04,0x74, +0x42,0xf0,0xa3,0x74,0x01,0xf0,0x90,0x42,0x06,0xe4,0xf0,0xa3,0x04,0xf0,0x02,0x46, +0xb7,0xb4,0x04,0x15,0x90,0x42,0x04,0x74,0x42,0xf0,0xa3,0x74,0x00,0xf0,0x90,0x42, +0x06,0xe4,0xf0,0xa3,0x04,0xf0,0x02,0x46,0xb7,0xb4,0x05,0x16,0x90,0x42,0x04,0x74, +0x94,0xf0,0xa3,0x74,0xca,0xf0,0x90,0x42,0x06,0xe4,0xf0,0xa3,0x74,0x0a,0xf0,0x02, +0x46,0xb7,0x02,0x47,0x42,0xb4,0x02,0x27,0xc2,0x10,0xc2,0x11,0xc2,0x12,0xc2,0x13, +0xe5,0xf0,0x54,0x0f,0x90,0x42,0x01,0xf0,0x30,0xe0,0x02,0xd2,0x10,0x30,0xe1,0x02, +0xd2,0x11,0x30,0xe2,0x02,0xd2,0x12,0x30,0xe3,0x02,0xd2,0x13,0x02,0x47,0x42,0xb4, +0x03,0x10,0xe5,0xf0,0x70,0x03,0xe4,0x80,0x02,0x74,0x01,0x90,0x42,0x00,0xf0,0x02, +0x47,0x42,0xb4,0x04,0x0f,0xe5,0xf0,0x90,0x42,0x04,0xf0,0x90,0x42,0x03,0x74,0x05, +0xf0,0x02,0x47,0x47,0xb4,0x05,0x0f,0xe5,0xf0,0x90,0x42,0x05,0xf0,0x90,0x42,0x03, +0x74,0x06,0xf0,0x02,0x47,0x47,0xb4,0x06,0x0f,0xe5,0xf0,0x90,0x42,0x06,0xf0,0x90, +0x42,0x03,0x74,0x07,0xf0,0x02,0x47,0x47,0xb4,0x07,0x0f,0xe5,0xf0,0x90,0x42,0x07, +0xf0,0x90,0x42,0x03,0x74,0x08,0xf0,0x02,0x47,0x47,0xb4,0x08,0x07,0xe5,0xf0,0x60, +0x06,0x02,0x47,0x09,0x02,0x47,0x42,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0,0x03,0x90, +0x42,0x06,0xe0,0x04,0xf8,0xa3,0xe0,0x04,0xf9,0x90,0x42,0x04,0xe0,0xc0,0xe0,0xa3, +0xe0,0xc0,0xe0,0x02,0x46,0xf6,0x7a,0xc4,0x7b,0x51,0x90,0xff,0xd2,0xe0,0x20,0xe6, +0x07,0xdb,0xfa,0xda,0xf8,0x02,0x46,0xfa,0xd0,0x82,0xd0,0x83,0xe0,0xa3,0xc0,0x83, +0xc0,0x82,0x90,0xff,0xd0,0xf0,0xd9,0xde,0xd8,0xdc,0xd0,0xe0,0xd0,0xe0,0xd0,0x03, +0xd0,0x02,0xd0,0x01,0xd0,0x00,0x02,0x47,0x42,0xc0,0x00,0xc0,0x01,0xc0,0x02,0xc0, +0x03,0x90,0x42,0x07,0xe0,0x04,0xf9,0x90,0x42,0x05,0xe0,0xf8,0x80,0x17,0x7a,0xc4, +0x7b,0x51,0x90,0xff,0xd2,0xe0,0x20,0xe6,0x06,0xdb,0xfa,0xda,0xf8,0x80,0x08,0xe6, +0x08,0x90,0xff,0xd0,0xf0,0xd9,0xe7,0xd0,0x03,0xd0,0x02,0xd0,0x01,0xd0,0x00,0x02, +0x47,0x42,0x90,0x42,0x03,0xe4,0xf0,0x22,0xa5,0x69,0x5a,0x96,0xa4,0x68,0x5b,0x97, +0xa7,0x6b,0x58,0x94,0xa6,0x6a,0x59,0x95,0xa1,0x6d,0x5e,0x92,0xa0,0x6c,0x5f,0x93, +0xa3,0x6f,0x5c,0x90,0xa2,0x6e,0x5d,0x91,0xad,0x61,0x52,0x9e,0xac,0x60,0x53,0x9f, +0xaf,0x63,0x50,0x9c,0xae,0x62,0x51,0x9d,0xa9,0x65,0x56,0x9a,0xa8,0x64,0x57,0x9b, +0xab,0x67,0x54,0x98,0xaa,0x66,0x55,0x99,0xb5,0x79,0x4a,0x86,0xb4,0x78,0x4b,0x87, +0xb7,0x7b,0x48,0x84,0xb6,0x7a,0x49,0x85,0xb1,0x7d,0x4e,0x82,0xb0,0x7c,0x4f,0x83, +0xb3,0x7f,0x4c,0x80,0xb2,0x7e,0x4d,0x81,0xbd,0x71,0x42,0x8e,0xbc,0x70,0x43,0x8f, +0xbf,0x73,0x40,0x8c,0xbe,0x72,0x41,0x8d,0xb9,0x75,0x46,0x8a,0xb8,0x74,0x47,0x8b, +0xbb,0x77,0x44,0x88,0xba,0x76,0x45,0x89,0x85,0x49,0x7a,0xb6,0x84,0x48,0x7b,0xb7, +0x87,0x4b,0x78,0xb4,0x86,0x4a,0x79,0xb5,0x81,0x4d,0x7e,0xb2,0x80,0x4c,0x7f,0xb3, +0x83,0x4f,0x7c,0xb0,0x82,0x4e,0x7d,0xb1,0x8d,0x41,0x72,0xbe,0x8c,0x40,0x73,0xbf, +0x8f,0x43,0x70,0xbc,0x8e,0x42,0x71,0xbd,0x89,0x45,0x76,0xba,0x88,0x44,0x77,0xbb, +0x8b,0x47,0x74,0xb8,0x8a,0x46,0x75,0xb9,0x95,0x59,0x6a,0xa6,0x94,0x58,0x6b,0xa7, +0x97,0x5b,0x68,0xa4,0x96,0x5a,0x69,0xa5,0x91,0x5d,0x6e,0xa2,0x90,0x5c,0x6f,0xa3, +0x93,0x5f,0x6c,0xa0,0x92,0x5e,0x6d,0xa1,0x9d,0x51,0x62,0xae,0x9c,0x50,0x63,0xaf, +0x9f,0x53,0x60,0xac,0x9e,0x52,0x61,0xad,0x99,0x55,0x66,0xaa,0x98,0x54,0x67,0xab, +0x9b,0x57,0x64,0xa8,0x9a,0x56,0x65,0xa9,0xe5,0x29,0x1a,0xd6,0xe4,0x28,0x1b,0xd7, +0xe7,0x2b,0x18,0xd4,0xe6,0x2a,0x19,0xd5,0xe1,0x2d,0x1e,0xd2,0xe0,0x2c,0x1f,0xd3, +0xe3,0x2f,0x1c,0xd0,0xe2,0x2e,0x1d,0xd1,0xed,0x21,0x12,0xde,0xec,0x20,0x13,0xdf, +0xef,0x23,0x10,0xdc,0xee,0x22,0x11,0xdd,0xe9,0x25,0x16,0xda,0xe8,0x24,0x17,0xdb, +0xeb,0x27,0x14,0xd8,0xea,0x26,0x15,0xd9,0xf5,0x39,0x0a,0xc6,0xf4,0x38,0x0b,0xc7, +0xf7,0x3b,0x08,0xc4,0xf6,0x3a,0x09,0xc5,0xf1,0x3d,0x0e,0xc2,0xf0,0x3c,0x0f,0xc3, +0xf3,0x3f,0x0c,0xc0,0xf2,0x3e,0x0d,0xc1,0xfd,0x31,0x02,0xce,0xfc,0x30,0x03,0xcf, +0xff,0x33,0x00,0xcc,0xfe,0x32,0x01,0xcd,0xf9,0x35,0x06,0xca,0xf8,0x34,0x07,0xcb, +0xfb,0x37,0x04,0xc8,0xfa,0x36,0x05,0xc9,0xc5,0x09,0x3a,0xf6,0xc4,0x08,0x3b,0xf7, +0xc7,0x0b,0x38,0xf4,0xc6,0x0a,0x39,0xf5,0xc1,0x0d,0x3e,0xf2,0xc0,0x0c,0x3f,0xf3, +0xc3,0x0f,0x3c,0xf0,0xc2,0x0e,0x3d,0xf1,0xcd,0x01,0x32,0xfe,0xcc,0x00,0x33,0xff, +0xcf,0x03,0x30,0xfc,0xce,0x02,0x31,0xfd,0xc9,0x05,0x36,0xfa,0xc8,0x04,0x37,0xfb, +0xcb,0x07,0x34,0xf8,0xca,0x06,0x35,0xf9,0xd5,0x19,0x2a,0xe6,0xd4,0x18,0x2b,0xe7, +0xd7,0x1b,0x28,0xe4,0xd6,0x1a,0x29,0xe5,0xd1,0x1d,0x2e,0xe2,0xd0,0x1c,0x2f,0xe3, +0xd3,0x1f,0x2c,0xe0,0xd2,0x1e,0x2d,0xe1,0xdd,0x11,0x22,0xee,0xdc,0x10,0x23,0xef, +0xdf,0x13,0x20,0xec,0xde,0x12,0x21,0xed,0xd9,0x15,0x26,0xea,0xd8,0x14,0x27,0xeb, +0xdb,0x17,0x24,0xe8,0xda,0x16,0x25,0xe9,0x25,0xe9,0xda,0x16,0x24,0xe8,0xdb,0x17, +0x27,0xeb,0xd8,0x14,0x26,0xea,0xd9,0x15,0x21,0xed,0xde,0x12,0x20,0xec,0xdf,0x13, +0x23,0xef,0xdc,0x10,0x22,0xee,0xdd,0x11,0x2d,0xe1,0xd2,0x1e,0x2c,0xe0,0xd3,0x1f, +0x2f,0xe3,0xd0,0x1c,0x2e,0xe2,0xd1,0x1d,0x29,0xe5,0xd6,0x1a,0x28,0xe4,0xd7,0x1b, +0x2b,0xe7,0xd4,0x18,0x2a,0xe6,0xd5,0x19,0x35,0xf9,0xca,0x06,0x34,0xf8,0xcb,0x07, +0x37,0xfb,0xc8,0x04,0x36,0xfa,0xc9,0x05,0x31,0xfd,0xce,0x02,0x30,0xfc,0xcf,0x03, +0x33,0xff,0xcc,0x00,0x32,0xfe,0xcd,0x01,0x3d,0xf1,0xc2,0x0e,0x3c,0xf0,0xc3,0x0f, +0x3f,0xf3,0xc0,0x0c,0x3e,0xf2,0xc1,0x0d,0x39,0xf5,0xc6,0x0a,0x38,0xf4,0xc7,0x0b, +0x3b,0xf7,0xc4,0x08,0x3a,0xf6,0xc5,0x09,0x05,0xc9,0xfa,0x36,0x04,0xc8,0xfb,0x37, +0x07,0xcb,0xf8,0x34,0x06,0xca,0xf9,0x35,0x01,0xcd,0xfe,0x32,0x00,0xcc,0xff,0x33, +0x03,0xcf,0xfc,0x30,0x02,0xce,0xfd,0x31,0x0d,0xc1,0xf2,0x3e,0x0c,0xc0,0xf3,0x3f, +0x0f,0xc3,0xf0,0x3c,0x0e,0xc2,0xf1,0x3d,0x09,0xc5,0xf6,0x3a,0x08,0xc4,0xf7,0x3b, +0x0b,0xc7,0xf4,0x38,0x0a,0xc6,0xf5,0x39,0x15,0xd9,0xea,0x26,0x14,0xd8,0xeb,0x27, +0x17,0xdb,0xe8,0x24,0x16,0xda,0xe9,0x25,0x11,0xdd,0xee,0x22,0x10,0xdc,0xef,0x23, +0x13,0xdf,0xec,0x20,0x12,0xde,0xed,0x21,0x1d,0xd1,0xe2,0x2e,0x1c,0xd0,0xe3,0x2f, +0x1f,0xd3,0xe0,0x2c,0x1e,0xd2,0xe1,0x2d,0x19,0xd5,0xe6,0x2a,0x18,0xd4,0xe7,0x2b, +0x1b,0xd7,0xe4,0x28,0x1a,0xd6,0xe5,0x29,0x65,0xa9,0x9a,0x56,0x64,0xa8,0x9b,0x57, +0x67,0xab,0x98,0x54,0x66,0xaa,0x99,0x55,0x61,0xad,0x9e,0x52,0x60,0xac,0x9f,0x53, +0x63,0xaf,0x9c,0x50,0x62,0xae,0x9d,0x51,0x6d,0xa1,0x92,0x5e,0x6c,0xa0,0x93,0x5f, +0x6f,0xa3,0x90,0x5c,0x6e,0xa2,0x91,0x5d,0x69,0xa5,0x96,0x5a,0x68,0xa4,0x97,0x5b, +0x6b,0xa7,0x94,0x58,0x6a,0xa6,0x95,0x59,0x75,0xb9,0x8a,0x46,0x74,0xb8,0x8b,0x47, +0x77,0xbb,0x88,0x44,0x76,0xba,0x89,0x45,0x71,0xbd,0x8e,0x42,0x70,0xbc,0x8f,0x43, +0x73,0xbf,0x8c,0x40,0x72,0xbe,0x8d,0x41,0x7d,0xb1,0x82,0x4e,0x7c,0xb0,0x83,0x4f, +0x7f,0xb3,0x80,0x4c,0x7e,0xb2,0x81,0x4d,0x79,0xb5,0x86,0x4a,0x78,0xb4,0x87,0x4b, +0x7b,0xb7,0x84,0x48,0x7a,0xb6,0x85,0x49,0x45,0x89,0xba,0x76,0x44,0x88,0xbb,0x77, +0x47,0x8b,0xb8,0x74,0x46,0x8a,0xb9,0x75,0x41,0x8d,0xbe,0x72,0x40,0x8c,0xbf,0x73, +0x43,0x8f,0xbc,0x70,0x42,0x8e,0xbd,0x71,0x4d,0x81,0xb2,0x7e,0x4c,0x80,0xb3,0x7f, +0x4f,0x83,0xb0,0x7c,0x4e,0x82,0xb1,0x7d,0x49,0x85,0xb6,0x7a,0x48,0x84,0xb7,0x7b, +0x4b,0x87,0xb4,0x78,0x4a,0x86,0xb5,0x79,0x55,0x99,0xaa,0x66,0x54,0x98,0xab,0x67, +0x57,0x9b,0xa8,0x64,0x56,0x9a,0xa9,0x65,0x51,0x9d,0xae,0x62,0x50,0x9c,0xaf,0x63, +0x53,0x9f,0xac,0x60,0x52,0x9e,0xad,0x61,0x5d,0x91,0xa2,0x6e,0x5c,0x90,0xa3,0x6f, +0x5f,0x93,0xa0,0x6c,0x5e,0x92,0xa1,0x6d,0x59,0x95,0xa6,0x6a,0x58,0x94,0xa7,0x6b, +0x5b,0x97,0xa4,0x68,0x5a,0x96,0xa5,0x69,0x40,0x41,0x3e,0x3f,0x3c,0x3d,0x3a,0x3b, +0x48,0x49,0x46,0x47,0x44,0x45,0x42,0x43,0x30,0x31,0x2e,0x2f,0x2c,0x2d,0x2a,0x2b, +0x38,0x39,0x36,0x37,0x34,0x35,0x32,0x33,0x60,0x61,0x5e,0x5f,0x5c,0x5d,0x5a,0x5b, +0x68,0x69,0x66,0x67,0x64,0x65,0x62,0x63,0x50,0x51,0x4e,0x4f,0x4c,0x4d,0x4a,0x4b, +0x58,0x59,0x56,0x57,0x54,0x55,0x52,0x53,0x80,0x81,0x7e,0x7f,0x7c,0x7d,0x7a,0x7b, +0x88,0x89,0x86,0x87,0x84,0x85,0x82,0x83,0x70,0x71,0x6e,0x6f,0x6c,0x6d,0x6a,0x6b, +0x78,0x79,0x76,0x77,0x74,0x75,0x72,0x73,0xa0,0xa1,0x9e,0x9f,0x9c,0x9d,0x9a,0x9b, +0xa8,0xa9,0xa6,0xa7,0xa4,0xa5,0xa2,0xa3,0x90,0x91,0x8e,0x8f,0x8c,0x8d,0x8a,0x8b, +0x98,0x99,0x96,0x97,0x94,0x95,0x92,0x93,0xc0,0xc1,0xbe,0xbf,0xbc,0xbd,0xba,0xbb, +0xc8,0xc9,0xc6,0xc7,0xc4,0xc5,0xc2,0xc3,0xb0,0xb1,0xae,0xaf,0xac,0xad,0xaa,0xab, +0xb8,0xb9,0xb6,0xb7,0xb4,0xb5,0xb2,0xb3,0xe0,0xe1,0xde,0xdf,0xdc,0xdd,0xda,0xdb, +0xe8,0xe9,0xe6,0xe7,0xe4,0xe5,0xe2,0xe3,0xd0,0xd1,0xce,0xcf,0xcc,0xcd,0xca,0xcb, +0xd8,0xd9,0xd6,0xd7,0xd4,0xd5,0xd2,0xd3,0x00,0x01,0xfe,0xff,0xfc,0xfd,0xfa,0xfb, +0x08,0x09,0x06,0x07,0x04,0x05,0x02,0x03,0xf0,0xf1,0xee,0xef,0xec,0xed,0xea,0xeb, +0xf8,0xf9,0xf6,0xf7,0xf4,0xf5,0xf2,0xf3,0x20,0x21,0x1e,0x1f,0x1c,0x1d,0x1a,0x1b, +0x28,0x29,0x26,0x27,0x24,0x25,0x22,0x23,0x10,0x11,0x0e,0x0f,0x0c,0x0d,0x0a,0x0b, +0x18,0x19,0x16,0x17,0x14,0x15,0x12,0x13,0x75,0x44,0x00,0xd2,0x02,0x22,0x30,0x02, +0x0b,0x90,0x4b,0x48,0x93,0xc2,0x02,0xf5,0x45,0x02,0x4c,0x82,0x75,0xf0,0x00,0xc3, +0x33,0xc5,0xf0,0x33,0xc5,0xf0,0xc3,0x33,0xc5,0xf0,0x33,0xc5,0xf0,0x24,0x48,0xf5, +0x82,0xe5,0xf0,0x34,0x47,0xf5,0x83,0xe5,0x44,0x54,0x03,0x93,0x25,0x45,0xf5,0x45, +0x05,0x44,0x22,0xff,0xc0,0x01,0x30,0x10,0x00,0xcb,0x80,0xba,0x3c,0x3d,0x00,0x00, +0x0b,0x38,0xc9,0x1c,0x0c,0xa0,0x00,0x00,0x00,0x20,0xc4,0x82,0xcf,0x3c,0x42,0x00, +0x00,0x1f,0x00,0x97,0x19,0x09,0xa0,0x00,0x00,0x00,0x28,0xc4,0x86,0xd1,0x3c,0x7f, +0x00,0x00,0x15,0x00,0x61,0x01,0x07,0xa0,0x00,0x00,0x00,0x20,0xc4,0x82,0xd0,0x3c, +0x42,0x00,0x00,0x15,0x00,0xf7,0x19,0x09,0xa0,0x00,0x00,0x00,0x28,0xc4,0x86,0xd0, +0x3c,0x42,0x00,0x00,0x15,0x00,0x81,0x01,0x07,0xa0,0x00,0x00,0x00,0x00,0xc3,0x80, +0xc7,0x3c,0x6f,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0,0x00,0x00,0x00,0x00,0xd1, +0x82,0xcc,0x3c,0x0a,0x00,0x00,0x29,0x00,0xf0,0x05,0x05,0xa0,0x00,0x00,0x00,0x00, +0xd2,0x82,0xbe,0x3c,0x77,0x00,0x00,0x33,0x00,0xf0,0x00,0x09,0xa0,0x00,0x00,0x00, +0x00,0x11,0x82,0xce,0x3c,0x42,0x00,0x00,0x15,0x00,0xf0,0x16,0x06,0xa0,0x00,0x00, +0x00,0x00,0xd2,0x82,0xca,0x3c,0x74,0x00,0x00,0x29,0x00,0xf0,0x00,0x06,0xa0,0x00, +0x00,0x00,0x00,0x11,0x82,0xcc,0x3c,0x42,0x00,0x00,0x15,0x00,0xf0,0x16,0x06,0xa0, +0x00,0x00,0x00,0x00,0x11,0x82,0xca,0x3c,0x52,0x00,0x00,0x15,0x00,0xf0,0x00,0x06, +0xa0,0x00,0x00,0x00,0x00,0xd2,0x82,0xca,0x3c,0x74,0x00,0x00,0x29,0x00,0xf0,0x00, +0x06,0xa0,0x00,0x00,0x00,0x00,0xd1,0x82,0xca,0x3c,0x0a,0x00,0x00,0x29,0x00,0xf0, +0x05,0x05,0xa0,0x00,0xf0,0x00,0x00,0x0a,0x82,0xca,0x3c,0x73,0x00,0x00,0x29,0x00, +0xf0,0x00,0x09,0xa0,0x00,0x00,0x00,0x00,0xd1,0x82,0xc8,0x3c,0x0a,0x00,0x00,0x23, +0x00,0xf0,0x07,0x07,0xa0,0x00,0xc0,0x00,0x00,0xc8,0x82,0xcb,0x3c,0x52,0x00,0x00, +0x29,0x00,0xf6,0x16,0x06,0xa0,0x00,0x20,0x00,0x00,0x79,0x82,0xbc,0x3c,0x50,0x00, +0x00,0x1f,0x00,0xf5,0x19,0x09,0xa0,0x00,0xd0,0x00,0x00,0xc8,0x82,0xc8,0x3c,0x52, +0x00,0x00,0x29,0x00,0xf6,0x16,0x06,0xa0,0x00,0x20,0x00,0x00,0x7b,0x82,0xbd,0x3c, +0x57,0x00,0x00,0x29,0x00,0xf0,0x00,0x09,0xa0,0x00,0xe0,0x00,0x00,0xc8,0x82,0xc2, +0x3c,0x52,0x00,0x00,0x29,0x00,0xf6,0x16,0x06,0xa0,0x00,0x20,0x00,0x00,0x7a,0x82, +0xc0,0x3c,0x7a,0x00,0x00,0x29,0x00,0xf0,0x00,0x05,0xa0,0x00,0x20,0x00,0x00,0xc7, +0x82,0xc3,0x3c,0x01,0x00,0x00,0x1f,0x00,0xf6,0x17,0x07,0xa0,0x00,0x30,0x00,0x00, +0xc7,0x82,0xc0,0x3c,0x52,0x00,0x00,0x1f,0x00,0xf6,0x17,0x07,0xa0,0x00,0x20,0x00, +0x00,0x31,0x88,0xca,0x3c,0x6b,0x00,0x00,0x15,0x00,0xf0,0x05,0x05,0xa0,0x00,0x40, +0x00,0x00,0xc7,0x82,0xbc,0x3c,0x52,0x00,0x00,0x1f,0x00,0xf6,0x17,0x07,0xa0,0x00, +0xe0,0x00,0x00,0x2e,0x84,0xca,0x3c,0x67,0x00,0x00,0x15,0x00,0xf0,0x05,0x05,0xa0, +0x00,0xe0,0x00,0x00,0x7a,0x84,0xd4,0x3c,0x01,0x00,0x00,0x15,0x00,0xf2,0x15,0x05, +0xa0,0x00,0xd0,0x00,0x00,0x21,0x84,0xc9,0x3c,0x6a,0x00,0x00,0x29,0x00,0xf0,0x05, +0x05,0xa0,0x00,0x10,0x00,0x00,0x25,0x82,0xc4,0x3c,0x6b,0x00,0x00,0x1f,0x00,0xf0, +0x00,0x09,0xa0,0x00,0xf0,0x00,0x00,0x31,0x86,0xc3,0x3c,0x67,0x00,0x00,0x15,0x00, +0xf5,0x16,0x06,0xa0,0x00,0x20,0x00,0x00,0x1d,0x80,0xca,0x3c,0x6b,0x00,0x00,0x1f, +0x00,0xf0,0x00,0x09,0xa0,0x00,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20, +0x59,0x41,0x4d,0x41,0x48,0x41,0x00,0xe0,0x00,0x00,0x31,0x88,0xc8,0x3c,0x67,0x00, +0x00,0x15,0x00,0xf4,0x16,0x06,0xa0,0x00,0xc0,0x00,0x00,0x9d,0x84,0xc9,0x3c,0x0a, +0x00,0x00,0x1f,0x00,0xf4,0x17,0x07,0xa0,0x00,0xe0,0x00,0x00,0x2e,0x84,0xc8,0x3c, +0x73,0x00,0x00,0x15,0x00,0xf0,0x06,0x06,0xa0,0x00,0x40,0x00,0x00,0x1c,0x82,0xc7, +0x3c,0x61,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0,0x00,0x40,0x00,0x00,0x1c,0x82, +0xc8,0x3c,0x43,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0,0x00,0xbd,0x91,0x90,0x87, +0x8e,0x97,0x99,0x98,0xe0,0xa7,0xbf,0xb3,0xbf,0xb8,0xbf,0xf6,0x00,0xd0,0x00,0x00, +0x1e,0x82,0xca,0x3c,0x72,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0,0x00,0xd0,0x00, +0x00,0x1f,0x82,0xca,0x3c,0x63,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0,0x00,0xe0, +0x00,0x00,0x1f,0x82,0xcd,0x3c,0x4f,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0,0x00, +0x20,0x00,0x00,0x9c,0x82,0xc9,0x3c,0x6e,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0, +0x00,0x20,0x00,0x00,0x9c,0x82,0xcd,0x3c,0x70,0x00,0x00,0x15,0x00,0xf0,0x00,0x09, +0xa0,0x00,0xc0,0x00,0x00,0x0b,0x80,0xc7,0x3c,0x43,0x00,0x00,0x15,0x00,0xf0,0x00, +0x09,0xa0,0x00,0xc0,0x00,0x00,0x0b,0x80,0xcb,0x3c,0x13,0x00,0x00,0x15,0x00,0xf0, +0x00,0x09,0xa0,0x00,0xc0,0x00,0x00,0x2f,0x82,0xc7,0x3c,0x73,0x00,0x00,0x29,0x00, +0xf0,0x00,0x09,0xa0,0x00,0xc0,0x00,0x00,0x30,0x82,0xc8,0x3c,0x79,0x00,0x00,0x29, +0x00,0xf0,0x00,0x09,0xa0,0x00,0x40,0x00,0x08,0x44,0x83,0xc9,0x3c,0x67,0x00,0x00, +0x15,0x00,0xf0,0x00,0x0b,0xa0,0x00,0x40,0x00,0x08,0x44,0x85,0xcc,0x3c,0x4f,0x00, +0x00,0x15,0x00,0xf0,0x00,0x0b,0xa0,0x00,0x30,0x00,0x00,0x24,0x82,0xba,0x3c,0x48, +0x00,0x00,0x1f,0x00,0xf0,0x00,0x09,0xa0,0x00,0x30,0x00,0x08,0x24,0x84,0xcc,0x3c, +0x70,0x00,0x00,0x33,0x00,0xf0,0x00,0x09,0xa0,0x00,0x20,0x00,0x00,0x20,0x80,0xcd, +0x3c,0x61,0x00,0x00,0x1f,0x00,0xf0,0x00,0x09,0xa0,0x00,0x40,0x00,0x00,0x2c,0x80, +0xca,0x3c,0x72,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0,0x00,0x40,0x00,0x00,0x2c, +0x80,0xd0,0x3c,0x5c,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0,0x00,0xe0,0x00,0x00, +0x22,0x82,0xcc,0x3c,0x61,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0,0x00,0xe0,0x00, +0x00,0x23,0x82,0xcc,0x3c,0x73,0x00,0x00,0x15,0x00,0xf0,0x00,0x09,0xa0,0x00,0xc0, +0x00,0x00,0x32,0x80,0xca,0x3c,0x7c,0x00,0x00,0x29,0x00,0xf0,0x08,0x09,0xa0,0x00, +0xc0,0x00,0x00,0x32,0x84,0xca,0x3c,0x61,0x00,0x00,0x29,0x00,0xf0,0x00,0x09,0xa0, +0x00,0xf0,0x00,0x00,0x2f,0x82,0xbe,0x3c,0x6f,0x00,0x00,0x29,0x00,0xf0,0x00,0x09, +0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x46,0xc5,0x46,0xd6,0x46,0xe7,0x46,0xf8,0x47,0x09,0x00,0x00,0x47,0x1a, +0x47,0x2b,0x47,0x3c,0x47,0x4d,0x00,0x00,0x47,0x6f,0x47,0x80,0x47,0x91,0x47,0xa2, +0x47,0xb3,0x47,0xc4,0x47,0xd5,0x47,0xe6,0x47,0xf7,0x48,0x08,0x48,0x19,0x48,0x2a, +0x48,0x3b,0x48,0x4c,0x48,0x5d,0x48,0x6e,0x48,0x7f,0x48,0x90,0x48,0xa1,0x48,0xb2, +0x48,0xc3,0x48,0xd4,0x48,0xf6,0x49,0x07,0x49,0x18,0x49,0x29,0x49,0x3a,0x49,0x5c, +0x49,0x6d,0x49,0x7e,0x49,0x8f,0x49,0xa0,0x49,0xb1,0x49,0xc2,0x49,0xd3,0x49,0xe4, +0x49,0xf5,0x4a,0x06,0x4a,0x17,0x4a,0x28,0x4a,0x39,0x4a,0x4a,0x4a,0x5b,0x4a,0x6c, +0x4a,0x7d,0x4a,0x8e,0x4a,0x9f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d, +0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d, +0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0xff,0x27,0x28,0x29,0x2a,0x2b,0x2a,0x2d, +0x2a,0x2f,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d, +0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x47,0x49,0x49,0x4b,0x4c,0x4d, +0x4e,0x4e,0x50,0x50,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x5b,0x5c,0x5d, +0x5e,0x5f,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d, +0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x7c,0x7d, +0x7e,0x7f,0x00,0x10,0x00,0x2c,0x81,0x32,0x3c,0x72,0x00,0x00,0x37,0x20,0xf2,0x13, +0x08,0xa0,0x00,0x00,0x10,0x00,0x2d,0x81,0x37,0x3c,0x60,0x00,0x00,0x37,0x20,0xf2, +0x14,0x08,0xa0,0x00,0x00,0x10,0x00,0x2e,0x81,0x3e,0x3c,0x4b,0x00,0x00,0x37,0x20, +0xf2,0x14,0x08,0xa0,0x00,0x00,0x10,0x00,0x2f,0x81,0x43,0x3c,0x6a,0x00,0x00,0x37, +0x20,0xf2,0x14,0x08,0xa0,0x00,0x0a,0x10,0x00,0x30,0x81,0x4b,0x3c,0x64,0x00,0x00, +0x37,0x20,0xf2,0x14,0x08,0xa0,0x00,0x0a,0x10,0x00,0x31,0x81,0x50,0x3c,0x69,0x00, +0x00,0x37,0x20,0xf2,0x14,0x08,0xa0,0x00,0x04,0x10,0x00,0x32,0x81,0x54,0x3c,0x6c, +0x00,0x00,0x37,0x20,0xf2,0x14,0x08,0xa0,0x00,0x03,0x10,0x00,0x33,0x81,0x5c,0x3c, +0x61,0x00,0x00,0x37,0x20,0xf2,0x14,0x18,0xa0,0x00,0x07,0x10,0x00,0x34,0x81,0x61, +0x3c,0x64,0x00,0x00,0x37,0x20,0xf3,0x14,0x18,0xa0,0x00,0x00,0x10,0x00,0x35,0x81, +0x5d,0x3c,0x3b,0x00,0x00,0x37,0x20,0xf4,0x15,0x08,0xa0,0x00,0x00,0x10,0x00,0x2c, +0x81,0x32,0x3c,0x72,0x00,0x00,0x37,0x20,0xf2,0x13,0x08,0xa0,0x01,0x00,0x10,0x00, +0x2d,0x81,0x37,0x3c,0x60,0x00,0x00,0x37,0x20,0xf2,0x14,0x08,0xa0,0x01,0x00,0x10, +0x00,0x2e,0x81,0x3e,0x3c,0x4b,0x00,0x00,0x37,0x20,0xf2,0x14,0x08,0xa0,0x01,0x00, +0x10,0x00,0x2f,0x81,0x43,0x3c,0x6a,0x00,0x00,0x37,0x20,0xf2,0x14,0x08,0xa0,0x01, +0x0a,0x10,0x00,0x30,0x81,0x4b,0x3c,0x64,0x00,0x00,0x37,0x20,0xf2,0x14,0x08,0xa0, +0x01,0x0a,0x10,0x00,0x31,0x81,0x50,0x3c,0x69,0x00,0x00,0x37,0x20,0xf2,0x14,0x08, +0xa0,0x01,0x04,0x10,0x00,0x32,0x81,0x54,0x3c,0x6c,0x00,0x00,0x37,0x20,0xf2,0x14, +0x08,0xa0,0x01,0x07,0x10,0x00,0x33,0x81,0x5c,0x3c,0x61,0x00,0x00,0x37,0x20,0xf2, +0x14,0x18,0xa0,0x01,0x0a,0x10,0x00,0x34,0x81,0x61,0x3c,0x64,0x00,0x00,0x37,0x20, +0xf3,0x14,0x18,0xa0,0x01,0x00,0x10,0x00,0x35,0x81,0x5d,0x3c,0x3b,0x00,0x00,0x37, +0x20,0xf4,0x15,0x08,0xa0,0x01,0x10,0x10,0x00,0x2c,0x81,0x32,0x3c,0x74,0x00,0x00, +0x51,0x20,0xf2,0x13,0x07,0xa0,0x02,0x10,0x10,0x00,0x2d,0x81,0x37,0x3c,0x62,0x00, +0x00,0x51,0x20,0xf2,0x14,0x07,0xa0,0x02,0x10,0x10,0x00,0x2e,0x81,0x3e,0x3c,0x4d, +0x00,0x00,0x51,0x20,0xf2,0x14,0x07,0xa0,0x02,0x10,0x10,0x00,0x2f,0x81,0x43,0x3c, +0x6c,0x00,0x00,0x51,0x20,0xf2,0x14,0x07,0xa0,0x02,0x10,0x10,0x00,0x30,0x81,0x4b, +0x3c,0x66,0x00,0x00,0x51,0x20,0xf2,0x14,0x07,0xa0,0x02,0x10,0x10,0x00,0x31,0x81, +0x50,0x3c,0x6b,0x00,0x00,0x51,0x20,0xf2,0x14,0x07,0xa0,0x02,0x10,0x10,0x00,0x32, +0x81,0x54,0x3c,0x6e,0x00,0x00,0x51,0x20,0xf2,0x14,0x07,0xa0,0x02,0x10,0x10,0x00, +0x33,0x81,0x5c,0x3c,0x63,0x00,0x00,0x51,0x20,0xf2,0x14,0x17,0xa0,0x02,0x10,0x10, +0x00,0x34,0x81,0x61,0x3c,0x66,0x00,0x00,0x51,0x20,0xf3,0x14,0x17,0xa0,0x02,0x10, +0x10,0x00,0x35,0x81,0x5d,0x3c,0x3d,0x00,0x00,0x51,0x20,0xf4,0x15,0x07,0xa0,0x02, +0xf0,0x10,0x00,0x6c,0x80,0x3a,0x2e,0x27,0x00,0x00,0x3d,0x28,0xf4,0x23,0x18,0xa0, +0x03,0x00,0x10,0x00,0x2c,0x81,0x32,0x3c,0x72,0x00,0x00,0x4b,0x20,0xf2,0x13,0x08, +0xa0,0x04,0x00,0x10,0x00,0x2d,0x81,0x37,0x3c,0x60,0x00,0x00,0x4b,0x20,0xf2,0x14, +0x08,0xa0,0x04,0x00,0x10,0x00,0x2e,0x81,0x3e,0x3c,0x4b,0x00,0x00,0x4b,0x20,0xf2, +0x14,0x08,0xa0,0x04,0x00,0x10,0x00,0x2f,0x81,0x43,0x3c,0x6a,0x00,0x00,0x4b,0x20, +0xf2,0x14,0x08,0xa0,0x04,0x0a,0x10,0x00,0x30,0x81,0x4b,0x3c,0x64,0x00,0x00,0x4b, +0x20,0xf2,0x14,0x08,0xa0,0x04,0x0a,0x10,0x00,0x31,0x81,0x50,0x3c,0x69,0x00,0x00, +0x4b,0x20,0xf2,0x14,0x08,0xa0,0x04,0x04,0x10,0x00,0x32,0x81,0x54,0x3c,0x6c,0x00, +0x00,0x4b,0x20,0xf2,0x14,0x08,0xa0,0x04,0x03,0x10,0x00,0x33,0x81,0x5c,0x3c,0x61, +0x00,0x00,0x4b,0x20,0xf2,0x14,0x18,0xa0,0x04,0x07,0x10,0x00,0x34,0x81,0x61,0x3c, +0x64,0x00,0x00,0x4b,0x20,0xf3,0x14,0x18,0xa0,0x04,0x00,0x10,0x00,0x35,0x81,0x5d, +0x3c,0x3b,0x00,0x00,0x4b,0x20,0xf4,0x15,0x08,0xa0,0x04,0x00,0x10,0x00,0x2c,0x81, +0x32,0x3c,0x7e,0x00,0x00,0x4b,0x20,0xf2,0x13,0x08,0xa0,0x04,0x00,0x10,0x00,0x2d, +0x81,0x37,0x3c,0x53,0x00,0x00,0x4b,0x20,0xf2,0x14,0x08,0xa0,0x04,0x00,0x10,0x00, +0x2e,0x81,0x3e,0x3c,0x58,0x00,0x00,0x4b,0x20,0xf2,0x14,0x08,0xa0,0x04,0x00,0x10, +0x00,0x2f,0x81,0x43,0x3c,0x5b,0x00,0x00,0x4b,0x20,0xf2,0x14,0x08,0xa0,0x04,0x0a, +0x10,0x00,0x30,0x81,0x4b,0x3c,0x72,0x00,0x00,0x4b,0x20,0xf2,0x14,0x08,0xa0,0x04, +0x0a,0x10,0x00,0x31,0x81,0x50,0x3c,0x5b,0x00,0x00,0x4b,0x20,0xf2,0x14,0x08,0xa0, +0x04,0x04,0x10,0x00,0x32,0x81,0x54,0x3c,0x79,0x00,0x00,0x4b,0x20,0xf2,0x14,0x08, +0xa0,0x04,0x07,0x10,0x00,0x33,0x81,0x5c,0x3c,0x5a,0x00,0x00,0x4b,0x20,0xf2,0x14, +0x18,0xa0,0x04,0x01,0x10,0x00,0x34,0x81,0x61,0x3c,0x71,0x00,0x00,0x4b,0x20,0xf3, +0x14,0x18,0xa0,0x04,0x00,0x10,0x00,0x35,0x81,0x5d,0x3c,0x2f,0x00,0x00,0x4b,0x20, +0xf4,0x15,0x08,0xa0,0x04,0x00,0x10,0x00,0x0b,0xa0,0x51,0x3c,0x6a,0x00,0x00,0xd7, +0x38,0xf0,0x00,0x0c,0xa0,0x05,0x00,0x12,0x00,0x6c,0x80,0x3a,0x3c,0x27,0x00,0x00, +0x4f,0x22,0xf4,0x23,0x19,0xa0,0x06,0x00,0x10,0x00,0x2c,0x81,0x32,0x3c,0x74,0x00, +0x00,0x5d,0x1b,0xf2,0x13,0x08,0xa0,0x07,0x00,0x10,0x00,0x2d,0x81,0x37,0x3c,0x62, +0x00,0x00,0x5d,0x1b,0xf2,0x14,0x08,0xa0,0x07,0x00,0x10,0x00,0x2e,0x81,0x3e,0x3c, +0x4d,0x00,0x00,0x5d,0x1b,0xf2,0x14,0x08,0xa0,0x07,0x00,0x10,0x00,0x2f,0x81,0x43, +0x3c,0x6c,0x00,0x00,0x5d,0x1b,0xf2,0x14,0x08,0xa0,0x07,0x0a,0x10,0x00,0x30,0x81, +0x4b,0x3c,0x66,0x00,0x00,0x5d,0x1b,0xf2,0x14,0x08,0xa0,0x07,0x0a,0x10,0x00,0x31, +0x81,0x50,0x3c,0x6b,0x00,0x00,0x5d,0x1b,0xf2,0x14,0x08,0xa0,0x07,0x04,0x10,0x00, +0x32,0x81,0x54,0x3c,0x6e,0x00,0x00,0x5d,0x1b,0xf2,0x14,0x08,0xa0,0x07,0x03,0x10, +0x00,0x33,0x81,0x5c,0x3c,0x63,0x00,0x00,0x5d,0x1b,0xf2,0x14,0x18,0xa0,0x07,0x07, +0x10,0x00,0x34,0x81,0x61,0x3c,0x66,0x00,0x00,0x5d,0x1b,0xf3,0x14,0x18,0xa0,0x07, +0x00,0x10,0x00,0x35,0x81,0x5d,0x3c,0x3d,0x00,0x00,0x5d,0x1b,0xf4,0x15,0x08,0xa0, +0x07,0x00,0x10,0x00,0x2c,0x81,0x32,0x68,0x70,0x00,0x00,0x5d,0x18,0xf2,0x13,0x08, +0xa0,0x04,0x00,0x10,0x00,0x2d,0x81,0x37,0x68,0x5e,0x00,0x00,0x5d,0x18,0xf2,0x14, +0x08,0xa0,0x04,0x00,0x10,0x00,0x2e,0x81,0x3e,0x68,0x49,0x00,0x00,0x5d,0x18,0xf2, +0x14,0x08,0xa0,0x04,0x00,0x10,0x00,0x2f,0x81,0x43,0x68,0x68,0x00,0x00,0x5d,0x18, +0xf2,0x14,0x08,0xa0,0x04,0x0a,0x10,0x00,0x30,0x81,0x4b,0x68,0x62,0x00,0x00,0x5d, +0x18,0xf2,0x14,0x08,0xa0,0x04,0x0a,0x10,0x00,0x31,0x81,0x50,0x68,0x67,0x00,0x00, +0x5d,0x18,0xf2,0x14,0x08,0xa0,0x04,0x04,0x10,0x00,0x32,0x81,0x54,0x68,0x6a,0x00, +0x00,0x5d,0x18,0xf2,0x14,0x08,0xa0,0x04,0x07,0x10,0x00,0x33,0x81,0x5c,0x68,0x5f, +0x00,0x00,0x5d,0x18,0xf2,0x14,0x18,0xa0,0x04,0x0a,0x10,0x00,0x34,0x81,0x61,0x68, +0x62,0x00,0x00,0x5d,0x18,0xf3,0x14,0x18,0xa0,0x04,0x00,0x10,0x00,0x35,0x81,0x5d, +0x68,0x39,0x00,0x00,0x5d,0x18,0xf4,0x15,0x08,0xa0,0x04,0x00,0x10,0x00,0x80,0x80, +0x44,0x3c,0x66,0x00,0x00,0x4d,0x20,0xf5,0x24,0x19,0xa0,0x08,0x00,0x10,0x00,0x81, +0x80,0x4a,0x3c,0x78,0x00,0x00,0x4d,0x20,0xf5,0x25,0x09,0xa0,0x08,0x00,0x10,0x00, +0x82,0x80,0x50,0x3c,0x66,0x00,0x00,0x4d,0x20,0xf5,0x25,0x09,0xa0,0x08,0x00,0x10, +0x00,0x83,0x80,0x56,0x3c,0x5b,0x00,0x00,0x4d,0x20,0xf5,0x25,0x19,0xa0,0x08,0x00, +0x10,0x00,0x84,0x80,0x62,0x3c,0x5b,0x00,0x00,0x4d,0x20,0xf5,0x25,0x29,0xa0,0x08, +0x00,0x10,0x00,0x27,0x90,0x51,0x3c,0x51,0x00,0x00,0x2d,0x28,0xf5,0x13,0x2b,0xa0, +0x09,0x00,0x10,0x00,0x28,0x90,0x5d,0x3c,0x67,0x00,0x00,0x2d,0x28,0xf5,0x13,0x3b, +0xa0,0x09,0x00,0x10,0x00,0x2b,0x80,0x52,0x3c,0x03,0x00,0x00,0x23,0x20,0xf4,0x15, +0x07,0xa3,0x0a,0x00,0x10,0x00,0xf3,0x60,0x52,0x3c,0x5d,0x00,0x00,0x3d,0x28,0xf6, +0x25,0x25,0xa0,0x0b,0x00,0x10,0x00,0xf3,0x80,0x52,0x3c,0x62,0x00,0x00,0x49,0x20, +0xa6,0x25,0x25,0xa0,0x0c,0x00,0x10,0x00,0x01,0x81,0x47,0x75,0x65,0x00,0x00,0x55, +0x20,0xd4,0x14,0x16,0xa0,0x0d,0x00,0x10,0x70,0x01,0x81,0x47,0x3c,0x6a,0x00,0x00, +0x3f,0x28,0xf4,0x14,0x16,0xa4,0x0e,0x00,0x10,0x00,0xf4,0x80,0x47,0x3c,0x6a,0x00, +0x00,0x3b,0x38,0xf7,0x47,0x08,0xa0,0x0f,0x00,0x10,0x00,0xf5,0x80,0x53,0x3c,0x51, +0x00,0x00,0x3b,0x38,0xf7,0x47,0x08,0xa0,0x0f,0x00,0x10,0x00,0xf5,0x80,0x53,0x3c, +0x51,0x00,0x00,0x3b,0x38,0xf7,0x48,0x08,0xa0,0x0f,0x00,0x10,0x00,0xf5,0x80,0x53, +0x3c,0x52,0x00,0x00,0x3b,0x38,0xf7,0x48,0x18,0xa0,0x0f,0x00,0x10,0x00,0x36,0x81, +0x5e,0x3c,0x01,0x00,0x00,0x2d,0x38,0xf0,0x06,0x36,0xa0,0x10,0x00,0x10,0x10,0xff, +0x80,0x4d,0x3c,0x5f,0x00,0x00,0x01,0x21,0xf4,0xa3,0x25,0xa1,0x11,0x00,0x14,0x00, +0x3f,0x80,0x4b,0x3c,0x4c,0x00,0x00,0x43,0x29,0xf5,0x16,0x07,0xa0,0x12,0x0e,0x13, +0x00,0x40,0x80,0x4b,0x3c,0x4c,0x00,0x00,0x6b,0x2a,0xf5,0x16,0x07,0xa0,0x13,0x04, +0x12,0x01,0x8e,0x80,0x4a,0x3c,0x6a,0x00,0x00,0x3d,0x3a,0xf0,0x00,0x0a,0xa0,0x14, +0x00,0x13,0x00,0x8c,0x80,0x3d,0x3c,0x6e,0x00,0x00,0x41,0x3b,0xf0,0x00,0x09,0xa0, +0x15,0x00,0x13,0x00,0x8d,0x80,0x55,0x3c,0x68,0x00,0x00,0x41,0x3b,0xf0,0x00,0x09, +0xa0,0x15,0x00,0x10,0x00,0x28,0x81,0x39,0x3c,0x6e,0x00,0x00,0x33,0x39,0xf0,0x00, +0x0a,0xa0,0x16,0x00,0x10,0x00,0x29,0x81,0x45,0x3c,0x70,0x00,0x00,0x33,0x39,0xf0, +0x00,0x0a,0xa0,0x16,0x00,0x10,0x00,0x2a,0x81,0x51,0x3c,0x6a,0x00,0x00,0x33,0x39, +0xf0,0x00,0x0a,0xa0,0x16,0x00,0x10,0x00,0x2b,0x81,0x5d,0x3c,0x65,0x00,0x00,0x33, +0x39,0xf0,0x00,0x0a,0xa0,0x16,0x00,0x10,0x00,0x27,0x71,0x5d,0x3c,0x67,0x00,0x00, +0x33,0x39,0xf0,0x00,0x0a,0xa0,0x16,0x00,0x10,0x00,0x87,0x80,0x32,0x3c,0x6a,0x00, +0x00,0x3b,0x11,0xf0,0x00,0x09,0xa0,0x17,0x00,0x10,0x00,0x88,0x80,0x3a,0x3c,0x78, +0x00,0x00,0x3b,0x11,0xf0,0x00,0x09,0xa0,0x17,0x00,0x10,0x00,0x89,0x80,0x42,0x3c, +0x74,0x00,0x00,0x3b,0x11,0xf0,0x00,0x09,0xa0,0x17,0x00,0x10,0x00,0x8a,0x80,0x4a, +0x3c,0x78,0x00,0x00,0x3b,0x11,0xf0,0x00,0x09,0xa0,0x17,0x00,0x10,0x00,0x8b,0x80, +0x51,0x3c,0x0e,0x00,0x00,0x3b,0x11,0xf0,0x00,0x09,0xa0,0x17,0x06,0x10,0x00,0xac, +0x80,0x40,0x3c,0x02,0x00,0x00,0x3f,0x38,0xf0,0x00,0x09,0xa1,0x18,0x00,0x10,0x00, +0xad,0x80,0x58,0x3c,0x01,0x00,0x00,0x3f,0x38,0xf0,0x00,0x09,0xa1,0x18,0x00,0x10, +0x00,0x06,0x80,0x4b,0x3c,0x65,0x00,0x00,0x5b,0x22,0x90,0x00,0x09,0xa0,0x19,0x00, +0x10,0x00,0x07,0x80,0x60,0x3c,0x3a,0x00,0x00,0x5b,0x22,0x90,0x00,0x09,0xa0,0x19, +0x00,0x10,0x00,0x70,0x80,0x4a,0x63,0x67,0x00,0x00,0x75,0x23,0xa0,0x00,0x09,0xa0, +0x1a,0x00,0x1c,0x00,0x70,0x80,0x4a,0x3c,0x78,0x00,0x00,0x51,0x30,0xa0,0x00,0x09, +0xa2,0x1b,0x00,0x10,0x00,0xac,0x80,0x40,0x3c,0x05,0x00,0x00,0x51,0x38,0xf0,0x00, +0x09,0xa0,0x1c,0x00,0x10,0x00,0xad,0x80,0x58,0x3c,0x04,0x00,0x00,0x51,0x38,0xf0, +0x00,0x09,0xa0,0x1c,0x00,0x10,0x00,0x41,0xa0,0x42,0x6b,0x5f,0x00,0x00,0x95,0x3a, +0x75,0x20,0x0a,0xa0,0x1d,0x05,0x10,0x00,0xb3,0x80,0x36,0x3c,0x74,0x00,0x00,0x35, +0x28,0xf5,0x34,0x09,0xa0,0x1e,0x0c,0x10,0x00,0xb7,0x80,0x41,0x3c,0x7f,0x00,0x00, +0x35,0x28,0xf5,0x34,0x09,0xa0,0x1e,0x00,0x10,0x00,0xb5,0x80,0x48,0x3c,0x6d,0x00, +0x00,0x35,0x28,0xf6,0x34,0x09,0xa0,0x1e,0x00,0x10,0x00,0xb4,0x80,0x4e,0x3c,0x74, +0x00,0x00,0x35,0x28,0xf6,0x35,0x09,0xa0,0x1e,0x00,0x10,0x00,0xb6,0x80,0x57,0x3c, +0x63,0x00,0x00,0x35,0x28,0xf6,0x35,0x19,0xa0,0x1e,0x00,0x13,0x00,0x0c,0x80,0x36, +0x3c,0x59,0x00,0x00,0x43,0x28,0xf0,0x04,0x19,0xa0,0x1f,0x00,0x13,0x00,0x0d,0x80, +0x42,0x3c,0x62,0x00,0x00,0x43,0x28,0xf0,0x05,0x09,0xa0,0x1f,0x00,0x13,0x00,0x0e, +0x80,0x4a,0x3c,0x5b,0x00,0x00,0x43,0x28,0xf5,0x94,0x09,0xa0,0x1f,0x00,0x13,0x00, +0x0f,0x80,0x56,0x3c,0x5b,0x00,0x00,0x43,0x28,0xf6,0x95,0x09,0xa0,0x1f,0x00,0x10, +0x00,0x5a,0x80,0x37,0x3c,0x70,0x00,0x00,0x35,0x28,0xf6,0x34,0x09,0xa0,0x20,0x00, +0x10,0x00,0x5b,0x80,0x46,0x3c,0x61,0x00,0x00,0x35,0x28,0xf6,0x34,0x09,0xa0,0x20, +0x00,0x10,0x00,0x5c,0x80,0x53,0x3c,0x52,0x00,0x00,0x35,0x28,0xf6,0x34,0x09,0xa0, +0x20,0x00,0x15,0x20,0x61,0x80,0x35,0x3c,0x4d,0x00,0x00,0x4b,0x29,0xf5,0x54,0x0a, +0xa0,0x21,0x00,0x15,0x20,0x60,0x80,0x3a,0x3c,0x62,0x00,0x00,0x4b,0x29,0xf5,0x54, +0x0a,0xa0,0x21,0x00,0x15,0x20,0x63,0x80,0x3f,0x3c,0x44,0x00,0x00,0x41,0x29,0xf5, +0x55,0x0a,0xa0,0x21,0x00,0x15,0x20,0x62,0x80,0x48,0x3c,0x53,0x00,0x00,0x4b,0x29, +0xf5,0x55,0x0a,0xa0,0x21,0x00,0x15,0x20,0x65,0x80,0x4d,0x3c,0x3b,0x00,0x00,0x4b, +0x29,0xf5,0x55,0x1a,0xa0,0x21,0x00,0x15,0x20,0x64,0x80,0x52,0x3c,0x31,0x00,0x00, +0x4b,0x29,0xf5,0x55,0x1a,0xa0,0x21,0x00,0x15,0x20,0x66,0x80,0x59,0x3c,0x5e,0x00, +0x00,0x4b,0x29,0xf5,0x55,0x2a,0xa0,0x21,0x00,0x15,0x20,0x67,0x80,0x62,0x3c,0x5b, +0x00,0x00,0x4b,0x29,0xf6,0x56,0x0a,0xa0,0x21,0x00,0x10,0x00,0x68,0x80,0x4a,0x3c, +0x78,0x00,0x00,0x33,0x28,0xf6,0x15,0x09,0xa0,0x22,0x00,0x13,0x00,0xa5,0x80,0x39, +0x3c,0x7d,0x00,0x00,0x3f,0x29,0xf2,0x11,0x09,0xa0,0x23,0x00,0x13,0x00,0xa6,0x80, +0x42,0x3c,0x74,0x00,0x00,0x3f,0x29,0xf2,0x11,0x09,0xa0,0x23,0x00,0x12,0x00,0x51, +0x80,0x36,0x3c,0x50,0x00,0x00,0x43,0x21,0xa2,0x12,0x0a,0xa0,0x24,0x00,0x12,0x00, +0x52,0x80,0x3a,0x3c,0x61,0x00,0x00,0x43,0x21,0xa2,0x12,0x0a,0xa0,0x24,0x00,0x12, +0x00,0x53,0x80,0x3e,0x3c,0x78,0x00,0x00,0x43,0x21,0xa2,0x12,0x0a,0xa0,0x24,0x00, +0x12,0x00,0x54,0x80,0x42,0x3c,0x4f,0x00,0x00,0x43,0x21,0xa2,0x12,0x0a,0xa0,0x24, +0x00,0x12,0x00,0x55,0x80,0x46,0x3c,0x61,0x00,0x00,0x43,0x21,0xa2,0x12,0x0a,0xa0, +0x24,0x00,0x12,0x00,0x56,0x80,0x4a,0x3c,0x78,0x00,0x00,0x43,0x21,0xa2,0x12,0x0a, +0xa0,0x24,0x00,0x12,0x00,0x57,0x80,0x4e,0x3c,0x74,0x00,0x00,0x43,0x21,0xa2,0x12, +0x0a,0xa0,0x24,0x00,0x12,0x00,0x58,0x80,0x52,0x3c,0x61,0x00,0x00,0x43,0x21,0xa2, +0x12,0x0a,0xa0,0x24,0x00,0x12,0x00,0x59,0x80,0x56,0x3c,0x20,0x00,0x00,0x43,0x21, +0xa2,0x12,0x0a,0xa0,0x24,0x00,0x10,0x00,0x5e,0x90,0x4d,0x3c,0x3b,0x00,0x00,0x31, +0x28,0xf4,0x24,0x09,0xa0,0x25,0x00,0x10,0x00,0x5d,0x90,0x52,0x3c,0x32,0x00,0x00, +0x1d,0x28,0xf4,0x24,0x09,0xa0,0x25,0x00,0x10,0x00,0x5f,0x90,0x57,0x3c,0x63,0x00, +0x00,0x31,0x28,0xf4,0x24,0x09,0xa0,0x25,0x00,0x10,0x00,0x04,0x80,0x2d,0x3c,0x35, +0x00,0x00,0x1d,0x18,0xf5,0x15,0x09,0xa0,0x26,0x00,0x10,0x00,0x05,0x80,0x47,0x3c, +0x52,0x00,0x00,0x1d,0x18,0xf5,0x15,0x09,0xa0,0x26,0x00,0x10,0x00,0x4a,0x80,0x28, +0x3c,0x7a,0x00,0x00,0x21,0x18,0xf6,0x14,0x09,0xa0,0x27,0x00,0x10,0x00,0x4b,0x80, +0x2d,0x3c,0x72,0x00,0x00,0x21,0x18,0xf6,0x14,0x09,0xa0,0x27,0x00,0x10,0x00,0x4c, +0x80,0x32,0x3c,0x73,0x00,0x00,0x21,0x18,0xf6,0x14,0x09,0xa0,0x27,0x00,0x10,0x00, +0x4d,0x80,0x37,0x3c,0x79,0x00,0x00,0x21,0x18,0xf6,0x14,0x09,0xa0,0x27,0x00,0x12, +0x00,0x4f,0x90,0x3a,0x3c,0x52,0x00,0x00,0x33,0x18,0xf3,0x90,0x0a,0xa0,0x28,0x05, +0x12,0x00,0x50,0x90,0x3f,0x3c,0x56,0x00,0x00,0x33,0x18,0xf3,0x90,0x1a,0xa0,0x28, +0x00,0x12,0x00,0x6b,0x90,0x44,0x3c,0x3e,0x00,0x00,0x33,0x18,0xf3,0x90,0x2a,0xa0, +0x28,0x00,0x12,0x00,0x69,0x90,0x49,0x3c,0x4f,0x00,0x00,0x33,0x18,0xf5,0xb0,0x0a, +0xa0,0x28,0x00,0x12,0x00,0x6a,0x90,0x4e,0x3c,0x51,0x00,0x00,0x33,0x18,0xf5,0xb0, +0x0a,0xa0,0x28,0x00,0x10,0x00,0x4e,0x80,0x43,0x3c,0x71,0x00,0x00,0x2d,0x10,0xf3, +0x63,0x19,0xa0,0x29,0x00,0x12,0x00,0xa3,0x90,0x3d,0x3c,0x76,0x00,0x00,0x21,0x19, +0xf5,0x32,0x1a,0xa0,0x2a,0x00,0x10,0x00,0xa2,0x90,0x44,0x3c,0x66,0x00,0x00,0x25, +0x20,0xb0,0x03,0x09,0xa0,0x2b,0x00,0x12,0x00,0xbe,0x90,0x3e,0x3c,0x6a,0x00,0x00, +0x47,0x39,0xf4,0x14,0x09,0xa0,0x2c,0x00,0x12,0x00,0x17,0x81,0x2d,0x3c,0x67,0x00, +0x00,0x35,0x39,0xf3,0x50,0x08,0xa0,0x2d,0x00,0x13,0x00,0x05,0x81,0x44,0x3c,0x66, +0x00,0x00,0x33,0x3b,0xf3,0x20,0x09,0xa0,0x2e,0x00,0x13,0x00,0x02,0x81,0x47,0x3c, +0x52,0x00,0x00,0x33,0x3b,0xf3,0x20,0x09,0xa0,0x2e,0x00,0x13,0x00,0x06,0x81,0x4c, +0x3c,0x64,0x00,0x00,0x33,0x3b,0xf3,0x20,0x09,0xa0,0x2e,0x00,0x13,0x00,0x07,0x81, +0x4c,0x3c,0x01,0x00,0x00,0x33,0x3b,0xf3,0x20,0x09,0xa0,0x2e,0x00,0x13,0x00,0x08, +0x81,0x50,0x3c,0x3c,0x00,0x00,0x33,0x3b,0xf3,0x20,0x09,0xa0,0x2e,0x00,0x13,0x00, +0x0a,0x81,0x55,0x3c,0x4d,0x00,0x00,0x33,0x3b,0xf3,0x20,0x09,0xa0,0x2e,0x00,0x13, +0x00,0x0b,0x81,0x57,0x3c,0x64,0x00,0x00,0x33,0x3b,0xf3,0x20,0x09,0xa0,0x2e,0x00, +0x13,0x00,0x0c,0x81,0x58,0x3c,0x22,0x00,0x00,0x33,0x3b,0xf3,0x20,0x09,0xa0,0x2e, +0x00,0x13,0x00,0x0d,0x81,0x5b,0x3c,0x36,0x00,0x00,0x33,0x3b,0xf3,0x20,0x09,0xa0, +0x2e,0x00,0x13,0x00,0x09,0x81,0x5e,0x3c,0x61,0x00,0x00,0x33,0x3b,0xf3,0x20,0x09, +0xa0,0x2e,0x00,0x12,0x00,0x03,0x81,0x3f,0x3c,0x54,0x00,0x00,0x3b,0x3b,0xa3,0x20, +0x09,0xa0,0x2f,0x00,0x12,0x00,0x04,0x81,0x41,0x3c,0x5e,0x00,0x00,0x3b,0x3b,0xa3, +0x20,0x09,0xa0,0x2f,0x00,0x12,0x00,0x05,0x81,0x44,0x3c,0x66,0x00,0x00,0x3b,0x3b, +0xa3,0x20,0x09,0xa0,0x2f,0x00,0x12,0x00,0x02,0x81,0x47,0x3c,0x52,0x00,0x00,0x35, +0x3b,0xa3,0x20,0x09,0xa0,0x2f,0x00,0x12,0x00,0x06,0x81,0x4c,0x3c,0x64,0x00,0x00, +0x3b,0x3b,0xa3,0x20,0x09,0xa0,0x2f,0x00,0x12,0x00,0x07,0x81,0x4c,0x3c,0x01,0x00, +0x00,0x3b,0x3b,0xa3,0x20,0x09,0xa0,0x2f,0x00,0x12,0x00,0x08,0x81,0x50,0x3c,0x3c, +0x00,0x00,0x2f,0x3b,0xa3,0x20,0x09,0xa0,0x2f,0x00,0x12,0x00,0x0a,0x81,0x55,0x3c, +0x4d,0x00,0x00,0x35,0x3b,0xa3,0x20,0x09,0xa0,0x2f,0x00,0x12,0x00,0x0b,0x81,0x57, +0x3c,0x64,0x00,0x00,0x2f,0x3b,0xa3,0x20,0x09,0xa0,0x2f,0x00,0x12,0x00,0x0c,0x81, +0x58,0x3c,0x22,0x00,0x00,0x35,0x3b,0xa3,0x20,0x09,0xa0,0x2f,0x00,0x12,0x00,0x0d, +0x81,0x5b,0x3c,0x36,0x00,0x00,0x2f,0x3b,0xa3,0x20,0x09,0xa0,0x2f,0x00,0x12,0x00, +0x09,0x81,0x5e,0x3c,0x61,0x00,0x00,0x2f,0x3b,0xa3,0x20,0x09,0xa0,0x2f,0x00,0x13, +0x00,0x12,0x91,0x45,0x3c,0x51,0x00,0x00,0x3f,0x33,0xa0,0x00,0x08,0xa0,0x30,0x00, +0x13,0x00,0x13,0x91,0x4b,0x3c,0x44,0x00,0x00,0x3f,0x33,0xa0,0x00,0x08,0xa0,0x30, +0x00,0x13,0x00,0x15,0x91,0x56,0x3c,0x5a,0x00,0x00,0x3f,0x33,0xa0,0x00,0x18,0xa0, +0x30,0x00,0x13,0x00,0x16,0x91,0x59,0x3c,0x5e,0x00,0x00,0x3f,0x33,0xa0,0x00,0x18, +0xa0,0x30,0x00,0x13,0x00,0x14,0x91,0x5f,0x3c,0x52,0x00,0x00,0x3f,0x33,0xa0,0x00, +0x18,0xa0,0x30,0x00,0x13,0x00,0x10,0x81,0x30,0x3c,0x61,0x00,0x00,0x3d,0x19,0x90, +0x00,0x09,0xa0,0x31,0x00,0x13,0x00,0x11,0x81,0x3c,0x3c,0x52,0x00,0x00,0x3d,0x19, +0x90,0x00,0x09,0xa0,0x31,0x0a,0x12,0x00,0xb0,0x80,0x46,0x3c,0x0a,0x00,0x00,0x21, +0x38,0xf0,0x00,0x07,0xa6,0x32,0x05,0x12,0x00,0x35,0x80,0x4c,0x3c,0x03,0x00,0x00, +0x21,0x38,0xf0,0x00,0x07,0xa6,0x32,0x05,0x12,0x00,0x33,0x80,0x54,0x3c,0x79,0x00, +0x00,0x21,0x38,0xf0,0x00,0x07,0xa6,0x32,0x05,0x12,0x00,0x34,0x80,0x57,0x3c,0x01, +0x00,0x00,0x21,0x38,0xf0,0x00,0x07,0xa6,0x32,0x00,0x12,0x00,0xaf,0x80,0x65,0x3c, +0x68,0x00,0x00,0x21,0x38,0xf0,0x00,0x07,0xa6,0x32,0x00,0x10,0x00,0xb8,0x80,0x3c, +0x3c,0x6a,0x00,0x00,0x43,0x28,0xf0,0x00,0x05,0xa0,0x33,0x00,0x10,0x00,0xb9,0x80, +0x45,0x3c,0x67,0x00,0x00,0x43,0x28,0xf0,0x00,0x05,0xa0,0x33,0x00,0x10,0x00,0xbb, +0x80,0x4c,0x3c,0x72,0x00,0x00,0x43,0x28,0xf0,0x00,0x05,0xa0,0x33,0x00,0x10,0x00, +0xba,0x80,0x53,0x3c,0x6d,0x00,0x00,0x3d,0x28,0xf0,0x00,0x05,0xa0,0x33,0x00,0x10, +0x00,0xbc,0x80,0x5a,0x3c,0x70,0x00,0x00,0x43,0x28,0xf0,0x00,0x05,0xa0,0x33,0x00, +0x10,0x00,0x7e,0x80,0x4f,0x3c,0x5c,0x00,0x00,0x2d,0x29,0xf5,0x25,0x07,0xa0,0x34, +0x00,0x10,0x00,0x7f,0x80,0x5a,0x3c,0x4f,0x00,0x00,0x2d,0x29,0xf5,0x25,0x07,0xa0, +0x34,0x00,0x10,0x70,0x00,0x81,0x39,0x3c,0x6a,0x00,0x00,0x15,0x28,0xf0,0x05,0x16, +0xa0,0x35,0x00,0x10,0x00,0x3c,0x81,0x46,0x3c,0x06,0x00,0x00,0x37,0x20,0x80,0x00, +0x07,0xa0,0x36,0x00,0x10,0x00,0x3e,0x81,0x4c,0x3c,0x03,0x00,0x00,0x37,0x20,0x80, +0x00,0x07,0xa0,0x36,0x00,0x10,0x00,0x3d,0x81,0x54,0x3c,0x72,0x00,0x00,0x37,0x20, +0x80,0x00,0x07,0xa0,0x36,0x00,0x10,0x00,0x3f,0x81,0x57,0x3c,0x05,0x00,0x00,0x41, +0x20,0x80,0x00,0x07,0xa0,0x36,0x00,0x10,0x00,0x40,0x81,0x65,0x3c,0x76,0x00,0x00, +0x41,0x20,0x80,0x00,0x07,0xa0,0x36,0x0a,0x10,0x00,0xb0,0x80,0x46,0x3c,0x0a,0x00, +0x00,0x41,0x19,0xf0,0x00,0x07,0xa0,0x37,0x05,0x10,0x00,0x35,0x80,0x4c,0x3c,0x03, +0x00,0x00,0x41,0x19,0xf0,0x00,0x07,0xa0,0x37,0x05,0x10,0x00,0x33,0x80,0x54,0x3c, +0x79,0x00,0x00,0x41,0x19,0xf0,0x00,0x07,0xa0,0x37,0x05,0x10,0x00,0x34,0x80,0x57, +0x3c,0x01,0x00,0x00,0x41,0x19,0xf0,0x00,0x07,0xa0,0x37,0x00,0x10,0x00,0xaf,0x80, +0x65,0x3c,0x68,0x00,0x00,0x41,0x19,0xf0,0x00,0x07,0xa0,0x37,0xe0,0x10,0x00,0x02, +0x90,0x49,0x3c,0x5d,0x00,0x00,0x59,0x20,0x93,0x22,0x06,0xa0,0x38,0x20,0x10,0x00, +0xae,0x70,0x47,0x3a,0x7d,0x00,0x00,0x39,0x20,0x70,0x01,0x06,0xa0,0x39,0x50,0x10, +0x00,0x02,0x90,0x55,0x3c,0x61,0x00,0x00,0x4b,0x19,0x70,0x00,0x06,0xa0,0x3a,0xb0, +0x10,0x00,0x02,0x90,0x55,0x79,0x55,0x00,0x00,0x4b,0x19,0x70,0x00,0x06,0xa0,0x3b, +0x00,0x10,0x00,0x18,0x80,0x45,0x3c,0x52,0x00,0x00,0x3d,0x1a,0x70,0x00,0x08,0xa0, +0x3c,0x00,0x10,0x00,0x19,0x80,0x4a,0x3c,0x52,0x00,0x00,0x3d,0x1a,0x70,0x00,0x08, +0xa0,0x3c,0x00,0x10,0x00,0x1a,0x80,0x51,0x3c,0x56,0x00,0x00,0x3d,0x1a,0x70,0x00, +0x08,0xa0,0x3c,0x00,0x10,0x00,0x1b,0x80,0x5b,0x3c,0x55,0x00,0x00,0x3d,0x1a,0x70, +0x00,0x08,0xa0,0x3c,0x00,0x10,0x00,0x29,0x80,0x50,0x3c,0x4c,0x00,0x00,0x19,0x20, +0xf7,0x20,0x08,0xa0,0x3d,0x00,0x10,0x00,0x2a,0x80,0x51,0x3c,0x5a,0x00,0x00,0x3d, +0x19,0x85,0x21,0x07,0xa0,0x3e,0x00,0x10,0x00,0x49,0x70,0x3e,0x3c,0x6a,0x00,0x00, +0x01,0x30,0x80,0x05,0x05,0xa0,0x3f,0x00,0x12,0x00,0xf6,0x80,0x47,0x3c,0x22,0x00, +0x00,0x29,0x32,0xf3,0x20,0x0a,0xa0,0x40,0x00,0x12,0x00,0xf8,0x80,0x4e,0x3c,0x76, +0x00,0x00,0x29,0x32,0xf3,0x20,0x0a,0xa0,0x40,0x00,0x12,0x00,0xf7,0x80,0x54,0x3c, +0x6e,0x00,0x00,0x29,0x32,0xf3,0x20,0x0a,0xa0,0x40,0x00,0x12,0x00,0xfa,0x80,0x5a, +0x3c,0x52,0x00,0x00,0x29,0x32,0xf3,0x20,0x0a,0xa0,0x40,0x00,0x12,0x00,0xf9,0x80, +0x5f,0x3c,0x22,0x00,0x00,0x29,0x32,0xf3,0x20,0x0a,0xa0,0x40,0x00,0x12,0x00,0xfb, +0x80,0x66,0x3c,0x52,0x00,0x00,0x29,0x32,0xf3,0x20,0x0a,0xa0,0x40,0x00,0x13,0x00, +0xf0,0x80,0x45,0x3c,0x7d,0x00,0x00,0x29,0x21,0xf0,0x00,0x09,0xa0,0x41,0x00,0x13, +0x00,0xf1,0x80,0x4a,0x3c,0x02,0x00,0x00,0x29,0x21,0xf0,0x00,0x09,0xa0,0x41,0x00, +0x13,0x00,0xf2,0x80,0x50,0x3c,0x3c,0x00,0x00,0x29,0x21,0xf0,0x00,0x09,0xa0,0x41, +0x00,0x13,0x00,0x85,0x80,0x35,0x3c,0x78,0x00,0x00,0x21,0x21,0xf5,0x10,0x09,0xa0, +0x42,0x00,0x13,0x00,0x86,0x80,0x3d,0x3c,0x3e,0x00,0x00,0x21,0x21,0xf5,0x10,0x09, +0xa0,0x42,0x00,0x15,0x00,0xb1,0x80,0x4c,0x3c,0x67,0x00,0x00,0x33,0x28,0xf3,0xf0, +0x0a,0xa1,0x43,0x00,0x15,0x00,0xb2,0x80,0x58,0x3c,0x67,0x00,0x00,0x33,0x28,0x83, +0xf0,0x0a,0xa1,0x43,0x00,0x13,0x00,0x7c,0x80,0x50,0x3c,0x68,0x00,0x00,0x2f,0x1a, +0xf0,0x00,0x09,0xa0,0x44,0x00,0x13,0x00,0x7d,0x80,0x57,0x3c,0x28,0x00,0x00,0x2f, +0x1a,0xf0,0x00,0x09,0xa0,0x44,0x00,0x1a,0x00,0xfc,0x80,0x4a,0x3c,0x57,0x00,0x00, +0x29,0x28,0xf0,0x00,0x0a,0xa0,0x45,0x00,0x1a,0x00,0xfd,0x80,0x56,0x3c,0x66,0x00, +0x00,0x29,0x28,0xf0,0x00,0x0a,0xa0,0x45,0xf0,0x14,0x00,0xd3,0x80,0x25,0x3c,0x49, +0xfc,0x04,0x41,0x18,0xa5,0x11,0x08,0xa0,0x46,0xf0,0x14,0x00,0xda,0x80,0x2b,0x3c, +0x52,0xfc,0x04,0x41,0x18,0xa5,0x11,0x08,0xa0,0x46,0xf0,0x14,0x00,0xd4,0x80,0x31, +0x3c,0x49,0xfc,0x04,0x41,0x18,0xa5,0x11,0x08,0xa0,0x46,0xf0,0x14,0x00,0xdb,0x80, +0x37,0x3c,0x44,0xfc,0x04,0x41,0x18,0xa5,0x11,0x08,0xa0,0x46,0xf0,0x14,0x00,0xd5, +0x80,0x3d,0x3c,0x5d,0xfc,0x04,0x41,0x18,0xa5,0x11,0x08,0xa0,0x46,0xf0,0x14,0x00, +0xdc,0x80,0x43,0x3c,0x4c,0xfc,0x04,0x41,0x18,0xa5,0x11,0x08,0xa0,0x46,0xf0,0x14, +0x00,0xd6,0x80,0x49,0x3c,0x50,0xfc,0x04,0x41,0x18,0xa5,0x11,0x08,0xa0,0x46,0xf0, +0x14,0x00,0xdd,0x80,0x4f,0x3c,0x60,0xfc,0x04,0x41,0x18,0xa5,0x11,0x08,0xa0,0x46, +0xf0,0x14,0x00,0xd7,0x80,0x54,0x3c,0x07,0xfc,0x04,0x41,0x18,0xa5,0x11,0x08,0xa0, +0x46,0xf0,0x14,0x00,0xde,0x80,0x5b,0x3c,0x3a,0xfc,0x04,0x41,0x18,0xa5,0x11,0x08, +0xa0,0x46,0xf0,0x14,0x00,0xd8,0x80,0x61,0x3c,0x50,0xfc,0x04,0x41,0x18,0xa5,0x11, +0x08,0xa0,0x46,0xf0,0x14,0x00,0xd9,0x80,0x6d,0x3c,0x50,0xfc,0x04,0x41,0x18,0xa5, +0x11,0x08,0xa0,0x46,0x10,0x12,0x00,0x18,0x81,0x25,0x79,0x57,0xfc,0x04,0x41,0x19, +0x85,0x23,0x08,0xa0,0x47,0x10,0x12,0x00,0x19,0x81,0x2b,0x79,0x5c,0xfc,0x04,0x41, +0x19,0x85,0x23,0x08,0xa0,0x47,0x10,0x12,0x00,0x1a,0x81,0x31,0x79,0x55,0xfc,0x04, +0x41,0x19,0x85,0x23,0x08,0xa0,0x47,0x10,0x12,0x00,0x1b,0x81,0x37,0x79,0x5c,0xfc, +0x04,0x41,0x19,0x85,0x23,0x08,0xa0,0x47,0x10,0x12,0x00,0x1c,0x81,0x3d,0x79,0x62, +0xfc,0x04,0x41,0x19,0x85,0x23,0x08,0xa0,0x47,0x10,0x12,0x00,0x1d,0x81,0x43,0x79, +0x65,0xfc,0x04,0x41,0x19,0x85,0x23,0x08,0xa0,0x47,0x10,0x12,0x00,0x1e,0x81,0x49, +0x79,0x70,0xfc,0x04,0x41,0x19,0x85,0x23,0x08,0xa0,0x47,0x10,0x12,0x00,0x1f,0x81, +0x4f,0x79,0x65,0xfc,0x04,0x41,0x19,0x85,0x23,0x08,0xa0,0x47,0x10,0x12,0x00,0x20, +0x81,0x54,0x79,0x0c,0xfc,0x04,0x41,0x19,0x85,0x23,0x08,0xa0,0x47,0x10,0x12,0x00, +0x21,0x81,0x5b,0x79,0x3e,0xfc,0x04,0x41,0x19,0x85,0x23,0x08,0xa0,0x47,0x10,0x12, +0x00,0x22,0x81,0x61,0x79,0x55,0xfc,0x04,0x41,0x19,0x85,0x23,0x08,0xa0,0x47,0x10, +0x12,0x00,0x23,0x81,0x6d,0x79,0x55,0xfc,0x04,0x41,0x19,0x85,0x23,0x08,0xa0,0x47, +0x30,0x10,0x00,0x18,0x81,0x25,0x3c,0x59,0x00,0x00,0x51,0x26,0x85,0x23,0x08,0xa0, +0x48,0x30,0x10,0x00,0x19,0x81,0x2b,0x3c,0x5e,0x00,0x00,0x51,0x26,0x85,0x23,0x08, +0xa0,0x48,0x30,0x10,0x00,0x1a,0x81,0x31,0x3c,0x57,0x00,0x00,0x51,0x26,0x85,0x23, +0x08,0xa0,0x48,0x30,0x10,0x00,0x1b,0x81,0x37,0x3c,0x5e,0x00,0x00,0x51,0x26,0x85, +0x23,0x08,0xa0,0x48,0x30,0x10,0x00,0x1c,0x81,0x3d,0x3c,0x64,0x00,0x00,0x51,0x26, +0x85,0x23,0x08,0xa0,0x48,0x30,0x10,0x00,0x1d,0x81,0x43,0x3c,0x67,0x00,0x00,0x51, +0x26,0x85,0x23,0x08,0xa0,0x48,0x30,0x10,0x00,0x1e,0x81,0x49,0x3c,0x72,0x00,0x00, +0x51,0x26,0x85,0x23,0x08,0xa0,0x48,0x30,0x10,0x00,0x1f,0x81,0x4f,0x3c,0x67,0x00, +0x00,0x51,0x26,0x85,0x23,0x08,0xa0,0x48,0x30,0x10,0x00,0x20,0x81,0x54,0x3c,0x0e, +0x00,0x00,0x51,0x26,0x85,0x23,0x08,0xa0,0x48,0x30,0x10,0x00,0x21,0x81,0x5b,0x3c, +0x40,0x00,0x00,0x51,0x26,0x85,0x23,0x08,0xa0,0x48,0x30,0x10,0x00,0x22,0x81,0x61, +0x3c,0x57,0x00,0x00,0x51,0x26,0x85,0x23,0x08,0xa0,0x48,0x30,0x10,0x00,0x23,0x81, +0x6d,0x3c,0x57,0x00,0x00,0x51,0x26,0x85,0x23,0x08,0xa0,0x48,0xd0,0x10,0x00,0x24, +0x71,0x40,0x79,0x02,0x00,0x00,0x15,0x22,0x85,0x23,0x08,0xa0,0x49,0x00,0x12,0x00, +0xe3,0x80,0x4b,0x3c,0x44,0x00,0x00,0x37,0x21,0xf5,0x20,0x0a,0xa0,0x4a,0x00,0x12, +0x00,0xe4,0x80,0x51,0x3c,0x67,0x00,0x00,0x37,0x21,0xf5,0x20,0x0a,0xa0,0x4a,0x00, +0x12,0x00,0xe5,0x80,0x57,0x3c,0x24,0x00,0x00,0x29,0x21,0xf5,0x20,0x0a,0xa0,0x4a, +0x00,0x12,0x00,0xe6,0x80,0x5c,0x3c,0x12,0x00,0x00,0x29,0x21,0xf5,0x20,0x0a,0xa0, +0x4a,0x00,0x12,0x00,0xe7,0x80,0x63,0x3c,0x62,0x00,0x00,0x29,0x21,0xf5,0x20,0x0a, +0xa0,0x4a,0x00,0x12,0x00,0xe8,0x80,0x5e,0x3c,0x02,0x00,0x00,0x37,0x21,0xf5,0x20, +0x0a,0xa0,0x4a,0x00,0x12,0x00,0x92,0x80,0x3c,0x3c,0x7c,0x00,0x00,0x41,0x19,0xf5, +0x20,0x0b,0xa0,0x4b,0x00,0x12,0x00,0x96,0x80,0x3f,0x3c,0x74,0x00,0x00,0x41,0x19, +0xf5,0x20,0x0b,0xa0,0x4b,0x00,0x12,0x00,0x99,0x80,0x42,0x3c,0x06,0x00,0x00,0x41, +0x19,0xf5,0x20,0x0b,0xa0,0x4b,0x00,0x12,0x00,0x8f,0x80,0x44,0x3c,0x14,0x00,0x00, +0x41,0x19,0xf5,0x20,0x0b,0xa0,0x4b,0x00,0x12,0x00,0x93,0x80,0x47,0x3c,0x22,0x00, +0x00,0x41,0x19,0xf5,0x20,0x0b,0xa0,0x4b,0x00,0x12,0x00,0x97,0x80,0x4a,0x3c,0x21, +0x00,0x00,0x41,0x19,0xf5,0x20,0x0b,0xa0,0x4b,0x00,0x12,0x00,0x9a,0x80,0x4e,0x3c, +0x75,0x00,0x00,0x41,0x19,0xf5,0x20,0x0b,0xa0,0x4b,0x00,0x12,0x00,0x90,0x80,0x51, +0x3c,0x69,0x00,0x00,0x41,0x19,0xf5,0x20,0x0b,0xa0,0x4b,0x00,0x12,0x00,0x94,0x80, +0x54,0x3c,0x6f,0x00,0x00,0x41,0x19,0xf5,0x20,0x0b,0xa0,0x4b,0x00,0x12,0x00,0x98, +0x80,0x57,0x3c,0x66,0x00,0x00,0x41,0x19,0xf5,0x20,0x0b,0xa0,0x4b,0x00,0x12,0x00, +0x9b,0x80,0x59,0x3c,0x19,0x00,0x00,0x41,0x19,0xf5,0x20,0x0b,0xa0,0x4b,0x00,0x12, +0x00,0x91,0x80,0x5c,0x3c,0x68,0x00,0x00,0x41,0x19,0xf5,0x20,0x0b,0xa0,0x4b,0x00, +0x12,0x00,0x95,0x80,0x5e,0x3c,0x04,0x00,0x00,0x41,0x19,0xf5,0x20,0x0b,0xa0,0x4b, +0x00,0x12,0x00,0xe9,0x80,0x3b,0x3c,0x5d,0x00,0x00,0x43,0x19,0xf4,0x10,0x0b,0xa0, +0x4c,0x00,0x12,0x00,0xea,0x80,0x3f,0x3c,0x55,0x00,0x00,0x43,0x19,0xf4,0x10,0x0b, +0xa0,0x4c,0x00,0x12,0x00,0xeb,0x80,0x45,0x3c,0x7d,0x00,0x00,0x43,0x19,0xf4,0x10, +0x0b,0xa0,0x4c,0x00,0x12,0x00,0xed,0x80,0x4b,0x3c,0x05,0x00,0x00,0x43,0x19,0xf4, +0x10,0x0b,0xa0,0x4c,0x00,0x12,0x00,0xec,0x80,0x53,0x3c,0x52,0x00,0x00,0x43,0x19, +0xf4,0x10,0x0b,0xa0,0x4c,0x00,0x12,0x00,0xee,0x80,0x59,0x3c,0x5e,0x00,0x00,0x43, +0x19,0xf4,0x10,0x0b,0xa0,0x4c,0x00,0x12,0x00,0xef,0x80,0x61,0x3c,0x4d,0x00,0x00, +0x43,0x19,0xf4,0x10,0x0b,0xa0,0x4c,0x00,0x12,0x00,0xdf,0x80,0x38,0x3c,0x7a,0x00, +0x00,0x31,0x19,0xf0,0x00,0x0a,0xa0,0x4d,0x00,0x12,0x00,0xe1,0x80,0x41,0x3c,0x70, +0x00,0x00,0x31,0x19,0xf0,0x00,0x0a,0xa0,0x4d,0x00,0x12,0x00,0xe2,0x80,0x44,0x3c, +0x7a,0x00,0x00,0x31,0x19,0xf0,0x00,0x0a,0xa0,0x4d,0x00,0x12,0x00,0xe0,0x80,0x49, +0x3c,0x15,0x00,0x00,0x31,0x19,0xf0,0x00,0x0a,0xa0,0x4d,0x00,0x12,0x00,0x42,0x80, +0x49,0x3c,0x4d,0x00,0x00,0x19,0x39,0xf4,0x10,0x0a,0xa0,0x4e,0x00,0x12,0x00,0x44, +0x80,0x4f,0x3c,0x36,0x00,0x00,0x23,0x39,0xf4,0x10,0x0a,0xa0,0x4e,0x00,0x12,0x00, +0x43,0x80,0x55,0x3c,0x4c,0x00,0x00,0x23,0x39,0xf4,0x10,0x0a,0xa0,0x4e,0x00,0x12, +0x00,0x46,0x80,0x5b,0x3c,0x36,0x00,0x00,0x23,0x39,0xf4,0x10,0x0a,0xa0,0x4e,0x00, +0x12,0x00,0x45,0x80,0x61,0x3c,0x4c,0x00,0x00,0x23,0x39,0xf4,0x10,0x0a,0xa0,0x4e, +0x00,0x12,0x00,0x47,0x80,0x67,0x3c,0x36,0x00,0x00,0x19,0x39,0xf4,0x10,0x0a,0xa0, +0x4e,0x00,0x12,0x00,0x3c,0x80,0x44,0x3c,0x2a,0x00,0x00,0x3b,0x31,0xf0,0x00,0x09, +0xa0,0x4f,0x00,0x12,0x00,0x3b,0x80,0x4a,0x3c,0x03,0x00,0x00,0x3b,0x31,0xf0,0x00, +0x09,0xa0,0x4f,0x00,0x12,0x00,0x3d,0x80,0x50,0x3c,0x14,0x00,0x00,0x3b,0x31,0xf0, +0x00,0x09,0xa0,0x4f,0x00,0x13,0x00,0x38,0x80,0x2f,0x3c,0x59,0x00,0x00,0x39,0x31, +0xf0,0x00,0x0b,0xa0,0x50,0x00,0x13,0x00,0x3a,0x80,0x35,0x3c,0x5e,0x00,0x00,0x39, +0x31,0xf0,0x00,0x0b,0xa0,0x50,0x00,0x13,0x00,0x39,0x80,0x3b,0x3c,0x5e,0x00,0x00, +0x39,0x31,0xf0,0x00,0x0b,0xa0,0x50,0x00,0x13,0x00,0x9e,0x80,0x3e,0x3c,0x4c,0x00, +0x00,0x37,0x29,0xf3,0x20,0x0a,0xa0,0x51,0x00,0x13,0x00,0xa0,0x80,0x44,0x3c,0x66, +0x00,0x00,0x37,0x29,0xf3,0x20,0x0a,0xa0,0x51,0x00,0x13,0x00,0x9f,0x80,0x4b,0x3c, +0x64,0x00,0x00,0x37,0x29,0xf3,0x20,0x0a,0xa0,0x51,0x00,0x13,0x00,0xa1,0x80,0x55, +0x3c,0x4d,0x00,0x00,0x37,0x29,0xf3,0x20,0x0a,0xa0,0x51,0x00,0x10,0x00,0x71,0x80, +0x46,0x3c,0x03,0x00,0x00,0x19,0x38,0xf0,0x00,0x0a,0xa2,0x52,0x00,0x10,0x00,0x72, +0x80,0x52,0x3c,0x32,0x00,0x00,0x19,0x38,0xf0,0x00,0x0a,0xa2,0x52,0x00,0x10,0x00, +0x73,0x80,0x5e,0x3c,0x03,0x00,0x00,0x19,0x38,0xf0,0x00,0x0a,0xa2,0x52,0x00,0x10, +0x00,0x74,0x80,0x5c,0x3c,0x65,0x00,0x00,0x19,0x38,0xf0,0x00,0x0a,0xa2,0x52,0x00, +0x10,0x00,0x75,0x80,0x61,0x3c,0x4d,0x00,0x00,0x19,0x38,0xf0,0x00,0x0a,0xa2,0x52, +0x00,0x16,0x00,0x71,0x80,0x46,0x3c,0x03,0x00,0x00,0x23,0x38,0xf0,0x00,0x0a,0xa2, +0x53,0x00,0x16,0x00,0x72,0x80,0x52,0x3c,0x32,0x00,0x00,0x23,0x38,0xf0,0x00,0x0a, +0xa2,0x53,0x00,0x16,0x00,0x73,0x80,0x5e,0x3c,0x03,0x00,0x00,0x19,0x38,0xf0,0x00, +0x0a,0xa2,0x53,0x00,0x10,0x00,0xbd,0x80,0x46,0x3c,0x61,0x00,0x00,0x13,0x30,0x70, +0x00,0x09,0xa1,0x54,0x00,0x10,0x00,0x77,0x80,0x5a,0x3c,0x77,0x00,0x00,0x21,0x38, +0xf0,0x00,0x09,0xa3,0x55,0x00,0x13,0x00,0x77,0x80,0x5a,0x3c,0x77,0x00,0x00,0x37, +0x38,0xf0,0x00,0x09,0xa1,0x56,0x0e,0x10,0x01,0x25,0x81,0x52,0x3c,0x6d,0xfa,0x12, +0x7f,0x00,0xf0,0x00,0x09,0xa0,0x57,0x00,0x10,0x00,0xab,0x80,0x48,0x3c,0x04,0x00, +0x00,0x29,0x30,0xf0,0x00,0x0a,0xa3,0x58,0x00,0x12,0x00,0x76,0x80,0x4f,0x3c,0x44, +0x00,0x00,0x5d,0x28,0x70,0x00,0x09,0xa2,0x59,0x00,0x10,0x00,0xaa,0x80,0x5e,0x3c, +0x03,0xfb,0x01,0x2d,0x2c,0x70,0x00,0x0a,0xa0,0x5a,0x00,0x10,0x00,0xaa,0x80,0x5e, +0x3c,0x03,0x00,0x00,0x31,0x29,0x90,0x00,0x0a,0xa1,0x5b,0x30,0x10,0x00,0xcc,0x90, +0x2b,0x3c,0x3d,0x00,0x00,0x53,0x38,0xc6,0x21,0x09,0xa0,0x5c,0x30,0x10,0x00,0xcd, +0x80,0x37,0x3c,0x41,0x00,0x00,0x53,0x38,0xc6,0x21,0x09,0xa0,0x5c,0x30,0x10,0x00, +0xca,0x80,0x43,0x3c,0x40,0x00,0x00,0x53,0x38,0xc6,0x21,0x09,0xa0,0x5c,0x30,0x10, +0x00,0xcf,0x80,0x4f,0x3c,0x41,0x00,0x00,0x53,0x38,0xc6,0x21,0x09,0xa0,0x5c,0x30, +0x10,0x00,0xce,0x80,0x5b,0x3c,0x40,0x00,0x00,0x53,0x38,0xc6,0x21,0x09,0xa0,0x5c, +0x30,0x10,0x00,0xcb,0x80,0x67,0x3c,0x40,0x00,0x00,0x53,0x38,0xc6,0x21,0x09,0xa0, +0x5c,0xd0,0x10,0x00,0xcc,0x90,0x2b,0x79,0x34,0x00,0x00,0x53,0x08,0xc6,0x21,0x09, +0xa0,0x5d,0xd0,0x10,0x00,0xcd,0x80,0x37,0x79,0x38,0x00,0x00,0x53,0x08,0xc6,0x21, +0x09,0xa0,0x5d,0xd0,0x10,0x00,0xca,0x80,0x43,0x79,0x37,0x00,0x00,0x53,0x08,0xc6, +0x21,0x09,0xa0,0x5d,0xd0,0x10,0x00,0xcf,0x80,0x4f,0x79,0x38,0x00,0x00,0x53,0x08, +0xc6,0x21,0x09,0xa0,0x5d,0xd0,0x10,0x00,0xce,0x80,0x5b,0x79,0x37,0x00,0x00,0x53, +0x08,0xc6,0x21,0x09,0xa0,0x5d,0xd0,0x10,0x00,0xcb,0x80,0x67,0x79,0x37,0x00,0x00, +0x53,0x08,0xc6,0x21,0x09,0xa0,0x5d,0x00,0x10,0x00,0x18,0x81,0x25,0x3c,0x54,0x00, +0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x19,0x81,0x2b,0x3c,0x59, +0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x1a,0x81,0x31,0x3c, +0x52,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x1b,0x81,0x37, +0x3c,0x59,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x1c,0x81, +0x3d,0x3c,0x5f,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x1d, +0x81,0x43,0x3c,0x62,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00, +0x1e,0x81,0x49,0x3c,0x6d,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10, +0x00,0x1f,0x81,0x4f,0x3c,0x62,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00, +0x10,0x00,0x20,0x81,0x54,0x3c,0x09,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e, +0x00,0x10,0x00,0x21,0x81,0x5b,0x3c,0x3b,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0, +0x5e,0x00,0x10,0x00,0x22,0x81,0x61,0x3c,0x52,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a, +0xa0,0x5e,0x00,0x10,0x00,0x23,0x81,0x6d,0x3c,0x52,0x00,0x00,0x37,0x30,0xf2,0x22, +0x0a,0xa0,0x5e,0x00,0x10,0x00,0x18,0x81,0x25,0x3c,0x4a,0x00,0x00,0x37,0x30,0xf2, +0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x19,0x81,0x2b,0x3c,0x4f,0x00,0x00,0x37,0x30, +0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x1a,0x81,0x31,0x3c,0x48,0x00,0x00,0x37, +0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x1b,0x81,0x37,0x3c,0x4f,0x00,0x00, +0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x1c,0x81,0x3d,0x3c,0x55,0x00, +0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x1d,0x81,0x43,0x3c,0x58, +0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x1e,0x81,0x49,0x3c, +0x63,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x1f,0x81,0x4f, +0x3c,0x58,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x20,0x81, +0x55,0x3c,0x7f,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00,0x21, +0x81,0x5b,0x3c,0x31,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10,0x00, +0x22,0x81,0x61,0x3c,0x48,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00,0x10, +0x00,0x23,0x81,0x6d,0x3c,0x48,0x00,0x00,0x37,0x30,0xf2,0x22,0x0a,0xa0,0x5e,0x00, +0x10,0x00,0xaa,0x80,0x5e,0x3c,0x03,0x00,0x00,0x3d,0x28,0x90,0x00,0x0a,0xa2,0x5f, +0x00,0x10,0x00,0x76,0x80,0x4f,0x79,0x44,0x00,0x00,0x49,0x28,0xb0,0x00,0x09,0xa2, +0x60,0x00,0x12,0x00,0x3a,0x71,0x43,0x3c,0x11,0x00,0x00,0x33,0x2a,0xf0,0x00,0x09, +0xa1,0x61,0x00,0x10,0x00,0xfe,0x80,0x4f,0x79,0x0c,0x00,0x00,0x41,0x28,0xf3,0x00, +0x17,0xa0,0x62,0x00,0x12,0x00,0xa5,0x80,0x38,0x3c,0x02,0x00,0x00,0x45,0x33,0xf2, +0x11,0x09,0xa0,0x63,0x00,0x12,0x00,0xa6,0x80,0x42,0x3c,0x79,0x00,0x00,0x45,0x33, +0xf2,0x11,0x09,0xa0,0x63,0x00,0x13,0x00,0x18,0x81,0x25,0x79,0x4a,0x00,0x00,0x5b, +0x2a,0xf2,0x22,0x0e,0xa0,0x64,0x00,0x13,0x00,0x19,0x81,0x2b,0x79,0x4f,0x00,0x00, +0x5b,0x2a,0xf2,0x22,0x0e,0xa0,0x64,0x00,0x13,0x00,0x1a,0x81,0x31,0x79,0x48,0x00, +0x00,0x5b,0x2a,0xf2,0x22,0x0e,0xa0,0x64,0x00,0x13,0x00,0x1b,0x81,0x37,0x79,0x4f, +0x00,0x00,0x5b,0x2a,0xf2,0x22,0x0e,0xa0,0x64,0x00,0x13,0x00,0x1c,0x81,0x3d,0x79, +0x55,0x00,0x00,0x5b,0x2a,0xf2,0x22,0x0e,0xa0,0x64,0x00,0x13,0x00,0x1d,0x81,0x43, +0x79,0x58,0x00,0x00,0x5b,0x2a,0xf2,0x22,0x0e,0xa0,0x64,0x00,0x13,0x00,0x1e,0x81, +0x49,0x79,0x63,0x00,0x00,0x5b,0x2a,0xf2,0x22,0x0e,0xa0,0x64,0x00,0x13,0x00,0x1f, +0x81,0x4f,0x79,0x58,0x00,0x00,0x5b,0x2a,0xf2,0x22,0x0e,0xa0,0x64,0x00,0x13,0x00, +0x20,0x81,0x55,0x79,0x7f,0x00,0x00,0x5b,0x2a,0xf2,0x22,0x0e,0xa0,0x64,0x00,0x13, +0x00,0x21,0x81,0x5b,0x79,0x31,0x00,0x00,0x5b,0x2a,0xf2,0x22,0x0e,0xa0,0x64,0x00, +0x13,0x00,0x22,0x81,0x61,0x79,0x48,0x00,0x00,0x5b,0x2a,0xf2,0x22,0x0e,0xa0,0x64, +0x00,0x13,0x00,0x23,0x81,0x6d,0x79,0x48,0x00,0x00,0x5b,0x2a,0xf2,0x22,0x0e,0xa0, +0x64,0x00,0x10,0x00,0xaa,0x80,0x5e,0x3c,0x0b,0x00,0x00,0x73,0x2e,0x90,0x00,0x0a, +0xa0,0x65,0x00,0x10,0x00,0x2a,0x80,0x51,0x79,0x52,0x00,0x00,0x27,0x29,0xf0,0x05, +0x0a,0xa0,0x66,0x00,0x10,0x00,0x18,0x81,0x2a,0x3c,0x54,0x00,0x00,0x2f,0x32,0xf5, +0x20,0x08,0xa0,0x67,0x00,0x10,0x00,0x19,0x81,0x30,0x3c,0x59,0x00,0x00,0x2f,0x32, +0xf5,0x20,0x08,0xa0,0x67,0x00,0x10,0x00,0x1a,0x81,0x36,0x3c,0x52,0x00,0x00,0x2f, +0x32,0xf5,0x20,0x08,0xa0,0x67,0x00,0x10,0x00,0x1b,0x81,0x3c,0x3c,0x59,0x00,0x00, +0x2f,0x32,0xf5,0x20,0x08,0xa0,0x67,0x00,0x10,0x00,0x1c,0x81,0x42,0x3c,0x5f,0x00, +0x00,0x2f,0x32,0xf5,0x20,0x08,0xa0,0x67,0x00,0x10,0x00,0x1d,0x81,0x48,0x3c,0x62, +0x00,0x00,0x2f,0x32,0xf5,0x20,0x08,0xa0,0x67,0x00,0x10,0x00,0x1e,0x81,0x4e,0x3c, +0x6d,0x00,0x00,0x2f,0x32,0xf5,0x20,0x08,0xa0,0x67,0x00,0x10,0x00,0x1f,0x81,0x54, +0x3c,0x62,0x00,0x00,0x2f,0x32,0xf5,0x20,0x08,0xa0,0x67,0x00,0x10,0x00,0x20,0x81, +0x59,0x3c,0x09,0x00,0x00,0x2f,0x32,0xf5,0x20,0x08,0xa0,0x67,0x00,0x10,0x00,0x21, +0x81,0x60,0x3c,0x3b,0x00,0x00,0x2f,0x32,0xf5,0x20,0x08,0xa0,0x67,0x00,0x10,0x00, +0x22,0x81,0x66,0x3c,0x52,0x00,0x00,0x2f,0x32,0xf5,0x20,0x08,0xa0,0x67,0x00,0x10, +0x00,0x23,0x81,0x72,0x3c,0x52,0x00,0x00,0x2f,0x32,0xf5,0x20,0x08,0xa0,0x67,0x00, +0x10,0x00,0x02,0x90,0x55,0x79,0x57,0x00,0x00,0x47,0x31,0xb3,0x20,0x0b,0xa0,0x68, +0x00,0x10,0x00,0x17,0x81,0x2d,0x3c,0x6d,0x00,0x00,0x43,0x29,0xf1,0x50,0x08,0xa0, +0x69,0x00,0x10,0x00,0x18,0x81,0x25,0x79,0x49,0x00,0x00,0x43,0x2a,0xf2,0x20,0x0a, +0xa0,0x6a,0x00,0x10,0x00,0x19,0x81,0x2b,0x79,0x4e,0x00,0x00,0x43,0x2a,0xf2,0x20, +0x0a,0xa0,0x6a,0x00,0x10,0x00,0x1a,0x81,0x31,0x79,0x47,0x00,0x00,0x43,0x2a,0xf2, +0x20,0x0a,0xa0,0x6a,0x00,0x10,0x00,0x1b,0x81,0x37,0x79,0x4e,0x00,0x00,0x43,0x2a, +0xf2,0x20,0x0a,0xa0,0x6a,0x00,0x10,0x00,0x1c,0x81,0x3d,0x79,0x54,0x00,0x00,0x43, +0x2a,0xf2,0x20,0x0a,0xa0,0x6a,0x00,0x10,0x00,0x1d,0x81,0x43,0x79,0x57,0x00,0x00, +0x43,0x2a,0xf2,0x20,0x0a,0xa0,0x6a,0x00,0x10,0x00,0x1e,0x81,0x49,0x79,0x62,0x00, +0x00,0x43,0x2a,0xf2,0x20,0x0a,0xa0,0x6a,0x00,0x10,0x00,0x1f,0x81,0x4f,0x79,0x57, +0x00,0x00,0x43,0x2a,0xf2,0x20,0x0a,0xa0,0x6a,0x00,0x10,0x00,0x20,0x81,0x55,0x79, +0x7e,0x00,0x00,0x43,0x2a,0xf2,0x20,0x0a,0xa0,0x6a,0x00,0x10,0x00,0x21,0x81,0x5b, +0x79,0x30,0x00,0x00,0x43,0x2a,0xf2,0x20,0x0a,0xa0,0x6a,0x00,0x10,0x00,0x22,0x81, +0x61,0x79,0x47,0x00,0x00,0x43,0x2a,0xf2,0x20,0x0a,0xa0,0x6a,0x00,0x10,0x00,0x23, +0x81,0x6d,0x79,0x47,0x00,0x00,0x43,0x2a,0xf2,0x20,0x0a,0xa0,0x6a,0x00,0x12,0x00, +0x02,0x90,0x55,0x3c,0x55,0x00,0x00,0x5b,0x24,0x80,0x01,0x05,0xa0,0x6b,0x00,0x12, +0x30,0xf3,0x80,0x4b,0x3c,0x5d,0x00,0x00,0x73,0x23,0xa2,0x14,0x06,0xa1,0x6c,0x20, +0x10,0x30,0x4e,0x80,0x43,0x3c,0x7a,0x00,0x00,0x6d,0x2a,0x34,0x23,0x05,0xa2,0x6d, +0xe0,0x10,0x00,0x29,0x80,0x50,0x3c,0x37,0x00,0x00,0x41,0x22,0x31,0x23,0x06,0xa0, +0x6e,0x00,0x15,0x10,0x18,0x81,0x25,0x3c,0x57,0x00,0x00,0x45,0x23,0xf0,0x20,0x07, +0xa1,0x6f,0x00,0x15,0x10,0x19,0x81,0x2b,0x3c,0x5c,0x00,0x00,0x45,0x23,0xf0,0x20, +0x07,0xa1,0x6f,0x00,0x15,0x10,0x1a,0x81,0x31,0x3c,0x55,0x00,0x00,0x45,0x23,0xf0, +0x20,0x07,0xa1,0x6f,0x00,0x15,0x10,0x1b,0x81,0x37,0x3c,0x5c,0x00,0x00,0x45,0x23, +0xf0,0x20,0x07,0xa1,0x6f,0x00,0x15,0x10,0x1c,0x81,0x3d,0x3c,0x62,0x00,0x00,0x45, +0x23,0xf0,0x20,0x07,0xa1,0x6f,0x00,0x15,0x10,0x1d,0x81,0x43,0x3c,0x65,0x00,0x00, +0x45,0x23,0xf0,0x20,0x07,0xa1,0x6f,0x00,0x15,0x10,0x1e,0x81,0x49,0x3c,0x70,0x00, +0x00,0x45,0x23,0xf0,0x20,0x07,0xa1,0x6f,0x00,0x15,0x10,0x1f,0x81,0x4f,0x3c,0x65, +0x00,0x00,0x45,0x23,0xf0,0x20,0x07,0xa1,0x6f,0x00,0x15,0x00,0x20,0x81,0x54,0x3c, +0x0c,0x00,0x00,0x45,0x23,0xf0,0x20,0x07,0xa1,0x6f,0x00,0x15,0x10,0x21,0x81,0x5b, +0x3c,0x3e,0x00,0x00,0x45,0x23,0xf0,0x20,0x07,0xa1,0x6f,0x00,0x15,0x10,0x22,0x81, +0x61,0x3c,0x55,0x00,0x00,0x45,0x23,0xf0,0x20,0x07,0xa1,0x6f,0x00,0x15,0x10,0x23, +0x81,0x6d,0x3c,0x55,0x00,0x00,0x45,0x23,0xf0,0x20,0x07,0xa1,0x6f,0x00,0x12,0x30, +0x24,0x71,0x41,0x3c,0x78,0x00,0x00,0x45,0x22,0xe2,0x21,0x08,0xa0,0x70,0x00,0x10, +0x00,0x18,0x80,0x45,0x3c,0x52,0x00,0x00,0x4f,0x25,0x70,0x00,0x06,0xa0,0x71,0x00, +0x10,0x00,0x19,0x80,0x4a,0x3c,0x52,0x00,0x00,0x4f,0x25,0x70,0x00,0x06,0xa0,0x71, +0x00,0x10,0x00,0x1a,0x80,0x51,0x3c,0x56,0x00,0x00,0x4f,0x25,0x70,0x00,0x06,0xa0, +0x71,0x00,0x10,0x00,0x1b,0x80,0x5b,0x3c,0x55,0x00,0x00,0x4f,0x25,0x70,0x00,0x06, +0xa0,0x71,0x00,0x10,0x00,0x2a,0x80,0x51,0x79,0x5a,0x00,0x00,0x57,0x24,0x65,0x21, +0x06,0xa0,0x72,0xf0,0x10,0x00,0x01,0x81,0x47,0x3c,0x76,0x00,0x00,0x41,0x19,0x44, +0x14,0x16,0xa0,0x73,0x10,0x10,0x00,0xaa,0x80,0x5f,0x79,0x78,0x00,0x00,0x6b,0x19, +0x40,0x00,0x06,0xa0,0x74,0x00,0x10,0x00,0x0c,0x80,0x36,0x3c,0x5f,0x00,0x00,0x51, +0x0a,0x60,0x01,0x06,0xa0,0x75,0x00,0x10,0x00,0x0d,0x80,0x42,0x3c,0x68,0x00,0x00, +0x51,0x0a,0x60,0x01,0x06,0xa0,0x75,0x00,0x10,0x00,0x0e,0x80,0x4a,0x3c,0x61,0x00, +0x00,0x51,0x0a,0x60,0x01,0x06,0xa0,0x75,0x00,0x10,0x00,0x0f,0x80,0x56,0x3c,0x61, +0x00,0x00,0x51,0x0a,0x60,0x01,0x06,0xa0,0x75,0x00,0x10,0x00,0x3f,0x80,0x4b,0x79, +0x40,0x00,0x00,0x59,0x31,0x65,0x12,0x07,0xa0,0x76,0x00,0x10,0x00,0x24,0x71,0x40, +0x3c,0x06,0x00,0x00,0x59,0x1a,0x85,0x23,0x08,0xa0,0x77,0x00,0x10,0x00,0x2a,0x80, +0x51,0x79,0x4f,0x00,0x00,0x3f,0x1b,0xc0,0x05,0x06,0xa0,0x78,0x00,0x10,0x70,0xd3, +0x80,0x25,0x3c,0x4c,0x00,0x00,0x29,0x19,0x33,0x11,0x06,0xa0,0x79,0x00,0x10,0x70, +0xda,0x80,0x2b,0x3c,0x55,0x00,0x00,0x29,0x19,0x33,0x11,0x06,0xa0,0x79,0x00,0x10, +0x70,0xd4,0x80,0x31,0x3c,0x4c,0x00,0x00,0x29,0x19,0x33,0x11,0x06,0xa0,0x79,0x00, +0x10,0x70,0xdb,0x80,0x37,0x3c,0x47,0x00,0x00,0x29,0x19,0x33,0x11,0x06,0xa0,0x79, +0x00,0x10,0x70,0xd5,0x80,0x3d,0x3c,0x60,0x00,0x00,0x29,0x19,0x33,0x11,0x06,0xa0, +0x79,0x00,0x10,0x70,0xdc,0x80,0x43,0x3c,0x4f,0x00,0x00,0x29,0x19,0x33,0x11,0x06, +0xa0,0x79,0x00,0x10,0x70,0xd6,0x80,0x49,0x3c,0x53,0x00,0x00,0x29,0x19,0x33,0x11, +0x06,0xa0,0x79,0x00,0x10,0x70,0xdd,0x80,0x4f,0x3c,0x63,0x00,0x00,0x29,0x19,0x33, +0x11,0x06,0xa0,0x79,0x00,0x10,0x70,0xd7,0x80,0x54,0x3c,0x0a,0x00,0x00,0x29,0x19, +0x33,0x11,0x06,0xa0,0x79,0x00,0x10,0x70,0xde,0x80,0x5b,0x3c,0x3d,0x00,0x00,0x29, +0x19,0x33,0x11,0x06,0xa0,0x79,0x00,0x10,0x70,0xd8,0x80,0x61,0x3c,0x53,0x00,0x00, +0x29,0x19,0x33,0x11,0x06,0xa0,0x79,0x00,0x10,0x70,0xd9,0x80,0x6d,0x3c,0x53,0x00, +0x00,0x29,0x19,0x33,0x11,0x06,0xa0,0x79,0x00,0x10,0x70,0xd3,0x80,0x25,0x3c,0x40, +0x00,0x00,0x29,0x18,0x33,0x11,0x06,0xa0,0x7a,0x00,0x10,0x70,0xda,0x80,0x2b,0x3c, +0x49,0x00,0x00,0x29,0x18,0x33,0x11,0x06,0xa0,0x7a,0x00,0x10,0x70,0xd4,0x80,0x31, +0x3c,0x40,0x00,0x00,0x29,0x18,0x33,0x11,0x06,0xa0,0x7a,0x00,0x10,0x70,0xdb,0x80, +0x37,0x3c,0x3b,0x00,0x00,0x29,0x18,0x33,0x11,0x06,0xa0,0x7a,0x00,0x10,0x70,0xd5, +0x80,0x3d,0x3c,0x54,0x00,0x00,0x29,0x18,0x33,0x11,0x06,0xa0,0x7a,0x00,0x10,0x70, +0xdc,0x80,0x43,0x3c,0x43,0x00,0x00,0x29,0x18,0x33,0x11,0x06,0xa0,0x7a,0x00,0x10, +0x70,0xd6,0x80,0x49,0x3c,0x47,0x00,0x00,0x29,0x18,0x33,0x11,0x06,0xa0,0x7a,0x00, +0x10,0x70,0xdd,0x80,0x4f,0x3c,0x57,0x00,0x00,0x29,0x18,0x33,0x11,0x06,0xa0,0x7a, +0x00,0x10,0x70,0xd7,0x80,0x55,0x3c,0x7e,0x00,0x00,0x29,0x18,0x33,0x11,0x06,0xa0, +0x7a,0x00,0x10,0x70,0xde,0x80,0x5b,0x3c,0x31,0x00,0x00,0x29,0x18,0x33,0x11,0x06, +0xa0,0x7a,0x00,0x10,0x70,0xd8,0x80,0x61,0x3c,0x47,0x00,0x00,0x29,0x18,0x33,0x11, +0x06,0xa0,0x7a,0x00,0x10,0x70,0xd9,0x80,0x6d,0x3c,0x47,0x00,0x00,0x29,0x18,0x33, +0x11,0x06,0xa0,0x7a,0x00,0x10,0x00,0x4e,0x80,0x43,0x3c,0x71,0xfd,0x01,0x33,0x22, +0xa3,0x63,0x17,0xa0,0x7b,0x00,0x10,0x30,0x43,0x61,0x47,0x5b,0x7d,0x2b,0x2a,0x91, +0x2a,0xf0,0x05,0x05,0x20,0x7c,0x00,0x10,0x00,0x02,0x90,0x55,0x3c,0x55,0x00,0x00, +0x49,0x2a,0x60,0x01,0x05,0xa0,0x7d,0x00,0x10,0x30,0xf3,0x70,0x57,0x79,0x48,0x00, +0x00,0x57,0x2d,0x52,0x14,0x06,0xa2,0x7e,0x00,0x10,0x00,0xf3,0x70,0x52,0x3c,0x62, +0x00,0x00,0x47,0x33,0xf6,0x25,0x25,0xa0,0x7f,0x00,0x10,0x00,0x6d,0x80,0x32,0x3c, +0x5e,0x00,0x00,0x53,0x3b,0x85,0x24,0x06,0xa0,0x80,0x00,0x10,0x00,0x6e,0x80,0x3e, +0x3c,0x65,0x00,0x00,0x53,0x3b,0x85,0x24,0x06,0xa0,0x80,0x09,0x10,0x00,0x6f,0x80, +0x4a,0x3c,0x73,0x00,0x00,0x53,0x3b,0x85,0x24,0x06,0xa0,0x80,0x00,0x12,0x00,0x02, +0x90,0x55,0x3c,0x5d,0x00,0x00,0x37,0x32,0x73,0x22,0x06,0xa1,0x81,0x05,0x12,0x00, +0xb3,0x80,0x36,0x79,0x74,0x00,0x00,0x3d,0x32,0xf5,0x34,0x07,0xa2,0x82,0x0c,0x12, +0x00,0xb7,0x80,0x41,0x79,0x7f,0x00,0x00,0x3d,0x32,0xf5,0x34,0x07,0xa2,0x82,0x00, +0x12,0x00,0xb5,0x80,0x48,0x79,0x6d,0x00,0x00,0x3d,0x32,0xf6,0x34,0x07,0xa2,0x82, +0x00,0x12,0x00,0xb4,0x80,0x4e,0x79,0x74,0x00,0x00,0x3d,0x32,0xf6,0x35,0x07,0xa2, +0x82,0x00,0x12,0x00,0xb6,0x80,0x57,0x79,0x63,0x00,0x00,0x3d,0x32,0xf6,0x35,0x17, +0xa2,0x82,0x00,0x10,0x00,0x37,0x91,0x4f,0x3c,0x65,0x00,0x00,0x41,0x2a,0xf5,0x18, +0x08,0xa0,0x83,0x00,0x10,0x00,0x2a,0x80,0x51,0x79,0x59,0x00,0x00,0x37,0x29,0xc0, +0x05,0x05,0xa0,0x84,0xf0,0x10,0x00,0x02,0x90,0x55,0x3c,0x55,0x00,0x00,0x35,0x2a, +0x30,0x00,0x05,0xa0,0x85,0x10,0x10,0x30,0x09,0x70,0x44,0x52,0x52,0xef,0x01,0xc3, +0x0c,0x20,0x00,0x06,0x20,0x86,0x00,0x10,0x00,0x2a,0x80,0x51,0x3c,0x5f,0x00,0x00, +0x51,0x2b,0xf5,0x21,0x06,0xa0,0x87,0x00,0x10,0x00,0x24,0x71,0x41,0x79,0x7b,0x00, +0x00,0x51,0x2b,0x85,0x23,0x07,0xa0,0x88,0x00,0x10,0x30,0x0c,0x80,0x36,0x3c,0x5c, +0x00,0x00,0x01,0x2b,0x90,0x05,0x06,0xa3,0x89,0x00,0x10,0x30,0x0d,0x80,0x42,0x3c, +0x65,0x00,0x00,0x01,0x2b,0x90,0x05,0x06,0xa3,0x89,0x00,0x10,0x30,0x0e,0x80,0x4a, +0x3c,0x5e,0x00,0x00,0x01,0x2b,0x90,0x05,0x06,0xa3,0x89,0x00,0x10,0x30,0x0f,0x80, +0x56,0x3c,0x5e,0x00,0x00,0x01,0x2b,0x90,0x05,0x06,0xa3,0x89,0x00,0x10,0x00,0x02, +0x90,0x55,0x3c,0x52,0x00,0x00,0x01,0x22,0x80,0x01,0x05,0xa0,0x8a,0x00,0x10,0x00, +0x0f,0x81,0x4a,0x3c,0x78,0x00,0x00,0x01,0x32,0xf4,0x15,0x16,0xa1,0x8b,0x00,0x10, +0x00,0x13,0x80,0x40,0x3c,0x75,0x00,0x00,0x23,0x38,0xf0,0x05,0x09,0xa0,0x8c,0x00, +0x10,0x00,0x14,0x80,0x45,0x3c,0x51,0x00,0x00,0x23,0x38,0xf0,0x05,0x09,0xa0,0x8c, +0x00,0x10,0x00,0x12,0x80,0x49,0x3c,0x68,0x00,0x00,0x23,0x38,0xf0,0x05,0x09,0xa0, +0x8c,0x00,0x10,0x00,0x15,0x80,0x50,0x3c,0x66,0x00,0x00,0x23,0x38,0xf0,0x05,0x09, +0xa0,0x8c,0x00,0x10,0x00,0x17,0x80,0x57,0x3c,0x25,0x00,0x00,0x23,0x38,0xf0,0x05, +0x09,0xa0,0x8c,0x00,0x10,0x00,0x16,0x80,0x5f,0x3c,0x20,0x00,0x00,0x23,0x38,0xf0, +0x05,0x09,0xa0,0x8c,0x00,0x10,0x20,0x0e,0x81,0x52,0x3c,0x09,0x00,0x00,0x07,0x28, +0xf7,0x35,0x45,0xa2,0x8d,0x00,0x12,0x00,0xa9,0x80,0x4c,0x3c,0x01,0x00,0x00,0x39, +0x20,0xf0,0x04,0x07,0xa0,0x8e,0x00,0x10,0x00,0x37,0x81,0x4f,0x3c,0x65,0x00,0x00, +0x31,0x38,0xf5,0x18,0x08,0xa0,0x8f,0x00,0x12,0x20,0xa4,0x80,0x30,0x3c,0x43,0x00, +0x00,0x1f,0x1c,0xf0,0x00,0x09,0xa0,0x90,0x00,0x10,0x20,0xa7,0x80,0x30,0x61,0x40, +0x00,0x00,0x1f,0x19,0xf0,0x00,0x09,0xa0,0x91,0x00,0x10,0x20,0xa8,0x80,0x4f,0x61, +0x31,0x00,0x00,0x1f,0x19,0xf0,0x00,0x09,0xa0,0x91,0x00,0x12,0x00,0x05,0x81,0x44, +0x3c,0x66,0x00,0x00,0x35,0x31,0xf3,0x20,0x09,0xa0,0x92,0x00,0x12,0x00,0x02,0x81, +0x47,0x3c,0x52,0x00,0x00,0x35,0x31,0xf3,0x20,0x09,0xa0,0x92,0x00,0x12,0x00,0x06, +0x81,0x4c,0x3c,0x64,0x00,0x00,0x35,0x31,0xf3,0x20,0x09,0xa0,0x92,0x00,0x12,0x00, +0x07,0x81,0x4c,0x3c,0x01,0x00,0x00,0x35,0x31,0xf3,0x20,0x09,0xa0,0x92,0x00,0x12, +0x00,0x08,0x81,0x50,0x3c,0x3c,0x00,0x00,0x35,0x31,0xf3,0x20,0x09,0xa0,0x92,0x00, +0x12,0x00,0x0a,0x81,0x55,0x3c,0x4d,0x00,0x00,0x35,0x31,0xf3,0x20,0x09,0xa0,0x92, +0x00,0x12,0x00,0x0b,0x81,0x57,0x3c,0x64,0x00,0x00,0x35,0x31,0xf3,0x20,0x09,0xa0, +0x92,0x00,0x12,0x00,0x0c,0x81,0x58,0x3c,0x22,0x00,0x00,0x35,0x31,0xf3,0x20,0x09, +0xa0,0x92,0x00,0x12,0x00,0x0d,0x81,0x5b,0x3c,0x36,0x00,0x00,0x35,0x31,0xf3,0x20, +0x09,0xa0,0x92,0x00,0x12,0x00,0x09,0x81,0x5e,0x3c,0x61,0x00,0x00,0x35,0x31,0xf3, +0x20,0x09,0xa0,0x92,0x00,0x13,0x00,0x41,0x90,0x42,0x3c,0x62,0x00,0x00,0x3b,0x31, +0x95,0x20,0x09,0xa0,0x93,0x00,0x10,0x00,0xf3,0x70,0x52,0x3c,0x5d,0x00,0x00,0x37, +0x3b,0xd6,0x25,0x25,0xa0,0x94,0x00,0x10,0x00,0x37,0x91,0x4c,0x6e,0x65,0x00,0x00, +0x99,0x3b,0xf5,0x18,0x08,0xa0,0x95,0x00,0x10,0x00,0x0b,0x80,0x59,0x3c,0x6a,0x00, +0x00,0x2d,0x38,0xf0,0x00,0x09,0xa0,0x96,0x00,0x10,0x00,0xfe,0x80,0x4f,0x3c,0x16, +0x00,0x00,0x35,0x38,0xf3,0x06,0x17,0xa1,0x04,0x00,0x10,0x00,0x00,0xa1,0x39,0x74, +0x42,0x00,0x00,0xab,0x38,0xb0,0x05,0x16,0xa1,0x04,0x07,0x10,0x00,0x2c,0x80,0x55, +0x3c,0x53,0x00,0x00,0x2b,0x00,0xf0,0x00,0x09,0x50,0x04,0x00,0x10,0x10,0x3e,0x50, +0x3f,0x3c,0x6a,0x00,0x00,0x21,0x38,0xf0,0x04,0x04,0x50,0x04,0x00,0x10,0x00,0xc7, +0x80,0x3a,0x3c,0x52,0x00,0x00,0x1b,0x38,0xf0,0x05,0x01,0x50,0x04,0x00,0x10,0x00, +0x26,0x80,0x4e,0x3c,0x7a,0x00,0x00,0x2f,0x38,0xf0,0x04,0x04,0x50,0x04,0x00,0x10, +0x00,0x31,0x80,0x4c,0x3c,0x6a,0x00,0x00,0x01,0x38,0x3a,0xf0,0x09,0x50,0x04,0x00, +0x10,0x00,0x38,0x81,0x43,0x3c,0x52,0x00,0x00,0x5f,0x38,0xf0,0x00,0x09,0xa0,0x04, +0x0e,0x10,0x01,0x25,0x81,0x4b,0x3c,0x6d,0x00,0x00,0x2f,0x38,0xf0,0x00,0x09,0xa0, +0x04,0xe0,0x10,0x00,0x08,0x80,0x55,0x3c,0x55,0x00,0x00,0x01,0x00,0x20,0x03,0x04, +0x20,0x04,0x24,0x10,0x01,0x37,0x80,0x4a,0x3c,0x6a,0x00,0x00,0x01,0x00,0x20,0x04, +0x05,0x20,0x04,0xc0,0x10,0x00,0x09,0x70,0x37,0xba,0x52,0xbf,0x50,0x3d,0x0f,0x22, +0x12,0x07,0x08,0x04,0x40,0x10,0x00,0x09,0x70,0x46,0xbc,0x52,0x0f,0x32,0x51,0x15, +0x72,0x12,0x07,0x08,0x04,0x00,0x10,0x00,0x03,0x80,0x50,0x3c,0x52,0x00,0x00,0x31, +0x00,0xf0,0x00,0x0f,0x10,0x04,0xe0,0x10,0x00,0x01,0x80,0x55,0x3c,0x55,0x00,0x00, +0x1f,0x08,0x30,0x01,0x07,0x10,0x04,0x24,0x10,0x04,0x37,0x80,0x4a,0x3c,0x6a,0x00, +0x00,0x89,0x00,0x30,0x01,0x07,0x10,0x04,0xa0,0x10,0x00,0x36,0x80,0x49,0x3c,0x01, +0xf1,0x02,0x3b,0x0f,0x40,0x01,0x07,0x20,0x04,0x60,0x10,0x00,0x36,0x80,0x4e,0x3e, +0x70,0xf9,0x02,0x39,0x07,0x40,0x01,0x07,0x08,0x04,0x00,0x10,0x10,0x39,0x81,0x56, +0x3c,0x6a,0x00,0x00,0x0f,0x38,0xf0,0x03,0x03,0x20,0x04,0x00,0x15,0x20,0x67,0x80, +0x62,0x3c,0x5b,0x00,0x00,0x01,0x32,0xf4,0x15,0x16,0xa1,0x8b,0x7f,0x7d,0x7c,0x7a, +0x78,0x77,0x75,0x73,0x71,0x70,0x6e,0x6c,0x6b,0x69,0x67,0x66,0x64,0x62,0x60,0x5e, +0x5c,0x5b,0x59,0x57,0x55,0x53,0x51,0x4f,0x4d,0x4c,0x4a,0x48,0x46,0x45,0x44,0x43, +0x42,0x41,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x36,0x34,0x33,0x32,0x31, +0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x22,0x21, +0x20,0x20,0x1f,0x1e,0x1e,0x1d,0x1c,0x1c,0x1b,0x1a,0x1a,0x19,0x18,0x18,0x17,0x17, +0x16,0x15,0x15,0x14,0x13,0x13,0x12,0x11,0x11,0x10,0x0f,0x0f,0x0e,0x0e,0x0d,0x0d, +0x0c,0x0c,0x0b,0x0b,0x0a,0x0a,0x09,0x09,0x09,0x08,0x08,0x07,0x07,0x06,0x06,0x05, +0x05,0x05,0x04,0x04,0x03,0x03,0x02,0x02,0x01,0x01,0x00,0x00,0x7f,0x7e,0x7e,0x7d, +0x7c,0x7c,0x7b,0x7b,0x7a,0x79,0x79,0x78,0x77,0x77,0x76,0x76,0x75,0x74,0x72,0x71, +0x70,0x6f,0x6d,0x6c,0x6b,0x6a,0x68,0x67,0x66,0x65,0x63,0x62,0x61,0x60,0x5e,0x5d, +0x5c,0x5a,0x59,0x58,0x56,0x55,0x54,0x53,0x51,0x50,0x4f,0x4d,0x4c,0x4b,0x49,0x48, +0x47,0x45,0x44,0x43,0x41,0x40,0x3f,0x3e,0x3c,0x3b,0x3a,0x38,0x37,0x36,0x35,0x34, +0x33,0x32,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x28,0x27,0x26, +0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17, +0x17,0x16,0x15,0x14,0x13,0x12,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0d,0x0c,0x0b,0x0a, +0x09,0x08,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x00,0x7f,0x7d,0x7c,0x7a, +0x78,0x77,0x75,0x73,0x71,0x70,0x6e,0x6c,0x6b,0x69,0x67,0x66,0x64,0x62,0x5f,0x5d, +0x5b,0x58,0x56,0x54,0x51,0x4f,0x4d,0x4b,0x48,0x46,0x44,0x41,0x3f,0x3e,0x3d,0x3c, +0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a, +0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x1a,0x19, +0x19,0x18,0x18,0x17,0x16,0x16,0x15,0x15,0x14,0x14,0x13,0x13,0x12,0x11,0x11,0x10, +0x10,0x0f,0x0f,0x0e,0x0d,0x0d,0x0c,0x0c,0x0b,0x0b,0x0a,0x0a,0x09,0x09,0x08,0x08, +0x08,0x08,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x03, +0x03,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x00,0x00,0x7f,0x7e,0x7d,0x7c, +0x7b,0x7a,0x79,0x78,0x77,0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70,0x6f,0x6d,0x6c, +0x6b,0x69,0x68,0x67,0x65,0x64,0x63,0x62,0x60,0x5f,0x5e,0x5c,0x5b,0x59,0x57,0x55, +0x53,0x52,0x50,0x4e,0x4c,0x4a,0x48,0x46,0x44,0x43,0x41,0x3f,0x3d,0x3b,0x39,0x37, +0x35,0x34,0x32,0x30,0x2e,0x2c,0x2a,0x28,0x26,0x25,0x23,0x21,0x1f,0x1e,0x1e,0x1d, +0x1c,0x1c,0x1b,0x1a,0x1a,0x19,0x18,0x18,0x17,0x16,0x16,0x15,0x14,0x14,0x13,0x13, +0x12,0x11,0x11,0x10,0x0f,0x0f,0x0e,0x0d,0x0d,0x0c,0x0b,0x0b,0x0a,0x0a,0x09,0x09, +0x09,0x08,0x08,0x08,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x04,0x04, +0x04,0x03,0x03,0x03,0x02,0x02,0x02,0x01,0x01,0x01,0x00,0x00,0x7f,0x7f,0x7f,0x7f, +0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, +0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, +0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, +0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, +0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, +0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, +0x0b,0x0b,0x0a,0x0a,0x0a,0x09,0x09,0x08,0x08,0x08,0x07,0x07,0x06,0x06,0x05,0x05, +0x05,0x04,0x04,0x03,0x03,0x03,0x02,0x02,0x01,0x01,0x00,0x00,0x7f,0x7d,0x7c,0x7a, +0x78,0x77,0x75,0x74,0x72,0x70,0x6f,0x6d,0x6b,0x6a,0x68,0x67,0x65,0x63,0x61,0x5f, +0x5d,0x5c,0x5a,0x58,0x56,0x54,0x52,0x50,0x4e,0x4d,0x4b,0x49,0x47,0x46,0x45,0x44, +0x43,0x42,0x40,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x35,0x34,0x33,0x32, +0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x23,0x22, +0x21,0x21,0x20,0x1f,0x1f,0x1e,0x1d,0x1d,0x1c,0x1b,0x1b,0x1a,0x19,0x19,0x18,0x18, +0x17,0x16,0x16,0x15,0x15,0x14,0x13,0x13,0x12,0x11,0x11,0x10,0x0f,0x0d,0x0c,0x0c, +0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f, +0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7c,0x79,0x77, +0x74,0x71,0x6e,0x6c,0x69,0x65,0x62,0x5e,0x5b,0x57,0x54,0x50,0x4d,0x4b,0x48,0x46, +0x44,0x42,0x3f,0x3d,0x3b,0x3a,0x39,0x38,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f, +0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x26,0x25,0x24,0x23,0x22,0x21,0x20, +0x1f,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x18,0x17,0x16,0x15,0x14,0x14,0x13, +0x12,0x12,0x11,0x11,0x10,0x0f,0x0f,0x0e,0x0e,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x0b, +0x0b,0x0b,0x0a,0x0a,0x09,0x09,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x06,0x06,0x06, +0x06,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x02,0x02,0x02, +0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x7f,0x7c,0x7a,0x78, +0x76,0x74,0x72,0x70,0x6d,0x6a,0x68,0x65,0x63,0x60,0x5d,0x5b,0x58,0x56,0x53,0x51, +0x4f,0x4d,0x4a,0x48,0x46,0x44,0x43,0x41,0x3f,0x3d,0x3c,0x3a,0x38,0x37,0x36,0x35, +0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2b,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25, +0x23,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1b,0x1b,0x1a,0x19,0x18,0x17,0x17,0x16, +0x15,0x15,0x14,0x14,0x13,0x12,0x12,0x11,0x11,0x10,0x10,0x10,0x0f,0x0e,0x0e,0x0d, +0x0d,0x0d,0x0c,0x0c,0x0b,0x0b,0x0a,0x0a,0x09,0x09,0x08,0x08,0x08,0x07,0x07,0x07, +0x07,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x03,0x03,0x03,0x02, +0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00, +0x14,0x27,0x4c,0x41,0x28,0x2d,0x4c,0x52,0x2e,0x33,0x4c,0x63,0x34,0x39,0x4c,0x74, +0x3a,0x3f,0x4c,0x85,0x40,0x45,0x4c,0x96,0x46,0x4b,0x4c,0xa7,0x4c,0x52,0x4c,0xb8, +0x53,0x58,0x4c,0xc9,0x59,0x6d,0x4c,0xda,0x0a,0x00,0x00,0x00,0x14,0x2d,0x4c,0xeb, +0x2e,0x33,0x4c,0xfc,0x34,0x39,0x4d,0x0d,0x3a,0x3f,0x4d,0x1e,0x40,0x45,0x4d,0x2f, +0x46,0x4b,0x4d,0x40,0x4c,0x52,0x4d,0x51,0x53,0x58,0x4d,0x62,0x59,0x5e,0x4d,0x73, +0x5f,0x6d,0x4d,0x84,0x0b,0x00,0x00,0x00,0x14,0x2d,0x4d,0x95,0x2e,0x33,0x4d,0xa6, +0x34,0x39,0x4d,0xb7,0x3a,0x3f,0x4d,0xc8,0x40,0x45,0x4d,0xd9,0x46,0x4b,0x4d,0xea, +0x4c,0x52,0x4d,0xfb,0x53,0x58,0x4e,0x0c,0x59,0x5e,0x4e,0x1d,0x5f,0x6d,0x4e,0x2e, +0x00,0x7f,0x4e,0x3f,0x14,0x00,0x00,0x00,0x14,0x27,0x4e,0x50,0x28,0x2d,0x4e,0x61, +0x2e,0x33,0x4e,0x72,0x34,0x39,0x4e,0x83,0x3a,0x3f,0x4e,0x94,0x40,0x45,0x4e,0xa5, +0x46,0x4b,0x4e,0xb6,0x4c,0x52,0x4e,0xc7,0x53,0x58,0x4e,0xd8,0x59,0x6d,0x4e,0xe9, +0x14,0x27,0x4e,0xfa,0x28,0x2d,0x4f,0x0b,0x2e,0x33,0x4f,0x1c,0x34,0x39,0x4f,0x2d, +0x3a,0x3f,0x4f,0x3e,0x40,0x45,0x4f,0x4f,0x46,0x4b,0x4f,0x60,0x4c,0x52,0x4f,0x71, +0x53,0x58,0x4f,0x82,0x59,0x6d,0x4f,0x93,0x02,0x00,0x00,0x00,0x00,0x7f,0x4f,0xb5, +0x15,0x6c,0x4f,0xa4,0x14,0x00,0x00,0x00,0x14,0x27,0x4f,0xc6,0x28,0x2d,0x4f,0xd7, +0x2e,0x33,0x4f,0xe8,0x34,0x39,0x4f,0xf9,0x3a,0x3f,0x50,0x0a,0x40,0x45,0x50,0x1b, +0x46,0x4b,0x50,0x2c,0x4c,0x52,0x50,0x3d,0x53,0x58,0x50,0x4e,0x59,0x6d,0x50,0x5f, +0x14,0x2d,0x50,0x70,0x2e,0x33,0x50,0x81,0x34,0x39,0x50,0x92,0x3a,0x3f,0x50,0xa3, +0x40,0x45,0x50,0xb4,0x46,0x4b,0x50,0xc5,0x4c,0x52,0x50,0xd6,0x53,0x58,0x50,0xe7, +0x59,0x5e,0x50,0xf8,0x5f,0x6d,0x51,0x09,0x05,0x00,0x00,0x00,0x15,0x39,0x51,0x1a, +0x3a,0x3f,0x51,0x2b,0x40,0x45,0x51,0x3c,0x46,0x4d,0x51,0x4d,0x4e,0x6c,0x51,0x5e, +0x02,0x00,0x00,0x00,0x15,0x51,0x51,0x6f,0x52,0x6c,0x51,0x80,0x01,0x00,0x00,0x00, +0x15,0x6c,0x51,0x91,0x01,0x00,0x00,0x00,0x15,0x6c,0x51,0xa2,0x02,0x00,0x00,0x00, +0x15,0x6c,0x51,0xb3,0x15,0x6c,0x51,0xc4,0x01,0x00,0x00,0x00,0x15,0x6c,0x51,0xd5, +0x04,0x00,0x00,0x00,0x15,0x3f,0x51,0xe6,0x40,0x4c,0x51,0xf7,0x4d,0x5a,0x52,0x08, +0x5b,0x7f,0x52,0x19,0x01,0x00,0x00,0x00,0x00,0x7f,0x52,0x2a,0x01,0x00,0x00,0x00, +0x01,0x7f,0x52,0x3b,0x02,0x00,0x00,0x00,0x00,0x7f,0x52,0x4c,0x00,0x7f,0x52,0x5d, +0x01,0x00,0x00,0x00,0x01,0x7f,0x52,0x6e,0x02,0x00,0x00,0x00,0x15,0x3b,0x52,0x7f, +0x3c,0x6c,0x52,0x90,0x05,0x00,0x00,0x00,0x15,0x30,0x52,0xa1,0x31,0x3c,0x52,0xb2, +0x3d,0x48,0x52,0xc3,0x49,0x54,0x52,0xd4,0x55,0x6c,0x52,0xe5,0x05,0x00,0x00,0x00, +0x15,0x29,0x52,0xf6,0x2a,0x30,0x53,0x07,0x31,0x38,0x53,0x18,0x39,0x41,0x53,0x29, +0x42,0x6c,0x53,0x3a,0x02,0x00,0x00,0x00,0x00,0x53,0x53,0x4b,0x54,0x7f,0x53,0x5c, +0x03,0x00,0x00,0x00,0x15,0x4c,0x53,0x6d,0x4d,0x6c,0x53,0x7e,0x15,0x6c,0x53,0x8f, +0x01,0x00,0x00,0x00,0x15,0x6c,0x53,0xa0,0x03,0x00,0x00,0x00,0x00,0x53,0x53,0xb1, +0x54,0x7f,0x53,0xc2,0x15,0x6c,0x53,0xd3,0x05,0x00,0x00,0x00,0x15,0x2f,0x53,0xe4, +0x30,0x36,0x53,0xf5,0x37,0x3c,0x54,0x06,0x3d,0x43,0x54,0x17,0x44,0x60,0x54,0x28, +0x04,0x00,0x00,0x00,0x15,0x31,0x54,0x39,0x32,0x38,0x54,0x4a,0x39,0x47,0x54,0x5b, +0x48,0x6c,0x54,0x6c,0x03,0x00,0x00,0x00,0x15,0x31,0x54,0x7d,0x32,0x3f,0x54,0x8e, +0x40,0x6c,0x54,0x9f,0x08,0x00,0x00,0x00,0x15,0x2c,0x54,0xb0,0x2d,0x31,0x54,0xc1, +0x32,0x38,0x54,0xd2,0x39,0x3f,0x54,0xe3,0x40,0x44,0x54,0xf4,0x45,0x4b,0x55,0x05, +0x4c,0x54,0x55,0x16,0x55,0x6c,0x55,0x27,0x01,0x00,0x00,0x00,0x01,0x7f,0x55,0x38, +0x02,0x00,0x00,0x00,0x00,0x40,0x55,0x49,0x41,0x7f,0x55,0x5a,0x09,0x00,0x00,0x00, +0x15,0x2a,0x55,0x6b,0x2b,0x2e,0x55,0x7c,0x2f,0x32,0x55,0x8d,0x33,0x36,0x55,0x9e, +0x37,0x3a,0x55,0xaf,0x3b,0x3e,0x55,0xc0,0x3f,0x42,0x55,0xd1,0x43,0x46,0x55,0xe2, +0x47,0x6c,0x55,0xf3,0x03,0x00,0x00,0x00,0x15,0x44,0x56,0x04,0x45,0x49,0x56,0x15, +0x4a,0x6c,0x56,0x26,0x02,0x00,0x00,0x00,0x15,0x30,0x56,0x37,0x31,0x6c,0x56,0x48, +0x04,0x00,0x00,0x00,0x01,0x20,0x56,0x59,0x21,0x25,0x56,0x6a,0x26,0x2a,0x56,0x7b, +0x2b,0x7f,0x56,0x8c,0x05,0x00,0x00,0x00,0x15,0x23,0x56,0x9d,0x24,0x2a,0x56,0xae, +0x2b,0x2f,0x56,0xbf,0x30,0x47,0x56,0xd0,0x48,0x6c,0x56,0xe1,0x01,0x00,0x00,0x00, +0x01,0x7f,0x56,0xf2,0x01,0x00,0x00,0x00,0x15,0x6c,0x57,0x03,0x01,0x00,0x00,0x00, +0x01,0x7f,0x57,0x14,0x01,0x00,0x00,0x00,0x15,0x6c,0x57,0x25,0x01,0x00,0x00,0x00, +0x00,0x7f,0x57,0x36,0x0a,0x00,0x00,0x00,0x15,0x3a,0x57,0x47,0x3b,0x3f,0x57,0x58, +0x40,0x41,0x57,0x69,0x42,0x44,0x57,0x7a,0x45,0x47,0x57,0x8b,0x48,0x4a,0x57,0x9c, +0x4b,0x4c,0x57,0xad,0x4d,0x4e,0x57,0xbe,0x4f,0x51,0x57,0xcf,0x52,0x6c,0x57,0xe0, +0x0c,0x00,0x00,0x00,0x15,0x32,0x57,0xf1,0x33,0x35,0x58,0x02,0x36,0x38,0x58,0x13, +0x39,0x3d,0x58,0x24,0x3e,0x3f,0x58,0x35,0x40,0x42,0x58,0x46,0x43,0x45,0x58,0x57, +0x46,0x48,0x58,0x68,0x49,0x4a,0x58,0x79,0x4b,0x4c,0x58,0x8a,0x4d,0x4f,0x58,0x9b, +0x50,0x6c,0x58,0xac,0x05,0x00,0x00,0x00,0x15,0x2d,0x58,0xbd,0x2e,0x37,0x58,0xce, +0x38,0x3e,0x58,0xdf,0x3f,0x44,0x58,0xf0,0x45,0x6c,0x59,0x01,0x02,0x00,0x00,0x00, +0x15,0x29,0x59,0x12,0x2a,0x6c,0x59,0x23,0x05,0x00,0x00,0x00,0x15,0x3b,0x59,0x34, +0x3c,0x41,0x59,0x45,0x42,0x47,0x59,0x56,0x48,0x52,0x59,0x67,0x53,0x6c,0x59,0x78, +0x05,0x00,0x00,0x00,0x15,0x32,0x59,0x89,0x33,0x3b,0x59,0x9a,0x3c,0x42,0x59,0xab, +0x43,0x48,0x59,0xbc,0x49,0x6c,0x59,0xcd,0x02,0x00,0x00,0x00,0x15,0x46,0x59,0xde, +0x47,0x6c,0x59,0xef,0x01,0x00,0x00,0x00,0x15,0x6c,0x5a,0x00,0x05,0x00,0x00,0x00, +0x15,0x3b,0x5a,0x11,0x3c,0x41,0x5a,0x22,0x42,0x47,0x5a,0x33,0x48,0x52,0x5a,0x44, +0x53,0x6c,0x5a,0x55,0x05,0x00,0x00,0x00,0x15,0x3b,0x5a,0x66,0x3c,0x41,0x5a,0x77, +0x42,0x47,0x5a,0x88,0x48,0x52,0x5a,0x99,0x53,0x6c,0x5a,0xaa,0x02,0x00,0x00,0x00, +0x05,0x71,0x5a,0xbb,0x15,0x6c,0x5a,0xcc,0x02,0x00,0x00,0x00,0x15,0x6c,0x5a,0xdd, +0x15,0x6c,0x5a,0xee,0x04,0x00,0x00,0x00,0x15,0x3a,0x5a,0xff,0x3b,0x40,0x5b,0x10, +0x41,0x47,0x5b,0x21,0x48,0x6c,0x5b,0x32,0x01,0x00,0x00,0x00,0x15,0x6c,0x5b,0x43, +0x01,0x00,0x00,0x00,0x15,0x6c,0x5b,0x54,0x01,0x00,0x00,0x00,0x15,0x6c,0x5b,0x65, +0x06,0x00,0x00,0x00,0x15,0x3c,0x5b,0x76,0x3d,0x43,0x5b,0x87,0x44,0x48,0x5b,0x98, +0x49,0x4e,0x5b,0xa9,0x4f,0x55,0x5b,0xba,0x56,0x6c,0x5b,0xcb,0x03,0x00,0x00,0x00, +0x15,0x3a,0x5b,0xdc,0x3b,0x3f,0x5b,0xed,0x40,0x6c,0x5b,0xfe,0x02,0x00,0x00,0x00, +0x15,0x2d,0x5c,0x0f,0x2e,0x6c,0x5c,0x20,0x02,0x00,0x00,0x00,0x15,0x45,0x5c,0x31, +0x46,0x6c,0x5c,0x42,0x02,0x00,0x00,0x00,0x15,0x49,0x5c,0x53,0x4a,0x6c,0x5c,0x64, +0x02,0x00,0x00,0x00,0x15,0x42,0x5c,0x75,0x43,0x6c,0x5c,0x86,0x18,0x00,0x00,0x00, +0x01,0x27,0x5c,0x97,0x28,0x2d,0x5c,0xa8,0x2e,0x33,0x5c,0xb9,0x34,0x39,0x5c,0xca, +0x3a,0x3f,0x5c,0xdb,0x40,0x45,0x5c,0xec,0x46,0x4b,0x5c,0xfd,0x4c,0x51,0x5d,0x0e, +0x52,0x57,0x5d,0x1f,0x58,0x5d,0x5d,0x30,0x5e,0x63,0x5d,0x41,0x64,0x7f,0x5d,0x52, +0x01,0x27,0x5d,0x63,0x28,0x2d,0x5d,0x74,0x2e,0x33,0x5d,0x85,0x34,0x39,0x5d,0x96, +0x3a,0x3f,0x5d,0xa7,0x40,0x45,0x5d,0xb8,0x46,0x4b,0x5d,0xc9,0x4c,0x51,0x5d,0xda, +0x52,0x57,0x5d,0xeb,0x58,0x5d,0x5d,0xfc,0x5e,0x64,0x5e,0x0d,0x65,0x7f,0x5e,0x1e, +0x0d,0x00,0x00,0x00,0x01,0x27,0x5e,0x2f,0x28,0x2d,0x5e,0x40,0x2e,0x33,0x5e,0x51, +0x34,0x39,0x5e,0x62,0x3a,0x3f,0x5e,0x73,0x40,0x45,0x5e,0x84,0x46,0x4b,0x5e,0x95, +0x4c,0x51,0x5e,0xa6,0x52,0x57,0x5e,0xb7,0x58,0x5d,0x5e,0xc8,0x5e,0x64,0x5e,0xd9, +0x65,0x7f,0x5e,0xea,0x00,0x7f,0x5e,0xfb,0x06,0x00,0x00,0x00,0x15,0x3f,0x5f,0x0c, +0x40,0x45,0x5f,0x1d,0x46,0x4b,0x5f,0x2e,0x4c,0x51,0x5f,0x3f,0x52,0x59,0x5f,0x50, +0x59,0x6c,0x5f,0x61,0x0d,0x00,0x00,0x00,0x15,0x32,0x5f,0x72,0x33,0x35,0x5f,0x83, +0x36,0x3a,0x5f,0x94,0x3b,0x3b,0x5f,0xa5,0x3c,0x3e,0x5f,0xb6,0x3f,0x41,0x5f,0xc7, +0x42,0x44,0x5f,0xd8,0x45,0x47,0x5f,0xe9,0x48,0x4a,0x5f,0xfa,0x4b,0x4d,0x60,0x0b, +0x4e,0x50,0x60,0x1c,0x51,0x53,0x60,0x2d,0x54,0x6c,0x60,0x3e,0x07,0x00,0x00,0x00, +0x24,0x30,0x60,0x4f,0x31,0x34,0x60,0x60,0x35,0x3a,0x60,0x71,0x3b,0x41,0x60,0x82, +0x42,0x47,0x60,0x93,0x48,0x51,0x60,0xa4,0x52,0x6c,0x60,0xb5,0x04,0x00,0x00,0x00, +0x15,0x2d,0x60,0xc6,0x2e,0x34,0x60,0xd7,0x35,0x39,0x60,0xe8,0x3a,0x6c,0x60,0xf9, +0x06,0x00,0x00,0x00,0x15,0x3c,0x61,0x0a,0x3d,0x43,0x61,0x1b,0x44,0x49,0x61,0x2c, +0x4a,0x4f,0x61,0x3d,0x50,0x55,0x61,0x4e,0x56,0x6c,0x61,0x5f,0x03,0x00,0x00,0x00, +0x15,0x38,0x61,0x70,0x39,0x3e,0x61,0x81,0x3f,0x6c,0x61,0x92,0x03,0x00,0x00,0x00, +0x15,0x22,0x61,0xa3,0x23,0x2e,0x61,0xb4,0x2f,0x6c,0x61,0xc5,0x04,0x00,0x00,0x00, +0x15,0x3b,0x61,0xd6,0x3c,0x41,0x61,0xe7,0x42,0x4a,0x61,0xf8,0x4b,0x6c,0x62,0x09, +0x05,0x00,0x00,0x00,0x15,0x40,0x62,0x1a,0x41,0x4d,0x62,0x2b,0x4e,0x53,0x62,0x3c, +0x54,0x5f,0x62,0x4d,0x60,0x6c,0x62,0x5e,0x03,0x00,0x00,0x00,0x15,0x40,0x62,0x6f, +0x41,0x4d,0x62,0x80,0x4e,0x6c,0x62,0x91,0x01,0x00,0x00,0x00,0x15,0x6f,0x62,0xa2, +0x01,0x00,0x00,0x00,0x15,0x6c,0x62,0xb3,0x02,0x00,0x00,0x00,0x15,0x6c,0x62,0xc4, +0x01,0x7f,0x62,0xd5,0x02,0x00,0x00,0x00,0x00,0x7f,0x62,0xe6,0x15,0x6c,0x62,0xf7, +0x01,0x00,0x00,0x00,0x00,0x7f,0x63,0x08,0x01,0x00,0x00,0x00,0x00,0x7f,0x63,0x19, +0x0c,0x00,0x00,0x00,0x01,0x2a,0x63,0x2a,0x2b,0x36,0x63,0x3b,0x37,0x42,0x63,0x4c, +0x43,0x4e,0x63,0x5d,0x4f,0x5a,0x63,0x6e,0x5b,0x7f,0x63,0x7f,0x01,0x2a,0x63,0x90, +0x2b,0x36,0x63,0xa1,0x37,0x42,0x63,0xb2,0x43,0x4e,0x63,0xc3,0x4f,0x5a,0x63,0xd4, +0x5b,0x7f,0x63,0xe5,0x18,0x00,0x00,0x00,0x01,0x27,0x63,0xf6,0x28,0x2d,0x64,0x07, +0x2e,0x33,0x64,0x18,0x34,0x39,0x64,0x29,0x3a,0x3f,0x64,0x3a,0x40,0x45,0x64,0x4b, +0x46,0x4b,0x64,0x5c,0x4c,0x51,0x64,0x6d,0x52,0x57,0x64,0x7e,0x58,0x5d,0x64,0x8f, +0x5e,0x66,0x64,0xa0,0x67,0x7f,0x64,0xb1,0x01,0x27,0x64,0xc2,0x28,0x2d,0x64,0xd3, +0x2e,0x33,0x64,0xe4,0x34,0x39,0x64,0xf5,0x3a,0x3f,0x65,0x06,0x40,0x45,0x65,0x17, +0x46,0x4b,0x65,0x28,0x4c,0x51,0x65,0x39,0x52,0x57,0x65,0x4a,0x58,0x5d,0x65,0x5b, +0x5e,0x66,0x65,0x6c,0x67,0x7f,0x65,0x7d,0x02,0x00,0x00,0x00,0x00,0x7f,0x65,0x8e, +0x15,0x6c,0x65,0x9f,0x02,0x00,0x00,0x00,0x00,0x7f,0x65,0xb0,0x01,0x7f,0x65,0xc1, +0x0e,0x00,0x00,0x00,0x00,0x40,0x65,0xd2,0x41,0x7f,0x65,0xe3,0x01,0x27,0x65,0xf4, +0x28,0x2d,0x66,0x05,0x2e,0x33,0x66,0x16,0x34,0x39,0x66,0x27,0x3a,0x3f,0x66,0x38, +0x40,0x45,0x66,0x49,0x46,0x4b,0x66,0x5a,0x4c,0x51,0x66,0x6b,0x52,0x57,0x66,0x7c, +0x58,0x5d,0x66,0x8d,0x5e,0x66,0x66,0x9e,0x67,0x7f,0x66,0xaf,0x02,0x00,0x00,0x00, +0x00,0x7f,0x66,0xc0,0x15,0x6c,0x66,0xd1,0x0d,0x00,0x00,0x00,0x01,0x27,0x66,0xe2, +0x28,0x2d,0x66,0xf3,0x2e,0x33,0x67,0x04,0x34,0x39,0x67,0x15,0x3a,0x3f,0x67,0x26, +0x40,0x45,0x67,0x37,0x46,0x4b,0x67,0x48,0x4c,0x51,0x67,0x59,0x52,0x57,0x67,0x6a, +0x58,0x5d,0x67,0x7b,0x5e,0x64,0x67,0x8c,0x65,0x7f,0x67,0x9d,0x05,0x71,0x67,0xae, +0x0d,0x00,0x00,0x00,0x00,0x7f,0x67,0xbf,0x01,0x27,0x67,0xd0,0x28,0x2d,0x67,0xe1, +0x2e,0x33,0x67,0xf2,0x34,0x39,0x68,0x03,0x3a,0x3f,0x68,0x14,0x40,0x45,0x68,0x25, +0x46,0x4b,0x68,0x36,0x4c,0x51,0x68,0x47,0x52,0x57,0x68,0x58,0x58,0x5d,0x68,0x69, +0x5e,0x66,0x68,0x7a,0x67,0x7f,0x68,0x8b,0x02,0x00,0x00,0x00,0x15,0x6c,0x68,0x9c, +0x15,0x6c,0x68,0xad,0x02,0x00,0x00,0x00,0x15,0x6c,0x68,0xbe,0x15,0x6c,0x68,0xcf, +0x0d,0x00,0x00,0x00,0x01,0x27,0x68,0xe0,0x28,0x2d,0x68,0xf1,0x2e,0x33,0x69,0x02, +0x34,0x39,0x69,0x13,0x3a,0x3f,0x69,0x24,0x40,0x45,0x69,0x35,0x46,0x4b,0x69,0x46, +0x4c,0x51,0x69,0x57,0x52,0x57,0x69,0x68,0x58,0x5d,0x69,0x79,0x5e,0x66,0x69,0x8a, +0x67,0x7f,0x69,0x9b,0x00,0x7f,0x69,0xac,0x05,0x00,0x00,0x00,0x15,0x3a,0x69,0xbd, +0x3b,0x40,0x69,0xce,0x41,0x47,0x69,0xdf,0x48,0x6c,0x69,0xf0,0x15,0x6c,0x6a,0x01, +0x02,0x00,0x00,0x00,0x15,0x6c,0x6a,0x12,0x00,0x7f,0x6a,0x23,0x05,0x00,0x00,0x00, +0x15,0x31,0x6a,0x34,0x32,0x38,0x6a,0x45,0x39,0x47,0x6a,0x56,0x48,0x6c,0x6a,0x67, +0x00,0x7f,0x6a,0x78,0x02,0x00,0x00,0x00,0x00,0x7f,0x6a,0x89,0x15,0x6c,0x6a,0x9a, +0x18,0x00,0x00,0x00,0x01,0x27,0x6a,0xab,0x28,0x2d,0x6a,0xbc,0x2e,0x33,0x6a,0xcd, +0x34,0x39,0x6a,0xde,0x3a,0x3f,0x6a,0xef,0x40,0x45,0x6b,0x00,0x46,0x4b,0x6b,0x11, +0x4c,0x51,0x6b,0x22,0x52,0x57,0x6b,0x33,0x58,0x5d,0x6b,0x44,0x5e,0x63,0x6b,0x55, +0x64,0x7f,0x6b,0x66,0x01,0x27,0x6b,0x77,0x28,0x2d,0x6b,0x88,0x2e,0x33,0x6b,0x99, +0x34,0x39,0x6b,0xaa,0x3a,0x3f,0x6b,0xbb,0x40,0x45,0x6b,0xcc,0x46,0x4b,0x6b,0xdd, +0x4c,0x51,0x6b,0xee,0x52,0x57,0x6b,0xff,0x58,0x5d,0x6c,0x10,0x5e,0x63,0x6c,0x21, +0x64,0x7f,0x6c,0x32,0x02,0x00,0x00,0x00,0x01,0x7f,0x6c,0x43,0x00,0x7f,0x6c,0x54, +0x02,0x00,0x00,0x00,0x15,0x6c,0x6c,0x65,0x15,0x6c,0x6c,0x76,0x04,0x00,0x00,0x00, +0x15,0x6c,0x6c,0x87,0x15,0x2c,0x6c,0x98,0x2d,0x36,0x6c,0xa9,0x37,0x6c,0x6c,0xba, +0x06,0x00,0x00,0x00,0x05,0x71,0x6c,0xcb,0x15,0x2f,0x6c,0xdc,0x30,0x36,0x6c,0xed, +0x37,0x3c,0x6c,0xfe,0x3d,0x43,0x6d,0x0f,0x44,0x60,0x6d,0x20,0x02,0x00,0x00,0x00, +0x00,0x7f,0x6d,0x31,0x15,0x6c,0x6d,0x42,0x02,0x00,0x00,0x00,0x15,0x6c,0x6d,0x53, +0x15,0x6c,0x6d,0x64,0x02,0x00,0x00,0x00,0x15,0x6c,0x6d,0x75,0x00,0x7f,0x6d,0x86, +0x05,0x00,0x00,0x00,0x15,0x31,0x6d,0x97,0x32,0x38,0x6d,0xa8,0x39,0x47,0x6d,0xb9, +0x48,0x6c,0x6d,0xca,0x15,0x6c,0x6d,0xdb,0x02,0x00,0x00,0x00,0x00,0x83,0x6d,0xec, +0x84,0x7f,0x70,0xfa,0x06,0x00,0x00,0x00,0x15,0x34,0x6d,0xfd,0x35,0x38,0x6e,0x0e, +0x39,0x3c,0x6e,0x1f,0x3d,0x44,0x6e,0x30,0x45,0x4c,0x6e,0x41,0x4d,0x6d,0x6e,0x52, +0x01,0x00,0x00,0x00,0x15,0x6c,0x6e,0x63,0x01,0x00,0x00,0x00,0x00,0x7f,0x6e,0x74, +0x01,0x00,0x00,0x00,0x00,0x7f,0x6e,0x85,0x03,0x00,0x00,0x00,0x15,0x39,0x6e,0x96, +0x15,0x39,0x6e,0xa7,0x3a,0x6c,0x6e,0xb8,0x0a,0x00,0x00,0x00,0x15,0x3a,0x6e,0xc9, +0x3b,0x3f,0x6e,0xda,0x40,0x41,0x6e,0xeb,0x42,0x44,0x6e,0xfc,0x45,0x47,0x6f,0x0d, +0x48,0x4a,0x6f,0x1e,0x4b,0x4c,0x6f,0x2f,0x4d,0x4e,0x6f,0x40,0x4f,0x51,0x6f,0x51, +0x52,0x6c,0x6f,0x62,0x01,0x00,0x00,0x00,0x15,0x6c,0x6f,0x73,0x02,0x00,0x00,0x00, +0x15,0x6c,0x6f,0x84,0x00,0x7f,0x6f,0x95,0x01,0x00,0x00,0x00,0x15,0x6c,0x6f,0xa6, +0x02,0x00,0x00,0x00,0x01,0x7f,0x6f,0xb7,0x15,0x6c,0x6f,0xc8,0x01,0x00,0x00,0x00, +0x15,0x6c,0x6f,0xd9,0x01,0x00,0x00,0x00,0x13,0x6c,0x6f,0xea,0x01,0x00,0x00,0x00, +0x15,0x6c,0x6f,0xfb,0x01,0x00,0x00,0x00,0x15,0x6c,0x70,0x0c,0x01,0x00,0x00,0x00, +0x15,0x6c,0x70,0x1d,0x01,0x00,0x00,0x00,0x15,0x6c,0x70,0x2e,0x01,0x00,0x00,0x00, +0x01,0x7f,0x70,0x3f,0x02,0x00,0x00,0x00,0x15,0x6c,0x70,0x50,0x01,0x7f,0x70,0x61, +0x02,0x00,0x00,0x00,0x15,0x6c,0x70,0x72,0x15,0x6c,0x70,0x83,0x01,0x00,0x00,0x00, +0x15,0x6c,0x70,0x94,0x02,0x00,0x00,0x00,0x0c,0x7f,0x70,0xa5,0x01,0x7f,0x70,0xb6, +0x02,0x00,0x00,0x00,0x15,0x6c,0x70,0xc7,0x15,0x6c,0x70,0xd8,0x01,0x00,0x00,0x00, +0x15,0x6c,0x70,0xe9,0x75,0x0b,0x75,0x37,0x75,0x63,0x75,0x93,0x75,0xe7,0x75,0xf3, +0x76,0x47,0x76,0x5f,0x76,0x6b,0x76,0x73,0x76,0x7b,0x76,0x87,0x76,0x8f,0x76,0xa3, +0x76,0xab,0x76,0xb3,0x76,0xbf,0x76,0xc7,0x76,0xd3,0x76,0xeb,0x77,0x03,0x77,0x0f, +0x77,0x1f,0x77,0x27,0x77,0x37,0x77,0x4f,0x77,0x63,0x77,0x73,0x77,0x97,0x77,0x9f, +0x77,0xab,0x77,0xd3,0x77,0xe3,0x77,0xef,0x78,0x03,0x78,0x1b,0x78,0x23,0x78,0x2b, +0x78,0x33,0x78,0x3b,0x78,0x43,0x78,0x6f,0x78,0xa3,0x78,0xbb,0x78,0xc7,0x78,0xdf, +0x78,0xf7,0x79,0x03,0x79,0x0b,0x79,0x23,0x79,0x3b,0x79,0x47,0x79,0x53,0x79,0x67, +0x79,0x6f,0x79,0x77,0x79,0x7f,0x79,0x9b,0x79,0xab,0x79,0xb7,0x79,0xc3,0x79,0xcf, +0x79,0xdb,0x7a,0x3f,0x7a,0x77,0x7a,0x93,0x7a,0xcb,0x7a,0xeb,0x7a,0xff,0x7b,0x1b, +0x7b,0x2b,0x7b,0x3b,0x7b,0x4f,0x7b,0x67,0x7b,0x77,0x7b,0x7f,0x7b,0x87,0x7b,0x93, +0x7b,0x9f,0x7b,0xa7,0x7b,0xaf,0x7b,0xe3,0x7c,0x47,0x7c,0x53,0x7c,0x5f,0x7c,0x9b, +0x7c,0xa7,0x7c,0xdf,0x7d,0x17,0x7d,0x23,0x7d,0x2f,0x7d,0x67,0x7d,0x7f,0x7d,0x8b, +0x7d,0xa3,0x7d,0xaf,0x7e,0x13,0x7e,0x1f,0x7e,0x2b,0x7e,0x3f,0x7e,0x5b,0x7e,0x67, +0x7e,0x73,0x7e,0x7f,0x7e,0x97,0x7e,0xa3,0x7e,0xbf,0x7e,0xc7,0x7e,0xcf,0x7e,0xd7, +0x7e,0xe7,0x7f,0x13,0x7f,0x1b,0x7f,0x27,0x7f,0x2f,0x7f,0x3b,0x7f,0x43,0x7f,0x4b, +0x7f,0x53,0x7f,0x5b,0x7f,0x63,0x7f,0x6b,0x7f,0x73,0x7f,0x7f,0x7f,0x8b,0x7f,0x93, +0x7f,0x9f,0x7f,0xab,0x71,0x0b,0x71,0x8b,0x72,0x0b,0x72,0x8b,0x73,0x0b,0x73,0x8b, +0x74,0x0b,0x74,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2f,0x40,0x4d,0x5c, +0x80,0x80,0x79,0x73,0x30,0x3c,0x54,0x60,0x6c,0x80,0x76,0x6c,0x40,0x40,0x40,0x69, +0x80,0x80,0x80,0x39,0x40,0x40,0x40,0x69,0x80,0x80,0x80,0x4f,0x18,0x1a,0x3c,0x54, +0x6b,0x76,0x76,0x76,0x1d,0x35,0x48,0x53,0x73,0x80,0x80,0x73,0x40,0x40,0x4c,0x5c, +0x80,0x80,0x7d,0x69,0x40,0x40,0x57,0x6c,0x80,0x80,0x6f,0x4f,0x40,0x40,0x4a,0x6b, +0x80,0x80,0x7b,0x61,0x1c,0x40,0x5a,0x6b,0x61,0x80,0x65,0x38,0x28,0x40,0x58,0x70, +0x67,0x75,0x81,0x79,0x18,0x24,0x3c,0x54,0x8a,0x6e,0x82,0x7d,0x1c,0x32,0x40,0x65, +0x59,0x80,0x80,0x65,0x1a,0x33,0x5a,0x69,0x4f,0x80,0x80,0x67,0x40,0x40,0x54,0x69, +0x80,0x80,0x7b,0x65,0x40,0x40,0x53,0x68,0x80,0x80,0x7d,0x63,0x1b,0x3c,0x56,0x6c, +0x5f,0x80,0x7d,0x77,0x24,0x30,0x48,0x54,0x72,0x78,0x78,0x70,0x40,0x40,0x5e,0x6d, +0x80,0x80,0x6f,0x2d,0x40,0x40,0x5d,0x6c,0x80,0x80,0x75,0x2b,0x40,0x40,0x54,0x71, +0x80,0x80,0x5f,0x35,0x40,0x40,0x49,0x6a,0x80,0x80,0x79,0x5b,0x40,0x40,0x5a,0x73, +0x80,0x80,0x7b,0x49,0x40,0x40,0x5a,0x68,0x80,0x80,0x6b,0x4d,0x40,0x40,0x56,0x74, +0x80,0x80,0x75,0x5d,0x2b,0x40,0x5d,0x74,0x76,0x80,0x6b,0x53,0x40,0x40,0x5b,0x6e, +0x76,0x80,0x61,0x3e,0x40,0x40,0x5b,0x62,0x80,0x80,0x65,0x1f,0x40,0x40,0x5b,0x68, +0x80,0x80,0x7b,0x63,0x40,0x40,0x5b,0x6a,0x80,0x80,0x79,0x63,0x40,0x40,0x57,0x60, +0x80,0x80,0x7a,0x49,0x40,0x4d,0x58,0x67,0x80,0x80,0x7a,0x4b,0x40,0x4e,0x5a,0x67, +0x80,0x80,0x79,0x5f,0x40,0x4d,0x5d,0x6f,0x80,0x80,0x79,0x4d,0x40,0x40,0x4e,0x6d, +0x80,0x80,0x6a,0x4c,0x40,0x4e,0x58,0x6e,0x80,0x80,0x7b,0x31,0x40,0x40,0x58,0x69, +0x80,0x80,0x7c,0x29,0x18,0x3c,0x48,0x54,0x8d,0x87,0x9a,0x7a,0x1f,0x25,0x40,0x54, +0x8b,0x80,0x75,0x4b,0x1c,0x28,0x40,0x68,0x8b,0x80,0x80,0x2e,0x40,0x40,0x56,0x67, +0x80,0x80,0x6f,0x4f,0x40,0x40,0x50,0x61,0x80,0x80,0x59,0x2d,0x40,0x40,0x4e,0x67, +0x80,0x80,0x6c,0x2a,0x40,0x40,0x50,0x64,0x80,0x80,0x63,0x21,0x40,0x40,0x54,0x66, +0x80,0x80,0x71,0x45,0x40,0x40,0x5c,0x6c,0x80,0x80,0x6f,0x4b,0x40,0x40,0x5a,0x6d, +0x80,0x80,0x73,0x29,0x40,0x40,0x56,0x6a,0x80,0x80,0x65,0x27,0x18,0x30,0x48,0x54, +0x86,0x86,0x7d,0x69,0x40,0x40,0x44,0x67,0x80,0x80,0x79,0x29,0x40,0x40,0x5e,0x77, +0x80,0x80,0x73,0x62,0x40,0x40,0x52,0x63,0x80,0x80,0x73,0x61,0x40,0x40,0x54,0x65, +0x80,0x80,0x79,0x63,0x24,0x3c,0x48,0x54,0x7b,0x79,0x6c,0x48,0x40,0x40,0x5e,0x70, +0x80,0x80,0x7b,0x72,0x40,0x40,0x61,0x70,0x80,0x80,0x7b,0x71,0x20,0x40,0x5a,0x75, +0x80,0x80,0x71,0x2b,0x2b,0x40,0x5d,0x75,0x80,0x80,0x71,0x24,0x40,0x40,0x51,0x63, +0x80,0x80,0x6d,0x3d,0x40,0x40,0x52,0x5f,0x80,0x80,0x73,0x51,0x40,0x40,0x56,0x69, +0x80,0x80,0x6b,0x37,0x40,0x4e,0x63,0x75,0x80,0x80,0x76,0x4e,0x40,0x4c,0x5b,0x68, +0x80,0x80,0x77,0x63,0x24,0x30,0x48,0x54,0x6b,0x72,0x78,0x75,0x40,0x40,0x54,0x66, +0x80,0x80,0x7f,0x5f,0x40,0x40,0x52,0x60,0x80,0x80,0x77,0x23,0x40,0x40,0x52,0x68, +0x80,0x80,0x75,0x43,0x40,0x40,0x56,0x67,0x80,0x80,0x78,0x49,0x40,0x4d,0x5b,0x67, +0x80,0x80,0x78,0x32,0x40,0x55,0x5b,0x66,0x80,0x7d,0x6f,0x07,0x40,0x4c,0x57,0x6c, +0x80,0x80,0x77,0x2d,0x40,0x4c,0x54,0x67,0x80,0x80,0x77,0x4b,0x2d,0x40,0x50,0x5d, +0x6d,0x80,0x76,0x24,0x40,0x40,0x4f,0x5b,0x80,0x80,0x75,0x3f,0x40,0x40,0x40,0x73, +0x80,0x80,0x80,0x29,0x40,0x40,0x55,0x70,0x80,0x80,0x7a,0x07,0x40,0x40,0x53,0x6f, +0x80,0x80,0x7b,0x11,0x40,0x40,0x56,0x62,0x80,0x80,0x80,0x0d,0x2d,0x39,0x4d,0x69, +0x71,0x80,0x7b,0x68,0x40,0x40,0x5e,0x6f,0x80,0x80,0x71,0x47,0x40,0x40,0x4e,0x5f, +0x80,0x80,0x79,0x42,0x40,0x40,0x55,0x66,0x80,0x80,0x6b,0x43,0x25,0x40,0x58,0x65, +0x69,0x80,0x79,0x73,0x40,0x40,0x55,0x61,0x80,0x80,0x7b,0x63,0x18,0x3c,0x48,0x54, +0x72,0x63,0x5f,0x63,0x29,0x40,0x5c,0x67,0x6e,0x80,0x7a,0x58,0x2d,0x40,0x59,0x68, +0x73,0x80,0x75,0x59,0x40,0x40,0x5f,0x75,0x80,0x80,0x73,0x64,0x40,0x40,0x55,0x6e, +0x80,0x80,0x73,0x49,0x40,0x40,0x48,0x5a,0x80,0x80,0x73,0x5f,0x1c,0x40,0x5e,0x67, +0x5f,0x80,0x77,0x61,0x1c,0x40,0x5b,0x67,0x71,0x80,0x73,0x5b,0x40,0x40,0x5c,0x6f, +0x80,0x80,0x73,0x57,0x40,0x40,0x5e,0x6f,0x80,0x80,0x71,0x49,0x40,0x4c,0x5b,0x6c, +0x80,0x80,0x76,0x58,0x40,0x40,0x5e,0x6b,0x80,0x80,0x73,0x57,0x40,0x40,0x5c,0x72, +0x80,0x80,0x6f,0x4e,0x40,0x40,0x59,0x6c,0x80,0x80,0x71,0x59,0x40,0x40,0x5c,0x6e, +0x80,0x80,0x71,0x45,0x40,0x40,0x58,0x6d,0x80,0x80,0x71,0x54,0x40,0x40,0x63,0x74, +0x80,0x80,0x6e,0x51,0x40,0x4e,0x5f,0x6c,0x80,0x80,0x6d,0x59,0x40,0x4c,0x5d,0x72, +0x80,0x80,0x71,0x56,0x40,0x40,0x56,0x69,0x80,0x80,0x6d,0x4f,0x40,0x40,0x5c,0x6f, +0x80,0x80,0x6b,0x49,0x18,0x30,0x48,0x54,0x8c,0x7a,0x7a,0x78,0x40,0x4c,0x5d,0x74, +0x80,0x80,0x77,0x55,0x40,0x40,0x60,0x71,0x80,0x80,0x71,0x53,0x33,0x4c,0x5a,0x6d, +0x74,0x80,0x77,0x62,0x40,0x40,0x5d,0x6d,0x80,0x80,0x70,0x4b,0x40,0x40,0x5c,0x6b, +0x80,0x80,0x6c,0x47,0x30,0x3c,0x48,0x54,0x78,0x73,0x72,0x71,0x30,0x3c,0x48,0x54, +0x78,0x73,0x72,0x71,0x18,0x30,0x3c,0x54,0x8b,0x88,0x8a,0x82,0x18,0x30,0x3c,0x54, +0x8b,0x88,0x8a,0x82,0x40,0x40,0x5c,0x6c,0x80,0x80,0x73,0x5a,0x40,0x40,0x58,0x71, +0x80,0x80,0x73,0x5c,0x40,0x40,0x5c,0x6b,0x80,0x80,0x73,0x61,0x40,0x40,0x5b,0x6c, +0x80,0x80,0x71,0x4e,0x40,0x40,0x5d,0x6e,0x80,0x80,0x73,0x4e,0x40,0x40,0x64,0x71, +0x80,0x80,0x71,0x4b,0x24,0x3c,0x48,0x54,0x5a,0x6e,0x79,0x76,0x40,0x40,0x60,0x73, +0x80,0x80,0x65,0x4d,0x40,0x4c,0x5b,0x6b,0x80,0x80,0x75,0x5d,0x40,0x48,0x5c,0x6b, +0x80,0x80,0x75,0x61,0x40,0x49,0x60,0x6f,0x80,0x80,0x75,0x65,0x40,0x51,0x63,0x72, +0x7e,0x80,0x76,0x62,0x40,0x40,0x5f,0x75,0x80,0x80,0x75,0x63,0x40,0x40,0x5a,0x70, +0x80,0x80,0x75,0x5b,0x40,0x40,0x63,0x76,0x80,0x80,0x77,0x55,0x40,0x40,0x5f,0x70, +0x80,0x80,0x73,0x55,0x40,0x40,0x5a,0x6a,0x80,0x80,0x6c,0x4d,0x40,0x40,0x55,0x6c, +0x80,0x80,0x75,0x4a,0x40,0x40,0x5c,0x73,0x80,0x80,0x71,0x5d,0x40,0x40,0x5b,0x6f, +0x80,0x80,0x74,0x51,0x40,0x40,0x63,0x75,0x80,0x80,0x75,0x58,0x40,0x40,0x5f,0x74, +0x80,0x80,0x73,0x55,0x24,0x3c,0x48,0x54,0x6e,0x6a,0x5d,0x64,0x24,0x3c,0x48,0x54, +0x6e,0x6a,0x5d,0x64,0x24,0x30,0x48,0x54,0x73,0x78,0x7d,0x76,0x40,0x40,0x54,0x68, +0x80,0x80,0x80,0x4f,0x24,0x3c,0x48,0x54,0x7b,0x7f,0x83,0x6e,0x40,0x40,0x54,0x67, +0x80,0x80,0x67,0x42,0x40,0x40,0x55,0x68,0x80,0x80,0x77,0x57,0x24,0x3c,0x48,0x54, +0x77,0x7e,0x7a,0x68,0x24,0x3c,0x48,0x54,0x77,0x7e,0x7a,0x68,0x18,0x24,0x3c,0x54, +0x67,0x5e,0x79,0x84,0x40,0x40,0x54,0x63,0x80,0x80,0x73,0x2f,0x40,0x40,0x54,0x6c, +0x80,0x80,0x71,0x2b,0x40,0x40,0x4e,0x5f,0x80,0x80,0x69,0x47,0x40,0x40,0x48,0x6c, +0x80,0x80,0x80,0x8c,0x40,0x40,0x5e,0x72,0x80,0x80,0x75,0x67,0x40,0x40,0x60,0x71, +0x80,0x80,0x75,0x61,0x40,0x40,0x60,0x6a,0x80,0x80,0x7b,0x31,0x40,0x40,0x59,0x73, +0x80,0x80,0x7b,0x6b,0x40,0x40,0x55,0x60,0x80,0x80,0x7b,0x31,0x40,0x40,0x5e,0x6f, +0x80,0x80,0x67,0x53,0x40,0x40,0x54,0x6a,0x80,0x80,0x6f,0x43,0x40,0x40,0x5c,0x73, +0x80,0x80,0x75,0x52,0x40,0x40,0x59,0x75,0x80,0x80,0x71,0x52,0x40,0x40,0x5f,0x75, +0x80,0x80,0x75,0x5d,0x40,0x40,0x60,0x79,0x80,0x80,0x71,0x59,0x40,0x40,0x65,0x75, +0x80,0x80,0x77,0x5b,0x40,0x40,0x61,0x73,0x80,0x80,0x79,0x5f,0x40,0x40,0x58,0x69, +0x80,0x80,0x75,0x57,0x40,0x40,0x55,0x66,0x80,0x80,0x6b,0x51,0x40,0x40,0x51,0x66, +0x80,0x80,0x6d,0x53,0x40,0x40,0x55,0x6a,0x80,0x80,0x71,0x61,0x40,0x40,0x54,0x62, +0x80,0x80,0x79,0x61,0x40,0x40,0x5b,0x6c,0x80,0x80,0x75,0x65,0x40,0x40,0x60,0x70, +0x80,0x80,0x73,0x59,0x40,0x40,0x61,0x6d,0x80,0x80,0x77,0x63,0x40,0x40,0x59,0x6a, +0x80,0x80,0x73,0x5d,0x40,0x40,0x51,0x69,0x80,0x80,0x79,0x69,0x40,0x40,0x57,0x69, +0x80,0x80,0x73,0x61,0x40,0x40,0x56,0x67,0x80,0x80,0x75,0x6b,0x40,0x40,0x5b,0x6d, +0x80,0x80,0x77,0x69,0x40,0x40,0x5c,0x69,0x80,0x80,0x75,0x65,0x40,0x40,0x5b,0x6c, +0x80,0x80,0x71,0x5b,0x40,0x49,0x56,0x62,0x80,0x80,0x6f,0x21,0x40,0x55,0x62,0x6e, +0x80,0x80,0x6f,0x25,0x40,0x40,0x5d,0x70,0x80,0x80,0x73,0x59,0x40,0x40,0x5e,0x76, +0x80,0x80,0x69,0x29,0x40,0x41,0x41,0x42,0x80,0x80,0x80,0x00,0x41,0x42,0x55,0x66, +0x00,0x80,0x75,0x55,0x40,0x40,0x57,0x68,0x80,0x80,0x73,0x49,0x40,0x40,0x52,0x68, +0x80,0x80,0x65,0x47,0x40,0x40,0x56,0x66,0x80,0x80,0x71,0x43,0x40,0x40,0x54,0x63, +0x80,0x80,0x71,0x4f,0x40,0x40,0x51,0x69,0x80,0x80,0x65,0x3d,0x40,0x40,0x53,0x68, +0x80,0x80,0x67,0x3f,0x40,0x40,0x55,0x67,0x80,0x80,0x65,0x35,0x40,0x40,0x55,0x68, +0x80,0x80,0x5d,0x39,0x40,0x40,0x59,0x72,0x80,0x80,0x6b,0x47,0x40,0x40,0x59,0x71, +0x80,0x80,0x6b,0x47,0x40,0x53,0x5b,0x6d,0x80,0x80,0x65,0x45,0x40,0x52,0x5c,0x73, +0x80,0x80,0x75,0x61,0x40,0x51,0x5f,0x6b,0x80,0x80,0x65,0x51,0x40,0x4d,0x60,0x6d, +0x80,0x80,0x6d,0x59,0x40,0x40,0x5a,0x6b,0x80,0x80,0x71,0x60,0x40,0x40,0x5a,0x72, +0x80,0x80,0x73,0x61,0x40,0x40,0x5b,0x6f,0x80,0x80,0x69,0x43,0x40,0x40,0x5a,0x6a, +0x80,0x80,0x77,0x57,0x40,0x49,0x54,0x60,0x80,0x80,0x79,0x4b,0x40,0x40,0x4f,0x67, +0x80,0x80,0x7a,0x4b,0x40,0x40,0x56,0x68,0x80,0x80,0x77,0x59,0x40,0x40,0x4d,0x54, +0x80,0x80,0x79,0x4d,0x40,0x40,0x5b,0x60,0x80,0x80,0x71,0x2c,0x40,0x5b,0x60,0x65, +0x00,0x00,0x80,0x64,0x40,0x40,0x55,0x62,0x80,0x80,0x6b,0x43,0x40,0x40,0x53,0x65, +0x80,0x80,0x6d,0x57,0x40,0x40,0x52,0x66,0x80,0x80,0x71,0x63,0x40,0x40,0x52,0x68, +0x80,0x80,0x69,0x53,0x40,0x40,0x5c,0x6e,0x80,0x80,0x73,0x4f,0x40,0x40,0x54,0x66, +0x80,0x80,0x6f,0x4f,0x40,0x4f,0x5d,0x6e,0x80,0x80,0x6d,0x4f,0x40,0x40,0x5b,0x6f, +0x80,0x80,0x73,0x55,0x40,0x40,0x55,0x66,0x80,0x80,0x71,0x5d,0x40,0x40,0x54,0x69, +0x80,0x80,0x73,0x5a,0x40,0x40,0x40,0x4c,0x80,0x80,0x82,0x02,0x35,0x41,0x59,0x6b, +0x00,0x80,0x67,0x2f,0x40,0x40,0x62,0x71,0x80,0x80,0x73,0x53,0x40,0x40,0x62,0x73, +0x80,0x80,0x73,0x57,0x40,0x40,0x5a,0x6d,0x80,0x80,0x77,0x63,0x40,0x40,0x5c,0x6d, +0x80,0x80,0x75,0x67,0x40,0x40,0x66,0x6f,0x80,0x80,0x71,0x4d,0x40,0x40,0x66,0x6e, +0x80,0x80,0x65,0x37,0x40,0x40,0x61,0x6d,0x80,0x80,0x73,0x5d,0x40,0x40,0x5e,0x6c, +0x80,0x80,0x6f,0x57,0x40,0x40,0x5f,0x6f,0x80,0x80,0x6d,0x4f,0x40,0x40,0x5b,0x72, +0x80,0x80,0x71,0x57,0x40,0x40,0x63,0x72,0x80,0x80,0x75,0x48,0x40,0x56,0x69,0x77, +0x80,0x80,0x6c,0x51,0x40,0x4f,0x64,0x74,0x80,0x80,0x6b,0x53,0x1e,0x2a,0x36,0x37, +0x80,0x80,0x80,0x00,0x40,0x40,0x5a,0x69,0x80,0x80,0x6c,0x4b,0x40,0x40,0x55,0x68, +0x80,0x80,0x71,0x4d,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x00,0x00,0x01,0x02,0x03, +0x04,0x05,0x06,0x07,0x01,0xf0,0x7e,0x00,0x09,0x01,0xf7,0x7f,0x7f,0x7f,0x7f,0x7f, +0x7f,0x7f,0x7f,0x7f,0x7a,0x75,0x71,0x6d,0x69,0x66,0x62,0x5f,0x5d,0x5a,0x58,0x55, +0x53,0x51,0x4f,0x4d,0x4b,0x49,0x47,0x46,0x44,0x42,0x41,0x3f,0x3e,0x3d,0x3b,0x3a, +0x39,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29, +0x28,0x27,0x26,0x25,0x25,0x24,0x23,0x22,0x21,0x21,0x20,0x1f,0x1f,0x1e,0x1d,0x1c, +0x1c,0x1b,0x1a,0x1a,0x19,0x19,0x18,0x17,0x17,0x16,0x15,0x15,0x14,0x14,0x13,0x13, +0x12,0x12,0x11,0x10,0x10,0x0f,0x0f,0x0e,0x0e,0x0d,0x0d,0x0c,0x0c,0x0c,0x0b,0x0b, +0x0a,0x0a,0x09,0x09,0x08,0x08,0x07,0x07,0x07,0x06,0x06,0x05,0x05,0x05,0x04,0x04, +0x03,0x03,0x03,0x02,0x02,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x04,0x00, +0x04,0x00,0x05,0x00,0x05,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x07,0x00,0x07,0x00, +0x08,0x00,0x08,0x00,0x09,0x00,0x09,0x00,0x0a,0x00,0x0a,0x00,0x0b,0x00,0x0b,0x00, +0x0c,0x00,0x0c,0x00,0x0d,0x00,0x0d,0x00,0x0d,0x00,0x0e,0x00,0x0e,0x00,0x0f,0x00, +0x0f,0x00,0x10,0x00,0x10,0x00,0x11,0x00,0x11,0x00,0x12,0x00,0x12,0x00,0x13,0x00, +0x13,0x00,0x14,0x00,0x14,0x00,0x15,0x00,0x15,0x00,0x15,0x00,0x16,0x00,0x16,0x00, +0x17,0x00,0x17,0x00,0x18,0x00,0x18,0x00,0x19,0x00,0x19,0x00,0x1a,0x00,0x1a,0x00, +0x1b,0x00,0x1b,0x00,0x1c,0x00,0x1c,0x00,0x1d,0x00,0x1d,0x00,0x1e,0x00,0x1e,0x00, +0x1e,0x00,0x1f,0x00,0x1f,0x00,0x20,0x00,0x20,0x00,0x21,0x00,0x21,0x00,0x22,0x00, +0x22,0x00,0x23,0x00,0x23,0x00,0x24,0x00,0x24,0x00,0x25,0x00,0x25,0x00,0x26,0x00, +0x26,0x00,0x27,0x00,0x27,0x00,0x28,0x00,0x28,0x00,0x29,0x00,0x29,0x00,0x29,0x00, +0x2a,0x00,0x2a,0x00,0x2b,0x00,0x2b,0x00,0x2c,0x00,0x2c,0x00,0x2d,0x00,0x2d,0x00, +0x2e,0x00,0x2e,0x00,0x2f,0x00,0x2f,0x00,0x30,0x00,0x30,0x00,0x31,0x00,0x31,0x00, +0x32,0x00,0x32,0x00,0x33,0x00,0x33,0x00,0x34,0x00,0x34,0x00,0x35,0x00,0x35,0x00, +0x36,0x00,0x36,0x00,0x37,0x00,0x37,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x39,0x00, +0x39,0x00,0x3a,0x00,0x3a,0x00,0x3b,0x00,0x3b,0x00,0x3c,0x00,0x3c,0x00,0x3d,0x00, +0x3d,0x00,0x3e,0x00,0x3e,0x00,0x3f,0x00,0x3f,0x00,0x40,0x00,0x40,0x00,0x41,0x00, +0x41,0x00,0x42,0x00,0x42,0x00,0x43,0x00,0x43,0x00,0x44,0x00,0x44,0x00,0x45,0x00, +0x45,0x00,0x46,0x00,0x46,0x00,0x47,0x00,0x47,0x00,0x48,0x00,0x48,0x00,0x49,0x00, +0x49,0x00,0x4a,0x00,0x4a,0x00,0x4b,0x00,0x4b,0x00,0x4c,0x00,0x4c,0x00,0x4d,0x00, +0x4d,0x00,0x4e,0x00,0x4e,0x00,0x4f,0x00,0x4f,0x00,0x50,0x00,0x50,0x00,0x51,0x00, +0x51,0x00,0x52,0x00,0x52,0x00,0x53,0x00,0x53,0x00,0x54,0x00,0x54,0x00,0x55,0x00, +0x55,0x00,0x56,0x00,0x56,0x00,0x57,0x00,0x57,0x00,0x58,0x00,0x58,0x00,0x59,0x00, +0x59,0x00,0x5a,0x00,0x5a,0x00,0x5b,0x00,0x5b,0x00,0x5c,0x00,0x5c,0x00,0x5d,0x00, +0x5d,0x00,0x5e,0x00,0x5e,0x00,0x5f,0x00,0x5f,0x00,0x60,0x00,0x60,0x00,0x61,0x00, +0x61,0x00,0x62,0x00,0x62,0x00,0x63,0x00,0x63,0x00,0x64,0x00,0x64,0x00,0x65,0x00, +0x65,0x00,0x66,0x00,0x66,0x00,0x67,0x00,0x67,0x00,0x68,0x00,0x68,0x00,0x69,0x00, +0x69,0x00,0x6a,0x00,0x6a,0x00,0x6b,0x00,0x6b,0x00,0x6c,0x00,0x6c,0x00,0x6d,0x00, +0x6d,0x00,0x6e,0x00,0x6e,0x00,0x6f,0x00,0x6f,0x00,0x70,0x00,0x71,0x00,0x71,0x00, +0x72,0x00,0x72,0x00,0x73,0x00,0x73,0x00,0x74,0x00,0x74,0x00,0x75,0x00,0x75,0x00, +0x76,0x00,0x76,0x00,0x77,0x00,0x77,0x00,0x78,0x00,0x78,0x00,0x79,0x00,0x79,0x00, +0x7a,0x00,0x7a,0x00,0x7b,0x00,0x7b,0x00,0x7c,0x00,0x7c,0x00,0x7d,0x00,0x7d,0x00, +0x7e,0x00,0x7e,0x00,0x7f,0x00,0x7f,0x00,0x80,0x00,0x81,0x00,0x81,0x00,0x82,0x00, +0x82,0x00,0x83,0x00,0x83,0x00,0x84,0x00,0x84,0x00,0x85,0x00,0x85,0x00,0x86,0x00, +0x86,0x00,0x87,0x00,0x87,0x00,0x88,0x00,0x88,0x00,0x89,0x00,0x89,0x00,0x8a,0x00, +0x8a,0x00,0x8b,0x00,0x8c,0x00,0x8c,0x00,0x8d,0x00,0x8d,0x00,0x8e,0x00,0x8e,0x00, +0x8f,0x00,0x8f,0x00,0x90,0x00,0x90,0x00,0x91,0x00,0x91,0x00,0x92,0x00,0x92,0x00, +0x93,0x00,0x93,0x00,0x94,0x00,0x94,0x00,0x95,0x00,0x96,0x00,0x96,0x00,0x97,0x00, +0x97,0x00,0x98,0x00,0x98,0x00,0x99,0x00,0x99,0x00,0x9a,0x00,0x9a,0x00,0x9b,0x00, +0x9b,0x00,0x9c,0x00,0x9c,0x00,0x9d,0x00,0x9e,0x00,0x9e,0x00,0x9f,0x00,0x9f,0x00, +0xa0,0x00,0xa0,0x00,0xa1,0x00,0xa1,0x00,0xa2,0x00,0xa2,0x00,0xa3,0x00,0xa3,0x00, +0xa4,0x00,0xa4,0x00,0xa5,0x00,0xa6,0x00,0xa6,0x00,0xa7,0x00,0xa7,0x00,0xa8,0x00, +0xa8,0x00,0xa9,0x00,0xa9,0x00,0xaa,0x00,0xaa,0x00,0xab,0x00,0xab,0x00,0xac,0x00, +0xad,0x00,0xad,0x00,0xae,0x00,0xae,0x00,0xaf,0x00,0xaf,0x00,0xb0,0x00,0xb0,0x00, +0xb1,0x00,0xb1,0x00,0xb2,0x00,0xb3,0x00,0xb3,0x00,0xb4,0x00,0xb4,0x00,0xb5,0x00, +0xb5,0x00,0xb6,0x00,0xb6,0x00,0xb7,0x00,0xb7,0x00,0xb8,0x00,0xb8,0x00,0xb9,0x00, +0xba,0x00,0xba,0x00,0xbb,0x00,0xbb,0x00,0xbc,0x00,0xbc,0x00,0xbd,0x00,0xbd,0x00, +0xbe,0x00,0xbf,0x00,0xbf,0x00,0xc0,0x00,0xc0,0x00,0xc1,0x00,0xc1,0x00,0xc2,0x00, +0xc2,0x00,0xc3,0x00,0xc3,0x00,0xc4,0x00,0xc5,0x00,0xc5,0x00,0xc6,0x00,0xc6,0x00, +0xc7,0x00,0xc7,0x00,0xc8,0x00,0xc8,0x00,0xc9,0x00,0xca,0x00,0xca,0x00,0xcb,0x00, +0xcb,0x00,0xcc,0x00,0xcc,0x00,0xcd,0x00,0xcd,0x00,0xce,0x00,0xcf,0x00,0xcf,0x00, +0xd0,0x00,0xd0,0x00,0xd1,0x00,0xd1,0x00,0xd2,0x00,0xd2,0x00,0xd3,0x00,0xd4,0x00, +0xd4,0x00,0xd5,0x00,0xd5,0x00,0xd6,0x00,0xd6,0x00,0xd7,0x00,0xd7,0x00,0xd8,0x00, +0xd9,0x00,0xd9,0x00,0xda,0x00,0xda,0x00,0xdb,0x00,0xdb,0x00,0xdc,0x00,0xdc,0x00, +0xdd,0x00,0xde,0x00,0xde,0x00,0xdf,0x00,0xdf,0x00,0xe0,0x00,0xe0,0x00,0xe1,0x00, +0xe2,0x00,0xe2,0x00,0xe3,0x00,0xe3,0x00,0xe4,0x00,0xe4,0x00,0xe5,0x00,0xe5,0x00, +0xe6,0x00,0xe7,0x00,0xe7,0x00,0xe8,0x00,0xe8,0x00,0xe9,0x00,0xe9,0x00,0xea,0x00, +0xeb,0x00,0xeb,0x00,0xec,0x00,0xec,0x00,0xed,0x00,0xed,0x00,0xee,0x00,0xef,0x00, +0xef,0x00,0xf0,0x00,0xf0,0x00,0xf1,0x00,0xf1,0x00,0xf2,0x00,0xf3,0x00,0xf3,0x00, +0xf4,0x00,0xf4,0x00,0xf5,0x00,0xf5,0x00,0xf6,0x00,0xf7,0x00,0xf7,0x00,0xf8,0x00, +0xf8,0x00,0xf9,0x00,0xf9,0x00,0xfa,0x00,0xfb,0x00,0xfb,0x00,0xfc,0x00,0xfc,0x00, +0xfd,0x00,0xfd,0x00,0xfe,0x00,0xff,0x00,0xff,0x01,0x00,0x01,0x00,0x01,0x01,0x01, +0x02,0x01,0x02,0x01,0x03,0x01,0x03,0x01,0x04,0x01,0x04,0x01,0x05,0x01,0x06,0x01, +0x06,0x01,0x07,0x01,0x07,0x01,0x08,0x01,0x08,0x01,0x09,0x01,0x0a,0x01,0x0a,0x01, +0x0b,0x01,0x0b,0x01,0x0c,0x01,0x0d,0x01,0x0d,0x01,0x0e,0x01,0x0e,0x01,0x0f,0x01, +0x0f,0x01,0x10,0x01,0x11,0x01,0x11,0x01,0x12,0x01,0x12,0x01,0x13,0x01,0x14,0x01, +0x14,0x01,0x15,0x01,0x15,0x01,0x16,0x01,0x17,0x01,0x17,0x01,0x18,0x01,0x18,0x01, +0x19,0x01,0x19,0x01,0x1a,0x01,0x1b,0x01,0x1b,0x01,0x1c,0x01,0x1c,0x01,0x1d,0x01, +0x1e,0x01,0x1e,0x01,0x1f,0x01,0x1f,0x01,0x20,0x01,0x21,0x01,0x21,0x01,0x22,0x01, +0x22,0x01,0x23,0x01,0x24,0x01,0x24,0x01,0x25,0x01,0x25,0x01,0x26,0x01,0x27,0x01, +0x27,0x01,0x28,0x01,0x28,0x01,0x29,0x01,0x29,0x01,0x2a,0x01,0x2b,0x01,0x2b,0x01, +0x2c,0x01,0x2c,0x01,0x2d,0x01,0x2e,0x01,0x2e,0x01,0x2f,0x01,0x2f,0x01,0x30,0x01, +0x31,0x01,0x31,0x01,0x32,0x01,0x32,0x01,0x33,0x01,0x34,0x01,0x34,0x01,0x35,0x01, +0x35,0x01,0x36,0x01,0x37,0x01,0x37,0x01,0x38,0x01,0x38,0x01,0x39,0x01,0x3a,0x01, +0x3a,0x01,0x3b,0x01,0x3c,0x01,0x3c,0x01,0x3d,0x01,0x3d,0x01,0x3e,0x01,0x3f,0x01, +0x3f,0x01,0x40,0x01,0x40,0x01,0x41,0x01,0x42,0x01,0x42,0x01,0x43,0x01,0x43,0x01, +0x44,0x01,0x45,0x01,0x45,0x01,0x46,0x01,0x46,0x01,0x47,0x01,0x48,0x01,0x48,0x01, +0x49,0x01,0x49,0x01,0x4a,0x01,0x4b,0x01,0x4b,0x01,0x4c,0x01,0x4d,0x01,0x4d,0x01, +0x4e,0x01,0x4e,0x01,0x4f,0x01,0x50,0x01,0x50,0x01,0x51,0x01,0x51,0x01,0x52,0x01, +0x53,0x01,0x53,0x01,0x54,0x01,0x55,0x01,0x55,0x01,0x56,0x01,0x56,0x01,0x57,0x01, +0x58,0x01,0x58,0x01,0x59,0x01,0x59,0x01,0x5a,0x01,0x5b,0x01,0x5b,0x01,0x5c,0x01, +0x5d,0x01,0x5d,0x01,0x5e,0x01,0x5e,0x01,0x5f,0x01,0x60,0x01,0x60,0x01,0x61,0x01, +0x62,0x01,0x62,0x01,0x63,0x01,0x63,0x01,0x64,0x01,0x65,0x01,0x65,0x01,0x66,0x01, +0x67,0x01,0x67,0x01,0x68,0x01,0x68,0x01,0x69,0x01,0x6a,0x01,0x6a,0x01,0x6b,0x01, +0x6c,0x01,0x6c,0x01,0x6d,0x01,0x6d,0x01,0x6e,0x01,0x6f,0x01,0x6f,0x01,0x70,0x01, +0x71,0x01,0x71,0x01,0x72,0x01,0x72,0x01,0x73,0x01,0x74,0x01,0x74,0x01,0x75,0x01, +0x76,0x01,0x76,0x01,0x77,0x01,0x77,0x01,0x78,0x01,0x79,0x01,0x79,0x01,0x7a,0x01, +0x7b,0x01,0x7b,0x01,0x7c,0x01,0x7d,0x01,0x7d,0x01,0x7e,0x01,0x7e,0x01,0x7f,0x01, +0x80,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x82,0x01,0x83,0x01,0x84,0x01,0x84,0x01, +0x85,0x01,0x85,0x01,0x86,0x01,0x87,0x01,0x87,0x01,0x88,0x01,0x89,0x01,0x89,0x01, +0x8a,0x01,0x8b,0x01,0x8b,0x01,0x8c,0x01,0x8c,0x01,0x8d,0x01,0x8e,0x01,0x8e,0x01, +0x8f,0x01,0x90,0x01,0x90,0x01,0x91,0x01,0x92,0x01,0x92,0x01,0x93,0x01,0x94,0x01, +0x94,0x01,0x95,0x01,0x95,0x01,0x96,0x01,0x97,0x01,0x97,0x01,0x98,0x01,0x99,0x01, +0x99,0x01,0x9a,0x01,0x9b,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x01,0x9d,0x01,0x9e,0x01, +0x9f,0x01,0x9f,0x01,0xa0,0x01,0xa0,0x01,0xa1,0x01,0xa2,0x01,0xa2,0x01,0xa3,0x01, +0xa4,0x01,0xa4,0x01,0xa5,0x01,0xa6,0x01,0xa6,0x01,0xa7,0x01,0xa8,0x01,0xa8,0x01, +0xa9,0x01,0xaa,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xac,0x01,0xad,0x01,0xae,0x01, +0xae,0x01,0xaf,0x01,0xb0,0x01,0xb0,0x01,0xb1,0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01, +0xb3,0x01,0xb4,0x01,0xb5,0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb7,0x01,0xb8,0x01, +0xb9,0x01,0xb9,0x01,0xba,0x01,0xbb,0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbd,0x01, +0xbe,0x01,0xbf,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x01,0xc1,0x01,0xc2,0x01,0xc3,0x01, +0xc3,0x01,0xc4,0x01,0xc5,0x01,0xc5,0x01,0xc6,0x01,0xc7,0x01,0xc7,0x01,0xc8,0x01, +0xc9,0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xcb,0x01,0xcc,0x01,0xcd,0x01,0xcd,0x01, +0xce,0x01,0xcf,0x01,0xcf,0x01,0xd0,0x01,0xd1,0x01,0xd1,0x01,0xd2,0x01,0xd3,0x01, +0xd3,0x01,0xd4,0x01,0xd5,0x01,0xd5,0x01,0xd6,0x01,0xd7,0x01,0xd7,0x01,0xd8,0x01, +0xd9,0x01,0xda,0x01,0xda,0x01,0xdb,0x01,0xdc,0x01,0xdc,0x01,0xdd,0x01,0xde,0x01, +0xde,0x01,0xdf,0x01,0xe0,0x01,0xe0,0x01,0xe1,0x01,0xe2,0x01,0xe2,0x01,0xe3,0x01, +0xe4,0x01,0xe4,0x01,0xe5,0x01,0xe6,0x01,0xe6,0x01,0xe7,0x01,0xe8,0x01,0xe8,0x01, +0xe9,0x01,0xea,0x01,0xeb,0x01,0xeb,0x01,0xec,0x01,0xed,0x01,0xed,0x01,0xee,0x01, +0xef,0x01,0xef,0x01,0xf0,0x01,0xf1,0x01,0xf1,0x01,0xf2,0x01,0xf3,0x01,0xf3,0x01, +0xf4,0x01,0xf5,0x01,0xf5,0x01,0xf6,0x01,0xf7,0x01,0xf8,0x01,0xf8,0x01,0xf9,0x01, +0xfa,0x01,0xfa,0x01,0xfb,0x01,0xfc,0x01,0xfc,0x01,0xfd,0x01,0xfe,0x01,0xfe,0x01, +0xff,0x02,0x00,0x02,0x01,0x02,0x01,0x02,0x02,0x02,0x03,0x02,0x03,0x02,0x04,0x02, +0x05,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x07,0x02,0x08,0x02,0x09,0x02,0x0a,0x02, +0x0a,0x02,0x0b,0x02,0x0c,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0e,0x02,0x0f,0x02, +0x10,0x02,0x11,0x02,0x11,0x02,0x12,0x02,0x13,0x02,0x13,0x02,0x14,0x02,0x15,0x02, +0x15,0x02,0x16,0x02,0x17,0x02,0x18,0x02,0x18,0x02,0x19,0x02,0x1a,0x02,0x1a,0x02, +0x1b,0x02,0x1c,0x02,0x1d,0x02,0x1d,0x02,0x1e,0x02,0x1f,0x02,0x1f,0x02,0x20,0x02, +0x21,0x02,0x21,0x02,0x22,0x02,0x23,0x02,0x24,0x02,0x24,0x02,0x25,0x02,0x26,0x02, +0x26,0x02,0x27,0x02,0x28,0x02,0x29,0x02,0x29,0x02,0x2a,0x02,0x2b,0x02,0x2b,0x02, +0x2c,0x02,0x2d,0x02,0x2e,0x02,0x2e,0x02,0x2f,0x02,0x30,0x02,0x30,0x02,0x31,0x02, +0x32,0x02,0x33,0x02,0x33,0x02,0x34,0x02,0x35,0x02,0x35,0x02,0x36,0x02,0x37,0x02, +0x38,0x02,0x38,0x02,0x39,0x02,0x3a,0x02,0x3a,0x02,0x3b,0x02,0x3c,0x02,0x3d,0x02, +0x3d,0x02,0x3e,0x02,0x3f,0x02,0x40,0x02,0x40,0x02,0x41,0x02,0x42,0x02,0x42,0x02, +0x43,0x02,0x44,0x02,0x45,0x02,0x45,0x02,0x46,0x02,0x47,0x02,0x47,0x02,0x48,0x02, +0x49,0x02,0x4a,0x02,0x4a,0x02,0x4b,0x02,0x4c,0x02,0x4d,0x02,0x4d,0x02,0x4e,0x02, +0x4f,0x02,0x4f,0x02,0x50,0x02,0x51,0x02,0x52,0x02,0x52,0x02,0x53,0x02,0x54,0x02, +0x55,0x02,0x55,0x02,0x56,0x02,0x57,0x02,0x58,0x02,0x58,0x02,0x59,0x02,0x5a,0x02, +0x5a,0x02,0x5b,0x02,0x5c,0x02,0x5d,0x02,0x5d,0x02,0x5e,0x02,0x5f,0x02,0x60,0x02, +0x60,0x02,0x61,0x02,0x62,0x02,0x63,0x02,0x63,0x02,0x64,0x02,0x65,0x02,0x66,0x02, +0x66,0x02,0x67,0x02,0x68,0x02,0x68,0x02,0x69,0x02,0x6a,0x02,0x6b,0x02,0x6b,0x02, +0x6c,0x02,0x6d,0x02,0x6e,0x02,0x6e,0x02,0x6f,0x02,0x70,0x02,0x71,0x02,0x71,0x02, +0x72,0x02,0x73,0x02,0x74,0x02,0x74,0x02,0x75,0x02,0x76,0x02,0x77,0x02,0x77,0x02, +0x78,0x02,0x79,0x02,0x7a,0x02,0x7a,0x02,0x7b,0x02,0x7c,0x02,0x7d,0x02,0x7d,0x02, +0x7e,0x02,0x7f,0x02,0x80,0x02,0x80,0x02,0x81,0x02,0x82,0x02,0x83,0x02,0x83,0x02, +0x84,0x02,0x85,0x02,0x86,0x02,0x86,0x02,0x87,0x02,0x88,0x02,0x89,0x02,0x89,0x02, +0x8a,0x02,0x8b,0x02,0x8c,0x02,0x8c,0x02,0x8d,0x02,0x8e,0x02,0x8f,0x02,0x8f,0x02, +0x90,0x02,0x91,0x02,0x92,0x02,0x92,0x02,0x93,0x02,0x94,0x02,0x95,0x02,0x96,0x02, +0x96,0x02,0x97,0x02,0x98,0x02,0x99,0x02,0x99,0x02,0x9a,0x02,0x9b,0x02,0x9c,0x02, +0x9c,0x02,0x9d,0x02,0x9e,0x02,0x9f,0x02,0x9f,0x02,0xa0,0x02,0xa1,0x02,0xa2,0x02, +0xa2,0x02,0xa3,0x02,0xa4,0x02,0xa5,0x02,0xa6,0x02,0xa6,0x02,0xa7,0x02,0xa8,0x02, +0xa9,0x02,0xa9,0x02,0xaa,0x02,0xab,0x02,0xac,0x02,0xac,0x02,0xad,0x02,0xae,0x02, +0xaf,0x02,0xb0,0x02,0xb0,0x02,0xb1,0x02,0xb2,0x02,0xb3,0x02,0xb3,0x02,0xb4,0x02, +0xb5,0x02,0xb6,0x02,0xb7,0x02,0xb7,0x02,0xb8,0x02,0xb9,0x02,0xba,0x02,0xba,0x02, +0xbb,0x02,0xbc,0x02,0xbd,0x02,0xbe,0x02,0xbe,0x02,0xbf,0x02,0xc0,0x02,0xc1,0x02, +0xc1,0x02,0xc2,0x02,0xc3,0x02,0xc4,0x02,0xc5,0x02,0xc5,0x02,0xc6,0x02,0xc7,0x02, +0xc8,0x02,0xc8,0x02,0xc9,0x02,0xca,0x02,0xcb,0x02,0xcc,0x02,0xcc,0x02,0xcd,0x02, +0xce,0x02,0xcf,0x02,0xd0,0x02,0xd0,0x02,0xd1,0x02,0xd2,0x02,0xd3,0x02,0xd3,0x02, +0xd4,0x02,0xd5,0x02,0xd6,0x02,0xd7,0x02,0xd7,0x02,0xd8,0x02,0xd9,0x02,0xda,0x02, +0xdb,0x02,0xdb,0x02,0xdc,0x02,0xdd,0x02,0xde,0x02,0xdf,0x02,0xdf,0x02,0xe0,0x02, +0xe1,0x02,0xe2,0x02,0xe3,0x02,0xe3,0x02,0xe4,0x02,0xe5,0x02,0xe6,0x02,0xe7,0x02, +0xe7,0x02,0xe8,0x02,0xe9,0x02,0xea,0x02,0xeb,0x02,0xeb,0x02,0xec,0x02,0xed,0x02, +0xee,0x02,0xef,0x02,0xef,0x02,0xf0,0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf3,0x02, +0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x02,0xf7,0x02,0xf8,0x02,0xf9,0x02,0xfa,0x02, +0xfb,0x02,0xfb,0x02,0xfc,0x02,0xfd,0x02,0xfe,0x02,0xff,0x02,0xff,0x03,0x00,0x03, +0x01,0x03,0x02,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03, +0x08,0x03,0x08,0x03,0x09,0x03,0x0a,0x03,0x0b,0x03,0x0c,0x03,0x0c,0x03,0x0d,0x03, +0x0e,0x03,0x0f,0x03,0x10,0x03,0x10,0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03, +0x15,0x03,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,0x19,0x03,0x19,0x03,0x1a,0x03, +0x1b,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1e,0x03,0x1f,0x03,0x20,0x03,0x21,0x03, +0x22,0x03,0x23,0x03,0x23,0x03,0x24,0x03,0x25,0x03,0x26,0x03,0x27,0x03,0x27,0x03, +0x28,0x03,0x29,0x03,0x2a,0x03,0x2b,0x03,0x2c,0x03,0x2c,0x03,0x2d,0x03,0x2e,0x03, +0x2f,0x03,0x30,0x03,0x31,0x03,0x31,0x03,0x32,0x03,0x33,0x03,0x34,0x03,0x35,0x03, +0x36,0x03,0x36,0x03,0x37,0x03,0x38,0x03,0x39,0x03,0x3a,0x03,0x3b,0x03,0x3b,0x03, +0x3c,0x03,0x3d,0x03,0x3e,0x03,0x3f,0x03,0x40,0x03,0x40,0x03,0x41,0x03,0x42,0x03, +0x43,0x03,0x44,0x03,0x45,0x03,0x45,0x03,0x46,0x03,0x47,0x03,0x48,0x03,0x49,0x03, +0x4a,0x03,0x4b,0x03,0x4b,0x03,0x4c,0x03,0x4d,0x03,0x4e,0x03,0x4f,0x03,0x50,0x03, +0x50,0x03,0x51,0x03,0x52,0x03,0x53,0x03,0x54,0x03,0x55,0x03,0x56,0x03,0x56,0x03, +0x57,0x03,0x58,0x03,0x59,0x03,0x5a,0x03,0x5b,0x03,0x5b,0x03,0x5c,0x03,0x5d,0x03, +0x5e,0x03,0x5f,0x03,0x60,0x03,0x61,0x03,0x61,0x03,0x62,0x03,0x63,0x03,0x64,0x03, +0x65,0x03,0x66,0x03,0x67,0x03,0x67,0x03,0x68,0x03,0x69,0x03,0x6a,0x03,0x6b,0x03, +0x6c,0x03,0x6d,0x03,0x6d,0x03,0x6e,0x03,0x6f,0x03,0x70,0x03,0x71,0x03,0x72,0x03, +0x73,0x03,0x73,0x03,0x74,0x03,0x75,0x03,0x76,0x03,0x77,0x03,0x78,0x03,0x79,0x03, +0x79,0x03,0x7a,0x03,0x7b,0x03,0x7c,0x03,0x7d,0x03,0x7e,0x03,0x7f,0x03,0x80,0x03, +0x80,0x03,0x81,0x03,0x82,0x03,0x83,0x03,0x84,0x03,0x85,0x03,0x86,0x03,0x86,0x03, +0x87,0x03,0x88,0x03,0x89,0x03,0x8a,0x03,0x8b,0x03,0x8c,0x03,0x8d,0x03,0x8d,0x03, +0x8e,0x03,0x8f,0x03,0x90,0x03,0x91,0x03,0x92,0x03,0x93,0x03,0x94,0x03,0x94,0x03, +0x95,0x03,0x96,0x03,0x97,0x03,0x98,0x03,0x99,0x03,0x9a,0x03,0x9b,0x03,0x9b,0x03, +0x9c,0x03,0x9d,0x03,0x9e,0x03,0x9f,0x03,0xa0,0x03,0xa1,0x03,0xa2,0x03,0xa2,0x03, +0xa3,0x03,0xa4,0x03,0xa5,0x03,0xa6,0x03,0xa7,0x03,0xa8,0x03,0xa9,0x03,0xaa,0x03, +0xaa,0x03,0xab,0x03,0xac,0x03,0xad,0x03,0xae,0x03,0xaf,0x03,0xb0,0x03,0xb1,0x03, +0xb2,0x03,0xb2,0x03,0xb3,0x03,0xb4,0x03,0xb5,0x03,0xb6,0x03,0xb7,0x03,0xb8,0x03, +0xb9,0x03,0xba,0x03,0xba,0x03,0xbb,0x03,0xbc,0x03,0xbd,0x03,0xbe,0x03,0xbf,0x03, +0xc0,0x03,0xc1,0x03,0xc2,0x03,0xc3,0x03,0xc3,0x03,0xc4,0x03,0xc5,0x03,0xc6,0x03, +0xc7,0x03,0xc8,0x03,0xc9,0x03,0xca,0x03,0xcb,0x03,0xcb,0x03,0xcc,0x03,0xcd,0x03, +0xce,0x03,0xcf,0x03,0xd0,0x03,0xd1,0x03,0xd2,0x03,0xd3,0x03,0xd4,0x03,0xd5,0x03, +0xd5,0x03,0xd6,0x03,0xd7,0x03,0xd8,0x03,0xd9,0x03,0xda,0x03,0xdb,0x03,0xdc,0x03, +0xdd,0x03,0xde,0x03,0xde,0x03,0xdf,0x03,0xe0,0x03,0xe1,0x03,0xe2,0x03,0xe3,0x03, +0xe4,0x03,0xe5,0x03,0xe6,0x03,0xe7,0x03,0xe8,0x03,0xe9,0x03,0xe9,0x03,0xea,0x03, +0xeb,0x03,0xec,0x03,0xed,0x03,0xee,0x03,0xef,0x03,0xf0,0x03,0xf1,0x03,0xf2,0x03, +0xf3,0x03,0xf4,0x03,0xf4,0x03,0xf5,0x03,0xf6,0x03,0xf7,0x03,0xf8,0x03,0xf9,0x03, +0xfa,0x03,0xfb,0x03,0xfc,0x03,0xfd,0x03,0xfe,0x03,0xff,0x54,0x52,0x49,0x58,0x2d, +0x50,0x52,0x4f,0x01,0x0a,0x00,0x01,0x02,0x03,0x04,0x05,0x04,0x03,0x10,0x10,0x48, +0x12,0x13,0x14,0x15,0x17,0x06,0x06,0x06,0x06,0x07,0x07,0x08,0x08,0x3e,0x3f,0x3e, +0x3f,0x27,0x27,0x51,0x26,0x58,0x5e,0x36,0x5c,0x61,0x63,0x62,0x6d,0x66,0x60,0x44, +0x5d,0x50,0x51,0x09,0x50,0x30,0x30,0x31,0x2d,0x28,0x29,0x2a,0x2a,0x2b,0x2e,0x2e, +0x18,0x19,0x1a,0x1b,0x68,0x20,0x21,0x22,0x22,0x24,0x25,0x23,0x20,0x49,0x49,0x48, +0x48,0x4a,0x4b,0x40,0x41,0x42,0x43,0x47,0x47,0x44,0x45,0x46,0x16,0x38,0x38,0x39, +0x39,0x3c,0x3c,0x3a,0x3d,0x3e,0x0b,0x62,0x2e,0x64,0x09,0x0e,0x0d,0x0c,0x6b,0x56, +0x52,0x4e,0x4e,0x4b,0x5e,0x2f,0x75,0x76,0x76,0x76,0x74,0x73,0x77,0x73,0x09,0x37, +0x7c,0x7b,0x7d,0x70,0x52 +}; + diff --git a/sys/i386/isa/sound/tuning.h b/sys/i386/isa/sound/tuning.h index 98048cc..858e1fe 100644 --- a/sys/i386/isa/sound/tuning.h +++ b/sys/i386/isa/sound/tuning.h @@ -1,13 +1,13 @@ #ifdef SEQUENCER_C -static unsigned short semitone_tuning[24] = +unsigned short semitone_tuning[24] = { /* 0 */ 10000, 10595, 11225, 11892, 12599, 13348, 14142, 14983, /* 8 */ 15874, 16818, 17818, 18877, 20000, 21189, 22449, 23784, /* 16 */ 25198, 26697, 28284, 29966, 31748, 33636, 35636, 37755 }; -static unsigned short cent_tuning[100] = +unsigned short cent_tuning[100] = { /* 0 */ 10000, 10006, 10012, 10017, 10023, 10029, 10035, 10041, /* 8 */ 10046, 10052, 10058, 10064, 10070, 10075, 10081, 10087, @@ -23,4 +23,7 @@ static unsigned short cent_tuning[100] = /* 88 */ 10521, 10528, 10534, 10540, 10546, 10552, 10558, 10564, /* 96 */ 10570, 10576, 10582, 10589 }; +#else +extern unsigned short semitone_tuning[24]; +extern unsigned short cent_tuning[100]; #endif diff --git a/sys/i386/isa/sound/uart6850.c b/sys/i386/isa/sound/uart6850.c index 5160bec..c9d5c39 100644 --- a/sys/i386/isa/sound/uart6850.c +++ b/sys/i386/isa/sound/uart6850.c @@ -1,11 +1,11 @@ /* * sound/uart6850.c - * + * * Copyright by Hannu Savolainen 1993 - * - * Mon Nov 22 22:38:35 MET 1993 marco@driq.home.usn.nl: - * added 6850 support, used with COVOX SoundMaster II and custom cards. - * + * + * Mon Nov 22 22:38:35 MET 1993 marco@driq.home.usn.nl: added 6850 support, used + * with COVOX SoundMaster II and custom cards. + * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: 1. Redistributions of source code must retain the above copyright @@ -13,7 +13,7 @@ * Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE @@ -25,39 +25,32 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * + * */ #include <i386/isa/sound/sound_config.h> -#ifdef CONFIGURE_SOUNDCARD +#if NSND > 0 -#if !defined(EXCLUDE_UART6850) && !defined(EXCLUDE_MIDI) +#if 1 +/* #if defined(CONFIG_UART6850) && defined(CONFIG_MIDI) */ -#define DATAPORT (uart6850_base) /* - * * * Midi6850 Data I/O Port on IBM - * */ -#define COMDPORT (uart6850_base+1) /* - * * * Midi6850 Command Port on IBM */ -#define STATPORT (uart6850_base+1) /* - * * * Midi6850 Status Port on IBM */ +#define DATAPORT (uart6850_base) /* * * Midi6850 Data I/O Port on IBM */ +#define COMDPORT (uart6850_base+1) /* * * Midi6850 Command Port on IBM */ +#define STATPORT (uart6850_base+1) /* * * Midi6850 Status Port on IBM */ -#define uart6850_status() INB(STATPORT) -#define input_avail() ((uart6850_status()&INPUT_AVAIL)) -#define output_ready() ((uart6850_status()&OUTPUT_READY)) -#define uart6850_cmd(cmd) OUTB(cmd, COMDPORT) -#define uart6850_read() INB(DATAPORT) -#define uart6850_write(byte) OUTB(byte, DATAPORT) +#define uart6850_status() inb( STATPORT) +#define input_avail() (uart6850_status()&INPUT_AVAIL) +#define output_ready() (uart6850_status()&OUTPUT_READY) +#define uart6850_cmd(cmd) outb( COMDPORT, cmd) +#define uart6850_read() inb( DATAPORT) +#define uart6850_write(byte) outb( DATAPORT, byte) -#define OUTPUT_READY 0x02 /* - * * * Mask for Data Read Ready Bit */ -#define INPUT_AVAIL 0x01 /* - * * * Mask for Data Send Ready Bit */ +#define OUTPUT_READY 0x02 /* * * Mask for Data Read Ready Bit */ +#define INPUT_AVAIL 0x01 /* * * Mask for Data Send Ready Bit */ -#define UART_RESET 0x95 /* - * * * 6850 Total Reset Command */ -#define UART_MODE_ON 0x03 /* - * * * 6850 Send/Receive UART Mode */ +#define UART_RESET 0x95 /* * * 6850 Total Reset Command */ +#define UART_MODE_ON 0x03 /* * * 6850 Send/Receive UART Mode */ static int uart6850_opened = 0; static int uart6850_base = 0x330; @@ -65,38 +58,37 @@ static int uart6850_irq; static int uart6850_detected = 0; static int my_dev; -static int reset_uart6850 (void); -static void (*midi_input_intr) (int dev, unsigned char data); +static int reset_uart6850(void); +static void (*midi_input_intr) (int dev, u_char data); +static void poll_uart6850(u_long dummy); + +static sound_os_info *uart6850_osp; static void -uart6850_input_loop (void) +uart6850_input_loop(void) { - int count; + int count; - count = 10; + count = 10; - while (count) /* - * Not timed out - */ - if (input_avail ()) - { - unsigned char c = uart6850_read (); + while (count) /* Not timed out */ + if (input_avail()) { + u_char c = uart6850_read(); - count = 100; + count = 100; - if (uart6850_opened & OPEN_READ) - midi_input_intr (my_dev, c); - } - else - while (!input_avail () && count) - count--; + if (uart6850_opened & OPEN_READ) + midi_input_intr(my_dev, c); + } else + while (!input_avail() && count) + count--; } void -m6850intr (int unit) +m6850intr(int irq) { - if (input_avail ()) - uart6850_input_loop (); + if (input_avail()) + uart6850_input_loop(); } /* @@ -105,133 +97,118 @@ m6850intr (int unit) */ static void -poll_uart6850 (void *dummy) +poll_uart6850(u_long dummy) { - unsigned long flags; + u_long flags; - DEFINE_TIMER (uart6850_timer, poll_uart6850); + if (!(uart6850_opened & OPEN_READ)) + return; /* Device has been closed */ - if (!(uart6850_opened & OPEN_READ)) - return; /* - * No longer required - */ + flags = splhigh(); - DISABLE_INTR (flags); + if (input_avail()) + uart6850_input_loop(); - if (input_avail ()) - uart6850_input_loop (); - ACTIVATE_TIMER (uart6850_timer, poll_uart6850, 1); /* - * Come back later - */ + timeout((timeout_func_t) poll_uart6850, 0, 1);; /* Come back later */ - RESTORE_INTR (flags); + splx(flags); } static int -uart6850_open (int dev, int mode, - void (*input) (int dev, unsigned char data), - void (*output) (int dev) +uart6850_open(int dev, int mode, + void (*input) (int dev, u_char data), + void (*output) (int dev) ) { - if (uart6850_opened) - { - printk ("Midi6850: Midi busy\n"); - return RET_ERROR (EBUSY); + if (uart6850_opened) { + printf("Midi6850: Midi busy\n"); + return -(EBUSY); } + uart6850_cmd(UART_RESET); - uart6850_cmd (UART_RESET); - - uart6850_input_loop (); + uart6850_input_loop(); - midi_input_intr = input; - uart6850_opened = mode; - poll_uart6850 (0); /* - * Enable input polling - */ + midi_input_intr = input; + uart6850_opened = mode; + poll_uart6850(0); /* Enable input polling */ - return 0; + return 0; } static void -uart6850_close (int dev) +uart6850_close(int dev) { - uart6850_cmd (UART_MODE_ON); + uart6850_cmd(UART_MODE_ON); - uart6850_opened = 0; + uart6850_opened = 0; } static int -uart6850_out (int dev, unsigned char midi_byte) +uart6850_out(int dev, u_char midi_byte) { - int timeout; - unsigned long flags; + int timeout; + u_long flags; - /* - * Test for input since pending input seems to block the output. - */ + /* + * Test for input since pending input seems to block the output. + */ - DISABLE_INTR (flags); + flags = splhigh(); - if (input_avail ()) - uart6850_input_loop (); + if (input_avail()) + uart6850_input_loop(); - RESTORE_INTR (flags); + splx(flags); - /* - * Sometimes it takes about 13000 loops before the output becomes ready - * (After reset). Normally it takes just about 10 loops. - */ + /* + * Sometimes it takes about 13000 loops before the output becomes + * ready (After reset). Normally it takes just about 10 loops. + */ - for (timeout = 30000; timeout > 0 && !output_ready (); timeout--); /* - * Wait - */ + for (timeout = 30000; timeout > 0 && !output_ready(); timeout--); /* Wait */ - if (!output_ready ()) - { - printk ("Midi6850: Timeout\n"); - return 0; + if (!output_ready()) { + printf("Midi6850: Timeout\n"); + return 0; } - - uart6850_write (midi_byte); - return 1; + uart6850_write(midi_byte); + return 1; } static int -uart6850_command (int dev, unsigned char *midi_byte) +uart6850_command(int dev, u_char *midi_byte) { - return 1; + return 1; } static int -uart6850_start_read (int dev) +uart6850_start_read(int dev) { - return 0; + return 0; } static int -uart6850_end_read (int dev) +uart6850_end_read(int dev) { - return 0; + return 0; } static int -uart6850_ioctl (int dev, unsigned cmd, unsigned arg) +uart6850_ioctl(int dev, u_int cmd, ioctl_arg arg) { - return RET_ERROR (EINVAL); + return -(EINVAL); } static void -uart6850_kick (int dev) +uart6850_kick(int dev) { } static int -uart6850_buffer_status (int dev) +uart6850_buffer_status(int dev) { - return 0; /* - * No data in buffers - */ + return 0; /* No data in buffers */ } #define MIDI_SYNTH_NAME "6850 UART Midi" @@ -240,88 +217,79 @@ uart6850_buffer_status (int dev) static struct midi_operations uart6850_operations = { - {"6850 UART", 0, 0, SNDCARD_UART6850}, - &std_midi_synth, - {0}, - uart6850_open, - uart6850_close, - uart6850_ioctl, - uart6850_out, - uart6850_start_read, - uart6850_end_read, - uart6850_kick, - uart6850_command, - uart6850_buffer_status + {"6850 UART", 0, 0, SNDCARD_UART6850}, + &std_midi_synth, + {0}, + uart6850_open, + uart6850_close, + uart6850_ioctl, + uart6850_out, + uart6850_start_read, + uart6850_end_read, + uart6850_kick, + uart6850_command, + uart6850_buffer_status }; -long -attach_uart6850 (long mem_start, struct address_info *hw_config) +void +attach_uart6850(struct address_info * hw_config) { - int ok, timeout; - unsigned long flags; + int ok, timeout; + u_long flags; - if (num_midis >= MAX_MIDI_DEV) - { - printk ("Sound: Too many midi devices detected\n"); - return mem_start; + if (num_midis >= MAX_MIDI_DEV) { + printf("Sound: Too many midi devices detected\n"); + return ; } + uart6850_base = hw_config->io_base; + uart6850_osp = hw_config->osp; + uart6850_irq = hw_config->irq; - uart6850_base = hw_config->io_base; - uart6850_irq = hw_config->irq; - - if (!uart6850_detected) - return RET_ERROR (EIO); + if (!uart6850_detected) + return ; - DISABLE_INTR (flags); + flags = splhigh(); - for (timeout = 30000; timeout < 0 && !output_ready (); timeout--); /* - * Wait - */ - uart6850_cmd (UART_MODE_ON); + for (timeout = 30000; timeout < 0 && !output_ready(); timeout--); /* Wait */ + uart6850_cmd(UART_MODE_ON); - ok = 1; + ok = 1; - RESTORE_INTR (flags); + splx(flags); -#if defined(__FreeBSD__) - printk ("uart0: <6850 Midi Interface>"); -#else - printk (" <6850 Midi Interface>"); -#endif + conf_printf("6850 Midi Interface", hw_config); - std_midi_synth.midi_dev = my_dev = num_midis; - midi_devs[num_midis++] = &uart6850_operations; - return mem_start; + std_midi_synth.midi_dev = my_dev = num_midis; + midi_devs[num_midis++] = &uart6850_operations; + return ; } static int -reset_uart6850 (void) +reset_uart6850(void) { - uart6850_read (); - return 1; /* - * OK - */ + uart6850_read(); + return 1; /* OK */ } int -probe_uart6850 (struct address_info *hw_config) +probe_uart6850(struct address_info * hw_config) { - int ok = 0; + int ok = 0; - uart6850_base = hw_config->io_base; - uart6850_irq = hw_config->irq; + uart6850_osp = hw_config->osp; + uart6850_base = hw_config->io_base; + uart6850_irq = hw_config->irq; - if (snd_set_irq_handler (uart6850_irq, m6850intr, "MIDI6850") < 0) - return 0; + if (snd_set_irq_handler(uart6850_irq, m6850intr, uart6850_osp) < 0) + return 0; - ok = reset_uart6850 (); + ok = reset_uart6850(); - uart6850_detected = ok; - return ok; + uart6850_detected = ok; + return ok; } #endif - #endif diff --git a/sys/i386/isa/sound/ultrasound.h b/sys/i386/isa/sound/ultrasound.h new file mode 100644 index 0000000..5c63b03 --- /dev/null +++ b/sys/i386/isa/sound/ultrasound.h @@ -0,0 +1,137 @@ +#ifndef _ULTRASOUND_H_ +#define _ULTRASOUND_H_ +/* + * Copyright by Hannu Savolainen 1993 + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +/* + * ultrasound.h - Macros for programming the Gravis Ultrasound + * These macros are extremely device dependent + * and not portable. + */ + +/* + * Private events for Gravis Ultrasound (GUS) + * + * Format: + * byte 0 - SEQ_PRIVATE (0xfe) + * byte 1 - Synthesizer device number (0-N) + * byte 2 - Command (see below) + * byte 3 - Voice number (0-31) + * bytes 4 and 5 - parameter P1 (u_short) + * bytes 6 and 7 - parameter P2 (u_short) + * + * Commands: + * Each command affects one voice defined in byte 3. + * Unused parameters (P1 and/or P2 *MUST* be initialized to zero). + * _GUS_NUMVOICES - Sets max. number of concurrent voices (P1=14-31, default 16) + * _GUS_VOICESAMPLE- ************ OBSOLETE ************* + * _GUS_VOICEON - Starts voice (P1=voice mode) + * _GUS_VOICEOFF - Stops voice (no parameters) + * _GUS_VOICEFADE - Stops the voice smoothly. + * _GUS_VOICEMODE - Alters the voice mode, don't start or stop voice (P1=voice mode) + * _GUS_VOICEBALA - Sets voice balence (P1, 0=left, 7=middle and 15=right, default 7) + * _GUS_VOICEFREQ - Sets voice (sample) playback frequency (P1=Hz) + * _GUS_VOICEVOL - Sets voice volume (P1=volume, 0xfff=max, 0xeff=half, 0x000=off) + * _GUS_VOICEVOL2 - Sets voice volume (P1=volume, 0xfff=max, 0xeff=half, 0x000=off) + * (Like GUS_VOICEVOL but doesn't change the hw + * volume. It just updates volume in the voice table). + * + * _GUS_RAMPRANGE - Sets limits for volume ramping (P1=low volume, P2=high volume) + * _GUS_RAMPRATE - Sets the speed for volume ramping (P1=scale, P2=rate) + * _GUS_RAMPMODE - Sets the volume ramping mode (P1=ramping mode) + * _GUS_RAMPON - Starts volume ramping (no parameters) + * _GUS_RAMPOFF - Stops volume ramping (no parameters) + * _GUS_VOLUME_SCALE - Changes the volume calculation constants + * for all voices. + */ + +#define _GUS_NUMVOICES 0x00 +#define _GUS_VOICESAMPLE 0x01 /* OBSOLETE */ +#define _GUS_VOICEON 0x02 +#define _GUS_VOICEOFF 0x03 +#define _GUS_VOICEMODE 0x04 +#define _GUS_VOICEBALA 0x05 +#define _GUS_VOICEFREQ 0x06 +#define _GUS_VOICEVOL 0x07 +#define _GUS_RAMPRANGE 0x08 +#define _GUS_RAMPRATE 0x09 +#define _GUS_RAMPMODE 0x0a +#define _GUS_RAMPON 0x0b +#define _GUS_RAMPOFF 0x0c +#define _GUS_VOICEFADE 0x0d +#define _GUS_VOLUME_SCALE 0x0e +#define _GUS_VOICEVOL2 0x0f +#define _GUS_VOICE_POS 0x10 + +/* + * GUS API macros + */ + +#define _GUS_CMD(chn, voice, cmd, p1, p2) {\ + _SEQ_NEEDBUF(8); _seqbuf[_seqbufptr] = SEQ_PRIVATE;\ + _seqbuf[_seqbufptr+1] = (chn); _seqbuf[_seqbufptr+2] = cmd;\ + _seqbuf[_seqbufptr+3] = voice;\ + *(u_short*)&_seqbuf[_seqbufptr+4] = p1;\ + *(u_short*)&_seqbuf[_seqbufptr+6] = p2;\ + _SEQ_ADVBUF(8);} + +#define GUS_NUMVOICES(chn, p1) _GUS_CMD(chn, 0, _GUS_NUMVOICES, (p1), 0) +#define GUS_VOICESAMPLE(chn, voice, p1) \ + _GUS_CMD(chn, voice, _GUS_VOICESAMPLE, (p1), 0) /* OBSOLETE */ +#define GUS_VOICEON(chn, voice, p1) \ + _GUS_CMD(chn, voice, _GUS_VOICEON, (p1), 0) +#define GUS_VOICEOFF(chn, voice) \ + _GUS_CMD(chn, voice, _GUS_VOICEOFF, 0, 0) +#define GUS_VOICEFADE(chn, voice) \ + _GUS_CMD(chn, voice, _GUS_VOICEFADE, 0, 0) +#define GUS_VOICEMODE(chn, voice, p1) \ + _GUS_CMD(chn, voice, _GUS_VOICEMODE, (p1), 0) +#define GUS_VOICEBALA(chn, voice, p1) \ + _GUS_CMD(chn, voice, _GUS_VOICEBALA, (p1), 0) +#define GUS_VOICEFREQ(chn, voice, p) \ + _GUS_CMD(chn, voice, _GUS_VOICEFREQ, \ + (p) & 0xffff, ((p) >> 16) & 0xffff) +#define GUS_VOICEVOL(chn, voice, p1) \ + _GUS_CMD(chn, voice, _GUS_VOICEVOL, (p1), 0) +#define GUS_VOICEVOL2(chn, voice, p1) \ + _GUS_CMD(chn, voice, _GUS_VOICEVOL2, (p1), 0) +#define GUS_RAMPRANGE(chn, voice, low, high) \ + _GUS_CMD(chn, voice, _GUS_RAMPRANGE, (low), (high)) +#define GUS_RAMPRATE(chn, voice, p1, p2) \ + _GUS_CMD(chn, voice, _GUS_RAMPRATE, (p1), (p2)) +#define GUS_RAMPMODE(chn, voice, p1) \ + _GUS_CMD(chn, voice, _GUS_RAMPMODE, (p1), 0) +#define GUS_RAMPON(chn, voice, p1) \ + _GUS_CMD(chn, voice, _GUS_RAMPON, (p1), 0) +#define GUS_RAMPOFF(chn, voice) \ + _GUS_CMD(chn, voice, _GUS_RAMPOFF, 0, 0) +#define GUS_VOLUME_SCALE(chn, voice, p1, p2) \ + _GUS_CMD(chn, voice, _GUS_VOLUME_SCALE, (p1), (p2)) +#define GUS_VOICE_POS(chn, voice, p) \ + _GUS_CMD(chn, voice, _GUS_VOICE_POS, \ + (p) & 0xffff, ((p) >> 16) & 0xffff) + +#endif |