From a4b042e9d1c54f668ce11e3192e99747882c3e09 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 2 Oct 2000 03:13:50 +0000 Subject: Put on my nuclear-grade asbestos suit and cvs rm the old, broken, sound drivers (again). These drivers have not compiled for 5-6 months. Now that the new sound code supports MIDI, the major reason we had for reviving it is gone. It is a far better investment polishing the new midi code than trying to keep this on life support. Come 5.0-REL, if there are major shortcomings in the pcm sound driver then maybe we can rethink this, but until then we should focus on pcm. Remember, these have not been compilable since ~April-May this year. --- sys/conf/NOTES | 1 - sys/conf/files.i386 | 64 - sys/conf/files.pc98 | 65 - sys/gnu/i386/isa/sound/awe_compat.h | 218 -- sys/gnu/i386/isa/sound/awe_config.h | 149 -- sys/gnu/i386/isa/sound/awe_hw.h | 100 - sys/gnu/i386/isa/sound/awe_version.h | 35 - sys/gnu/i386/isa/sound/awe_voice.h | 490 ---- sys/gnu/i386/isa/sound/awe_wave.c | 4574 --------------------------------- sys/i386/conf/NOTES | 1 - sys/i386/include/ultrasound.h | 122 - sys/i386/isa/sound/CHANGELOG | 200 -- sys/i386/isa/sound/COPYING | 25 - sys/i386/isa/sound/README | 86 - sys/i386/isa/sound/README.FREEBSD | 165 -- sys/i386/isa/sound/Readme | 248 -- sys/i386/isa/sound/Readme.aedsp16 | 6 - sys/i386/isa/sound/Readme.cards | 845 ------- sys/i386/isa/sound/Readme.modules | 99 - sys/i386/isa/sound/Readme.v30 | 140 -- sys/i386/isa/sound/ad1848.c | 1867 -------------- sys/i386/isa/sound/ad1848_mixer.h | 142 -- sys/i386/isa/sound/adlib_card.c | 46 - sys/i386/isa/sound/aedsp16.c | 0 sys/i386/isa/sound/alaw.h | 73 - sys/i386/isa/sound/audio.c | 440 ---- sys/i386/isa/sound/coproc.h | 12 - sys/i386/isa/sound/cs4232.c | 202 -- sys/i386/isa/sound/dev_table.c | 259 -- sys/i386/isa/sound/dev_table.h | 604 ----- sys/i386/isa/sound/dmabuf.c | 1606 ------------ sys/i386/isa/sound/finetune.h | 49 - sys/i386/isa/sound/gus_card.c | 188 -- sys/i386/isa/sound/gus_hw.h | 50 - sys/i386/isa/sound/gus_linearvol.h | 18 - sys/i386/isa/sound/gus_midi.c | 274 -- sys/i386/isa/sound/gus_vol.c | 138 - sys/i386/isa/sound/gus_wave.c | 4587 ---------------------------------- sys/i386/isa/sound/hex2hex.h | 97 - sys/i386/isa/sound/ics2101.c | 233 -- sys/i386/isa/sound/iwdefs.h | 712 ------ sys/i386/isa/sound/local.h | 195 -- sys/i386/isa/sound/mad16.c | 524 ---- sys/i386/isa/sound/mad16.h | 91 - sys/i386/isa/sound/mad16_sb_midi.c | 285 --- sys/i386/isa/sound/maui.c | 225 -- sys/i386/isa/sound/midi_ctrl.h | 22 - sys/i386/isa/sound/midi_synth.c | 675 ----- sys/i386/isa/sound/midi_synth.h | 49 - sys/i386/isa/sound/midibuf.c | 431 ---- sys/i386/isa/sound/mmap_test.c | 265 -- sys/i386/isa/sound/mpu401.c | 1644 ------------ sys/i386/isa/sound/opl3.c | 1137 --------- sys/i386/isa/sound/opl3.h | 261 -- sys/i386/isa/sound/os.h | 101 - sys/i386/isa/sound/pas2_card.c | 361 --- sys/i386/isa/sound/pas2_midi.c | 285 --- sys/i386/isa/sound/pas2_mixer.c | 325 --- sys/i386/isa/sound/pas2_pcm.c | 449 ---- sys/i386/isa/sound/pas_defs.h | 250 -- sys/i386/isa/sound/pas_hw.h | 236 -- sys/i386/isa/sound/patmgr.c | 267 -- sys/i386/isa/sound/pcm86.c | 2212 ---------------- sys/i386/isa/sound/pss.c | 693 ----- sys/i386/isa/sound/pss.h | 371 --- sys/i386/isa/sound/sb16_dsp.c | 561 ----- sys/i386/isa/sound/sb16_midi.c | 311 --- sys/i386/isa/sound/sb_card.c | 67 - sys/i386/isa/sound/sb_defs.h | 43 - sys/i386/isa/sound/sb_dsp.c | 1155 --------- sys/i386/isa/sound/sb_midi.c | 211 -- sys/i386/isa/sound/sb_mixer.c | 529 ---- sys/i386/isa/sound/sb_mixer.h | 255 -- sys/i386/isa/sound/sbcard.h | 72 - sys/i386/isa/sound/sequencer.c | 1824 -------------- sys/i386/isa/sound/sound.doc | 120 - sys/i386/isa/sound/sound_calls.h | 293 --- sys/i386/isa/sound/sound_config.h | 211 -- sys/i386/isa/sound/sound_pnp.c | 186 -- sys/i386/isa/sound/sound_switch.c | 499 ---- sys/i386/isa/sound/sound_timer.c | 344 --- sys/i386/isa/sound/soundcard.c | 679 ----- sys/i386/isa/sound/soundvers.h | 2 - sys/i386/isa/sound/sscape.c | 921 ------- sys/i386/isa/sound/sys_timer.c | 276 -- sys/i386/isa/sound/trix.c | 368 --- sys/i386/isa/sound/trix_boot.h | 2488 ------------------ sys/i386/isa/sound/tuning.h | 29 - sys/i386/isa/sound/uart6850.c | 296 --- sys/i386/isa/sound/ulaw.h | 71 - sys/i386/isa/sound/ultrasound.h | 137 - 91 files changed, 42532 deletions(-) delete mode 100644 sys/gnu/i386/isa/sound/awe_compat.h delete mode 100644 sys/gnu/i386/isa/sound/awe_config.h delete mode 100644 sys/gnu/i386/isa/sound/awe_hw.h delete mode 100644 sys/gnu/i386/isa/sound/awe_version.h delete mode 100644 sys/gnu/i386/isa/sound/awe_voice.h delete mode 100644 sys/gnu/i386/isa/sound/awe_wave.c delete mode 100644 sys/i386/include/ultrasound.h delete mode 100644 sys/i386/isa/sound/CHANGELOG delete mode 100644 sys/i386/isa/sound/COPYING delete mode 100644 sys/i386/isa/sound/README delete mode 100644 sys/i386/isa/sound/README.FREEBSD delete mode 100644 sys/i386/isa/sound/Readme delete mode 100644 sys/i386/isa/sound/Readme.aedsp16 delete mode 100644 sys/i386/isa/sound/Readme.cards delete mode 100644 sys/i386/isa/sound/Readme.modules delete mode 100644 sys/i386/isa/sound/Readme.v30 delete mode 100644 sys/i386/isa/sound/ad1848.c delete mode 100644 sys/i386/isa/sound/ad1848_mixer.h delete mode 100644 sys/i386/isa/sound/adlib_card.c delete mode 100644 sys/i386/isa/sound/aedsp16.c delete mode 100644 sys/i386/isa/sound/alaw.h delete mode 100644 sys/i386/isa/sound/audio.c delete mode 100644 sys/i386/isa/sound/coproc.h delete mode 100644 sys/i386/isa/sound/cs4232.c delete mode 100644 sys/i386/isa/sound/dev_table.c delete mode 100644 sys/i386/isa/sound/dev_table.h delete mode 100644 sys/i386/isa/sound/dmabuf.c delete mode 100644 sys/i386/isa/sound/finetune.h delete mode 100644 sys/i386/isa/sound/gus_card.c delete mode 100644 sys/i386/isa/sound/gus_hw.h delete mode 100644 sys/i386/isa/sound/gus_linearvol.h delete mode 100644 sys/i386/isa/sound/gus_midi.c delete mode 100644 sys/i386/isa/sound/gus_vol.c delete mode 100644 sys/i386/isa/sound/gus_wave.c delete mode 100644 sys/i386/isa/sound/hex2hex.h delete mode 100644 sys/i386/isa/sound/ics2101.c delete mode 100644 sys/i386/isa/sound/iwdefs.h delete mode 100644 sys/i386/isa/sound/local.h delete mode 100644 sys/i386/isa/sound/mad16.c delete mode 100644 sys/i386/isa/sound/mad16.h delete mode 100644 sys/i386/isa/sound/mad16_sb_midi.c delete mode 100644 sys/i386/isa/sound/maui.c delete mode 100644 sys/i386/isa/sound/midi_ctrl.h delete mode 100644 sys/i386/isa/sound/midi_synth.c delete mode 100644 sys/i386/isa/sound/midi_synth.h delete mode 100644 sys/i386/isa/sound/midibuf.c delete mode 100644 sys/i386/isa/sound/mmap_test.c delete mode 100644 sys/i386/isa/sound/mpu401.c delete mode 100644 sys/i386/isa/sound/opl3.c delete mode 100644 sys/i386/isa/sound/opl3.h delete mode 100644 sys/i386/isa/sound/os.h delete mode 100644 sys/i386/isa/sound/pas2_card.c delete mode 100644 sys/i386/isa/sound/pas2_midi.c delete mode 100644 sys/i386/isa/sound/pas2_mixer.c delete mode 100644 sys/i386/isa/sound/pas2_pcm.c delete mode 100644 sys/i386/isa/sound/pas_defs.h delete mode 100644 sys/i386/isa/sound/pas_hw.h delete mode 100644 sys/i386/isa/sound/patmgr.c delete mode 100644 sys/i386/isa/sound/pcm86.c delete mode 100644 sys/i386/isa/sound/pss.c delete mode 100644 sys/i386/isa/sound/pss.h delete mode 100644 sys/i386/isa/sound/sb16_dsp.c delete mode 100644 sys/i386/isa/sound/sb16_midi.c delete mode 100644 sys/i386/isa/sound/sb_card.c delete mode 100644 sys/i386/isa/sound/sb_defs.h delete mode 100644 sys/i386/isa/sound/sb_dsp.c delete mode 100644 sys/i386/isa/sound/sb_midi.c delete mode 100644 sys/i386/isa/sound/sb_mixer.c delete mode 100644 sys/i386/isa/sound/sb_mixer.h delete mode 100644 sys/i386/isa/sound/sbcard.h delete mode 100644 sys/i386/isa/sound/sequencer.c delete mode 100644 sys/i386/isa/sound/sound.doc delete mode 100644 sys/i386/isa/sound/sound_calls.h delete mode 100644 sys/i386/isa/sound/sound_config.h delete mode 100644 sys/i386/isa/sound/sound_pnp.c delete mode 100644 sys/i386/isa/sound/sound_switch.c delete mode 100644 sys/i386/isa/sound/sound_timer.c delete mode 100644 sys/i386/isa/sound/soundcard.c delete mode 100644 sys/i386/isa/sound/soundvers.h delete mode 100644 sys/i386/isa/sound/sscape.c delete mode 100644 sys/i386/isa/sound/sys_timer.c delete mode 100644 sys/i386/isa/sound/trix.c delete mode 100644 sys/i386/isa/sound/trix_boot.h delete mode 100644 sys/i386/isa/sound/tuning.h delete mode 100644 sys/i386/isa/sound/uart6850.c delete mode 100644 sys/i386/isa/sound/ulaw.h delete mode 100644 sys/i386/isa/sound/ultrasound.h diff --git a/sys/conf/NOTES b/sys/conf/NOTES index 08e1904..1fee050 100644 --- a/sys/conf/NOTES +++ b/sys/conf/NOTES @@ -1815,7 +1815,6 @@ hint.gusc.0.irq="5" hint.gusc.0.drq="1" hint.gusc.0.flags="0x13" -# Not controlled by `snd' device pca hint.pca.0.at="isa" hint.pca.0.port="0x040" diff --git a/sys/conf/files.i386 b/sys/conf/files.i386 index 296e434..56db24f 100644 --- a/sys/conf/files.i386 +++ b/sys/conf/files.i386 @@ -156,7 +156,6 @@ gnu/i386/fpemul/wm_shrx.s optional gpl_math_emulate gnu/i386/fpemul/wm_sqrt.s optional gpl_math_emulate gnu/i386/isa/dgb.c count dgb gnu/i386/isa/dgm.c count dgm -gnu/i386/isa/sound/awe_wave.c optional awe i386/apm/apm.c count apm i386/i386/atomic.c standard \ compile-with "${CC} -c ${CFLAGS} ${DEFINED_PROF:S/^$/-fomit-frame-pointer/} ${.IMPSRC}" @@ -269,69 +268,6 @@ i386/isa/prof_machdep.c optional profiling-routine i386/isa/rc.c count rc #i386/isa/rp.c optional rp i386/isa/scd.c count scd -i386/isa/sound/ad1848.c optional css -i386/isa/sound/ad1848.c optional gus -i386/isa/sound/ad1848.c optional gusxvi -i386/isa/sound/ad1848.c optional mss -i386/isa/sound/ad1848.c optional sscape -i386/isa/sound/ad1848.c optional sscape_mss -i386/isa/sound/ad1848.c optional trix -i386/isa/sound/adlib_card.c optional opl -i386/isa/sound/adlib_card.c optional trix -i386/isa/sound/audio.c optional snd \ - warning "The snd drivers are deprecated. Please see pcm/sbc/etc." -i386/isa/sound/cs4232.c optional css -i386/isa/sound/dev_table.c optional snd -i386/isa/sound/dmabuf.c optional snd -i386/isa/sound/gus_card.c optional gus -i386/isa/sound/gus_midi.c optional gus -i386/isa/sound/gus_vol.c optional gus -i386/isa/sound/gus_wave.c optional gus -i386/isa/sound/ics2101.c optional gus -i386/isa/sound/midi_synth.c optional css -i386/isa/sound/midi_synth.c optional gus -i386/isa/sound/midi_synth.c optional mpu -i386/isa/sound/midi_synth.c optional mss -i386/isa/sound/midi_synth.c optional pas -i386/isa/sound/midi_synth.c optional sb -i386/isa/sound/midi_synth.c optional sscape -i386/isa/sound/midi_synth.c optional uart -i386/isa/sound/midibuf.c optional css -i386/isa/sound/midibuf.c optional gus -i386/isa/sound/midibuf.c optional mpu -i386/isa/sound/midibuf.c optional mss -i386/isa/sound/midibuf.c optional pas -i386/isa/sound/midibuf.c optional sb -i386/isa/sound/midibuf.c optional sscape -i386/isa/sound/midibuf.c optional uart -i386/isa/sound/mpu401.c optional mpu -i386/isa/sound/mpu401.c optional sscape -i386/isa/sound/opl3.c optional opl -i386/isa/sound/opl3.c optional trix -i386/isa/sound/pas2_card.c optional pas -i386/isa/sound/pas2_midi.c optional pas -i386/isa/sound/pas2_mixer.c optional pas -i386/isa/sound/pas2_pcm.c optional pas -i386/isa/sound/patmgr.c optional snd -i386/isa/sound/sb16_dsp.c optional sbxvi -i386/isa/sound/sb16_midi.c optional sbmidi -i386/isa/sound/sb_card.c optional sb -i386/isa/sound/sb_dsp.c optional sb -i386/isa/sound/sb_midi.c optional sb -i386/isa/sound/sb_mixer.c optional sb -i386/isa/sound/sequencer.c optional snd -i386/isa/sound/sound_switch.c optional snd -i386/isa/sound/sound_timer.c optional css -i386/isa/sound/sound_timer.c optional gus -i386/isa/sound/sound_timer.c optional mss -i386/isa/sound/sound_timer.c optional mss -i386/isa/sound/sound_timer.c optional sscape -i386/isa/sound/sound_timer.c optional trix -i386/isa/sound/soundcard.c optional snd -i386/isa/sound/sscape.c optional sscape -i386/isa/sound/sys_timer.c optional snd -i386/isa/sound/trix.c optional trix -i386/isa/sound/uart6850.c optional uart i386/isa/spigot.c count spigot i386/isa/spkr.c optional speaker i386/isa/stallion.c optional stl diff --git a/sys/conf/files.pc98 b/sys/conf/files.pc98 index e4dfe7b..70eba87 100644 --- a/sys/conf/files.pc98 +++ b/sys/conf/files.pc98 @@ -144,7 +144,6 @@ gnu/i386/fpemul/wm_shrx.s optional gpl_math_emulate gnu/i386/fpemul/wm_sqrt.s optional gpl_math_emulate gnu/i386/isa/dgb.c count dgb gnu/i386/isa/dgm.c count dgm -gnu/i386/isa/sound/awe_wave.c optional awe i386/apm/apm.c count apm i386/i386/atomic.c standard \ compile-with "${CC} -c ${CFLAGS} ${DEFINED_PROF:S/^$/-fomit-frame-pointer/} ${.IMPSRC}" @@ -252,70 +251,6 @@ i386/isa/prof_machdep.c optional profiling-routine i386/isa/rc.c count rc #i386/isa/rp.c optional rp i386/isa/scd.c count scd -i386/isa/sound/ad1848.c optional css -i386/isa/sound/ad1848.c optional gus -i386/isa/sound/ad1848.c optional gusxvi -i386/isa/sound/ad1848.c optional mss -i386/isa/sound/ad1848.c optional sscape -i386/isa/sound/ad1848.c optional sscape_mss -i386/isa/sound/ad1848.c optional trix -i386/isa/sound/adlib_card.c optional opl -i386/isa/sound/adlib_card.c optional trix -i386/isa/sound/audio.c optional snd -i386/isa/sound/cs4232.c optional css -i386/isa/sound/dev_table.c optional snd -i386/isa/sound/dmabuf.c optional snd -i386/isa/sound/gus_card.c optional gus -i386/isa/sound/gus_midi.c optional gus -i386/isa/sound/gus_vol.c optional gus -i386/isa/sound/gus_wave.c optional gus -i386/isa/sound/ics2101.c optional gus -i386/isa/sound/midi_synth.c optional css -i386/isa/sound/midi_synth.c optional gus -i386/isa/sound/midi_synth.c optional mpu -i386/isa/sound/midi_synth.c optional mss -i386/isa/sound/midi_synth.c optional pas -i386/isa/sound/midi_synth.c optional sb -i386/isa/sound/midi_synth.c optional sscape -i386/isa/sound/midi_synth.c optional uart -i386/isa/sound/midibuf.c optional css -i386/isa/sound/midibuf.c optional gus -i386/isa/sound/midibuf.c optional mpu -i386/isa/sound/midibuf.c optional mss -i386/isa/sound/midibuf.c optional nss -i386/isa/sound/midibuf.c optional pas -i386/isa/sound/midibuf.c optional sb -i386/isa/sound/midibuf.c optional sscape -i386/isa/sound/midibuf.c optional uart -i386/isa/sound/mpu401.c optional mpu -i386/isa/sound/mpu401.c optional sscape -i386/isa/sound/opl3.c optional opl -i386/isa/sound/opl3.c optional trix -i386/isa/sound/pas2_card.c optional pas -i386/isa/sound/pas2_midi.c optional pas -i386/isa/sound/pas2_mixer.c optional pas -i386/isa/sound/pas2_pcm.c optional pas -i386/isa/sound/patmgr.c optional snd -i386/isa/sound/pcm86.c optional nss -i386/isa/sound/sb16_dsp.c optional sbxvi -i386/isa/sound/sb16_midi.c optional sbmidi -i386/isa/sound/sb_card.c optional sb -i386/isa/sound/sb_dsp.c optional sb -i386/isa/sound/sb_midi.c optional sb -i386/isa/sound/sb_mixer.c optional sb -i386/isa/sound/sequencer.c optional snd -i386/isa/sound/sound_switch.c optional snd -i386/isa/sound/sound_timer.c optional css -i386/isa/sound/sound_timer.c optional gus -i386/isa/sound/sound_timer.c optional mss -i386/isa/sound/sound_timer.c optional mss -i386/isa/sound/sound_timer.c optional sscape -i386/isa/sound/sound_timer.c optional trix -i386/isa/sound/soundcard.c optional snd -i386/isa/sound/sscape.c optional sscape -i386/isa/sound/sys_timer.c optional snd -i386/isa/sound/trix.c optional trix -i386/isa/sound/uart6850.c optional uart i386/isa/spigot.c count spigot i386/isa/stallion.c optional stl i386/isa/tw.c count tw diff --git a/sys/gnu/i386/isa/sound/awe_compat.h b/sys/gnu/i386/isa/sound/awe_compat.h deleted file mode 100644 index c2b0ee5..0000000 --- a/sys/gnu/i386/isa/sound/awe_compat.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - * sound/awe_compat.h - * - * Compat defines for the AWE32/Sound Blaster 32 wave table synth. driver - * version 0.4.2c; Oct. 7, 1997 - * - * Copyright (C) 1996,1997 Takashi Iwai - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/*---------------------------------------------------------------- - * compatibility macros for AWE32 driver - *----------------------------------------------------------------*/ - -/* redefine following macros */ -#undef IOCTL_IN -#undef IOCTL_OUT -#undef OUTW -#undef COPY_FROM_USER -#undef COPY_TO_USER -#undef GET_BYTE_FROM_USER -#undef GET_SHORT_FROM_USER -#undef IOCTL_TO_USER - -#ifdef linux - -/*================================================================ - * Linux macros - *================================================================*/ - -/* use inline prefix */ -#define INLINE inline - -/*---------------------------------------------------------------- - * memory management for linux - *----------------------------------------------------------------*/ - -#ifdef AWE_OBSOLETE_VOXWARE -/* old type linux system */ - -/* i/o requests; nothing */ -#define awe_check_port() 0 /* always false */ -#define awe_request_region() /* nothing */ -#define awe_release_region() /* nothing */ - -static int _mem_start; /* memory pointer for permanent buffers */ - -#define my_malloc_init(memptr) _mem_start = (memptr) -#define my_malloc_memptr() _mem_start -#define my_free(ptr) /* do nothing */ -#define my_realloc(buf,oldsize,size) NULL /* no realloc */ - -static void *my_malloc(int size) -{ - char *ptr; - PERMANENT_MALLOC(ptr, char*, size, _mem_start); - return (void*)ptr; -} - -/* allocate buffer only once */ -#define INIT_TABLE(buffer,index,nums,type) {\ -buffer = my_malloc(sizeof(type) * (nums)); index = (nums);\ -} - -#else - -#define AWE_DYNAMIC_BUFFER - -#define my_malloc_init(ptr) /* nothing */ -#define my_malloc_memptr() 0 -#define my_malloc(size) vmalloc(size) -#define my_free(ptr) if (ptr) {vfree(ptr);} - -static void *my_realloc(void *buf, int oldsize, int size) -{ - void *ptr; - if ((ptr = vmalloc(size)) == NULL) - return NULL; - memcpy(ptr, buf, ((oldsize < size) ? oldsize : size) ); - vfree(buf); - return ptr; -} - -/* do not allocate buffer at beginning */ -#define INIT_TABLE(buffer,index,nums,type) {buffer=NULL; index=0;} - -/* old type macro */ -#define RET_ERROR(err) -err - -#endif - -/*---------------------------------------------------------------- - * i/o interfaces for linux - *----------------------------------------------------------------*/ - -#define OUTW(data,addr) outw(data, addr) - -#ifdef AWE_NEW_KERNEL_INTERFACE -#define COPY_FROM_USER(target,source,offs,count) \ - copy_from_user(target, (source)+(offs), count) -#define GET_BYTE_FROM_USER(target,addr,offs) \ - get_user(target, (unsigned char*)&((addr)[offs])) -#define GET_SHORT_FROM_USER(target,addr,offs) \ - get_user(target, (unsigned short*)&((addr)[offs])) -#ifdef AWE_OSS38 -#define IOCTL_TO_USER(target,offs,source,count) \ - memcpy(target, (source)+(offs), count) -#define IO_WRITE_CHECK(cmd) (_SIOC_DIR(cmd) & _IOC_WRITE) -#else -#define IOCTL_TO_USER(target,offs,source,count) \ - copy_to_user(target, (source)+(offs), count) -#define IO_WRITE_CHECK(cmd) (_IOC_DIR(cmd) & _IOC_WRITE) -#endif /* AWE_OSS38 */ -#define COPY_TO_USER IOCTL_TO_USER -#define IOCTL_IN(arg) (*(int*)(arg)) -#define IOCTL_OUT(arg,val) (*(int*)(arg) = (val)) - -#else /* old type i/o */ -#define COPY_FROM_USER(target,source,offs,count) \ - memcpy_fromfs(target, (source)+(offs), (count)) -#define GET_BYTE_FROM_USER(target,addr,offs) \ - *((char *)&(target)) = get_fs_byte((addr)+(offs)) -#define GET_SHORT_FROM_USER(target,addr,offs) \ - *((short *)&(target)) = get_fs_word((addr)+(offs)) -#define IOCTL_TO_USER(target,offs,source,count) \ - memcpy_tofs(target, (source)+(offs), (count)) -#define COPY_TO_USER IOCTL_TO_USER -#define IO_WRITE_CHECK(cmd) (cmd & IOC_IN) -#define IOCTL_IN(arg) get_fs_long((long *)(arg)) -#define IOCTL_OUT(arg,ret) snd_ioctl_return((int *)arg, ret) - -#endif /* AWE_NEW_KERNEL_INTERFACE */ - -#define BZERO(target,len) memset(target, 0, len) -#define MEMCPY(dst,src,len) memcpy(dst, src, len) - - -#elif defined(__FreeBSD__) - -/*================================================================ - * FreeBSD macros - *================================================================*/ - -/* inline is not checked yet.. maybe it'll work */ -#define INLINE /*inline*/ - -/*---------------------------------------------------------------- - * memory management for freebsd - *----------------------------------------------------------------*/ - -/* i/o requests; nothing */ -#define awe_check_port() 0 /* always false */ -#define awe_request_region() /* nothing */ -#define awe_release_region() /* nothing */ - -#define AWE_DYNAMIC_BUFFER - -#define my_malloc_init(ptr) /* nothing */ -#define my_malloc_memptr() 0 -#define my_malloc(size) malloc(size, M_TEMP, M_WAITOK) -#define my_free(ptr) if (ptr) {free(ptr, M_TEMP);} - -#define INIT_TABLE(buffer,index,nums,type) {buffer=NULL; index=0;} - -/* it should be realloc? */ -static void *my_realloc(void *buf, int oldsize, int size) -{ - void *ptr; - if ((ptr = my_malloc(size)) == NULL) - return NULL; - memcpy(ptr, buf, ((oldsize < size) ? oldsize : size) ); - my_free(buf); - return ptr; -} - -/*---------------------------------------------------------------- - * i/o interfaces for freebsd - *----------------------------------------------------------------*/ - -/* according to linux rule; the arguments are swapped */ -#define OUTW(data,addr) outw(addr, data) - -#define COPY_FROM_USER(target,source,offs,count) \ - uiomove(((caddr_t)(target)),(count),((struct uio *)(source))) -#define COPY_TO_USER(target,source,offs,count) \ - uiomove(((caddr_t)(source)),(count),((struct uio *)(target))) -#define GET_BYTE_FROM_USER(target,addr,offs) \ - uiomove(((char*)&(target)), 1, ((struct uio *)(addr))) -#define GET_SHORT_FROM_USER(target,addr,offs) \ - uiomove(((char*)&(target)), 2, ((struct uio *)(addr))) -#define IOCTL_TO_USER(target,offs,source,count) \ - memcpy(&((target)[offs]), (source), (count)) -#define IO_WRITE_CHECK(cmd) (cmd & IOC_IN) -#define IOCTL_IN(arg) (*(int*)(arg)) -#define IOCTL_OUT(arg,val) (*(int*)(arg) = (val)) -#define BZERO(target,len) bzero((caddr_t)target, len) -#define MEMCPY(dst,src,len) bcopy((caddr_t)src, (caddr_t)dst, len) - -#ifndef AWE_OBSOLETE_VOXWARE -# define printk printf -# define RET_ERROR(err) -err -#endif - -#endif - diff --git a/sys/gnu/i386/isa/sound/awe_config.h b/sys/gnu/i386/isa/sound/awe_config.h deleted file mode 100644 index 70efaac..0000000 --- a/sys/gnu/i386/isa/sound/awe_config.h +++ /dev/null @@ -1,149 +0,0 @@ -/* - * sound/awe_config.h - * - * Configuration of AWE32 sound driver - * version 0.4.2; Sep. 15, 1997 - * - * Copyright (C) 1996 Takashi Iwai - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef AWE_CONFIG_H_DEF -#define AWE_CONFIG_H_DEF - -/*---------------------------------------------------------------- - * system configuration - *----------------------------------------------------------------*/ - -/* if you're using obsolete VoxWare 3.0.x on Linux 1.2.x (or pre-Voxware 3.5 - * versions of FreeBSD), define the following line. - */ -#undef AWE_OBSOLETE_VOXWARE - -/* if you're using OSS-Lite on Linux 2.1.6 or later, define the - * following line. - */ -#undef AWE_NEW_KERNEL_INTERFACE - -/* if you have lowlevel.h in the lowlevel directory (OSS-Lite), define - * the following line. - */ -#undef HAS_LOWLEVEL_H - -/* if your system doesn't support patch manager (OSS 3.7 or newer), - * define the following line. - */ -#undef AWE_NO_PATCHMGR - -/* if your system has an additional parameter (OSS 3.8b5 or newer), - * define this. - */ -#undef AWE_OSS38 - -/*---------------------------------------------------------------- - * AWE32 card configuration: - * uncomment the following lines only when auto detection doesn't - * work properly on your machine. - *----------------------------------------------------------------*/ - -/*#define AWE_DEFAULT_BASE_ADDR 0x620*/ /* base port address */ -/*#define AWE_DEFAULT_MEM_SIZE 512*/ /* kbytes */ - - -/*---------------------------------------------------------------- - * maximum size of soundfont list table: - * you usually don't need to touch this value. - *----------------------------------------------------------------*/ - -#define AWE_MAX_SF_LISTS 16 - - -/*---------------------------------------------------------------- - * chunk size of sample and voice tables: - * you usually don't need to touch these values. - *----------------------------------------------------------------*/ - -#define AWE_MAX_SAMPLES 400 -#define AWE_MAX_INFOS 800 - - -/*---------------------------------------------------------------- - * chorus & reverb effects send for FM chip: from 0 to 0xff - * larger numbers often cause weird sounds. - *----------------------------------------------------------------*/ - -#define DEF_FM_CHORUS_DEPTH 0x10 -#define DEF_FM_REVERB_DEPTH 0x10 - - -/*----------------------------------------------------------------* - * other compile conditions - *----------------------------------------------------------------*/ - -/* initialize FM passthrough even without extended RAM */ -#undef AWE_ALWAYS_INIT_FM - -/* debug on */ -#define AWE_DEBUG_ON - -/* GUS compatible mode */ -#define AWE_HAS_GUS_COMPATIBILITY - -/* accept all notes/sounds off controls */ -#define AWE_ACCEPT_ALL_SOUNDS_CONTROL - -/* add mixer control of emu8000 equalizer */ -#define CONFIG_AWE32_MIXER - -/* look up voices according to MIDI channel priority */ -#define AWE_LOOKUP_MIDI_PRIORITY - -/*----------------------------------------------------------------*/ - -/* reading configuration of sound driver */ - -#ifdef AWE_OBSOLETE_VOXWARE - -#ifdef __FreeBSD__ -# include -#else -# include "sound_config.h" -#endif - -#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_AWE32) -#define CONFIG_AWE32_SYNTH -#endif - -#else /* AWE_OBSOLETE_VOXWARE */ - -#ifdef HAS_LOWLEVEL_H -#include "lowlevel.h" -#endif - -#ifdef __FreeBSD__ -# include -# if defined(CONFIGURE_SOUNDCARD) && defined(CONFIG_AWE32) -# define CONFIG_AWE32_SYNTH -# endif -#else -# include "../sound_config.h" -#endif - - -#endif /* AWE_OBSOLETE_VOXWARE */ - - -#endif /* AWE_CONFIG_H_DEF */ diff --git a/sys/gnu/i386/isa/sound/awe_hw.h b/sys/gnu/i386/isa/sound/awe_hw.h deleted file mode 100644 index 7d0d88e..0000000 --- a/sys/gnu/i386/isa/sound/awe_hw.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * sound/awe_hw.h - * - * Access routines and definitions for the low level driver for the - * AWE32/Sound Blaster 32 wave table synth. - * version 0.4.2; Sep. 15, 1997 - * - * Copyright (C) 1996,1997 Takashi Iwai - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef AWE_HW_H_DEF -#define AWE_HW_H_DEF - -/* - * Emu-8000 control registers - * name(channel) reg, port - */ - -#define awe_cmd_idx(reg,ch) (((reg)<< 5) | (ch)) - -#define Data0 0x620 /* doubleword r/w */ -#define Data1 0xA20 /* doubleword r/w */ -#define Data2 0xA22 /* word r/w */ -#define Data3 0xE20 /* word r/w */ -#define Pointer 0xE22 /* register pointer r/w */ - -#define AWE_CPF(ch) awe_cmd_idx(0,ch), Data0 /* DW: current pitch and fractional address */ -#define AWE_PTRX(ch) awe_cmd_idx(1,ch), Data0 /* DW: pitch target and reverb send */ -#define AWE_CVCF(ch) awe_cmd_idx(2,ch), Data0 /* DW: current volume and filter cutoff */ -#define AWE_VTFT(ch) awe_cmd_idx(3,ch), Data0 /* DW: volume and filter cutoff targets */ -#define AWE_PSST(ch) awe_cmd_idx(6,ch), Data0 /* DW: pan send and loop start address */ -#define AWE_CSL(ch) awe_cmd_idx(7,ch), Data0 /* DW: chorus send and loop end address */ -#define AWE_CCCA(ch) awe_cmd_idx(0,ch), Data1 /* DW: Q, control bits, and current address */ -#define AWE_HWCF4 awe_cmd_idx(1,9), Data1 /* DW: config dw 4 */ -#define AWE_HWCF5 awe_cmd_idx(1,10), Data1 /* DW: config dw 5 */ -#define AWE_HWCF6 awe_cmd_idx(1,13), Data1 /* DW: config dw 6 */ -#define AWE_HWCF7 awe_cmd_idx(1,14), Data1 /* DW: config dw 7? (not documented) */ -#define AWE_SMALR awe_cmd_idx(1,20), Data1 /* DW: sound memory address for left read */ -#define AWE_SMARR awe_cmd_idx(1,21), Data1 /* DW: for right read */ -#define AWE_SMALW awe_cmd_idx(1,22), Data1 /* DW: sound memory address for left write */ -#define AWE_SMARW awe_cmd_idx(1,23), Data1 /* DW: for right write */ -#define AWE_SMLD awe_cmd_idx(1,26), Data1 /* W: sound memory left data */ -#define AWE_SMRD awe_cmd_idx(1,26), Data2 /* W: right data */ -#define AWE_WC awe_cmd_idx(1,27), Data2 /* W: sample counter */ -#define AWE_WC_Cmd awe_cmd_idx(1,27) -#define AWE_WC_Port Data2 -#define AWE_HWCF1 awe_cmd_idx(1,29), Data1 /* W: config w 1 */ -#define AWE_HWCF2 awe_cmd_idx(1,30), Data1 /* W: config w 2 */ -#define AWE_HWCF3 awe_cmd_idx(1,31), Data1 /* W: config w 3 */ -#define AWE_INIT1(ch) awe_cmd_idx(2,ch), Data1 /* W: init array 1 */ -#define AWE_INIT2(ch) awe_cmd_idx(2,ch), Data2 /* W: init array 2 */ -#define AWE_INIT3(ch) awe_cmd_idx(3,ch), Data1 /* W: init array 3 */ -#define AWE_INIT4(ch) awe_cmd_idx(3,ch), Data2 /* W: init array 4 */ -#define AWE_ENVVOL(ch) awe_cmd_idx(4,ch), Data1 /* W: volume envelope delay */ -#define AWE_DCYSUSV(ch) awe_cmd_idx(5,ch), Data1 /* W: volume envelope sustain and decay */ -#define AWE_ENVVAL(ch) awe_cmd_idx(6,ch), Data1 /* W: modulation envelope delay */ -#define AWE_DCYSUS(ch) awe_cmd_idx(7,ch), Data1 /* W: modulation envelope sustain and decay */ -#define AWE_ATKHLDV(ch) awe_cmd_idx(4,ch), Data2 /* W: volume envelope attack and hold */ -#define AWE_LFO1VAL(ch) awe_cmd_idx(5,ch), Data2 /* W: LFO#1 Delay */ -#define AWE_ATKHLD(ch) awe_cmd_idx(6,ch), Data2 /* W: modulation envelope attack and hold */ -#define AWE_LFO2VAL(ch) awe_cmd_idx(7,ch), Data2 /* W: LFO#2 Delay */ -#define AWE_IP(ch) awe_cmd_idx(0,ch), Data3 /* W: initial pitch */ -#define AWE_IFATN(ch) awe_cmd_idx(1,ch), Data3 /* W: initial filter cutoff and attenuation */ -#define AWE_PEFE(ch) awe_cmd_idx(2,ch), Data3 /* W: pitch and filter envelope heights */ -#define AWE_FMMOD(ch) awe_cmd_idx(3,ch), Data3 /* W: vibrato and filter modulation freq */ -#define AWE_TREMFRQ(ch) awe_cmd_idx(4,ch), Data3 /* W: LFO#1 tremolo amount and freq */ -#define AWE_FM2FRQ2(ch) awe_cmd_idx(5,ch), Data3 /* W: LFO#2 vibrato amount and freq */ - -/* used during detection (returns ROM version?; not documented in ADIP) */ -#define AWE_U1 0xE0, Data3 /* (R)(W) used in initialization */ -#define AWE_U2(ch) 0xC0+(ch), Data3 /* (W)(W) used in init envelope */ - - -#define AWE_MAX_VOICES 32 -#define AWE_NORMAL_VOICES 30 /*30&31 are reserved for DRAM refresh*/ - -#define AWE_MAX_CHANNELS 32 /* max midi channels (must >= voices) */ -#define AWE_MAX_LAYERS AWE_MAX_VOICES /* maximum number of multiple layers */ - -#define AWE_DRAM_OFFSET 0x200000 -#define AWE_MAX_DRAM_SIZE (28 * 1024) /* 28 MB is max onboard memory */ - -#define AWE_DEFAULT_ATTENUATION 32 /* 12dB below */ -#define AWE_DEFAULT_MOD_SENSE 18 - -#endif diff --git a/sys/gnu/i386/isa/sound/awe_version.h b/sys/gnu/i386/isa/sound/awe_version.h deleted file mode 100644 index 42013bb..0000000 --- a/sys/gnu/i386/isa/sound/awe_version.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * sound/awe_version.h - * - * Version defines for the AWE32/Sound Blaster 32 wave table synth driver. - * version 0.4.2c; Oct. 7, 1997 - * - * Copyright (C) 1996,1997 Takashi Iwai - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -/* AWE32 driver version number */ - -#ifndef AWE_VERSION_H_DEF -#define AWE_VERSION_H_DEF - -#define AWE_VERSION_NUMBER 0x00040203 -#define AWEDRV_VERSION "0.4.2c" -#define AWE_MAJOR_VERSION(id) (((id) >> 16) & 0xff) -#define AWE_MINOR_VERSION(id) (((id) >> 8) & 0xff) -#define AWE_TINY_VERSION(id) ((id) & 0xff) - -#endif diff --git a/sys/gnu/i386/isa/sound/awe_voice.h b/sys/gnu/i386/isa/sound/awe_voice.h deleted file mode 100644 index aa13131..0000000 --- a/sys/gnu/i386/isa/sound/awe_voice.h +++ /dev/null @@ -1,490 +0,0 @@ -/* - * sound/awe_voice.h - * - * Voice information definitions for the low level driver for the - * AWE32/Sound Blaster 32 wave table synth. - * version 0.4.2c; Oct. 7, 1997 - * - * Copyright (C) 1996,1997 Takashi Iwai - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef AWE_VOICE_H -#define AWE_VOICE_H - -#ifndef SAMPLE_TYPE_AWE32 -#define SAMPLE_TYPE_AWE32 0x20 -#endif - -#ifndef _PATCHKEY -#define _PATCHKEY(id) ((id<<8)|0xfd) -#endif - -/*---------------------------------------------------------------- - * patch information record - *----------------------------------------------------------------*/ - -/* patch interface header: 16 bytes */ -typedef struct awe_patch_info { - short key; /* use AWE_PATCH here */ -#define AWE_PATCH _PATCHKEY(0x07) - - short device_no; /* synthesizer number */ - unsigned short sf_id; /* file id (should be zero) */ - short optarg; /* optional argument */ - int len; /* data length (without this header) */ - - short type; /* patch operation type */ -#define AWE_LOAD_INFO 0 /* awe_voice_rec */ -#define AWE_LOAD_DATA 1 /* awe_sample_info */ -#define AWE_OPEN_PATCH 2 /* awe_open_parm */ -#define AWE_CLOSE_PATCH 3 /* none */ -#define AWE_UNLOAD_PATCH 4 /* none */ -#define AWE_REPLACE_DATA 5 /* awe_sample_info (optarg=#channels)*/ -#define AWE_MAP_PRESET 6 /* awe_voice_map */ -#define AWE_LOAD_CHORUS_FX 0x10 /* awe_chorus_fx_rec (optarg=mode) */ -#define AWE_LOAD_REVERB_FX 0x11 /* awe_reverb_fx_rec (optarg=mode) */ - - short reserved; /* word alignment data */ - - /* the actual patch data begins after this */ -#if defined(AWE_COMPAT_030) && AWE_COMPAT_030 - char data[0]; -#endif -} awe_patch_info; - -/*#define AWE_PATCH_INFO_SIZE 16*/ -#define AWE_PATCH_INFO_SIZE sizeof(awe_patch_info) - - -/*---------------------------------------------------------------- - * open patch - *----------------------------------------------------------------*/ - -#define AWE_PATCH_NAME_LEN 32 - -typedef struct _awe_open_parm { - unsigned short type; /* sample type */ -#define AWE_PAT_TYPE_MISC 0 -#define AWE_PAT_TYPE_GM 1 -#define AWE_PAT_TYPE_GS 2 -#define AWE_PAT_TYPE_MT32 3 -#define AWE_PAT_TYPE_XG 4 -#define AWE_PAT_TYPE_SFX 5 -#define AWE_PAT_TYPE_GUS 6 -#define AWE_PAT_TYPE_MAP 7 - -#define AWE_PAT_LOCKED 0x100 /* lock the samples */ - - short reserved; - char name[AWE_PATCH_NAME_LEN]; -} awe_open_parm; - -/*#define AWE_OPEN_PARM_SIZE 28*/ -#define AWE_OPEN_PARM_SIZE sizeof(awe_open_parm) - - -/*---------------------------------------------------------------- - * raw voice information record - *----------------------------------------------------------------*/ - -/* wave table envelope & effect parameters to control EMU8000 */ -typedef struct _awe_voice_parm { - unsigned short moddelay; /* modulation delay (0x8000) */ - unsigned short modatkhld; /* modulation attack & hold time (0x7f7f) */ - unsigned short moddcysus; /* modulation decay & sustain (0x7f7f) */ - unsigned short modrelease; /* modulation release time (0x807f) */ - short modkeyhold, modkeydecay; /* envelope change per key (not used) */ - unsigned short voldelay; /* volume delay (0x8000) */ - unsigned short volatkhld; /* volume attack & hold time (0x7f7f) */ - unsigned short voldcysus; /* volume decay & sustain (0x7f7f) */ - unsigned short volrelease; /* volume release time (0x807f) */ - short volkeyhold, volkeydecay; /* envelope change per key (not used) */ - unsigned short lfo1delay; /* LFO1 delay (0x8000) */ - unsigned short lfo2delay; /* LFO2 delay (0x8000) */ - unsigned short pefe; /* modulation pitch & cutoff (0x0000) */ - unsigned short fmmod; /* LFO1 pitch & cutoff (0x0000) */ - unsigned short tremfrq; /* LFO1 volume & freq (0x0000) */ - unsigned short fm2frq2; /* LFO2 pitch & freq (0x0000) */ - unsigned char cutoff; /* initial cutoff (0xff) */ - unsigned char filterQ; /* initial filter Q [0-15] (0x0) */ - unsigned char chorus; /* chorus send (0x00) */ - unsigned char reverb; /* reverb send (0x00) */ - unsigned short reserved[4]; /* not used */ -} awe_voice_parm; - -#define AWE_VOICE_PARM_SIZE 48 - - -/* wave table parameters: 92 bytes */ -typedef struct _awe_voice_info { - unsigned short sf_id; /* file id (should be zero) */ - unsigned short sample; /* sample id */ - int start, end; /* sample offset correction */ - int loopstart, loopend; /* loop offset correction */ - short rate_offset; /* sample rate pitch offset */ - unsigned short mode; /* sample mode */ -#define AWE_MODE_ROMSOUND 0x8000 -#define AWE_MODE_STEREO 1 -#define AWE_MODE_LOOPING 2 -#define AWE_MODE_NORELEASE 4 /* obsolete */ -#define AWE_MODE_INIT_PARM 8 - - short root; /* midi root key */ - short tune; /* pitch tuning (in cents) */ - char low, high; /* key note range */ - char vellow, velhigh; /* velocity range */ - char fixkey, fixvel; /* fixed key, velocity */ - char pan, fixpan; /* panning, fixed panning */ - short exclusiveClass; /* exclusive class (0 = none) */ - unsigned char amplitude; /* sample volume (127 max) */ - unsigned char attenuation; /* attenuation (0.375dB) */ - short scaleTuning; /* pitch scale tuning(%), normally 100 */ - awe_voice_parm parm; /* voice envelope parameters */ - short index; /* internal index (set by driver) */ -} awe_voice_info; - -/*#define AWE_VOICE_INFO_SIZE 92*/ -#define AWE_VOICE_INFO_SIZE sizeof(awe_voice_info) - -/*----------------------------------------------------------------*/ - -/* The info entry of awe_voice_rec is changed from 0 to 1 - * for some compilers refusing zero size array. - * Due to this change, sizeof(awe_voice_rec) becomes different - * from older versions. - * Use AWE_VOICE_REC_SIZE instead. - */ - -/* instrument info header: 4 bytes */ -typedef struct _awe_voice_rec_hdr { - unsigned char bank; /* midi bank number */ - unsigned char instr; /* midi preset number */ - char nvoices; /* number of voices */ - char write_mode; /* write mode; normally 0 */ -#define AWE_WR_APPEND 0 /* append anyway */ -#define AWE_WR_EXCLUSIVE 1 /* skip if already exists */ -#define AWE_WR_REPLACE 2 /* replace if already exists */ -} awe_voice_rec_hdr; - -/*#define AWE_VOICE_REC_SIZE 4*/ -#define AWE_VOICE_REC_SIZE sizeof(awe_voice_rec_hdr) - -/* the standard patch structure for one sample */ -typedef struct _awe_voice_rec_patch { - awe_patch_info patch; - awe_voice_rec_hdr hdr; - awe_voice_info info; -} awe_voice_rec_patch; - - -/* obsolete data type */ -#if defined(AWE_COMPAT_030) && AWE_COMPAT_030 -#define AWE_INFOARRAY_SIZE 0 -#else -#define AWE_INFOARRAY_SIZE 1 -#endif - -typedef struct _awe_voice_rec { - unsigned char bank; /* midi bank number */ - unsigned char instr; /* midi preset number */ - short nvoices; /* number of voices */ - /* voice information follows here */ - awe_voice_info info[AWE_INFOARRAY_SIZE]; -} awe_voice_rec; - - -/*---------------------------------------------------------------- - * sample wave information - *----------------------------------------------------------------*/ - -/* wave table sample header: 32 bytes */ -typedef struct awe_sample_info { - unsigned short sf_id; /* file id (should be zero) */ - unsigned short sample; /* sample id */ - int start, end; /* start & end offset */ - int loopstart, loopend; /* loop start & end offset */ - int size; /* size (0 = ROM) */ - short checksum_flag; /* use check sum = 1 */ - unsigned short mode_flags; /* mode flags */ -#define AWE_SAMPLE_8BITS 1 /* wave data is 8bits */ -#define AWE_SAMPLE_UNSIGNED 2 /* wave data is unsigned */ -#define AWE_SAMPLE_NO_BLANK 4 /* no blank loop is attached */ -#define AWE_SAMPLE_SINGLESHOT 8 /* single-shot w/o loop */ -#define AWE_SAMPLE_BIDIR_LOOP 16 /* bidirectional looping */ -#define AWE_SAMPLE_STEREO_LEFT 32 /* stereo left sound */ -#define AWE_SAMPLE_STEREO_RIGHT 64 /* stereo right sound */ -#define AWE_SAMPLE_REVERSE_LOOP 128 /* reverse looping */ - unsigned int checksum; /* check sum */ -#if defined(AWE_COMPAT_030) && AWE_COMPAT_030 - unsigned short data[0]; /* sample data follows here */ -#endif -} awe_sample_info; - -/*#define AWE_SAMPLE_INFO_SIZE 32*/ -#define AWE_SAMPLE_INFO_SIZE sizeof(awe_sample_info) - - -/*---------------------------------------------------------------- - * voice preset mapping - *----------------------------------------------------------------*/ - -typedef struct awe_voice_map { - int map_bank, map_instr, map_key; /* key = -1 means all keys */ - int src_bank, src_instr, src_key; -} awe_voice_map; - -#define AWE_VOICE_MAP_SIZE sizeof(awe_voice_map) - - -/*---------------------------------------------------------------- - * awe hardware controls - *----------------------------------------------------------------*/ - -#define _AWE_DEBUG_MODE 0x00 -#define _AWE_REVERB_MODE 0x01 -#define _AWE_CHORUS_MODE 0x02 -#define _AWE_REMOVE_LAST_SAMPLES 0x03 -#define _AWE_INITIALIZE_CHIP 0x04 -#define _AWE_SEND_EFFECT 0x05 -#define _AWE_TERMINATE_CHANNEL 0x06 -#define _AWE_TERMINATE_ALL 0x07 -#define _AWE_INITIAL_VOLUME 0x08 -#define _AWE_INITIAL_ATTEN _AWE_INITIAL_VOLUME -#define _AWE_RESET_CHANNEL 0x09 -#define _AWE_CHANNEL_MODE 0x0a -#define _AWE_DRUM_CHANNELS 0x0b -#define _AWE_MISC_MODE 0x0c -#define _AWE_RELEASE_ALL 0x0d -#define _AWE_NOTEOFF_ALL 0x0e -#define _AWE_CHN_PRESSURE 0x0f -/*#define _AWE_GET_CURRENT_MODE 0x10*/ -#define _AWE_EQUALIZER 0x11 -/*#define _AWE_GET_MISC_MODE 0x12*/ -/*#define _AWE_GET_FONTINFO 0x13*/ - -#define _AWE_MODE_FLAG 0x80 -#define _AWE_COOKED_FLAG 0x40 /* not supported */ -#define _AWE_MODE_VALUE_MASK 0x3F - -/*----------------------------------------------------------------*/ - -#define _AWE_SET_CMD(p,dev,voice,cmd,p1,p2) \ -{((char*)(p))[0] = SEQ_PRIVATE;\ - ((char*)(p))[1] = dev;\ - ((char*)(p))[2] = _AWE_MODE_FLAG|(cmd);\ - ((char*)(p))[3] = voice;\ - ((unsigned short*)(p))[2] = p1;\ - ((unsigned short*)(p))[3] = p2;} - -/* buffered access */ -#define _AWE_CMD(dev, voice, cmd, p1, p2) \ -{_SEQ_NEEDBUF(8);\ - _AWE_SET_CMD(_seqbuf + _seqbufptr, dev, voice, cmd, p1, p2);\ - _SEQ_ADVBUF(8);} - -/* direct access */ -#define _AWE_CMD_NOW(seqfd,dev,voice,cmd,p1,p2) \ -{struct seq_event_rec tmp;\ - _AWE_SET_CMD(&tmp, dev, voice, cmd, p1, p2);\ - ioctl(seqfd, SNDCTL_SEQ_OUTOFBAND, &tmp);} - -/*----------------------------------------------------------------*/ - -/* set debugging mode */ -#define AWE_DEBUG_MODE(dev,p1) _AWE_CMD(dev, 0, _AWE_DEBUG_MODE, p1, 0) -/* set reverb mode; from 0 to 7 */ -#define AWE_REVERB_MODE(dev,p1) _AWE_CMD(dev, 0, _AWE_REVERB_MODE, p1, 0) -/* set chorus mode; from 0 to 7 */ -#define AWE_CHORUS_MODE(dev,p1) _AWE_CMD(dev, 0, _AWE_CHORUS_MODE, p1, 0) - -/* reset channel */ -#define AWE_RESET_CHANNEL(dev,ch) _AWE_CMD(dev, ch, _AWE_RESET_CHANNEL, 0, 0) -#define AWE_RESET_CONTROL(dev,ch) _AWE_CMD(dev, ch, _AWE_RESET_CHANNEL, 1, 0) - -/* send an effect to all layers */ -#define AWE_SEND_EFFECT(dev,voice,type,value) _AWE_CMD(dev,voice,_AWE_SEND_EFFECT,type,value) -#define AWE_ADD_EFFECT(dev,voice,type,value) _AWE_CMD(dev,voice,_AWE_SEND_EFFECT,((type)|0x80),value) -#define AWE_UNSET_EFFECT(dev,voice,type) _AWE_CMD(dev,voice,_AWE_SEND_EFFECT,((type)|0x40),0) -/* send an effect to a layer */ -#define AWE_SEND_LAYER_EFFECT(dev,voice,layer,type,value) _AWE_CMD(dev,voice,_AWE_SEND_EFFECT,((layer+1)<<8|(type)),value) -#define AWE_ADD_LAYER_EFFECT(dev,voice,layer,type,value) _AWE_CMD(dev,voice,_AWE_SEND_EFFECT,((layer+1)<<8|(type)|0x80),value) -#define AWE_UNSET_LAYER_EFFECT(dev,voice,layer,type) _AWE_CMD(dev,voice,_AWE_SEND_EFFECT,((layer+1)<<8|(type)|0x40),0) - -/* terminate sound on the channel/voice */ -#define AWE_TERMINATE_CHANNEL(dev,voice) _AWE_CMD(dev,voice,_AWE_TERMINATE_CHANNEL,0,0) -/* terminate all sounds */ -#define AWE_TERMINATE_ALL(dev) _AWE_CMD(dev, 0, _AWE_TERMINATE_ALL, 0, 0) -/* release all sounds (w/o sustain effect) */ -#define AWE_RELEASE_ALL(dev) _AWE_CMD(dev, 0, _AWE_RELEASE_ALL, 0, 0) -/* note off all sounds (w sustain effect) */ -#define AWE_NOTEOFF_ALL(dev) _AWE_CMD(dev, 0, _AWE_NOTEOFF_ALL, 0, 0) - -/* set initial attenuation */ -#define AWE_INITIAL_VOLUME(dev,atten) _AWE_CMD(dev, 0, _AWE_INITIAL_VOLUME, atten, 0) -#define AWE_INITIAL_ATTEN AWE_INITIAL_VOLUME -/* relative attenuation */ -#define AWE_SET_ATTEN(dev,atten) _AWE_CMD(dev, 0, _AWE_INITIAL_VOLUME, atten, 1) - -/* set channel playing mode; mode=0/1/2 */ -#define AWE_SET_CHANNEL_MODE(dev,mode) _AWE_CMD(dev, 0, _AWE_CHANNEL_MODE, mode, 0) -#define AWE_PLAY_INDIRECT 0 /* indirect voice mode (default) */ -#define AWE_PLAY_MULTI 1 /* multi note voice mode */ -#define AWE_PLAY_DIRECT 2 /* direct single voice mode */ -#define AWE_PLAY_MULTI2 3 /* sequencer2 mode; used internally */ - -/* set drum channel mask; channels is 32bit long value */ -#define AWE_DRUM_CHANNELS(dev,channels) _AWE_CMD(dev, 0, _AWE_DRUM_CHANNELS, ((channels) & 0xffff), ((channels) >> 16)) - -/* set bass and treble control; values are from 0 to 11 */ -#define AWE_EQUALIZER(dev,bass,treble) _AWE_CMD(dev, 0, _AWE_EQUALIZER, bass, treble) - -/* remove last loaded samples */ -#define AWE_REMOVE_LAST_SAMPLES(seqfd,dev) _AWE_CMD_NOW(seqfd, dev, 0, _AWE_REMOVE_LAST_SAMPLES, 0, 0) -/* initialize emu8000 chip */ -#define AWE_INITIALIZE_CHIP(seqfd,dev) _AWE_CMD_NOW(seqfd, dev, 0, _AWE_INITIALIZE_CHIP, 0, 0) - -/* set miscellaneous modes; meta command */ -#define AWE_MISC_MODE(dev,mode,value) _AWE_CMD(dev, 0, _AWE_MISC_MODE, mode, value) -/* exclusive sound off; 1=off */ -#define AWE_EXCLUSIVE_SOUND(dev,mode) AWE_MISC_MODE(dev,AWE_MD_EXCLUSIVE_SOUND,mode) -/* default GUS bank number */ -#define AWE_SET_GUS_BANK(dev,bank) AWE_MISC_MODE(dev,AWE_MD_GUS_BANK,bank) -/* change panning position in realtime; 0=don't 1=do */ -#define AWE_REALTIME_PAN(dev,mode) AWE_MISC_MODE(dev,AWE_MD_REALTIME_PAN,mode) - -/* extended pressure controls; not portable with other sound drivers */ -#define AWE_KEY_PRESSURE(dev,ch,note,vel) SEQ_START_NOTE(dev,ch,(note)+128,vel) -#define AWE_CHN_PRESSURE(dev,ch,vel) _AWE_CMD(dev,ch,_AWE_CHN_PRESSURE,vel,0) - -/*----------------------------------------------------------------*/ - -/* reverb mode parameters */ -#define AWE_REVERB_ROOM1 0 -#define AWE_REVERB_ROOM2 1 -#define AWE_REVERB_ROOM3 2 -#define AWE_REVERB_HALL1 3 -#define AWE_REVERB_HALL2 4 -#define AWE_REVERB_PLATE 5 -#define AWE_REVERB_DELAY 6 -#define AWE_REVERB_PANNINGDELAY 7 -#define AWE_REVERB_PREDEFINED 8 -/* user can define reverb modes up to 32 */ -#define AWE_REVERB_NUMBERS 32 - -typedef struct awe_reverb_fx_rec { - unsigned short parms[28]; -} awe_reverb_fx_rec; - -/*----------------------------------------------------------------*/ - -/* chorus mode parameters */ -#define AWE_CHORUS_1 0 -#define AWE_CHORUS_2 1 -#define AWE_CHORUS_3 2 -#define AWE_CHORUS_4 3 -#define AWE_CHORUS_FEEDBACK 4 -#define AWE_CHORUS_FLANGER 5 -#define AWE_CHORUS_SHORTDELAY 6 -#define AWE_CHORUS_SHORTDELAY2 7 -#define AWE_CHORUS_PREDEFINED 8 -/* user can define chorus modes up to 32 */ -#define AWE_CHORUS_NUMBERS 32 - -typedef struct awe_chorus_fx_rec { - unsigned short feedback; /* feedback level (0xE600-0xE6FF) */ - unsigned short delay_offset; /* delay (0-0x0DA3) [1/44100 sec] */ - unsigned short lfo_depth; /* LFO depth (0xBC00-0xBCFF) */ - unsigned int delay; /* right delay (0-0xFFFFFFFF) [1/256/44100 sec] */ - unsigned int lfo_freq; /* LFO freq LFO freq (0-0xFFFFFFFF) */ -} awe_chorus_fx_rec; - -/*----------------------------------------------------------------*/ - -/* misc mode types */ -enum { -/* 0*/ AWE_MD_EXCLUSIVE_OFF, /* obsolete */ -/* 1*/ AWE_MD_EXCLUSIVE_ON, /* obsolete */ -/* 2*/ AWE_MD_VERSION, /* read only */ -/* 3*/ AWE_MD_EXCLUSIVE_SOUND, /* ignored */ -/* 4*/ AWE_MD_REALTIME_PAN, /* 0/1: do realtime pan change (default=1) */ -/* 5*/ AWE_MD_GUS_BANK, /* bank number for GUS patches (default=0) */ -/* 6*/ AWE_MD_KEEP_EFFECT, /* 0/1: keep effect values, (default=0) */ -/* 7*/ AWE_MD_ZERO_ATTEN, /* attenuation of max volume (default=32) */ -/* 8*/ AWE_MD_CHN_PRIOR, /* 0/1: set MIDI channel priority mode (default=1) */ -/* 9*/ AWE_MD_MOD_SENSE, /* integer: modwheel sensitivity (def=18) */ -/*10*/ AWE_MD_DEF_PRESET, /* integer: default preset number (def=0) */ -/*11*/ AWE_MD_DEF_BANK, /* integer: default bank number (def=0) */ -/*12*/ AWE_MD_DEF_DRUM, /* integer: default drumset number (def=0) */ -/*13*/ AWE_MD_TOGGLE_DRUM_BANK, /* 0/1: toggle drum flag with bank# (def=0) */ - AWE_MD_END, -}; - -/*----------------------------------------------------------------*/ - -/* effect parameters */ -enum { - -/* modulation envelope parameters */ -/* 0*/ AWE_FX_ENV1_DELAY, /* WORD: ENVVAL */ -/* 1*/ AWE_FX_ENV1_ATTACK, /* BYTE: up ATKHLD */ -/* 2*/ AWE_FX_ENV1_HOLD, /* BYTE: lw ATKHLD */ -/* 3*/ AWE_FX_ENV1_DECAY, /* BYTE: lw DCYSUS */ -/* 4*/ AWE_FX_ENV1_RELEASE, /* BYTE: lw DCYSUS */ -/* 5*/ AWE_FX_ENV1_SUSTAIN, /* BYTE: up DCYSUS */ -/* 6*/ AWE_FX_ENV1_PITCH, /* BYTE: up PEFE */ -/* 7*/ AWE_FX_ENV1_CUTOFF, /* BYTE: lw PEFE */ - -/* volume envelope parameters */ -/* 8*/ AWE_FX_ENV2_DELAY, /* WORD: ENVVOL */ -/* 9*/ AWE_FX_ENV2_ATTACK, /* BYTE: up ATKHLDV */ -/*10*/ AWE_FX_ENV2_HOLD, /* BYTE: lw ATKHLDV */ -/*11*/ AWE_FX_ENV2_DECAY, /* BYTE: lw DCYSUSV */ -/*12*/ AWE_FX_ENV2_RELEASE, /* BYTE: lw DCYSUSV */ -/*13*/ AWE_FX_ENV2_SUSTAIN, /* BYTE: up DCYSUSV */ - -/* LFO1 (tremolo & vibrato) parameters */ -/*14*/ AWE_FX_LFO1_DELAY, /* WORD: LFO1VAL */ -/*15*/ AWE_FX_LFO1_FREQ, /* BYTE: lo TREMFRQ */ -/*16*/ AWE_FX_LFO1_VOLUME, /* BYTE: up TREMFRQ */ -/*17*/ AWE_FX_LFO1_PITCH, /* BYTE: up FMMOD */ -/*18*/ AWE_FX_LFO1_CUTOFF, /* BYTE: lo FMMOD */ - -/* LFO2 (vibrato) parameters */ -/*19*/ AWE_FX_LFO2_DELAY, /* WORD: LFO2VAL */ -/*20*/ AWE_FX_LFO2_FREQ, /* BYTE: lo FM2FRQ2 */ -/*21*/ AWE_FX_LFO2_PITCH, /* BYTE: up FM2FRQ2 */ - -/* Other overall effect parameters */ -/*22*/ AWE_FX_INIT_PITCH, /* SHORT: pitch offset */ -/*23*/ AWE_FX_CHORUS, /* BYTE: chorus effects send (0-255) */ -/*24*/ AWE_FX_REVERB, /* BYTE: reverb effects send (0-255) */ -/*25*/ AWE_FX_CUTOFF, /* BYTE: up IFATN */ -/*26*/ AWE_FX_FILTERQ, /* BYTE: up CCCA */ - -/* Sample / loop offset changes */ -/*27*/ AWE_FX_SAMPLE_START, /* SHORT: offset */ -/*28*/ AWE_FX_LOOP_START, /* SHORT: offset */ -/*29*/ AWE_FX_LOOP_END, /* SHORT: offset */ -/*30*/ AWE_FX_COARSE_SAMPLE_START, /* SHORT: upper word offset */ -/*31*/ AWE_FX_COARSE_LOOP_START, /* SHORT: upper word offset */ -/*32*/ AWE_FX_COARSE_LOOP_END, /* SHORT: upper word offset */ -/*33*/ AWE_FX_ATTEN, /* BYTE: lo IFATN */ - - AWE_FX_END, -}; - -#endif /* AWE_VOICE_H */ diff --git a/sys/gnu/i386/isa/sound/awe_wave.c b/sys/gnu/i386/isa/sound/awe_wave.c deleted file mode 100644 index 1bffbf5..0000000 --- a/sys/gnu/i386/isa/sound/awe_wave.c +++ /dev/null @@ -1,4574 +0,0 @@ -/* - * sound/awe_wave.c - * - * The low level driver for the AWE32/Sound Blaster 32 wave table synth. - * version 0.4.2c; Oct. 7, 1997 - * - * Copyright (C) 1996,1997 Takashi Iwai - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include - -#ifdef __FreeBSD__ -# include -#else -# include "awe_config.h" -#endif - -/*----------------------------------------------------------------*/ - -#ifdef CONFIG_AWE32_SYNTH - -#ifdef __FreeBSD__ -# include -# include -# include -#else -# include "awe_hw.h" -# include "awe_version.h" -# include -#endif - -#ifdef AWE_HAS_GUS_COMPATIBILITY -/* include finetune table */ - -#ifdef __FreeBSD__ -# ifdef AWE_OBSOLETE_VOXWARE -# define SEQUENCER_C -# endif -# include -#else -# ifdef AWE_OBSOLETE_VOXWARE -# include "tuning.h" -# else -# include "../tuning.h" -# endif -#endif - -#ifdef linux -# include -#elif defined(__FreeBSD__) -# include -#endif - -#endif /* AWE_HAS_GUS_COMPATIBILITY */ - - -/*---------------------------------------------------------------- - * debug message - *----------------------------------------------------------------*/ - -static int debug_mode = 0; -#ifdef AWE_DEBUG_ON -#define AWE_DEBUG(LVL,XXX) {if (debug_mode > LVL) { XXX; }} -#define ERRMSG(XXX) {if (debug_mode) { XXX; }} -#define FATALERR(XXX) XXX -#else -#define AWE_DEBUG(LVL,XXX) /**/ -#define ERRMSG(XXX) XXX -#define FATALERR(XXX) XXX -#endif - -/*---------------------------------------------------------------- - * bank and voice record - *----------------------------------------------------------------*/ - -/* soundfont record */ -typedef struct _sf_list { - unsigned short sf_id; - unsigned short type; - int num_info; /* current info table index */ - int num_sample; /* current sample table index */ - int mem_ptr; /* current word byte pointer */ - int infos; - int samples; - /*char name[AWE_PATCH_NAME_LEN];*/ -} sf_list; - -/* bank record */ -typedef struct _awe_voice_list { - int next; /* linked list with same sf_id */ - unsigned char bank, instr; /* preset number information */ - char type, disabled; /* type=normal/mapped, disabled=boolean */ - awe_voice_info v; /* voice information */ - int next_instr; /* preset table list */ - int next_bank; /* preset table list */ -} awe_voice_list; - -/* voice list type */ -#define V_ST_NORMAL 0 -#define V_ST_MAPPED 1 - -typedef struct _awe_sample_list { - int next; /* linked list with same sf_id */ - awe_sample_info v; /* sample information */ -} awe_sample_list; - -/* sample and information table */ -static int current_sf_id = 0; -static int locked_sf_id = 0; -static int max_sfs; -static sf_list *sflists = NULL; - -#define awe_free_mem_ptr() (current_sf_id <= 0 ? 0 : sflists[current_sf_id-1].mem_ptr) -#define awe_free_info() (current_sf_id <= 0 ? 0 : sflists[current_sf_id-1].num_info) -#define awe_free_sample() (current_sf_id <= 0 ? 0 : sflists[current_sf_id-1].num_sample) - -static int max_samples; -static awe_sample_list *samples = NULL; - -static int max_infos; -static awe_voice_list *infos = NULL; - - -#define AWE_MAX_PRESETS 256 -#define AWE_DEFAULT_PRESET 0 -#define AWE_DEFAULT_BANK 0 -#define AWE_DEFAULT_DRUM 0 -#define AWE_DRUM_BANK 128 - -#define MAX_LAYERS AWE_MAX_VOICES - -/* preset table index */ -static int preset_table[AWE_MAX_PRESETS]; - -/*---------------------------------------------------------------- - * voice table - *----------------------------------------------------------------*/ - -/* effects table */ -typedef struct FX_Rec { /* channel effects */ - unsigned char flags[AWE_FX_END]; - short val[AWE_FX_END]; -} FX_Rec; - - -/* channel parameters */ -typedef struct _awe_chan_info { - int channel; /* channel number */ - int bank; /* current tone bank */ - int instr; /* current program */ - int bender; /* midi pitchbend (-8192 - 8192) */ - int bender_range; /* midi bender range (x100) */ - int panning; /* panning (0-127) */ - int main_vol; /* channel volume (0-127) */ - int expression_vol; /* midi expression (0-127) */ - int chan_press; /* channel pressure */ - int vrec; /* instrument list */ - int def_vrec; /* default instrument list */ - int sustained; /* sustain status in MIDI */ - FX_Rec fx; /* effects */ - FX_Rec fx_layer[MAX_LAYERS]; /* layer effects */ -} awe_chan_info; - -/* voice parameters */ -typedef struct _voice_info { - int state; -#define AWE_ST_OFF (1<<0) /* no sound */ -#define AWE_ST_ON (1<<1) /* playing */ -#define AWE_ST_STANDBY (1<<2) /* stand by for playing */ -#define AWE_ST_SUSTAINED (1<<3) /* sustained */ -#define AWE_ST_MARK (1<<4) /* marked for allocation */ -#define AWE_ST_DRAM (1<<5) /* DRAM read/write */ -#define AWE_ST_FM (1<<6) /* reserved for FM */ -#define AWE_ST_RELEASED (1<<7) /* released */ - - int ch; /* midi channel */ - int key; /* internal key for search */ - int layer; /* layer number (for channel mode only) */ - int time; /* allocated time */ - awe_chan_info *cinfo; /* channel info */ - - int note; /* midi key (0-127) */ - int velocity; /* midi velocity (0-127) */ - int sostenuto; /* sostenuto on/off */ - awe_voice_info *sample; /* assigned voice */ - - /* EMU8000 parameters */ - int apitch; /* pitch parameter */ - int avol; /* volume parameter */ - int apan; /* panning parameter */ -} voice_info; - -/* voice information */ -static voice_info *voices; - -#define IS_NO_SOUND(v) (voices[v].state & (AWE_ST_OFF|AWE_ST_RELEASED|AWE_ST_STANDBY|AWE_ST_SUSTAINED)) -#define IS_NO_EFFECT(v) (voices[v].state != AWE_ST_ON) -#define IS_PLAYING(v) (voices[v].state & (AWE_ST_ON|AWE_ST_SUSTAINED|AWE_ST_RELEASED)) -#define IS_EMPTY(v) (voices[v].state & (AWE_ST_OFF|AWE_ST_MARK|AWE_ST_DRAM|AWE_ST_FM)) - - -/* MIDI channel effects information (for hw control) */ -static awe_chan_info *channels; - - -/*---------------------------------------------------------------- - * global variables - *----------------------------------------------------------------*/ - -#ifndef AWE_DEFAULT_BASE_ADDR -#define AWE_DEFAULT_BASE_ADDR 0 /* autodetect */ -#endif - -#ifndef AWE_DEFAULT_MEM_SIZE -#define AWE_DEFAULT_MEM_SIZE 0 /* autodetect */ -#endif - -/* awe32 base address (overwritten at initialization) */ -static int awe_base = AWE_DEFAULT_BASE_ADDR; -/* memory byte size */ -static int awe_mem_size = AWE_DEFAULT_MEM_SIZE; -/* DRAM start offset */ -static int awe_mem_start = AWE_DRAM_OFFSET; - -/* maximum channels for playing */ -static int awe_max_voices = AWE_MAX_VOICES; - -static int patch_opened = 0; /* sample already loaded? */ - -static int reverb_mode = 4; /* reverb mode */ -static int chorus_mode = 2; /* chorus mode */ -static short init_atten = AWE_DEFAULT_ATTENUATION; /* 12dB below */ - -static int awe_present = FALSE; /* awe device present? */ -static int awe_busy = FALSE; /* awe device opened? */ - -#define DEFAULT_DRUM_FLAGS ((1 << 9) | (1 << 25)) -#define IS_DRUM_CHANNEL(c) (drum_flags & (1 << (c))) -#define DRUM_CHANNEL_ON(c) (drum_flags |= (1 << (c))) -#define DRUM_CHANNEL_OFF(c) (drum_flags &= ~(1 << (c))) -static unsigned int drum_flags = DEFAULT_DRUM_FLAGS; /* channel flags */ - -static int playing_mode = AWE_PLAY_INDIRECT; -#define SINGLE_LAYER_MODE() (playing_mode == AWE_PLAY_INDIRECT || playing_mode == AWE_PLAY_DIRECT) -#define MULTI_LAYER_MODE() (playing_mode == AWE_PLAY_MULTI || playing_mode == AWE_PLAY_MULTI2) - -static int current_alloc_time = 0; /* voice allocation index for channel mode */ - -static struct MiscModeDef { - int value; - int init_each_time; -} misc_modes_default[AWE_MD_END] = { - {0,0}, {0,0}, /* <-- not used */ - {AWE_VERSION_NUMBER, FALSE}, - {TRUE, TRUE}, /* exclusive */ - {TRUE, TRUE}, /* realpan */ - {AWE_DEFAULT_BANK, TRUE}, /* gusbank */ - {FALSE, TRUE}, /* keep effect */ - {AWE_DEFAULT_ATTENUATION, FALSE}, /* zero_atten */ - {FALSE, TRUE}, /* chn_prior */ - {AWE_DEFAULT_MOD_SENSE, TRUE}, /* modwheel sense */ - {AWE_DEFAULT_PRESET, TRUE}, /* def_preset */ - {AWE_DEFAULT_BANK, TRUE}, /* def_bank */ - {AWE_DEFAULT_DRUM, TRUE}, /* def_drum */ - {FALSE, TRUE}, /* toggle_drum_bank */ -}; - -static int misc_modes[AWE_MD_END]; - -static int awe_bass_level = 5; -static int awe_treble_level = 9; - - -static struct synth_info awe_info = { - "AWE32 Synth", /* name */ - 0, /* device */ - SYNTH_TYPE_SAMPLE, /* synth_type */ - SAMPLE_TYPE_AWE32, /* synth_subtype */ - 0, /* perc_mode (obsolete) */ - AWE_MAX_VOICES, /* nr_voices */ - 0, /* nr_drums (obsolete) */ - AWE_MAX_INFOS /* instr_bank_size */ -}; - - -static struct voice_alloc_info *voice_alloc; /* set at initialization */ - - -/*---------------------------------------------------------------- - * function prototypes - *----------------------------------------------------------------*/ - -#if defined(linux) && !defined(AWE_OBSOLETE_VOXWARE) -static int awe_check_port(void); -static void awe_request_region(void); -static void awe_release_region(void); -#endif - -static void awe_reset_samples(void); -/* emu8000 chip i/o access */ -static void awe_poke(unsigned short cmd, unsigned short port, unsigned short data); -static void awe_poke_dw(unsigned short cmd, unsigned short port, unsigned int data); -static unsigned short awe_peek(unsigned short cmd, unsigned short port); -static unsigned int awe_peek_dw(unsigned short cmd, unsigned short port); -static void awe_wait(unsigned short delay); - -/* initialize emu8000 chip */ -static void awe_initialize(void); - -/* set voice parameters */ -static void awe_init_misc_modes(int init_all); -static void awe_init_voice_info(awe_voice_info *vp); -static void awe_init_voice_parm(awe_voice_parm *pp); -#ifdef AWE_HAS_GUS_COMPATIBILITY -static int freq_to_note(int freq); -static int calc_rate_offset(int Hz); -/*static int calc_parm_delay(int msec);*/ -static int calc_parm_hold(int msec); -static int calc_parm_attack(int msec); -static int calc_parm_decay(int msec); -static int calc_parm_search(int msec, short *table); -#endif - -/* turn on/off note */ -static void awe_note_on(int voice); -static void awe_note_off(int voice); -static void awe_terminate(int voice); -static void awe_exclusive_off(int voice); -static void awe_note_off_all(int do_sustain); - -/* calculate voice parameters */ -typedef void (*fx_affect_func)(int voice, int forced); -static void awe_set_pitch(int voice, int forced); -static void awe_set_voice_pitch(int voice, int forced); -static void awe_set_volume(int voice, int forced); -static void awe_set_voice_vol(int voice, int forced); -static void awe_set_pan(int voice, int forced); -static void awe_fx_fmmod(int voice, int forced); -static void awe_fx_tremfrq(int voice, int forced); -static void awe_fx_fm2frq2(int voice, int forced); -static void awe_fx_filterQ(int voice, int forced); -static void awe_calc_pitch(int voice); -#ifdef AWE_HAS_GUS_COMPATIBILITY -static void awe_calc_pitch_from_freq(int voice, int freq); -#endif -static void awe_calc_volume(int voice); -static void awe_voice_init(int voice, int init_all); -static void awe_channel_init(int ch, int init_all); -static void awe_fx_init(int ch); - -/* sequencer interface */ -static int awe_open(int dev, int mode); -static void awe_close(int dev); -static int awe_ioctl(int dev, unsigned int cmd, caddr_t arg); -static int awe_kill_note(int dev, int voice, int note, int velocity); -static int awe_start_note(int dev, int v, int note_num, int volume); -static int awe_set_instr(int dev, int voice, int instr_no); -static int awe_set_instr_2(int dev, int voice, int instr_no); -static void awe_reset(int dev); -static void awe_hw_control(int dev, unsigned char *event); -static int awe_load_patch(int dev, int format, const char *addr, - int offs, int count, int pmgr_flag); -static void awe_aftertouch(int dev, int voice, int pressure); -static void awe_controller(int dev, int voice, int ctrl_num, int value); -static void awe_panning(int dev, int voice, int value); -static void awe_volume_method(int dev, int mode); -#ifndef AWE_NO_PATCHMGR -static int awe_patchmgr(int dev, struct patmgr_info *rec); -#endif -static void awe_bender(int dev, int voice, int value); -static int awe_alloc(int dev, int chn, int note, struct voice_alloc_info *alloc); -static void awe_setup_voice(int dev, int voice, int chn); - -/* hardware controls */ -#ifdef AWE_HAS_GUS_COMPATIBILITY -static void awe_hw_gus_control(int dev, int cmd, unsigned char *event); -#endif -static void awe_hw_awe_control(int dev, int cmd, unsigned char *event); -static void awe_voice_change(int voice, fx_affect_func func); -static void awe_sostenuto_on(int voice, int forced); -static void awe_sustain_off(int voice, int forced); -static void awe_terminate_and_init(int voice, int forced); - -/* voice search */ -static int awe_search_instr(int bank, int preset); -static int awe_search_multi_voices(int rec, int note, int velocity, awe_voice_info **vlist); -static void awe_alloc_multi_voices(int ch, int note, int velocity, int key); -static void awe_alloc_one_voice(int voice, int note, int velocity); -static int awe_clear_voice(void); - -/* load / remove patches */ -static int awe_open_patch(awe_patch_info *patch, const char *addr, int count); -static int awe_close_patch(awe_patch_info *patch, const char *addr, int count); -static int awe_unload_patch(awe_patch_info *patch, const char *addr, int count); -static int awe_load_info(awe_patch_info *patch, const char *addr, int count); -static int awe_load_data(awe_patch_info *patch, const char *addr, int count); -static int awe_replace_data(awe_patch_info *patch, const char *addr, int count); -static int awe_load_map(awe_patch_info *patch, const char *addr, int count); -#ifdef AWE_HAS_GUS_COMPATIBILITY -static int awe_load_guspatch(const char *addr, int offs, int size, int pmgr_flag); -#endif -static int check_patch_opened(int type, char *name); -static int awe_write_wave_data(const char *addr, int offset, awe_sample_info *sp, int channels); -static void add_sf_info(int rec); -static void add_sf_sample(int rec); -static void purge_old_list(int rec, int next); -static void add_info_list(int rec); -static void awe_remove_samples(int sf_id); -static void rebuild_preset_list(void); -static short awe_set_sample(awe_voice_info *vp); - -/* lowlevel functions */ -static void awe_init_audio(void); -static void awe_init_dma(void); -static void awe_init_array(void); -static void awe_send_array(unsigned short *data); -static void awe_tweak_voice(int voice); -static void awe_tweak(void); -static void awe_init_fm(void); -static int awe_open_dram_for_write(int offset, int channels); -static void awe_open_dram_for_check(void); -static void awe_close_dram(void); -static void awe_write_dram(unsigned short c); -static int awe_detect_base(int addr); -static int awe_detect(void); -static int awe_check_dram(void); -static int awe_load_chorus_fx(awe_patch_info *patch, const char *addr, int count); -static void awe_set_chorus_mode(int mode); -static int awe_load_reverb_fx(awe_patch_info *patch, const char *addr, int count); -static void awe_set_reverb_mode(int mode); -static void awe_equalizer(int bass, int treble); -#ifdef CONFIG_AWE32_MIXER -static int awe_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg); -#endif - -/* define macros for compatibility */ -#ifdef __FreeBSD__ -# include -#else -# include "awe_compat.h" -#endif - -/*---------------------------------------------------------------- - * synth operation table - *----------------------------------------------------------------*/ - -static struct synth_operations awe_operations = -{ -#ifdef AWE_OSS38 - "EMU8K", -#endif - &awe_info, - 0, - SYNTH_TYPE_SAMPLE, - SAMPLE_TYPE_AWE32, - awe_open, - awe_close, - awe_ioctl, - awe_kill_note, - awe_start_note, - awe_set_instr_2, - awe_reset, - awe_hw_control, - awe_load_patch, - awe_aftertouch, - awe_controller, - awe_panning, - awe_volume_method, -#ifndef AWE_NO_PATCHMGR - awe_patchmgr, -#endif - awe_bender, - awe_alloc, - awe_setup_voice -}; - -#ifdef CONFIG_AWE32_MIXER -static struct mixer_operations awe_mixer_operations = { -#ifndef __FreeBSD__ - "AWE32", -#endif - "AWE32 Equalizer", - awe_mixer_ioctl, -}; -#endif - - -/*================================================================ - * attach / unload interface - *================================================================*/ - -#ifdef AWE_OBSOLETE_VOXWARE -#define ATTACH_DECL static -#else -#define ATTACH_DECL /**/ -#endif - -#if defined(__FreeBSD__) && !defined(AWE_OBSOLETE_VOXWARE) -# define ATTACH_RET -void attach_awe(struct address_info *hw_config) -#else -# define ATTACH_RET ret -ATTACH_DECL -int attach_awe(void) -#endif -{ - int ret = 0; - - /* check presence of AWE32 card */ - if (! awe_detect()) { - printk("AWE32: not detected\n"); - return ATTACH_RET; - } - - /* check AWE32 ports are available */ - if (awe_check_port()) { - printk("AWE32: I/O area already used.\n"); - return ATTACH_RET; - } - - /* set buffers to NULL */ - voices = NULL; - channels = NULL; - sflists = NULL; - samples = NULL; - infos = NULL; - - /* voice & channel info */ - voices = (voice_info*)my_malloc(AWE_MAX_VOICES * sizeof(voice_info)); - channels = (awe_chan_info*)my_malloc(AWE_MAX_CHANNELS * sizeof(awe_chan_info)); - - if (voices == NULL || channels == NULL) { - my_free(voices); - my_free(channels); - printk("AWE32: can't allocate sample tables\n"); - return ATTACH_RET; - } - - /* allocate sample tables */ - INIT_TABLE(sflists, max_sfs, AWE_MAX_SF_LISTS, sf_list); - INIT_TABLE(samples, max_samples, AWE_MAX_SAMPLES, awe_sample_list); - INIT_TABLE(infos, max_infos, AWE_MAX_INFOS, awe_voice_list); - - if (num_synths >= MAX_SYNTH_DEV) - printk("AWE32 Error: too many synthesizers\n"); - else { - voice_alloc = &awe_operations.alloc; - voice_alloc->max_voice = awe_max_voices; - synth_devs[num_synths++] = &awe_operations; - } - -#ifdef CONFIG_AWE32_MIXER - if (num_mixers < MAX_MIXER_DEV) { - mixer_devs[num_mixers++] = &awe_mixer_operations; - } -#endif - - /* reserve I/O ports for awedrv */ - awe_request_region(); - - /* clear all samples */ - awe_reset_samples(); - - /* intialize AWE32 hardware */ - awe_initialize(); - - snprintf(awe_info.name, sizeof(awe_info.name), "AWE32-%s (RAM%dk)", - AWEDRV_VERSION, awe_mem_size/1024); -#ifdef __FreeBSD__ - printk("awe0: ", awe_mem_size/1024); -#elif defined(AWE_DEBUG_ON) - printk("%s\n", awe_info.name); -#endif - - /* set default values */ - awe_init_misc_modes(TRUE); - - /* set reverb & chorus modes */ - awe_set_reverb_mode(reverb_mode); - awe_set_chorus_mode(chorus_mode); - - awe_present = TRUE; - - ret = 1; - return ATTACH_RET; -} - - -#ifdef AWE_DYNAMIC_BUFFER -static void free_tables(void) -{ - my_free(sflists); - sflists = NULL; max_sfs = 0; - my_free(samples); - samples = NULL; max_samples = 0; - my_free(infos); - infos = NULL; max_infos = 0; -} -#else -#define free_buffers() /**/ -#endif - - -#ifdef linux -ATTACH_DECL -void unload_awe(void) -{ - if (awe_present) { - awe_reset_samples(); - awe_release_region(); - my_free(voices); - my_free(channels); - free_tables(); - awe_present = FALSE; - } -} -#endif - - -/*---------------------------------------------------------------- - * old type interface - *----------------------------------------------------------------*/ - -#ifdef AWE_OBSOLETE_VOXWARE - -#ifdef __FreeBSD__ -long attach_awe_obsolete(long mem_start, struct address_info *hw_config) -#else -int attach_awe_obsolete(int mem_start, struct address_info *hw_config) -#endif -{ - my_malloc_init(mem_start); - if (! attach_awe()) - return 0; - return my_malloc_memptr(); -} - -int probe_awe_obsolete(struct address_info *hw_config) -{ - return 1; - /*return awe_detect();*/ -} - -#else -#if defined(__FreeBSD__ ) -int probe_awe(struct address_info *hw_config) -{ - return 1; -} -#endif -#endif /* AWE_OBSOLETE_VOXWARE */ - - -/*================================================================ - * clear sample tables - *================================================================*/ - -static void -awe_reset_samples(void) -{ - int i; - - /* free all bank tables */ - for (i = 0; i < AWE_MAX_PRESETS; i++) - preset_table[i] = -1; - - free_tables(); - - current_sf_id = 0; - locked_sf_id = 0; - patch_opened = 0; -} - - -/*================================================================ - * EMU register access - *================================================================*/ - -/* select a given AWE32 pointer */ -static int awe_cur_cmd = -1; -#define awe_set_cmd(cmd) \ -if (awe_cur_cmd != cmd) { OUTW(cmd, awe_base + 0x802); awe_cur_cmd = cmd; } -#define awe_port(port) (awe_base - 0x620 + port) - -/* write 16bit data */ -INLINE static void -awe_poke(unsigned short cmd, unsigned short port, unsigned short data) -{ - awe_set_cmd(cmd); - OUTW(data, awe_port(port)); -} - -/* write 32bit data */ -INLINE static void -awe_poke_dw(unsigned short cmd, unsigned short port, unsigned int data) -{ - awe_set_cmd(cmd); - OUTW(data, awe_port(port)); /* write lower 16 bits */ - OUTW(data >> 16, awe_port(port)+2); /* write higher 16 bits */ -} - -/* read 16bit data */ -INLINE static unsigned short -awe_peek(unsigned short cmd, unsigned short port) -{ - unsigned short k; - awe_set_cmd(cmd); - k = inw(awe_port(port)); - return k; -} - -/* read 32bit data */ -INLINE static unsigned int -awe_peek_dw(unsigned short cmd, unsigned short port) -{ - unsigned int k1, k2; - awe_set_cmd(cmd); - k1 = inw(awe_port(port)); - k2 = inw(awe_port(port)+2); - k1 |= k2 << 16; - return k1; -} - -/* wait delay number of AWE32 44100Hz clocks */ -static void -awe_wait(unsigned short delay) -{ - unsigned short clock, target; - unsigned short port = awe_port(AWE_WC_Port); - int counter; - - /* sample counter */ - awe_set_cmd(AWE_WC_Cmd); - clock = (unsigned short)inw(port); - target = clock + delay; - counter = 0; - if (target < clock) { - for (; (unsigned short)inw(port) > target; counter++) - if (counter > 65536) - break; - } - for (; (unsigned short)inw(port) < target; counter++) - if (counter > 65536) - break; -} - -/* write a word data */ -INLINE static void -awe_write_dram(unsigned short c) -{ - awe_poke(AWE_SMLD, c); -} - - -#if defined(linux) && !defined(AWE_OBSOLETE_VOXWARE) - -/*================================================================ - * port check / request - * 0x620-622, 0xA20-A22, 0xE20-E22 - *================================================================*/ - -static int -awe_check_port(void) -{ - return (check_region(awe_port(Data0), 4) || - check_region(awe_port(Data1), 4) || - check_region(awe_port(Data3), 4)); -} - -static void -awe_request_region(void) -{ - request_region(awe_port(Data0), 4, "sound driver (AWE32)"); - request_region(awe_port(Data1), 4, "sound driver (AWE32)"); - request_region(awe_port(Data3), 4, "sound driver (AWE32)"); -} - -static void -awe_release_region(void) -{ - release_region(awe_port(Data0), 4); - release_region(awe_port(Data1), 4); - release_region(awe_port(Data3), 4); -} - -#endif /* !AWE_OBSOLETE_VOXWARE */ - - -/*================================================================ - * AWE32 initialization - *================================================================*/ -static void -awe_initialize(void) -{ - AWE_DEBUG(0,printk("AWE32: initializing..\n")); - - /* initialize hardware configuration */ - awe_poke(AWE_HWCF1, 0x0059); - awe_poke(AWE_HWCF2, 0x0020); - - /* disable audio; this seems to reduce a clicking noise a bit.. */ - awe_poke(AWE_HWCF3, 0); - - /* initialize audio channels */ - awe_init_audio(); - - /* initialize DMA */ - awe_init_dma(); - - /* initialize init array */ - awe_init_array(); - - /* check DRAM memory size */ - awe_mem_size = awe_check_dram(); - - /* initialize the FM section of the AWE32 */ - awe_init_fm(); - - /* set up voice envelopes */ - awe_tweak(); - - /* enable audio */ - awe_poke(AWE_HWCF3, 0x0004); - - /* set equalizer */ - awe_equalizer(5, 9); -} - - -/*================================================================ - * AWE32 voice parameters - *================================================================*/ - -/* initialize voice_info record */ -static void -awe_init_voice_info(awe_voice_info *vp) -{ - vp->sf_id = 0; /* normal mode */ - vp->sample = 0; - vp->rate_offset = 0; - - vp->start = 0; - vp->end = 0; - vp->loopstart = 0; - vp->loopend = 0; - vp->mode = 0; - vp->root = 60; - vp->tune = 0; - vp->low = 0; - vp->high = 127; - vp->vellow = 0; - vp->velhigh = 127; - - vp->fixkey = -1; - vp->fixvel = -1; - vp->fixpan = -1; - vp->pan = -1; - - vp->exclusiveClass = 0; - vp->amplitude = 127; - vp->attenuation = 0; - vp->scaleTuning = 100; - - awe_init_voice_parm(&vp->parm); -} - -/* initialize voice_parm record: - * Env1/2: delay=0, attack=0, hold=0, sustain=0, decay=0, release=0. - * Vibrato and Tremolo effects are zero. - * Cutoff is maximum. - * Chorus and Reverb effects are zero. - */ -static void -awe_init_voice_parm(awe_voice_parm *pp) -{ - pp->moddelay = 0x8000; - pp->modatkhld = 0x7f7f; - pp->moddcysus = 0x7f7f; - pp->modrelease = 0x807f; - pp->modkeyhold = 0; - pp->modkeydecay = 0; - - pp->voldelay = 0x8000; - pp->volatkhld = 0x7f7f; - pp->voldcysus = 0x7f7f; - pp->volrelease = 0x807f; - pp->volkeyhold = 0; - pp->volkeydecay = 0; - - pp->lfo1delay = 0x8000; - pp->lfo2delay = 0x8000; - pp->pefe = 0; - - pp->fmmod = 0; - pp->tremfrq = 0; - pp->fm2frq2 = 0; - - pp->cutoff = 0xff; - pp->filterQ = 0; - - pp->chorus = 0; - pp->reverb = 0; -} - - -#ifdef AWE_HAS_GUS_COMPATIBILITY - -/* convert frequency mHz to abstract cents (= midi key * 100) */ -static int -freq_to_note(int mHz) -{ - /* abscents = log(mHz/8176) / log(2) * 1200 */ - unsigned int max_val = (unsigned int)0xffffffff / 10000; - int i, times; - unsigned int base; - unsigned int freq; - int note, tune; - - if (mHz == 0) - return 0; - if (mHz < 0) - return 12799; /* maximum */ - - freq = mHz; - note = 0; - for (base = 8176 * 2; freq >= base; base *= 2) { - note += 12; - if (note >= 128) /* over maximum */ - return 12799; - } - base /= 2; - - /* to avoid overflow... */ - times = 10000; - while (freq > max_val) { - max_val *= 10; - times /= 10; - base /= 10; - } - - freq = freq * times / base; - for (i = 0; i < 12; i++) { - if (freq < semitone_tuning[i+1]) - break; - note++; - } - - tune = 0; - freq = freq * 10000 / semitone_tuning[i]; - for (i = 0; i < 100; i++) { - if (freq < cent_tuning[i+1]) - break; - tune++; - } - - return note * 100 + tune; -} - - -/* convert Hz to AWE32 rate offset: - * sample pitch offset for the specified sample rate - * rate=44100 is no offset, each 4096 is 1 octave (twice). - * eg, when rate is 22050, this offset becomes -4096. - */ -static int -calc_rate_offset(int Hz) -{ - /* offset = log(Hz / 44100) / log(2) * 4096 */ - int freq, base, i; - - /* maybe smaller than max (44100Hz) */ - if (Hz <= 0 || Hz >= 44100) return 0; - - base = 0; - for (freq = Hz * 2; freq < 44100; freq *= 2) - base++; - base *= 1200; - - freq = 44100 * 10000 / (freq/2); - for (i = 0; i < 12; i++) { - if (freq < semitone_tuning[i+1]) - break; - base += 100; - } - freq = freq * 10000 / semitone_tuning[i]; - for (i = 0; i < 100; i++) { - if (freq < cent_tuning[i+1]) - break; - base++; - } - return -base * 4096 / 1200; -} - - -/*---------------------------------------------------------------- - * convert envelope time parameter to AWE32 raw parameter - *----------------------------------------------------------------*/ - -/* attack & decay/release time table (msec) */ -static short attack_time_tbl[128] = { -32767, 11878, 5939, 3959, 2969, 2375, 1979, 1696, 1484, 1319, 1187, 1079, 989, 913, 848, 791, 742, - 698, 659, 625, 593, 565, 539, 516, 494, 475, 456, 439, 424, 409, 395, 383, 371, - 359, 344, 330, 316, 302, 290, 277, 266, 255, 244, 233, 224, 214, 205, 196, 188, - 180, 173, 165, 158, 152, 145, 139, 133, 127, 122, 117, 112, 107, 103, 98, 94, - 90, 86, 83, 79, 76, 73, 69, 67, 64, 61, 58, 56, 54, 51, 49, 47, - 45, 43, 41, 39, 38, 36, 35, 33, 32, 30, 29, 28, 27, 25, 24, 23, - 22, 21, 20, 20, 19, 18, 17, 16, 16, 15, 14, 14, 13, 13, 12, 11, - 11, 10, 10, 10, 9, 9, 8, 8, 8, 7, 7, 7, 6, 6, 0, -}; - -static short decay_time_tbl[128] = { -32767, 32766, 4589, 4400, 4219, 4045, 3879, 3719, 3566, 3419, 3279, 3144, 3014, 2890, 2771, 2657, - 2548, 2443, 2343, 2246, 2154, 2065, 1980, 1899, 1820, 1746, 1674, 1605, 1539, 1475, 1415, 1356, - 1301, 1247, 1196, 1146, 1099, 1054, 1011, 969, 929, 891, 854, 819, 785, 753, 722, 692, - 664, 636, 610, 585, 561, 538, 516, 494, 474, 455, 436, 418, 401, 384, 368, 353, - 339, 325, 311, 298, 286, 274, 263, 252, 242, 232, 222, 213, 204, 196, 188, 180, - 173, 166, 159, 152, 146, 140, 134, 129, 123, 118, 113, 109, 104, 100, 96, 92, - 88, 84, 81, 77, 74, 71, 68, 65, 63, 60, 58, 55, 53, 51, 49, 47, - 45, 43, 41, 39, 38, 36, 35, 33, 32, 30, 29, 28, 27, 26, 25, 24, -}; - -/* -static int -calc_parm_delay(int msec) -{ - return (0x8000 - msec * 1000 / 725); -} -*/ - -/* delay time = 0x8000 - msec/92 */ -static int -calc_parm_hold(int msec) -{ - int val = (0x7f * 92 - msec) / 92; - if (val < 1) val = 1; - if (val > 127) val = 127; - return val; -} - -/* attack time: search from time table */ -static int -calc_parm_attack(int msec) -{ - return calc_parm_search(msec, attack_time_tbl); -} - -/* decay/release time: search from time table */ -static int -calc_parm_decay(int msec) -{ - return calc_parm_search(msec, decay_time_tbl); -} - -/* search an index for specified time from given time table */ -static int -calc_parm_search(int msec, short *table) -{ - int left = 1, right = 127, mid; - while (left < right) { - mid = (left + right) / 2; - if (msec < (int)table[mid]) - left = mid + 1; - else - right = mid; - } - return left; -} -#endif /* AWE_HAS_GUS_COMPATIBILITY */ - - -/*================================================================ - * effects table - *================================================================*/ - -/* set an effect value */ -#define FX_FLAG_OFF 0 -#define FX_FLAG_SET 1 -#define FX_FLAG_ADD 2 - -#define FX_SET(rec,type,value) \ - ((rec)->flags[type] = FX_FLAG_SET, (rec)->val[type] = (value)) -#define FX_ADD(rec,type,value) \ - ((rec)->flags[type] = FX_FLAG_ADD, (rec)->val[type] = (value)) -#define FX_UNSET(rec,type) \ - ((rec)->flags[type] = FX_FLAG_OFF, (rec)->val[type] = 0) - -/* check the effect value is set */ -#define FX_ON(rec,type) ((rec)->flags[type]) - -#define PARM_BYTE 0 -#define PARM_WORD 1 - -static struct PARM_DEFS { - int type; /* byte or word */ - int low, high; /* value range */ - fx_affect_func realtime; /* realtime paramater change */ -} parm_defs[] = { - {PARM_WORD, 0, 0x8000, NULL}, /* env1 delay */ - {PARM_BYTE, 1, 0x7f, NULL}, /* env1 attack */ - {PARM_BYTE, 0, 0x7e, NULL}, /* env1 hold */ - {PARM_BYTE, 1, 0x7f, NULL}, /* env1 decay */ - {PARM_BYTE, 1, 0x7f, NULL}, /* env1 release */ - {PARM_BYTE, 0, 0x7f, NULL}, /* env1 sustain */ - {PARM_BYTE, 0, 0xff, NULL}, /* env1 pitch */ - {PARM_BYTE, 0, 0xff, NULL}, /* env1 cutoff */ - - {PARM_WORD, 0, 0x8000, NULL}, /* env2 delay */ - {PARM_BYTE, 1, 0x7f, NULL}, /* env2 attack */ - {PARM_BYTE, 0, 0x7e, NULL}, /* env2 hold */ - {PARM_BYTE, 1, 0x7f, NULL}, /* env2 decay */ - {PARM_BYTE, 1, 0x7f, NULL}, /* env2 release */ - {PARM_BYTE, 0, 0x7f, NULL}, /* env2 sustain */ - - {PARM_WORD, 0, 0x8000, NULL}, /* lfo1 delay */ - {PARM_BYTE, 0, 0xff, awe_fx_tremfrq}, /* lfo1 freq */ - {PARM_BYTE, 0, 0x7f, awe_fx_tremfrq}, /* lfo1 volume (positive only)*/ - {PARM_BYTE, 0, 0x7f, awe_fx_fmmod}, /* lfo1 pitch (positive only)*/ - {PARM_BYTE, 0, 0xff, awe_fx_fmmod}, /* lfo1 cutoff (positive only)*/ - - {PARM_WORD, 0, 0x8000, NULL}, /* lfo2 delay */ - {PARM_BYTE, 0, 0xff, awe_fx_fm2frq2}, /* lfo2 freq */ - {PARM_BYTE, 0, 0x7f, awe_fx_fm2frq2}, /* lfo2 pitch (positive only)*/ - - {PARM_WORD, 0, 0xffff, awe_set_voice_pitch}, /* initial pitch */ - {PARM_BYTE, 0, 0xff, NULL}, /* chorus */ - {PARM_BYTE, 0, 0xff, NULL}, /* reverb */ - {PARM_BYTE, 0, 0xff, awe_set_volume}, /* initial cutoff */ - {PARM_BYTE, 0, 15, awe_fx_filterQ}, /* initial resonance */ - - {PARM_WORD, 0, 0xffff, NULL}, /* sample start */ - {PARM_WORD, 0, 0xffff, NULL}, /* loop start */ - {PARM_WORD, 0, 0xffff, NULL}, /* loop end */ - {PARM_WORD, 0, 0xffff, NULL}, /* coarse sample start */ - {PARM_WORD, 0, 0xffff, NULL}, /* coarse loop start */ - {PARM_WORD, 0, 0xffff, NULL}, /* coarse loop end */ - {PARM_BYTE, 0, 0xff, awe_set_volume}, /* initial attenuation */ -}; - - -static unsigned char -FX_BYTE(FX_Rec *rec, FX_Rec *lay, int type, unsigned char value) -{ - int effect = 0; - int on = 0; - if (lay && (on = FX_ON(lay, type)) != 0) - effect = lay->val[type]; - if (!on && (on = FX_ON(rec, type)) != 0) - effect = rec->val[type]; - if (on == FX_FLAG_ADD) - effect += (int)value; - if (on) { - if (effect < parm_defs[type].low) - effect = parm_defs[type].low; - else if (effect > parm_defs[type].high) - effect = parm_defs[type].high; - return (unsigned char)effect; - } - return value; -} - -/* get word effect value */ -static unsigned short -FX_WORD(FX_Rec *rec, FX_Rec *lay, int type, unsigned short value) -{ - int effect = 0; - int on = 0; - if (lay && (on = FX_ON(lay, type)) != 0) - effect = lay->val[type]; - if (!on && (on = FX_ON(rec, type)) != 0) - effect = rec->val[type]; - if (on == FX_FLAG_ADD) - effect += (int)value; - if (on) { - if (effect < parm_defs[type].low) - effect = parm_defs[type].low; - else if (effect > parm_defs[type].high) - effect = parm_defs[type].high; - return (unsigned short)effect; - } - return value; -} - -/* get word (upper=type1/lower=type2) effect value */ -static unsigned short -FX_COMB(FX_Rec *rec, FX_Rec *lay, int type1, int type2, unsigned short value) -{ - unsigned short tmp; - tmp = FX_BYTE(rec, lay, type1, (unsigned char)(value >> 8)); - tmp <<= 8; - tmp |= FX_BYTE(rec, lay, type2, (unsigned char)(value & 0xff)); - return tmp; -} - -/* address offset */ -static int -FX_OFFSET(FX_Rec *rec, FX_Rec *lay, int lo, int hi, int mode) -{ - int addr = 0; - if (lay && FX_ON(lay, hi)) - addr = (short)lay->val[hi]; - else if (FX_ON(rec, hi)) - addr = (short)rec->val[hi]; - addr = addr << 15; - if (lay && FX_ON(lay, lo)) - addr += (short)lay->val[lo]; - else if (FX_ON(rec, lo)) - addr += (short)rec->val[lo]; - if (!(mode & AWE_SAMPLE_8BITS)) - addr /= 2; - return addr; -} - - -/*================================================================ - * turn on/off sample - *================================================================*/ - -static void -awe_note_on(int voice) -{ - unsigned int temp; - int addr; - awe_voice_info *vp; - FX_Rec *fx = &voices[voice].cinfo->fx; - FX_Rec *fx_lay = NULL; - if (voices[voice].layer < MAX_LAYERS) - fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer]; - - /* A voice sample must assigned before calling */ - if ((vp = voices[voice].sample) == NULL || vp->index < 0) - return; - - /* channel to be silent and idle */ - awe_poke(AWE_DCYSUSV(voice), 0x0080); - awe_poke(AWE_VTFT(voice), 0); - awe_poke(AWE_CVCF(voice), 0); - awe_poke(AWE_PTRX(voice), 0); - awe_poke(AWE_CPF(voice), 0); - - /* modulation & volume envelope */ - awe_poke(AWE_ENVVAL(voice), - FX_WORD(fx, fx_lay, AWE_FX_ENV1_DELAY, vp->parm.moddelay)); - awe_poke(AWE_ATKHLD(voice), - FX_COMB(fx, fx_lay, AWE_FX_ENV1_HOLD, AWE_FX_ENV1_ATTACK, - vp->parm.modatkhld)); - awe_poke(AWE_DCYSUS(voice), - FX_COMB(fx, fx_lay, AWE_FX_ENV1_SUSTAIN, AWE_FX_ENV1_DECAY, - vp->parm.moddcysus)); - awe_poke(AWE_ENVVOL(voice), - FX_WORD(fx, fx_lay, AWE_FX_ENV2_DELAY, vp->parm.voldelay)); - awe_poke(AWE_ATKHLDV(voice), - FX_COMB(fx, fx_lay, AWE_FX_ENV2_HOLD, AWE_FX_ENV2_ATTACK, - vp->parm.volatkhld)); - /* decay/sustain parameter for volume envelope must be set at last */ - - /* pitch offset */ - awe_set_pitch(voice, TRUE); - - /* cutoff and volume */ - awe_set_volume(voice, TRUE); - - /* modulation envelope heights */ - awe_poke(AWE_PEFE(voice), - FX_COMB(fx, fx_lay, AWE_FX_ENV1_PITCH, AWE_FX_ENV1_CUTOFF, - vp->parm.pefe)); - - /* lfo1/2 delay */ - awe_poke(AWE_LFO1VAL(voice), - FX_WORD(fx, fx_lay, AWE_FX_LFO1_DELAY, vp->parm.lfo1delay)); - awe_poke(AWE_LFO2VAL(voice), - FX_WORD(fx, fx_lay, AWE_FX_LFO2_DELAY, vp->parm.lfo2delay)); - - /* lfo1 pitch & cutoff shift */ - awe_fx_fmmod(voice, TRUE); - /* lfo1 volume & freq */ - awe_fx_tremfrq(voice, TRUE); - /* lfo2 pitch & freq */ - awe_fx_fm2frq2(voice, TRUE); - /* pan & loop start */ - awe_set_pan(voice, TRUE); - - /* chorus & loop end (chorus 8bit, MSB) */ - addr = vp->loopend - 1; - addr += FX_OFFSET(fx, fx_lay, AWE_FX_LOOP_END, - AWE_FX_COARSE_LOOP_END, vp->mode); - temp = FX_BYTE(fx, fx_lay, AWE_FX_CHORUS, vp->parm.chorus); - temp = (temp <<24) | (unsigned int)addr; - awe_poke_dw(AWE_CSL(voice), temp); - AWE_DEBUG(4,printk("AWE32: [-- loopend=%x/%x]\n", vp->loopend, addr)); - - /* Q & current address (Q 4bit value, MSB) */ - addr = vp->start - 1; - addr += FX_OFFSET(fx, fx_lay, AWE_FX_SAMPLE_START, - AWE_FX_COARSE_SAMPLE_START, vp->mode); - temp = FX_BYTE(fx, fx_lay, AWE_FX_FILTERQ, vp->parm.filterQ); - temp = (temp<<28) | (unsigned int)addr; - awe_poke_dw(AWE_CCCA(voice), temp); - AWE_DEBUG(4,printk("AWE32: [-- startaddr=%x/%x]\n", vp->start, addr)); - - /* reset volume */ - awe_poke_dw(AWE_VTFT(voice), 0x0000FFFF); - awe_poke_dw(AWE_CVCF(voice), 0x0000FFFF); - - /* turn on envelope */ - awe_poke(AWE_DCYSUSV(voice), - FX_COMB(fx, fx_lay, AWE_FX_ENV2_SUSTAIN, AWE_FX_ENV2_DECAY, - vp->parm.voldcysus)); - /* set reverb */ - temp = FX_BYTE(fx, fx_lay, AWE_FX_REVERB, vp->parm.reverb); - temp = (awe_peek_dw(AWE_PTRX(voice)) & 0xffff0000) | (temp<<8); - awe_poke_dw(AWE_PTRX(voice), temp); - awe_poke_dw(AWE_CPF(voice), 0x40000000); - - voices[voice].state = AWE_ST_ON; - - /* clear voice position for the next note on this channel */ - if (SINGLE_LAYER_MODE()) { - FX_UNSET(fx, AWE_FX_SAMPLE_START); - FX_UNSET(fx, AWE_FX_COARSE_SAMPLE_START); - } -} - - -/* turn off the voice */ -static void -awe_note_off(int voice) -{ - awe_voice_info *vp; - unsigned short tmp; - FX_Rec *fx = &voices[voice].cinfo->fx; - FX_Rec *fx_lay = NULL; - if (voices[voice].layer < MAX_LAYERS) - fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer]; - - if ((vp = voices[voice].sample) == NULL) { - voices[voice].state = AWE_ST_OFF; - return; - } - - tmp = 0x8000 | FX_BYTE(fx, fx_lay, AWE_FX_ENV1_RELEASE, - (unsigned char)vp->parm.modrelease); - awe_poke(AWE_DCYSUS(voice), tmp); - tmp = 0x8000 | FX_BYTE(fx, fx_lay, AWE_FX_ENV2_RELEASE, - (unsigned char)vp->parm.volrelease); - awe_poke(AWE_DCYSUSV(voice), tmp); - voices[voice].state = AWE_ST_RELEASED; -} - -/* force to terminate the voice (no releasing echo) */ -static void -awe_terminate(int voice) -{ - awe_poke(AWE_DCYSUSV(voice), 0x807F); - awe_tweak_voice(voice); - voices[voice].state = AWE_ST_OFF; -} - -/* turn off other voices with the same exclusive class (for drums) */ -static void -awe_exclusive_off(int voice) -{ - int i, exclass; - - if (voices[voice].sample == NULL) - return; - if ((exclass = voices[voice].sample->exclusiveClass) == 0) - return; /* not exclusive */ - - /* turn off voices with the same class */ - for (i = 0; i < awe_max_voices; i++) { - if (i != voice && IS_PLAYING(i) && - voices[i].sample && voices[i].ch == voices[voice].ch && - voices[i].sample->exclusiveClass == exclass) { - AWE_DEBUG(4,printk("AWE32: [exoff(%d)]\n", i)); - awe_terminate(i); - awe_voice_init(i, TRUE); - } - } -} - - -/*================================================================ - * change the parameters of an audible voice - *================================================================*/ - -/* change pitch */ -static void -awe_set_pitch(int voice, int forced) -{ - if (IS_NO_EFFECT(voice) && !forced) return; - awe_poke(AWE_IP(voice), voices[voice].apitch); - AWE_DEBUG(3,printk("AWE32: [-- pitch=%x]\n", voices[voice].apitch)); -} - -/* calculate & change pitch */ -static void -awe_set_voice_pitch(int voice, int forced) -{ - awe_calc_pitch(voice); - awe_set_pitch(voice, forced); -} - -/* change volume & cutoff */ -static void -awe_set_volume(int voice, int forced) -{ - awe_voice_info *vp; - unsigned short tmp2; - FX_Rec *fx = &voices[voice].cinfo->fx; - FX_Rec *fx_lay = NULL; - if (voices[voice].layer < MAX_LAYERS) - fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer]; - - if (!IS_PLAYING(voice) && !forced) return; - if ((vp = voices[voice].sample) == NULL || vp->index < 0) - return; - - tmp2 = FX_BYTE(fx, fx_lay, AWE_FX_CUTOFF, vp->parm.cutoff); - tmp2 = (tmp2 << 8); - tmp2 |= FX_BYTE(fx, fx_lay, AWE_FX_ATTEN, - (unsigned char)voices[voice].avol); - awe_poke(AWE_IFATN(voice), tmp2); -} - -/* calculate & change volume */ -static void -awe_set_voice_vol(int voice, int forced) -{ - if (IS_EMPTY(voice)) - return; - awe_calc_volume(voice); - awe_set_volume(voice, forced); -} - - -/* change pan; this could make a click noise.. */ -static void -awe_set_pan(int voice, int forced) -{ - unsigned int temp; - int addr; - awe_voice_info *vp; - FX_Rec *fx = &voices[voice].cinfo->fx; - FX_Rec *fx_lay = NULL; - if (voices[voice].layer < MAX_LAYERS) - fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer]; - - if (IS_NO_EFFECT(voice) && !forced) return; - if ((vp = voices[voice].sample) == NULL || vp->index < 0) - return; - - /* pan & loop start (pan 8bit, MSB, 0:right, 0xff:left) */ - if (vp->fixpan > 0) /* 0-127 */ - temp = 255 - (int)vp->fixpan * 2; - else { - int pos = 0; - if (vp->pan >= 0) /* 0-127 */ - pos = (int)vp->pan * 2 - 128; - pos += voices[voice].cinfo->panning; /* -128 - 127 */ - pos = 127 - pos; - if (pos < 0) - temp = 0; - else if (pos > 255) - temp = 255; - else - temp = pos; - } - if (forced || temp != voices[voice].apan) { - addr = vp->loopstart - 1; - addr += FX_OFFSET(fx, fx_lay, AWE_FX_LOOP_START, - AWE_FX_COARSE_LOOP_START, vp->mode); - temp = (temp<<24) | (unsigned int)addr; - awe_poke_dw(AWE_PSST(voice), temp); - voices[voice].apan = temp; - AWE_DEBUG(4,printk("AWE32: [-- loopstart=%x/%x]\n", vp->loopstart, addr)); - } -} - -/* effects change during playing */ -static void -awe_fx_fmmod(int voice, int forced) -{ - awe_voice_info *vp; - FX_Rec *fx = &voices[voice].cinfo->fx; - FX_Rec *fx_lay = NULL; - if (voices[voice].layer < MAX_LAYERS) - fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer]; - - if (IS_NO_EFFECT(voice) && !forced) return; - if ((vp = voices[voice].sample) == NULL || vp->index < 0) - return; - awe_poke(AWE_FMMOD(voice), - FX_COMB(fx, fx_lay, AWE_FX_LFO1_PITCH, AWE_FX_LFO1_CUTOFF, - vp->parm.fmmod)); -} - -/* set tremolo (lfo1) volume & frequency */ -static void -awe_fx_tremfrq(int voice, int forced) -{ - awe_voice_info *vp; - FX_Rec *fx = &voices[voice].cinfo->fx; - FX_Rec *fx_lay = NULL; - if (voices[voice].layer < MAX_LAYERS) - fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer]; - - if (IS_NO_EFFECT(voice) && !forced) return; - if ((vp = voices[voice].sample) == NULL || vp->index < 0) - return; - awe_poke(AWE_TREMFRQ(voice), - FX_COMB(fx, fx_lay, AWE_FX_LFO1_VOLUME, AWE_FX_LFO1_FREQ, - vp->parm.tremfrq)); -} - -/* set lfo2 pitch & frequency */ -static void -awe_fx_fm2frq2(int voice, int forced) -{ - awe_voice_info *vp; - FX_Rec *fx = &voices[voice].cinfo->fx; - FX_Rec *fx_lay = NULL; - if (voices[voice].layer < MAX_LAYERS) - fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer]; - - if (IS_NO_EFFECT(voice) && !forced) return; - if ((vp = voices[voice].sample) == NULL || vp->index < 0) - return; - awe_poke(AWE_FM2FRQ2(voice), - FX_COMB(fx, fx_lay, AWE_FX_LFO2_PITCH, AWE_FX_LFO2_FREQ, - vp->parm.fm2frq2)); -} - - -/* Q & current address (Q 4bit value, MSB) */ -static void -awe_fx_filterQ(int voice, int forced) -{ - unsigned int addr; - awe_voice_info *vp; - FX_Rec *fx = &voices[voice].cinfo->fx; - FX_Rec *fx_lay = NULL; - if (voices[voice].layer < MAX_LAYERS) - fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer]; - - if (IS_NO_EFFECT(voice) && !forced) return; - if ((vp = voices[voice].sample) == NULL || vp->index < 0) - return; - - addr = awe_peek_dw(AWE_CCCA(voice)) & 0xffffff; - addr |= (FX_BYTE(fx, fx_lay, AWE_FX_FILTERQ, vp->parm.filterQ) << 28); - awe_poke_dw(AWE_CCCA(voice), addr); -} - -/*================================================================ - * calculate pitch offset - *---------------------------------------------------------------- - * 0xE000 is no pitch offset at 44100Hz sample. - * Every 4096 is one octave. - *================================================================*/ - -static void -awe_calc_pitch(int voice) -{ - voice_info *vp = &voices[voice]; - awe_voice_info *ap; - awe_chan_info *cp = voices[voice].cinfo; - int offset; - - /* search voice information */ - if ((ap = vp->sample) == NULL) - return; - if (ap->index < 0) { - AWE_DEBUG(3,printk("AWE32: set sample (%d)\n", ap->sample)); - if (awe_set_sample(ap) < 0) - return; - } - - /* calculate offset */ - if (ap->fixkey >= 0) { - AWE_DEBUG(3,printk("AWE32: p-> fixkey(%d) tune(%d)\n", ap->fixkey, ap->tune)); - offset = (ap->fixkey - ap->root) * 4096 / 12; - } else { - AWE_DEBUG(3,printk("AWE32: p(%d)-> root(%d) tune(%d)\n", vp->note, ap->root, ap->tune)); - offset = (vp->note - ap->root) * 4096 / 12; - AWE_DEBUG(4,printk("AWE32: p-> ofs=%d\n", offset)); - } - offset = (offset * ap->scaleTuning) / 100; - AWE_DEBUG(4,printk("AWE32: p-> scale* ofs=%d\n", offset)); - offset += ap->tune * 4096 / 1200; - AWE_DEBUG(4,printk("AWE32: p-> tune+ ofs=%d\n", offset)); - if (cp->bender != 0) { - AWE_DEBUG(3,printk("AWE32: p-> bend(%d) %d\n", voice, cp->bender)); - /* (819200: 1 semitone) ==> (4096: 12 semitones) */ - offset += cp->bender * cp->bender_range / 2400; - } - - /* add initial pitch correction */ - if (FX_ON(&cp->fx_layer[vp->layer], AWE_FX_INIT_PITCH)) - offset += cp->fx_layer[vp->layer].val[AWE_FX_INIT_PITCH]; - else if (FX_ON(&cp->fx, AWE_FX_INIT_PITCH)) - offset += cp->fx.val[AWE_FX_INIT_PITCH]; - - /* 0xe000: root pitch */ - vp->apitch = 0xe000 + ap->rate_offset + offset; - AWE_DEBUG(4,printk("AWE32: p-> sum aofs=%x, rate_ofs=%d\n", vp->apitch, ap->rate_offset)); - if (vp->apitch > 0xffff) - vp->apitch = 0xffff; - if (vp->apitch < 0) - vp->apitch = 0; -} - - -#ifdef AWE_HAS_GUS_COMPATIBILITY -/* calculate MIDI key and semitone from the specified frequency */ -static void -awe_calc_pitch_from_freq(int voice, int freq) -{ - voice_info *vp = &voices[voice]; - awe_voice_info *ap; - FX_Rec *fx = &voices[voice].cinfo->fx; - FX_Rec *fx_lay = NULL; - int offset; - int note; - - if (voices[voice].layer < MAX_LAYERS) - fx_lay = &voices[voice].cinfo->fx_layer[voices[voice].layer]; - - /* search voice information */ - if ((ap = vp->sample) == NULL) - return; - if (ap->index < 0) { - AWE_DEBUG(3,printk("AWE32: set sample (%d)\n", ap->sample)); - if (awe_set_sample(ap) < 0) - return; - } - note = freq_to_note(freq); - offset = (note - ap->root * 100 + ap->tune) * 4096 / 1200; - offset = (offset * ap->scaleTuning) / 100; - if (fx_lay && FX_ON(fx_lay, AWE_FX_INIT_PITCH)) - offset += fx_lay->val[AWE_FX_INIT_PITCH]; - else if (FX_ON(fx, AWE_FX_INIT_PITCH)) - offset += fx->val[AWE_FX_INIT_PITCH]; - vp->apitch = 0xe000 + ap->rate_offset + offset; - if (vp->apitch > 0xffff) - vp->apitch = 0xffff; - if (vp->apitch < 0) - vp->apitch = 0; -} -#endif /* AWE_HAS_GUS_COMPATIBILITY */ - - -/*================================================================ - * calculate volume attenuation - *---------------------------------------------------------------- - * Voice volume is controlled by volume attenuation parameter. - * So volume becomes maximum when avol is 0 (no attenuation), and - * minimum when 255 (-96dB or silence). - *================================================================*/ - -static int vol_table[128] = { - 255,111,95,86,79,74,70,66,63,61,58,56,54,52,50,49, - 47,46,45,43,42,41,40,39,38,37,36,35,34,34,33,32, - 31,31,30,29,29,28,27,27,26,26,25,24,24,23,23,22, - 22,21,21,21,20,20,19,19,18,18,18,17,17,16,16,16, - 15,15,15,14,14,14,13,13,13,12,12,12,11,11,11,10, - 10,10,10,9,9,9,8,8,8,8,7,7,7,7,6,6, - 6,6,5,5,5,5,5,4,4,4,4,3,3,3,3,3, - 2,2,2,2,2,1,1,1,1,1,0,0,0,0,0,0, -}; - -static void -awe_calc_volume(int voice) -{ - voice_info *vp = &voices[voice]; - awe_voice_info *ap; - awe_chan_info *cp = voices[voice].cinfo; - int vol; - - /* search voice information */ - if ((ap = vp->sample) == NULL) - return; - - ap = vp->sample; - if (ap->index < 0) { - AWE_DEBUG(3,printk("AWE32: set sample (%d)\n", ap->sample)); - if (awe_set_sample(ap) < 0) - return; - } - - /* 0 - 127 */ - vol = (vp->velocity * cp->main_vol * cp->expression_vol) / (127*127); - vol = vol * ap->amplitude / 127; - - if (vol < 0) vol = 0; - if (vol > 127) vol = 127; - - /* calc to attenuation */ - vol = vol_table[vol]; - vol = vol + (int)ap->attenuation + init_atten; - if (vol > 255) vol = 255; - - vp->avol = vol; - AWE_DEBUG(3,printk("AWE32: [-- voice(%d) vol=%x]\n", voice, vol)); -} - - -/* set sostenuto on */ -static void awe_sostenuto_on(int voice, int forced) -{ - if (IS_NO_EFFECT(voice) && !forced) return; - voices[voice].sostenuto = 127; -} - - -/* drop sustain */ -static void awe_sustain_off(int voice, int forced) -{ - if (voices[voice].state == AWE_ST_SUSTAINED) { - awe_note_off(voice); - awe_fx_init(voices[voice].ch); - awe_voice_init(voice, FALSE); - } -} - - -/* terminate and initialize voice */ -static void awe_terminate_and_init(int voice, int forced) -{ - awe_terminate(voice); - awe_fx_init(voices[voice].ch); - awe_voice_init(voice, TRUE); -} - - -/*================================================================ - * synth operation routines - *================================================================*/ - -#define AWE_VOICE_KEY(v) (0x8000 | (v)) -#define AWE_CHAN_KEY(c,n) (((c) << 8) | ((n) + 1)) -#define KEY_CHAN_MATCH(key,c) (((key) >> 8) == (c)) - -/* initialize the voice */ -static void -awe_voice_init(int voice, int init_all) -{ - voice_info *vp = &voices[voice]; - - /* reset voice search key */ - if (playing_mode == AWE_PLAY_DIRECT) - vp->key = AWE_VOICE_KEY(voice); - else - vp->key = 0; - - /* clear voice mapping */ - voice_alloc->map[voice] = 0; - - /* touch the timing flag */ - vp->time = current_alloc_time; - - /* initialize other parameters if necessary */ - if (init_all) { - vp->note = -1; - vp->velocity = 0; - vp->sostenuto = 0; - - vp->sample = NULL; - vp->cinfo = &channels[voice]; - vp->ch = voice; - vp->state = AWE_ST_OFF; - - /* emu8000 parameters */ - vp->apitch = 0; - vp->avol = 255; - vp->apan = -1; - } -} - -/* clear effects */ -static void awe_fx_init(int ch) -{ - if (SINGLE_LAYER_MODE() && !misc_modes[AWE_MD_KEEP_EFFECT]) { - BZERO(&channels[ch].fx, sizeof(channels[ch].fx)); - BZERO(&channels[ch].fx_layer, sizeof(&channels[ch].fx_layer)); - } -} - -/* initialize channel info */ -static void awe_channel_init(int ch, int init_all) -{ - awe_chan_info *cp = &channels[ch]; - cp->channel = ch; - if (init_all) { - cp->panning = 0; /* zero center */ - cp->bender_range = 200; /* sense * 100 */ - cp->main_vol = 127; - if (MULTI_LAYER_MODE() && IS_DRUM_CHANNEL(ch)) { - cp->instr = misc_modes[AWE_MD_DEF_DRUM]; - cp->bank = AWE_DRUM_BANK; - } else { - cp->instr = misc_modes[AWE_MD_DEF_PRESET]; - cp->bank = misc_modes[AWE_MD_DEF_BANK]; - } - cp->vrec = -1; - cp->def_vrec = -1; - } - - cp->bender = 0; /* zero tune skew */ - cp->expression_vol = 127; - cp->chan_press = 0; - cp->sustained = 0; - - if (! misc_modes[AWE_MD_KEEP_EFFECT]) { - BZERO(&cp->fx, sizeof(cp->fx)); - BZERO(&cp->fx_layer, sizeof(cp->fx_layer)); - } -} - - -/* change the voice parameters; voice = channel */ -static void awe_voice_change(int voice, fx_affect_func func) -{ - int i; - switch (playing_mode) { - case AWE_PLAY_DIRECT: - func(voice, FALSE); - break; - case AWE_PLAY_INDIRECT: - for (i = 0; i < awe_max_voices; i++) - if (voices[i].key == AWE_VOICE_KEY(voice)) - func(i, FALSE); - break; - default: - for (i = 0; i < awe_max_voices; i++) - if (KEY_CHAN_MATCH(voices[i].key, voice)) - func(i, FALSE); - break; - } -} - - -/*---------------------------------------------------------------- - * device open / close - *----------------------------------------------------------------*/ - -/* open device: - * reset status of all voices, and clear sample position flag - */ -static int -awe_open(int dev, int mode) -{ - if (awe_busy) - return RET_ERROR(EBUSY); - - awe_busy = TRUE; - - /* set default mode */ - awe_init_misc_modes(FALSE); - init_atten = misc_modes[AWE_MD_ZERO_ATTEN]; - drum_flags = DEFAULT_DRUM_FLAGS; - playing_mode = AWE_PLAY_INDIRECT; - - /* reset voices & channels */ - awe_reset(dev); - - patch_opened = 0; - - return 0; -} - - -/* close device: - * reset all voices again (terminate sounds) - */ -static void -awe_close(int dev) -{ - awe_reset(dev); - awe_busy = FALSE; -} - - -/* set miscellaneous mode parameters - */ -static void -awe_init_misc_modes(int init_all) -{ - int i; - for (i = 0; i < AWE_MD_END; i++) { - if (init_all || misc_modes_default[i].init_each_time) - misc_modes[i] = misc_modes_default[i].value; - } -} - - -/* sequencer I/O control: - */ -static int -awe_ioctl(int dev, unsigned int cmd, caddr_t arg) -{ - switch (cmd) { - case SNDCTL_SYNTH_INFO: - if (playing_mode == AWE_PLAY_DIRECT) - awe_info.nr_voices = awe_max_voices; - else - awe_info.nr_voices = AWE_MAX_CHANNELS; - IOCTL_TO_USER((char*)arg, 0, &awe_info, sizeof(awe_info)); - return 0; - break; - - case SNDCTL_SEQ_RESETSAMPLES: - awe_reset_samples(); - awe_reset(dev); - return 0; - break; - - case SNDCTL_SEQ_PERCMODE: - /* what's this? */ - return 0; - break; - - case SNDCTL_SYNTH_MEMAVL: - return awe_mem_size - awe_free_mem_ptr() * 2; - - default: - printk("AWE32: unsupported ioctl %d\n", cmd); - return RET_ERROR(EINVAL); - } -} - - -static int voice_in_range(int voice) -{ - if (playing_mode == AWE_PLAY_DIRECT) { - if (voice < 0 || voice >= awe_max_voices) - return FALSE; - } else { - if (voice < 0 || voice >= AWE_MAX_CHANNELS) - return FALSE; - } - return TRUE; -} - -static void release_voice(int voice, int do_sustain) -{ - if (IS_NO_SOUND(voice)) - return; - if (do_sustain && (voices[voice].cinfo->sustained == 127 || - voices[voice].sostenuto == 127)) - voices[voice].state = AWE_ST_SUSTAINED; - else { - awe_note_off(voice); - awe_fx_init(voices[voice].ch); - awe_voice_init(voice, FALSE); - } -} - -/* release all notes */ -static void awe_note_off_all(int do_sustain) -{ - int i; - for (i = 0; i < awe_max_voices; i++) - release_voice(i, do_sustain); -} - -/* kill a voice: - * not terminate, just release the voice. - */ -static int -awe_kill_note(int dev, int voice, int note, int velocity) -{ - int i, v2, key; - - AWE_DEBUG(2,printk("AWE32: [off(%d) nt=%d vl=%d]\n", voice, note, velocity)); - if (! voice_in_range(voice)) - return RET_ERROR(EINVAL); - - switch (playing_mode) { - case AWE_PLAY_DIRECT: - case AWE_PLAY_INDIRECT: - key = AWE_VOICE_KEY(voice); - break; - - case AWE_PLAY_MULTI2: - v2 = voice_alloc->map[voice] >> 8; - voice_alloc->map[voice] = 0; - voice = v2; - if (voice < 0 || voice >= AWE_MAX_CHANNELS) - return RET_ERROR(EINVAL); - /* continue to below */ - default: - key = AWE_CHAN_KEY(voice, note); - break; - } - - for (i = 0; i < awe_max_voices; i++) { - if (voices[i].key == key) - release_voice(i, TRUE); - } - return 0; -} - - -static void start_or_volume_change(int voice, int velocity) -{ - voices[voice].velocity = velocity; - awe_calc_volume(voice); - if (voices[voice].state == AWE_ST_STANDBY) - awe_note_on(voice); - else if (voices[voice].state == AWE_ST_ON) - awe_set_volume(voice, FALSE); -} - -static void set_and_start_voice(int voice, int state) -{ - /* calculate pitch & volume parameters */ - voices[voice].state = state; - awe_calc_pitch(voice); - awe_calc_volume(voice); - if (state == AWE_ST_ON) - awe_note_on(voice); -} - -/* start a voice: - * if note is 255, identical with aftertouch function. - * Otherwise, start a voice with specified not and volume. - */ -static int -awe_start_note(int dev, int voice, int note, int velocity) -{ - int i, key, state, volonly; - - AWE_DEBUG(2,printk("AWE32: [on(%d) nt=%d vl=%d]\n", voice, note, velocity)); - if (! voice_in_range(voice)) - return RET_ERROR(EINVAL); - - if (velocity == 0) - state = AWE_ST_STANDBY; /* stand by for playing */ - else - state = AWE_ST_ON; /* really play */ - volonly = FALSE; - - switch (playing_mode) { - case AWE_PLAY_DIRECT: - case AWE_PLAY_INDIRECT: - key = AWE_VOICE_KEY(voice); - if (note == 255) - volonly = TRUE; - break; - - case AWE_PLAY_MULTI2: - voice = voice_alloc->map[voice] >> 8; - if (voice < 0 || voice >= AWE_MAX_CHANNELS) - return RET_ERROR(EINVAL); - /* continue to below */ - default: - if (note >= 128) { /* key volume mode */ - note -= 128; - volonly = TRUE; - } - key = AWE_CHAN_KEY(voice, note); - break; - } - - /* dynamic volume change */ - if (volonly) { - for (i = 0; i < awe_max_voices; i++) { - if (voices[i].key == key) - start_or_volume_change(i, velocity); - } - return 0; - } - - /* if the same note still playing, stop it */ - for (i = 0; i < awe_max_voices; i++) - if (voices[i].key == key) { - if (voices[i].state == AWE_ST_ON) { - awe_note_off(i); - awe_voice_init(i, FALSE); - } else if (voices[i].state == AWE_ST_STANDBY) - awe_voice_init(i, TRUE); - } - - /* allocate voices */ - if (playing_mode == AWE_PLAY_DIRECT) - awe_alloc_one_voice(voice, note, velocity); - else - awe_alloc_multi_voices(voice, note, velocity, key); - - /* turn off other voices exlusively (for drums) */ - for (i = 0; i < awe_max_voices; i++) - if (voices[i].key == key) - awe_exclusive_off(i); - - /* set up pitch and volume parameters */ - for (i = 0; i < awe_max_voices; i++) { - if (voices[i].key == key && voices[i].state == AWE_ST_OFF) - set_and_start_voice(i, state); - } - - return 0; -} - - -/* search instrument from preset table with the specified bank */ -static int -awe_search_instr(int bank, int preset) -{ - int i; - - for (i = preset_table[preset]; i >= 0; i = infos[i].next_bank) { - if (infos[i].bank == bank) - return i; - } - return -1; -} - - -/* assign the instrument to a voice */ -static int -awe_set_instr_2(int dev, int voice, int instr_no) -{ - if (playing_mode == AWE_PLAY_MULTI2) { - voice = voice_alloc->map[voice] >> 8; - if (voice < 0 || voice >= AWE_MAX_CHANNELS) - return RET_ERROR(EINVAL); - } - return awe_set_instr(dev, voice, instr_no); -} - -/* assign the instrument to a channel; voice is the channel number */ -static int -awe_set_instr(int dev, int voice, int instr_no) -{ - awe_chan_info *cinfo; - int def_bank; - - if (! voice_in_range(voice)) - return RET_ERROR(EINVAL); - - if (instr_no < 0 || instr_no >= AWE_MAX_PRESETS) - return RET_ERROR(EINVAL); - - cinfo = &channels[voice]; - - if (MULTI_LAYER_MODE() && IS_DRUM_CHANNEL(voice)) - def_bank = AWE_DRUM_BANK; /* always search drumset */ - else - def_bank = cinfo->bank; - - cinfo->vrec = -1; - cinfo->def_vrec = -1; - cinfo->vrec = awe_search_instr(def_bank, instr_no); - if (def_bank == AWE_DRUM_BANK) /* search default drumset */ - cinfo->def_vrec = awe_search_instr(def_bank, misc_modes[AWE_MD_DEF_DRUM]); - else /* search default preset */ - cinfo->def_vrec = awe_search_instr(misc_modes[AWE_MD_DEF_BANK], instr_no); - - if (cinfo->vrec < 0 && cinfo->def_vrec < 0) { - AWE_DEBUG(1,printk("AWE32 Warning: can't find instrument %d\n", instr_no)); - } - - cinfo->instr = instr_no; - - return 0; -} - - -/* reset all voices; terminate sounds and initialize parameters */ -static void -awe_reset(int dev) -{ - int i; - current_alloc_time = 0; - /* don't turn off voice 31 and 32. they are used also for FM voices */ - for (i = 0; i < awe_max_voices; i++) { - awe_terminate(i); - awe_voice_init(i, TRUE); - } - for (i = 0; i < AWE_MAX_CHANNELS; i++) - awe_channel_init(i, TRUE); - for (i = 0; i < 16; i++) { - awe_operations.chn_info[i].controllers[CTL_MAIN_VOLUME] = 127; - awe_operations.chn_info[i].controllers[CTL_EXPRESSION] = 127; - } - awe_init_fm(); - awe_tweak(); -} - - -/* hardware specific control: - * GUS specific and AWE32 specific controls are available. - */ -static void -awe_hw_control(int dev, unsigned char *event) -{ - int cmd = event[2]; - if (cmd & _AWE_MODE_FLAG) - awe_hw_awe_control(dev, cmd & _AWE_MODE_VALUE_MASK, event); -#ifdef AWE_HAS_GUS_COMPATIBILITY - else - awe_hw_gus_control(dev, cmd & _AWE_MODE_VALUE_MASK, event); -#endif -} - - -#ifdef AWE_HAS_GUS_COMPATIBILITY - -/* GUS compatible controls */ -static void -awe_hw_gus_control(int dev, int cmd, unsigned char *event) -{ - int voice, i, key; - unsigned short p1; - short p2; - int plong; - - if (MULTI_LAYER_MODE()) - return; - if (cmd == _GUS_NUMVOICES) - return; - - voice = event[3]; - if (! voice_in_range(voice)) - return; - - p1 = *(unsigned short *) &event[4]; - p2 = *(short *) &event[6]; - plong = *(int*) &event[4]; - - switch (cmd) { - case _GUS_VOICESAMPLE: - awe_set_instr(dev, voice, p1); - return; - - case _GUS_VOICEBALA: - /* 0 to 15 --> -128 to 127 */ - awe_panning(dev, voice, ((int)p1 << 4) - 128); - return; - - case _GUS_VOICEVOL: - case _GUS_VOICEVOL2: - /* not supported yet */ - return; - - case _GUS_RAMPRANGE: - case _GUS_RAMPRATE: - case _GUS_RAMPMODE: - case _GUS_RAMPON: - case _GUS_RAMPOFF: - /* volume ramping not supported */ - return; - - case _GUS_VOLUME_SCALE: - return; - - case _GUS_VOICE_POS: - FX_SET(&channels[voice].fx, AWE_FX_SAMPLE_START, - (short)(plong & 0x7fff)); - FX_SET(&channels[voice].fx, AWE_FX_COARSE_SAMPLE_START, - (plong >> 15) & 0xffff); - return; - } - - key = AWE_VOICE_KEY(voice); - for (i = 0; i < awe_max_voices; i++) { - if (voices[i].key == key) { - switch (cmd) { - case _GUS_VOICEON: - awe_note_on(i); - break; - - case _GUS_VOICEOFF: - awe_terminate(i); - awe_fx_init(voices[i].ch); - awe_voice_init(i, TRUE); - break; - - case _GUS_VOICEFADE: - awe_note_off(i); - awe_fx_init(voices[i].ch); - awe_voice_init(i, FALSE); - break; - - case _GUS_VOICEFREQ: - awe_calc_pitch_from_freq(i, plong); - break; - } - } - } -} - -#endif - - -/* AWE32 specific controls */ -static void -awe_hw_awe_control(int dev, int cmd, unsigned char *event) -{ - int voice; - unsigned short p1; - short p2; - awe_chan_info *cinfo; - FX_Rec *fx; - int i; - - voice = event[3]; - if (! voice_in_range(voice)) - return; - - if (playing_mode == AWE_PLAY_MULTI2) { - voice = voice_alloc->map[voice] >> 8; - if (voice < 0 || voice >= AWE_MAX_CHANNELS) - return; - } - - p1 = *(unsigned short *) &event[4]; - p2 = *(short *) &event[6]; - cinfo = &channels[voice]; - - switch (cmd) { - case _AWE_DEBUG_MODE: - debug_mode = p1; - printk("AWE32: debug mode = %d\n", debug_mode); - break; - case _AWE_REVERB_MODE: - awe_set_reverb_mode(p1); - break; - - case _AWE_CHORUS_MODE: - awe_set_chorus_mode(p1); - break; - - case _AWE_REMOVE_LAST_SAMPLES: - AWE_DEBUG(0,printk("AWE32: remove last samples\n")); - if (locked_sf_id > 0) - awe_remove_samples(locked_sf_id); - break; - - case _AWE_INITIALIZE_CHIP: - awe_initialize(); - break; - - case _AWE_SEND_EFFECT: - fx = &cinfo->fx; - i = FX_FLAG_SET; - if (p1 >= 0x100) { - int layer = (p1 >> 8); - if (layer >= 0 && layer < MAX_LAYERS) - fx = &cinfo->fx_layer[layer]; - p1 &= 0xff; - } - if (p1 & 0x40) i = FX_FLAG_OFF; - if (p1 & 0x80) i = FX_FLAG_ADD; - p1 &= 0x3f; - if (p1 < AWE_FX_END) { - AWE_DEBUG(0,printk("AWE32: effects (%d) %d %d\n", voice, p1, p2)); - if (i == FX_FLAG_SET) - FX_SET(fx, p1, p2); - else if (i == FX_FLAG_ADD) - FX_ADD(fx, p1, p2); - else - FX_UNSET(fx, p1); - if (i != FX_FLAG_OFF && parm_defs[p1].realtime) { - AWE_DEBUG(0,printk("AWE32: fx_realtime (%d)\n", voice)); - awe_voice_change(voice, parm_defs[p1].realtime); - } - } - break; - - case _AWE_RESET_CHANNEL: - awe_channel_init(voice, !p1); - break; - - case _AWE_TERMINATE_ALL: - awe_reset(0); - break; - - case _AWE_TERMINATE_CHANNEL: - awe_voice_change(voice, awe_terminate_and_init); - break; - - case _AWE_RELEASE_ALL: - awe_note_off_all(FALSE); - break; - case _AWE_NOTEOFF_ALL: - awe_note_off_all(TRUE); - break; - - case _AWE_INITIAL_VOLUME: - AWE_DEBUG(0,printk("AWE32: init attenuation %d\n", p1)); - if (p2 == 0) /* absolute value */ - init_atten = (short)p1; - else /* relative value */ - init_atten = misc_modes[AWE_MD_ZERO_ATTEN] + (short)p1; - if (init_atten < 0) init_atten = 0; - for (i = 0; i < awe_max_voices; i++) - awe_set_voice_vol(i, TRUE); - break; - - case _AWE_CHN_PRESSURE: - cinfo->chan_press = p1; - p1 = p1 * misc_modes[AWE_MD_MOD_SENSE] / 1200; - FX_ADD(&cinfo->fx, AWE_FX_LFO1_PITCH, p1); - awe_voice_change(voice, awe_fx_fmmod); - FX_ADD(&cinfo->fx, AWE_FX_LFO2_PITCH, p1); - awe_voice_change(voice, awe_fx_fm2frq2); - break; - - case _AWE_CHANNEL_MODE: - AWE_DEBUG(0,printk("AWE32: channel mode = %d\n", p1)); - playing_mode = p1; - awe_reset(0); - break; - - case _AWE_DRUM_CHANNELS: - AWE_DEBUG(0,printk("AWE32: drum flags = %x\n", p1)); - drum_flags = *(unsigned int*)&event[4]; - break; - - case _AWE_MISC_MODE: - AWE_DEBUG(0,printk("AWE32: misc mode = %d %d\n", p1, p2)); - if (p1 > AWE_MD_VERSION && p1 < AWE_MD_END) - misc_modes[p1] = p2; - break; - - case _AWE_EQUALIZER: - awe_equalizer((int)p1, (int)p2); - break; - - default: - AWE_DEBUG(0,printk("AWE32: hw control cmd=%d voice=%d\n", cmd, voice)); - break; - } -} - - -/* voice pressure change */ -static void -awe_aftertouch(int dev, int voice, int pressure) -{ - int note; - - AWE_DEBUG(2,printk("AWE32: [after(%d) %d]\n", voice, pressure)); - if (! voice_in_range(voice)) - return; - - switch (playing_mode) { - case AWE_PLAY_DIRECT: - case AWE_PLAY_INDIRECT: - awe_start_note(dev, voice, 255, pressure); - break; - case AWE_PLAY_MULTI2: - note = (voice_alloc->map[voice] & 0xff) - 1; - awe_start_note(dev, voice, note + 0x80, pressure); - break; - } -} - - -/* voice control change */ -static void -awe_controller(int dev, int voice, int ctrl_num, int value) -{ - int i; - awe_chan_info *cinfo; - - if (! voice_in_range(voice)) - return; - - if (playing_mode == AWE_PLAY_MULTI2) { - voice = voice_alloc->map[voice] >> 8; - if (voice < 0 || voice >= AWE_MAX_CHANNELS) - return; - } - - cinfo = &channels[voice]; - - switch (ctrl_num) { - case CTL_BANK_SELECT: /* MIDI control #0 */ - AWE_DEBUG(2,printk("AWE32: [bank(%d) %d]\n", voice, value)); - if (MULTI_LAYER_MODE() && IS_DRUM_CHANNEL(voice) && - !misc_modes[AWE_MD_TOGGLE_DRUM_BANK]) - break; - cinfo->bank = value; - if (cinfo->bank == AWE_DRUM_BANK) - DRUM_CHANNEL_ON(cinfo->channel); - else - DRUM_CHANNEL_OFF(cinfo->channel); - awe_set_instr(dev, voice, cinfo->instr); - break; - - case CTL_MODWHEEL: /* MIDI control #1 */ - AWE_DEBUG(2,printk("AWE32: [modwheel(%d) %d]\n", voice, value)); - i = value * misc_modes[AWE_MD_MOD_SENSE] / 1200; - FX_ADD(&cinfo->fx, AWE_FX_LFO1_PITCH, i); - awe_voice_change(voice, awe_fx_fmmod); - FX_ADD(&cinfo->fx, AWE_FX_LFO2_PITCH, i); - awe_voice_change(voice, awe_fx_fm2frq2); - break; - - case CTRL_PITCH_BENDER: /* SEQ1 V2 contorl */ - AWE_DEBUG(2,printk("AWE32: [bend(%d) %d]\n", voice, value)); - /* zero centered */ - cinfo->bender = value; - awe_voice_change(voice, awe_set_voice_pitch); - break; - - case CTRL_PITCH_BENDER_RANGE: /* SEQ1 V2 control */ - AWE_DEBUG(2,printk("AWE32: [range(%d) %d]\n", voice, value)); - /* value = sense x 100 */ - cinfo->bender_range = value; - /* no audible pitch change yet.. */ - break; - - case CTL_EXPRESSION: /* MIDI control #11 */ - if (SINGLE_LAYER_MODE()) - value /= 128; - case CTRL_EXPRESSION: /* SEQ1 V2 control */ - AWE_DEBUG(2,printk("AWE32: [expr(%d) %d]\n", voice, value)); - /* 0 - 127 */ - cinfo->expression_vol = value; - awe_voice_change(voice, awe_set_voice_vol); - break; - - case CTL_PAN: /* MIDI control #10 */ - AWE_DEBUG(2,printk("AWE32: [pan(%d) %d]\n", voice, value)); - /* (0-127) -> signed 8bit */ - cinfo->panning = value * 2 - 128; - if (misc_modes[AWE_MD_REALTIME_PAN]) - awe_voice_change(voice, awe_set_pan); - break; - - case CTL_MAIN_VOLUME: /* MIDI control #7 */ - if (SINGLE_LAYER_MODE()) - value = (value * 100) / 16383; - case CTRL_MAIN_VOLUME: /* SEQ1 V2 control */ - AWE_DEBUG(2,printk("AWE32: [mainvol(%d) %d]\n", voice, value)); - /* 0 - 127 */ - cinfo->main_vol = value; - awe_voice_change(voice, awe_set_voice_vol); - break; - - case CTL_EXT_EFF_DEPTH: /* reverb effects: 0-127 */ - AWE_DEBUG(2,printk("AWE32: [reverb(%d) %d]\n", voice, value)); - FX_SET(&cinfo->fx, AWE_FX_REVERB, value * 2); - break; - - case CTL_CHORUS_DEPTH: /* chorus effects: 0-127 */ - AWE_DEBUG(2,printk("AWE32: [chorus(%d) %d]\n", voice, value)); - FX_SET(&cinfo->fx, AWE_FX_CHORUS, value * 2); - break; - -#ifdef AWE_ACCEPT_ALL_SOUNDS_CONTROLL - case 120: /* all sounds off */ - awe_note_off_all(FALSE); - break; - case 123: /* all notes off */ - awe_note_off_all(TRUE); - break; -#endif - - case CTL_SUSTAIN: /* MIDI control #64 */ - cinfo->sustained = value; - if (value != 127) - awe_voice_change(voice, awe_sustain_off); - break; - - case CTL_SOSTENUTO: /* MIDI control #66 */ - if (value == 127) - awe_voice_change(voice, awe_sostenuto_on); - else - awe_voice_change(voice, awe_sustain_off); - break; - - default: - AWE_DEBUG(0,printk("AWE32: [control(%d) ctrl=%d val=%d]\n", - voice, ctrl_num, value)); - break; - } -} - - -/* voice pan change (value = -128 - 127) */ -static void -awe_panning(int dev, int voice, int value) -{ - awe_chan_info *cinfo; - - if (! voice_in_range(voice)) - return; - - if (playing_mode == AWE_PLAY_MULTI2) { - voice = voice_alloc->map[voice] >> 8; - if (voice < 0 || voice >= AWE_MAX_CHANNELS) - return; - } - - cinfo = &channels[voice]; - cinfo->panning = value; - AWE_DEBUG(2,printk("AWE32: [pan(%d) %d]\n", voice, cinfo->panning)); - if (misc_modes[AWE_MD_REALTIME_PAN]) - awe_voice_change(voice, awe_set_pan); -} - - -/* volume mode change */ -static void -awe_volume_method(int dev, int mode) -{ - /* not impremented */ - AWE_DEBUG(0,printk("AWE32: [volmethod mode=%d]\n", mode)); -} - - -#ifndef AWE_NO_PATCHMGR -/* patch manager */ -static int -awe_patchmgr(int dev, struct patmgr_info *rec) -{ - printk("AWE32 Warning: patch manager control not supported\n"); - return 0; -} -#endif - - -/* pitch wheel change: 0-16384 */ -static void -awe_bender(int dev, int voice, int value) -{ - awe_chan_info *cinfo; - - if (! voice_in_range(voice)) - return; - - if (playing_mode == AWE_PLAY_MULTI2) { - voice = voice_alloc->map[voice] >> 8; - if (voice < 0 || voice >= AWE_MAX_CHANNELS) - return; - } - - /* convert to zero centered value */ - cinfo = &channels[voice]; - cinfo->bender = value - 8192; - AWE_DEBUG(2,printk("AWE32: [bend(%d) %d]\n", voice, cinfo->bender)); - awe_voice_change(voice, awe_set_voice_pitch); -} - - -/*---------------------------------------------------------------- - * load a sound patch: - * three types of patches are accepted: AWE, GUS, and SYSEX. - *----------------------------------------------------------------*/ - -static int -awe_load_patch(int dev, int format, const char *addr, - int offs, int count, int pmgr_flag) -{ - awe_patch_info patch; - int rc = 0; - -#ifdef AWE_HAS_GUS_COMPATIBILITY - if (format == GUS_PATCH) { - return awe_load_guspatch(addr, offs, count, pmgr_flag); - } else -#endif - if (format == SYSEX_PATCH) { - /* no system exclusive message supported yet */ - return 0; - } else if (format != AWE_PATCH) { - printk("AWE32 Error: Invalid patch format (key) 0x%x\n", format); - return RET_ERROR(EINVAL); - } - - if (count < AWE_PATCH_INFO_SIZE) { - printk("AWE32 Error: Patch header too short\n"); - return RET_ERROR(EINVAL); - } - COPY_FROM_USER(((char*)&patch) + offs, addr, offs, - AWE_PATCH_INFO_SIZE - offs); - - count -= AWE_PATCH_INFO_SIZE; - if (count < patch.len) { - printk("AWE32: sample: Patch record too short (%d<%d)\n", - count, patch.len); - return RET_ERROR(EINVAL); - } - - switch (patch.type) { - case AWE_LOAD_INFO: - rc = awe_load_info(&patch, addr, count); - break; - case AWE_LOAD_DATA: - rc = awe_load_data(&patch, addr, count); - break; - case AWE_OPEN_PATCH: - rc = awe_open_patch(&patch, addr, count); - break; - case AWE_CLOSE_PATCH: - rc = awe_close_patch(&patch, addr, count); - break; - case AWE_UNLOAD_PATCH: - rc = awe_unload_patch(&patch, addr, count); - break; - case AWE_REPLACE_DATA: - rc = awe_replace_data(&patch, addr, count); - break; - case AWE_MAP_PRESET: - rc = awe_load_map(&patch, addr, count); - break; - case AWE_LOAD_CHORUS_FX: - rc = awe_load_chorus_fx(&patch, addr, count); - break; - case AWE_LOAD_REVERB_FX: - rc = awe_load_reverb_fx(&patch, addr, count); - break; - - default: - printk("AWE32 Error: unknown patch format type %d\n", - patch.type); - rc = RET_ERROR(EINVAL); - } - - return rc; -} - - -/* create an sflist record */ -static int -awe_create_sf(int type, char *name) -{ - sf_list *rec; - - /* terminate sounds */ - awe_reset(0); - if (current_sf_id >= max_sfs) { - int newsize = max_sfs + AWE_MAX_SF_LISTS; - sf_list *newlist = my_realloc(sflists, sizeof(sf_list)*max_sfs, - sizeof(sf_list)*newsize); - if (newlist == NULL) - return 1; - sflists = newlist; - max_sfs = newsize; - } - rec = &sflists[current_sf_id]; - rec->sf_id = current_sf_id + 1; - rec->type = type; - if (current_sf_id == 0 || (type & AWE_PAT_LOCKED) != 0) - locked_sf_id = current_sf_id + 1; - /* - if (name) - MEMCPY(rec->name, name, AWE_PATCH_NAME_LEN); - else - BZERO(rec->name, AWE_PATCH_NAME_LEN); - */ - rec->num_info = awe_free_info(); - rec->num_sample = awe_free_sample(); - rec->mem_ptr = awe_free_mem_ptr(); - rec->infos = -1; - rec->samples = -1; - - current_sf_id++; - return 0; -} - - -/* open patch; create sf list and set opened flag */ -static int -awe_open_patch(awe_patch_info *patch, const char *addr, int count) -{ - awe_open_parm parm; - COPY_FROM_USER(&parm, addr, AWE_PATCH_INFO_SIZE, sizeof(parm)); - if (awe_create_sf(parm.type, parm.name)) { - printk("AWE32: can't open: failed to alloc new list\n"); - return RET_ERROR(ENOSPC); - } - patch_opened = TRUE; - return current_sf_id; -} - -/* check if the patch is already opened */ -static int -check_patch_opened(int type, char *name) -{ - if (! patch_opened) { - if (awe_create_sf(type, name)) { - printk("AWE32: failed to alloc new list\n"); - return RET_ERROR(ENOSPC); - } - patch_opened = TRUE; - return current_sf_id; - } - return current_sf_id; -} - -/* close the patch; if no voice is loaded, remove the patch */ -static int -awe_close_patch(awe_patch_info *patch, const char *addr, int count) -{ - if (patch_opened && current_sf_id > 0) { - /* if no voice is loaded, release the current patch */ - if (sflists[current_sf_id-1].infos == -1) - awe_remove_samples(current_sf_id - 1); - } - patch_opened = 0; - return 0; -} - - -/* remove the latest patch */ -static int -awe_unload_patch(awe_patch_info *patch, const char *addr, int count) -{ - if (current_sf_id > 0) - awe_remove_samples(current_sf_id - 1); - return 0; -} - -/* allocate voice info list records */ -static int alloc_new_info(int nvoices) -{ - int newsize, free_info; - awe_voice_list *newlist; - free_info = awe_free_info(); - if (free_info + nvoices >= max_infos) { - do { - newsize = max_infos + AWE_MAX_INFOS; - } while (free_info + nvoices >= newsize); - newlist = my_realloc(infos, sizeof(awe_voice_list)*max_infos, - sizeof(awe_voice_list)*newsize); - if (newlist == NULL) { - printk("AWE32: can't alloc info table\n"); - return RET_ERROR(ENOSPC); - } - infos = newlist; - max_infos = newsize; - } - return 0; -} - -/* allocate sample info list records */ -static int alloc_new_sample(void) -{ - int newsize, free_sample; - awe_sample_list *newlist; - free_sample = awe_free_sample(); - if (free_sample >= max_samples) { - newsize = max_samples + AWE_MAX_SAMPLES; - newlist = my_realloc(samples, - sizeof(awe_sample_list)*max_samples, - sizeof(awe_sample_list)*newsize); - if (newlist == NULL) { - printk("AWE32: can't alloc sample table\n"); - return RET_ERROR(ENOSPC); - } - samples = newlist; - max_samples = newsize; - } - return 0; -} - -/* load voice map */ -static int -awe_load_map(awe_patch_info *patch, const char *addr, int count) -{ - awe_voice_map map; - awe_voice_list *rec; - int free_info; - - if (check_patch_opened(AWE_PAT_TYPE_MAP, NULL) < 0) - return RET_ERROR(ENOSPC); - if (alloc_new_info(1) < 0) - return RET_ERROR(ENOSPC); - - COPY_FROM_USER(&map, addr, AWE_PATCH_INFO_SIZE, sizeof(map)); - - free_info = awe_free_info(); - rec = &infos[free_info]; - rec->bank = map.map_bank; - rec->instr = map.map_instr; - rec->type = V_ST_MAPPED; - rec->disabled = FALSE; - awe_init_voice_info(&rec->v); - if (map.map_key >= 0) { - rec->v.low = map.map_key; - rec->v.high = map.map_key; - } - rec->v.start = map.src_instr; - rec->v.end = map.src_bank; - rec->v.fixkey = map.src_key; - rec->v.sf_id = current_sf_id; - add_info_list(free_info); - add_sf_info(free_info); - - return 0; -} - -/* load voice information data */ -static int -awe_load_info(awe_patch_info *patch, const char *addr, int count) -{ - int offset; - awe_voice_rec_hdr hdr; - int i; - int total_size; - - if (count < AWE_VOICE_REC_SIZE) { - printk("AWE32 Error: invalid patch info length\n"); - return RET_ERROR(EINVAL); - } - - offset = AWE_PATCH_INFO_SIZE; - COPY_FROM_USER((char*)&hdr, addr, offset, AWE_VOICE_REC_SIZE); - offset += AWE_VOICE_REC_SIZE; - - if (hdr.nvoices <= 0 || hdr.nvoices >= 100) { - printk("AWE32 Error: Illegal voice number %d\n", hdr.nvoices); - return RET_ERROR(EINVAL); - } - total_size = AWE_VOICE_REC_SIZE + AWE_VOICE_INFO_SIZE * hdr.nvoices; - if (count < total_size) { - printk("AWE32 Error: patch length(%d) is smaller than nvoices(%d)\n", - count, hdr.nvoices); - return RET_ERROR(EINVAL); - } - - if (check_patch_opened(AWE_PAT_TYPE_MISC, NULL) < 0) - return RET_ERROR(ENOSPC); - -#if 0 /* it looks like not so useful.. */ - /* check if the same preset already exists in the info list */ - for (i = sflists[current_sf_id-1].infos; i >= 0; i = infos[i].next) { - if (infos[i].disabled) continue; - if (infos[i].bank == hdr.bank && infos[i].instr == hdr.instr) { - /* in exclusive mode, do skip loading this */ - if (hdr.write_mode == AWE_WR_EXCLUSIVE) - return 0; - /* in replace mode, disable the old data */ - else if (hdr.write_mode == AWE_WR_REPLACE) - infos[i].disabled = TRUE; - } - } - if (hdr.write_mode == AWE_WR_REPLACE) - rebuild_preset_list(); -#endif - - if (alloc_new_info(hdr.nvoices) < 0) - return RET_ERROR(ENOSPC); - - for (i = 0; i < hdr.nvoices; i++) { - int rec = awe_free_info(); - - infos[rec].bank = hdr.bank; - infos[rec].instr = hdr.instr; - infos[rec].type = V_ST_NORMAL; - infos[rec].disabled = FALSE; - - /* copy awe_voice_info parameters */ - COPY_FROM_USER(&infos[rec].v, addr, offset, AWE_VOICE_INFO_SIZE); - offset += AWE_VOICE_INFO_SIZE; - infos[rec].v.sf_id = current_sf_id; - if (infos[rec].v.mode & AWE_MODE_INIT_PARM) - awe_init_voice_parm(&infos[rec].v.parm); - awe_set_sample(&infos[rec].v); - add_info_list(rec); - add_sf_info(rec); - } - - return 0; -} - -/* load wave sample data */ -static int -awe_load_data(awe_patch_info *patch, const char *addr, int count) -{ - int offset, size; - int rc, free_sample; - awe_sample_info *rec; - - if (check_patch_opened(AWE_PAT_TYPE_MISC, NULL) < 0) - return RET_ERROR(ENOSPC); - - if (alloc_new_sample() < 0) - return RET_ERROR(ENOSPC); - - free_sample = awe_free_sample(); - rec = &samples[free_sample].v; - - size = (count - AWE_SAMPLE_INFO_SIZE) / 2; - offset = AWE_PATCH_INFO_SIZE; - COPY_FROM_USER(rec, addr, offset, AWE_SAMPLE_INFO_SIZE); - offset += AWE_SAMPLE_INFO_SIZE; - if (size != rec->size) { - printk("AWE32: load: sample size differed (%d != %d)\n", - rec->size, size); - return RET_ERROR(EINVAL); - } - if (rec->size > 0) - if ((rc = awe_write_wave_data(addr, offset, rec, -1)) != 0) - return rc; - - rec->sf_id = current_sf_id; - - add_sf_sample(free_sample); - - return 0; -} - - -/* replace wave sample data */ -static int -awe_replace_data(awe_patch_info *patch, const char *addr, int count) -{ - int offset; - int size; - int rc, i; - int channels; - awe_sample_info cursmp; - int save_mem_ptr; - - if (! patch_opened) { - printk("AWE32: replace: patch not opened\n"); - return RET_ERROR(EINVAL); - } - - size = (count - AWE_SAMPLE_INFO_SIZE) / 2; - offset = AWE_PATCH_INFO_SIZE; - COPY_FROM_USER(&cursmp, addr, offset, AWE_SAMPLE_INFO_SIZE); - offset += AWE_SAMPLE_INFO_SIZE; - if (cursmp.size == 0 || size != cursmp.size) { - printk("AWE32: replace: illegal sample size (%d!=%d)\n", - cursmp.size, size); - return RET_ERROR(EINVAL); - } - channels = patch->optarg; - if (channels <= 0 || channels > AWE_NORMAL_VOICES) { - printk("AWE32: replace: illegal channels %d\n", channels); - return RET_ERROR(EINVAL); - } - - for (i = sflists[current_sf_id-1].samples; - i >= 0; i = samples[i].next) { - if (samples[i].v.sample == cursmp.sample) - break; - } - if (i < 0) { - printk("AWE32: replace: cannot find existing sample data %d\n", - cursmp.sample); - return RET_ERROR(EINVAL); - } - - if (samples[i].v.size != cursmp.size) { - printk("AWE32: replace: exiting size differed (%d!=%d)\n", - samples[i].v.size, cursmp.size); - return RET_ERROR(EINVAL); - } - - save_mem_ptr = awe_free_mem_ptr(); - sflists[current_sf_id-1].mem_ptr = samples[i].v.start - awe_mem_start; - MEMCPY(&samples[i].v, &cursmp, sizeof(cursmp)); - if ((rc = awe_write_wave_data(addr, offset, &samples[i].v, channels)) != 0) - return rc; - sflists[current_sf_id-1].mem_ptr = save_mem_ptr; - samples[i].v.sf_id = current_sf_id; - - return 0; -} - - -/*----------------------------------------------------------------*/ - -static const char *readbuf_addr; -static int readbuf_offs; -static int readbuf_flags; -#ifdef __FreeBSD__ -static unsigned short *readbuf_loop; -static int readbuf_loopstart, readbuf_loopend; -#endif - -/* initialize read buffer */ -static int -readbuf_init(const char *addr, int offset, awe_sample_info *sp) -{ -#ifdef __FreeBSD__ - readbuf_loop = NULL; - readbuf_loopstart = sp->loopstart; - readbuf_loopend = sp->loopend; - if (sp->mode_flags & (AWE_SAMPLE_BIDIR_LOOP|AWE_SAMPLE_REVERSE_LOOP)) { - int looplen = sp->loopend - sp->loopstart; - readbuf_loop = my_malloc(looplen * 2); - if (readbuf_loop == NULL) { - printk("AWE32: can't malloc temp buffer\n"); - return RET_ERROR(ENOSPC); - } - } -#endif - readbuf_addr = addr; - readbuf_offs = offset; - readbuf_flags = sp->mode_flags; - return 0; -} - -/* read directly from user buffer */ -static unsigned short -readbuf_word(int pos) -{ - unsigned short c; - /* read from user buffer */ - if (readbuf_flags & AWE_SAMPLE_8BITS) { - unsigned char cc; - GET_BYTE_FROM_USER(cc, readbuf_addr, readbuf_offs + pos); - c = cc << 8; /* convert 8bit -> 16bit */ - } else { - GET_SHORT_FROM_USER(c, readbuf_addr, readbuf_offs + pos * 2); - } - if (readbuf_flags & AWE_SAMPLE_UNSIGNED) - c ^= 0x8000; /* unsigned -> signed */ -#ifdef __FreeBSD__ - /* write on cache for reverse loop */ - if (readbuf_flags & (AWE_SAMPLE_BIDIR_LOOP|AWE_SAMPLE_REVERSE_LOOP)) { - if (pos >= readbuf_loopstart && pos < readbuf_loopend) - readbuf_loop[pos - readbuf_loopstart] = c; - } -#endif - return c; -} - -#ifdef __FreeBSD__ -/* read from cache */ -static unsigned short -readbuf_word_cache(int pos) -{ - if (pos >= readbuf_loopstart && pos < readbuf_loopend) - return readbuf_loop[pos - readbuf_loopstart]; - return 0; -} - -static void -readbuf_end(void) -{ - if (readbuf_loop) { - my_free(readbuf_loop); - } - readbuf_loop = NULL; -} - -#else - -#define readbuf_word_cache readbuf_word -#define readbuf_end() /**/ - -#endif - -/*----------------------------------------------------------------*/ - -#define BLANK_LOOP_START 8 -#define BLANK_LOOP_END 40 -#define BLANK_LOOP_SIZE 48 - -/* loading onto memory */ -static int -awe_write_wave_data(const char *addr, int offset, awe_sample_info *sp, int channels) -{ - int i, truesize, dram_offset; - int rc; - - /* be sure loop points start < end */ - if (sp->loopstart > sp->loopend) { - int tmp = sp->loopstart; - sp->loopstart = sp->loopend; - sp->loopend = tmp; - } - - /* compute true data size to be loaded */ - truesize = sp->size; - if (sp->mode_flags & AWE_SAMPLE_BIDIR_LOOP) - truesize += sp->loopend - sp->loopstart; - if (sp->mode_flags & AWE_SAMPLE_NO_BLANK) - truesize += BLANK_LOOP_SIZE; - if (awe_free_mem_ptr() + truesize >= awe_mem_size/2) { - printk("AWE32 Error: Sample memory full\n"); - return RET_ERROR(ENOSPC); - } - - /* recalculate address offset */ - sp->end -= sp->start; - sp->loopstart -= sp->start; - sp->loopend -= sp->start; - - dram_offset = awe_free_mem_ptr() + awe_mem_start; - sp->start = dram_offset; - sp->end += dram_offset; - sp->loopstart += dram_offset; - sp->loopend += dram_offset; - - /* set the total size (store onto obsolete checksum value) */ - if (sp->size == 0) - sp->checksum = 0; - else - sp->checksum = truesize; - - if ((rc = awe_open_dram_for_write(dram_offset, channels)) != 0) - return rc; - - if (readbuf_init(addr, offset, sp) < 0) - return RET_ERROR(ENOSPC); - - for (i = 0; i < sp->size; i++) { - unsigned short c; - c = readbuf_word(i); - awe_write_dram(c); - if (i == sp->loopend && - (sp->mode_flags & (AWE_SAMPLE_BIDIR_LOOP|AWE_SAMPLE_REVERSE_LOOP))) { - int looplen = sp->loopend - sp->loopstart; - /* copy reverse loop */ - int k; - for (k = 1; k <= looplen; k++) { - c = readbuf_word_cache(i - k); - awe_write_dram(c); - } - if (sp->mode_flags & AWE_SAMPLE_BIDIR_LOOP) { - sp->end += looplen; - } else { - sp->start += looplen; - sp->end += looplen; - } - } - } - readbuf_end(); - - /* if no blank loop is attached in the sample, add it */ - if (sp->mode_flags & AWE_SAMPLE_NO_BLANK) { - for (i = 0; i < BLANK_LOOP_SIZE; i++) - awe_write_dram(0); - if (sp->mode_flags & AWE_SAMPLE_SINGLESHOT) { - sp->loopstart = sp->end + BLANK_LOOP_START; - sp->loopend = sp->end + BLANK_LOOP_END; - } - } - - sflists[current_sf_id-1].mem_ptr += truesize; - awe_close_dram(); - - /* initialize FM */ - awe_init_fm(); - - return 0; -} - - -/*----------------------------------------------------------------*/ - -#ifdef AWE_HAS_GUS_COMPATIBILITY - -/* calculate GUS envelope time: - * is this correct? i have no idea.. - */ -static int -calc_gus_envelope_time(int rate, int start, int end) -{ - int r, p, t; - r = (3 - ((rate >> 6) & 3)) * 3; - p = rate & 0x3f; - t = end - start; - if (t < 0) t = -t; - if (13 > r) - t = t << (13 - r); - else - t = t >> (r - 13); - return (t * 10) / (p * 441); -} - -#define calc_gus_sustain(val) (0x7f - vol_table[(val)/2]) -#define calc_gus_attenuation(val) vol_table[(val)/2] - -/* load GUS patch */ -static int -awe_load_guspatch(const char *addr, int offs, int size, int pmgr_flag) -{ - struct patch_info patch; - awe_voice_info *rec; - awe_sample_info *smp; - int sizeof_patch; - int note, free_sample, free_info; - int rc; - - sizeof_patch = offsetof(struct patch_info, data); /* header size */ - if (size < sizeof_patch) { - printk("AWE32 Error: Patch header too short\n"); - return RET_ERROR(EINVAL); - } - COPY_FROM_USER(((char*)&patch) + offs, addr, offs, sizeof_patch - offs); - size -= sizeof_patch; - if (size < patch.len) { - printk("AWE32 Warning: Patch record too short (%d<%ld)\n", - size, patch.len); - return RET_ERROR(EINVAL); - } - if (check_patch_opened(AWE_PAT_TYPE_GUS, NULL) < 0) - return RET_ERROR(ENOSPC); - if (alloc_new_sample() < 0) - return RET_ERROR(ENOSPC); - if (alloc_new_info(1)) - return RET_ERROR(ENOSPC); - - free_sample = awe_free_sample(); - smp = &samples[free_sample].v; - - smp->sample = free_sample; - smp->start = 0; - smp->end = patch.len; - smp->loopstart = patch.loop_start; - smp->loopend = patch.loop_end; - smp->size = patch.len; - - /* set up mode flags */ - smp->mode_flags = 0; - if (!(patch.mode & WAVE_16_BITS)) - smp->mode_flags |= AWE_SAMPLE_8BITS; - if (patch.mode & WAVE_UNSIGNED) - smp->mode_flags |= AWE_SAMPLE_UNSIGNED; - smp->mode_flags |= AWE_SAMPLE_NO_BLANK; - if (!(patch.mode & (WAVE_LOOPING|WAVE_BIDIR_LOOP|WAVE_LOOP_BACK))) - smp->mode_flags |= AWE_SAMPLE_SINGLESHOT; - if (patch.mode & WAVE_BIDIR_LOOP) - smp->mode_flags |= AWE_SAMPLE_BIDIR_LOOP; - if (patch.mode & WAVE_LOOP_BACK) - smp->mode_flags |= AWE_SAMPLE_REVERSE_LOOP; - - AWE_DEBUG(0,printk("AWE32: [sample %d mode %x]\n", patch.instr_no, smp->mode_flags)); - if (patch.mode & WAVE_16_BITS) { - /* convert to word offsets */ - smp->size /= 2; - smp->end /= 2; - smp->loopstart /= 2; - smp->loopend /= 2; - } - smp->checksum_flag = 0; - smp->checksum = 0; - - if ((rc = awe_write_wave_data(addr, sizeof_patch, smp, -1)) != 0) - return rc; - - smp->sf_id = current_sf_id; - add_sf_sample(free_sample); - - /* set up voice info */ - free_info = awe_free_info(); - rec = &infos[free_info].v; - awe_init_voice_info(rec); - rec->sample = free_sample; /* the last sample */ - rec->rate_offset = calc_rate_offset(patch.base_freq); - note = freq_to_note(patch.base_note); - rec->root = note / 100; - rec->tune = -(note % 100); - rec->low = freq_to_note(patch.low_note) / 100; - rec->high = freq_to_note(patch.high_note) / 100; - AWE_DEBUG(1,printk("AWE32: [gus base offset=%d, note=%d, range=%d-%d(%lu-%lu)]\n", - rec->rate_offset, note, - rec->low, rec->high, - patch.low_note, patch.high_note)); - /* panning position; -128 - 127 => 0-127 */ - rec->pan = (patch.panning + 128) / 2; - - /* detuning is ignored */ - /* 6points volume envelope */ - if (patch.mode & WAVE_ENVELOPES) { - int attack, hold, decay, release; - attack = calc_gus_envelope_time - (patch.env_rate[0], 0, patch.env_offset[0]); - hold = calc_gus_envelope_time - (patch.env_rate[1], patch.env_offset[0], - patch.env_offset[1]); - decay = calc_gus_envelope_time - (patch.env_rate[2], patch.env_offset[1], - patch.env_offset[2]); - release = calc_gus_envelope_time - (patch.env_rate[3], patch.env_offset[1], - patch.env_offset[4]); - release += calc_gus_envelope_time - (patch.env_rate[4], patch.env_offset[3], - patch.env_offset[4]); - release += calc_gus_envelope_time - (patch.env_rate[5], patch.env_offset[4], - patch.env_offset[5]); - rec->parm.volatkhld = (calc_parm_attack(attack) << 8) | - calc_parm_hold(hold); - rec->parm.voldcysus = (calc_gus_sustain(patch.env_offset[2]) << 8) | - calc_parm_decay(decay); - rec->parm.volrelease = 0x8000 | calc_parm_decay(release); - AWE_DEBUG(2,printk("AWE32: [gusenv atk=%d, hld=%d, dcy=%d, rel=%d]\n", attack, hold, decay, release)); - rec->attenuation = calc_gus_attenuation(patch.env_offset[0]); - } - - /* tremolo effect */ - if (patch.mode & WAVE_TREMOLO) { - int rate = (patch.tremolo_rate * 1000 / 38) / 42; - rec->parm.tremfrq = ((patch.tremolo_depth / 2) << 8) | rate; - AWE_DEBUG(2,printk("AWE32: [gusenv tremolo rate=%d, dep=%d, tremfrq=%x]\n", - patch.tremolo_rate, patch.tremolo_depth, - rec->parm.tremfrq)); - } - /* vibrato effect */ - if (patch.mode & WAVE_VIBRATO) { - int rate = (patch.vibrato_rate * 1000 / 38) / 42; - rec->parm.fm2frq2 = ((patch.vibrato_depth / 6) << 8) | rate; - AWE_DEBUG(2,printk("AWE32: [gusenv vibrato rate=%d, dep=%d, tremfrq=%x]\n", - patch.tremolo_rate, patch.tremolo_depth, - rec->parm.tremfrq)); - } - - /* scale_freq, scale_factor, volume, and fractions not implemented */ - - /* append to the tail of the list */ - infos[free_info].bank = misc_modes[AWE_MD_GUS_BANK]; - infos[free_info].instr = patch.instr_no; - infos[free_info].disabled = FALSE; - infos[free_info].type = V_ST_NORMAL; - infos[free_info].v.sf_id = current_sf_id; - - add_info_list(free_info); - add_sf_info(free_info); - - /* set the voice index */ - awe_set_sample(rec); - - return 0; -} - -#endif /* AWE_HAS_GUS_COMPATIBILITY */ - -/*---------------------------------------------------------------- - * sample and voice list handlers - *----------------------------------------------------------------*/ - -/* append this to the sf list */ -static void add_sf_info(int rec) -{ - int sf_id = infos[rec].v.sf_id; - if (sf_id == 0) return; - sf_id--; - if (sflists[sf_id].infos < 0) - sflists[sf_id].infos = rec; - else { - int i, prev; - prev = sflists[sf_id].infos; - while ((i = infos[prev].next) >= 0) - prev = i; - infos[prev].next = rec; - } - infos[rec].next = -1; - sflists[sf_id].num_info++; -} - -/* prepend this sample to sf list */ -static void add_sf_sample(int rec) -{ - int sf_id = samples[rec].v.sf_id; - if (sf_id == 0) return; - sf_id--; - samples[rec].next = sflists[sf_id].samples; - sflists[sf_id].samples = rec; - sflists[sf_id].num_sample++; -} - -/* purge the old records which don't belong with the same file id */ -static void purge_old_list(int rec, int next) -{ - infos[rec].next_instr = next; - if (infos[rec].bank == AWE_DRUM_BANK) { - /* remove samples with the same note range */ - int cur, *prevp = &infos[rec].next_instr; - int low = infos[rec].v.low; - int high = infos[rec].v.high; - for (cur = next; cur >= 0; cur = infos[cur].next_instr) { - if (infos[cur].v.low == low && - infos[cur].v.high == high && - infos[cur].v.sf_id != infos[rec].v.sf_id) - *prevp = infos[cur].next_instr; - prevp = &infos[cur].next_instr; - } - } else { - if (infos[next].v.sf_id != infos[rec].v.sf_id) - infos[rec].next_instr = -1; - } -} - -/* prepend to top of the preset table */ -static void add_info_list(int rec) -{ - int *prevp, cur; - int instr = infos[rec].instr; - int bank = infos[rec].bank; - - if (infos[rec].disabled) - return; - - prevp = &preset_table[instr]; - cur = *prevp; - while (cur >= 0) { - /* search the first record with the same bank number */ - if (infos[cur].bank == bank) { - /* replace the list with the new record */ - infos[rec].next_bank = infos[cur].next_bank; - *prevp = rec; - purge_old_list(rec, cur); - return; - } - prevp = &infos[cur].next_bank; - cur = infos[cur].next_bank; - } - - /* this is the first bank record.. just add this */ - infos[rec].next_instr = -1; - infos[rec].next_bank = preset_table[instr]; - preset_table[instr] = rec; -} - -/* remove samples later than the specified sf_id */ -static void -awe_remove_samples(int sf_id) -{ - if (sf_id <= 0) { - awe_reset_samples(); - return; - } - /* already removed? */ - if (current_sf_id <= sf_id) - return; - - current_sf_id = sf_id; - if (locked_sf_id > sf_id) - locked_sf_id = sf_id; - - rebuild_preset_list(); -} - -/* rebuild preset search list */ -static void rebuild_preset_list(void) -{ - int i, j; - - for (i = 0; i < AWE_MAX_PRESETS; i++) - preset_table[i] = -1; - - for (i = 0; i < current_sf_id; i++) { - for (j = sflists[i].infos; j >= 0; j = infos[j].next) - add_info_list(j); - } -} - -/* search the specified sample */ -static short -awe_set_sample(awe_voice_info *vp) -{ - int i; - vp->index = -1; - for (i = sflists[vp->sf_id-1].samples; i >= 0; i = samples[i].next) { - if (samples[i].v.sample == vp->sample) { - /* set the actual sample offsets */ - vp->start += samples[i].v.start; - vp->end += samples[i].v.end; - vp->loopstart += samples[i].v.loopstart; - vp->loopend += samples[i].v.loopend; - /* copy mode flags */ - vp->mode = samples[i].v.mode_flags; - /* set index */ - vp->index = i; - return i; - } - } - return -1; -} - - -/*---------------------------------------------------------------- - * voice allocation - *----------------------------------------------------------------*/ - -/* look for all voices associated with the specified note & velocity */ -static int -awe_search_multi_voices(int rec, int note, int velocity, awe_voice_info **vlist) -{ - int nvoices; - - nvoices = 0; - for (; rec >= 0; rec = infos[rec].next_instr) { - if (note >= infos[rec].v.low && - note <= infos[rec].v.high && - velocity >= infos[rec].v.vellow && - velocity <= infos[rec].v.velhigh) { - vlist[nvoices] = &infos[rec].v; - if (infos[rec].type == V_ST_MAPPED) /* mapper */ - return -1; - nvoices++; - if (nvoices >= AWE_MAX_VOICES) - break; - } - } - return nvoices; -} - -/* store the voice list from the specified note and velocity. - if the preset is mapped, seek for the destination preset, and rewrite - the note number if necessary. - */ -static int -really_alloc_voices(int vrec, int def_vrec, int *note, int velocity, awe_voice_info **vlist, int level) -{ - int nvoices; - - nvoices = awe_search_multi_voices(vrec, *note, velocity, vlist); - if (nvoices == 0) - nvoices = awe_search_multi_voices(def_vrec, *note, velocity, vlist); - if (nvoices < 0) { /* mapping */ - int preset = vlist[0]->start; - int bank = vlist[0]->end; - int key = vlist[0]->fixkey; - if (level > 5) { - printk("AWE32: too deep mapping level\n"); - return 0; - } - vrec = awe_search_instr(bank, preset); - if (bank == AWE_DRUM_BANK) - def_vrec = awe_search_instr(bank, 0); - else - def_vrec = awe_search_instr(0, preset); - if (key >= 0) - *note = key; - return really_alloc_voices(vrec, def_vrec, note, velocity, vlist, level+1); - } - - return nvoices; -} - -/* allocate voices corresponding note and velocity; supports multiple insts. */ -static void -awe_alloc_multi_voices(int ch, int note, int velocity, int key) -{ - int i, v, nvoices; - awe_voice_info *vlist[AWE_MAX_VOICES]; - - if (channels[ch].vrec < 0 && channels[ch].def_vrec < 0) - awe_set_instr(0, ch, channels[ch].instr); - - /* check the possible voices; note may be changeable if mapped */ - nvoices = really_alloc_voices(channels[ch].vrec, channels[ch].def_vrec, - ¬e, velocity, vlist, 0); - - /* set the voices */ - current_alloc_time++; - for (i = 0; i < nvoices; i++) { - v = awe_clear_voice(); - voices[v].key = key; - voices[v].ch = ch; - voices[v].note = note; - voices[v].velocity = velocity; - voices[v].time = current_alloc_time; - voices[v].cinfo = &channels[ch]; - voices[v].sample = vlist[i]; - voices[v].state = AWE_ST_MARK; - voices[v].layer = nvoices - i - 1; /* in reverse order */ - } - - /* clear the mark in allocated voices */ - for (i = 0; i < awe_max_voices; i++) { - if (voices[i].state == AWE_ST_MARK) - voices[i].state = AWE_ST_OFF; - - } -} - - -/* search the best voice from the specified status condition */ -static int -search_best_voice(int condition) -{ - int i, time, best; - best = -1; - time = current_alloc_time + 1; - for (i = 0; i < awe_max_voices; i++) { - if ((voices[i].state & condition) && - (best < 0 || voices[i].time < time)) { - best = i; - time = voices[i].time; - } - } - /* clear voice */ - if (best >= 0) { - if (voices[best].state != AWE_ST_OFF) - awe_terminate(best); - awe_voice_init(best, TRUE); - } - - return best; -} - -/* search an empty voice. - if no empty voice is found, at least terminate a voice - */ -static int -awe_clear_voice(void) -{ - int best; - - /* looking for the oldest empty voice */ - if ((best = search_best_voice(AWE_ST_OFF)) >= 0) - return best; - if ((best = search_best_voice(AWE_ST_RELEASED)) >= 0) - return best; - /* looking for the oldest sustained voice */ - if ((best = search_best_voice(AWE_ST_SUSTAINED)) >= 0) - return best; - -#ifdef AWE_LOOKUP_MIDI_PRIORITY - if (MULTI_LAYER_MODE() && misc_modes[AWE_MD_CHN_PRIOR]) { - int ch = -1; - int time = current_alloc_time + 1; - int i; - /* looking for the voices from high channel (except drum ch) */ - for (i = 0; i < awe_max_voices; i++) { - if (IS_DRUM_CHANNEL(voices[i].ch)) continue; - if (voices[i].ch < ch) continue; - if (voices[i].state != AWE_ST_MARK && - (voices[i].ch > ch || voices[i].time < time)) { - best = i; - time = voices[i].time; - ch = voices[i].ch; - } - } - } -#endif - if (best < 0) - best = search_best_voice(~AWE_ST_MARK); - - if (best >= 0) - return best; - - return 0; -} - - -/* search sample for the specified note & velocity and set it on the voice; - * note that voice is the voice index (not channel index) - */ -static void -awe_alloc_one_voice(int voice, int note, int velocity) -{ - int ch, nvoices; - awe_voice_info *vlist[AWE_MAX_VOICES]; - - ch = voices[voice].ch; - if (channels[ch].vrec < 0 && channels[ch].def_vrec < 0) - awe_set_instr(0, ch, channels[ch].instr); - - nvoices = really_alloc_voices(voices[voice].cinfo->vrec, - voices[voice].cinfo->def_vrec, - ¬e, velocity, vlist, 0); - if (nvoices > 0) { - voices[voice].time = ++current_alloc_time; - voices[voice].sample = vlist[0]; /* use the first one */ - voices[voice].layer = 0; - voices[voice].note = note; - voices[voice].velocity = velocity; - } -} - - -/*---------------------------------------------------------------- - * sequencer2 functions - *----------------------------------------------------------------*/ - -/* search an empty voice; used by sequencer2 */ -static int -awe_alloc(int dev, int chn, int note, struct voice_alloc_info *alloc) -{ - playing_mode = AWE_PLAY_MULTI2; - awe_info.nr_voices = AWE_MAX_CHANNELS; - return awe_clear_voice(); -} - - -/* set up voice; used by sequencer2 */ -static void -awe_setup_voice(int dev, int voice, int chn) -{ - struct channel_info *info; - if (synth_devs[dev] == NULL || - (info = &synth_devs[dev]->chn_info[chn]) == NULL) - return; - - if (voice < 0 || voice >= awe_max_voices) - return; - - AWE_DEBUG(2,printk("AWE32: [setup(%d) ch=%d]\n", voice, chn)); - channels[chn].expression_vol = info->controllers[CTL_EXPRESSION]; - channels[chn].main_vol = info->controllers[CTL_MAIN_VOLUME]; - channels[chn].panning = - info->controllers[CTL_PAN] * 2 - 128; /* signed 8bit */ - channels[chn].bender = info->bender_value; /* zero center */ - channels[chn].bank = info->controllers[CTL_BANK_SELECT]; - channels[chn].sustained = info->controllers[CTL_SUSTAIN]; - if (info->controllers[CTL_EXT_EFF_DEPTH]) { - FX_SET(&channels[chn].fx, AWE_FX_REVERB, - info->controllers[CTL_EXT_EFF_DEPTH] * 2); - } - if (info->controllers[CTL_CHORUS_DEPTH]) { - FX_SET(&channels[chn].fx, AWE_FX_CHORUS, - info->controllers[CTL_CHORUS_DEPTH] * 2); - } - awe_set_instr(dev, chn, info->pgm_num); -} - - -#ifdef CONFIG_AWE32_MIXER -/*================================================================ - * AWE32 mixer device control - *================================================================*/ - -static int -awe_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg) -{ - int i, level; - - if (((cmd >> 8) & 0xff) != 'M') - return RET_ERROR(EINVAL); - - level = (int)IOCTL_IN(arg); - level = ((level & 0xff) + (level >> 8)) / 2; - AWE_DEBUG(0,printk("AWEMix: cmd=%x val=%d\n", cmd & 0xff, level)); - - if (IO_WRITE_CHECK(cmd)) { - switch (cmd & 0xff) { - case SOUND_MIXER_BASS: - awe_bass_level = level * 12 / 100; - if (awe_bass_level >= 12) - awe_bass_level = 11; - awe_equalizer(awe_bass_level, awe_treble_level); - break; - case SOUND_MIXER_TREBLE: - awe_treble_level = level * 12 / 100; - if (awe_treble_level >= 12) - awe_treble_level = 11; - awe_equalizer(awe_bass_level, awe_treble_level); - break; - case SOUND_MIXER_VOLUME: - level = level * 127 / 100; - if (level >= 128) level = 127; - init_atten = vol_table[level]; - for (i = 0; i < awe_max_voices; i++) - awe_set_voice_vol(i, TRUE); - break; - } - } - switch (cmd & 0xff) { - case SOUND_MIXER_BASS: - level = awe_bass_level * 100 / 24; - level = (level << 8) | level; - break; - case SOUND_MIXER_TREBLE: - level = awe_treble_level * 100 / 24; - level = (level << 8) | level; - break; - case SOUND_MIXER_VOLUME: - for (i = 127; i > 0; i--) { - if (init_atten <= vol_table[i]) - break; - } - level = i * 100 / 127; - level = (level << 8) | level; - break; - case SOUND_MIXER_DEVMASK: - level = SOUND_MASK_BASS|SOUND_MASK_TREBLE|SOUND_MASK_VOLUME; - break; - default: - level = 0; - break; - } - return IOCTL_OUT(arg, level); -} -#endif /* CONFIG_AWE32_MIXER */ - - -/*================================================================ - * initialization of AWE32 - *================================================================*/ - -/* intiailize audio channels */ -static void -awe_init_audio(void) -{ - int ch; - - /* turn off envelope engines */ - for (ch = 0; ch < AWE_MAX_VOICES; ch++) { - awe_poke(AWE_DCYSUSV(ch), 0x80); - } - - /* reset all other parameters to zero */ - for (ch = 0; ch < AWE_MAX_VOICES; ch++) { - awe_poke(AWE_ENVVOL(ch), 0); - awe_poke(AWE_ENVVAL(ch), 0); - awe_poke(AWE_DCYSUS(ch), 0); - awe_poke(AWE_ATKHLDV(ch), 0); - awe_poke(AWE_LFO1VAL(ch), 0); - awe_poke(AWE_ATKHLD(ch), 0); - awe_poke(AWE_LFO2VAL(ch), 0); - awe_poke(AWE_IP(ch), 0); - awe_poke(AWE_IFATN(ch), 0); - awe_poke(AWE_PEFE(ch), 0); - awe_poke(AWE_FMMOD(ch), 0); - awe_poke(AWE_TREMFRQ(ch), 0); - awe_poke(AWE_FM2FRQ2(ch), 0); - awe_poke_dw(AWE_PTRX(ch), 0); - awe_poke_dw(AWE_VTFT(ch), 0); - awe_poke_dw(AWE_PSST(ch), 0); - awe_poke_dw(AWE_CSL(ch), 0); - awe_poke_dw(AWE_CCCA(ch), 0); - } - - for (ch = 0; ch < AWE_MAX_VOICES; ch++) { - awe_poke_dw(AWE_CPF(ch), 0); - awe_poke_dw(AWE_CVCF(ch), 0); - } -} - - -/* initialize DMA address */ -static void -awe_init_dma(void) -{ - awe_poke_dw(AWE_SMALR, 0); - awe_poke_dw(AWE_SMARR, 0); - awe_poke_dw(AWE_SMALW, 0); - awe_poke_dw(AWE_SMARW, 0); -} - - -/* initialization arrays; from ADIP */ - -static unsigned short init1[128] = { - 0x03ff, 0x0030, 0x07ff, 0x0130, 0x0bff, 0x0230, 0x0fff, 0x0330, - 0x13ff, 0x0430, 0x17ff, 0x0530, 0x1bff, 0x0630, 0x1fff, 0x0730, - 0x23ff, 0x0830, 0x27ff, 0x0930, 0x2bff, 0x0a30, 0x2fff, 0x0b30, - 0x33ff, 0x0c30, 0x37ff, 0x0d30, 0x3bff, 0x0e30, 0x3fff, 0x0f30, - - 0x43ff, 0x0030, 0x47ff, 0x0130, 0x4bff, 0x0230, 0x4fff, 0x0330, - 0x53ff, 0x0430, 0x57ff, 0x0530, 0x5bff, 0x0630, 0x5fff, 0x0730, - 0x63ff, 0x0830, 0x67ff, 0x0930, 0x6bff, 0x0a30, 0x6fff, 0x0b30, - 0x73ff, 0x0c30, 0x77ff, 0x0d30, 0x7bff, 0x0e30, 0x7fff, 0x0f30, - - 0x83ff, 0x0030, 0x87ff, 0x0130, 0x8bff, 0x0230, 0x8fff, 0x0330, - 0x93ff, 0x0430, 0x97ff, 0x0530, 0x9bff, 0x0630, 0x9fff, 0x0730, - 0xa3ff, 0x0830, 0xa7ff, 0x0930, 0xabff, 0x0a30, 0xafff, 0x0b30, - 0xb3ff, 0x0c30, 0xb7ff, 0x0d30, 0xbbff, 0x0e30, 0xbfff, 0x0f30, - - 0xc3ff, 0x0030, 0xc7ff, 0x0130, 0xcbff, 0x0230, 0xcfff, 0x0330, - 0xd3ff, 0x0430, 0xd7ff, 0x0530, 0xdbff, 0x0630, 0xdfff, 0x0730, - 0xe3ff, 0x0830, 0xe7ff, 0x0930, 0xebff, 0x0a30, 0xefff, 0x0b30, - 0xf3ff, 0x0c30, 0xf7ff, 0x0d30, 0xfbff, 0x0e30, 0xffff, 0x0f30, -}; - -static unsigned short init2[128] = { - 0x03ff, 0x8030, 0x07ff, 0x8130, 0x0bff, 0x8230, 0x0fff, 0x8330, - 0x13ff, 0x8430, 0x17ff, 0x8530, 0x1bff, 0x8630, 0x1fff, 0x8730, - 0x23ff, 0x8830, 0x27ff, 0x8930, 0x2bff, 0x8a30, 0x2fff, 0x8b30, - 0x33ff, 0x8c30, 0x37ff, 0x8d30, 0x3bff, 0x8e30, 0x3fff, 0x8f30, - - 0x43ff, 0x8030, 0x47ff, 0x8130, 0x4bff, 0x8230, 0x4fff, 0x8330, - 0x53ff, 0x8430, 0x57ff, 0x8530, 0x5bff, 0x8630, 0x5fff, 0x8730, - 0x63ff, 0x8830, 0x67ff, 0x8930, 0x6bff, 0x8a30, 0x6fff, 0x8b30, - 0x73ff, 0x8c30, 0x77ff, 0x8d30, 0x7bff, 0x8e30, 0x7fff, 0x8f30, - - 0x83ff, 0x8030, 0x87ff, 0x8130, 0x8bff, 0x8230, 0x8fff, 0x8330, - 0x93ff, 0x8430, 0x97ff, 0x8530, 0x9bff, 0x8630, 0x9fff, 0x8730, - 0xa3ff, 0x8830, 0xa7ff, 0x8930, 0xabff, 0x8a30, 0xafff, 0x8b30, - 0xb3ff, 0x8c30, 0xb7ff, 0x8d30, 0xbbff, 0x8e30, 0xbfff, 0x8f30, - - 0xc3ff, 0x8030, 0xc7ff, 0x8130, 0xcbff, 0x8230, 0xcfff, 0x8330, - 0xd3ff, 0x8430, 0xd7ff, 0x8530, 0xdbff, 0x8630, 0xdfff, 0x8730, - 0xe3ff, 0x8830, 0xe7ff, 0x8930, 0xebff, 0x8a30, 0xefff, 0x8b30, - 0xf3ff, 0x8c30, 0xf7ff, 0x8d30, 0xfbff, 0x8e30, 0xffff, 0x8f30, -}; - -static unsigned short init3[128] = { - 0x0C10, 0x8470, 0x14FE, 0xB488, 0x167F, 0xA470, 0x18E7, 0x84B5, - 0x1B6E, 0x842A, 0x1F1D, 0x852A, 0x0DA3, 0x8F7C, 0x167E, 0xF254, - 0x0000, 0x842A, 0x0001, 0x852A, 0x18E6, 0x8BAA, 0x1B6D, 0xF234, - 0x229F, 0x8429, 0x2746, 0x8529, 0x1F1C, 0x86E7, 0x229E, 0xF224, - - 0x0DA4, 0x8429, 0x2C29, 0x8529, 0x2745, 0x87F6, 0x2C28, 0xF254, - 0x383B, 0x8428, 0x320F, 0x8528, 0x320E, 0x8F02, 0x1341, 0xF264, - 0x3EB6, 0x8428, 0x3EB9, 0x8528, 0x383A, 0x8FA9, 0x3EB5, 0xF294, - 0x3EB7, 0x8474, 0x3EBA, 0x8575, 0x3EB8, 0xC4C3, 0x3EBB, 0xC5C3, - - 0x0000, 0xA404, 0x0001, 0xA504, 0x141F, 0x8671, 0x14FD, 0x8287, - 0x3EBC, 0xE610, 0x3EC8, 0x8C7B, 0x031A, 0x87E6, 0x3EC8, 0x86F7, - 0x3EC0, 0x821E, 0x3EBE, 0xD208, 0x3EBD, 0x821F, 0x3ECA, 0x8386, - 0x3EC1, 0x8C03, 0x3EC9, 0x831E, 0x3ECA, 0x8C4C, 0x3EBF, 0x8C55, - - 0x3EC9, 0xC208, 0x3EC4, 0xBC84, 0x3EC8, 0x8EAD, 0x3EC8, 0xD308, - 0x3EC2, 0x8F7E, 0x3ECB, 0x8219, 0x3ECB, 0xD26E, 0x3EC5, 0x831F, - 0x3EC6, 0xC308, 0x3EC3, 0xB2FF, 0x3EC9, 0x8265, 0x3EC9, 0x8319, - 0x1342, 0xD36E, 0x3EC7, 0xB3FF, 0x0000, 0x8365, 0x1420, 0x9570, -}; - -static unsigned short init4[128] = { - 0x0C10, 0x8470, 0x14FE, 0xB488, 0x167F, 0xA470, 0x18E7, 0x84B5, - 0x1B6E, 0x842A, 0x1F1D, 0x852A, 0x0DA3, 0x0F7C, 0x167E, 0x7254, - 0x0000, 0x842A, 0x0001, 0x852A, 0x18E6, 0x0BAA, 0x1B6D, 0x7234, - 0x229F, 0x8429, 0x2746, 0x8529, 0x1F1C, 0x06E7, 0x229E, 0x7224, - - 0x0DA4, 0x8429, 0x2C29, 0x8529, 0x2745, 0x07F6, 0x2C28, 0x7254, - 0x383B, 0x8428, 0x320F, 0x8528, 0x320E, 0x0F02, 0x1341, 0x7264, - 0x3EB6, 0x8428, 0x3EB9, 0x8528, 0x383A, 0x0FA9, 0x3EB5, 0x7294, - 0x3EB7, 0x8474, 0x3EBA, 0x8575, 0x3EB8, 0x44C3, 0x3EBB, 0x45C3, - - 0x0000, 0xA404, 0x0001, 0xA504, 0x141F, 0x0671, 0x14FD, 0x0287, - 0x3EBC, 0xE610, 0x3EC8, 0x0C7B, 0x031A, 0x07E6, 0x3EC8, 0x86F7, - 0x3EC0, 0x821E, 0x3EBE, 0xD208, 0x3EBD, 0x021F, 0x3ECA, 0x0386, - 0x3EC1, 0x0C03, 0x3EC9, 0x031E, 0x3ECA, 0x8C4C, 0x3EBF, 0x0C55, - - 0x3EC9, 0xC208, 0x3EC4, 0xBC84, 0x3EC8, 0x0EAD, 0x3EC8, 0xD308, - 0x3EC2, 0x8F7E, 0x3ECB, 0x0219, 0x3ECB, 0xD26E, 0x3EC5, 0x031F, - 0x3EC6, 0xC308, 0x3EC3, 0x32FF, 0x3EC9, 0x0265, 0x3EC9, 0x8319, - 0x1342, 0xD36E, 0x3EC7, 0x33FF, 0x0000, 0x8365, 0x1420, 0x9570, -}; - - -/* send initialization arrays to start up */ -static void -awe_init_array(void) -{ - awe_send_array(init1); - awe_wait(1024); - awe_send_array(init2); - awe_send_array(init3); - awe_poke_dw(AWE_HWCF4, 0); - awe_poke_dw(AWE_HWCF5, 0x83); - awe_poke_dw(AWE_HWCF6, 0x8000); - awe_send_array(init4); -} - -/* send an initialization array */ -static void -awe_send_array(unsigned short *data) -{ - int i; - unsigned short *p; - - p = data; - for (i = 0; i < AWE_MAX_VOICES; i++, p++) - awe_poke(AWE_INIT1(i), *p); - for (i = 0; i < AWE_MAX_VOICES; i++, p++) - awe_poke(AWE_INIT2(i), *p); - for (i = 0; i < AWE_MAX_VOICES; i++, p++) - awe_poke(AWE_INIT3(i), *p); - for (i = 0; i < AWE_MAX_VOICES; i++, p++) - awe_poke(AWE_INIT4(i), *p); -} - - -/* - * set up awe32 channels to some known state. - */ - -/* set the envelope & LFO parameters to the default values; see ADIP */ -static void -awe_tweak_voice(int i) -{ - /* set all mod/vol envelope shape to minimum */ - awe_poke(AWE_ENVVOL(i), 0x8000); - awe_poke(AWE_ENVVAL(i), 0x8000); - awe_poke(AWE_DCYSUS(i), 0x7F7F); - awe_poke(AWE_ATKHLDV(i), 0x7F7F); - awe_poke(AWE_ATKHLD(i), 0x7F7F); - awe_poke(AWE_PEFE(i), 0); /* mod envelope height to zero */ - awe_poke(AWE_LFO1VAL(i), 0x8000); /* no delay for LFO1 */ - awe_poke(AWE_LFO2VAL(i), 0x8000); - awe_poke(AWE_IP(i), 0xE000); /* no pitch shift */ - awe_poke(AWE_IFATN(i), 0xFF00); /* volume to minimum */ - awe_poke(AWE_FMMOD(i), 0); - awe_poke(AWE_TREMFRQ(i), 0); - awe_poke(AWE_FM2FRQ2(i), 0); -} - -static void -awe_tweak(void) -{ - int i; - /* reset all channels */ - for (i = 0; i < awe_max_voices; i++) - awe_tweak_voice(i); -} - - -/* - * initializes the FM section of AWE32; - * see Vince Vu's unofficial AWE32 programming guide - */ - -static void -awe_init_fm(void) -{ -#ifndef AWE_ALWAYS_INIT_FM - /* if no extended memory is on board.. */ - if (awe_mem_size <= 0) - return; -#endif - AWE_DEBUG(3,printk("AWE32: initializing FM\n")); - - /* Initialize the last two channels for DRAM refresh and producing - the reverb and chorus effects for Yamaha OPL-3 synthesizer */ - - /* 31: FM left channel, 0xffffe0-0xffffe8 */ - awe_poke(AWE_DCYSUSV(30), 0x80); - awe_poke_dw(AWE_PSST(30), 0xFFFFFFE0); /* full left */ - awe_poke_dw(AWE_CSL(30), 0x00FFFFE8 | - (DEF_FM_CHORUS_DEPTH << 24)); - awe_poke_dw(AWE_PTRX(30), (DEF_FM_REVERB_DEPTH << 8)); - awe_poke_dw(AWE_CPF(30), 0); - awe_poke_dw(AWE_CCCA(30), 0x00FFFFE3); - - /* 32: FM right channel, 0xfffff0-0xfffff8 */ - awe_poke(AWE_DCYSUSV(31), 0x80); - awe_poke_dw(AWE_PSST(31), 0x00FFFFF0); /* full right */ - awe_poke_dw(AWE_CSL(31), 0x00FFFFF8 | - (DEF_FM_CHORUS_DEPTH << 24)); - awe_poke_dw(AWE_PTRX(31), (DEF_FM_REVERB_DEPTH << 8)); - awe_poke_dw(AWE_CPF(31), 0x8000); - awe_poke_dw(AWE_CCCA(31), 0x00FFFFF3); - - /* skew volume & cutoff */ - awe_poke_dw(AWE_VTFT(30), 0x8000FFFF); - awe_poke_dw(AWE_VTFT(31), 0x8000FFFF); - - voices[30].state = AWE_ST_FM; - voices[31].state = AWE_ST_FM; - - /* change maximum channels to 30 */ - awe_max_voices = AWE_NORMAL_VOICES; - if (playing_mode == AWE_PLAY_DIRECT) - awe_info.nr_voices = awe_max_voices; - else - awe_info.nr_voices = AWE_MAX_CHANNELS; - voice_alloc->max_voice = awe_max_voices; -} - -/* - * AWE32 DRAM access routines - */ - -/* open DRAM write accessing mode */ -static int -awe_open_dram_for_write(int offset, int channels) -{ - int vidx[AWE_NORMAL_VOICES]; - int i; - - if (channels < 0 || channels >= AWE_NORMAL_VOICES) { - channels = AWE_NORMAL_VOICES; - for (i = 0; i < AWE_NORMAL_VOICES; i++) - vidx[i] = i; - } else { - for (i = 0; i < channels; i++) - vidx[i] = awe_clear_voice(); - } - - /* use all channels for DMA transfer */ - for (i = 0; i < channels; i++) { - if (vidx[i] < 0) continue; - awe_poke(AWE_DCYSUSV(vidx[i]), 0x80); - awe_poke_dw(AWE_VTFT(vidx[i]), 0); - awe_poke_dw(AWE_CVCF(vidx[i]), 0); - awe_poke_dw(AWE_PTRX(vidx[i]), 0x40000000); - awe_poke_dw(AWE_CPF(vidx[i]), 0x40000000); - awe_poke_dw(AWE_PSST(vidx[i]), 0); - awe_poke_dw(AWE_CSL(vidx[i]), 0); - awe_poke_dw(AWE_CCCA(vidx[i]), 0x06000000); - voices[vidx[i]].state = AWE_ST_DRAM; - } - /* point channels 31 & 32 to ROM samples for DRAM refresh */ - awe_poke_dw(AWE_VTFT(30), 0); - awe_poke_dw(AWE_PSST(30), 0x1d8); - awe_poke_dw(AWE_CSL(30), 0x1e0); - awe_poke_dw(AWE_CCCA(30), 0x1d8); - awe_poke_dw(AWE_VTFT(31), 0); - awe_poke_dw(AWE_PSST(31), 0x1d8); - awe_poke_dw(AWE_CSL(31), 0x1e0); - awe_poke_dw(AWE_CCCA(31), 0x1d8); - voices[30].state = AWE_ST_FM; - voices[31].state = AWE_ST_FM; - - /* if full bit is on, not ready to write on */ - if (awe_peek_dw(AWE_SMALW) & 0x80000000) { - for (i = 0; i < channels; i++) { - awe_poke_dw(AWE_CCCA(vidx[i]), 0); - voices[i].state = AWE_ST_OFF; - } - return RET_ERROR(ENOSPC); - } - - /* set address to write */ - awe_poke_dw(AWE_SMALW, offset); - - return 0; -} - -/* open DRAM for RAM size detection */ -static void -awe_open_dram_for_check(void) -{ - int i; - for (i = 0; i < AWE_NORMAL_VOICES; i++) { - awe_poke(AWE_DCYSUSV(i), 0x80); - awe_poke_dw(AWE_VTFT(i), 0); - awe_poke_dw(AWE_CVCF(i), 0); - awe_poke_dw(AWE_PTRX(i), 0x40000000); - awe_poke_dw(AWE_CPF(i), 0x40000000); - awe_poke_dw(AWE_PSST(i), 0); - awe_poke_dw(AWE_CSL(i), 0); - if (i & 1) /* DMA write */ - awe_poke_dw(AWE_CCCA(i), 0x06000000); - else /* DMA read */ - awe_poke_dw(AWE_CCCA(i), 0x04000000); - voices[i].state = AWE_ST_DRAM; - } -} - - -/* close dram access */ -static void -awe_close_dram(void) -{ - int i; - /* wait until FULL bit in SMAxW register be false */ - for (i = 0; i < 10000; i++) { - if (!(awe_peek_dw(AWE_SMALW) & 0x80000000)) - break; - awe_wait(10); - } - - for (i = 0; i < AWE_NORMAL_VOICES; i++) { - if (voices[i].state == AWE_ST_DRAM) { - awe_poke_dw(AWE_CCCA(i), 0); - awe_poke(AWE_DCYSUSV(i), 0x807F); - voices[i].state = AWE_ST_OFF; - } - } -} - - -/*================================================================ - * detect presence of AWE32 and check memory size - *================================================================*/ - -/* detect emu8000 chip on the specified address; from VV's guide */ - -static int -awe_detect_base(int addr) -{ - awe_base = addr; - if ((awe_peek(AWE_U1) & 0x000F) != 0x000C) - return 0; - if ((awe_peek(AWE_HWCF1) & 0x007E) != 0x0058) - return 0; - if ((awe_peek(AWE_HWCF2) & 0x0003) != 0x0003) - return 0; - AWE_DEBUG(0,printk("AWE32 found at %x\n", awe_base)); - return 1; -} - -static int -awe_detect(void) -{ - int base; - if (awe_base == 0) { - for (base = 0x620; base <= 0x680; base += 0x20) - if (awe_detect_base(base)) - return 1; - AWE_DEBUG(0,printk("AWE32 not found\n")); - return 0; - } - return 1; -} - - -/*================================================================ - * check dram size on AWE board - *================================================================*/ - -/* any three numbers you like */ -#define UNIQUE_ID1 0x1234 -#define UNIQUE_ID2 0x4321 -#define UNIQUE_ID3 0xFFFF - -static int -awe_check_dram(void) -{ - if (awe_mem_size > 0) { - awe_mem_size *= 1024; /* convert to Kbytes */ - return awe_mem_size; - } - - awe_open_dram_for_check(); - - awe_mem_size = 0; - - /* set up unique two id numbers */ - awe_poke_dw(AWE_SMALW, AWE_DRAM_OFFSET); - awe_poke(AWE_SMLD, UNIQUE_ID1); - awe_poke(AWE_SMLD, UNIQUE_ID2); - - while (awe_mem_size < AWE_MAX_DRAM_SIZE) { - awe_wait(2); - /* read a data on the DRAM start address */ - awe_poke_dw(AWE_SMALR, AWE_DRAM_OFFSET); - awe_peek(AWE_SMLD); /* discard stale data */ - if (awe_peek(AWE_SMLD) != UNIQUE_ID1) - break; - if (awe_peek(AWE_SMLD) != UNIQUE_ID2) - break; - awe_mem_size += 32; /* increment 32 Kbytes */ - /* Write a unique data on the test address; - * if the address is out of range, the data is written on - * 0x200000(=AWE_DRAM_OFFSET). Then the two id words are - * broken by this data. - */ - awe_poke_dw(AWE_SMALW, AWE_DRAM_OFFSET + awe_mem_size*512L); - awe_poke(AWE_SMLD, UNIQUE_ID3); - awe_wait(2); - /* read a data on the just written DRAM address */ - awe_poke_dw(AWE_SMALR, AWE_DRAM_OFFSET + awe_mem_size*512L); - awe_peek(AWE_SMLD); /* discard stale data */ - if (awe_peek(AWE_SMLD) != UNIQUE_ID3) - break; - } - awe_close_dram(); - - AWE_DEBUG(0,printk("AWE32: %d Kbytes memory detected\n", awe_mem_size)); - - /* convert to Kbytes */ - awe_mem_size *= 1024; - return awe_mem_size; -} - - -/*================================================================ - * chorus and reverb controls; from VV's guide - *================================================================*/ - -/* 5 parameters for each chorus mode; 3 x 16bit, 2 x 32bit */ -static char chorus_defined[AWE_CHORUS_NUMBERS]; -static awe_chorus_fx_rec chorus_parm[AWE_CHORUS_NUMBERS] = { - {0xE600, 0x03F6, 0xBC2C ,0x00000000, 0x0000006D}, /* chorus 1 */ - {0xE608, 0x031A, 0xBC6E, 0x00000000, 0x0000017C}, /* chorus 2 */ - {0xE610, 0x031A, 0xBC84, 0x00000000, 0x00000083}, /* chorus 3 */ - {0xE620, 0x0269, 0xBC6E, 0x00000000, 0x0000017C}, /* chorus 4 */ - {0xE680, 0x04D3, 0xBCA6, 0x00000000, 0x0000005B}, /* feedback */ - {0xE6E0, 0x044E, 0xBC37, 0x00000000, 0x00000026}, /* flanger */ - {0xE600, 0x0B06, 0xBC00, 0x0000E000, 0x00000083}, /* short delay */ - {0xE6C0, 0x0B06, 0xBC00, 0x0000E000, 0x00000083}, /* short delay + feedback */ -}; - -static int -awe_load_chorus_fx(awe_patch_info *patch, const char *addr, int count) -{ - if (patch->optarg < AWE_CHORUS_PREDEFINED || patch->optarg >= AWE_CHORUS_NUMBERS) { - printk("AWE32 Error: illegal chorus mode %d for uploading\n", patch->optarg); - return RET_ERROR(EINVAL); - } - if (count < sizeof(awe_chorus_fx_rec)) { - printk("AWE32 Error: too short chorus fx parameters\n"); - return RET_ERROR(EINVAL); - } - COPY_FROM_USER(&chorus_parm[patch->optarg], addr, AWE_PATCH_INFO_SIZE, - sizeof(awe_chorus_fx_rec)); - chorus_defined[patch->optarg] = TRUE; - return 0; -} - -static void -awe_set_chorus_mode(int effect) -{ - if (effect < 0 || effect >= AWE_CHORUS_NUMBERS || - (effect >= AWE_CHORUS_PREDEFINED && !chorus_defined[effect])) - return; - awe_poke(AWE_INIT3(9), chorus_parm[effect].feedback); - awe_poke(AWE_INIT3(12), chorus_parm[effect].delay_offset); - awe_poke(AWE_INIT4(3), chorus_parm[effect].lfo_depth); - awe_poke_dw(AWE_HWCF4, chorus_parm[effect].delay); - awe_poke_dw(AWE_HWCF5, chorus_parm[effect].lfo_freq); - awe_poke_dw(AWE_HWCF6, 0x8000); - awe_poke_dw(AWE_HWCF7, 0x0000); - chorus_mode = effect; -} - -/*----------------------------------------------------------------*/ - -/* reverb mode settings; write the following 28 data of 16 bit length - * on the corresponding ports in the reverb_cmds array - */ -static char reverb_defined[AWE_CHORUS_NUMBERS]; -static awe_reverb_fx_rec reverb_parm[AWE_REVERB_NUMBERS] = { -{{ /* room 1 */ - 0xB488, 0xA450, 0x9550, 0x84B5, 0x383A, 0x3EB5, 0x72F4, - 0x72A4, 0x7254, 0x7204, 0x7204, 0x7204, 0x4416, 0x4516, - 0xA490, 0xA590, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429, - 0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528, -}}, -{{ /* room 2 */ - 0xB488, 0xA458, 0x9558, 0x84B5, 0x383A, 0x3EB5, 0x7284, - 0x7254, 0x7224, 0x7224, 0x7254, 0x7284, 0x4448, 0x4548, - 0xA440, 0xA540, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429, - 0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528, -}}, -{{ /* room 3 */ - 0xB488, 0xA460, 0x9560, 0x84B5, 0x383A, 0x3EB5, 0x7284, - 0x7254, 0x7224, 0x7224, 0x7254, 0x7284, 0x4416, 0x4516, - 0xA490, 0xA590, 0x842C, 0x852C, 0x842C, 0x852C, 0x842B, - 0x852B, 0x842B, 0x852B, 0x842A, 0x852A, 0x842A, 0x852A, -}}, -{{ /* hall 1 */ - 0xB488, 0xA470, 0x9570, 0x84B5, 0x383A, 0x3EB5, 0x7284, - 0x7254, 0x7224, 0x7224, 0x7254, 0x7284, 0x4448, 0x4548, - 0xA440, 0xA540, 0x842B, 0x852B, 0x842B, 0x852B, 0x842A, - 0x852A, 0x842A, 0x852A, 0x8429, 0x8529, 0x8429, 0x8529, -}}, -{{ /* hall 2 */ - 0xB488, 0xA470, 0x9570, 0x84B5, 0x383A, 0x3EB5, 0x7254, - 0x7234, 0x7224, 0x7254, 0x7264, 0x7294, 0x44C3, 0x45C3, - 0xA404, 0xA504, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429, - 0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528, -}}, -{{ /* plate */ - 0xB4FF, 0xA470, 0x9570, 0x84B5, 0x383A, 0x3EB5, 0x7234, - 0x7234, 0x7234, 0x7234, 0x7234, 0x7234, 0x4448, 0x4548, - 0xA440, 0xA540, 0x842A, 0x852A, 0x842A, 0x852A, 0x8429, - 0x8529, 0x8429, 0x8529, 0x8428, 0x8528, 0x8428, 0x8528, -}}, -{{ /* delay */ - 0xB4FF, 0xA470, 0x9500, 0x84B5, 0x333A, 0x39B5, 0x7204, - 0x7204, 0x7204, 0x7204, 0x7204, 0x72F4, 0x4400, 0x4500, - 0xA4FF, 0xA5FF, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420, - 0x8520, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420, 0x8520, -}}, -{{ /* panning delay */ - 0xB4FF, 0xA490, 0x9590, 0x8474, 0x333A, 0x39B5, 0x7204, - 0x7204, 0x7204, 0x7204, 0x7204, 0x72F4, 0x4400, 0x4500, - 0xA4FF, 0xA5FF, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420, - 0x8520, 0x8420, 0x8520, 0x8420, 0x8520, 0x8420, 0x8520, -}}, -}; - -static struct ReverbCmdPair { - unsigned short cmd, port; -} reverb_cmds[28] = { - {AWE_INIT1(0x03)}, {AWE_INIT1(0x05)}, {AWE_INIT4(0x1F)}, {AWE_INIT1(0x07)}, - {AWE_INIT2(0x14)}, {AWE_INIT2(0x16)}, {AWE_INIT1(0x0F)}, {AWE_INIT1(0x17)}, - {AWE_INIT1(0x1F)}, {AWE_INIT2(0x07)}, {AWE_INIT2(0x0F)}, {AWE_INIT2(0x17)}, - {AWE_INIT2(0x1D)}, {AWE_INIT2(0x1F)}, {AWE_INIT3(0x01)}, {AWE_INIT3(0x03)}, - {AWE_INIT1(0x09)}, {AWE_INIT1(0x0B)}, {AWE_INIT1(0x11)}, {AWE_INIT1(0x13)}, - {AWE_INIT1(0x19)}, {AWE_INIT1(0x1B)}, {AWE_INIT2(0x01)}, {AWE_INIT2(0x03)}, - {AWE_INIT2(0x09)}, {AWE_INIT2(0x0B)}, {AWE_INIT2(0x11)}, {AWE_INIT2(0x13)}, -}; - -static int -awe_load_reverb_fx(awe_patch_info *patch, const char *addr, int count) -{ - if (patch->optarg < AWE_REVERB_PREDEFINED || patch->optarg >= AWE_REVERB_NUMBERS) { - printk("AWE32 Error: illegal reverb mode %d for uploading\n", patch->optarg); - return RET_ERROR(EINVAL); - } - if (count < sizeof(awe_reverb_fx_rec)) { - printk("AWE32 Error: too short reverb fx parameters\n"); - return RET_ERROR(EINVAL); - } - COPY_FROM_USER(&reverb_parm[patch->optarg], addr, AWE_PATCH_INFO_SIZE, - sizeof(awe_reverb_fx_rec)); - reverb_defined[patch->optarg] = TRUE; - return 0; -} - -static void -awe_set_reverb_mode(int effect) -{ - int i; - if (effect < 0 || effect >= AWE_REVERB_NUMBERS || - (effect >= AWE_REVERB_PREDEFINED && !reverb_defined[effect])) - return; - for (i = 0; i < 28; i++) - awe_poke(reverb_cmds[i].cmd, reverb_cmds[i].port, - reverb_parm[effect].parms[i]); - reverb_mode = effect; -} - -/*================================================================ - * treble/bass equalizer control - *================================================================*/ - -static unsigned short bass_parm[12][3] = { - {0xD26A, 0xD36A, 0x0000}, /* -12 dB */ - {0xD25B, 0xD35B, 0x0000}, /* -8 */ - {0xD24C, 0xD34C, 0x0000}, /* -6 */ - {0xD23D, 0xD33D, 0x0000}, /* -4 */ - {0xD21F, 0xD31F, 0x0000}, /* -2 */ - {0xC208, 0xC308, 0x0001}, /* 0 (HW default) */ - {0xC219, 0xC319, 0x0001}, /* +2 */ - {0xC22A, 0xC32A, 0x0001}, /* +4 */ - {0xC24C, 0xC34C, 0x0001}, /* +6 */ - {0xC26E, 0xC36E, 0x0001}, /* +8 */ - {0xC248, 0xC348, 0x0002}, /* +10 */ - {0xC26A, 0xC36A, 0x0002}, /* +12 dB */ -}; - -static unsigned short treble_parm[12][9] = { - {0x821E, 0xC26A, 0x031E, 0xC36A, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001}, /* -12 dB */ - {0x821E, 0xC25B, 0x031E, 0xC35B, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001}, - {0x821E, 0xC24C, 0x031E, 0xC34C, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001}, - {0x821E, 0xC23D, 0x031E, 0xC33D, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001}, - {0x821E, 0xC21F, 0x031E, 0xC31F, 0x021E, 0xD208, 0x831E, 0xD308, 0x0001}, - {0x821E, 0xD208, 0x031E, 0xD308, 0x021E, 0xD208, 0x831E, 0xD308, 0x0002}, - {0x821E, 0xD208, 0x031E, 0xD308, 0x021D, 0xD219, 0x831D, 0xD319, 0x0002}, - {0x821E, 0xD208, 0x031E, 0xD308, 0x021C, 0xD22A, 0x831C, 0xD32A, 0x0002}, - {0x821E, 0xD208, 0x031E, 0xD308, 0x021A, 0xD24C, 0x831A, 0xD34C, 0x0002}, - {0x821E, 0xD208, 0x031E, 0xD308, 0x0219, 0xD26E, 0x8319, 0xD36E, 0x0002}, /* +8 (HW default) */ - {0x821D, 0xD219, 0x031D, 0xD319, 0x0219, 0xD26E, 0x8319, 0xD36E, 0x0002}, - {0x821C, 0xD22A, 0x031C, 0xD32A, 0x0219, 0xD26E, 0x8319, 0xD36E, 0x0002}, /* +12 dB */ -}; - - -/* - * set Emu8000 digital equalizer; from 0 to 11 [-12dB - 12dB] - */ -static void -awe_equalizer(int bass, int treble) -{ - unsigned short w; - - if (bass < 0 || bass > 11 || treble < 0 || treble > 11) - return; - awe_bass_level = bass; - awe_treble_level = treble; - awe_poke(AWE_INIT4(0x01), bass_parm[bass][0]); - awe_poke(AWE_INIT4(0x11), bass_parm[bass][1]); - awe_poke(AWE_INIT3(0x11), treble_parm[treble][0]); - awe_poke(AWE_INIT3(0x13), treble_parm[treble][1]); - awe_poke(AWE_INIT3(0x1B), treble_parm[treble][2]); - awe_poke(AWE_INIT4(0x07), treble_parm[treble][3]); - awe_poke(AWE_INIT4(0x0B), treble_parm[treble][4]); - awe_poke(AWE_INIT4(0x0D), treble_parm[treble][5]); - awe_poke(AWE_INIT4(0x17), treble_parm[treble][6]); - awe_poke(AWE_INIT4(0x19), treble_parm[treble][7]); - w = bass_parm[bass][2] + treble_parm[treble][8]; - awe_poke(AWE_INIT4(0x15), (unsigned short)(w + 0x0262)); - awe_poke(AWE_INIT4(0x1D), (unsigned short)(w + 0x8362)); -} - - -#endif /* CONFIG_AWE32_SYNTH */ diff --git a/sys/i386/conf/NOTES b/sys/i386/conf/NOTES index 08e1904..1fee050 100644 --- a/sys/i386/conf/NOTES +++ b/sys/i386/conf/NOTES @@ -1815,7 +1815,6 @@ hint.gusc.0.irq="5" hint.gusc.0.drq="1" hint.gusc.0.flags="0x13" -# Not controlled by `snd' device pca hint.pca.0.at="isa" hint.pca.0.port="0x040" diff --git a/sys/i386/include/ultrasound.h b/sys/i386/include/ultrasound.h deleted file mode 100644 index e8623a7..0000000 --- a/sys/i386/include/ultrasound.h +++ /dev/null @@ -1,122 +0,0 @@ -#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. - * - * $FreeBSD$ - */ - -/* - * 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 (unsigned short) - * bytes 6 and 7 - parameter P2 (unsigned 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 balance (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;\ - *(unsigned short*)&_seqbuf[_seqbufptr+4] = p1;\ - *(unsigned 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 diff --git a/sys/i386/isa/sound/CHANGELOG b/sys/i386/isa/sound/CHANGELOG deleted file mode 100644 index 04ff604..0000000 --- a/sys/i386/isa/sound/CHANGELOG +++ /dev/null @@ -1,200 +0,0 @@ -Changelog for version 3.5-alpha7 --------------------------------- - -Since 3.5-alpha6 -- Changed all #ifndef EXCLUDE_xx stuff to #ifdef CONFIG_xx. Modified -configure to handle this. -- Removed initialization messages from the -modularized version. They can be enabled by using init_trace=1 in -the insmod command line (insmod sound init_trace=1). -- More AIX stuff. -- Added support for syncronizing dsp/audio devices with /dev/sequencer. -- mmap() support for dsp/audio devices. - -Since 3.5-alpha5 -- AIX port. -- Changed some xxx_PATCH macros in soundcard.h to work with - big endian machines. - -Since 3.5-alpha4 -- Removed the 'setfx' stuff from the version distributed with kernel - sources. - -Since 3.5-alpha3 -- Moved stuff from the 'setfx' program to the AudioTriX Pro driver. - -Since 3.5-alpha2 -- Modifications to makefile and configure.c. Unnecessary sources - are no longer compiled. Newly created local.h is also copied to - /etc/soundconf. "make oldconfig" reads /etc/soundconf and produces - new local.h which is compatible with current version of the driver. -- Some fixes to the SB16 support. -- Fixed random protection fault in gus_wave.c - -Since 3.5-alpha1 -- Modified to work with Linux-1.3.33 and leater -- Some minor changes - -Since 3.0.2 -- Support for CS4232 based PnP cards (AcerMagic S23 etc). -- Full duplex support for some CS4231, CS4232 and AD1845 based cards -(GUA MAX, AudioTrix Pro, AcerMagic S23 and many MAD16/Mozart cards -having a codec mentioned above). -- Almost fully rewritten loadable modules support. -- Fixed some bugs. -- Huge amount of testing (more testing is still required). -- mmap() support (works with some cards). Requires much more testing. -- Sample/patch/program loading for TB Maui/Tropez. No initialization -since TB doesn't allow me to release that code. -- Using CS4231 compatible codecs as timer for /dev/music. - -Since 3.0.1 -- Added allocation of I/O ports, DMA channels and interrupts -to the initialization code. This may break modules support since -the driver may not free some resources on unload. Should be fixed soon. - -Since 3.0 -- Some important bug fixes. -- select() for /dev/dsp and /dev/audio (Linux only). -(To use select() with read, you have to call read() to start -the recording. Calling write() kills recording immediately so -use select() carefully when you are writing a half duplex app. -Full duplex mode is not implemented yet.) Select works also with -/dev/sequencer and /dev/music. Maybe with /dev/midi## too. - -Since 3.0-beta2 -- Minor fixes. -- Added Readme.cards - -Since 3.0-beta1 -- Minor fixes to the modules support. -- Eliminated call to sb_free_irq() in ad1848.c -- Rewritten MAD16&Mozart support (not tested with MAD16 Pro). -- Fix to DMA initialization of PSS cards. -- Some fixes to ad1848/cs42xx mixer support (GUS MAX, MSS, etc.) -- Fixed some bugs in the PSS driver which caused I/O errors with - the MSS mode (/dev/dsp). - -Since 3.0-950506 -- Recording with GUS MAX fixed. It works when the driver is configured - to use two DMA channels with GUS MAX (16 bit ones recommended). - -Since 3.0-94xxxx -- Too many changes - -Since 3.0-940818 -- Fixes for Linux 1.1.4x. -- Disables Disney Sound System with SG NX Pro 16 (less noise). - -Since 2.90-2 -- Fixes to soundcard.h -- Non blocking mode to /dev/sequencer -- Experimental detection code for Ensoniq Soundscape. - -Since 2.90 -- Minor and major bug fixes - -Since pre-3.0-940712 -- GUS MAX support -- Partially working MSS/WSS support (could work with some cards). -- Hardware u-Law and A-Law support with AD1848/CS4248 and CS4231 codecs - (GUS MAX, GUS16, WSS etc). Hardware ADPCM is possible with GUS16 and - GUS MAX, but it doesn't work yet. -Since pre-3.0-940426 -- AD1848/CS4248/CS4231 codec support (MSS, GUS MAX, Aztec, Orchid etc). -This codec chip is used in various soundcards. This version is developed -for the 16 bit daughtercard of GUS. It should work with other cards also -if the following requirements are met: - - The I/O, IRQ and DMA settings are jumper selectable or - the card is initialized by booting DOS before booting Linux (etc.). - - You add the IO, IRQ and DMA settings manually to the local.h. - (Just define GUS16_BASE, GUS16_IRQ and GUS16_DMA). Note that - the base address bust be the base address of the codec chip not the - card itself. For the GUS16 these are the same but most MSS compatible - cards have the codec located at card_base+4. -- Some minor changes - -Since 2.5 (******* MAJOR REWRITE ***********) - -This version is based on v2.3. I have tried to maintain two versions -together so that this one should have the same features than v2.5. -Something may still be missing. If you notice such things, please let me -know. - -The Readme.v30 contains more details. - -- /dev/midi## devices. -- /dev/sequencer2 - -Since 2.5-beta2 -- Some fine tuning to the GUS v3.7 mixer code. -- Fixed speed limits for the plain SB (1.0 to 2.0). - -Since 2.5-beta -- Fixed OPL-3 detection with SB. Caused problems with PAS16. -- GUS v3.7 mixer support. - -Since 2.4 -- Mixer support for Sound Galaxy NX Pro (define __SGNXPRO__ on your local.h). -- Fixed truncated sound on /dev/dsp when the device is closed. -- Linear volume mode for GUS -- Pitch bends larger than +/- 2 octaves. -- MIDI recording for SB and SB Pro. (Untested). -- Some other fixes. -- SB16 MIDI and DSP drivers only initialized if SB16 actually installed. -- Implemented better detection for OPL-3. This should be useful if you - have an old SB Pro (the non-OPL-3 one) or a SB 2.0 clone which has a OPL-3. -- SVR4.2 support by Ian Hartas. Initial ALPHA TEST version (untested). - -Since 2.3b -- Fixed bug which made it impossible to make long recordings to disk. - Recording was not restarted after a buffer overflow situation. -- Limited mixer support for GUS. -- Numerous improvements to the GUS driver by Andrew Robinson. Including - some click removal etc. - -Since 2.3 -- Fixed some minor bugs in the SB16 driver. - -Since 2.2b -- Full SB16 DSP support. 8/16 bit, mono/stereo -- The SCO and FreeBSD versions should be in sync now. There are some - problems with SB16 and GUS in the freebsd versions. - The DMA buffer allocation of the SCO version has been polished but - there could still be some problems. At least it hogs memory. - The DMA channel - configuration method used in the sco/System is a hack. -- Support for the MPU emulation of the SB16. -- Some big arrays are now allocated boot time. This makes the bss segment - smaller which makes it possible to use the full driver with - NetBSD. These arrays are not allocated if no suitable soundcard is available. -- Fixed a bug in the compute_and_set_volume in gus_wave.c -- Fixed the too fast mono playback problem of SB Pro and PAS16. - -Since 2.2 -- Stereo recording for SB Pro. Somehow it was missing and nobody - had noticed it earlier. -- Minor polishing. -- Interpreting of boot time arguments (sound=) for Linux. -- Breakup of sb_dsp.c. Parts of the code has been moved to - sb_mixer.c and sb_midi.c - -Since 2.1 -- Preliminary support for SB16. - - The SB16 mixer is supported in its native mode. - - Digitized voice capability up to 44.1 kHz/8 bit/mono - (16 bit and stereo support coming in the next release). -- Fixed some bugs in the digitized voice driver for PAS16. -- Proper initialization of the SB emulation of latest PAS16 models. - -- Significantly improved /dev/dsp and /dev/audio support. - - Now supports half duplex mode. It's now possible to record and - playback without closing and reopening the device. - - It's possible to use smaller buffers than earlier. There is a new - ioctl(fd, SNDCTL_DSP_SUBDIVIDE, &n) where n should be 1, 2 or 4. - This call instructs the driver to use smaller buffers. The default - buffer size (0.5 to 1.0 seconds) is divided by n. Should be called - immediately after opening the device. - -Since 2.0 -Just cosmetic changes. diff --git a/sys/i386/isa/sound/COPYING b/sys/i386/isa/sound/COPYING deleted file mode 100644 index d1509c5..0000000 --- a/sys/i386/isa/sound/COPYING +++ /dev/null @@ -1,25 +0,0 @@ -/* - * 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. - * - */ diff --git a/sys/i386/isa/sound/README b/sys/i386/isa/sound/README deleted file mode 100644 index 1c31ac6..0000000 --- a/sys/i386/isa/sound/README +++ /dev/null @@ -1,86 +0,0 @@ -VoxWare v2.90 release notes --------------------------- - - - This version includes some hidden features which - are described in the file experimental.txt - Some of these features are not enabled by default. Look at - experimental.txt for more info. - - I just decided to release this version with some - incompletely implemented features disabled since - there are some new features required by a popular - application. In addition there is also support - for the GUS MAX and the 16 bit sampling option of GUS. - - The MSS/WSS support works now. At least with SG NX Pro 16. - -********* IMPORTANT ***************************************** -Linux 1.0 or later is required to by this driver version. - -Don't distribute binaries which use /dev/sequencer and are -compiled with the soundcard.h of this version. They will -not work with version 2.x of the driver. -************************************************************* - - -You will need the snd-util-2.5.tar.gz and snd-data-0.1.tar.Z -packages to use this driver. They should be in the same -ftp site or BBS from where you got this driver. For -example at nic.funet.fi:pub/OS/Linux/*. - -If you are looking for the installation instructions, please -look at linux/Readme. - -Compatibility with the earlier versions ---------------------------------------- - -This version is backward compatible with the version 2.X. All programs -compiled with sys/soundcard.h of v2.X should work without problems. -PROGRAMS COMPILED WITH THE sys/soundcard.h OF THIS VERSION WILL NOT -WORK WITH v2.X DRIVER. BE CAREFUL WHEN DISTRIBUTING BINARIES COMPILED -FOR THIS VERSION. - -Contributors ------------- - -This driver contains code by several contributors. In addition several other -persons have given useful suggestions. The following is a list of major -contributors. (I could have forgotten some names.) - - Craig Metz 1/2 of the PAS16 Mixer and PCM support - Rob Hooft Volume computation algorithm for the FM synth. - Mika Liljeberg uLaw encoding and decoding routines - Greg Lee Volume computation algorithm for the GUS and - lot's of valuable suggestions. - Andy Warner ISC port - Jim Lowe FreeBSD port - Anders Baekgaard Bughunting and valuable suggestions. - Joerg Schubert SB16 DSP support. - Andrew Robinson Improvements to the GUS driver - Megens SA MIDI recording for SB and SB Pro. - Mikael Nordqvist Linear volume support for GUS. - Mikael Nordqvist Linear volume support for GUS. - Ian Hartas SVR4.2 port - Markus Aroharju and - Risto Kankkunen Major contributions to the mixer support - of GUS v3.7. - Hunyue Yau Mixer support for SG NX Pro. - Marc Hoffman PSS support. - -Regards, - -Hannu Savolainen -hannu@voxware.pp.fi - -Snail mail: Hannu Savolainen - Hiekkalaiturintie 3 A 8 - 00980 Helsinki - Finland -FAX: +358 0 341 6272 (answers if I have my machine (mgetty) on). - -NOTE! I probably don't answer to Snail mail or FAX messages. Sending answer - to each of them is simply too expensive and time consuming. However I - try to reply every email message I get (within a week). If you don't - get response, please check how your address is written in the message - header. I can't answer if I don't have a valid reply address. diff --git a/sys/i386/isa/sound/README.FREEBSD b/sys/i386/isa/sound/README.FREEBSD deleted file mode 100644 index 9979d12..0000000 --- a/sys/i386/isa/sound/README.FREEBSD +++ /dev/null @@ -1,165 +0,0 @@ -GUSPNP15 8/6//97 -ftp://rah.star-gate.com/pub/guspnp.tar.gz - -This sound driver is for FreeBSD 3.0-current . - - -Major enhancement we now support mapping the dma buffer to user -space for write operations only. This features is useful for -games like xquake . So far the mmap features seems to work -with the GUS PnP Pro and with the SB16. - -For xquake you will need: - -1. a few mods to the linux loadable module so just download it and - replace yours: -cd /sys/i386/ -tar -xzf linux_ioctl.tar.gz -cd /usr/src/lkm/linux -make -make install -modunload -i 0 (if you have the linux up and running) -linux -ftp://rah.star-gate.com/linux_ioctl.tar.gz - -2. Install the linux lib 2.4 package: -pkg_add linux_lib-2.4.tgz - -ftp://ftp.freebsd.org/pub/FreeBSD/packages-current/emulators/linux_lib-2.4.tgz - -If you don't have xquake you can get it from: - -3. ftp://ftp.freebsd.org/pub/idgames/idstuff/unsup/intel_linux_quake101.tgz - - -A simple test program mmap_test.c is provided in the sound driver directory. -So copy it to your home directory or favorite place and compile it. -cc -o mmap_test mmap_test.c - -record a sample session: -cat /dev/dsp >smpl - -now run mmap_test . You will hear a loud pop thats a test program -then the sample stream will loop . - - -Phew, now back to sound driver land 8) - - -This is a minor sound driver release for the GUS PnP Pro , GUS MAX, -AudioTrix Pro , SB16 and SB16 PnP. There is also an experimental -AWE sub model. - -Included Luigi's clean up work . Tnks! - -Randall Hopper's SB16 speed setting fix . Tnks! - -Fixed signal handling throught out the sound driver. The problem -first surfaced with the SB16 not generating an interrupt on the -last dma request and SB afficionados quickly pointed out the -bug in the driver. I had to put back the auto dma feature for -xquake :( - - -NOTE YOU DON'T NEED THE PNP DRIVER FOR THE GUS PNP SINCE THE DRIVER -HAS BUILTIN PNP SUPPORT FOR THE GUS. - -My P133 Bios supports PnP. To first figured out what my SB16 PnP -was being configured to I booted win95 and checked out what Win95 -ended up with . Alternatively, if you want to you can also down -load Sujal Patel's PnP driver: - - ftp://rah.start-gate.com/pub/FreeBSD-ISA_PnP_June8.tar.gz - -follow the instructions on how to configure your PnP soundcard or -ISA device. -Lugi also has Sujal's PnP driver . - - ---- - - http://www.iet.unipi.it/~luigi/pnp.c - http://www.iet.unipi.it/~luigi/pnp.h - - the two main files. Follow Sujal Patel's instructions - for installing pnp support. - - http://www.iet.unipi.it/~luigi/pnpinfo.tgz ---- - -This is my kernel configuration for my SB16 PnP: - -controller snd0 -device sb0 at isa? port 0x220 irq 10 conflicts drq 3 -device sbxvi0 at isa? port? irq? drq 5 conflicts -device opl0 at isa? port 0x388 conflicts -device sbmidi0 at isa? port 0x300 irq? conflicts - ----- - - -The difference between a GUS PnP and a GUS PnP PRO is that the Pro -comes with 512kb. I went out an got a 1mb 60ns 30pin simm and installed -it on my GUS PnP. I own a GUS PnP and a GUS PnP PRO. - - -To unpack: -cd / -mv /sys/i386/isa/sound /sys/i386/isa/sound.old -cd /sys/i386/isa/ -tar -xzf guspnp15.tar.gz - - -cd /sys/i386/conf -Edit the kernel config file in /sys/i386/conf - -IF YOU HAVE A GUS MAX or GUS add the option NOGUSPNP to the config file - OPTIONS NOGUSPNP - THEN follow the instructions for NONPNP CONFIGURATION - - -PNP CONFIGURATION -To configure your guspnp PRO if you have a motherboard which supports -PnP: - - controller snd0 - device gus0 at isa? - -NONPNP CONFIGURATION -To configure your guspnp PRO if your motherboard does NOT support -PnP: - -device gus0 at isa? port 0x220 irq 11 drq 1 flags 0x3 - - -the gus pnp is fully software configurable and the above configuration -is setup for full duplex audio. The dma channel settings are: - -drq 1 --- DMA channel for playback - -flags 0x3 --- DMAN channel for recording - -In the event that you have to configure a GUS PnP manually or a GUS MAX: - - Available IRQs for the GUS are: - 3, 5, 7, 9, 11, 12, 15 - - Available DMA channels for the GUS are: - 1, 3, 5, 6, 7 - - -config -cd /sys/compile/ -make -make install - -THERE IS NO NEED TO BOOT TO DOS TO CONFIGURE YOUR GUS PNP. -THE DRIVER HAS BUILTIN SUPPORT FOR PNP WHICH I GOT -FROM THE GRAVIS DRIVER DEVELOPMENT KIT - -Many thanks to Brian Litzinger for -porting the sound driver 3.5 to 2.2-current. Well, thats a while -ago hence the reference to 2.2. - - Have fun, - Amancio diff --git a/sys/i386/isa/sound/Readme b/sys/i386/isa/sound/Readme deleted file mode 100644 index 2594143..0000000 --- a/sys/i386/isa/sound/Readme +++ /dev/null @@ -1,248 +0,0 @@ - -VoxWare v3.5-alpha5 release notes ---------------------------------- - -IMPORTANT! This version of the driver is compatible only with Linux versions - 1.3.33 and later. It may work with earlier ones as a loadable - module but... - - Also this is an ALPHA test version which has not been tested - with all cards. At least AEDSP16 support will not work. PAS16 - and PSS supports have not been tested. /dev/dsp and /dev/audio - playback with standard GUS sounds scrambled. 16 bit mode of - SB16 doesn't work. - -Please read the SOUND-HOWTO (available from sunsite.unc.edu and other Linux ftp -sites). It contains much more information than this file. - -***************************************************************** -* NEW! VoxWare home page is http://personal.eunet.fi/pp/voxware * -* The file Readme.cards contains card specific instructions * -* about configuring various cards. * -***************************************************************** - -There are some programming information (little bit old) in the -Hacker's Guide -(ftp://nic.funet.fi/pub/OS/Linux/ALPHA/sound/snd-sdk-doc-0.1.ps.gz). -Believe me: The file is really there. The directory is just hidden and -you have to cd into it before the file is visible. Note: This directory -was accidently removed some time ago but it's now back. - -I have got many patches from various persons during last year. Some of -them are still on my mailbox and they should be included in versions -after v3.0 (I will not add aditional features before v3.0 is ready). - - ==================================================== -- THIS VERSION ____REQUIRES____ Linux 1.3.33 OR LATER. - ==================================================== - -- THIS VERSION MAY NOT WORK WITH Linux VERSIONS RELEASED - AFTER end of Nov 1995. If this version doesn't compile with - your kernel version, please use the sound driver version - included in your kernel. - -You will need the snd-util-3.0.tar.gz and snd-data-0.1.tar.Z -packages to use this driver. They should be in the same -ftp site or BBS from where you got this driver. For -example at nic.funet.fi:pub/OS/Linux/*. - -If you are looking for the installation instructions, please -look at linux/Readme. - -Supported soundcards --------------------- - -Gravis Ultrasound (GUS) -GUS MAX -GUS with the 16 bit sampling daughtercard -PAS16 -Windows Sound System compatible soundcards -ECHO-PSS (cards based on the PSS architecture by Analog Devices. - Including Orchid SW32, Cardinal DSP16 among others). - (NOTE! WSS mode may not work (DMA channel setup problem)). -MediaTriX AudioTriX Pro (OPL4 and the optional effect daughtercard - require special initialization. There is a program (setfx) in - the snd-util-3.0.tar.gz package which does it). -Ensoniq SoundScape (works but needs some improvements) -MV Jazz16 based soundcards (ProSonic, 3D etc). -SoundMan Wave (recording may not work, mixer support is limited) -Mozart (OAK OTI-601 interface chip) based soundcards. -MAD16 (an interface chip by OPTi) based soundcards (TB Tropez ???). -(NOTE! The MAD16 looks similar to the Mozart chip. It could be a good -idea to configure MAD16 cards as Mozart ones. The MAD16 driver doesn't set -up MPU401 which the Mozart one does. -CS4232 based cards such as AcerMagic S23. - - -In addition all Sound Blaster models and clones (up to AWE32) work if -you want to use them. - -The Emu synthesizer chip of AWE32 is not and will not be supported. The same is -true with the ASP chip also. Creative Technology will not release detailed -information about them so it's not possible to support them. - -If you want to get support for AWE32 or ASP, please contact Creative Labs. -Ask _politely_ if they are going to support Linux. Maybe they change -their policy if there is enough demand. - -=========================================================================== -If your card is compatible with SB, MPU401 or Windows Sound System, it -may work with the driver even if it's not listed in the above list. In this -case it may require initialization using DOS. Just start DOS and cold -boot to Linux (etc.) by hitting ctrl-alt-del. -=========================================================================== - -Compatibility with the earlier versions ---------------------------------------- - -There have been some changes in soundcard.h after v2.5 of the driver -(v2.90 is compatible with this one). Binaries compiled with this version -of soundcard.h will not work with v2.0 and earlier. - -Contributors ------------- - -This driver contains code by several contributors. In addition several other -persons have given usefull suggestions. The following is a list of major -contributors. (I could have forgotten some names.) - - Craig Metz 1/2 of the PAS16 Mixer and PCM support - Rob Hooft Volume computation algorithm for the FM synth. - Mika Liljeberg uLaw encoding and decoding routines - Andy Fingerhut New ulaw conversion tables (ulaw.h) - Jeff Tranter Linux SOUND HOWTO document - Greg Lee Volume computation algorithm for the GUS and - lot's of valuable suggestions. - Andy Warner ISC port - Jim Lowe, - Amancio Hasty Jr FreeBSD/NetBSD port - Anders Baekgaard Bughunting and valuable suggestions. - Joerg Schubert SB16 DSP support. - Andrew Robinson Improvements to the GUS driver - Megens SA MIDI recording for SB and SB Pro. - Mikael Nordqvist Linear volume support for GUS and - nonblocking /dev/sequencer. - Ian Hartas SVR4.2 port - Markus Aroharju and - Risto Kankkunen Major contributions to the mixer support - of GUS v3.7. - Hunyue Yau Mixer support for SG NX Pro. - Marc Hoffman PSS support. - Rainer Vranken Initialization for Jazz16 (ProSonic, MV3D, SM Wave). - Peter Trattler Initial version of loadable module support for Linux. - JRA Gibson 16 bit mode for Jazz16 - Davor Jadrijevic MAD16 support - Gregor Hoffleit Mozart support - Riccardo Facchetti Audio Excel DSP 16 (aedsp16) support - -There are propably many other names missing. If you have sent me some -patches and your name is not in the above list, please inform me. - -Sponsors etc. -------------- - -The following companies have greatly helped development of this driver -in form of a free copy of their product: - -Novell, Inc. UnixWare personal edition + SDK -The Santa Cruz Operation, Inc. A SCO OpenServer + SDK -Ensoniq Corp, a SoundScape card and extensive amount of assistance -MediaTriX Peripherals Inc, a AudioTriX Pro card + SDK -Acer, Inc. a pair of AcerMagic S23 cards. - -In addition the following companies have provided me sufficial amount -of technical information at least some of their products (free or $$$): - -Advanced Gravis Computer Technology Ltd. -Media Vision Inc. -Analog Devices Inc. -Logitech Inc. -Aztech Labs Inc. -Crystal Semiconductor Corporation, -Integrated Circuit Systems Inc. -OAK Technology -OPTi -Ad Lib Inc. ($$) -Music Quest Inc. ($$) -Creative Labs ($$$) - -If you have some problems -========================= - -Read the sound HOWTO (sunsite.unc.edu:/pub/Linux/docs/...?). -Also look at the home page (http://personal.eunet.fi/pp/voxware). It may -contain info about some recent bug fixes. - -It's likely that you have some problems when trying to use the sound driver -first time. Soundcards don't have standard configuration so there are no -good default configuration to use. Please try to use same I/O, DMA and IRQ -values for the soundcard than with DOS. - -If you get an error message when trying to use the driver, please look -at /var/adm/messages for more verbose error message. - - -In general the easiest way to diagnoze problems is to do "cat /dev/sndstat". - -If you get an error message, there are some problems with the driver setup: - - - "No such file or directory" tells that the device files for - the sound driver are missing. Use the script at the end of - linux/drivers/sound/Readme.linux to create them. - - - "No such device" telss that the sound driver is not in the kernel. - You have to reconfigure and recompile the kernel to have the sound - driver. Compiling the driver doesn't help alone. You have to boot - with the newly compiled one before the driver becomes active. - The Linux-HOWTO should help in this step. - -The following errors are likely with /dev/dsp and /dev/audio. - - - "No such device or address". This error message should not happen - with /dev/sndstat but it's possible with the other sound devices. - This error indicates that there are no suitable hardware for the - device file or the sound driver has been compiled without support for - this particular device. For example /dev/audio and /dev/dsp will not - work if "digitized voice support" was not enabled during "make config". - - - "Device or resource busy". Propably the IRQ (or DMA) channel - required by the soundcard is in use by some other device/driver. - - - "I/O error". Almost certainly (99%) it's an IRQ or DMA conflict. - Look at the kernel messages in /var/adm/notice for more info. - - - "Invalid argument". The application is calling ioctl() - with impossible parameters. Check that the application is - for sound driver version 2.X or later. - -In general the printout of of /dev/sndstat should tell what is the problem. -It's possible that there are bugs in the sound driver but 99% of the problems -reported to me are caused by somehow incorrect setup during "make config". - -For owners of TI TM4000M notebooks ----------------------------------- - -There appears to be some kind of conflict between the sound support -(MV Jazz), mouse port and VoxWare. You could try to configure kernel -with the C&T 82C710 mouse port support disabled. - -Hannu - -Regards, - -Hannu Savolainen -hannu@voxware.pp.fi -(or Hannu.Savolainen@cctap.carel.fi in case the above bounces) - -Snail mail: Hannu Savolainen - Hiekkalaiturintie 3 A 8 - 00980 Helsinki - Finland - -NOTE! I propably don't answer to Snail mail or FAX messages. Sending answer - to each of them is simply too expensive and time consuming. However I - try to reply every email message I get (within a week). If you don't - get response, please check how your address is written in the message - header. I can't answer if I don't have a valid reply address. - -VoxWare home page is http://personal.eunet.fi/pp/voxware diff --git a/sys/i386/isa/sound/Readme.aedsp16 b/sys/i386/isa/sound/Readme.aedsp16 deleted file mode 100644 index b205a9d..0000000 --- a/sys/i386/isa/sound/Readme.aedsp16 +++ /dev/null @@ -1,6 +0,0 @@ -Informations about Audio Excel DSP 16 can be found in the source -file aedsp16.c -Please, read the head of the source before using it. It contain useful -informations. - - Riccardo diff --git a/sys/i386/isa/sound/Readme.cards b/sys/i386/isa/sound/Readme.cards deleted file mode 100644 index fe17aa06..0000000 --- a/sys/i386/isa/sound/Readme.cards +++ /dev/null @@ -1,845 +0,0 @@ -Configuring VoxWare 3.0 (for Linux) with some most common soundcards -==================================================================== - -NOTE! This document may contain some error. Please inform me - if you find any mistakes. - -Read this before trying to configure the driver ------------------------------------------------ - -There are currently many cards that work with VoxWare. Some of the cards -have native support while the others work since they emulate some other -cards (usually SB, MSS/WSS and/or MPU401). The following cards have native -support in VoxWare. Detailed instructions for configuring these cards -will be given later in this document. - -Pro Audio Spectrum 16 (PAS16) and compatibles: - Pro Audio Spectrum 16 - Pro Audio Studio 16 - Logitech Sound Man 16 - NOTE! The original Pro Audio Spectrum as well as the PAS+ are not - and will not be supported by VoxWare. - -Media Vision Jazz16 based cards - Pro Sonic 16 - Logitech SoundMan Wave - (Other Jazz based cards should work but I don't have any reports - about them). - -Sound Blasters - SB 1.0 to 2.0 - SB Pro - SB 16 - NOTE! The ASP chip and the EMU synth of the AWE32 is not supported - since their manufacturer doesn't release information about - the card. However both the AB16ASP and the AWE32 work with - VoxWare just like a SB16. Also see the comment about some - unsupported cards at the end of this file. - SB16 compatible cards by other manufacturers than Creative. - You have been fooled since there are no SB16 compatible - cards in the market (July95). It's likely that your card - is compatible just with SB Pro but there is also a non SB - compatible 16 bit mode. Usually it's MSS/WSS but could also - be a proprietary one like MV Jazz16. - -Gravis Ultrasound (GUS) - GUS - GUS + the 16 bit option - GUS MAX - GUS ACE (No MIDI port and audio recording) - -MPU-401 and compatibles - The driver works both with the full (intelligent mode) MPU-401 - cards (such as MPU IPC-T and MQX-32M) and with the UART only - dumb MIDI ports. MPU-401 is currently the most common MIDI - interface. Most soundcards are compatible with it. However - don't enable MPU401 mode blindly. Many cards having native support - in VoxWare have their own MPU401 driver. Enabling the standard one - will cause a conflict with these cards. So look if your card is - in the list of supported cards before enabling MPU401. - -Windows Sound System (MSS/WSS) - Even Microsoft has discontinued their own Sound System card, they - managed to make a standard. MSS compatible cards are based on a - codec chip which is easily available from at least two manufacturers - (AD1848 by Analog Devices and CS4231/CS4248 by Crystal Semiconductor). - Currently most soundcards are based on one of the MSS compatible codec - chip. The CS4231 is used in the high quality cards such as GUS MAX, - MediaTriX AudioTriX Pro and TB Tropez (GUS MAX is not MSS compatible). - - Having a AD1848, CS4248 or CS4231 codec chip on the card is a good - sign. Even if the card is not MSS compatible, it could be easy to write - support for it to VoxWare. Note also that most MSS compatible cards - require special boot time initialization which may not be present - in VoxWare. Also some MSS compatible cards have native support in - VoxWare. Enabling the MSS support with these cards is likely to - cause a conflict. So check if your card is listed in this file before - enabling the MSS support. - -6850 UART MIDI - This UART chip is used in the MIDI interface of some (rare) - soundcards. It's supported by VoxWare in case you need it. - -Yamaha FM synthesizers (OPL2, OPL3 and OPL4) - Most soundcards have a FM synthesizer chip. The OPL2 is a 2 - operator chip used in the original AdLib card. Currently it's used - only in the cheapest (8 bit mono) cards. The OPL3 is a 4 operator - FM chip which provides better sound quality and/or more available - voices than the OPL2. The OPL4 is a new chip which has a OPL3 and - a wave table synthesizer packed on the same chip. VoxWare supports - just the OPL3 mode directly. Most cards having a OPL4 (like - SM Wave and AudioTriX Pro) support the OPL4 mode using MPU401 - emulation. Writing a native OPL4 support to VoxWare is difficult - since Yamaha doesn't give information about their sample ROM chip. - - Enable the generic OPL2/OPL3 FM synthesizer support if your - card has a FM chip made by Yamaha. Don't enable it if your card - has a software (TRS) based FM emulator. - -PSS based cards (AD1848 + ADSP-2115 + Echo ESC614 ASIC) - Analog Devices and Echo Speech have together defined a soundcard - architecture based on the above chips. The DSP chip is used - for emulation of SB Pro, FM and General MIDI/MT32. - - There are several cards based on this architecture. The most known - ones are Orchid SW32 and Cardinal DSP16. - - VoxWare supports downloading DSP algorithms to these cards. - -MediaTriX AudioTriX Pro - The ATP card is built around a CS4231 codec and a OPL4 synthesizer - chips. The OPL4 mode is supported by a microcontroller running a - General MIDI emulator. There is also a SB 1.5 compatible playback mode. - -Ensoniq SoundScape and compatibles - Ensoniq has designed a soundcard architecture based on the - OTTO synthesizer chip used in their professional MIDI synthesizers. - Several companies (including Ensoniq, Reveal and Spea) are selling - cards based on this architecture. - -MAD16 and Mozart based cards - The Mozart (OAK OTI-601) and MAD16 Pro (OPTi 82C929) interface - chips are used in many different soundcards, including some - cards by Reveal and Turtle Beach (Tropez). Purpose of these - chips is to connect other audio components to the PC bus. The - interface chip performs address decoding for the other chips. - -Audio Excell DSP16 - Support for this card is made by Riccardo Faccetti - (riccardo@cdc8g5.cdc.polimi.it). See aedsp16.c for more info. - -Crystal CS4232 based cards such as AcerMagic S23 - CS4232 is a PnP multimedia chip which contains a CS3231A codec, - SB and MPU401 emulations. There is support for OPL3 too. - (Unfortunately the MPU401 mode doesn't work). - -Turtle Beach Maui and Tropez - VoxWare supports sample, parch and program loading commands - described in the Maui/Tropez User's manual. There is no initialization - code for Maui so it must be initialized using DOS. Audio side of Tropez - is based on the MAD16 chip (see above). - -Jumpers and software configuration ----------------------------------- - -Some of the earliest soundcards were jumper configurable. You have to -configure VoxWare to configure VoxWare use I/O, IRQ and DMA settings -that match the jumpers. Just few 8 bit cards are fully jumper -configurable (SB 1.x/2.x, SB Pro and clones). -Some cards made by Aztech have an EEPROM which contains the -config info. These cards behave much like hardware jumpered cards. - -Most cards have jumper for the base I/O address but other parameters -are software configurable. Sometimes there are few other jumpers too. - -Latest cards are fully software configurable or they are PnP ISA -compatible. There are no jumpers on the board. - -VoxWare handles software configurable cards automaticly. Just configure -the driver to use I/O, IRQ and DMA settings which are known to work. -You could usually use the same values than with DOS and/or Windows. -Using different settings is possible but not recommended since it may cause -some trouble (for example when warm booting from an OS to another or -when installing new hardware to the machine). - -VoxWare sets the soft configurable parameters of the card automaticly -during boot. Usually you don't need to run any extra initialization -programs when booting Linux but there are some exceptions. See the -card specific instructions (below) for more info. - -The drawback of software configuration is that the driver needs to know -how the card must be initialized. It cannot initialize unknown cards -even if they are otherwise compatible with some other cards (like SB, -MPU401 or Windows Sound System). - -What if your card was not listed above? ---------------------------------------- - -The first thing to do is to look at the major IC chips on the card. -Many of the latest soundcards are based on some standard chips. If you -are lucky, all of them could be supported by VoxWare. The most common ones -are the OPTi MAD16, Mozart, SoundScape (Ensoniq) and the PSS architectures -listed above. Also look at the end of this file for list of unsupported -cards and the ones which could be supported later. - -The last resort is to send _exact_ name and model information of the card -to me together with a list of the major IC chips (manufactured, model) to -me. I could then try to check if your card looks like something familiar. - -There are much more cards in the word than listed above. The first thing to -do with these cards is to check if they emulate some other card/interface -such as SB, MSS and/or MPU401. In this case there is a chance to get the -card to work by booting DOS before starting Linux (boot DOS, hit ctrl-alt-del -and boot Linux without hard resetting the machine). In this method the -DOS based driver initializes the hardware to use a known I/O, IRQ and DMA -settings. If VoxWare is configured to use the same settings, everything should -work OK. - - -Configuring VoxWare (with Linux) -================================ - -VoxWare sound driver is currently a part of Linux kernel distribution. The -driver files are located in directory /usr/src/linux/drivers/sound. - -**************************************************************************** -* VoxWare MUST BE CONFIGURED AND COMPILED WITH THE KERNEL. TRYING * -* TO COMPILE IT ALONE WILL _NOT_ WORK. * -* * -* ALWAYS USE THE SOUND DRIVER VERSION WHICH IS DISTRIBUTED WITH * -* THE KERNEL SOURCE PACKAGE YOU ARE USING. SOME ALPHA AND BETA TEST * -* VERSIONS CAN BE INSTALLED FROM A SEPARATELY DISTRIBUTED PACKAGE * -* BUT CHECK THAT THE PACKAGE IS NOT MUCH OLDER (OR NEWER) THAN THE * -* KERNEL YOU ARE USING. IT'S POSSIBLE THAT THE KERNEL/DRIVER * -* INTERFACE CHANGES BETWEEN KERNEL RELEASES WHICH MAY CAUSE SOME * -* INCOMPATIBILITY PROBLEMS. * -* * -* IN CASE YOU INSTALL A SEPARATELY DISTRIBUTED SOUND DRIVER VERSION, * -* BE SURE TO REMOVE OR RENAME THE OLD SOUND DRIVER DIRECTORY BEFORE * -* INSTALLING THE NEW ONE. LEAVING OLD FILES TO THE SOUND DRIVER * -* DIRECTORY _WILL_ CAUSE PROBLEMS WHEN THE DRIVER IS USED OR * -* COMPILED. * -**************************************************************************** - -To configure the driver, run "make config" in the kernel source directory -(/usr/src/linux). Answer y to the question about Sound card support (after -questions about mouse, CD-ROM, ftape, etc. supports). Sound config options -will then be asked after some additional questions. - -After configuring the kernel and sound driver, run "make dep" and compile -the kernel following instructions in the kernel README. - -The sound driver configuration dialog -------------------------------------- - -All config information of the sound driver is written to file -linux/drivers/sound/local.h. You may save the old version is this file and -use it again in case you want to use the same config later. In this case -just answer n to each question made by the sound config program and put -the original local.h back before running "make dep". -Don't do this if the version number of the sound driver has changed. In this -case you have to enter the configuration information again. - -If you already have the sound driver installed, consult printout of -"cat /dev/sndstat" when configuring the driver again. It gives the I/O, -IRQ and DMA settings you have used earlier. - - -The sound config program (linux/drivers/sound/configure) starts by making -some yes/no questions. Be careful when answering to these questions since -answering y to a question may prevent some later ones from being asked. For -example don't answer y to the first question (PAS16) if you don't really -have a PAS16. Don't enable more cards than you really need since they -just consume memory. Also some drivers (like MPU401) may conflict with your -SCSI controller and prevent kernel from booting. If you card was in the list -of supported cards (above), please look at the card specific config -instructions (later in this file) before starting to configure. Some cards -must be configured in way which is not obvious. - -So here is the beginning of the config dialog. Answer 'y' or 'n' to these -questions. The default answer is shown so that (y/n) means 'y' by default and -(n/y) means 'n'. To use the default value, just hit ENTER. But be careful -since using the default _doesn't_ guarantee anything. - -Note also that all questions may not be asked. The configuration program -may disable some questions dependig on the earlier choices. It may also -select some options automaticly as well. - - "ProAudioSpectrum 16 support", - - Answer 'y'_ONLY_ if you have a Pro Audio Spectrum _16_, - ProAudio Studio 16 or Logitech SoundMan 16 (be sure that - you read the above list correctly). Don't answer 'y' if you - have some other card made by Media Vision or Logitech since they - are not PAS16 compatible. - "SoundBlaster support", - - Answer 'y' if you have an original SB card made by Creative Labs - or a full 100% hardware compatible clone (like Thunderboard or - SM Games). If your card was in the list of supported cards (above), - please look at the card specific instructions later in this file - before answering this question. For an unknown card you may answer - 'y' if the card claims to be SB compatible. - - Don't enable SB if you have a MAD16 or Mozart compatible card. - - "Generic OPL2/OPL3 FM synthesizer support", - - Answer 'y' if your card has a FM chip made by Yamaha (OPL2/OPL3/OPL4). - Answering 'y' is usually a safe and recommended choice. However some - cards may have software (TSR) FM emulation. Enabling FM support - with these cards may cause trouble. However I don't currently know - such cards. - "Gravis Ultrasound support", - - Answer 'y' if you have GUS or GUS MAX. Answer 'n' if you don't - have GUS since the GUS driver consumes much memory. - Currently I don't have experiences with the GUS ACE so I don't - know what to answer with it. - "MPU-401 support (NOT for SB16)", - - Be careful with this question. The MPU401 interface is supported - by almost any soundcard today. However some natively supported cards - have their own driver for MPU401. Enabling the MPU401 option with - these cards wil cause a conflict. Also enabling MPU401 on a system - that doesn't really have a MPU401 could cause some trouble. If your - card was in the list of supported cards (above), please look at - the card specific instructions later in this file. - It's safe to answer 'y' if you have a true MPU401 MIDI interface - card. - "6850 UART Midi support", - - It's safe to answer 'n' to this question in all cases. The 6850 - UART interface is so rarely used. - "PSS (ECHO-ADI2111) support", - - Answer 'y' only if you have Orchid SW32, Cardinal DSP16 or some - other card based on the PSS chipset (AD1848 codec + ADSP-2115 - DSP chip + Echo ESC614 ASIC CHIP). - "16 bit sampling option of GUS (_NOT_ GUS MAX)", - - Answer 'y' if you have installed the 16 bit sampling daughtercard - to your GUS. Answer 'n' if you have GUS MAX. Enabling this option - disables GUS MAX support. - "GUS MAX support", - - Answer 'y' only if you have a GUS MAX. - "Microsoft Sound System support", - - Again think carefully before answering 'y' to this question. It's - safe to answer 'y' in case you have the original Windows Sound - System card made by Microsoft or Aztech SG 16 Pro (or NX16 Pro). - Also you may answer 'y' in case your card was not listed earlier - in this file. For cards having native support in VoxWare, consult - the card specific instructions later in this file. Some drivers - have their own MSS support and enabling this option wil cause a - conflict. - "Ensoniq Soundscape support", - - Answer 'y' if you have a soundcard based on the Ensoniq SoundScape - chipset. Suach cards are being manufactured at least by Ensoniq, - Spea and Reveal (note that Reveal makes other cards also). - "MediaTriX AudioTriX Pro support", - - Answer 'y' if you have the AudioTriX Pro. - "Support for MAD16 and/or Mozart based cards", - - Answer y if your card has a Mozart (OAK OTI-601) or MAD16 - (OPTi 82C928 or 82C929) audio interface chip. These chips are - currently quite common so it's possible that many no-name cards - have one of them. In addition the MAD16 chip is used in some - cards made by known manufacturers such as Turtle Beach (Tropez), - Reveal (some models) and Diamond (latest ones). - "SoundBlaster Pro support", - - Enable this option if your card is SB Pro or SB16. Enable it - also with any SB Pro clones. Answering 'n' saves some amount of - memory but 'y' is the safe alterative. - "SoundBlaster 16 support", - - Enable if you have a SB16 (including the AWE32). - "Audio Excel DSP 16 initialization support", - - Don't know much about this card. Look at aedsp16.c for more info. - -Then the configuration program asks some y/n questions about the higher -level services. It's recommended to answer 'y' to each of these questions. -Answer 'n' only if you know you will not need the option. - - "/dev/dsp and /dev/audio supports (usually required)", - - Answering 'n' disables /dev/dsp and /dev/audio. Answer 'y'. - "MIDI interface support", - - Answering 'n' disables /dev/midi## devices and access to any - MIDI ports using /dev/sequencer and /dev/music. This option - also affects any MPU401 and/or General MIDI compatible devices. - "FM synthesizer (YM3812/OPL-3) support", - - Answer 'y' here. - "/dev/sequencer support", - - Answering 'n' disables /dev/sequencer and /dev/music. - -Entering the I/O, IRQ and DMA config parameters ------------------------------------------------ - -After the above questions the configuration program prompts for the -card specific configuration information. Usually just a set of -I/O address, IRQ and DMA numbers are asked. With some cards the program -asks for some files to be used during initialization of the card. For example -many cards have a DSP chip or microprocessor which must be initialized by -downloading a program (microcode) file to the card. In some cases this file -is written to a .h file by the config program and then included to the driver -during compile. - -Instructions for answering these questions are given in the next section. - - -Card specific information -========================= - -This section gives additional instructions about configuring some cards. -Please refer manual of your card for valid I/O, IRQ and DMA numbers. Using -the same settings with DOS/Windows and VoxWare is recommended. Using -different values could cause some problems when switching between -different operating systems. - -SoundBlasters (the original ones by Creative) ---------------------------------------------- - -It's possible to configure these cards to use different I/O, IRQ and -DMA settings. Since the available settings have changed between various -models, you have to consult manual of your card for the proper ones. It's -a good idea to use the same values than with DOS/Windows. With SB and SB Pro -it's the only choice. SB16 has software selectable IRQ and DMA channels but -using different values with DOS and Linux is likely to cause troubles. The -DOS driver is not able to reset the card properly after warm boot from Linux -if Linux has used different IRQ or DMA values. - -The original (steam) Sound Blaster (versions 1.x and 2.x) use always -DMA1. There is no way to change it. - -The SB16 needs two DMA channels. A 8 bit one (1 or 3) is required for -8 bit operation and a 16 bit one (5, 6 or 7) for the 16 bit mode. In theory -it's possible to use just one (8 bit) DMA channel by answering the 8 bit -one when the configuration program asks for the 16 bit one. This may work -in some systems but is likely to cause terrible noise on some other systems. - -NOTE! Don't enable the SM Games option (asked by the configuration program) - if you are not 101% sure that your card is a Logitech Soundman Games - (not a SM Wave or SM16). - -SB Clones ---------- - -First of all: There are no SB16 clones. There are SB Pro clones with a -16 bit mode which is not SB16 compatible. The most likely alternative is that -the 16 bit mode means MSS/WSS. - -There are just few fully 100% hardware SB or SB Pro compatible cards. -I know just Thunderboard and SM Games. Other cards require some kind of -hardware initialization before they become SB compatible. Check if your card -was listed in the beginning of this file. In this case you should follow -instructions for your card later in this file. - -For other not fully SB clones yoy may try initialization using DOS in -the following way: - - - Boot DOS so that the card specific driver gets run. - - Hit ctrl-alt-del (or use loadlin) to boot Linux. Don't - switch off power or press the reset button. - - If you use the same I/O, IRQ and DMA settings in Linux, the - card should work. - -If your card is both SB and MSS compatible, I recommend using the MSS mode. -Most cards of this kind are not able to work in the SB and the MSS mode -simultaneously. Using the MSS mode provides 16 bit recording and playback. - -ProAudioSpectrum 16 and compatibles ------------------------------------ - -There are nothing special with these cards. Just don't enable any -other cards in case you don't have them also. The PAS16 has -a SB mode so the driver config program will prompt for the SB settings -do. Use I/O 0x220 and DMA1 for the SB mode. Ensure that you assign different -IRQ numbers for the SB and PAS16 modes. - -With PAS16 you can use two audio device files at the same time. /dev/dsp (and -/dev/audio) is connected to the 8/16 bit native codec and the /dev/dsp1 (and -/dev/audio1) is connected to the SB emulation (8 bit mono only). - -Gravis Ultrasound ------------------ - -There are many different revisions of the Ultrasound card (GUS). The -earliest ones (pre 3.7) don't have a hardware mixer. With these cards -the driver uses a software emulation for synth and pcm playbacks. It's -also possible to switch some of the inputs (line in, mic) off by setting -mixer volume of the channel level below 10%. For recording you have -to select the channel as a recording source and to use volume above 10%. - -GUS 3.7 has a hardware mixer. - -GUS MAX and the 16 bit sampling daughtercard have a CS4231 codec chip which -also contains a mixer. - -Configuring GUS is simple. Just enable the GUS support and GUS MAX or -the 16 bit daughtercard if you have them. Note that enabling the daughter -card disables GUS MAX driver. - -With just the standard GUS enabled the configuration program prompts -for the I/O, IRQ and DMA numbers for the card. Use the same values than -with DOS. - -With the daughter card option enabled you will be prompted for the I/O, -IRQ and DMA numbers for the daughter card. You have to use different I/O -and DMA values than for the standard GUS. The daughter card permits -simultaneous recording and playback. Use /dev/dsp (the daughtercard) for -recording and /dev/dsp1 (GUS GF1) for playback. - -GUS MAX uses the same I/O address and IRQ settings than the original GUS -(GUS MAX = GUS + a CS4231 codec). In addition an extra DMA channel may be used. -Using two DMA channels permits simultaneous playback using two devices -(dev/dsp0 and /dev/dsp1). The second DMA channel is required for -full duplex audio. -To enable the second DMA channels, give a valid DMA channel when the config -program asks for the GUS MAX DMA (entering -1 disables the second DMA). -Using 16 bit DMA channels (5,6 or 7) is recommended. - -If you have problems in recording with GUS MAX, you could try to use -just one 8 bit DMA channel. Recording will not work with one DMA -channel if it's a 16 bit one. - - - -MPU401 and Windows Sound System -------------------------------- - -Again. Don't enable these options in case your card is listed -somewhere else in this file. - -Configuring these cards is obvious (or it should be). With MSS -you should propably enable the OPL3 synth also since -most MSS compatible cards have it. However check that this is true -before enabling OPL3. - -VoxWare supports more than one MPU401 compatible cards at the same time -but the config program asks config info for just the first of them. -Adding the second or third MPU interfaces must be done manually by -editing sound/local.h (after running the config program). Add defines for -MPU2_BASE & MPU2_IRQ (and MPU3_BASE & MPU3_IRQ) to the file. - -CAUTION! - -The default I/O base of Adaptec AHA-1542 SCSI controller is 0x330 which -is also the default of the MPU401 driver. Don't configure the sound driver to -use 0x330 as the MPU401 base if you have a AHA1542. The kernel will not boot -if you make this mistake. - -PSS ---- - -Even the PSS cards are compatible with SB, MSS and MPU401, you must not -enable these options when configuring the driver. The configuration -program handles these options itself. (You may use the SB, MPU and MSS options -together with PSS if you have another card on the system). - -The PSS driver enables MSS and MPU401 modes of the card. SB is not enabled -since it doesn't work concurrently with MSS. The driver loads also a -DSP algorithm which is used to for the general MIDI emulation. The -algorithm file (.ld) is read by the config program and written to a -file included when the pss.c is compiled. For this reason the config -program asks if you want to download the file. Use the genmidi.ld file -distributed with the DOS/Windows drivers of the card (don't use the mt32.ld). -With some cards the file is called 'synth.ld'. You must have access to -the file when configuring the driver. The easiest way is to mount the DOS -partition containing the file with Linux. - -It's possible to load your own DSP algorithms and run them with the card. -Look at the directory sound/pss_test for more info (in the VoxWare-3.0.tar.gz) -package. - -AudioTriX Pro -------------- - -You have to enable the OPL3 and SB (not SB Pro or SB16) drivers in addition -to the native AudioTriX driver. Don't enable MSS or MPU drivers. - -Configuring ATP is little bit tricky since it uses so many I/O, IRQ and -DMA numbers. Using the same values than with DOS/Win is a good idea. Don't -attemp to use the same IRQ or DMA channels twice. - -The SB mode of ATP is implemented so the the ATP driver just enables SB -in the proper address. The SB driver handles the rest. Yoy have to configure -both the SB driver and the SB mode of ATP to use the same IRQ, DMA and I/O -settings. - -Also the ATP has a microcontroller for the General MIDI emulation (OPL4). -For this reason the driver asks for the name of a file containing the -microcode (TRXPRO.HEX). This file is usually located in the directory -where the DOS drivers were installed. You must have access to this file -when configuring the driver. - -If you have the effects daughtercard, it must be initialized by running -the setfx program of snd-util-3.0.tar.gz package. This step is not required -when using the (future) binary distribution version of the driver. - -Ensoniq SoundScape ------------------- - -The SoundScape driver handles initialization of MSS and MPU supports -itself so you don't need to enable other drivers than SoundScape -(enable also the /dev/dsp, /dev/sequencer and MIDI supports). - -SoundScape driver uses the MSS compatible codec of the card. It's important -to note that /dev/dsp0 (/dev/dsp is linked to /dev/dsp0 by default) -doesn't work with SoundScape (yet). The 'ssinit' program needs /dev/dsp0 so -that's the reason why it's there. It's possible that 'primary' pcm channel -becomes supported later. Currently the card's firmware doesn't contain -support for it. - -With 3.0 of VoxWare you have to change your system to use /dev/dsp1 by default -so execute: cd /dev;rm dsp;ln -s dsp1 dsp after you have installed VoxWare -3.0 (first time). - -The configuration program asks two DMA channels and two interrupts. One IRQ -and one DMA is used by the MSS codec. The second IRQ is required for the -MPU401 mode (you have to use different IRQs for both purposes). -The second DMA channel is required for initialization of the microcontroller. -You have to use separate DMA channels. - -The SoundScape card has a Motorola microcontroller which must initialized -_after_ boot (the driver doesn't initialize it during boot). -The initialization is done by running the 'ssinit' program which is -distributed in the snd-util-3.0.tar.gz package. You have to edit two -defines in the ssinit.c and then compile the program. You may run ssinit -manually (after each boot) or add it to /etc/rc.d/rc.local. - -The ssinit program needs the microcode file that comes with the DOS/Windows -driver of the card. You will need to use version 1.30.00 or later -of the microcode file (sndscape.co0 or sndscape.co1 depending on -your card model). THE OLD sndscape.cod WILL NOT WORK. IT WILL HANG YOUR -MACHINE. The only way to get the new microcode file is to download -and install the DOS/Windows driver from ftp://ftp.ensoniq.com/pub. - -Then you have to select the proper microcode file to use: soundscape.co0 -is the right one for most cards and sndscape.co1 is for few (older) cards -made by Reveal and/or Spea. The driver has capability to detect the card -version during boot. Look at the boot log messages in /var/adm/messages -and locate the sound driver initialization message for the SoundScape -card. If the driver displays string , you have -an old card and you will need to use sndscape.co1. For other cards use -soundscape.co0. - -Check /var/adm/messages after running ssinit. The driver prints -the board version after downloading the microcode file. That version -number must match the number in the name of the microcode file (extension). - -Running ssinit with a wrong version of the sndscape.co? file is not -dangerous as long as you don't try to use a file called sndscape.cod. -If you have initialized the card using a wrong microcode file (sounds -are terrible), just modify ssinit.c to use another microcode file and try -again. It's possible to use an earlier version of sndscape.co[01] but it -may sound wierd. - -Btw, The driver may complain something about "sscapeintr()" after -running ssinit. You should just ignore these messages. - -MAD16 (Pro) and Mozart ----------------------- - -You need to enable just the MAD16 /Mozart support when configuring -the driver. _Don't_ enable SB, MPU401 or MSS. However you will need the -/dev/audio, /dev/sequencer and MIDI supports. - -Mozart and OPTi 82C928 (the original MAD16) chips don't support -MPU401 mode so enter just 0 when the configuration program asks the -MPU/MIDI I/O base. The MAD16 Pro (OPTi 82C929) has MPU401 mode. - -TB Tropez is based on the 82C929 chip. It has two MIDI ports. -The one connected to the MAD16 chip is the second one (there is a second -MIDI connector/pins somewhere??). If you have not connected the second MIDI -port, just disable the MIDI port of MAD16. The 'Maui' compatible synth of -Tropez is jumper configurable and not connected to the MAD16 chip. -It can be used by enabling the stand alone MPU401 support but you have -to initialize it by using the MS-DOS SNDSETUP program. - -There are some other OPTi chips which may be used in soundcards such as -82C930 and MAC32. These chips are not supported by VoxWare yet. Please -contact me if you have a soundcard which uses these chips. - -Some MAD16 based cards may cause feedback, whistle or terrible noise if the -line3 mixer channel is turned too high. - -If you have a MAD16 card which have an OPL4 (FM + Wave table) synthesizer -chip (_not_ an OPL3), you have to apped line containing #define MAD16_OPL4 -to the file linux/dirvers/sound/local.h (after running make config). - -MV Jazz (ProSonic) ------------------- - -The Jazz16 driver is just a hack made to the SB Pro driver. However it works -fairly well. You have to enable SB, SB Pro (_not_ SB16) and MPU401 supports -when configuring the driver. The configuration program asks later if you -want support for MV Jazz16 based cards (after asking SB base address). Answer -'y' here and the driver asks the second (16 bit) DMA channel. - -The Jazz16 driver uses the MPU401 driver in a way which will cause -problems if you have another MPU401 compatible card. In this case you must -give address of the Jazz16 based MPU401 interface when the config -program prompts for the MPU401 information. Then look at the MPU401 -spesific section for instructions about configuring more than one MPU401 cards. - -Logitech Soundman Wave ----------------------- - -Read the above MV Jazz spesific instructions first. - -The Logitech SoundMan Wave (don't confuse with the SM16 or SM Games) is -a MV Jazz based card which has an additional OPL4 based wave table -synthesizer. The OPL4 chip is handled by an on board microcontroller -which must be initialized during boot. The config program asks if -you have a SM Wave immediately after asking the second DMA channel of jazz16. -If you answer 'y', the config program will ask name of the file containing -code to be loaded to the microcontroller. The file is usually called -MIDI0001.BIN and it's located in the DOS/Windows driver directory. The file -may also be called as TSUNAMI.BIN or something else (older cards?). - -The OPL4 synth will be inaccessible without loading the microcontroller code. -Also remember to enable MPU401 support if you want to use the OPL4 mode. - -NOTE! Don't answer 'y' when the driver asks about SM Games support - (the next question after the MIDI0001.BIN name). However - aneswering 'y' is not dangerous. - -Sound Galaxies --------------- - -There are many different Sound Galaxy cards made by Aztech. The 8 bit -ones are fully SB or SB Pro compatible and there should be no problems -with them. - -The older 16 bit cards (SG Pro16, SG NX Pro16, Nova and Lyra) have -an EEPROM chip for storing the configuration data. There is a microcontroller -which initializes the card to match the EEPROM settigs when the machine -is powered on. These cards actually behave just like they have jumpers -for all of the settings. Configure VoxWare for MSS, MPU, SB/SB Pro and OPL3 -supports with these cards. - -The config program asks if you want support for the mixer of -SG NX Pro. Answer 'y' to these questions if you have one of the above 8 or -16 bit Aztech cards. - -There are some new Sound Galaxies in the market. I have no experience with -them so read the card's manual carefully. - - -Reveal cards ------------- - -There are several different cards made/marketed by Reveal. Some of them -are compatible with SoundScape and some use the MAD16 chip. You may have -to look at the card and try to identify origin of the card. - -Diamond -------- - -The oldest (Sierra Aria based) soundcards made by Diamond are not supported -(they may work if the card is initialized using DOS). The recent (LX?) -models are based on the MAD16 chip which is supported by VoxWare. - -Audio Excel DSP16 ------------------ - -See comments in aedsp16.c. - - -PCMCIA cards ------------- - -Sorry, can't help. Some cards may work and some don't. - -TI TM4000M notebooks --------------------- - -These computers have a built in sound support based on the Jazz chipset. -Look at the instructions for MV Jazz (above). It's also important to note -that there is something wrong with the mouse port and sound at least on -some TM models. Don't enable the "C&T 82C710 mouse port support" when -configuring Linux. Having it enabled is likely to cause mysterious problems -and kernel failures when sound is used. - -Others? -------- - -Since there are so many different soundcards, it's likely that I have -forgotten to mention many of them. Please inform me if you know yet another -card which works with Linux, please inform me (or is anybody else -willing to maintain a database of supported cards (just like in XF86)?). - -Cards not supported yet -======================= - -First of all. There is an easy way to make most soundcards to work -with Linux. Just use the DOS based driver to initialize the card -to a _known_ state. Then ctrl-alt-del to Linux. If Linux is configured -to use the sama I/O, IRQ and DMA numbers than DOS, the card could work. - -Don't get fooled with SB compatibility. Most cards are compatible with -SB but that may require a TSR which is not possible with Linux. If -the card is compatible with MSS, it's a better choise. Some cards -don't work in the SB and MSS modes at the same time. - -There are some cards which will be supported by VoxWare sooner or later -(currently at least cards based on the ESS chipset). Such cards are -so common that there is some idea in writing the driver. Check the -VoxWare home page (http://personal.eunet.fi/pp/voxware) for latest -information. - -Then there are cards which are no longer manufactured and/or which -are relatively rarely used (such as the 8 bit ProAudioSpectrum -models). It's extremely unlikely that such cards never get supported. -Adding support for a new card requires much work and increases time -required in maintaining the driver (some changes need to be done -to all low level drivers and be tested too, maybe with multiple -operating systems). For this reason I have made a desicion to not support -obsolete cards. It's possible that someone else makes a separately -distributed driver (diffs) for the card. Version v4.0 will be much more -modular so making separately distributed drivers will be easier with it. -(The bad news is that v4.0 will not be available before late -96). - -Writing a driver for a new card is not possible if there are no -programming information available about the card. If you don't -find your new card from this file, look from the home page -(http://personal.eunet.fi/pp/voxware). Then please contact -manufacturer of the card and ask if they have (or are willing to) -released technical details of the card. Do this before contacting me. I -can only answer 'no' if there are no programming information available. - -Some companies don't give low level technical information about their -products to public or at least their require signing a NDA. - -I have also made decicion to not accept code based on reverse engineering -to VoxWare. There are three main reasons: First I don't want to break -relationships to sound card manufacturers. The second reason is that -maintaining and supporting a driver withoun any specs will be a pain. The -third reason is that why shoud we help such companies in selling their -products to Linux users when they don't want to sell to Linux users -at all? - -Unfortunately many of the leading soundcard manufacturers are not willing -to co-operate with Linux/Unix community. For example: Creative Technology -doesn't give information about the ASP chip and the Emu synth chip of AWE32 -and SB32. Turtle Beach don't give information about any of their -products. MediaVision requires NDA before they are willing to -give information about the Jazz16 chip (fortunately Logitech gave -the info about SM Wave). - -So at least the above three companies are out until they are willing to -release documentation about their products (the situation is the -same with many DOS based freeware/shareware games and utilities). If -you want to use Linux/Unix with their cards, please don't try to push -me. It's a better idea to contact the manufacturer and explain that -you want to use your card with Linux/Unix. You could also try to sell -your card to somebody else and then buy a card that is supported by VoxWare. - -However it's possible that things change and a driver gets written -for some of the banned cards. Please, don't send me messages asking if -there is any plans to write a driver for the cards mentioned above. I -will put any news to the VoxWare www home page (see below). - -There are some common audio chipsets that are supported yet. For example -the ESS chips and Sierra Aria. It's likely that these architectures -get some support in future but I can't make any promises. Just look -at the home page for latest info. - -Information about unsupported soundcards and chipsets is welcome as well -as free copies of soundcards, SDKs and operating systems. - -If you have any corrections and/or comments, please contact me. - -Hannu Savolainen -hannu@voxware.pp.fi -VoxWare www home page: http://personal.eunet.fi/pp/voxware - diff --git a/sys/i386/isa/sound/Readme.modules b/sys/i386/isa/sound/Readme.modules deleted file mode 100644 index 2dab125..0000000 --- a/sys/i386/isa/sound/Readme.modules +++ /dev/null @@ -1,99 +0,0 @@ -Building a loadable sound driver -================================ - -Loadable module support in version 3.5 of VoxWare is mostly rewritten since -the previous version (3.0.1). This means that some things have changed. - -To compile the sound driver as a loadable module you have to perform -the following steps: - -1) Install modules-1.2.8.tar.gz package (or later if available). -2a) Check that symbol remap_page_range is defined in linux/init/ksyms.c. -Insert a line containing "X(remap_page_range)," if required. The driver will -not load if this line is missing. -2b) Recompile kernel with soundcard support disabled. -3) Boot the new kernel. -4) cd to the sound driver source directory (this directory). It's no -longer required that the sound driver sources are installed in the -kernel source tree (linux/drivers/sound). When installing a separately -distributed sound driver you may install the sources for example to -/usr/src/sound. -5) Execute make in the sound driver source directory. Enter -configuration parameters as described in Readme.cards. Then just wait until -the driver is compiled OK. -6) Copy sound.o to the directory where insmod expects to find it. -("make install" copies it to /lib/modules/misc). -7) Use command "insmod sound" to load the driver. - -8) The sound driver can be removed using command "rmmod sound". - - -Parameters accepted by the loadable sound driver -================================================ - -Setting DMA buffer size ------------------------ - -The driver allocates a DMA buffer (or two for full duplex devices) -every time the audio device (/dev/dsp or /dev/audio) is opened -and frees it when the device is closed. Size of this buffer is defined -when the driver is configured (the last question). The buffer size -can be redefined when loading the driver if required (note that this is -an optional feature which is not normally required). The buffer size -is redefined by adding dma_pagesize= parameter to the insmod command line. -For example: - - insmod sound dma_buffsize=32768 - -Minimum buffer size is 4096 and the maximum depends on the DMA channe. -For 8 bit channels (0 to 3) the limit is 64k and for 16 bit ones (5 to 7) -it's 128k. Driver selects a suitable buffer size automaticly in case -you try to spesify an invalid size. - -Q: What is the right DMA buffer size? - -A: It depends on the sampling rate, machine speed and the load of the system. -Large buffers are required on slow machines, when recording/playing CD-quality -audio or when there are other processes running on the same system. Also -recording to hard disk is likely to require large buffers. - -Very small buffers are sufficient when you are just playing 8kHz audio files -on an empty P133 system. Using a 128k byffer just wastes 120k (or 250k) -of valuable physical RAM memory. - -The right buffer sice can be easily found by making some experiments -with the dma_buffsize= parameter. I use usually 16k buffers on a DX4/100 system -and 64k on an old 386 system. - -NOTE! DMA buffers are used only by /dev/audio# and /dev/dsp# devices. - Other device files don't use them but there are two exceptions: - GUS driver uses DMA buffers when loading samples to the card. - Ensoniq SoundScape driver uses them when doanloading the microcode - file (sndscape.co[012]) to the card. Using large buffers doesn't - increase performance in these cases. - -Configuring device parameters when loading the driver ------------------------------------------------------ - -The loadable version of the sound driver accepts now the same -sound= parameter that has been available in the LILO command line. -In this way it's possible to change I/O port, IRQ and DMA addresses -and to enable/disable various cards at load time. Normally -the driver uses the configuration parameters entered when compiling -and configuring the driver. -Look at Readme.linux for more info. - -NOTE! This method is not normally required. You should use it only when - you have to use different configuration than normally. The sound= - command line parameter is error phrone and not recommended. - -Debugging and tracing ---------------------- - -Modularized sound driver doesn't display messages during initialization as -the kernel compiled one does. This feature can be turned on by adding -init_trace=1 to the insmod command line. - -For example: - - insmod sound init_trace=1 diff --git a/sys/i386/isa/sound/Readme.v30 b/sys/i386/isa/sound/Readme.v30 deleted file mode 100644 index 2d358ca..0000000 --- a/sys/i386/isa/sound/Readme.v30 +++ /dev/null @@ -1,140 +0,0 @@ -VoxWare v3.0 ------------- - -All features of v2.90-2 should work as earlier. There could be some -omissions but they are unintentional. I started this version thread -after v2.3 so all features implemented before it are there. - -New features -============ - -There are now two new device interfaces. The /dev/midi## is a raw -tty like interface to MIDI ports. There is a device file for each MIDI -port on your system. They are named (/dev/midi00 to /dev/midiNN). -The second addition is the /dev/music which is higher level interface -than the old /dev/sequencer. It's intended for writing device independent -applications like sequencers. - -/dev/midi## ------------ - -This interface should be usefull for applications like MIDI sysex librarians. -There are (currently) no timing features so making music could be impossible. - -There are as many /dev/midi## devices as there are MIDI ports in the system. -The /dev/midi00 is connected to the first one, /dev/midi01 to the second etc. - -These devices work like tty devices in raw mode. Everything written to them is -sent out to the MIDI port. There is currently an extra delay of at most -1/100th of sec but it will be removed later. - -The reading algorithm is little bit more complicated. There are two different -cases: - -1) There is at least one byte in the input buffer. - -The read returns as many bytes as it can without waiting for more bytes. -For example when a process reads 100 bytes and there are 10 bytes in the -buffer, the read returns just 10 bytes. - -2) The input buffer is empty when the process calls read. - -The read waits for the first byte and then continues as in case 1. By -default it waits infinitely but there is an ioctl for setting a timeout -for this. The ioctl(fd, SNDCTL_MIDI_PRETIME, &time) changes the timeout. -The time is given in 1/10th of seconds (10 means one second). - -Other ioctl calls: - -ioctl(fd, SNDCTL_MIDI_MPUMODE, &mode) is available for full MPU-401 -compatible devices such as MPU-IPC-T, MQ PC Midi Card or MQX-32. -It's not available for the so called MPU UART ports of some soundcards -(PAS16, SB16 etc). By default the MIDI port is in UART mode after open. -If this ioctl is called with mode=1, the interface is put to the intelligent -(coprocessor) mode. NOTE! The MIDI port will be reset when this ioctl is called. -It could have some strange effects if not called immediately after open. This -vall returns EINVAL if the midi port doesn't support the MPU-401 intelligent -mode. - -ioctl(fd, SNDCTL_MIDI_MPUCMD, &cmdstruct) is valid only if the MIDI port -is put to the coprocessor mode using ioctl(SNDCTL_MIDI_MPUMODE). It's used to -send commands to a MPU-401 compatible MIDI cards. Please refer to the -MPU-401 Technical Reference Manual (or Music Quest Technical Reference -Manual) for descriptions of the commands. - -The argument of SNDCTL_MIDI_MPUCOMMAND is of type mpu_command_rec. It -has the following fields: - -typedef struct { - unsigned char cmd; - - char nr_args, nr_returns; - unsigned char data[30]; - } mpu_command_rec; - -where: - cmd Contains the command number. - nr_args Number of arguments of the command. - MUST BE INITIALIZED BEFORE CALL - nr_returns Number of bytes returned by the command. - MUST BE INITIALIZED BEFORE CALL - data Buffer for the command arguments and returned - data. - -Be extremely carefull with the nr_args and nr_returns fields. They -must match the command. An incorrect value will put the card and -the driver out of sync. Refer to the MPU-401/MQX-32M documentation for further -datails. - - - -/dev/music (/dev/sequencer2) ----------------------------- - -This device file works much like the /dev/sequencer which has been present -since the beginning. The main differences are the following: - -- /dev/sequencer makes the MIDI ports to look like the synth devices. In fact -the result is somewhere between the MIDI specification and the synth devices of -/dev/sequencer. Both kind of devices are accessed using the SEQ_START_NOTE() -like macros. The voice number parameters of the API macros have been redefined -to denote MIDI channels. This means that the driver allocates voices for -the channels automaticly (this is a responsibility/right of an application -with /dev/sequencer). The result is that a SEQ_START_NOTE() macro has -similar effects for a synth channel than on a MIDI port. This kind of -solution provides better device independence than the /dev/sequencer. The -drawback is that the new interface doesn't permit so low level access to the -device as the /dev/sequencer does. An application developer must choose between -these two interfaces. I think the old /dev/sequencer is better for applications -like module players while the new one is better for making generic sequencer -programs. - -- There are no separate MIDI devices with the /dev/sequencer2. The -ioctl(SNDCTL_SEQ_NRMIDIS) returns always zero. Instead the MIDI ports are -shown as synth devices. ioctl(SNDCTL_SEQ_NRSYNTHS) on /dev/sequencer2 will -return sum of internal synthesizers (GUS, OPL3) and MIDI ports in the systems. - -- The new interface is used much like the ordinary /dev/sequencer. The -event format is new so you have to use the API macros defined in the -sys/soundcard.h. The interface is will propably change before the final 3.0 -release but using the API macros should ensure compatibility in source level. -The new event format is not recognized by version 2.X so don't try to -distribute binaries compiled with soundcard.h of v3.X. - -- The basic API useage is similar to the current one. There are some new -macros but the older ones should work as earlier. The most important -incompatibility is that the /dev/sequencer2 driver allocates voices itself. -The other one is that the application must send SEQ_START_TIMER() as its -first event. Otherwise the timer is not started and the application waits -infinitely. - - -There are several new features but I don't document them here. There are -some info in the soundcard.h (near the end). I have also included some -sample code in the directory v30. Full documentation will -appear in the Hacker's Guide later. - -Don't hesitate to contact me in case you have questions or comments. - -Hannu Savolainen -hannu@voxware.pp.fi diff --git a/sys/i386/isa/sound/ad1848.c b/sys/i386/isa/sound/ad1848.c deleted file mode 100644 index b75b302..0000000 --- a/sys/i386/isa/sound/ad1848.c +++ /dev/null @@ -1,1867 +0,0 @@ -/* - * sound/ad1848.c - * - * Modified by Luigi Rizzo (luigi@iet.unipi.it) - * - * The low level driver for the AD1848/CS4248 codec chip which is used for - * example in the MS Sound System. - * - * The CS4231 which is used in the GUS MAX and some other cards is upwards - * compatible with AD1848 and this driver is able to drive it. - * - * CS4231A and AD1845 are upward compatible with CS4231. However the new - * features of these chips are different. - * - * CS4232 is a PnP audio chip which contains a CS4231A (and SB, MPU). CS4232A is - * an improved version of CS4232. - * - * CS4236 is also a PnP audio chip similar to the 4232 - * - * OPTi931 is another high-end 1848-type chip. It differs in the use - * of the high 16 registers and configuration stuff. Luckily, being a - * PnP device, we can avoid black magic to identify the chip and be - * sure of its identity. - * - * Copyright by Hannu Savolainen 1994, 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. - * - * Modified: Riccardo Facchetti 24 Mar 1995 - Added the Audio Excel DSP 16 - * initialization routine. - * - * $FreeBSD$ - */ - -#define DEB(x) -#define DEB1(x) -#include - -#if defined(CONFIG_AD1848) - -#include -#include - -#if defined(CONFIG_CS4232) -extern struct isa_driver cssdriver; -#else -extern struct isa_driver mssdriver; -#endif - -extern void IwaveStopDma(BYTE path); - -typedef struct { - int base; - int irq; - int dual_dma; /* 1, when two DMA channels allocated */ - u_char MCE_bit; - u_char saved_regs[16]; - - int speed; - u_char speed_bits; - int channels; - int audio_format; - u_char format_bits; - - u_long xfer_count; - int irq_mode; - int intr_active; - int opened; - char *chip_name; - int mode; -#define MD_1848 1 -#define MD_4231 2 -#define MD_4231A 3 -#define MD_4236 4 -#define MD_1845 5 -#define MD_MAXMODE 6 - - /* Mixer parameters */ - int recmask; - int supported_devices; - int supported_rec_devices; - u_short levels[32]; - int dev_no; - volatile u_long timer_ticks; - int timer_running; - int irq_ok; - sound_os_info *osp; -} ad1848_info; - -static int nr_ad1848_devs = 0; -static volatile char irq2dev[17] = - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; - -static int timer_installed = -1; -static int mute_flag = 0; -static char mixer2codec[MAX_MIXER_DEV] = {0}; - -static int ad_format_mask[MD_MAXMODE /* devc->mode */ ] = -{ - /* 0 - none */ 0, - /* 1 - AD1848 */ AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW, - - /* - * AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW | AFMT_U16_LE | - * AFMT_IMA_ADPCM, - */ - - /* 2 - CS4231 */ AFMT_U8 | AFMT_S16_LE | AFMT_U16_LE, - - /* - * AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW | AFMT_U16_LE | - * AFMT_IMA_ADPCM, - */ - - /* 3 - CS4231A */ AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW, - /* 4 - AD1845 */ AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW, - /* 5 - CS4236 */ AFMT_U8 | AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW, -}; - -static ad1848_info dev_info[MAX_AUDIO_DEV]; - -#define io_Index_Addr(d) ((d)->base) -#define io_Indexed_Data(d) ((d)->base+1) -#define io_Status(d) ((d)->base+2) -#define io_Polled_IO(d) ((d)->base+3) - -static int ad1848_open(int dev, int mode); -static void ad1848_close(int dev); -static int ad1848_ioctl(int dev, u_int cmd, ioctl_arg arg, int local); -static void ad1848_output_block(int dev, u_long buf, int count, int intrflag, int dma_restart); -static void ad1848_start_input(int dev, u_long buf, int count, int intrflag, int dma_restart); -static int ad1848_prepare_for_IO(int dev, int bsize, int bcount); -static void ad1848_reset(int dev); -static void ad1848_halt(int dev); -static void ad1848_halt_input(int dev); -static void ad1848_halt_output(int dev); -static void ad1848_trigger(int dev, int bits); -static int ad1848_tmr_install(int dev); -static void ad1848_tmr_reprogram(int dev); - -/* - * AD_WAIT_INIT waits if we are initializing the board and we cannot modify - * its settings - */ -#define AD_WAIT_INIT(x) {int t=x; while(t>0 && inb(devc->base) == 0x80) t-- ; } - -short ipri_to_irq(u_short ipri); - -void -adintr(unit) -{ -#if 1 - /* this isn't ideal but should work */ - ad1848_interrupt(-1); -#else - static short unit_to_irq[4] = {9, -1, -1, -1}; - struct isa_device *dev; - - if (unit_to_irq[unit] > 0) - ad1848_interrupt(unit_to_irq[unit]); - else { -#if defined(CONFIG_CS4232) - dev = find_isadev(isa_devtab_null, &cssdriver, unit); -#else - dev = find_isadev(isa_devtab_null, &mssdriver, unit); -#endif - if (!dev) - printf("ad1848: Couldn't determine unit\n"); - else { - unit_to_irq[unit] = ipri_to_irq(dev->id_irq); - ad1848_interrupt(unit_to_irq[unit]); - } - } -#endif -} - -static int -ad_read(ad1848_info * devc, int reg) -{ - u_long flags; - int x; - - AD_WAIT_INIT(900000); - flags = splhigh(); - outb(io_Index_Addr(devc), (u_char) (reg & 0xff) | devc->MCE_bit); - x = inb(io_Indexed_Data(devc)); - splx(flags); - - return x; -} - -static void -ad_write(ad1848_info * devc, int reg, u_char data) -{ - u_long flags; - - AD_WAIT_INIT(90000); - - flags = splhigh(); - outb(io_Index_Addr(devc), (u_char) (reg & 0xff) | devc->MCE_bit); - outb(io_Indexed_Data(devc), (u_char) (data & 0xff)); - splx(flags); -} - -static void -wait_for_calibration(ad1848_info * devc) -{ - int timeout = 0; - - /* - * Wait until the auto calibration process has finished. - * - * 1) Wait until the chip becomes ready (reads don't return 0x80). - * 2) Wait until the ACI bit of I11 gets on and then off. - */ - - AD_WAIT_INIT(100000); - if (inb(devc->base) & 0x80) - printf("ad1848: Auto calibration timed out(1).\n"); - - timeout = 100; - while (timeout > 0 && !(ad_read(devc, 11) & 0x20)) - timeout--; - if (!(ad_read(devc, 11) & 0x20)) - return; - - timeout = 20000; - while (timeout > 0 && ad_read(devc, 11) & 0x20) - timeout--; - if (ad_read(devc, 11) & 0x20) - printf("ad1848: Auto calibration timed out(3).\n"); -} - -static void -ad_mute(ad1848_info * devc) -{ - int i; - u_char prev; - - mute_flag = 1; - - /* - * Save old register settings and mute output channels - */ - for (i = 6; i < 8; i++) { - prev = devc->saved_regs[i] = ad_read(devc, i); - ad_write(devc, i, prev | 0x80); - } -} - -static void -ad_unmute(ad1848_info * devc) -{ - int i; - - mute_flag = 0; - /* - * Restore back old volume registers (unmute) - */ - for (i = 6; i < 8; i++) - ad_write(devc, i, devc->saved_regs[i] & ~0x80); - } - -static void -ad_enter_MCE(ad1848_info * devc) -{ - u_long flags; - - AD_WAIT_INIT(1000); - devc->MCE_bit = 0x40; - flags = splhigh(); - if ( ( inb(io_Index_Addr(devc)) & 0x40) == 0 ) - outb(io_Index_Addr(devc), devc->MCE_bit); - splx(flags); -} - -static void -ad_leave_MCE(ad1848_info * devc) -{ - u_long flags; - u_char prev; - - AD_WAIT_INIT(1000); - - flags = splhigh(); - - devc->MCE_bit = 0x00; - prev = inb(io_Index_Addr(devc)); - /* XXX the next call is redundant ? */ - outb(io_Index_Addr(devc), 0x00); /* Clear the MCE bit */ - - if ((prev & 0x40) == 0) { /* Not in MCE mode */ - splx(flags); - return; - } - outb(io_Index_Addr(devc), 0x00); /* Clear the MCE bit */ - wait_for_calibration(devc); - splx(flags); -} - - -static int -ad1848_set_recmask(ad1848_info * devc, int mask) -{ - u_char recdev; - int i, n; - - mask &= devc->supported_rec_devices; - - n = 0; - for (i = 0; i < 32; i++)/* Count selected device bits */ - if (mask & (1 << i)) - n++; - - if (n == 0) - mask = SOUND_MASK_MIC; - else if (n != 1) { /* Too many devices selected */ - mask &= ~devc->recmask; /* Filter out active settings */ - - n = 0; - for (i = 0; i < 32; i++) /* Count selected device bits */ - if (mask & (1 << i)) - n++; - - if (n != 1) - mask = SOUND_MASK_MIC; - } - switch (mask) { - case SOUND_MASK_MIC: - recdev = 2; - break; - - case SOUND_MASK_LINE: - case SOUND_MASK_LINE3: - recdev = 0; - break; - - case SOUND_MASK_CD: - case SOUND_MASK_LINE1: - recdev = 1; - break; - - case SOUND_MASK_IMIX: - recdev = 3; - break; - - default: - mask = SOUND_MASK_MIC; - recdev = 2; - } - - recdev <<= 6; - ad_write(devc, 0, (ad_read(devc, 0) & 0x3f) | recdev); - ad_write(devc, 1, (ad_read(devc, 1) & 0x3f) | recdev); - - devc->recmask = mask; - return mask; -} - -static void -change_bits(u_char *regval, int dev, int chn, int newval) -{ - u_char mask; - int shift; - - if (mix_devices[dev][chn].polarity == 1) /* Reverse */ - newval = 100 - newval; - - mask = (1 << mix_devices[dev][chn].nbits) - 1; - shift = mix_devices[dev][chn].bitpos; - newval = (int) ((newval * mask) + 50) / 100; /* Scale it */ - - *regval &= ~(mask << shift); /* Clear bits */ - *regval |= (newval & mask) << shift; /* Set new value */ -} - -static int -ad1848_mixer_get(ad1848_info * devc, int dev) -{ - if (!((1 << dev) & devc->supported_devices)) - return -(EINVAL); - - return devc->levels[dev]; -} - -#define CLMICI 0x00781601 -#define CRMICI 0x00791701 - -static int -ad1848_mixer_set(ad1848_info * devc, int dev, int value) -{ - int left = value & 0x000000ff; - int right = (value & 0x0000ff00) >> 8; - int retvol; - - int regoffs; - u_char val; - /* u_char clci, crmici, clmici, clici, crici; */ - - if (left > 100) - left = 100; - if (right > 100) - right = 100; - - if (mix_devices[dev][RIGHT_CHN].nbits == 0) /* Mono control */ - right = left; - - retvol = left | (right << 8); - - /* Scale volumes */ - left = mix_cvt[left]; - right = mix_cvt[right]; - - /* Scale it again */ - left = mix_cvt[left]; - right = mix_cvt[right]; - - if (dev > 31) - return -(EINVAL); - - if (!(devc->supported_devices & (1 << dev))) - return -(EINVAL); - - if (mix_devices[dev][LEFT_CHN].nbits == 0) - return -(EINVAL); - - devc->levels[dev] = retvol; - - /* - * Set the left channel - */ - /* IwaveCodecMode(CODEC_MODE3); Default codec mode */ - - regoffs = mix_devices[dev][LEFT_CHN].regno; - val = ad_read(devc, regoffs); - - change_bits(&val, dev, LEFT_CHN, left); - ad_write(devc, regoffs, val); - devc->saved_regs[regoffs] = val; - - /* - * Set the right channel - */ - - if (mix_devices[dev][RIGHT_CHN].nbits == 0) - return retvol; /* Was just a mono channel */ - - regoffs = mix_devices[dev][RIGHT_CHN].regno; - val = ad_read(devc, regoffs); - change_bits(&val, dev, RIGHT_CHN, right); - ad_write(devc, regoffs, val); - devc->saved_regs[regoffs] = val; - - return retvol; -} - -static void -ad1848_mixer_reset(ad1848_info * devc) -{ - int i; - - devc->recmask = 0; - if (devc->mode != MD_1848) - devc->supported_devices = MODE2_MIXER_DEVICES; - else - devc->supported_devices = MODE1_MIXER_DEVICES; - - devc->supported_rec_devices = MODE1_REC_DEVICES; - - for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) - if (devc->supported_devices & (1 << i)) - ad1848_mixer_set(devc, i, default_mixer_levels[i]); - ad1848_set_recmask(devc, SOUND_MASK_MIC); -} - -static int -ad1848_mixer_ioctl(int dev, u_int cmd, ioctl_arg arg) -{ - ad1848_info *devc; - int codec_dev = mixer2codec[dev]; - - if (!codec_dev) - return -(ENXIO); - - codec_dev--; - - devc = (ad1848_info *) audio_devs[codec_dev]->devc; - - if (((cmd >> 8) & 0xff) == 'M') { - if (cmd & IOC_IN) - switch (cmd & 0xff) { - case SOUND_MIXER_RECSRC: - return *(int *) arg = ad1848_set_recmask(devc, (*(int *) arg)); - break; - - default: - return *(int *) arg = ad1848_mixer_set(devc, cmd & 0xff, (*(int *) arg)); - } - else - switch (cmd & 0xff) { /* Return parameters */ - - case SOUND_MIXER_RECSRC: - return *(int *) arg = devc->recmask; - break; - - case SOUND_MIXER_DEVMASK: - return *(int *) arg = devc->supported_devices; - break; - - case SOUND_MIXER_STEREODEVS: - return *(int *) arg = devc->supported_devices & ~(SOUND_MASK_SPEAKER | SOUND_MASK_IMIX); - break; - - case SOUND_MIXER_RECMASK: - return *(int *) arg = devc->supported_rec_devices; - break; - - case SOUND_MIXER_CAPS: - return *(int *) arg = SOUND_CAP_EXCL_INPUT; - break; - - default: - return *(int *) arg = ad1848_mixer_get(devc, cmd & 0xff); - } - } else - return -(EINVAL); -} - -static struct audio_operations ad1848_pcm_operations[MAX_AUDIO_DEV] = -{ - { - "Generic AD1848 codec", - /* DMA_AUTOMODE | DMA_DUPLEX, */ - DMA_AUTOMODE, - AFMT_U8, /* Will be set later */ - NULL, - ad1848_open, - ad1848_close, - ad1848_output_block, - ad1848_start_input, - ad1848_ioctl, - ad1848_prepare_for_IO, - ad1848_prepare_for_IO, - ad1848_reset, - ad1848_halt, - NULL, - NULL, - ad1848_halt_input, - ad1848_halt_output, - ad1848_trigger - } -}; - -static struct mixer_operations ad1848_mixer_operations = -{ - "AD1848/CS4248/CS4231/CS4236", - ad1848_mixer_ioctl -}; - -static int -ad1848_open(int dev, int mode) -{ - ad1848_info *devc = NULL; - u_long flags; - int otherside = audio_devs[dev]->otherside; - - if (dev < 0 || dev >= num_audiodevs) - return -(ENXIO); - - if (otherside != -1) { - if (audio_devs[otherside]->busy) - return -(EBUSY); - } - if (audio_devs[dev]->busy) - return -(EBUSY); - - devc = (ad1848_info *) audio_devs[dev]->devc; - - flags = splhigh(); - if (audio_devs[dev]->busy) { - splx(flags); - return -(EBUSY); - } - devc->dual_dma = 0; - - if (audio_devs[dev]->flags & DMA_DUPLEX) { - devc->dual_dma = 1; - } - devc->intr_active = 0; - audio_devs[dev]->busy = 1; - devc->irq_mode = 0; - ad1848_trigger(dev, 0); - splx(flags); - /* - * Mute output until the playback really starts. This decreases - * clicking. - */ - ad_mute(devc); - - return 0; -} - -static void -ad1848_close(int dev) -{ - u_long flags; - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - int otherside = audio_devs[dev]->otherside; - - if (otherside != -1) { - if (audio_devs[otherside]->busy) - return; - } - DEB(printf("ad1848_close(void)\n")); - - flags = splhigh(); - - ad_mute(devc); - - ad_write(devc, 9, ad_read(devc, 9) & ~0x1); - outb(io_Status(devc), 0); /* Clear interrupt status */ - /* - * ad_write (devc, 15,0); ad_write (devc, 14,0); - */ - devc->irq_mode &= ~PCM_ENABLE_OUTPUT; - - devc->intr_active = 0; - ad1848_reset(dev); - - devc->opened = 0; - devc->irq_mode = 0; - audio_devs[dev]->busy = 0; - ad_unmute(devc); - splx(flags); -} - -static int -set_speed(ad1848_info * devc, int arg) -{ - /* - * The sampling speed is encoded in the least significant nible of - * I8. The LSB selects the clock source (0=24.576 MHz, 1=16.9344 Mhz) - * and other three bits select the divisor (indirectly): - * - * The available speeds are in the following table. Keep the speeds in - * the increasing order. - */ - typedef struct { - int speed; - u_char bits; - } speed_struct; - - static speed_struct speed_table[] = { - {5510, (0 << 1) | 1}, - {5510, (0 << 1) | 1}, - {6620, (7 << 1) | 1}, - {8000, (0 << 1) | 0}, - {9600, (7 << 1) | 0}, - {11025, (1 << 1) | 1}, - {16000, (1 << 1) | 0}, - {18900, (2 << 1) | 1}, - {22050, (3 << 1) | 1}, - {27420, (2 << 1) | 0}, - {32000, (3 << 1) | 0}, - {33075, (6 << 1) | 1}, - {37800, (4 << 1) | 1}, - {44100, (5 << 1) | 1}, - {48000, (6 << 1) | 0} - }; - - int i, n, selected = -1; - - n = sizeof(speed_table) / sizeof(speed_struct); - - if (devc->mode == MD_1845) { /* AD1845 has different timer than others */ - RANGE (arg, 4000, 50000) ; - - devc->speed = arg; - devc->speed_bits = speed_table[selected].bits; - return devc->speed; - } - if (arg < speed_table[0].speed) - selected = 0; - if (arg > speed_table[n - 1].speed) - selected = n - 1; - - for (i = 1 /* really */ ; selected == -1 && i < n; i++) - if (speed_table[i].speed == arg) - selected = i; - else if (speed_table[i].speed > arg) { - int diff1, diff2; - - diff1 = arg - speed_table[i - 1].speed; - diff2 = speed_table[i].speed - arg; - - if (diff1 < diff2) - selected = i - 1; - else - selected = i; - } - if (selected == -1) { - printf("ad1848: Can't find speed???\n"); - selected = 3; - } - devc->speed = speed_table[selected].speed; - devc->speed_bits = speed_table[selected].bits; - return devc->speed; -} - -static int -set_channels(ad1848_info * devc, int arg) -{ - if (arg != 1 && arg != 2) - return devc->channels; - - devc->channels = arg; - return arg; -} - -static int -set_format(ad1848_info * devc, int arg) -{ - static struct format_tbl { - int format; - u_char bits; - } format2bits[] = { - { 0, 0 } , - { AFMT_MU_LAW, 1 } , - { AFMT_A_LAW, 3 } , - { AFMT_IMA_ADPCM, 5 } , - { AFMT_U8, 0 } , - { AFMT_S16_LE, 2 } , - { AFMT_S16_BE, 6 } , - { AFMT_S8, 0 } , - { AFMT_U16_LE, 0 } , - { AFMT_U16_BE, 0 } - }; - int i, n = sizeof(format2bits) / sizeof(struct format_tbl); - - - if (!(arg & ad_format_mask[devc->mode])) - arg = AFMT_U8; - - devc->audio_format = arg; - - for (i = 0; i < n; i++) - if (format2bits[i].format == arg) { - if ((devc->format_bits = format2bits[i].bits) == 0) - return devc->audio_format = AFMT_U8; /* Was not supported */ - return arg; - } - /* Still hanging here. Something must be terribly wrong */ - devc->format_bits = 0; - return devc->audio_format = AFMT_U8; -} - -/* XXX check what is arg, (int) or *(int *) lr970705 */ -static int -ad1848_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) -{ - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - - switch (cmd) { - case SOUND_PCM_WRITE_RATE: - if (local) - return set_speed(devc, (int) arg); - return *(int *) arg = set_speed(devc, (*(int *) arg)); - - case SOUND_PCM_READ_RATE: - if (local) - return devc->speed; - return *(int *) arg = devc->speed; - - case SNDCTL_DSP_STEREO: - 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, (int) arg); - return *(int *) arg = set_channels(devc, (*(int *) arg)); - - case SOUND_PCM_READ_CHANNELS: - if (local) - return devc->channels; - return *(int *) arg = devc->channels; - - case SNDCTL_DSP_SAMPLESIZE: - if (local) - return set_format(devc, (int) arg); - return *(int *) arg = set_format(devc, (*(int *) arg)); - - case SOUND_PCM_READ_BITS: - if (local) - return devc->audio_format; - return *(int *) arg = devc->audio_format; - - - case FIOASYNC: - if (local) - return 1; - return *(int *) arg = 1; - - case FIONBIO: - if (local) - return 1; - return *(int *) arg = 1; - - - default:; - } - return -(EINVAL); -} - -static void -ad1848_output_block(int dev, u_long buf, int count, int intrflag, int dma_restart) -{ - u_long flags, cnt; - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - - cnt = count; - if (devc->audio_format == AFMT_IMA_ADPCM) { - cnt /= 4; - } else { - if (devc->audio_format & (AFMT_S16_LE | AFMT_S16_BE)) /* 16 bit data */ - cnt >>= 1; - } - if (devc->channels > 1) - cnt >>= 1; - cnt--; - if (mute_flag) - ad_unmute(devc); - - if ( devc->irq_mode & PCM_ENABLE_OUTPUT && - audio_devs[dev]->flags & DMA_AUTOMODE && intrflag && - cnt == devc->xfer_count) { - devc->irq_mode |= PCM_ENABLE_OUTPUT; - devc->intr_active = 1; - - } - flags = splhigh(); - - if (dma_restart) { - - DMAbuf_start_dma(dev, buf, count, 1); - } - ad_write(devc, 15, (u_char) (cnt & 0xff)); - ad_write(devc, 14, (u_char) ((cnt >> 8) & 0xff)); - - devc->xfer_count = cnt; - devc->irq_mode |= PCM_ENABLE_OUTPUT; - devc->intr_active = 1; - splx(flags); -} - -static void -ad1848_start_input(int dev, u_long buf, int count, - int intrflag, int dma_restart) -{ - u_long flags, cnt; - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - - cnt = count; - if (devc->audio_format == AFMT_IMA_ADPCM) - cnt /= 4; - else if (devc->audio_format & (AFMT_S16_LE | AFMT_S16_BE)) /* 16 bit data */ - cnt >>= 1; - if (devc->channels > 1) - cnt >>= 1; - cnt--; - - if ( devc->irq_mode & PCM_ENABLE_INPUT && - audio_devs[dev]->flags & DMA_AUTOMODE && intrflag && - cnt == devc->xfer_count) { - devc->irq_mode |= PCM_ENABLE_INPUT; - devc->intr_active = 1; - return; /* Auto DMA mode on. No need to react */ - } - flags = splhigh(); - - if (dma_restart) { - /* ad1848_halt (dev); */ - DMAbuf_start_dma(dev, buf, count, 0); - } - if (devc->mode == MD_1848 || !devc->dual_dma) {/* Single DMA chan. mode */ - ad_write(devc, 15, (u_char) (cnt & 0xff)); - ad_write(devc, 14, (u_char) ((cnt >> 8) & 0xff)); - } else { /* Dual DMA channel mode */ - ad_write(devc, 31, (u_char) (cnt & 0xff)); - ad_write(devc, 30, (u_char) ((cnt >> 8) & 0xff)); - } - - /* ad_write (devc, 9, ad_read (devc, 9) | 0x02); *//* Capture enable */ - ad_unmute(devc); - - devc->xfer_count = cnt; - devc->irq_mode |= PCM_ENABLE_INPUT; - devc->intr_active = 1; - splx(flags); -} - -static int -ad1848_prepare_for_IO(int dev, int bsize, int bcount) -{ - u_char fs, old_fs; - u_long flags; - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - - if (devc->irq_mode) - return 0; - - fs = devc->speed_bits | (devc->format_bits << 5); - - if (devc->channels > 1) - fs |= 0x10; - old_fs = fs; - - flags = splhigh(); - - if (devc->mode == MD_1845) { /* Use alternate speed select regs */ - fs &= 0xf0; /* Mask off the rate select bits */ - - ad_write(devc, 22, (devc->speed >> 8) & 0xff); /* Speed MSB */ - ad_write(devc, 23, devc->speed & 0xff); /* Speed LSB */ - } - - ad_enter_MCE(devc); /* Enables changes to the format select reg */ - - ad_write(devc, 8, fs); - - /* - * Write to I8 starts resyncronization. Wait until it completes. - */ - AD_WAIT_INIT(10000); - - /* - * If mode == 2 (CS4231), set I28 also. It's the capture format - * register. - */ - if (devc->mode != MD_1848) { - ad_write(devc, 28, fs); - - /* - * Write to I28 starts resyncronization. Wait until it completes. - */ - AD_WAIT_INIT(10000); - } - - ad_write(devc, 9, ad_read(devc, 9) & ~0x08); - - ad_leave_MCE(devc); - - splx(flags); - - devc->xfer_count = 0; -#ifdef CONFIG_SEQUENCER - if (dev == timer_installed && devc->timer_running) - if ((fs & 0x01) != (old_fs & 0x01)) { - ad1848_tmr_reprogram(dev); - } -#endif - return 0; -} - -static void -ad1848_reset(int dev) -{ - ad1848_halt(dev); -} - -static void -ad1848_halt(int dev) -{ - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - u_long flags; - int timeout; - - flags = splhigh(); - - ad_mute(devc); - - ad_write(devc, 9, ad_read(devc, 9) & ~0x03); /* Stop DMA */ - - ad_write(devc, 14, 0); /* Clear DMA counter */ - ad_write(devc, 15, 0); /* Clear DMA counter */ - - if (devc->mode != MD_1848) { - ad_write(devc, 30, 0); /* Clear DMA counter */ - ad_write(devc, 31, 0); /* Clear DMA counter */ - } - - for (timeout = 0; timeout < 1000 && !(inb(io_Status(devc)) & 0x01); - timeout++); /* Wait for interrupt */ - - outb(io_Status(devc), 0); /* Clear interrupt status */ - - devc->irq_mode = 0; - - /* DMAbuf_reset_dma (dev); */ - splx(flags); -} - -static void -ad1848_halt_input(int dev) -{ - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - u_long flags; - u_char playing; - if (devc->mode == MD_1848) { - ad1848_halt(dev); - return; - } - playing = ad_read(devc, 9); - if (!(playing & 0x2)) - return; - - flags = splhigh(); - - ad_mute(devc); - ad_write(devc, 9, playing & ~0x02); /* Stop capture */ - - outb(io_Status(devc), 0); /* Clear interrupt status */ - outb(io_Status(devc), 0); /* Clear interrupt status */ - - devc->irq_mode &= ~PCM_ENABLE_INPUT; - - splx(flags); -} - -static void -ad1848_halt_output(int dev) -{ - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - u_long flags; - u_char playing; - - playing = ad_read(devc, 9); - if (!(playing & 0x1)) { - devc->irq_mode &= ~PCM_ENABLE_OUTPUT; - return; - } - /* IwaveStopDma(PLAYBACK); */ - if (devc->mode == MD_1848) { - ad1848_halt(dev); - return; - } - flags = splhigh(); - /* ad_mute (devc); */ - - ad_write(devc, 9, playing & ~0x1); - outb(io_Status(devc), 0); /* Clear interrupt status */ - /* - * ad_write (devc, 15,0); ad_write (devc, 14,0); - */ - devc->irq_mode &= ~PCM_ENABLE_OUTPUT; - - splx(flags); -} - -static void -ad1848_trigger(int dev, int state) -{ - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - u_long flags; - u_char tmp; - - flags = splhigh(); - state &= devc->irq_mode; - - tmp = ad_read(devc, 9) & ~0x03; - if (state & PCM_ENABLE_INPUT) - tmp |= 0x02; - if (state & PCM_ENABLE_OUTPUT) { - tmp |= 0x01; - } - ad_write(devc, 9, tmp); - - splx(flags); -} - - -int -ad1848_detect(int io_base, int *ad_flags, sound_os_info * osp) -{ - static int last_probe_addr=0, last_result=0; /* to avoid multiple probes*/ - int i; - ad1848_info *devc = &dev_info[nr_ad1848_devs]; - u_char tmp, tmp1, tmp2 ; - - DDB(printf("ad1848_detect(%x)\n", io_base)); - if (io_base == last_probe_addr) - return last_result; - else { - last_result = 0; /* default value for detect */ - last_probe_addr = io_base ; - } - - if (ad_flags) - *ad_flags = 0; - - if (nr_ad1848_devs >= MAX_AUDIO_DEV) { - DDB(printf("ad1848 detect error - step 0\n")); - return 0 ; - } - devc->base = io_base; - devc->irq_ok = 0; - devc->timer_running = 0; - devc->MCE_bit = 0x40; - devc->irq = 0; - devc->opened = 0; - devc->chip_name = "AD1848"; - devc->mode = MD_1848; /* AD1848 or CS4248 */ - devc->osp = osp; - - /* - * Check that the I/O address is in use. - * - * The bit 0x80 of the base I/O port is known to be 0 after the chip has - * performed its power on initialization. Just assume this has - * happened before the OS is starting. - * - * If the I/O address is unused, it typically returns 0xff. - */ - - DDB(printf("ad1848_detect() - step A\n")); - - if ((inb(devc->base) & 0x80) != 0x00) { /* Not a AD1848 */ - DDB(printf("ad1848 detect error - step A," - " inb(base) = 0x%02x, want 0XXX.XXXX\n", - inb(devc->base))); - return 0; - } - /* - * Test if it's possible to change contents of the indirect - * registers. Registers 0 and 1 are ADC volume registers. The bit - * 0x10 is read only so try to avoid using it. - */ - - DDB(printf("ad1848_detect() - step B, test indirect register\n")); - - ad_write(devc, 0, 0xaa); - ad_write(devc, 1, 0x45);/* 0x55 with bit 0x10 clear */ - tmp1 = ad_read(devc, 0) ; - tmp2 = ad_read(devc, 1) ; - if ( tmp1 != 0xaa || tmp2 != 0x45) { - DDB(printf("ad1848 detect error - step B (0x%02x/0x%02x) want 0xaa/0x45\n", tmp1, tmp2)); - return 0; - } - DDB(printf("ad1848_detect() - step C\n")); - ad_write(devc, 0, 0x45); - ad_write(devc, 1, 0xaa); - tmp1 = ad_read(devc, 0) ; - tmp2 = ad_read(devc, 1) ; - - if (tmp1 != 0x45 || tmp2 != 0xaa) { - DDB(printf("ad1848 detect error - step C (%x/%x)\n", tmp1, tmp2)); - - return 0; - } - /* - * The indirect register I12 has some read only bits. Lets try to - * change them. - */ - - DDB(printf("ad1848_detect() - step D, last 4 bits of I12 readonly\n")); - tmp = ad_read(devc, 12); - ad_write(devc, 12, (~tmp) & 0x0f); - tmp1 = ad_read(devc, 12); - - if ((tmp & 0x0f) != (tmp1 & 0x0f)) { - DDB(printf("ad1848 detect error - step D, I12 (0x%02x was 0x%02x)\n", - tmp1, tmp)); - return 0; - } - - /* - * NOTE! Last 4 bits of the reg I12 tell the chip revision. - * 0x01=RevB - * 0x0A=RevC. also CS4231/CS4231A and OPTi931 - */ - - - /* - * The original AD1848/CS4248 has just 15 indirect registers. This - * means that I0 and I16 should return the same value (etc.). Ensure - * that the Mode2 enable bit of I12 is 0. Otherwise this test fails - * with CS4231. - */ - - DDB(printf("ad1848_detect() - step F\n")); - ad_write(devc, 12, 0); /* Mode2=disabled */ - - for (i = 0; i < 16; i++) - if ((tmp1 = ad_read(devc, i)) != (tmp2 = ad_read(devc, i + 16))) { - DDB(printf("ad1848 detect warning - step F(I%d/0x%02x/0x%02x)\n", - i, tmp1, tmp2)); - /* - * note - this seems to fail on the 4232 on I11. So we just break - * rather than fail. - */ - break ; /* return 0; */ - } - /* - * Try to switch the chip to mode2 (CS4231) by setting the MODE2 bit - * (0x40). The bit 0x80 is always 1 in CS4248 and CS4231. - * - * On the OPTi931, however, I12 is readonly and only contains the - * chip revision ID (as in the CS4231A). The upper bits return 0. - */ - - DDB(printf("ad1848_detect() - step G\n")); - ad_write(devc, 12, 0x40); /* Set mode2, clear 0x80 */ - - tmp1 = ad_read(devc, 12); - if (tmp1 & 0x80) { - if (ad_flags) - *ad_flags |= AD_F_CS4248; - - devc->chip_name = "CS4248"; /* Our best knowledge just now */ - } - if ((tmp1 & 0xf0) == 0x00) { - printf("this should be an OPTi931\n"); - } else if ((tmp1 & 0xc0) == 0xC0) { - /* - * The 4231 has bit7=1 always, and bit6 we just set to 1. - * We want to check that this is really a CS4231 - * Verify that setting I0 doesn't change I16. - */ - DDB(printf("ad1848_detect() - step H\n")); - ad_write(devc, 16, 0); /* Set I16 to known value */ - - ad_write(devc, 0, 0x45); - if ((tmp1 = ad_read(devc, 16)) != 0x45) { /* No change -> CS4231? */ - - ad_write(devc, 0, 0xaa); - if ((tmp1 = ad_read(devc, 16)) == 0xaa) { /* Rotten bits? */ - DDB(printf("ad1848 detect error - step H(%x)\n", tmp1)); - return 0; - } - /* - * Verify that some bits of I25 are read only. - */ - - DDB(printf("ad1848_detect() - step I\n")); - tmp1 = ad_read(devc, 25); /* Original bits */ - ad_write(devc, 25, ~tmp1); /* Invert all bits */ - if ((ad_read(devc, 25) & 0xe7) == (tmp1 & 0xe7)) { - int id; - - /* - * It's at least CS4231 - */ - devc->chip_name = "CS4231"; - devc->mode = MD_4231; - - /* - * It could be an AD1845 or CS4231A as well. - * CS4231 and AD1845 report the same revision info in I25 - * while the CS4231A reports different. - */ - - DDB(printf("ad1848_detect() - step I\n")); - id = ad_read(devc, 25) & 0xe7; - /* - * b7-b5 = version number; - * 100 : all CS4231 - * 101 : CS4231A - * - * b2-b0 = chip id; - */ - switch (id) { - - case 0xa0: - devc->chip_name = "CS4231A"; - devc->mode = MD_4231A; - break; - - case 0xa2: - devc->chip_name = "CS4232"; - devc->mode = MD_4231A; - break; - - case 0xb2: - /* strange: the 4231 data sheet says b4-b3 are XX - * so this should be the same as 0xa2 - */ - devc->chip_name = "CS4232A"; - devc->mode = MD_4231A; - break; - - case 0x80: - /* - * It must be a CS4231 or AD1845. The register I23 - * of CS4231 is undefined and it appears to be read - * only. AD1845 uses I23 for setting sample rate. - * Assume the chip is AD1845 if I23 is changeable. - */ - - tmp = ad_read(devc, 23); - - ad_write(devc, 23, ~tmp); - if (ad_read(devc, 23) != tmp) { /* AD1845 ? */ - devc->chip_name = "AD1845"; - devc->mode = MD_1845; - } - ad_write(devc, 23, tmp); /* Restore */ - break; - - case 0x83: /* CS4236 */ - case 0x03: /* Mutant CS4236 on Intel PR440fx board */ - devc->chip_name = "CS4236"; - devc->mode = MD_4236; - break; - - default: /* Assume CS4231 */ - printf("unknown id 0x%02x, assuming CS4231\n", id); - devc->mode = MD_4231; - - } - } - ad_write(devc, 25, tmp1); /* Restore bits */ - - DDB(printf("ad1848_detect() - step K\n")); - } - } - DDB(printf("ad1848_detect() - step L\n")); - - if (ad_flags) { - if (devc->mode != MD_1848) - *ad_flags |= AD_F_CS4231; - } - DDB(printf("ad1848_detect() - Detected OK\n")); - return (last_result = 1); -} - -void -ad1848_init(char *name, int io_base, int irq, - int dma_playback, int dma_capture, int share_dma, sound_os_info * osp) -{ - - /* - * NOTE! If irq < 0, there is another driver which has allocated the - * IRQ so that this driver doesn't need to allocate/deallocate it. - * The actually used IRQ is ABS(irq). - */ - - /* - * Initial values for the indirect registers of CS4248/AD1848. - */ - static int init_values[] = { - 0xa8, /* MIXOUTL: src:mic, +20dB, gain +12dB */ - 0xa8, /* MIXOUTR: src:mic, +20dB, gain +12dB */ - 0x08, /* CDL Input: mute, +6dB */ - 0x08, /* CDR Input: mute, +6dB */ - 0x08, /* FML Input: mute, +6dB */ - 0x08, /* FMR Input: mute, +6dB */ - 0x80, /* DAC-L Input: enable, 0dB */ - 0x80, /* DAC-R Input: enable, 0dB */ - /* 0xa8, 0xa8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, */ - 0x00, /* 8bit, lin, uns, mono, 8KHz */ - 0x0c, /* dma-cap, dma-pb, autocal, single dma, disable cap/pb */ - 0x02, /* int enable */ - 0x00, /* clear error status */ - 0x8a, /* rev. id (low bytes readonly) */ - 0x00, - 0x00, /* playback upper base count */ - 0x00, /* playback lower base count */ - - /* Positions 16 to 31 just for CS4231 and newer devices */ - /* I16-I17: alt. feature enable on the 4231, but AUXL Input - * on the OPTi931 (where the features are set elsewhere - */ - 0x81, 0x00, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - }; - int i, my_dev; - - ad1848_info *devc = &dev_info[nr_ad1848_devs]; - - if (!ad1848_detect(io_base, NULL, osp)) - return; - - devc->irq = (irq > 0) ? irq : 0; - devc->opened = 0; - devc->timer_ticks = 0; - devc->osp = osp; - - if (nr_ad1848_devs != 0) { - bcopy((char *) &ad1848_pcm_operations[0], - (char *) &ad1848_pcm_operations[nr_ad1848_devs], - sizeof(struct audio_operations)); - } - for (i = 0; i < 16; i++) - ad_write(devc, i, init_values[i]); - - ad_mute(devc); /* Initialize some variables */ - ad_unmute(devc); /* Leave it unmuted now */ - - if (devc->mode > MD_1848) { - if (dma_capture == dma_playback || - dma_capture == -1 || dma_playback == -1) { - ad_write(devc, 9, ad_read(devc, 9) | 0x04); /* Single DMA mode */ - ad1848_pcm_operations[nr_ad1848_devs].flags &= ~DMA_DUPLEX; - } else { - ad_write(devc, 9, ad_read(devc, 9) & ~0x04); /* Dual DMA mode */ - ad1848_pcm_operations[nr_ad1848_devs].flags |= DMA_DUPLEX; - } - - ad_write(devc, 12, ad_read(devc, 12) | 0x40); /* Mode2 = enabled */ - for (i = 16; i < 32; i++) - ad_write(devc, i, init_values[i]); - - if (devc->mode == MD_4231A) { - /* Enable full * calibration */ - ad_write(devc, 9, init_values[9] | 0x18); - } - - if (devc->mode == MD_1845) { - /* Alternate freq select enabled */ - ad_write(devc, 27, init_values[27] | 0x08); - } - } else { - ad1848_pcm_operations[nr_ad1848_devs].flags &= ~DMA_DUPLEX; - ad_write(devc, 9, ad_read(devc, 9) | 0x04); /* Single DMA mode */ - } - - outb(io_Status(devc), 0); /* Clear pending interrupts */ - - if (name != NULL && name[0] != 0) - snprintf(ad1848_pcm_operations[nr_ad1848_devs].name, - sizeof(ad1848_pcm_operations[nr_ad1848_devs].name), - "%s (%s)", name, devc->chip_name); - else - snprintf(ad1848_pcm_operations[nr_ad1848_devs].name, - sizeof(ad1848_pcm_operations[nr_ad1848_devs].name), - "Generic audio codec (%s)", devc->chip_name); - - conf_printf2(ad1848_pcm_operations[nr_ad1848_devs].name, - devc->base, devc->irq, dma_playback, dma_capture); - - - /* ad1848_pcm_operations[nr_ad1848_devs].flags |= DMA_AUTOMODE ; */ - - if (num_audiodevs < MAX_AUDIO_DEV) { - audio_devs[my_dev = num_audiodevs++] = - &ad1848_pcm_operations[nr_ad1848_devs]; - if (irq > 0) { - audio_devs[my_dev]->devc = devc; - irq2dev[irq] = my_dev; - if (snd_set_irq_handler(devc->irq, ad1848_interrupt, devc->osp)<0) { - printf("ad1848: IRQ in use\n"); - } -#ifdef NO_IRQ_TEST - if (devc->mode != MD_1848) { - int x; - u_char tmp = ad_read(devc, 16); - - devc->timer_ticks = 0; - - ad_write(devc, 21, 0x00); /* Timer msb */ - ad_write(devc, 20, 0x10); /* Timer lsb */ - - ad_write(devc, 16, tmp | 0x40); /* Enable timer */ - for (x = 0; x < 100000 && devc->timer_ticks == 0; x++); - ad_write(devc, 16, tmp & ~0x40); /* Disable timer */ - - if (devc->timer_ticks == 0) - printf("[IRQ conflict???]"); - else - devc->irq_ok = 1; - - } else - devc->irq_ok = 1; /* Couldn't test. assume it's OK */ -#else - devc->irq_ok = 1; -#endif - } else if (irq < 0) - irq2dev[-irq] = devc->dev_no = my_dev; - - audio_devs[my_dev]->otherside = -1 ; - audio_devs[my_dev]->flags |= DMA_AUTOMODE; - audio_devs[my_dev]->dmachan1 = dma_playback; - audio_devs[my_dev]->dmachan2 = dma_capture; - audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; - audio_devs[my_dev]->devc = devc; - audio_devs[my_dev]->format_mask = ad_format_mask[devc->mode]; - nr_ad1848_devs++; - -#ifdef CONFIG_SEQUENCER - if (devc->mode != MD_1848 && devc->irq_ok) - ad1848_tmr_install(my_dev); -#endif - - /* - * Toggle the MCE bit. It completes the initialization phase. - */ - - ad_enter_MCE(devc); /* In case the bit was off */ - ad_leave_MCE(devc); - - if (num_mixers < MAX_MIXER_DEV) { - mixer2codec[num_mixers] = my_dev + 1; - audio_devs[my_dev]->mixer_dev = num_mixers; - mixer_devs[num_mixers++] = &ad1848_mixer_operations; - ad1848_mixer_reset(devc); - } - } else - printf("AD1848: Too many PCM devices available\n"); -} - -void -ad1848_interrupt(int irq) -{ - u_char status; - ad1848_info *devc; - int dev; - - if (irq < 0 || irq > 15) - dev = -1; - else - dev = irq2dev[irq]; - - if (dev < 0 || dev >= num_audiodevs) { - for (irq = 0; irq < 17; irq++) - if (irq2dev[irq] != -1) - break; - - if (irq > 15) { - printf("ad1848.c: Bogus interrupt %d\n", irq); - return; - } - dev = irq2dev[irq]; - } - devc = (ad1848_info *) audio_devs[dev]->devc; - - status = inb(io_Status(devc)); - - if (status & 0x01) { /* we have an interrupt */ - int alt_stat = 0xff ; - - if (devc->mode != MD_1848) { - /* - * high-end devices have full-duplex dma and timer. - * the exact reason for the interrupt is in reg. I24. - * For old devices, we fake the interrupt bits, and - * determine the real reason basing on the device mode. - */ - alt_stat = ad_read(devc, 24); - if (alt_stat & 0x40) { /* Timer interrupt */ - devc->timer_ticks++; -#ifdef CONFIG_SEQUENCER - if (timer_installed == dev && devc->timer_running) - sound_timer_interrupt(); -#endif - } - } - - outb(io_Status(devc), 0); /* Clear interrupt status */ - - if (audio_devs[dev]->busy) { - - if (devc->irq_mode & PCM_ENABLE_OUTPUT && alt_stat & 0x10) - DMAbuf_outputintr(dev, 1); - - if (devc->irq_mode & PCM_ENABLE_INPUT && alt_stat & 0x20) - DMAbuf_inputintr(dev); - } - } -} - -/* - * Some extra code for the MS Sound System - */ - -#ifdef amancio -void -check_opl3(int base, struct address_info * hw_config) -{ - - if (!opl3_detect(base, hw_config->osp)) - return; - - opl3_init(0, base, hw_config->osp); -} -#endif - -/* - * this is the probe routine. Note, it is not necessary to - * go through this for PnP devices, since they are already - * indentified precisely using their PnP id. - * - */ - -int -probe_mss(struct address_info * hw_config) -{ - u_char tmp; - - DDB(printf("Entered probe_mss(io 0x%x, type %d)\n", - hw_config->io_base, hw_config->card_subtype)); - - if (hw_config->card_subtype == 1) { /* Has no IRQ/DMA registers */ - /* check_opl3(0x388, hw_config); */ - goto probe_ms_end; - } - -#if defined(CONFIG_AEDSP16) && defined(AEDSP16_MSS) - /* - * Initialize Audio Excel DSP 16 to MSS: before any operation we must - * enable MSS I/O ports. - */ - InitAEDSP16_MSS(hw_config); -#endif - - /* - * Check if the IO port returns valid signature. The original MS - * Sound system returns 0x04 while some cards (AudioTriX Pro for - * example) return 0x00 or 0x0f. - */ - - if ((tmp = inb(hw_config->io_base + 3)) == 0xff) { /* Bus float */ - DDB(printf("I/O address inactive (%x), force type 1\n", tmp)); - hw_config->card_subtype = 1 ; - goto probe_ms_end; - } - - if ((tmp & 0x3f) != 0x04 && - (tmp & 0x3f) != 0x0f && - (tmp & 0x3f) != 0x00) { - DDB(printf("No MSS signature detected on port 0x%x (0x%x)\n", - hw_config->io_base, inb(hw_config->io_base + 3))); - return 0; - } - if (hw_config->irq > 11) { - printf("MSS: Bad IRQ %d\n", hw_config->irq); - return 0; - } - if (hw_config->dma != 0 && hw_config->dma != 1 && hw_config->dma != 3) { - printf("MSS: Bad DMA %d\n", hw_config->dma); - 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) { - printf("MSS: Can't use DMA0 with a 8 bit card/slot\n"); - return 0; - } - if (hw_config->irq > 7 && hw_config->irq != 9 && - inb(hw_config->io_base + 3) & 0x80) { - printf("MSS: Can't use IRQ%d with a 8 bit card/slot\n", hw_config->irq); - return 0; - } -probe_ms_end: - return ad1848_detect(hw_config->io_base + 4, NULL, hw_config->osp); -} - -void -attach_mss(struct address_info * hw_config) -{ - -#if 0 - /* - * XXX do we really need to detect it again ? - lr970712 - */ - if (!ad1848_detect(hw_config->io_base + 4, NULL, hw_config->osp)) - return ; -#endif - - if (hw_config->card_subtype == 1) { /* Has no IRQ/DMA registers */ - ad1848_init("MS Sound System1", hw_config->io_base + 4, - hw_config->irq, - hw_config->dma, - hw_config->dma2, 0, hw_config->osp); - } else { - /* - * Set the IRQ and DMA addresses. - */ -#ifdef PC98 - static char interrupt_bits[13] = { - -1, -1, -1, 0x08, -1, 0x10, -1, -1, -1, -1, 0x18, -1, 0x20 - }; -#else - static char interrupt_bits[12] = { - -1, -1, -1, -1, -1, -1, -1, 0x08, -1, 0x10, 0x18, 0x20 - }; -#endif - static char dma_bits[4] = { - 1, 2, 0, 3 - }; - - int config_port = hw_config->io_base + 0; - int version_port = hw_config->io_base + 3; - char bits = interrupt_bits[hw_config->irq]; - - if (bits == -1) - return ; - -#ifndef PC98 - outb(config_port, bits | 0x40); - if ((inb(version_port) & 0x40) == 0) - printf("[IRQ Conflict?]"); -#endif - - /* Write IRQ+DMA setup */ - outb(config_port, bits | dma_bits[hw_config->dma]); - - ad1848_init("MS Sound System0", hw_config->io_base + 4, - hw_config->irq, - hw_config->dma, - hw_config->dma, 0, hw_config->osp); - } - return ; -} - -/* - * WSS compatible PnP codec support. - * XXX I doubt it works now - lr970712 - */ - -int -probe_pnp_ad1848(struct address_info * hw_config) -{ - return ad1848_detect(hw_config->io_base, NULL, hw_config->osp); -} - -void -attach_pnp_ad1848(struct address_info * hw_config) -{ - - ad1848_init(hw_config->name, hw_config->io_base, - hw_config->irq, - hw_config->dma, - hw_config->dma2, 0, hw_config->osp); -} - -#ifdef CONFIG_SEQUENCER -/* - * Timer stuff (for /dev/music). - */ - -static u_int current_interval = 0; - -static u_int -ad1848_tmr_start(int dev, u_int usecs) -{ - u_long flags; - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - u_long xtal_nsecs; /* nanoseconds per xtal oscillaror tick */ - u_long divider; - - flags = splhigh(); - - /* - * Length of the timer interval (in nanoseconds) depends on the - * selected crystal oscillator. Check this from bit 0x01 of I8. - * - * AD1845 has just one oscillator which has cycle time of 10.050 us - * (when a 24.576 MHz xtal oscillator is used). - * - * Convert requested interval to nanoseconds before computing the timer - * divider. - */ - - if (devc->mode == MD_1845) - xtal_nsecs = 10050; - else if (ad_read(devc, 8) & 0x01) - xtal_nsecs = 9920; - else - xtal_nsecs = 9969; - - divider = (usecs * 1000 + xtal_nsecs / 2) / xtal_nsecs; - - if (divider < 100) /* Don't allow shorter intervals than about 1ms */ - divider = 100; - - if (divider > 65535) /* Overflow check */ - divider = 65535; - - ad_write(devc, 21, (divider >> 8) & 0xff); /* Set upper bits */ - ad_write(devc, 20, divider & 0xff); /* Set lower bits */ - ad_write(devc, 16, ad_read(devc, 16) | 0x40); /* Start the timer */ - devc->timer_running = 1; - splx(flags); - - return current_interval = (divider * xtal_nsecs + 500) / 1000; -} - -static void -ad1848_tmr_reprogram(int dev) -{ - /* - * Audio driver has changed sampling rate so that a different xtal - * oscillator was selected. We have to reprogram the timer rate. - */ - - ad1848_tmr_start(dev, current_interval); - sound_timer_syncinterval(current_interval); -} - -static void -ad1848_tmr_disable(int dev) -{ - u_long flags; - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - - flags = splhigh(); - ad_write(devc, 16, ad_read(devc, 16) & ~0x40); - devc->timer_running = 0; - splx(flags); -} - -static void -ad1848_tmr_restart(int dev) -{ - u_long flags; - ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; - - if (current_interval == 0) - return; - - flags = splhigh(); - ad_write(devc, 16, ad_read(devc, 16) | 0x40); - devc->timer_running = 1; - splx(flags); -} - -static struct sound_lowlev_timer ad1848_tmr = { - 0, - ad1848_tmr_start, - ad1848_tmr_disable, - ad1848_tmr_restart -}; - -static int -ad1848_tmr_install(int dev) -{ - if (timer_installed != -1) - return 0; /* Don't install another timer */ - - timer_installed = ad1848_tmr.dev = dev; - sound_timer_init(&ad1848_tmr, audio_devs[dev]->name); - - return 1; -} -#endif -#endif diff --git a/sys/i386/isa/sound/ad1848_mixer.h b/sys/i386/isa/sound/ad1848_mixer.h deleted file mode 100644 index 7a1d323..0000000 --- a/sys/i386/isa/sound/ad1848_mixer.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * sound/ad1848_mixer.h - * - * Definitions for the mixer of AD1848 and compatible codecs. - * - * 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 - * 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. - */ -/* - * The AD1848 codec has generic input lines called Line, Aux1 and Aux2. - * Soundcard manufacturers have connected actual inputs (CD, synth, line, - * etc) to these inputs in different order. Therefore it's difficult - * to assign mixer channels to to these inputs correctly. The following - * contains two alternative mappings. The first one is for GUS MAX and - * the second is just a generic one (line1, line2 and line3). - * (Actually this is not a mapping but rather some kind of interleaving - * solution). - */ -#define GUSMAX_MIXER -#ifdef GUSMAX_MIXER -#define MODE1_REC_DEVICES (SOUND_MASK_LINE | SOUND_MASK_MIC | \ - SOUND_MASK_CD|SOUND_MASK_IMIX) - -#define MODE1_MIXER_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_MIC | \ - SOUND_MASK_CD | \ - SOUND_MASK_IGAIN | \ - SOUND_MASK_PCM|SOUND_MASK_IMIX) - -#define MODE2_MIXER_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_LINE | SOUND_MASK_MIC | \ - SOUND_MASK_CD | SOUND_MASK_SPEAKER | \ - SOUND_MASK_IGAIN | \ - SOUND_MASK_PCM | SOUND_MASK_IMIX) -#else /* Generic mapping */ -#define MODE1_REC_DEVICES (SOUND_MASK_LINE3 | SOUND_MASK_MIC | \ - SOUND_MASK_LINE1|SOUND_MASK_IMIX) - -#define MODE1_MIXER_DEVICES (SOUND_MASK_LINE1 | SOUND_MASK_MIC | \ - SOUND_MASK_LINE2 | \ - SOUND_MASK_IGAIN | \ - SOUND_MASK_PCM | SOUND_MASK_IMIX) - -#define MODE2_MIXER_DEVICES (SOUND_MASK_LINE1 | SOUND_MASK_LINE2 | SOUND_MASK_MIC | \ - SOUND_MASK_LINE3 | SOUND_MASK_SPEAKER | \ - SOUND_MASK_IGAIN | \ - SOUND_MASK_PCM | SOUND_MASK_IMIX) -#endif - -struct mixer_def { - unsigned int regno: 7; - unsigned int polarity:1; /* 0=normal, 1=reversed */ - unsigned int bitpos:4; - unsigned int nbits:4; -}; - -static char mix_cvt[101] = { - 0, 0,3,7,10,13,16,19,21,23,26,28,30,32,34,35,37,39,40,42, - 43,45,46,47,49,50,51,52,53,55,56,57,58,59,60,61,62,63,64,65, - 65,66,67,68,69,70,70,71,72,73,73,74,75,75,76,77,77,78,79,79, - 80,81,81,82,82,83,84,84,85,85,86,86,87,87,88,88,89,89,90,90, - 91,91,92,92,93,93,94,94,95,95,96,96,96,97,97,98,98,98,99,99, - 100 -}; - -typedef struct mixer_def mixer_ent; - -/* - * Most of the mixer entries work in backwards. Setting the polarity field - * makes them to work correctly. - * - * The channel numbering used by individual soundcards is not fixed. Some - * cards have assigned different meanings for the AUX1, AUX2 and LINE inputs. - * The current version doesn't try to compensate this. - */ - -#define MIX_ENT(name, reg_l, pola_l, pos_l, len_l, reg_r, pola_r, pos_r, len_r) \ - {{reg_l, pola_l, pos_l, len_l}, {reg_r, pola_r, pos_r, len_r}} - -mixer_ent mix_devices[32][2] = { /* As used in GUS MAX */ -MIX_ENT(SOUND_MIXER_VOLUME, 0, 0, 0, 0, 0, 0, 0, 0), -MIX_ENT(SOUND_MIXER_BASS, 0, 0, 0, 0, 0, 0, 0, 0), -MIX_ENT(SOUND_MIXER_TREBLE, 0, 0, 0, 0, 0, 0, 0, 0), -MIX_ENT(SOUND_MIXER_SYNTH, 4, 1, 0, 5, 5, 1, 0, 5), -MIX_ENT(SOUND_MIXER_PCM, 6, 1, 0, 6, 7, 1, 0, 6), -MIX_ENT(SOUND_MIXER_SPEAKER, 26, 1, 0, 4, 0, 0, 0, 0), -MIX_ENT(SOUND_MIXER_LINE, 18, 1, 0, 5, 19, 1, 0, 5), -MIX_ENT(SOUND_MIXER_MIC, 0, 0, 5, 1, 1, 0, 5, 1), -MIX_ENT(SOUND_MIXER_CD, 2, 1, 0, 5, 3, 1, 0, 5), -MIX_ENT(SOUND_MIXER_IMIX, 13, 1, 2, 6, 0, 0, 0, 0), -MIX_ENT(SOUND_MIXER_ALTPCM, 0, 0, 0, 0, 0, 0, 0, 0), -MIX_ENT(SOUND_MIXER_RECLEV, 0, 0, 0, 0, 0, 0, 0, 0), -MIX_ENT(SOUND_MIXER_IGAIN, 0, 0, 0, 4, 1, 0, 0, 4), -MIX_ENT(SOUND_MIXER_OGAIN, 0, 0, 0, 0, 0, 0, 0, 0), -MIX_ENT(SOUND_MIXER_LINE1, 2, 1, 0, 5, 3, 1, 0, 5), -MIX_ENT(SOUND_MIXER_LINE2, 4, 1, 0, 5, 5, 1, 0, 5), -MIX_ENT(SOUND_MIXER_LINE3, 18, 1, 0, 5, 19, 1, 0, 5) -}; - -static unsigned short default_mixer_levels[SOUND_MIXER_NRDEVICES] = -{ - 0x5a5a, /* Master Volume */ - 0x3232, /* Bass */ - 0x3232, /* Treble */ - 0x4b4b, /* FM */ - 0x4040, /* PCM */ - 0x4b4b, /* PC Speaker */ - /* 0x2020, Ext Line */ - 0x0000, /* Ext Line */ - 0x4040, /* Mic */ - 0x4b4b, /* CD */ - 0x0000, /* Recording monitor */ - 0x4b4b, /* SB PCM */ - 0x4b4b, /* Recording level */ - 0x2525, /* Input gain */ - 0x0000, /* Output gain */ - /* 0x4040, Line1 */ - 0x0000, /* Line1 */ - 0x0000, /* Line2 */ - 0x1515, /* Line3 (usually line in)*/ -}; - -#define LEFT_CHN 0 -#define RIGHT_CHN 1 - diff --git a/sys/i386/isa/sound/adlib_card.c b/sys/i386/isa/sound/adlib_card.c deleted file mode 100644 index 41039b9..0000000 --- a/sys/i386/isa/sound/adlib_card.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * sound/adlib_card.c - * - * Detection routine for the AdLib card. - * - * 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 - -#if defined(CONFIG_YM3812) - -void -attach_adlib_card(struct address_info * hw_config) -{ - opl3_init(hw_config->io_base, hw_config->osp); -} - -int -probe_adlib(struct address_info * hw_config) -{ - return opl3_detect(hw_config->io_base, hw_config->osp); -} - -#endif diff --git a/sys/i386/isa/sound/aedsp16.c b/sys/i386/isa/sound/aedsp16.c deleted file mode 100644 index e69de29..0000000 diff --git a/sys/i386/isa/sound/alaw.h b/sys/i386/isa/sound/alaw.h deleted file mode 100644 index 336bf6b..0000000 --- a/sys/i386/isa/sound/alaw.h +++ /dev/null @@ -1,73 +0,0 @@ -static unsigned char alaw_linear[] = { - 45, 214, 122, 133, 0, 255, 107, 149, - 86, 171, 126, 129, 0, 255, 117, 138, - 13, 246, 120, 135, 0, 255, 99, 157, - 70, 187, 124, 131, 0, 255, 113, 142, - 61, 198, 123, 132, 0, 255, 111, 145, - 94, 163, 127, 128, 0, 255, 119, 136, - 29, 230, 121, 134, 0, 255, 103, 153, - 78, 179, 125, 130, 0, 255, 115, 140, - 37, 222, 122, 133, 0, 255, 105, 151, - 82, 175, 126, 129, 0, 255, 116, 139, - 5, 254, 120, 135, 0, 255, 97, 159, - 66, 191, 124, 131, 0, 255, 112, 143, - 53, 206, 123, 132, 0, 255, 109, 147, - 90, 167, 127, 128, 0, 255, 118, 137, - 21, 238, 121, 134, 0, 255, 101, 155, - 74, 183, 125, 130, 0, 255, 114, 141, - 49, 210, 123, 133, 0, 255, 108, 148, - 88, 169, 127, 129, 0, 255, 118, 138, - 17, 242, 121, 135, 0, 255, 100, 156, - 72, 185, 125, 131, 0, 255, 114, 142, - 64, 194, 124, 132, 0, 255, 112, 144, - 96, 161, 128, 128, 1, 255, 120, 136, - 33, 226, 122, 134, 0, 255, 104, 152, - 80, 177, 126, 130, 0, 255, 116, 140, - 41, 218, 122, 133, 0, 255, 106, 150, - 84, 173, 126, 129, 0, 255, 117, 139, - 9, 250, 120, 135, 0, 255, 98, 158, - 68, 189, 124, 131, 0, 255, 113, 143, - 57, 202, 123, 132, 0, 255, 110, 146, - 92, 165, 127, 128, 0, 255, 119, 137, - 25, 234, 121, 134, 0, 255, 102, 154, - 76, 181, 125, 130, 0, 255, 115, 141, - -}; - -#ifndef LINEAR_ALAW_NOT_WANTED -static unsigned char linear_alaw[] = { - - 252, 172, 172, 172, 172, 80, 80, 80, - 80, 208, 208, 208, 208, 16, 16, 16, - 16, 144, 144, 144, 144, 112, 112, 112, - 112, 240, 240, 240, 240, 48, 48, 48, - 48, 176, 176, 176, 176, 64, 64, 64, - 64, 192, 192, 192, 192, 0, 0, 0, - 0, 128, 128, 128, 128, 96, 96, 96, - 96, 224, 224, 224, 224, 32, 32, 32, - 160, 160, 88, 88, 216, 216, 24, 24, - 152, 152, 120, 120, 248, 248, 56, 56, - 184, 184, 72, 72, 200, 200, 8, 8, - 136, 136, 104, 104, 232, 232, 40, 40, - 168, 86, 214, 22, 150, 118, 246, 54, - 182, 70, 198, 6, 134, 102, 230, 38, - 166, 222, 158, 254, 190, 206, 142, 238, - 210, 242, 194, 226, 218, 250, 202, 234, - 235, 203, 251, 219, 227, 195, 243, 211, - 175, 239, 143, 207, 191, 255, 159, 223, - 167, 39, 231, 103, 135, 7, 199, 71, - 183, 55, 247, 119, 151, 23, 215, 87, - 87, 169, 169, 41, 41, 233, 233, 105, - 105, 137, 137, 9, 9, 201, 201, 73, - 73, 185, 185, 57, 57, 249, 249, 121, - 121, 153, 153, 25, 25, 217, 217, 89, - 89, 89, 161, 161, 161, 161, 33, 33, - 33, 33, 225, 225, 225, 225, 97, 97, - 97, 97, 129, 129, 129, 129, 1, 1, - 1, 1, 193, 193, 193, 193, 65, 65, - 65, 65, 177, 177, 177, 177, 49, 49, - 49, 49, 241, 241, 241, 241, 113, 113, - 113, 113, 145, 145, 145, 145, 17, 17, - 17, 17, 209, 209, 209, 209, 81, 253, -}; -#endif /* !LINEAR_ALAW_NOT_WANTED */ diff --git a/sys/i386/isa/sound/audio.c b/sys/i386/isa/sound/audio.c deleted file mode 100644 index c526857..0000000 --- a/sys/i386/isa/sound/audio.c +++ /dev/null @@ -1,440 +0,0 @@ -/* - * sound/audio.c - * - * Device file manager for /dev/audio - * - * 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 - -#ifdef CONFIG_AUDIO - -#include -#include - -#define ON 1 -#define OFF 0 -int -DMAbuf_poll(int dev, struct fileinfo * file, int events, select_table * wait); - -int -audio_poll(int dev, struct fileinfo * file, int events, select_table * wait); - -static int wr_buff_no[MAX_AUDIO_DEV]; - /* != -1, if there is a incomplete output block in the queue. */ -static int wr_buff_size[MAX_AUDIO_DEV], wr_buff_ptr[MAX_AUDIO_DEV]; - -static int audio_mode[MAX_AUDIO_DEV]; -static int dev_nblock[MAX_AUDIO_DEV]; /* 1 if in noblocking mode */ - -#define AM_NONE 0 -#define AM_WRITE 1 -#define AM_READ 2 - -static char *wr_dma_buf[MAX_AUDIO_DEV]; -static int audio_format[MAX_AUDIO_DEV]; -static int local_conversion[MAX_AUDIO_DEV]; - -static int -set_format(int dev, int fmt) -{ - if (fmt != AFMT_QUERY) { - - local_conversion[dev] = 0; - - if (!(audio_devs[dev]->format_mask & fmt)) { /* Not supported */ - if (fmt == AFMT_MU_LAW) { - fmt = AFMT_U8; - local_conversion[dev] = AFMT_MU_LAW; - } else - fmt = AFMT_U8; /* This is always supported */ - } - audio_format[dev] = DMAbuf_ioctl(dev, SNDCTL_DSP_SETFMT, - (ioctl_arg) fmt, 1); - } - if (local_conversion[dev]) /* This shadows the HW format */ - return local_conversion[dev]; - - return audio_format[dev]; -} - -int -audio_open(int dev, struct fileinfo * file) -{ - int ret; - int bits; - int dev_type = dev & 0x0f; - int mode = file->mode & O_ACCMODE; - - dev = dev >> 4; - - bits = (dev_type == SND_DEV_DSP16) ? 16 : 8 ; - - if ((ret = DMAbuf_open(dev, mode)) < 0) - return ret; - - if (audio_devs[dev]->coproc) - if ((ret = audio_devs[dev]->coproc-> - open(audio_devs[dev]->coproc->devc, COPR_PCM)) < 0) { - audio_release(dev, file); - printf("Sound: Can't access coprocessor device\n"); - - return ret; - } - local_conversion[dev] = 0; - - if (DMAbuf_ioctl(dev, SNDCTL_DSP_SETFMT, (ioctl_arg) bits, 1) != bits) { - audio_release(dev, file); - return -(ENXIO); - } - - set_format(dev, (dev_type == SND_DEV_AUDIO) ? AFMT_MU_LAW : bits ) ; - - wr_buff_no[dev] = -1; - audio_mode[dev] = AM_NONE; - wr_buff_size[dev] = wr_buff_ptr[dev] = 0; - dev_nblock[dev] = 0; - - return ret; -} - -void -audio_release(int dev, struct fileinfo * file) -{ - int mode; - - dev = dev >> 4; - mode = file->mode & O_ACCMODE; - - if (wr_buff_no[dev] >= 0) { - DMAbuf_start_output(dev, wr_buff_no[dev], wr_buff_ptr[dev]); - wr_buff_no[dev] = -1; - } - if (audio_devs[dev]->coproc) - audio_devs[dev]->coproc->close(audio_devs[dev]->coproc->devc,COPR_PCM); - DMAbuf_release(dev, mode); - audio_devs[dev]->dmap_out->mapping_flags &= ~DMA_MAP_MAPPED ; - -} - -static void -translate_bytes(const u_char *table, u_char *buff, int n) -{ - u_long i; - - if (n <= 0) - return; - - for (i = 0; i < n; ++i) - buff[i] = table[buff[i]]; -} - -int -audio_write(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) -{ - int c, p, l; - int err; - - dev = dev >> 4; - - p = 0; - c = count; - if ((audio_mode[dev] & AM_READ) && - !(audio_devs[dev]->flags & DMA_DUPLEX)) { /* Direction change */ - wr_buff_no[dev] = -1; - } - if (audio_devs[dev]->flags & DMA_DUPLEX) - audio_mode[dev] |= AM_WRITE; - else - audio_mode[dev] = AM_WRITE; - - if (!count) { /* Flush output */ - if (wr_buff_no[dev] >= 0) { - DMAbuf_start_output(dev, wr_buff_no[dev], wr_buff_ptr[dev]); - wr_buff_no[dev] = -1; - } - return 0; - } - while (c) { /* Perform output blocking */ - if (wr_buff_no[dev] < 0) { - /* There is no incomplete buffers */ - if ((wr_buff_no[dev] = DMAbuf_getwrbuffer(dev, - &wr_dma_buf[dev], &wr_buff_size[dev], - dev_nblock[dev])) < 0) { - /* Handle nonblocking mode */ - if (dev_nblock[dev] && wr_buff_no[dev] == -(EAGAIN)) - return p; /* No more space. Return # of accepted bytes */ - return wr_buff_no[dev]; - } - wr_buff_ptr[dev] = 0; - } - l = c; - if (l > (wr_buff_size[dev] - wr_buff_ptr[dev])) - l = (wr_buff_size[dev] - wr_buff_ptr[dev]); - - if (!audio_devs[dev]->copy_from_user) { /* No device specific - * copy routine */ - - if (uiomove(&wr_dma_buf[dev][wr_buff_ptr[dev]], l, buf)) { - printf("sb: Bad copyin()!\n"); - }; - } else - audio_devs[dev]->copy_from_user(dev, - wr_dma_buf[dev], wr_buff_ptr[dev], buf, p, l); - - - /* - * Insert local processing here - */ - - if (local_conversion[dev] == AFMT_MU_LAW) { - translate_bytes(ulaw_dsp, - (u_char *) &wr_dma_buf[dev][wr_buff_ptr[dev]], l); - } - c -= l; - p += l; - wr_buff_ptr[dev] += l; - - if (wr_buff_ptr[dev] >= wr_buff_size[dev]) { - if ((err = DMAbuf_start_output(dev, wr_buff_no[dev], - wr_buff_ptr[dev])) < 0) { - return err; - } - wr_buff_no[dev] = -1; - } - } - return count; -} - -int -audio_read(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) -{ - int c, p, l; - char *dmabuf; - int buff_no; - - dev = dev >> 4; - p = 0; - c = count; - if ((audio_mode[dev] & AM_WRITE) && - !(audio_devs[dev]->flags & DMA_DUPLEX)) { - if (wr_buff_no[dev] >= 0) { - DMAbuf_start_output(dev, wr_buff_no[dev], wr_buff_ptr[dev]); - - if (!(audio_devs[dev]->flags & DMA_DUPLEX)) - wr_buff_no[dev] = -1; - } - } - if (audio_devs[dev]->flags & DMA_DUPLEX) - audio_mode[dev] |= AM_READ; - else - audio_mode[dev] = AM_READ; - - while (c) { - if ((buff_no = DMAbuf_getrdbuffer(dev, &dmabuf, &l, - dev_nblock[dev])) < 0) { - /* - * Nonblocking mode handling. Return current # of bytes - */ - - if (dev_nblock[dev] && buff_no == -(EAGAIN)) - return p; - - return buff_no; - } - if (l > c) - l = c; - - /* - * Insert any local processing here. - */ - - if (local_conversion[dev] == AFMT_MU_LAW) { - translate_bytes(dsp_ulaw, (u_char *) dmabuf, l); - } - if (uiomove(dmabuf, l, buf)) { - printf("sb: Bad copyout()!\n"); - }; - - DMAbuf_rmchars(dev, buff_no, l); - - p += l; - c -= l; - } - return count - c; -} - -int -audio_ioctl(int dev, struct fileinfo * file, u_int cmd, ioctl_arg arg) -{ - dev = dev >> 4; - if (((cmd >> 8) & 0xff) == 'C') { - if (audio_devs[dev]->coproc) /* Coprocessor ioctl */ - return audio_devs[dev]->coproc->ioctl(audio_devs[dev]->coproc->devc, cmd, arg, 0); - else - printf("/dev/dsp%d: No coprocessor for this device\n", dev); - - return -(ENXIO); - } else - switch (cmd) { - - case SNDCTL_DSP_SYNC: - if (wr_buff_no[dev] >= 0) { - DMAbuf_start_output(dev, wr_buff_no[dev], wr_buff_ptr[dev]); - wr_buff_no[dev] = -1; - } - return DMAbuf_ioctl(dev, cmd, arg, 0); - break; - - case SNDCTL_DSP_POST: - if (wr_buff_no[dev] >= 0) { - DMAbuf_start_output(dev, wr_buff_no[dev], wr_buff_ptr[dev]); - wr_buff_no[dev] = -1; - } - return 0; - break; - - case SNDCTL_DSP_RESET: - wr_buff_no[dev] = -1; - audio_mode[dev] = AM_NONE; - return DMAbuf_ioctl(dev, cmd, arg, 0); - break; - - case SNDCTL_DSP_GETFMTS: - return *(int *) arg = audio_devs[dev]->format_mask; - break; - - case SNDCTL_DSP_SETFMT: - return *(int *) arg = set_format(dev, (*(int *) arg)); - - case SNDCTL_DSP_GETISPACE: - if ((audio_mode[dev] & AM_WRITE) && - !(audio_devs[dev]->flags & DMA_DUPLEX)) - return -(EBUSY); - - else { - audio_buf_info info; - int err = DMAbuf_ioctl(dev, cmd, (ioctl_arg) & info, 1); - - if (err < 0) - return err; - - bcopy((char *) &info, &(((char *) arg)[0]), sizeof(info)); - return 0; - } - - case SNDCTL_DSP_GETOSPACE: - if ((audio_mode[dev] & AM_READ) && - !(audio_devs[dev]->flags & DMA_DUPLEX)) - return -(EBUSY); - else { - audio_buf_info info; - int err = DMAbuf_ioctl(dev, cmd, (ioctl_arg) & info, 1); - - if (err < 0) - return err; - - if (wr_buff_no[dev] != -1) - info.bytes += wr_buff_size[dev] - wr_buff_ptr[dev]; - - bcopy((char *) &info, &(((char *) arg)[0]), sizeof(info)); - return 0; - } - - case SNDCTL_DSP_NONBLOCK: - dev_nblock[dev] = 1; - return 0; - break; - - case SNDCTL_DSP_GETCAPS: - { - int info = 1; /* Revision level of this ioctl() */ - - if (audio_devs[dev]->flags & DMA_DUPLEX) - info |= DSP_CAP_DUPLEX; - - if (audio_devs[dev]->coproc) - info |= DSP_CAP_COPROC; - - if (audio_devs[dev]->local_qlen) /* Dev. has hidden buffs */ - info |= DSP_CAP_BATCH; - - if (audio_devs[dev]->trigger) /* Supports SETTRIGGER */ - info |= DSP_CAP_TRIGGER; - - info |= DSP_CAP_MMAP; - bcopy((char *) &info, &(((char *) arg)[0]), sizeof(info)); - return 0; - } - break; - - - case FIOASYNC: - return *(int *) arg = 1; - - case FIONBIO: - return *(int *) arg = 1; - - default: - return DMAbuf_ioctl(dev, cmd, arg, 0); - } -} - -#ifdef ALLOW_POLL -/* - * XXX should we use spltty() in the select calls ? - lr970714 - * - */ - -int -audio_poll(int dev, struct fileinfo * file, int events, select_table * wait) -{ - dev = dev >> 4; - - if (events & (POLLIN | POLLRDNORM)) { - if ((audio_mode[dev] & AM_WRITE) && - !(audio_devs[dev]->flags & DMA_DUPLEX)) - return 0; /* Not recording */ - - - return (DMAbuf_poll(dev, file, events, wait)); - } - - if (events & (POLLOUT | POLLWRNORM)) { - if ((audio_mode[dev] & AM_READ) && - !(audio_devs[dev]->flags & DMA_DUPLEX)) - return 0; /* Wrong direction */ - - if (wr_buff_no[dev] != -1) - return 1; /* There is space in the current buffer */ - - return ( DMAbuf_poll(dev, file, events, wait) ); - - } - return 0; -} -#endif /* ALLOW_POLL */ - -#endif diff --git a/sys/i386/isa/sound/coproc.h b/sys/i386/isa/sound/coproc.h deleted file mode 100644 index f902382..0000000 --- a/sys/i386/isa/sound/coproc.h +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Definitions for various on board processors on the soundcards. For - * example DSP processors. - */ - -/* - * Coprocessor access types - */ -#define COPR_CUSTOM 0x0001 /* Custom applications */ -#define COPR_MIDI 0x0002 /* MIDI (MPU-401) emulation */ -#define COPR_PCM 0x0004 /* Digitized voice applications */ -#define COPR_SYNTH 0x0008 /* Music synthesis */ diff --git a/sys/i386/isa/sound/cs4232.c b/sys/i386/isa/sound/cs4232.c deleted file mode 100644 index e5b8726..0000000 --- a/sys/i386/isa/sound/cs4232.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * sound/cs4232.c - * - * The low level driver for Crystal CS4232 based cards. The CS4232 is a PnP - * compatible chip which contains a CS4231A codec, SB emulation, a MPU401 - * compatible MIDI port, joystick and synthesizer and IDE CD-ROM interfaces. - * This is just a temporary driver until full PnP support gets inplemented. - * Just the WSS codec, FM synth and the MIDI ports are supported. Other - * interfaces are left uninitialized. - * - * 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. - * - * $FreeBSD$ - */ - -#include - -#if defined(CONFIG_CS4232) - -#define KEY_PORT 0x279 /* Same as LPT1 status port */ -#define CSN_NUM 0x99 /* Just a random number */ - -#define CS_OUT(a) outb( KEY_PORT, a) -#define CS_OUT2(a, b) {CS_OUT(a);CS_OUT(b);} -#define CS_OUT3(a, b, c) {CS_OUT(a);CS_OUT(b);CS_OUT(c);} - -static int mpu_base = 0, mpu_irq = 0; - -int -probe_cs4232_mpu(struct address_info * hw_config) -{ - /* - * Just write down the config values. - */ - - mpu_base = hw_config->io_base; - mpu_irq = hw_config->irq; - return 0; -} - -void -attach_cs4232_mpu(struct address_info * hw_config) -{ -} - -static unsigned char crystal_key[] = /* A 32 byte magic key sequence */ -{ - 0x96, 0x35, 0x9a, 0xcd, 0xe6, 0xf3, 0x79, 0xbc, - 0x5e, 0xaf, 0x57, 0x2b, 0x15, 0x8a, 0xc5, 0xe2, - 0xf1, 0xf8, 0x7c, 0x3e, 0x9f, 0x4f, 0x27, 0x13, - 0x09, 0x84, 0x42, 0xa1, 0xd0, 0x68, 0x34, 0x1a -}; - -int -probe_cs4232(struct address_info * hw_config) -{ - int i; - int base = hw_config->io_base, irq = hw_config->irq; - int dma1 = hw_config->dma, dma2 = hw_config->dma2; - - /* - * Verify that the I/O port range is free. - */ - - if (0) { - printf("cs4232.c: I/O port 0x%03x not free\n", base); - return 0; - } - /* - * This version of the driver doesn't use the PnP method when - * configuring the card but a simplified method defined by Crystal. - * This means that just one CS4232 compatible device can exist on the - * system. Also this method conflicts with possible PnP support in - * the OS. For this reason driver is just a temporary kludge. - */ - - /* - * Wake up the card by sending a 32 byte Crystal key to the key port. - */ - for (i = 0; i < 32; i++) - CS_OUT(crystal_key[i]); - - /* - * Now set the CSN (Card Select Number). - */ - - CS_OUT2(0x06, CSN_NUM); - - /* - * Ensure that there is no other codec using the same address. - */ - - CS_OUT2(0x15, 0x00); /* Select logical device 0 (WSS/SB/FM) */ - CS_OUT2(0x33, 0x00); /* Inactivate logical dev 0 */ - - /* - * Then set some config bytes. First logical device 0 - */ - - CS_OUT2(0x15, 0x00); /* Select logical device 0 (WSS/SB/FM) */ - CS_OUT3(0x47, (base >> 8) & 0xff, base & 0xff); /* WSSbase */ - - if (0) /* Not free */ - CS_OUT3(0x48, 0x00, 0x00) /* FMbase off */ - else - CS_OUT3(0x48, 0x03, 0x88); /* FMbase 0x388 */ - - CS_OUT3(0x42, 0x00, 0x00); /* SBbase off */ - CS_OUT2(0x22, irq); /* SB+WSS IRQ */ - CS_OUT2(0x2a, dma1); /* SB+WSS DMA */ - - if (dma2 != -1) - CS_OUT2(0x25, dma2) /* WSS DMA2 */ - else - CS_OUT2(0x25, 4); /* No WSS DMA2 */ - - CS_OUT2(0x33, 0x01); /* Activate logical dev 0 */ - - /* - * Initialize logical device 3 (MPU) - */ - -#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) - if (mpu_base != 0 && mpu_irq != 0) { - CS_OUT2(0x15, 0x03); /* Select logical device 3 (MPU) */ - CS_OUT3(0x47, (mpu_base >> 8) & 0xff, mpu_base & 0xff); /* MPUbase */ - CS_OUT2(0x22, mpu_irq); /* MPU IRQ */ - CS_OUT2(0x33, 0x01); /* Activate logical dev 3 */ - } -#endif - - /* - * Finally activate the chip - */ - CS_OUT(0x79); - - /* - * Then try to detect the codec part of the chip - */ - - return ad1848_detect(hw_config->io_base, NULL, hw_config->osp); -} - -void -attach_cs4232(struct address_info * hw_config) -{ - int base = hw_config->io_base, irq = hw_config->irq; - int dma1 = hw_config->dma, dma2 = hw_config->dma2; - - if (dma2 == -1) - dma2 = dma1; - - ad1848_init("CS4232", base, - irq, - dma1, /* Playback DMA */ - dma2, /* Capture DMA */ - 0, - hw_config->osp); - -#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) - if (mpu_base != 0 && mpu_irq != 0) { - static struct address_info hw_config2 = - {0}; /* Ensure it's initialized */ - - hw_config2.io_base = mpu_base; - hw_config2.irq = mpu_irq; - hw_config2.dma = -1; - hw_config2.dma2 = -1; - hw_config2.always_detect = 0; - hw_config2.name = NULL; - hw_config2.card_subtype = 0; - hw_config2.osp = hw_config->osp; - - if (probe_mpu401(&hw_config2)) - attach_mpu401(&hw_config2); - else - mpu_base = mpu_irq = 0; - } -#endif -} - -#endif diff --git a/sys/i386/isa/sound/dev_table.c b/sys/i386/isa/sound/dev_table.c deleted file mode 100644 index 17726cd..0000000 --- a/sys/i386/isa/sound/dev_table.c +++ /dev/null @@ -1,259 +0,0 @@ -/* - * sound/dev_table.c - * - * Device call tables. - * - * 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. - * - * $FreeBSD$ - */ - -#define _DEV_TABLE_C_ -#include - -#if NSND > 0 - -int sound_started = 0; - -int sndtable_get_cardcount(void); -int snd_find_driver(int type); -static void sndtable_init(void); -int sndtable_probe(int unit, struct address_info * hw_config); -int sndtable_init_card(int unit, struct address_info * hw_config); -static void start_services(void); -static void start_cards(void); -struct address_info *sound_getconf(int card_type); - -int -snd_find_driver(int type) -{ - int i, n = num_sound_drivers; - - for (i = 0; i < n; i++) - if (sound_drivers[i].card_type == type) - return i; - - return -1; -} - -static void -start_services() -{ - int soundcards_installed; - - if (!(soundcards_installed = sndtable_get_cardcount())) - return ; /* No cards detected */ - -#ifdef CONFIG_AUDIO - if (num_audiodevs) /* Audio devices present */ - DMAbuf_init(); -#endif - -#ifdef CONFIG_MIDI - if (num_midis) - /* MIDIbuf_init(0) */; -#endif - -#ifdef CONFIG_SEQUENCER - if (num_midis + num_synths) - sequencer_init(); -#endif -} - -static void -start_cards() -{ - int drv, i, n = num_sound_cards; - struct card_info *ci = snd_installed_cards ; - - sound_started = 1; - if (trace_init) - printf("Sound initialization started\n"); - - /* - * Check the number of cards actually defined in the table - */ - - for (i = 0; i < n && snd_installed_cards[i].card_type; i++) - num_sound_cards = i + 1; - - for (i = 0; i < n && ci->card_type; ci++, i++) - if (ci->enabled) { - if ((drv = snd_find_driver(ci->card_type)) == -1) { - ci->enabled = 0; /* Mark as not detected */ - continue; - } - ci->config.card_subtype = sound_drivers[drv].card_subtype; - - if (sound_drivers[drv].probe(&(ci->config))) - sound_drivers[drv].attach(&(ci->config)); - else - ci->enabled = 0; /* Mark as not detected */ - } - if (trace_init) - printf("Sound initialization complete\n"); -} - -static void -sndtable_init() -{ - start_cards(); -} - -/* - * sndtable_probe probes a specific device. unit is the voxware unit number. - */ - -int -sndtable_probe(int unit, struct address_info * hw_config) -{ - int i, sel = -1, n = num_sound_cards; - struct card_info *ci = snd_installed_cards ; - - DDB(printf("-- sndtable_probe(%d)\n", unit)); - - - /* - * for some reason unit 0 always succeeds ? - */ - if (!unit) - return TRUE; - - sound_started = 1; - - for (i=0; icard_type; ci++, i++) - if ( (ci->enabled) && (ci->card_type == unit) ) { - /* DDB(printf("-- found card %d\n", i) ); */ - sel = i; /* and break */ - } - - /* - * not found. Creates a new entry in the table for this unit. - */ - if (sel == -1 && num_sound_cards < max_sound_cards) { - int i; - - i = sel = (num_sound_cards++); - DDB(printf("-- installing card %d\n", i) ); - - ci = &snd_installed_cards[sel] ; - ci->card_type = unit; - ci->enabled = 1; - } - /* DDB(printf("-- installed card %d\n", sel) ); */ - if (sel != -1) { - int drv; - - ci->config.io_base = hw_config->io_base; - ci->config.irq = hw_config->irq; - ci->config.dma = hw_config->dma; - ci->config.dma2 = hw_config->dma2; - ci->config.name = hw_config->name; - ci->config.always_detect = hw_config->always_detect; - ci->config.card_subtype = hw_config->card_subtype; - ci->config.osp = hw_config->osp; - - if ((drv = snd_find_driver(ci->card_type)) == -1) { - ci->enabled = 0; - DDB(printf("Failed to find driver\n")); - return FALSE; - } - DDB(printf("-- Driver name '%s' probe 0x%08x\n", - sound_drivers[drv].name, sound_drivers[drv].probe)); - - hw_config->card_subtype = - ci->config.card_subtype = sound_drivers[drv].card_subtype; - - if (sound_drivers[drv].probe(hw_config)) { - DDB(printf("-- Hardware probed OK\n")); - return TRUE; - } - DDB(printf("-- Failed to find hardware\n")); - ci->enabled = 0; /* mark as not detected */ - return FALSE; - } - return FALSE; -} - -int -sndtable_init_card(int unit, struct address_info * hw_config) -{ - int i, n = num_sound_cards; - struct card_info *ci = snd_installed_cards ; - - DDB(printf("sndtable_init_card(%d) entered\n", unit)); - - if (!unit) { - sndtable_init() ; - return TRUE; - } - for (i = 0; i < n && ci->card_type; ci++, i++) - if (ci->card_type == unit) { - int drv; - - ci->config.io_base = hw_config->io_base; - ci->config.irq = hw_config->irq; - ci->config.dma = hw_config->dma; - ci->config.dma2 = hw_config->dma2; - ci->config.name = hw_config->name; - ci->config.always_detect = hw_config->always_detect; - ci->config.card_subtype = hw_config->card_subtype; - ci->config.osp = hw_config->osp; - - if ((drv = snd_find_driver(ci->card_type)) == -1) - ci->enabled = 0; /* Mark not fnd */ - else { - DDB(printf("Located card - calling attach routine\n")); - sound_drivers[drv].attach(hw_config) ; - DDB(printf("attach routine finished\n")); - } - start_services(); - return TRUE; - } - DDB(printf("sndtable_init_card: No card defined with type=%d, num cards: %d\n", - unit, num_sound_cards)); - return FALSE; -} - -int -sndtable_get_cardcount(void) -{ - return num_audiodevs + num_mixers + num_synths + num_midis; -} - -struct address_info * -sound_getconf(int card_type) -{ - int j, ptr = -1, n = num_sound_cards; - - for (j = 0; j < n && ptr == -1 && snd_installed_cards[j].card_type; j++) - if (snd_installed_cards[j].card_type == card_type) - ptr = j; - - if (ptr == -1) - return (struct address_info *) NULL; - - return &snd_installed_cards[ptr].config; -} - -#endif diff --git a/sys/i386/isa/sound/dev_table.h b/sys/i386/isa/sound/dev_table.h deleted file mode 100644 index f355163..0000000 --- a/sys/i386/isa/sound/dev_table.h +++ /dev/null @@ -1,604 +0,0 @@ -/* - * dev_table.h - * - * Global definitions for device call tables - * - * 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. - * - */ - -#ifndef _DEV_TABLE_H_ -#define _DEV_TABLE_H_ - -/* - * NOTE! NOTE! NOTE! NOTE! - * - * If you modify this file, please check the dev_table.c also. - * - * NOTE! NOTE! NOTE! NOTE! - */ - -extern int sound_started; - -struct driver_info { - char *driver_id; - int card_subtype; /* Driver specific. Usually 0 */ - int card_type; /* From soundcard.h */ - char *name; - void (*attach) (struct address_info * hw_config); - int (*probe) (struct address_info * hw_config); -}; - -struct card_info { - int card_type; /* Link (search key) to the driver list */ - struct address_info config; - int enabled; -}; - -typedef struct pnp_sounddev { - int id; - void (*setup) (void *dev); - char *driver_name; -} pnp_sounddev; - -/* - * Device specific parameters (used only by dmabuf.c) - */ -#define MAX_SUB_BUFFERS (32*MAX_REALTIME_FACTOR) - -#define DMODE_NONE 0 -#define DMODE_OUTPUT 1 -#define DMODE_INPUT 2 - -struct dma_buffparms { - int dma_mode; /* DMODE_INPUT, DMODE_OUTPUT or DMODE_NONE */ - - char *raw_buf; /* Pointers to raw buffers */ - u_long raw_buf_phys; - - /* - * Device state tables - */ - - u_long flags; -#define DMA_BUSY 0x00000001 -#define DMA_RESTART 0x00000002 -#define DMA_ACTIVE 0x00000004 -#define DMA_STARTED 0x00000008 -#define DMA_ALLOC_DONE 0x00000020 - - int open_mode; - - /* - * Queue parameters. - */ - int qlen; - int qhead; - int qtail; - - int nbufs; - int counts[MAX_SUB_BUFFERS]; - int subdivision; - - int fragment_size; - int max_fragments; - - int bytes_in_use; - - int underrun_count; - int byte_counter; - - int mapping_flags; -#define DMA_MAP_MAPPED 0x00000001 - char neutral_byte; - int dma_chan; -}; - -/* - * Structure for use with various microcontrollers and DSP processors in the - * recent soundcards. - */ -typedef struct coproc_operations { - char name[32]; - int (*open) (void *devc, int sub_device); - void (*close) (void *devc, int sub_device); - int (*ioctl) (void *devc, u_int cmd, ioctl_arg arg, int local); - void (*reset) (void *devc); - - void *devc; /* Driver specific info */ -} coproc_operations; - -struct audio_operations { - char name[32]; - int flags; -#define NOTHING_SPECIAL 0 -#define NEEDS_RESTART 1 -#define DMA_AUTOMODE 2 -#define DMA_DUPLEX 4 -#define DMA_DISABLE 8 - int format_mask; /* Bitmask for supported audio formats */ - void *devc; /* Driver specific info */ - int (*open) (int dev, int mode); - void (*close) (int dev); - void (*output_block) (int dev, unsigned long buf, - int count, int intrflag, int dma_restart); - void (*start_input) (int dev, unsigned long buf, - int count, int intrflag, int dma_restart); - int (*ioctl) (int dev, u_int cmd, ioctl_arg arg, int local); - int (*prepare_for_input) (int dev, int bufsize, int nbufs); - int (*prepare_for_output) (int dev, int bufsize, int nbufs); - void (*reset) (int dev); - void (*halt_xfer) (int dev); - int (*local_qlen) (int dev); - void (*copy_from_user) (int dev, char *localbuf, int localoffs, - snd_rw_buf * userbuf, int useroffs, int len); - void (*halt_input) (int dev); - void (*halt_output) (int dev); - void (*trigger) (int dev, int bits); - long buffsize; - int dmachan1, dmachan2; - struct dma_buffparms *dmap_in, *dmap_out; - struct coproc_operations *coproc; - int mixer_dev; - int enable_bits; - int open_mode; - int go; - int otherside; - int busy; -}; - -struct mixer_operations { - char name[32]; - int (*ioctl) (int dev, unsigned int cmd, ioctl_arg arg); -}; - -struct synth_operations { - struct synth_info *info; - int midi_dev; - int synth_type; - int synth_subtype; - - int (*open) (int dev, int mode); - void (*close) (int dev); - int (*ioctl) (int dev, unsigned int cmd, ioctl_arg arg); - int (*kill_note) (int dev, int voice, int note, int velocity); - int (*start_note) (int dev, int voice, int note, int velocity); - int (*set_instr) (int dev, int voice, int instr); - void (*reset) (int dev); - void (*hw_control) (int dev, unsigned char *event); - int (*load_patch) (int dev, int format, snd_rw_buf * addr, - int offs, int count, int pmgr_flag); - void (*aftertouch) (int dev, int voice, int pressure); - void (*controller) (int dev, int voice, int ctrl_num, int value); - void (*panning) (int dev, int voice, int value); - void (*volume_method) (int dev, int mode); - int (*pmgr_interface) (int dev, struct patmgr_info * info); - void (*bender) (int dev, int chn, int value); - int (*alloc_voice) (int dev, int chn, int note, struct voice_alloc_info * alloc); - void (*setup_voice) (int dev, int voice, int chn); - int (*send_sysex) (int dev, unsigned char *bytes, int len); - - struct voice_alloc_info alloc; - struct channel_info chn_info[16]; -}; - -struct midi_input_info { /* MIDI input scanner variables */ -#define MI_MAX 10 - int m_busy; - unsigned char m_buf[MI_MAX]; - unsigned char m_prev_status; /* For running status */ - int m_ptr; -#define MST_INIT 0 -#define MST_DATA 1 -#define MST_SYSEX 2 - int m_state; - int m_left; -}; - -struct midi_operations { - struct midi_info info; - struct synth_operations *converter; - struct midi_input_info in_info; - int (*open) (int dev, int mode, - void (*inputintr) (int dev, unsigned char data), - void (*outputintr) (int dev) ); - void (*close) (int dev); - int (*ioctl) (int dev, unsigned int cmd, ioctl_arg arg); - int (*putc) (int dev, unsigned char data); - int (*start_read) (int dev); - int (*end_read) (int dev); - void (*kick) (int dev); - int (*command) (int dev, unsigned char *data); - int (*buffer_status) (int dev); - int (*prefix_cmd) (int dev, unsigned char status); - struct coproc_operations *coproc; -}; - -struct sound_lowlev_timer { - int dev; - u_int (*tmr_start) (int dev, unsigned int usecs); - void (*tmr_disable) (int dev); - void (*tmr_restart) (int dev); -}; - -struct sound_timer_operations { - struct sound_timer_info info; - int priority; - int devlink; - int (*open) (int dev, int mode); - void (*close) (int dev); - int (*event) (int dev, unsigned char *ev); - u_long (*get_time) (int dev); - int (*ioctl) (int dev, unsigned int cmd, ioctl_arg arg); - void (*arm_timer) (int dev, long time); -}; - -#ifdef _DEV_TABLE_C_ -struct audio_operations *audio_devs[MAX_AUDIO_DEV] = {NULL}; -int num_audiodevs = 0; -struct mixer_operations *mixer_devs[MAX_MIXER_DEV] = {NULL}; -int num_mixers = 0; -struct synth_operations *synth_devs[MAX_SYNTH_DEV + MAX_MIDI_DEV] = {NULL}; -int num_synths = 0; -struct midi_operations *midi_devs[MAX_MIDI_DEV] = {NULL}; -int num_midis = 0; - -#ifdef CONFIG_SEQUENCER -extern struct sound_timer_operations default_sound_timer; -struct sound_timer_operations *sound_timer_devs[MAX_TIMER_DEV] = - {&default_sound_timer, NULL}; -int num_sound_timers = 1; -#else -struct sound_timer_operations *sound_timer_devs[MAX_TIMER_DEV] = {NULL}; -int num_sound_timers = 0; -#endif - -/* - * List of low level drivers compiled into the kernel. - * - * remember, each entry contains: - - char *driver_id; - int card_subtype; (Driver specific. Usually 0) - int card_type; (From soundcard.h) - char *name; - void (*attach) (struct address_info * hw_config); - int (*probe) (struct address_info * hw_config); - * - */ - -struct driver_info sound_drivers[] = { - -#ifdef CONFIG_PSS - {"PSSECHO", 0, SNDCARD_PSS, "Echo Personal Sound System PSS (ESC614)", - attach_pss, probe_pss}, - {"PSSMPU", 0, SNDCARD_PSS_MPU, "PSS-MPU", - attach_pss_mpu, probe_pss_mpu}, - {"PSSMSS", 0, SNDCARD_PSS_MSS, "PSS-MSS", - attach_pss_mss, probe_pss_mss}, -#endif - -#ifdef CONFIG_MSS - /* XXX changed type from 0 to 1 -lr 970705 */ - {"MSS", 1, SNDCARD_MSS, "MS Sound System", - attach_mss, probe_mss}, - /* MSS without IRQ/DMA config registers (for DEC Alphas) */ - {"PCXBJ", 1, SNDCARD_PSEUDO_MSS, "MS Sound System (AXP)", - attach_mss, probe_mss}, -#endif - -#ifdef CONFIG_MAD16 - {"MAD16", 0, SNDCARD_MAD16, "MAD16/Mozart (MSS)", - attach_mad16, probe_mad16}, - {"MAD16MPU", 0, SNDCARD_MAD16_MPU, "MAD16/Mozart (MPU)", - attach_mad16_mpu, probe_mad16_mpu}, -#endif - -#ifdef CONFIG_CS4232 - {"CS4232", 0, SNDCARD_CS4232, "CS4232", - attach_cs4232, probe_cs4232}, - {"CS4232MPU", 0, SNDCARD_CS4232_MPU, "CS4232 MIDI", - attach_cs4232_mpu, probe_cs4232_mpu}, -#endif - -#ifdef CONFIG_YM3812 - {"OPL3", 0, SNDCARD_ADLIB, "OPL-2/OPL-3 FM", - attach_adlib_card, probe_adlib}, -#endif - -#ifdef CONFIG_PAS - {"PAS16", 0, SNDCARD_PAS, "ProAudioSpectrum", - attach_pas_card, probe_pas}, -#endif - -#if defined(CONFIG_MPU401) && defined(CONFIG_MIDI) - {"MPU401", 0, SNDCARD_MPU401, "Roland MPU-401", - attach_mpu401, probe_mpu401}, -#endif - -#if defined(CONFIG_MAUI) - {"MAUI", 0, SNDCARD_MAUI, "TB Maui", - attach_maui, probe_maui}, -#endif - -#if defined(CONFIG_UART6850) && defined(CONFIG_MIDI) - {"MIDI6850", 0, SNDCARD_UART6850, "6860 UART Midi", - attach_uart6850, probe_uart6850}, -#endif - -#ifdef CONFIG_SB - {"SBLAST", 0, SNDCARD_SB, "SoundBlaster", - attach_sb_card, probe_sb}, -#endif - -#if defined(CONFIG_SB) && defined(CONFIG_SB16) -#ifdef CONFIG_AUDIO - {"SB16", 0, SNDCARD_SB16, "SoundBlaster16", - sb16_dsp_init, sb16_dsp_detect}, -#endif -#ifdef CONFIG_AWE32 - {"AWE32", 0, SNDCARD_AWE32, "AWE32 Synth", - attach_awe, probe_awe}, -#endif -#ifdef CONFIG_MIDI - {"SB16MIDI", 0, SNDCARD_SB16MIDI, "SB16 MIDI", - attach_sb16midi, probe_sb16midi}, -#endif -#endif - -#ifdef CONFIG_GUS16 - {"GUS16", 0, SNDCARD_GUS16, "Ultrasound 16-bit opt.", - attach_gus_db16, probe_gus_db16}, -#endif - -#ifdef CONFIG_GUS - {"GUS", 0, SNDCARD_GUS, "Gravis Ultrasound", - attach_gus_card, probe_gus}, -#endif - -#ifdef CONFIG_SSCAPE - {"SSCAPE", 0, SNDCARD_SSCAPE, "Ensoniq Soundscape", - attach_sscape, probe_sscape}, - {"SSCAPEMSS", 0, SNDCARD_SSCAPE_MSS, "MS Sound System (SoundScape)", - attach_ss_mss, probe_ss_mss}, -#endif - -#if NTRIX > 0 - {"TRXPRO", 0, SNDCARD_TRXPRO, "MediaTriX AudioTriX Pro", - attach_trix_wss, probe_trix_wss}, - {"TRXPROSB", 0, SNDCARD_TRXPRO_SB, "AudioTriX (SB mode)", - attach_trix_sb, probe_trix_sb}, - {"TRXPROMPU", 0, SNDCARD_TRXPRO_MPU, "AudioTriX MIDI", - attach_trix_mpu, probe_trix_mpu}, -#endif - -#ifdef CONFIG_PNP - {"AD1848", 0, 500, "PnP MSS", - attach_pnp_ad1848, probe_pnp_ad1848}, -#endif - -#ifdef CONFIG_NSS - {"NSS", 0, SNDCARD_NSS, "NEC PC-9801-86 Sound System", - attach_nss, probe_nss}, -#endif - - {NULL, 0, 0, "*?*", NULL, NULL} -}; - -int num_sound_drivers = -sizeof(sound_drivers) / sizeof(struct driver_info); -int max_sound_drivers = -sizeof(sound_drivers) / sizeof(struct driver_info); - -#define FULL_SOUND - -#ifndef FULL_SOUND -/* - * List of devices actually configured in the system. - * - * Note! The detection order is significant. Don't change it. - * - * remember, the list contains - * - * int card_type; (Link (search key) to the driver list) - * struct address_info config; - * io_base, irq, dma, dma2, - * always_detect, char *name, struct... *osp - * int enabled; - * void *for_driver_use; - * - */ - -struct card_info snd_installed_cards[] = { -#ifdef CONFIG_PSS - {SNDCARD_PSS, {PSS_BASE, 0, -1, -1}, SND_DEFAULT_ENABLE}, -#ifdef PSS_MPU_BASE - {SNDCARD_PSS_MPU, {PSS_MPU_BASE, PSS_MPU_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#endif -#ifdef PSS_MSS_BASE - {SNDCARD_PSS_MSS, {PSS_MSS_BASE, PSS_MSS_IRQ, PSS_MSS_DMA, -1}, SND_DEFAULT_ENABLE}, -#endif -#endif /* config PSS */ - -#if NTRIX > 0 - {SNDCARD_TRXPRO, {TRIX_BASE, TRIX_IRQ, TRIX_DMA, TRIX_DMA2}, SND_DEFAULT_ENABLE}, -#ifdef TRIX_SB_BASE - {SNDCARD_TRXPRO_SB, {TRIX_SB_BASE, TRIX_SB_IRQ, TRIX_SB_DMA, -1}, SND_DEFAULT_ENABLE}, -#endif -#ifdef TRIX_MPU_BASE - {SNDCARD_TRXPRO_MPU, {TRIX_MPU_BASE, TRIX_MPU_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#endif -#endif /* NTRIX > 0 */ - -#ifdef CONFIG_SSCAPE - {SNDCARD_SSCAPE, {SSCAPE_BASE, SSCAPE_IRQ, SSCAPE_DMA, -1}, SND_DEFAULT_ENABLE}, - {SNDCARD_SSCAPE_MSS, {SSCAPE_MSS_BASE, SSCAPE_MSS_IRQ, SSCAPE_MSS_DMA, -1}, SND_DEFAULT_ENABLE}, -#endif - -#ifdef CONFIG_MAD16 - {SNDCARD_MAD16, {MAD16_BASE, MAD16_IRQ, MAD16_DMA, MAD16_DMA2}, SND_DEFAULT_ENABLE}, -#ifdef MAD16_MPU_BASE - {SNDCARD_MAD16_MPU, {MAD16_MPU_BASE, MAD16_MPU_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#endif -#endif /* CONFIG_MAD16 */ - -#ifdef CONFIG_CS4232 -#ifdef CS4232_MPU_BASE - {SNDCARD_CS4232_MPU, {CS4232_MPU_BASE, CS4232_MPU_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#endif - {SNDCARD_CS4232, {CS4232_BASE, CS4232_IRQ, CS4232_DMA, CS4232_DMA2}, SND_DEFAULT_ENABLE}, -#endif - -#ifdef CONFIG_MSS -#ifdef PSEUDO_MSS - {SNDCARD_MSS, {MSS_BASE, MSS_IRQ, MSS_DMA, -1}, SND_DEFAULT_ENABLE}, -#else - {SNDCARD_PSEUDO_MSS, {MSS_BASE, MSS_IRQ, MSS_DMA, -1}, SND_DEFAULT_ENABLE}, -#endif -#ifdef MSS2_BASE - {SNDCARD_MSS, {MSS2_BASE, MSS2_IRQ, MSS2_DMA, -1}, SND_DEFAULT_ENABLE}, -#endif -#endif /* CONFIG_MSS */ - -#ifdef CONFIG_PAS - {SNDCARD_PAS, {PAS_BASE, PAS_IRQ, PAS_DMA, -1}, SND_DEFAULT_ENABLE}, -#endif - -#ifdef CONFIG_SB -#ifndef SBC_DMA -#define SBC_DMA 1 -#endif - {SNDCARD_SB, {SBC_BASE, SBC_IRQ, SBC_DMA, -1}, SND_DEFAULT_ENABLE}, -#endif - -#if defined(CONFIG_MAUI) - {SNDCARD_MAUI, {MAUI_BASE, MAUI_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#endif - -#if defined(CONFIG_MPU401) && defined(CONFIG_MIDI) - {SNDCARD_MPU401, {MPU_BASE, MPU_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#ifdef MPU2_BASE - {SNDCARD_MPU401, {MPU2_BASE, MPU2_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#endif -#ifdef MPU3_BASE - {SNDCARD_MPU401, {MPU3_BASE, MPU2_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#endif -#endif - -#if defined(CONFIG_UART6850) && defined(CONFIG_MIDI) - {SNDCARD_UART6850, {U6850_BASE, U6850_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#endif - -#if defined(CONFIG_SB) && defined(CONFIG_SB16) -#ifdef CONFIG_AUDIO - {SNDCARD_SB16, {SBC_BASE, SBC_IRQ, SB16_DMA, -1}, SND_DEFAULT_ENABLE}, -#endif -#ifdef CONFIG_MIDI - {SNDCARD_SB16MIDI, {SB16MIDI_BASE, SBC_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#endif -#ifdef CONFIG_AWE32 - {SNDCARD_AWE32,{AWE32_BASE, 0, 0, -1}, SND_DEFAULT_ENABLE}, -#endif -#endif - -#ifdef CONFIG_GUS -#ifdef CONFIG_GUS16 - {SNDCARD_GUS16, {GUS16_BASE, GUS16_IRQ, GUS16_DMA, -1}, SND_DEFAULT_ENABLE}, -#endif - {SNDCARD_GUS, {GUS_BASE, GUS_IRQ, GUS_DMA, GUS_DMA2}, SND_DEFAULT_ENABLE}, -#endif - -#ifdef CONFIG_YM3812 - {SNDCARD_ADLIB, {FM_MONO, 0, 0, -1}, SND_DEFAULT_ENABLE}, -#endif - -#ifdef CONFIG_NSS - {SNDCARD_NSS, {NSS_BASE, NSS_IRQ, 0, -1}, SND_DEFAULT_ENABLE}, -#endif - /* Define some expansion space */ - {0, {0}, 0}, - {0, {0}, 0}, - {0, {0}, 0}, - {0, {0}, 0}, - {0, {0}, 0} -}; - -int num_sound_cards = sizeof(snd_installed_cards) / sizeof(struct card_info); -int max_sound_cards = sizeof(snd_installed_cards) / sizeof(struct card_info); - -#else -int num_sound_cards = 0; -struct card_info snd_installed_cards[20] = {{0}}; -int max_sound_cards = 20; -#endif - -#ifdef MODULE -int trace_init = 0; -#else -int trace_init = 1; -#endif - -#else -extern struct audio_operations *audio_devs[MAX_AUDIO_DEV]; -extern int num_audiodevs; -extern struct mixer_operations *mixer_devs[MAX_MIXER_DEV]; -extern int num_mixers; -extern struct synth_operations *synth_devs[MAX_SYNTH_DEV + MAX_MIDI_DEV]; -extern int num_synths; -extern struct midi_operations *midi_devs[MAX_MIDI_DEV]; -extern int num_midis; -extern struct sound_timer_operations *sound_timer_devs[MAX_TIMER_DEV]; -extern int num_sound_timers; - -extern struct driver_info sound_drivers[]; -extern int num_sound_drivers; -extern int max_sound_drivers; -extern struct card_info snd_installed_cards[]; -extern int num_sound_cards; -extern int max_sound_cards; - -extern int trace_init; - -void sndtable_init(void); -int sndtable_get_cardcount(void); -struct address_info *sound_getconf(int card_type); -void sound_chconf(int card_type, int ioaddr, int irq, int dma); -int snd_find_driver(int type); -int sndtable_identify_card(char *name); -void sound_setup(char *str, int *ints); - -int sound_alloc_dmap(int dev, struct dma_buffparms * dmap, int chan); -void sound_free_dmap(int dev, struct dma_buffparms * dmap); -extern int soud_map_buffer(int dev, struct dma_buffparms * dmap, buffmem_desc * info); -void install_pnp_sounddrv(struct pnp_sounddev * drv); -int sndtable_probe(int unit, struct address_info * hw_config); -int sndtable_init_card(int unit, struct address_info * hw_config); -void sound_timer_init(struct sound_lowlev_timer * t, char *name); -int -sound_start_dma(int dev, struct dma_buffparms * dmap, int chan, - unsigned long physaddr, - int count, int dma_mode, int autoinit); -void sound_dma_intr(int dev, struct dma_buffparms * dmap, int chan); - -#endif /* _DEV_TABLE_C_ */ -#endif /* _DEV_TABLE_H_ */ diff --git a/sys/i386/isa/sound/dmabuf.c b/sys/i386/isa/sound/dmabuf.c deleted file mode 100644 index 383793d..0000000 --- a/sys/i386/isa/sound/dmabuf.c +++ /dev/null @@ -1,1606 +0,0 @@ -/* - * sound/dmabuf.c - * - * The DMA buffer manager for digitized voice applications - * - * Copyright by Hannu Savolainen 1993, 1994, 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. - * - * $FreeBSD$ - */ - -#include - -#include - -#include - -#if defined(CONFIG_AUDIO) || defined(CONFIG_GUS) -#ifdef ALLOW_POLL - -int -DMAbuf_poll(int dev, struct fileinfo * file, int events, select_table * wait); -#endif; - -static void -reorganize_buffers(int dev, struct dma_buffparms * dmap); - -static int *in_sleeper[MAX_AUDIO_DEV] = {NULL}; -static volatile struct snd_wait in_sleep_flag[MAX_AUDIO_DEV] = {{0}}; -static int *out_sleeper[MAX_AUDIO_DEV] = {NULL}; -static volatile struct snd_wait out_sleep_flag[MAX_AUDIO_DEV] = {{0}}; - -static int ndmaps = 0; - -#define MAX_DMAP (MAX_AUDIO_DEV*2) - -static struct dma_buffparms dmaps[MAX_DMAP] = {{0}}; -/* - * Primitive way to allocate such a large array. Needs dynamic run-time - * alloction. - */ - -static int space_in_queue(int dev); - -static void dma_reset_output(int dev); -static void dma_reset_input(int dev); - -static void -reorganize_buffers(int dev, struct dma_buffparms * dmap) -{ - /* - * This routine breaks the physical device buffers to logical ones. - */ - - struct audio_operations *dsp_dev = audio_devs[dev]; - u_int sr, nc; - int bsz, sz, n, i; - - if (dmap->fragment_size == 0) { - /* Compute the fragment size using the default algorithm */ - - sr = dsp_dev->ioctl(dev, SOUND_PCM_READ_RATE, 0, 1); - nc = dsp_dev->ioctl(dev, SOUND_PCM_READ_CHANNELS, 0, 1); - sz = dsp_dev->ioctl(dev, SOUND_PCM_READ_BITS, 0, 1); - - if (sz == 8) - dmap->neutral_byte = 254; - else - dmap->neutral_byte = 0x00; - - if (sr < 1 || nc < 1 || sz < 1) { - printf("Warning: Invalid PCM parameters[%d] sr=%d, nc=%d, sz=%d\n", - dev, sr, nc, sz); - sr = DSP_DEFAULT_SPEED; - nc = 1; - sz = 8; - } - sz = sr * nc * sz; - - sz /= 8; /* #bits -> #bytes */ - - /* - * Compute a buffer size for time not exeeding 1 second. - * Usually this algorithm gives a buffer size for 0.5 to 1.0 - * seconds of sound (using the current speed, sample size and - * #channels). - */ - - bsz = dsp_dev->buffsize; - while (bsz > sz) - bsz /= 2; - - if (bsz == dsp_dev->buffsize) - bsz /= 2; /* Needs at least 2 buffers */ - - if (dmap->subdivision == 0) /* Not already set */ - dmap->subdivision = 1; /* Init to default value */ - else - bsz /= dmap->subdivision; - - if (bsz < 16) - bsz = 16; /* Just a sanity check */ - - dmap->fragment_size = bsz; - } else { - /* - * The process has specified the buffer sice with - * SNDCTL_DSP_SETFRAGMENT or the buffer sice computation has - * already been done. - */ - - if (dmap->fragment_size > (audio_devs[dev]->buffsize / 2)) - dmap->fragment_size = (audio_devs[dev]->buffsize / 2); - bsz = dmap->fragment_size; - } - - bsz &= ~0x03; /* Force size which is multiple of 4 bytes */ -#ifdef OS_DMA_ALIGN_CHECK - OS_DMA_ALIGN_CHECK(bsz); -#endif - - n = dsp_dev->buffsize / bsz; - - if (n > MAX_SUB_BUFFERS) - n = MAX_SUB_BUFFERS; - - if (n > dmap->max_fragments) - n = dmap->max_fragments; - dmap->nbufs = n; - dmap->bytes_in_use = n * bsz; - - for (i = 0; i < dmap->nbufs; i++) { - dmap->counts[i] = 0; - } - - if (dmap->raw_buf) - fillw (dmap->neutral_byte, dmap->raw_buf, - dmap->bytes_in_use/2); - - dmap->flags |= DMA_ALLOC_DONE; - -} - -static void -dma_init_buffers(int dev, struct dma_buffparms * dmap) -{ - if (dmap == audio_devs[dev]->dmap_out) { - out_sleep_flag[dev].aborting = 0; - out_sleep_flag[dev].mode = WK_NONE; - } else { - in_sleep_flag[dev].aborting = 0; - in_sleep_flag[dev].mode = WK_NONE; - } - - dmap->flags = DMA_BUSY; /* Other flags off */ - dmap->qlen = dmap->qhead = dmap->qtail = 0; - dmap->nbufs = 1; - dmap->bytes_in_use = audio_devs[dev]->buffsize; - - dmap->dma_mode = DMODE_NONE; - dmap->mapping_flags = 0; - dmap->neutral_byte = 0x00; -} - -static int -open_dmap(int dev, int mode, struct dma_buffparms * dmap, int chan) -{ - if (dmap->flags & DMA_BUSY) - return -(EBUSY); - -#ifdef RUNTIME_DMA_ALLOC - { - int err; - - if ((err = sound_alloc_dmap(dev, dmap, chan)) < 0) - return err; - } -#endif - - if (dmap->raw_buf == NULL) - return -(ENOSPC); /* Memory allocation failed during boot */ - - if (0) { - printf("Unable to grab(2) DMA%d for the audio driver\n", chan); - return -(EBUSY); - } - dmap->open_mode = mode; - dmap->subdivision = dmap->underrun_count = 0; - dmap->fragment_size = 0; - dmap->max_fragments = 65536; /* Just a large value */ - dmap->byte_counter = 0; - isa_dma_acquire(chan); - dmap->dma_chan = chan; - dma_init_buffers(dev, dmap); - - return 0; -} - -static void -close_dmap(int dev, struct dma_buffparms * dmap, int chan) -{ - if (dmap->flags & DMA_BUSY) - dmap->dma_mode = DMODE_NONE; - dmap->flags &= ~DMA_BUSY; - isa_dma_release(dmap->dma_chan); -#ifdef RUNTIME_DMA_ALLOC - sound_free_dmap(dev, dmap); -#endif -} - -int -DMAbuf_open(int dev, int mode) -{ - int retval; - struct dma_buffparms *dmap_in = NULL; - struct dma_buffparms *dmap_out = NULL; - - if (dev >= num_audiodevs) { - printf("PCM device %d not installed.\n", dev); - return -(ENXIO); - } - if (!audio_devs[dev]) { - printf("PCM device %d not initialized\n", dev); - return -(ENXIO); - } - if (!(audio_devs[dev]->flags & DMA_DUPLEX)) { - audio_devs[dev]->dmap_in = audio_devs[dev]->dmap_out; - audio_devs[dev]->dmachan2 = audio_devs[dev]->dmachan1; - } - if ((retval = audio_devs[dev]->open(dev, mode)) < 0) - return retval; - - dmap_out = audio_devs[dev]->dmap_out; - dmap_in = audio_devs[dev]->dmap_in; - - if ((retval = open_dmap(dev, mode, dmap_out, audio_devs[dev]->dmachan1)) < 0) { - audio_devs[dev]->close(dev); - return retval; - } - audio_devs[dev]->enable_bits = mode; - - if (audio_devs[dev]->flags & DMA_DUPLEX && dmap_out != dmap_in) { - if ((retval = open_dmap(dev, mode, dmap_in, audio_devs[dev]->dmachan2)) < 0) { - audio_devs[dev]->close(dev); - close_dmap(dev, dmap_out, audio_devs[dev]->dmachan1); - return retval; - } - } - audio_devs[dev]->open_mode = mode; - audio_devs[dev]->go = 1; - - in_sleep_flag[dev].aborting = 0; - in_sleep_flag[dev].mode = WK_NONE; - - out_sleep_flag[dev].aborting = 0; - out_sleep_flag[dev].mode = WK_NONE; - - audio_devs[dev]->ioctl(dev, SOUND_PCM_WRITE_BITS, (ioctl_arg) 8, 1); - audio_devs[dev]->ioctl(dev, SOUND_PCM_WRITE_CHANNELS, (ioctl_arg) 1, 1); - audio_devs[dev]->ioctl(dev, SOUND_PCM_WRITE_RATE, (ioctl_arg) DSP_DEFAULT_SPEED, 1); - - return 0; -} - -static void -dma_reset(int dev) -{ - u_long flags; - - flags = splhigh(); - audio_devs[dev]->reset(dev); - splx(flags); - - dma_reset_output(dev); - - if (audio_devs[dev]->flags & DMA_DUPLEX) - dma_reset_input(dev); -} - -static void -dma_reset_output(int dev) -{ - u_long flags; - - flags = splhigh(); - if (!(audio_devs[dev]->flags & DMA_DUPLEX) || - !audio_devs[dev]->halt_output) - audio_devs[dev]->reset(dev); - else - audio_devs[dev]->halt_output(dev); - splx(flags); - - dma_init_buffers(dev, audio_devs[dev]->dmap_out); - reorganize_buffers(dev, audio_devs[dev]->dmap_out); -} - -static void -dma_reset_input(int dev) -{ - u_long flags; - - flags = splhigh(); - if (!(audio_devs[dev]->flags & DMA_DUPLEX) || - !audio_devs[dev]->halt_input) - audio_devs[dev]->reset(dev); - else - audio_devs[dev]->halt_input(dev); - splx(flags); - - dma_init_buffers(dev, audio_devs[dev]->dmap_in); - reorganize_buffers(dev, audio_devs[dev]->dmap_in); -} - -static int -dma_sync(int dev) -{ - u_long flags; - - if (!audio_devs[dev]->go && (!audio_devs[dev]->enable_bits & PCM_ENABLE_OUTPUT)) - return 0; - - if (audio_devs[dev]->dmap_out->dma_mode == DMODE_OUTPUT) { - flags = splhigh(); - - out_sleep_flag[dev].aborting = 0; -#ifdef ALLOW_BUFFER_MAPPING - if(audio_devs[dev]->dmap_out->mapping_flags & DMA_MAP_MAPPED && - audio_devs[dev]->dmap_out->qlen) { - splx(flags); - - return audio_devs[dev]->dmap_out->qlen; - } - -#endif - while (!PROCESS_ABORTING (out_sleep_flag[dev]) - && audio_devs[dev]->dmap_out->qlen){ - int chn; - - out_sleeper[dev] = &chn; - DO_SLEEP1(chn, out_sleep_flag[dev], 10 * hz); - if (TIMED_OUT (out_sleep_flag[dev]) ) { - - splx(flags); - - return audio_devs[dev]->dmap_out->qlen; - - } - } - - - splx(flags); - - /* - * Some devices such as GUS have huge amount of on board RAM - * for the audio data. We have to wait until the device has - * finished playing. - */ - - flags = splhigh(); - if (audio_devs[dev]->local_qlen) { /* Device has hidden buffers */ - while (!(PROCESS_ABORTING (out_sleep_flag[dev])) - && audio_devs[dev]->local_qlen(dev)) { - int chn; - out_sleeper[dev] = &chn; - DO_SLEEP(chn, out_sleep_flag[dev], 10 * hz); - - } - } - splx(flags); - } - return audio_devs[dev]->dmap_out->qlen; -} - -int -DMAbuf_release(int dev, int mode) -{ - u_long flags; - - if (!((out_sleep_flag[dev].aborting)) - && (audio_devs[dev]->dmap_out->dma_mode == DMODE_OUTPUT)) { - dma_sync(dev); - } - flags = splhigh(); - - audio_devs[dev]->close(dev); - - close_dmap(dev, audio_devs[dev]->dmap_out, audio_devs[dev]->dmachan1); - - if (audio_devs[dev]->flags & DMA_DUPLEX) - close_dmap(dev, audio_devs[dev]->dmap_in, audio_devs[dev]->dmachan2); - audio_devs[dev]->open_mode = 0; - - splx(flags); - - return 0; -} - -static int -activate_recording(int dev, struct dma_buffparms * dmap) -{ - if (!(audio_devs[dev]->enable_bits & PCM_ENABLE_INPUT)) - return 0; - - if (dmap->flags & DMA_RESTART) { - dma_reset_input(dev); - dmap->flags &= ~DMA_RESTART; - } - if (dmap->dma_mode == DMODE_OUTPUT) { /* Direction change */ - dma_sync(dev); - dma_reset(dev); - dmap->dma_mode = DMODE_NONE; - } - if (!(dmap->flags & DMA_ALLOC_DONE)) - reorganize_buffers(dev, dmap); - - if (!dmap->dma_mode) { - int err; - - if ((err = audio_devs[dev]->prepare_for_input(dev, - dmap->fragment_size, dmap->nbufs)) < 0) { - return err; - } - dmap->dma_mode = DMODE_INPUT; - } - if (!(dmap->flags & DMA_ACTIVE)) { - audio_devs[dev]->start_input(dev, - dmap->raw_buf_phys + dmap->qtail * dmap->fragment_size, - dmap->fragment_size, 0, - !(audio_devs[dev]->flags & DMA_AUTOMODE) || - !(dmap->flags & DMA_STARTED)); - dmap->flags |= DMA_ACTIVE | DMA_STARTED; - if (audio_devs[dev]->trigger) - audio_devs[dev]->trigger(dev, - audio_devs[dev]->enable_bits * audio_devs[dev]->go); - } - return 0; -} - -int -DMAbuf_getrdbuffer(int dev, char **buf, int *len, int dontblock) -{ - u_long flags; - int err = EIO; - struct dma_buffparms *dmap = audio_devs[dev]->dmap_in; - - flags = splhigh(); -#ifdef ALLOW_BUFFER_MAPPING - if (audio_devs[dev]->dmap_in->mapping_flags & DMA_MAP_MAPPED) { - printf("Sound: Can't read from mmapped device (1)\n"); - return -(EINVAL); - } else -#endif - if (!dmap->qlen) { - int timeout; - - if ((err = activate_recording(dev, dmap)) < 0) { - splx(flags); - return err; - } - /* Wait for the next block */ - - if (dontblock) { - splx(flags); - return -(EAGAIN); - } - if (!(audio_devs[dev]->enable_bits & PCM_ENABLE_INPUT) & - audio_devs[dev]->go) { - splx(flags); - return -(EAGAIN); - } - if (!audio_devs[dev]->go) - timeout = 0; - else - timeout = 2 * hz; - - { - int chn; - - in_sleeper[dev] = &chn; - DO_SLEEP(chn, in_sleep_flag[dev], timeout); - - }; - /* XXX note -- nobody seems to set the mode to WK_TIMEOUT - lr */ - if ((in_sleep_flag[dev].mode & WK_TIMEOUT)) { - /* XXX hey, we are in splhigh here ? lr 970705 */ - printf("Sound: DMA (input) timed out - IRQ/DRQ config error?\n"); - err = EIO; - audio_devs[dev]->reset(dev); - in_sleep_flag[dev].aborting = 1; - } else - err = EINTR; - } - splx(flags); - - if (!dmap->qlen) - return -(err); - - *buf = &dmap->raw_buf[dmap->qhead * dmap->fragment_size + dmap->counts[dmap->qhead]]; - *len = dmap->fragment_size - dmap->counts[dmap->qhead]; - - return dmap->qhead; -} - -int -DMAbuf_rmchars(int dev, int buff_no, int c) -{ - struct dma_buffparms *dmap = audio_devs[dev]->dmap_in; - - int p = dmap->counts[dmap->qhead] + c; - -#ifdef ALLOW_BUFFER_MAPPING - if (audio_devs[dev]->dmap_in->mapping_flags & DMA_MAP_MAPPED) { - printf("Sound: Can't read from mmapped device (2)\n"); - return -(EINVAL); - } else -#endif - if (p >= dmap->fragment_size) { /* This buffer is completely empty */ - dmap->counts[dmap->qhead] = 0; - if (dmap->qlen <= 0 || dmap->qlen > dmap->nbufs) - printf("\nSound: Audio queue1 corrupted for dev%d (%d/%d)\n", - dev, dmap->qlen, dmap->nbufs); - dmap->qlen--; - dmap->qhead = (dmap->qhead + 1) % dmap->nbufs; - } else - dmap->counts[dmap->qhead] = p; - - return 0; -} - -static int -dma_subdivide(int dev, struct dma_buffparms * dmap, ioctl_arg arg, int fact) -{ - if (fact == 0) { - fact = dmap->subdivision; - if (fact == 0) - fact = 1; - return *(int *) arg = fact; - } - if (dmap->subdivision != 0 || dmap->fragment_size)/* Loo late to change */ - return -(EINVAL); - - if (fact > MAX_REALTIME_FACTOR) - return -(EINVAL); - - if (fact != 1 && fact != 2 && fact != 4 && fact != 8 && fact != 16) - return -(EINVAL); - - dmap->subdivision = fact; - return *(int *) arg = fact; -} - -static int -dma_set_fragment(int dev, struct dma_buffparms * dmap, ioctl_arg arg, int fact) -{ - int bytes, count; - - if (fact == 0) - return -(EIO); - - if (dmap->subdivision != 0 || dmap->fragment_size)/* Loo late to change */ - return -(EINVAL); - - bytes = fact & 0xffff; - count = (fact >> 16) & 0xffff; - - if (count == 0) - count = MAX_SUB_BUFFERS; - -#if amancio - if (bytes < 4 || bytes > 17) /* <16 || > 128k */ - return -(EINVAL); -#endif - - if (count < 2) - return -(EINVAL); - -#ifdef OS_DMA_MINBITS - if (bytes < OS_DMA_MINBITS) - bytes = OS_DMA_MINBITS; -#endif - - dmap->fragment_size = (1 << bytes); - - dmap->max_fragments = count; - - if (dmap->fragment_size > audio_devs[dev]->buffsize) - dmap->fragment_size = audio_devs[dev]->buffsize; - - if (dmap->fragment_size == audio_devs[dev]->buffsize && - audio_devs[dev]->flags & DMA_AUTOMODE) - dmap->fragment_size /= 2; /* Needs at least 2 buffers */ - - dmap->subdivision = 1; /* Disable SNDCTL_DSP_SUBDIVIDE */ - return *(int *) arg = bytes | (count << 16); -} - -static int -get_buffer_pointer(int dev, int chan, struct dma_buffparms * dmap) -{ - int pos; - u_long flags; - - flags = splhigh(); - - if (!(dmap->flags & DMA_ACTIVE)) - pos = 0; - else - { - pos = isa_dmastatus(chan); - } - - splx(flags); - - pos = dmap->bytes_in_use - pos ; - if (audio_devs[dev]->flags & DMA_AUTOMODE) - return pos; - else - { - pos = dmap->fragment_size - pos; - if (pos < 0) - return 0; - return pos; - } - - -} - -int -DMAbuf_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) -{ - struct dma_buffparms *dmap_out = audio_devs[dev]->dmap_out; - struct dma_buffparms *dmap_in = audio_devs[dev]->dmap_in; - - switch (cmd) { - - - case SNDCTL_DSP_RESET: - dma_reset(dev); - return 0; - break; - - case SNDCTL_DSP_SYNC: - dma_sync(dev); - dma_reset(dev); - return 0; - break; - - case SNDCTL_DSP_GETBLKSIZE: - if (!(dmap_out->flags & DMA_ALLOC_DONE)) - reorganize_buffers(dev, dmap_out); - - return *(int *) arg = dmap_out->fragment_size; - break; - - case SNDCTL_DSP_SETBLKSIZE: - { - int size = (*(int *) arg); - - if (!(dmap_out->flags & DMA_ALLOC_DONE) && size) { - if ((size >> 16) > 0 ) - dmap_out->fragment_size = size >> 16; - else { - dmap_out->fragment_size = size; - } - dmap_out->max_fragments = 8888; - - size &= 0xffff; - - if (audio_devs[dev]->flags & DMA_DUPLEX) { - dmap_in->fragment_size = size; - dmap_in->max_fragments = 8888; - } - return 0; - - } else - return -(EINVAL); /* Too late to change */ - - } - break; - - case SNDCTL_DSP_SUBDIVIDE: - { - int fact = (*(int *) arg); - int ret; - - ret = dma_subdivide(dev, dmap_out, arg, fact); - if (ret < 0) - return ret; - - if (audio_devs[dev]->flags & DMA_DUPLEX) - ret = dma_subdivide(dev, dmap_in, arg, fact); - - return ret; - } - break; - - case SNDCTL_DSP_SETFRAGMENT: - { - int fact = (*(int *) arg); - int ret; - - ret = dma_set_fragment(dev, dmap_out, arg, fact); - if (ret < 0) - return ret; - - if (audio_devs[dev]->flags & DMA_DUPLEX) - ret = dma_set_fragment(dev, dmap_in, arg, fact); - - return ret; - } - break; - - case SNDCTL_DSP_GETISPACE: - case SNDCTL_DSP_GETOSPACE: - if (!local) - return -(EINVAL); - else { - struct dma_buffparms *dmap = dmap_out; - - audio_buf_info *info = (audio_buf_info *) arg; - - if (cmd == SNDCTL_DSP_GETISPACE && audio_devs[dev]->flags & DMA_DUPLEX) - dmap = dmap_in; - -#ifdef ALLOW_BUFFER_MAPPING - if (dmap->mapping_flags & DMA_MAP_MAPPED) - return -(EINVAL); -#endif - - if (!(dmap->flags & DMA_ALLOC_DONE)) - reorganize_buffers(dev, dmap); - - info->fragstotal = dmap->nbufs; - - if (cmd == SNDCTL_DSP_GETISPACE) - info->fragments = dmap->qlen; - else { - if (!space_in_queue(dev)) - info->fragments = 0; - else { - info->fragments = dmap->nbufs - dmap->qlen; - if (audio_devs[dev]->local_qlen) { - int tmp = audio_devs[dev]->local_qlen(dev); - - if (tmp & info->fragments) - tmp--; /* This buffer has been counted twice */ - info->fragments -= tmp; - } - } - } - - if (info->fragments < 0) - info->fragments = 0; - else if (info->fragments > dmap->nbufs) - info->fragments = dmap->nbufs; - - info->fragsize = dmap->fragment_size; - info->bytes = info->fragments * dmap->fragment_size; - - if (cmd == SNDCTL_DSP_GETISPACE && dmap->qlen) - info->bytes -= dmap->counts[dmap->qhead]; - } - return 0; - - case SNDCTL_DSP_SETTRIGGER: - { - u_long flags; - - int bits = (*(int *) arg) & audio_devs[dev]->open_mode; - int changed; - - if (audio_devs[dev]->trigger == NULL) - return -(EINVAL); - - if (!(audio_devs[dev]->flags & DMA_DUPLEX)) - if ((bits & PCM_ENABLE_INPUT) && (bits & PCM_ENABLE_OUTPUT)) { - printf("Sound: Device doesn't have full duplex capability\n"); - return -(EINVAL); - } - flags = splhigh(); - changed = audio_devs[dev]->enable_bits ^ bits; - - if ((changed & bits) & PCM_ENABLE_INPUT && audio_devs[dev]->go) { - if (!(dmap_in->flags & DMA_ALLOC_DONE)) - reorganize_buffers(dev, dmap_in); - activate_recording(dev, dmap_in); - } -#ifdef ALLOW_BUFFER_MAPPING - if ((changed & bits) & PCM_ENABLE_OUTPUT && - dmap_out->mapping_flags & DMA_MAP_MAPPED && - audio_devs[dev]->go) { - if (!(dmap_out->flags & DMA_ALLOC_DONE)) - reorganize_buffers(dev, dmap_out); - - audio_devs[dev]->prepare_for_output (dev, - dmap_out->fragment_size, dmap_out->nbufs); - - dmap_out->counts[dmap_out->qhead] = dmap_out->fragment_size; - DMAbuf_start_output(dev, 0, dmap_out->fragment_size); - dmap_out->dma_mode = DMODE_OUTPUT; - } -#endif - - audio_devs[dev]->enable_bits = bits; - if (changed && audio_devs[dev]->trigger) - audio_devs[dev]->trigger(dev, bits * audio_devs[dev]->go); - splx(flags); - } - case SNDCTL_DSP_GETTRIGGER: - return *(int *) arg = audio_devs[dev]->enable_bits; - break; - - case SNDCTL_DSP_SETSYNCRO: - - if (!audio_devs[dev]->trigger) - return -(EINVAL); - - audio_devs[dev]->trigger(dev, 0); - audio_devs[dev]->go = 0; - return 0; - break; - - case SNDCTL_DSP_GETIPTR: - { - count_info info; - u_long flags; - - flags = splhigh(); - info.bytes = audio_devs[dev]->dmap_in->byte_counter; - info.ptr = get_buffer_pointer(dev, audio_devs[dev]->dmachan2, audio_devs[dev]->dmap_in); - info.blocks = audio_devs[dev]->dmap_in->qlen; - info.bytes += info.ptr; - - bcopy((char *) &info, &(((char *) arg)[0]), sizeof(info)); - -#ifdef ALLOW_BUFFER_MAPPING - if (audio_devs[dev]->dmap_in->mapping_flags & DMA_MAP_MAPPED) - audio_devs[dev]->dmap_in->qlen = 0; /* Ack interrupts */ -#endif - splx(flags); - return 0; - } - break; - - case SNDCTL_DSP_GETOPTR: - { - count_info info; - u_long flags; - - flags = splhigh(); - info.bytes = audio_devs[dev]->dmap_out->byte_counter; - info.ptr = get_buffer_pointer(dev, audio_devs[dev]->dmachan1, audio_devs[dev]->dmap_out); - info.blocks = audio_devs[dev]->dmap_out->qlen; - info.bytes += info.ptr; - bcopy((char *) &info, &(((char *) arg)[0]), sizeof(info)); - -#ifdef ALLOW_BUFFER_MAPPING - if (audio_devs[dev]->dmap_out->mapping_flags & DMA_MAP_MAPPED) - audio_devs[dev]->dmap_out->qlen = 0; /* Ack interrupts */ -#endif - splx(flags); - return 0; - } - break; - - default: - return audio_devs[dev]->ioctl(dev, cmd, arg, local); - } -} - -/* - * DMAbuf_start_devices() is called by the /dev/music driver to start one or - * more audio devices at desired moment. - */ - -void -DMAbuf_start_devices(u_int devmask) -{ - int dev; - - for (dev = 0; dev < num_audiodevs; dev++) - if (devmask & (1 << dev)) - if (audio_devs[dev]->open_mode != 0) - if (!audio_devs[dev]->go) { - /* OK to start the device */ - audio_devs[dev]->go = 1; - - if (audio_devs[dev]->trigger) - audio_devs[dev]->trigger(dev, - audio_devs[dev]->enable_bits * audio_devs[dev]->go); - } -} - -static int -space_in_queue(int dev) -{ - int len, max, tmp; - struct dma_buffparms *dmap = audio_devs[dev]->dmap_out; - if (dmap->qlen >= dmap->nbufs) /* No space at all */ - return 0; - - /* - * Verify that there are no more pending buffers than the limit - * defined by the process. - */ - - max = dmap->max_fragments; - len = dmap->qlen; - - if (audio_devs[dev]->local_qlen) { - tmp = audio_devs[dev]->local_qlen(dev); - if (tmp & len) - tmp--; /* This buffer has been counted twice */ - len += tmp; - } - - if (len >= max) - return 0; - return 1; -} - -int -DMAbuf_getwrbuffer(int dev, char **buf, int *size, int dontblock) -{ - u_long flags; - int abort, err = EIO; - struct dma_buffparms *dmap = audio_devs[dev]->dmap_out; - -#ifdef ALLOW_BUFFER_MAPPING - if (audio_devs[dev]->dmap_out->mapping_flags & DMA_MAP_MAPPED) { - printf("Sound: Can't write to mmapped device (3)\n"); - return -(EINVAL); - } -#endif - - if (dmap->dma_mode == DMODE_INPUT) { /* Direction change */ - dma_reset(dev); - dmap->dma_mode = DMODE_NONE; - } else if (dmap->flags & DMA_RESTART) { /* Restart buffering */ - dma_sync(dev); - dma_reset_output(dev); - } - dmap->flags &= ~DMA_RESTART; - - if (!(dmap->flags & DMA_ALLOC_DONE)) - reorganize_buffers(dev, dmap); - - if (!dmap->dma_mode) { - int err; - - dmap->dma_mode = DMODE_OUTPUT; - if ((err = audio_devs[dev]->prepare_for_output(dev, - dmap->fragment_size, dmap->nbufs)) < 0) - return err; - } - flags = splhigh(); - - abort = 0; - while (!space_in_queue(dev) && !abort) { - int timeout; - - if (dontblock) { - splx(flags); - return -(EAGAIN); - } - if (!(audio_devs[dev]->enable_bits & PCM_ENABLE_OUTPUT) && - audio_devs[dev]->go) { - splx(flags); - return -(EAGAIN); - } - /* - * Wait for free space - */ - if (!audio_devs[dev]->go) - timeout = 0; - else - timeout = 2 * hz; - - { - int chn; - - out_sleep_flag[dev].mode = WK_SLEEP; - out_sleeper[dev] = &chn; - DO_SLEEP2(chn, out_sleep_flag[dev], timeout); - - if ((out_sleep_flag[dev].mode & WK_TIMEOUT)) { - printf("Sound: DMA (output) timed out - IRQ/DRQ config error?\n"); - err = EIO; - abort = 1; - out_sleep_flag[dev].aborting = 1; - audio_devs[dev]->reset(dev); - } else if ((out_sleep_flag[dev].aborting) || - CURSIG(curproc)) { - err = EINTR; - abort = 1; - } - } - } - splx(flags); - - if (!space_in_queue(dev)) { - return -(err); /* Caught a signal ? */ - } - *buf = dmap->raw_buf + dmap->qtail * dmap->fragment_size; - *size = dmap->fragment_size; - dmap->counts[dmap->qtail] = 0; - return dmap->qtail; -} - -int -DMAbuf_start_output(int dev, int buff_no, int l) -{ - struct dma_buffparms *dmap = audio_devs[dev]->dmap_out; - - /* - * Bypass buffering if using mmaped access - */ - -#ifdef ALLOW_BUFFER_MAPPING - if (audio_devs[dev]->dmap_out->mapping_flags & DMA_MAP_MAPPED) { - l = dmap->fragment_size; - dmap->counts[dmap->qtail] = l; - dmap->flags &= ~DMA_RESTART; - dmap->qtail = (dmap->qtail + 1) % dmap->nbufs; - } else -#else - if (dmap != NULL) -#endif - { - - if (buff_no != dmap->qtail) - printf("Sound warning: DMA buffers out of sync %d != %d\n", buff_no, dmap->qtail); - - dmap->qlen++; - if (dmap->qlen <= 0 || dmap->qlen > dmap->nbufs) - printf("\nSound: Audio queue2 corrupted for dev%d (%d/%d)\n", - dev, dmap->qlen, dmap->nbufs); - - dmap->counts[dmap->qtail] = l; - - if ((l != dmap->fragment_size) && - ((audio_devs[dev]->flags & DMA_AUTOMODE) && - audio_devs[dev]->flags & NEEDS_RESTART)) - dmap->flags |= DMA_RESTART; - else - dmap->flags &= ~DMA_RESTART; - - dmap->qtail = (dmap->qtail + 1) % dmap->nbufs; - } - if (!(dmap->flags & DMA_ACTIVE)) { - dmap->flags |= DMA_ACTIVE; - audio_devs[dev]->output_block(dev, dmap->raw_buf_phys + - dmap->qhead * dmap->fragment_size, - dmap->counts[dmap->qhead], 0, - !(audio_devs[dev]->flags & DMA_AUTOMODE) || - !(dmap->flags & DMA_STARTED)); - dmap->flags |= DMA_STARTED; - if (audio_devs[dev]->trigger) - audio_devs[dev]->trigger(dev, - audio_devs[dev]->enable_bits * audio_devs[dev]->go); - } - return 0; -} - -int -DMAbuf_start_dma(int dev, u_long physaddr, int count, int dma_mode) -{ - int chan; - struct dma_buffparms *dmap; - - if (dma_mode == 1) { - chan = audio_devs[dev]->dmachan1; - dmap = audio_devs[dev]->dmap_out; - - } else { - chan = audio_devs[dev]->dmachan2; - dmap = audio_devs[dev]->dmap_in; - } - - /* - * The count must be one less than the actual size. This is handled - * by set_dma_addr() - */ - -#ifndef PSEUDO_DMA_AUTOINIT - if (audio_devs[dev]->flags & DMA_AUTOMODE) { - /* Auto restart mode. Transfer the whole buffer */ - isa_dmastart(ISADMA_RAW | ((dma_mode == 0) ? ISADMA_READ : ISADMA_WRITE), - (caddr_t) (void *) (uintptr_t) dmap->raw_buf_phys, - dmap->bytes_in_use, chan); - - } else -#endif - { - isa_dmastart((dma_mode == 0) ? ISADMA_READ : ISADMA_WRITE, - (caddr_t) (void *) (uintptr_t) physaddr, count, chan); - } - return count; -} - -void -DMAbuf_init() -{ - int dev; - - /* - * NOTE! This routine could be called several times. - * XXX is it ok to make it run only the first time ? -- lr970710 - */ - - for (dev = 0; dev < num_audiodevs; dev++) - if (audio_devs[dev]->dmap_out == NULL) { - audio_devs[dev]->dmap_out = - audio_devs[dev]->dmap_in = &dmaps[ndmaps++]; - - if (audio_devs[dev]->flags & DMA_DUPLEX) - audio_devs[dev]->dmap_in = &dmaps[ndmaps++]; - } -} - -void -DMAbuf_outputintr(int dev, int event_type) -{ - /* - * Event types: 0 = DMA transfer done. Device still has more data in - * the local buffer. 1 = DMA transfer done. Device doesn't have local - * buffer or it's empty now. 2 = No DMA transfer but the device has - * now more space in its local buffer. - */ - - u_long flags; - struct dma_buffparms *dmap = audio_devs[dev]->dmap_out; - dmap->byte_counter += dmap->counts[dmap->qhead]; -#ifdef OS_DMA_INTR - sound_dma_intr(dev, audio_devs[dev]->dmap_out, audio_devs[dev]->dmachan1); -#endif -#ifdef ALLOW_BUFFER_MAPPING - if (dmap->mapping_flags & DMA_MAP_MAPPED) { - /* mmapped access */ - - dmap->qhead = (dmap->qhead + 1) % dmap->nbufs; - dmap->qlen++; /* Yes increment it (don't decrement) */ - dmap->flags &= ~DMA_ACTIVE; - dmap->counts[dmap->qhead] = dmap->fragment_size; - - if (!(audio_devs[dev]->flags & DMA_AUTOMODE)) { - audio_devs[dev]->output_block(dev, dmap->raw_buf_phys + - dmap->qhead * dmap->fragment_size, - dmap->counts[dmap->qhead], 1, - !(audio_devs[dev]->flags & DMA_AUTOMODE)); - if (audio_devs[dev]->trigger) - audio_devs[dev]->trigger(dev, - audio_devs[dev]->enable_bits * audio_devs[dev]->go); - } -#ifdef PSEUDO_DMA_AUTOINIT - else { - DMAbuf_start_dma(dev, dmap->raw_buf_phys + - dmap->qhead * dmap->fragment_size, - dmap->counts[dmap->qhead], 1); - } -#endif - dmap->flags |= DMA_ACTIVE; - - } else -#endif - if (event_type != 2) { - if (dmap->qlen <= 0 || dmap->qlen > dmap->nbufs) { - printf("\nSound: Audio queue3 corrupted for dev%d (%d/%d)\n", - dev, dmap->qlen, dmap->nbufs); - return; - } - if (!(audio_devs[dev]->flags & DMA_DISABLE)) - isa_dmadone(0, 0, 0, audio_devs[dev]->dmachan1); - - dmap->qlen--; - dmap->qhead = (dmap->qhead + 1) % dmap->nbufs; - dmap->flags &= ~DMA_ACTIVE; - if (dmap->qlen) { - /* if (!(audio_devs[dev]->flags & NEEDS_RESTART)) */ - { - audio_devs[dev]->output_block(dev, dmap->raw_buf_phys + - dmap->qhead * dmap->fragment_size, - dmap->counts[dmap->qhead], 1, - !(audio_devs[dev]->flags & DMA_AUTOMODE)); - if (audio_devs[dev]->trigger) - audio_devs[dev]->trigger(dev, - audio_devs[dev]->enable_bits * audio_devs[dev]->go); - } - -#ifdef PSEUDO_DMA_AUTOINIT - /* else */ - { - DMAbuf_start_dma(dev, dmap->raw_buf_phys + - dmap->qhead * dmap->fragment_size, - dmap->counts[dmap->qhead], 1); - } -#endif - dmap->flags |= DMA_ACTIVE; - } else if (event_type == 1) { - dmap->underrun_count++; - if ((audio_devs[dev]->flags & DMA_DUPLEX) && - audio_devs[dev]->halt_output) - audio_devs[dev]->halt_output(dev); - else - audio_devs[dev]->halt_xfer(dev); - - if ((audio_devs[dev]->flags & DMA_AUTOMODE) && - audio_devs[dev]->flags & NEEDS_RESTART) - dmap->flags |= DMA_RESTART; - else - dmap->flags &= ~DMA_RESTART; - } - } /* event_type != 2 */ - flags = splhigh(); - - if ((out_sleep_flag[dev].mode & WK_SLEEP)) { - out_sleep_flag[dev].mode = WK_WAKEUP; - wakeup(out_sleeper[dev]); - } - - if(selinfo[dev].si_pid) { - selwakeup(&selinfo[dev]); - } - - splx(flags); -} - -void -DMAbuf_inputintr(int dev) -{ - u_long flags; - struct dma_buffparms *dmap = audio_devs[dev]->dmap_in; - - dmap->byte_counter += dmap->fragment_size; - -#ifdef OS_DMA_INTR - sound_dma_intr(dev, audio_devs[dev]->dmap_in, audio_devs[dev]->dmachan2); -#endif - if (!(audio_devs[dev]->flags & DMA_DISABLE)) - isa_dmadone(0, 0, 0, audio_devs[dev]->dmachan2); - -#ifdef ALLOW_BUFFER_MAPPING - if (dmap->mapping_flags & DMA_MAP_MAPPED) { - dmap->qtail = (dmap->qtail + 1) % dmap->nbufs; - dmap->qlen++; - - if (!(audio_devs[dev]->flags & NEEDS_RESTART)) { - audio_devs[dev]->start_input(dev, dmap->raw_buf_phys + - dmap->qtail * dmap->fragment_size, - dmap->fragment_size, 1, - !(audio_devs[dev]->flags & DMA_AUTOMODE)); - if (audio_devs[dev]->trigger) - audio_devs[dev]->trigger(dev, - audio_devs[dev]->enable_bits * audio_devs[dev]->go); - } -#ifdef PSEUDO_DMA_AUTOINIT - else { - DMAbuf_start_dma(dev, dmap->raw_buf_phys + - dmap->qtail * dmap->fragment_size, - dmap->counts[dmap->qtail], 0); - } -#endif - - dmap->flags |= DMA_ACTIVE; - } else -#endif - if (dmap->qlen == (dmap->nbufs - 1)) { - /* printf ("Sound: Recording overrun\n"); */ - dmap->underrun_count++; - if ((audio_devs[dev]->flags & DMA_DUPLEX) && - audio_devs[dev]->halt_input) - audio_devs[dev]->halt_input(dev); - else - audio_devs[dev]->halt_xfer(dev); - - dmap->flags &= ~DMA_ACTIVE; - if (audio_devs[dev]->flags & DMA_AUTOMODE) - dmap->flags |= DMA_RESTART; - else - dmap->flags &= ~DMA_RESTART; - } else { - dmap->qlen++; - if (dmap->qlen <= 0 || dmap->qlen > dmap->nbufs) - printf("\nSound: Audio queue4 corrupted for dev%d (%d/%d)\n", - dev, dmap->qlen, dmap->nbufs); - dmap->qtail = (dmap->qtail + 1) % dmap->nbufs; - - /* if (!(audio_devs[dev]->flags & DMA_AUTOMODE)) */ - { - audio_devs[dev]->start_input(dev, dmap->raw_buf_phys + - dmap->qtail * dmap->fragment_size, - dmap->fragment_size, 1, - !(audio_devs[dev]->flags & DMA_AUTOMODE)); - if (audio_devs[dev]->trigger) - audio_devs[dev]->trigger(dev, - audio_devs[dev]->enable_bits * audio_devs[dev]->go); - } -#ifdef PSEUDO_DMA_AUTOINIT - /* else */ - { - DMAbuf_start_dma(dev, dmap->raw_buf_phys + - dmap->qtail * dmap->fragment_size, - dmap->counts[dmap->qtail], 0); - } -#endif - - dmap->flags |= DMA_ACTIVE; - } - - flags = splhigh(); - if ((in_sleep_flag[dev].mode & WK_SLEEP)) { - in_sleep_flag[dev].mode = WK_WAKEUP; - wakeup(in_sleeper[dev]); - } - if (selinfo[dev].si_pid) - selwakeup(&selinfo[dev]); - splx(flags); -} - -int -DMAbuf_open_dma(int dev) -{ - int err; - u_long flags; - flags = splhigh(); - - if ((err = open_dmap(dev, OPEN_READWRITE, audio_devs[dev]->dmap_out, - audio_devs[dev]->dmachan1)) < 0) { - splx(flags); - return -(EBUSY); - } - dma_init_buffers(dev, audio_devs[dev]->dmap_out); - /* audio_devs[dev]->dmap_out->flags |= DMA_ALLOC_DONE; */ - audio_devs[dev]->dmap_out->fragment_size = audio_devs[dev]->buffsize; - /* reorganize_buffers (dev, audio_devs[dev]->dmap_out); */ - - if (audio_devs[dev]->flags & DMA_DUPLEX) { - if ((err = open_dmap(dev, OPEN_READWRITE, - audio_devs[dev]->dmap_in, audio_devs[dev]->dmachan2)) < 0) { - printf("Unable to grab DMA%d for the audio driver\n", - audio_devs[dev]->dmachan2); - close_dmap(dev, audio_devs[dev]->dmap_out, - audio_devs[dev]->dmachan1); - splx(flags); - return -(EBUSY); - } - dma_init_buffers(dev, audio_devs[dev]->dmap_in); - /* audio_devs[dev]->dmap_in->flags |= DMA_ALLOC_DONE; */ - audio_devs[dev]->dmap_in->fragment_size = audio_devs[dev]->buffsize; - /* reorganize_buffers (dev, audio_devs[dev]->dmap_in); */ - } else { - audio_devs[dev]->dmap_in = audio_devs[dev]->dmap_out; - audio_devs[dev]->dmachan2 = audio_devs[dev]->dmachan1; - } - - splx(flags); - return 0; -} - -void -DMAbuf_close_dma(int dev) -{ - DMAbuf_reset_dma(dev); - close_dmap(dev, audio_devs[dev]->dmap_out, audio_devs[dev]->dmachan1); - - if (audio_devs[dev]->flags & DMA_DUPLEX) - close_dmap(dev, audio_devs[dev]->dmap_in, audio_devs[dev]->dmachan2); - -} - -void -DMAbuf_reset_dma(int dev) -{ -} - -#ifdef ALLOW_POLL - -int -DMAbuf_poll(int dev, struct fileinfo * file, int events, select_table * wait) -{ - struct dma_buffparms *dmap; - u_long flags; - int revents = 0; - - dmap = audio_devs[dev]->dmap_in; - - if (events & (POLLIN | POLLRDNORM)) { - if (dmap->dma_mode != DMODE_INPUT) { - if ((audio_devs[dev]->flags & DMA_DUPLEX) && !dmap->qlen && - audio_devs[dev]->enable_bits & PCM_ENABLE_INPUT && - audio_devs[dev]->go) { - u_long flags; - - flags = splhigh(); - - activate_recording(dev, dmap); - splx(flags); - - } - return 0; - } - if (!dmap->qlen) { - flags = splhigh(); - - selrecord(wait, &selinfo[dev]); - - splx(flags); - - return 0; - } else - revents |= events & (POLLIN | POLLRDNORM); - - } - - if (events & (POLLOUT | POLLWRNORM)) { - - dmap = audio_devs[dev]->dmap_out; - if (dmap->dma_mode == DMODE_INPUT) - return 0; - - if (dmap->dma_mode == DMODE_NONE) - return ( events & (POLLOUT | POLLWRNORM)); - - if (dmap->mapping_flags & DMA_MAP_MAPPED) { - - if(dmap->qlen) - return 1; - flags = splhigh(); - selrecord(wait, &selinfo[dev]); - - splx(flags); - - return 0; - - } - if (!space_in_queue(dev)) { - flags = splhigh(); - selrecord(wait, &selinfo[dev]); - splx(flags); - - } else - revents |= events & (POLLOUT | POLLWRNORM); - - - } - - return (revents); -} - - -#ifdef amancio -int -DMAbuf_select(int dev, struct fileinfo * file, int sel_type, select_table * wait) -{ - struct dma_buffparms *dmap = audio_devs[dev]->dmap_out; - struct dma_buffparms *dmapin = audio_devs[dev]->dmap_in; - u_long flags; - - switch (sel_type) { - case FREAD: - if (dmapin->dma_mode != DMODE_INPUT) - return 0; - - if (!dmap->qlen) { - flags = splhigh(); - selrecord(wait, &selinfo[dev]); - splx(flags); - - return 0; - } - return 1; - break; - - case FWRITE: - if (dmap->dma_mode == DMODE_INPUT) - return 0; - - if (dmap->dma_mode == DMODE_NONE) - return 1; - - if (!space_in_queue(dev)) { - flags = splhigh(); - - selrecord(wait, &selinfo[dev]); - splx(flags); - - return 0; - } - return 1; - break; - - } - - return 0; -} - -#endif /* ALLOW_POLL */ -#endif - -#else /* CONFIG_AUDIO */ -/* - * Stub versions if audio services not included - */ - -int -DMAbuf_open(int dev, int mode) -{ - return -(ENXIO); -} - -int -DMAbuf_release(int dev, int mode) -{ - return 0; -} - -int -DMAbuf_getwrbuffer(int dev, char **buf, int *size, int dontblock) -{ - return -(EIO); -} - -int -DMAbuf_getrdbuffer(int dev, char **buf, int *len, int dontblock) -{ - return -(EIO); -} - -int -DMAbuf_rmchars(int dev, int buff_no, int c) -{ - return -(EIO); -} - -int -DMAbuf_start_output(int dev, int buff_no, int l) -{ - return -(EIO); -} - -int -DMAbuf_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) -{ - return -(EIO); -} - -void -DMAbuf_init() -{ -} - -int -DMAbuf_start_dma(int dev, u_long physaddr, int count, int dma_mode) -{ - return -(EIO); -} - -int -DMAbuf_open_dma(int dev) -{ - return -(ENXIO); -} - -void -DMAbuf_close_dma(int dev) -{ - return; -} - -void -DMAbuf_reset_dma(int dev) -{ - return; -} - -void -DMAbuf_inputintr(int dev) -{ - return; -} - -void -DMAbuf_outputintr(int dev, int underrun_flag) -{ - return; -} -#endif /* CONFIG_AUDIO */ diff --git a/sys/i386/isa/sound/finetune.h b/sys/i386/isa/sound/finetune.h deleted file mode 100644 index b86a0eb..0000000 --- a/sys/i386/isa/sound/finetune.h +++ /dev/null @@ -1,49 +0,0 @@ -#ifdef SEQUENCER_C -/* - * 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. - * - */ - - unsigned short finetune_table[128] = - { -/* 0 */ 9439, 9447, 9456, 9464, 9473, 9481, 9490, 9499, -/* 8 */ 9507, 9516, 9524, 9533, 9542, 9550, 9559, 9567, -/* 16 */ 9576, 9585, 9593, 9602, 9611, 9619, 9628, 9637, -/* 24 */ 9645, 9654, 9663, 9672, 9680, 9689, 9698, 9707, -/* 32 */ 9715, 9724, 9733, 9742, 9750, 9759, 9768, 9777, -/* 40 */ 9786, 9795, 9803, 9812, 9821, 9830, 9839, 9848, -/* 48 */ 9857, 9866, 9874, 9883, 9892, 9901, 9910, 9919, -/* 56 */ 9928, 9937, 9946, 9955, 9964, 9973, 9982, 9991, -/* 64 */ 10000, 10009, 10018, 10027, 10036, 10045, 10054, 10063, -/* 72 */ 10072, 10082, 10091, 10100, 10109, 10118, 10127, 10136, -/* 80 */ 10145, 10155, 10164, 10173, 10182, 10191, 10201, 10210, -/* 88 */ 10219, 10228, 10237, 10247, 10256, 10265, 10274, 10284, -/* 96 */ 10293, 10302, 10312, 10321, 10330, 10340, 10349, 10358, -/* 104 */ 10368, 10377, 10386, 10396, 10405, 10415, 10424, 10433, -/* 112 */ 10443, 10452, 10462, 10471, 10481, 10490, 10499, 10509, -/* 120 */ 10518, 10528, 10537, 10547, 10556, 10566, 10576, 10585 - }; -#else - extern unsigned short finetune_table[128]; -#endif diff --git a/sys/i386/isa/sound/gus_card.c b/sys/i386/isa/sound/gus_card.c deleted file mode 100644 index 7dac1bd..0000000 --- a/sys/i386/isa/sound/gus_card.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - * sound/gus_card.c - * - * Detection routine for the Gravis Ultrasound. - * - * 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 - -#if defined(CONFIG_GUS) - -#include -#include - -int gus_base, gus_irq, gus_dma; -extern int gus_wave_volume; -extern int gus_pcm_volume; -extern int have_gus_max; -extern int gus_timer_enabled; - -static sound_os_info *gus_osp; - -#ifndef NOGUSPNP -int IwaveOpen(char voices, char mode, struct address_info * hw); -#endif - -void -attach_gus_card(struct address_info * hw_config) -{ - int io_addr; - - gus_osp = hw_config->osp; - - snd_set_irq_handler(hw_config->irq, gusintr, hw_config->osp); - - if (gus_wave_detect(hw_config->io_base)) { - /* Try first the default */ - gus_wave_init(hw_config); - - /* 0x10c-> is MAX */ - - if (hw_config->dma2 != -1 && hw_config->dma2 != hw_config->dma) - if (0) - printf("gus_card.c: Can't allocate DMA channel2\n"); -#ifdef CONFIG_MIDI - gus_midi_init(); -#endif - return ; - } -#ifndef EXCLUDE_GUS_IODETECT - - /* - * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6) - */ - - for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10) - if ( (io_addr != hw_config->io_base) /* Already tested */ - && (gus_wave_detect(io_addr)) ) { - hw_config->io_base = io_addr; - - printf(" WARNING! GUS found at %x, config was %x ", - io_addr, hw_config->io_base); - gus_wave_init(hw_config); - /* 0x10c-> is MAX */ - if (hw_config->dma2 != -1 && hw_config->dma2 != hw_config->dma) - if (0) - printf("gus_card.c: Can't allocate DMA channel2\n"); -#ifdef CONFIG_MIDI - gus_midi_init(); -#endif - return ; - } -#endif -} - -int -probe_gus(struct address_info * hw_config) -{ - int io_addr; - - gus_osp = hw_config->osp; -#ifndef NOGUSPNP - IwaveOpen((char) 32, (char) GUS_MODE, hw_config); -#endif - if (gus_wave_detect(hw_config->io_base)) - return 1; - printf("oops I didnt find gus \n"); -#undef EXCLUDE_GUS_IODETECT -#ifndef EXCLUDE_GUS_IODETECT - - /* - * Look at the possible base addresses (0x2X0, X=1, 2, 3, 4, 5, 6) - */ - for (io_addr = 0x210; io_addr <= 0x260; io_addr += 0x10) - if ( (io_addr != hw_config->io_base) /* Already tested */ - && (gus_wave_detect(io_addr)) ) { - hw_config->io_base = io_addr; - return 1; - } -#endif - - return 0; -} - -void -gusintr(int irq) -{ - u_char src; - -#ifdef CONFIG_GUSMAX - if (have_gus_max) - ad1848_interrupt(irq); -#endif - - for (;;) { - if (!(src = inb(u_IrqStatus))) - return; - - if (src & DMA_TC_IRQ) - guswave_dma_irq(); -#ifdef CONFIG_MIDI - if (src & (MIDI_TX_IRQ | MIDI_RX_IRQ)) - gus_midi_interrupt(0); -#endif - if (src & (GF1_TIMER1_IRQ | GF1_TIMER2_IRQ)) { -#ifdef CONFIG_SEQUENCER - if (gus_timer_enabled) - sound_timer_interrupt(); - gus_write8(0x45, 0); /* Ack IRQ */ - gus_timer_command(4, 0x80); /* Reset IRQ flags */ -#else - gus_write8(0x45, 0); /* Stop timers */ -#endif - } - if (src & (WAVETABLE_IRQ | ENVELOPE_IRQ)) - gus_voice_irq(); - } -} - -#endif - -/* - * Some extra code for the 16 bit sampling option - */ -#if defined(CONFIG_GUS16) - -int -probe_gus_db16(struct address_info * hw_config) -{ - return ad1848_detect(hw_config->io_base, NULL, hw_config->osp); -} - -void -attach_gus_db16(struct address_info * hw_config) -{ - gus_pcm_volume = 100; - gus_wave_volume = 90; - - ad1848_init("GUS 16 bit sampling", hw_config->io_base, - hw_config->irq, - hw_config->dma, - hw_config->dma, 0, - hw_config->osp); -} - -#endif diff --git a/sys/i386/isa/sound/gus_hw.h b/sys/i386/isa/sound/gus_hw.h deleted file mode 100644 index f97a0b8..0000000 --- a/sys/i386/isa/sound/gus_hw.h +++ /dev/null @@ -1,50 +0,0 @@ - -/* - * I/O addresses - */ - -#define u_Base (gus_base + 0x000) -#define u_Mixer u_Base -#define u_Status (gus_base + 0x006) -#define u_TimerControl (gus_base + 0x008) -#define u_TimerData (gus_base + 0x009) -#define u_IRQDMAControl (gus_base + 0x00b) -#define u_MidiControl (gus_base + 0x100) -#define MIDI_RESET 0x03 -#define MIDI_ENABLE_XMIT 0x20 -#define MIDI_ENABLE_RCV 0x80 -#define u_MidiStatus u_MidiControl -#define MIDI_RCV_FULL 0x01 -#define MIDI_XMIT_EMPTY 0x02 -#define MIDI_FRAME_ERR 0x10 -#define MIDI_OVERRUN 0x20 -#define MIDI_IRQ_PEND 0x80 -#define u_MidiData (gus_base + 0x101) -#define u_Voice (gus_base + 0x102) -#define u_Command (gus_base + 0x103) -#define u_DataLo (gus_base + 0x104) -#define u_DataHi (gus_base + 0x105) -#define u_MixData (gus_base + 0x106) /* Rev. 3.7+ mixing */ -#define u_MixSelect (gus_base + 0x506) /* registers. */ -#define u_IrqStatus u_Status -# define MIDI_TX_IRQ 0x01 /* pending MIDI xmit IRQ */ -# define MIDI_RX_IRQ 0x02 /* pending MIDI recv IRQ */ -# define GF1_TIMER1_IRQ 0x04 /* general purpose timer */ -# define GF1_TIMER2_IRQ 0x08 /* general purpose timer */ -# define WAVETABLE_IRQ 0x20 /* pending wavetable IRQ */ -# define ENVELOPE_IRQ 0x40 /* pending volume envelope IRQ */ -# define DMA_TC_IRQ 0x80 /* pending dma tc IRQ */ - -#define ICS2101 1 -# define ICS_MIXDEVS 6 -# define DEV_MIC 0 -# define DEV_LINE 1 -# define DEV_CD 2 -# define DEV_GF1 3 -# define DEV_UNUSED 4 -# define DEV_VOL 5 - -# define CHN_LEFT 0 -# define CHN_RIGHT 1 -#define CS4231 2 -#define u_DRAMIO (gus_base + 0x107) diff --git a/sys/i386/isa/sound/gus_linearvol.h b/sys/i386/isa/sound/gus_linearvol.h deleted file mode 100644 index 7ad0c30..0000000 --- a/sys/i386/isa/sound/gus_linearvol.h +++ /dev/null @@ -1,18 +0,0 @@ -static unsigned short gus_linearvol[128] = { - 0x0000, 0x08ff, 0x09ff, 0x0a80, 0x0aff, 0x0b40, 0x0b80, 0x0bc0, - 0x0bff, 0x0c20, 0x0c40, 0x0c60, 0x0c80, 0x0ca0, 0x0cc0, 0x0ce0, - 0x0cff, 0x0d10, 0x0d20, 0x0d30, 0x0d40, 0x0d50, 0x0d60, 0x0d70, - 0x0d80, 0x0d90, 0x0da0, 0x0db0, 0x0dc0, 0x0dd0, 0x0de0, 0x0df0, - 0x0dff, 0x0e08, 0x0e10, 0x0e18, 0x0e20, 0x0e28, 0x0e30, 0x0e38, - 0x0e40, 0x0e48, 0x0e50, 0x0e58, 0x0e60, 0x0e68, 0x0e70, 0x0e78, - 0x0e80, 0x0e88, 0x0e90, 0x0e98, 0x0ea0, 0x0ea8, 0x0eb0, 0x0eb8, - 0x0ec0, 0x0ec8, 0x0ed0, 0x0ed8, 0x0ee0, 0x0ee8, 0x0ef0, 0x0ef8, - 0x0eff, 0x0f04, 0x0f08, 0x0f0c, 0x0f10, 0x0f14, 0x0f18, 0x0f1c, - 0x0f20, 0x0f24, 0x0f28, 0x0f2c, 0x0f30, 0x0f34, 0x0f38, 0x0f3c, - 0x0f40, 0x0f44, 0x0f48, 0x0f4c, 0x0f50, 0x0f54, 0x0f58, 0x0f5c, - 0x0f60, 0x0f64, 0x0f68, 0x0f6c, 0x0f70, 0x0f74, 0x0f78, 0x0f7c, - 0x0f80, 0x0f84, 0x0f88, 0x0f8c, 0x0f90, 0x0f94, 0x0f98, 0x0f9c, - 0x0fa0, 0x0fa4, 0x0fa8, 0x0fac, 0x0fb0, 0x0fb4, 0x0fb8, 0x0fbc, - 0x0fc0, 0x0fc4, 0x0fc8, 0x0fcc, 0x0fd0, 0x0fd4, 0x0fd8, 0x0fdc, - 0x0fe0, 0x0fe4, 0x0fe8, 0x0fec, 0x0ff0, 0x0ff4, 0x0ff8, 0x0ffc -}; diff --git a/sys/i386/isa/sound/gus_midi.c b/sys/i386/isa/sound/gus_midi.c deleted file mode 100644 index 0dfc7c5..0000000 --- a/sys/i386/isa/sound/gus_midi.c +++ /dev/null @@ -1,274 +0,0 @@ -/* - * sound/gus2_midi.c - * - * The low level driver for the GUS Midi Interface. - * - * 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 - -#if defined(CONFIG_GUS) && defined(CONFIG_MIDI) -#include - -static int midi_busy = 0, input_opened = 0; -static int my_dev; -static int output_used = 0; -static volatile unsigned char gus_midi_control; - -static void (*midi_input_intr) (int dev, unsigned char data); - -static unsigned char tmp_queue[256]; -static volatile int qlen; -static volatile unsigned char qhead, qtail; -extern int gus_base, gus_irq, gus_dma; -extern sound_os_info *gus_osp; - -#define GUS_MIDI_STATUS() inb( u_MidiStatus) - -static int -gus_midi_open(int dev, int mode, - void (*input) (int dev, unsigned char data), - void (*output) (int dev) -) -{ - - if (midi_busy) { - printf("GUS: Midi busy\n"); - return -(EBUSY); - } - outb(u_MidiControl, MIDI_RESET); - gus_delay(); - - gus_midi_control = 0; - input_opened = 0; - - if (mode == OPEN_READ || mode == OPEN_READWRITE) { - gus_midi_control |= MIDI_ENABLE_RCV; - input_opened = 1; - } - if (mode == OPEN_WRITE || mode == OPEN_READWRITE) { - gus_midi_control |= MIDI_ENABLE_XMIT; - } - outb(u_MidiControl, gus_midi_control); /* Enable */ - - midi_busy = 1; - qlen = qhead = qtail = output_used = 0; - midi_input_intr = input; - - return 0; -} - -static int -dump_to_midi(unsigned char midi_byte) -{ - unsigned long flags; - int ok = 0; - - output_used = 1; - - flags = splhigh(); - - if (GUS_MIDI_STATUS() & MIDI_XMIT_EMPTY) { - ok = 1; - outb(u_MidiData, midi_byte); - } else { - /* - * Enable Midi xmit interrupts (again) - */ - gus_midi_control |= MIDI_ENABLE_XMIT; - outb(u_MidiControl, gus_midi_control); - } - - splx(flags); - return ok; -} - -static void -gus_midi_close(int dev) -{ - /* - * Reset FIFO pointers, disable intrs - */ - - outb(u_MidiControl, MIDI_RESET); - midi_busy = 0; -} - -static int -gus_midi_out(int dev, unsigned char midi_byte) -{ - - unsigned long flags; - - /* - * Drain the local queue first - */ - - flags = splhigh(); - - while (qlen && dump_to_midi(tmp_queue[qhead])) { - qlen--; - qhead++; - } - - splx(flags); - - /* - * Output the byte if the local queue is empty. - */ - - if (!qlen) - if (dump_to_midi(midi_byte)) - return 1; /* OK */ - - /* - * Put to the local queue - */ - - if (qlen >= 256) - return 0; /* Local queue full */ - - flags = splhigh(); - - tmp_queue[qtail] = midi_byte; - qlen++; - qtail++; - - splx(flags); - - return 1; -} - -static int -gus_midi_start_read(int dev) -{ - return 0; -} - -static int -gus_midi_end_read(int dev) -{ - return 0; -} - -static int -gus_midi_ioctl(int dev, unsigned cmd, ioctl_arg arg) -{ - return -(EINVAL); -} - -static void -gus_midi_kick(int dev) -{ -} - -static int -gus_midi_buffer_status(int dev) -{ - unsigned long flags; - - if (!output_used) - return 0; - - flags = splhigh(); - - if (qlen && dump_to_midi(tmp_queue[qhead])) { - qlen--; - qhead++; - } - splx(flags); - - return (qlen > 0) | !(GUS_MIDI_STATUS() & MIDI_XMIT_EMPTY); -} - -#define MIDI_SYNTH_NAME "Gravis Ultrasound Midi" -#define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT -#include - -static struct midi_operations gus_midi_operations = -{ - {"Gravis UltraSound Midi", 0, 0, SNDCARD_GUS}, - &std_midi_synth, - {0}, - gus_midi_open, - gus_midi_close, - gus_midi_ioctl, - gus_midi_out, - gus_midi_start_read, - gus_midi_end_read, - gus_midi_kick, - NULL, /* command */ - gus_midi_buffer_status, - NULL -}; - -void -gus_midi_init() -{ - if (num_midis >= MAX_MIDI_DEV) { - printf("Sound: Too many midi devices detected\n"); - return; - } - outb(u_MidiControl, MIDI_RESET); - - std_midi_synth.midi_dev = my_dev = num_midis; - midi_devs[num_midis++] = &gus_midi_operations; - return; -} - -void -gus_midi_interrupt(int dummy) -{ - unsigned char stat, data; - unsigned long flags; - - flags = splhigh(); - - stat = GUS_MIDI_STATUS(); - - if (stat & MIDI_RCV_FULL) { - data = inb(u_MidiData); - if (input_opened) - midi_input_intr(my_dev, data); - } - if (stat & MIDI_XMIT_EMPTY) { - while (qlen && dump_to_midi(tmp_queue[qhead])) { - qlen--; - qhead++; - } - - if (!qlen) { - /* - * Disable Midi output interrupts, since no data in - * the buffer - */ - gus_midi_control &= ~MIDI_ENABLE_XMIT; - outb(u_MidiControl, gus_midi_control); - } - } - splx(flags); -} - -#endif diff --git a/sys/i386/isa/sound/gus_vol.c b/sys/i386/isa/sound/gus_vol.c deleted file mode 100644 index fc66618..0000000 --- a/sys/i386/isa/sound/gus_vol.c +++ /dev/null @@ -1,138 +0,0 @@ -/* - * gus_vol.c - Compute volume for GUS. - * - * Greg Lee 1993. - */ -#include - -#ifdef CONFIG_GUS -#include - -#define GUS_VOLUME gus_wave_volume - - -extern int gus_wave_volume; -unsigned short gus_adagio_vol(int vel, int mainv, int xpn, int voicev); -unsigned short gus_linear_vol(int vol, int mainvol); - -/* - * Calculate gus volume from note velocity, main volume, expression, and - * intrinsic patch volume given in patch library. Expression is multiplied - * in, so it emphasizes differences in note velocity, while main volume is - * added in -- I don't know whether this is right, but it seems reasonable to - * me. (In the previous stage, main volume controller messages were changed - * to expression controller messages, if they were found to be used for - * dynamic volume adjustments, so here, main volume can be assumed to be - * constant throughout a song.) - * - * Intrinsic patch volume is added in, but if over 64 is also multiplied in, so - * we can give a big boost to very weak voices like nylon guitar and the - * basses. The normal value is 64. Strings are assigned lower values. - */ -unsigned short -gus_adagio_vol(int vel, int mainv, int xpn, int voicev) -{ - int i, m, n, x; - - /* - * A voice volume of 64 is considered neutral, so adjust the main - * volume if something other than this neutral value was assigned in - * the patch library. - */ - x = 256 + 6 * (voicev - 64); - - /* - * Boost expression by voice volume above neutral. - */ - if (voicev > 65) - xpn += voicev - 64; - xpn += (voicev - 64) / 2; - - /* - * Combine multiplicative and level components. - */ - x = vel * xpn * 6 + (voicev / 4) * x; - -#ifdef GUS_VOLUME - /* - * Further adjustment by installation-specific master volume control - * (default 60). - */ - x = (x * GUS_VOLUME * GUS_VOLUME) / 10000; -#endif - -#ifdef GUS_USE_CHN_MAIN_VOLUME - /* - * Experimental support for the channel main volume - */ - - mainv = (mainv / 2) + 64; /* Scale to 64 to 127 */ - x = (x * mainv * mainv) / 16384; -#endif - - if (x < 2) - return (0); - else if (x >= 65535) - return ((15 << 8) | 255); - - /* - * Convert to gus's logarithmic form with 4 bit exponent i and 8 bit - * mantissa m. - */ - n = x; - i = 7; - if (n < 128) { - while (i > 0 && n < (1 << i)) - i--; - } else - while (n > 255) { - n >>= 1; - i++; - } - /* - * Mantissa is part of linear volume not expressed in exponent. - * (This is not quite like real logs -- I wonder if it's right.) - */ - m = x - (1 << i); - - /* - * Adjust mantissa to 8 bits. - */ - if (m > 0) { - if (i > 8) - m >>= i - 8; - else if (i < 8) - m <<= 8 - i; - } - return ((i << 8) + m); -} - -/* - * Volume-values are interpreted as linear values. Volume is based on the - * value supplied with SEQ_START_NOTE(), channel main volume (if compiled in) - * and the volume set by the mixer-device (default 60%). - */ - -unsigned short -gus_linear_vol(int vol, int mainvol) -{ - int mixer_mainvol; - - RANGE (vol, 0, 127) ; - -#ifdef GUS_VOLUME - mixer_mainvol = GUS_VOLUME; -#else - mixer_mainvol = 100; -#endif - -#ifdef GUS_USE_CHN_MAIN_VOLUME - RANGE (mainvol, 0, 127); -#else - mainvol = 127; -#endif - - return gus_linearvol[(((vol * mainvol) / 127) * mixer_mainvol) / 100]; -} - -#endif diff --git a/sys/i386/isa/sound/gus_wave.c b/sys/i386/isa/sound/gus_wave.c deleted file mode 100644 index da2986e..0000000 --- a/sys/i386/isa/sound/gus_wave.c +++ /dev/null @@ -1,4587 +0,0 @@ -/* - * sound/gus_wave.c - * - * Driver for the Gravis UltraSound wave table synth. - * - * Copyright by Hannu Savolainen 1993, 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 - * 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. - * - * $FreeBSD$ - */ - -#include - -#include -#include -#include -#include -#include - -/* PnP stuff */ -#define GUS_PNP_ID 0x100561e - -#define MAX_CARDS 8 -#define MAX_GUS_PNP 12 - - -/* Static ports */ -#define PADDRESS 0x279 -#define PWRITE_DATA 0xa79 -#define SET_CSN 0x06 -#define PSTATUS 0x05 - -/* PnP Registers. Write to ADDRESS and then use WRITE/READ_DATA */ -#define SET_RD_DATA 0x00 -#define SERIAL_ISOLATION 0x01 -#define WAKE 0x03 - -#if defined(CONFIG_GUS) - -static IWAVE iw; -#define ENTER_CRITICAL - -#define LEAVE_CRITICAL - -#define MAX_SAMPLE 150 -#define MAX_PATCH 256 - - -static u_int gus_pnp_found[MAX_GUS_PNP] = - {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; - -struct voice_info { - u_long orig_freq; - u_long current_freq; - u_long mode; - int bender; - int bender_range; - int panning; - int midi_volume; - u_int initial_volume; - u_int current_volume; - int loop_irq_mode, loop_irq_parm; -#define LMODE_FINISH 1 -#define LMODE_PCM 2 -#define LMODE_PCM_STOP 3 - int volume_irq_mode, volume_irq_parm; -#define VMODE_HALT 1 -#define VMODE_ENVELOPE 2 -#define VMODE_START_NOTE 3 - - int env_phase; - u_char env_rate[6]; - u_char env_offset[6]; - - /* - * Volume computation parameters for gus_adagio_vol() - */ - int main_vol, expression_vol, patch_vol; - - /* Variables for "Ultraclick" removal */ - int dev_pending, note_pending, volume_pending, sample_pending; - char kill_pending; - long offset_pending; - -}; - -static struct voice_alloc_info *voice_alloc; - -extern int gus_base; -extern int gus_irq, gus_dma; -static int gus_dma2 = -1; -static int dual_dma_mode = 0; -static long gus_mem_size = 0; -static long free_mem_ptr = 0; -static int gus_no_dma = 0; -static int nr_voices = 0; -static int gus_devnum = 0; -static int volume_base, volume_scale, volume_method; -static int gus_recmask = SOUND_MASK_MIC; -static int recording_active = 0; -static int only_read_access = 0; -static int only_8_bits = 0; - -int gus_wave_volume = 60; -static int gus_pcm_volume = 80; -int have_gus_max = 0; -static int gus_line_vol = 100, gus_mic_vol = 0; -static u_char mix_image = 0x00; - -int gus_timer_enabled = 0; -/* - * Current version of this driver doesn't allow synth and PCM functions at - * the same time. The active_device specifies the active driver - */ -static int active_device = 0; - -#define GUS_DEV_WAVE 1 /* Wave table synth */ -#define GUS_DEV_PCM_DONE 2 /* PCM device, transfer done */ -#define GUS_DEV_PCM_CONTINUE 3 /* PCM device, transfer done ch. 1/2 */ - -static int gus_sampling_speed; -static int gus_sampling_channels; -static int gus_sampling_bits; - -static int *dram_sleeper = NULL; -static volatile struct snd_wait dram_sleep_flag = -{0}; - -/* - * Variables and buffers for PCM output - */ -#define MAX_PCM_BUFFERS (32*MAX_REALTIME_FACTOR) /* Don't change */ - -static int pcm_bsize, pcm_nblk, pcm_banksize; -static int pcm_datasize[MAX_PCM_BUFFERS]; -static volatile int pcm_head, pcm_tail, pcm_qlen; -static volatile int pcm_active; -static volatile int dma_active; -static int pcm_opened = 0; -static int pcm_current_dev; -static int pcm_current_block; -static u_long pcm_current_buf; -static int pcm_current_count; -static int pcm_current_intrflag; - -extern sound_os_info *gus_osp; - -static struct voice_info voices[32]; - -static int freq_div_table[] = -{ - 44100, /* 14 */ - 41160, /* 15 */ - 38587, /* 16 */ - 36317, /* 17 */ - 34300, /* 18 */ - 32494, /* 19 */ - 30870, /* 20 */ - 29400, /* 21 */ - 28063, /* 22 */ - 26843, /* 23 */ - 25725, /* 24 */ - 24696, /* 25 */ - 23746, /* 26 */ - 22866, /* 27 */ - 22050, /* 28 */ - 21289, /* 29 */ - 20580, /* 30 */ - 19916, /* 31 */ - 19293 /* 32 */ -}; - -static struct patch_info *samples; -static struct patch_info *dbg_samples; -static int dbg_samplep; - -static long sample_ptrs[MAX_SAMPLE + 1]; -static int sample_map[32]; -static int free_sample; -static int mixer_type = 0; - - -static int patch_table[MAX_PATCH]; -static int patch_map[32]; - -static struct synth_info gus_info = -{"Gravis UltraSound", 0, SYNTH_TYPE_SAMPLE, SAMPLE_TYPE_GUS, 0, 16, 0, MAX_PATCH}; - -static void gus_default_mixer_init(void); - -static int guswave_start_note2(int dev, int voice, int note_num, int volume); -static void gus_poke(long addr, u_char data); -static void compute_and_set_volume(int voice, int volume, int ramp_time); -extern u_short gus_adagio_vol(int vel, int mainv, int xpn, int voicev); -extern u_short gus_linear_vol(int vol, int mainvol); -static void compute_volume(int voice, int volume); -static void do_volume_irq(int voice); -static void set_input_volumes(void); -static void gus_tmr_install(int io_base); - -static void SEND(int d, int r); -static int get_serial(int rd_port, u_char *data); -static void send_Initiation_LFSR(void); -static int isolation_protocol(int rd_port); - - -#define INSTANT_RAMP -1 /* Instant change. No ramping */ -#define FAST_RAMP 0 /* Fastest possible ramp */ - - -/* Crystal Select */ -#define CODEC_XTAL2 0x01 /* 16.9344 crystal */ -#define CODEC_XTAL1 0x00 /* 24.576 crystal */ -/************************************************************************/ - -/************************************************************************/ -/* Definitions for CONFIG_1 register */ -#define CODEC_CFIG1I_DEFAULT 0x03 | 0x8 -#define CODEC_CAPTURE_PIO 0x80 /* Capture PIO enable */ -#define CODEC_PLAYBACK_PIO 0x40 /* Playback PIO enable */ -#define CODEC_AUTOCALIB 0x08 /* auto calibrate */ -#define CODEC_SINGLE_DMA 0x04 /* Use single DMA channel */ -#define CODEC_RE 0x02 /* Capture enable */ -#define CODEC_PE 0x01 /* playback enable */ -/************************************************************************/ - -/************************************************************************/ -/* Definitions for CONFIG_2 register */ -#define CODEC_CFIG2I_DEFAULT 0x81 -#define CODEC_OFVS 0x80 /* Output Full Scale Voltage */ -#define CODEC_TE 0x40 /* Timer Enable */ -#define CODEC_RSCD 0x20 /* Recors Sample Counter Disable */ -#define CODEC_PSCD 0x10 /* Playback Sample Counter Disable */ -#define CODEC_DAOF 0x01 /* D/A Ouput Force Enable */ -/************************************************************************/ - -/************************************************************************/ -/* Definitions for CONFIG_3 register */ -/* #define CODEC_CFIG3I_DEFAULT 0xe0 0x02 when synth DACs are working */ - -#define CODEC_CFIG3I_DEFAULT 0xc0 /* 0x02 when synth DACs are working */ -#define CODEC_RPIE 0x80 /* Record FIFO IRQ Enable */ -#define CODEC_PPIE 0x40 /* Playback FIFO IRQ Enable */ -#define CODEC_FT_MASK 0x30 /* FIFO Threshold Select */ -#define CODEC_PVFM 0x04 /* Playback Variable Frequency Mode */ -#define CODEC_SYNA 0x02 /* AUX1/Synth Signal Select */ -/************************************************************************/ - -/************************************************************************/ -/* Definitions for EXTERNAL_CONTROL register */ -#define CODEC_CEXTI_DEFAULT 0x00 -#define CODEC_IRQ_ENABLE 0x02 /* interrupt enable */ -#define CODEC_GPOUT1 0x80 /* external control #1 */ -#define CODEC_GPOUT0 0x40 /* external control #0 */ -/************************************************************************/ - -/************************************************************************/ -/* Definitions for MODE_SELECT_ID register */ -#define CODEC_MODE_DEFAULT 0x40 -#define CODEC_MODE_MASK 0x60 -#define CODEC_ID_BIT4 0x80 -#define CODEC_ID_BIT3_0 0x0F -/************************************************************************/ -#define CONFIG_1 0x09 -#define EXTERNAL_CONTROL 0x0a/* Pin control */ -#define STATUS_2 0x0b/* Test and initialization */ -#define MODE_SELECT_ID 0x0c/* Miscellaneaous information */ -#define LOOPBACK 0x0d/* Digital Mix */ -#define UPPER_PLAY_COUNT 0x0e/* Playback Upper Base Count */ -#define LOWER_PLAY_COUNT 0x0f/* Playback Lower Base Count */ -#define CONFIG_2 0x10 -#define CONFIG_3 0x11 - - -#define IWL_CODEC_OUT(reg, val) \ - { outb(iwl_codec_base, reg); outb(iwl_codec_data, val); } - -#define IWL_CODEC_IN(reg, val) \ - { outb(iwl_codec_base, reg); val = inb(iwl_codec_data); } - - -static u_char gus_look8(int reg); - -static void gus_write16(int reg, u_int data); - -static u_short gus_read16(int reg); - -static void gus_write_addr(int reg, u_long address, int is16bit); -static void IwaveLineLevel(char level, char index); -static void IwaveInputSource(BYTE index, BYTE source); -static void IwavePnpGetCfg(void); -static void IwavePnpDevice(BYTE dev); -static void IwavePnpSetCfg(void); -static void IwavePnpKey(void); -static BYTE IwavePnpIsol(PORT * pnpread); -static void IwavePnpPeek(PORT pnprdp, WORD bytes, BYTE * data); -static void IwavePnpActivate(BYTE dev, BYTE bool); -static void IwavePnpWake(BYTE csn); -static BYTE IwavePnpPing(DWORD VendorID); -static WORD IwaveMemSize(void); -static BYTE IwaveMemPeek(ADDRESS addr); -static void IwaveMemPoke(ADDRESS addr, BYTE datum); -static void IwaveMemCfg(DWORD * lpbanks); -static void IwaveCodecIrq(BYTE mode); -static WORD IwaveRegPeek(DWORD reg_mnem); - -static void IwaveRegPoke(DWORD reg_mnem, WORD datum); -static void IwaveCodecMode(char mode); -static void IwaveLineMute(BYTE mute, BYTE inx); -static void Iwaveinitcodec(void); -int IwaveOpen(char voices, char mode, struct address_info * hw); - - -static void -reset_sample_memory(void) -{ - int i; - - for (i = 0; i <= MAX_SAMPLE; i++) - sample_ptrs[i] = -1; - for (i = 0; i < 32; i++) - sample_map[i] = -1; - for (i = 0; i < 32; i++) - patch_map[i] = -1; - - gus_poke(0, 0); /* Put a silent sample to the beginning */ - gus_poke(1, 0); - free_mem_ptr = 2; - - free_sample = 0; - - for (i = 0; i < MAX_PATCH; i++) - patch_table[i] = -1; -} - -void -gus_delay(void) -{ - int i; - - for (i = 0; i < 7; i++) - inb(u_DRAMIO); -} - -static void -gus_poke(long addr, u_char data) -{ /* Writes a byte to the DRAM */ - u_long flags; - - flags = splhigh(); - outb(u_Command, 0x43); - outb(u_DataLo, addr & 0xff); - outb(u_DataHi, (addr >> 8) & 0xff); - - outb(u_Command, 0x44); - outb(u_DataHi, (addr >> 16) & 0xff); - outb(u_DRAMIO, data); - splx(flags); -} - -static u_char -gus_peek(long addr) -{ /* Reads a byte from the DRAM */ - u_long flags; - u_char tmp; - - flags = splhigh(); - outb(u_Command, 0x43); - outb(u_DataLo, addr & 0xff); - outb(u_DataHi, (addr >> 8) & 0xff); - - outb(u_Command, 0x44); - outb(u_DataHi, (addr >> 16) & 0xff); - tmp = inb(u_DRAMIO); - splx(flags); - - return tmp; -} - -void -gus_write8(int reg, u_int data) -{ /* Writes to an indirect register (8 bit) */ - u_long flags; - - flags = splhigh(); - outb(u_Command, reg); - outb(u_DataHi, (u_char) (data & 0xff)); - splx(flags); -} - -u_char -gus_read8(int reg) -{ /* Reads from an indirect register (8 bit). Offset 0x80. */ - u_long flags; - u_char val; - - flags = splhigh(); - outb(u_Command, reg | 0x80); - val = inb(u_DataHi); - splx(flags); - - return val; -} - -static u_char -gus_look8(int reg) -{ /* Reads from an indirect register (8 bit). No additional offset. */ - u_long flags; - u_char val; - - flags = splhigh(); - outb(u_Command, reg); - val = inb(u_DataHi); - splx(flags); - - return val; -} - -static void -gus_write16(int reg, u_int data) -{ /* Writes to an indirect register (16 bit) */ - u_long flags; - - flags = splhigh(); - - outb(u_Command, reg); - - outb(u_DataLo, (u_char) (data & 0xff)); - outb(u_DataHi, (u_char) ((data >> 8) & 0xff)); - - splx(flags); -} - -static u_short -gus_read16(int reg) -{ /* Reads from an indirect register (16 bit). Offset 0x80. */ - u_long flags; - u_char hi, lo; - - flags = splhigh(); - - outb(u_Command, reg | 0x80); - - lo = inb(u_DataLo); - hi = inb(u_DataHi); - - splx(flags); - - return ((hi << 8) & 0xff00) | lo; -} - -static void -gus_write_addr(int reg, u_long address, int is16bit) -{ /* Writes an 24 bit memory address */ - u_long hold_address; - u_long flags; - - flags = splhigh(); - if (is16bit) { - /* - * Special processing required for 16 bit patches - */ - - hold_address = address; - address = address >> 1; - address &= 0x0001ffffL; - address |= (hold_address & 0x000c0000L); - } - gus_write16(reg, (u_short) ((address >> 7) & 0xffff)); - gus_write16(reg + 1, (u_short) ((address << 9) & 0xffff)); - /* - * Could writing twice fix problems with GUS_VOICE_POS() ? Lets try... - */ - gus_delay(); - gus_write16(reg, (u_short) ((address >> 7) & 0xffff)); - gus_write16(reg + 1, (u_short) ((address << 9) & 0xffff)); - splx(flags); -} - -static void -gus_select_voice(int voice) -{ - if (voice < 0 || voice > 31) - return; - - outb(u_Voice, voice); -} - -static void -gus_select_max_voices(int nvoices) -{ - if (nvoices < 14) - nvoices = 14; - if (nvoices > 32) - nvoices = 32; - - voice_alloc->max_voice = nr_voices = nvoices; - - gus_write8(0x0e, (nvoices - 1) | 0xc0); -} - -static void -gus_voice_on(u_int mode) -{ - gus_write8(0x00, (u_char) (mode & 0xfc)); - gus_delay(); - gus_write8(0x00, (u_char) (mode & 0xfc)); -} - -static void -gus_voice_off(void) -{ - gus_write8(0x00, gus_read8(0x00) | 0x03); -} - -static void -gus_voice_mode(u_int m) -{ - u_char mode = (u_char) (m & 0xff); - - gus_write8(0x00, (gus_read8(0x00) & 0x03) | - (mode & 0xfc)); /* Don't touch last two bits */ - gus_delay(); - gus_write8(0x00, (gus_read8(0x00) & 0x03) | (mode & 0xfc)); -} - -static void -gus_voice_freq(u_long freq) -{ - u_long divisor = freq_div_table[nr_voices - 14]; - u_short fc; - - fc = (u_short) (((freq << 9) + (divisor >> 1)) / divisor); - fc = fc << 1; - - gus_write16(0x01, fc); -} - -static void -gus_voice_volume(u_int vol) -{ - gus_write8(0x0d, 0x03); /* Stop ramp before setting volume */ - gus_write16(0x09, (u_short) (vol << 4)); -} - -static void -gus_voice_balance(u_int balance) -{ - gus_write8(0x0c, (u_char) (balance & 0xff)); -} - -static void -gus_ramp_range(u_int low, u_int high) -{ - gus_write8(0x07, (u_char) ((low >> 4) & 0xff)); - gus_write8(0x08, (u_char) ((high >> 4) & 0xff)); -} - -static void -gus_ramp_rate(u_int scale, u_int rate) -{ - gus_write8(0x06, (u_char) (((scale & 0x03) << 6) | (rate & 0x3f))); -} - -static void -gus_rampon(u_int m) -{ - u_char mode = (u_char) (m & 0xff); - - gus_write8(0x0d, mode & 0xfc); - gus_delay(); - gus_write8(0x0d, mode & 0xfc); -} - -static void -gus_ramp_mode(u_int m) -{ - u_char mode = (u_char) (m & 0xff); - - gus_write8(0x0d, (gus_read8(0x0d) & 0x03) | - (mode & 0xfc)); /* Leave the last 2 bits alone */ - gus_delay(); - gus_write8(0x0d, (gus_read8(0x0d) & 0x03) | (mode & 0xfc)); -} - -static void -gus_rampoff(void) -{ - gus_write8(0x0d, 0x03); -} - -static void -gus_set_voice_pos(int voice, long position) -{ - int sample_no; - - if ((sample_no = sample_map[voice]) != -1) { - if (position < samples[sample_no].len) { - if (voices[voice].volume_irq_mode == VMODE_START_NOTE) - voices[voice].offset_pending = position; - else - gus_write_addr(0x0a, sample_ptrs[sample_no] + position, - samples[sample_no].mode & WAVE_16_BITS); - } - } -} - -static void -gus_voice_init(int voice) -{ - u_long flags; - - flags = splhigh(); - gus_select_voice(voice); - gus_voice_volume(0); - gus_voice_off(); - gus_write_addr(0x0a, 0, 0); /* Set current position to 0 */ - gus_write8(0x00, 0x03); /* Voice off */ - gus_write8(0x0d, 0x03); /* Ramping off */ - voice_alloc->map[voice] = 0; - voice_alloc->alloc_times[voice] = 0; - splx(flags); - -} - -static void -gus_voice_init2(int voice) -{ - voices[voice].panning = 0; - voices[voice].mode = 0; - voices[voice].orig_freq = 20000; - voices[voice].current_freq = 20000; - voices[voice].bender = 0; - voices[voice].bender_range = 200; - voices[voice].initial_volume = 0; - voices[voice].current_volume = 0; - voices[voice].loop_irq_mode = 0; - voices[voice].loop_irq_parm = 0; - voices[voice].volume_irq_mode = 0; - voices[voice].volume_irq_parm = 0; - voices[voice].env_phase = 0; - voices[voice].main_vol = 127; - voices[voice].patch_vol = 127; - voices[voice].expression_vol = 127; - voices[voice].sample_pending = -1; -} - -static void -step_envelope(int voice) -{ - u_int vol, prev_vol, phase; - u_char rate; - long int flags; - - if (voices[voice].mode & WAVE_SUSTAIN_ON && voices[voice].env_phase == 2) { - flags = splhigh(); - gus_select_voice(voice); - gus_rampoff(); - splx(flags); - return; - /* - * Sustain phase begins. Continue envelope after receiving - * note off. - */ - } - if (voices[voice].env_phase >= 5) { /* Envelope finished. Shoot - * the voice down */ - gus_voice_init(voice); - return; - } - prev_vol = voices[voice].current_volume; - phase = ++voices[voice].env_phase; - compute_volume(voice, voices[voice].midi_volume); - vol = voices[voice].initial_volume * voices[voice].env_offset[phase] / 255; - rate = voices[voice].env_rate[phase]; - - flags = splhigh(); - gus_select_voice(voice); - gus_voice_volume(prev_vol); - gus_write8(0x06, rate); /* Ramping rate */ - - voices[voice].volume_irq_mode = VMODE_ENVELOPE; - - if (((vol - prev_vol) / 64) == 0) { /* No significant volume - * change */ - splx(flags); - step_envelope(voice); /* Continue the envelope on the next - * step */ - return; - } - if (vol > prev_vol) { - if (vol >= (4096 - 64)) - vol = 4096 - 65; - gus_ramp_range(0, vol); - gus_rampon(0x20); /* Increasing volume, with IRQ */ - } else { - if (vol <= 64) - vol = 65; - gus_ramp_range(vol, 4030); - gus_rampon(0x60); /* Decreasing volume, with IRQ */ - } - voices[voice].current_volume = vol; - splx(flags); -} - -static void -init_envelope(int voice) -{ - voices[voice].env_phase = -1; - voices[voice].current_volume = 64; - - step_envelope(voice); -} - -static void -start_release(int voice, long int flags) -{ - if (gus_read8(0x00) & 0x03) - return; /* Voice already stopped */ - - voices[voice].env_phase = 2; /* Will be incremented by - * step_envelope */ - - voices[voice].current_volume = - voices[voice].initial_volume = - gus_read16(0x09) >> 4; /* Get current volume */ - - voices[voice].mode &= ~WAVE_SUSTAIN_ON; - gus_rampoff(); - splx(flags); - step_envelope(voice); -} - -static void -gus_voice_fade(int voice) -{ - int instr_no = sample_map[voice], is16bits; - long int flags; - - flags = splhigh(); - gus_select_voice(voice); - - if (instr_no < 0 || instr_no > MAX_SAMPLE) { - gus_write8(0x00, 0x03); /* Hard stop */ - voice_alloc->map[voice] = 0; - splx(flags); - return; - } - is16bits = (samples[instr_no].mode & WAVE_16_BITS) ? 1 : 0; /* 8 or 16 bits */ - - if (voices[voice].mode & WAVE_ENVELOPES) { - start_release(voice, flags); - return; - } - /* - * Ramp the volume down but not too quickly. - */ - if ((int) (gus_read16(0x09) >> 4) < 100) { /* Get current volume */ - gus_voice_off(); - gus_rampoff(); - gus_voice_init(voice); - return; - } - gus_ramp_range(65, 4030); - gus_ramp_rate(2, 4); - gus_rampon(0x40 | 0x20);/* Down, once, with IRQ */ - voices[voice].volume_irq_mode = VMODE_HALT; - splx(flags); -} - -static void -gus_reset(void) -{ - int i; - - gus_select_max_voices(24); - volume_base = 3071; - volume_scale = 4; - volume_method = VOL_METHOD_ADAGIO; - - for (i = 0; i < 32; i++) { - gus_voice_init(i); /* Turn voice off */ - gus_voice_init2(i); - } - - inb(u_Status); /* Touch the status register */ - - gus_look8(0x41); /* Clear any pending DMA IRQs */ - gus_look8(0x49); /* Clear any pending sample IRQs */ - - gus_read8(0x0f); /* Clear pending IRQs */ - -} - -static void -gus_initialize(void) -{ - u_long flags; - u_char dma_image, irq_image, tmp; - - static u_char gus_irq_map[16] = - {0, 0, 0, 3, 0, 2, 0, 4, 0, 1, 0, 5, 6, 0, 0, 7}; - - static u_char gus_dma_map[8] = - {0, 1, 0, 2, 0, 3, 4, 5}; - - flags = splhigh(); - gus_write8(0x4c, 0); /* Reset GF1 */ - gus_delay(); - gus_delay(); - - gus_write8(0x4c, 1); /* Release Reset */ - gus_delay(); - gus_delay(); - - /* - * Clear all interrupts - */ - - gus_write8(0x41, 0); /* DMA control */ - gus_write8(0x45, 0); /* Timer control */ - gus_write8(0x49, 0); /* Sample control */ - - gus_select_max_voices(24); - - inb(u_Status); /* Touch the status register */ - - gus_look8(0x41); /* Clear any pending DMA IRQs */ - gus_look8(0x49); /* Clear any pending sample IRQs */ - gus_read8(0x0f); /* Clear pending IRQs */ - - gus_reset(); /* Resets all voices */ - - gus_look8(0x41); /* Clear any pending DMA IRQs */ - gus_look8(0x49); /* Clear any pending sample IRQs */ - gus_read8(0x0f); /* Clear pending IRQs */ - - gus_write8(0x4c, 7); /* Master reset | DAC enable | IRQ enable */ - - /* - * Set up for Digital ASIC - */ - - outb(gus_base + 0x0f, 0x05); - - mix_image |= 0x02; /* Disable line out (for a moment) */ - outb(u_Mixer, mix_image); - - outb(u_IRQDMAControl, 0x00); - - outb(gus_base + 0x0f, 0x00); - - /* - * Now set up the DMA and IRQ interface - * - * The GUS supports two IRQs and two DMAs. - * - * Just one DMA channel is used. This prevents simultaneous ADC and DAC. - * Adding this support requires significant changes to the dmabuf.c, - * dsp.c and audio.c also. - */ - - irq_image = 0; - tmp = gus_irq_map[gus_irq]; - if (!tmp) - printf("Warning! GUS IRQ not selected\n"); - irq_image |= tmp; - irq_image |= 0x40; /* Combine IRQ1 (GF1) and IRQ2 (Midi) */ - - dual_dma_mode = 1; - if (gus_dma2 == gus_dma || gus_dma2 == -1) { - dual_dma_mode = 0; - dma_image = 0x40; /* Combine DMA1 (DRAM) and IRQ2 (ADC) */ - - tmp = gus_dma_map[gus_dma]; - if (!tmp) - printf("Warning! GUS DMA not selected\n"); - - dma_image |= tmp; - } else - /* Setup dual DMA channel mode for GUS MAX */ - { - dma_image = gus_dma_map[gus_dma]; - if (!dma_image) - printf("Warning! GUS DMA not selected\n"); - - tmp = gus_dma_map[gus_dma2] << 3; - if (!tmp) { - printf("Warning! Invalid GUS MAX DMA\n"); - tmp = 0x40; /* Combine DMA channels */ - dual_dma_mode = 0; - } - dma_image |= tmp; - } - - /* - * For some reason the IRQ and DMA addresses must be written twice - */ - - /* - * Doing it first time - */ - - outb(u_Mixer, mix_image); /* Select DMA control */ - outb(u_IRQDMAControl, dma_image | 0x80); /* Set DMA address */ - - outb(u_Mixer, mix_image | 0x40); /* Select IRQ control */ - outb(u_IRQDMAControl, irq_image); /* Set IRQ address */ - - /* - * Doing it second time - */ - - outb(u_Mixer, mix_image); /* Select DMA control */ - outb(u_IRQDMAControl, dma_image); /* Set DMA address */ - - outb(u_Mixer, mix_image | 0x40); /* Select IRQ control */ - outb(u_IRQDMAControl, irq_image); /* Set IRQ address */ - - gus_select_voice(0); /* This disables writes to IRQ/DMA reg */ - - mix_image &= ~0x02; /* Enable line out */ - mix_image |= 0x08; /* Enable IRQ */ - outb(u_Mixer, mix_image); /* Turn mixer channels on Note! Mic - * in is left off. */ - - gus_select_voice(0); /* This disables writes to IRQ/DMA reg */ - - gusintr(0); /* Serve pending interrupts */ - splx(flags); -} - -int -gus_wave_detect(int baseaddr) -{ - u_long i; - u_long loc; - gus_base = baseaddr; - - gus_write8(0x4c, 0); /* Reset GF1 */ - gus_delay(); - gus_delay(); - - gus_write8(0x4c, 1); /* Release Reset */ - gus_delay(); - gus_delay(); - - /* See if there is first block there.... */ - gus_poke(0L, 0xaa); - if (gus_peek(0L) != 0xaa) - return (0); - - /* Now zero it out so that I can check for mirroring .. */ - gus_poke(0L, 0x00); - for (i = 1L; i < 1024L; i++) { - int n, failed; - - /* check for mirroring ... */ - if (gus_peek(0L) != 0) - break; - loc = i << 10; - - for (n = loc - 1, failed = 0; n <= loc; n++) { - gus_poke(loc, 0xaa); - if (gus_peek(loc) != 0xaa) - failed = 1; - - gus_poke(loc, 0x55); - if (gus_peek(loc) != 0x55) - failed = 1; - } - - if (failed) - break; - } - gus_mem_size = i << 10; - return 1; -} - -static int -guswave_ioctl(int dev, - u_int cmd, ioctl_arg arg) -{ - - switch (cmd) { - case SNDCTL_SYNTH_INFO: - gus_info.nr_voices = nr_voices; - bcopy(&gus_info, &(((char *) arg)[0]), sizeof(gus_info)); - return 0; - break; - - case SNDCTL_SEQ_RESETSAMPLES: - reset_sample_memory(); - return 0; - break; - - case SNDCTL_SEQ_PERCMODE: - return 0; - break; - - case SNDCTL_SYNTH_MEMAVL: - return gus_mem_size - free_mem_ptr - 32; - - default: - return -(EINVAL); - } -} - -static int -guswave_set_instr(int dev, int voice, int instr_no) -{ - int sample_no; - - if (instr_no < 0 || instr_no > MAX_PATCH) - return -(EINVAL); - - if (voice < 0 || voice > 31) - return -(EINVAL); - - if (voices[voice].volume_irq_mode == VMODE_START_NOTE) { - voices[voice].sample_pending = instr_no; - return 0; - } - sample_no = patch_table[instr_no]; - patch_map[voice] = -1; - - if (sample_no < 0) { - printf("GUS: Undefined patch %d for voice %d\n", instr_no, voice); - return -(EINVAL); /* Patch not defined */ - } - if (sample_ptrs[sample_no] == -1) { /* Sample not loaded */ - printf("GUS: Sample #%d not loaded for patch %d (voice %d)\n", - sample_no, instr_no, voice); - return -(EINVAL); - } - sample_map[voice] = sample_no; - patch_map[voice] = instr_no; - return 0; -} - -static int -guswave_kill_note(int dev, int voice, int note, int velocity) -{ - u_long flags; - - flags = splhigh(); - /* voice_alloc->map[voice] = 0xffff; */ - if (voices[voice].volume_irq_mode == VMODE_START_NOTE) { - voices[voice].kill_pending = 1; - splx(flags); - } else { - splx(flags); - gus_voice_fade(voice); - } - - splx(flags); - return 0; -} - -static void -guswave_aftertouch(int dev, int voice, int pressure) -{ -} - -static void -guswave_panning(int dev, int voice, int value) -{ - if (voice >= 0 || voice < 32) - voices[voice].panning = value; -} - -static void -guswave_volume_method(int dev, int mode) -{ - if (mode == VOL_METHOD_LINEAR || mode == VOL_METHOD_ADAGIO) - volume_method = mode; -} - -static void -compute_volume(int voice, int volume) -{ - if (volume < 128) - voices[voice].midi_volume = volume; - - switch (volume_method) { - case VOL_METHOD_ADAGIO: - voices[voice].initial_volume = - gus_adagio_vol(voices[voice].midi_volume, voices[voice].main_vol, - voices[voice].expression_vol, voices[voice].patch_vol); - break; - - case VOL_METHOD_LINEAR:/* Totally ignores patch-volume and expression */ - voices[voice].initial_volume = - gus_linear_vol(volume, voices[voice].main_vol); - break; - - default: - voices[voice].initial_volume = volume_base + - (voices[voice].midi_volume * volume_scale); - } - - if (voices[voice].initial_volume > 4030) - voices[voice].initial_volume = 4030; -} - -static void -compute_and_set_volume(int voice, int volume, int ramp_time) -{ - int curr, target, rate; - u_long flags; - - compute_volume(voice, volume); - voices[voice].current_volume = voices[voice].initial_volume; - - flags = splhigh(); - /* - * CAUTION! Interrupts disabled. Enable them before returning - */ - - gus_select_voice(voice); - - curr = gus_read16(0x09) >> 4; - target = voices[voice].initial_volume; - - if (ramp_time == INSTANT_RAMP) { - gus_rampoff(); - gus_voice_volume(target); - splx(flags); - return; - } - if (ramp_time == FAST_RAMP) - rate = 63; - else - rate = 16; - gus_ramp_rate(0, rate); - - if ((target - curr) / 64 == 0) { /* Close enough to target. */ - gus_rampoff(); - gus_voice_volume(target); - splx(flags); - return; - } - if (target > curr) { - if (target > (4095 - 65)) - target = 4095 - 65; - gus_ramp_range(curr, target); - gus_rampon(0x00); /* Ramp up, once, no IRQ */ - } else { - if (target < 65) - target = 65; - - gus_ramp_range(target, curr); - gus_rampon(0x40); /* Ramp down, once, no irq */ - } - splx(flags); -} - -static void -dynamic_volume_change(int voice) -{ - u_char status; - u_long flags; - - flags = splhigh(); - gus_select_voice(voice); - status = gus_read8(0x00); /* Get voice status */ - splx(flags); - - if (status & 0x03) - return; /* Voice was not running */ - - if (!(voices[voice].mode & WAVE_ENVELOPES)) { - compute_and_set_volume(voice, voices[voice].midi_volume, 1); - return; - } - /* - * Voice is running and has envelopes. - */ - - flags = splhigh(); - gus_select_voice(voice); - status = gus_read8(0x0d); /* Ramping status */ - splx(flags); - - if (status & 0x03) { /* Sustain phase? */ - compute_and_set_volume(voice, voices[voice].midi_volume, 1); - return; - } - if (voices[voice].env_phase < 0) - return; - - compute_volume(voice, voices[voice].midi_volume); - -} - -static void -guswave_controller(int dev, int voice, int ctrl_num, int value) -{ - u_long flags; - u_long freq; - - if (voice < 0 || voice > 31) - return; - - switch (ctrl_num) { - case CTRL_PITCH_BENDER: - voices[voice].bender = value; - - if (voices[voice].volume_irq_mode != VMODE_START_NOTE) { - freq = compute_finetune(voices[voice].orig_freq, value, - voices[voice].bender_range); - voices[voice].current_freq = freq; - - flags = splhigh(); - gus_select_voice(voice); - gus_voice_freq(freq); - splx(flags); - } - break; - - case CTRL_PITCH_BENDER_RANGE: - voices[voice].bender_range = value; - break; - case CTL_EXPRESSION: - value /= 128; - case CTRL_EXPRESSION: - if (volume_method == VOL_METHOD_ADAGIO) { - voices[voice].expression_vol = value; - if (voices[voice].volume_irq_mode != VMODE_START_NOTE) - dynamic_volume_change(voice); - } - break; - - case CTL_PAN: - voices[voice].panning = (value * 2) - 128; - break; - - case CTL_MAIN_VOLUME: - value = (value * 100) / 16383; - - case CTRL_MAIN_VOLUME: - voices[voice].main_vol = value; - if (voices[voice].volume_irq_mode != VMODE_START_NOTE) - dynamic_volume_change(voice); - break; - - default: - break; - } -} - -static int -guswave_start_note2(int dev, int voice, int note_num, int volume) -{ - int sample, best_sample, best_delta, delta_freq; - int is16bits, samplep, patch, pan; - u_long note_freq, base_note, freq, flags; - u_char mode = 0; - - if (voice < 0 || voice > 31) { - printf("GUS: Invalid voice\n"); - return -(EINVAL); - } - if (note_num == 255) { - if (voices[voice].mode & WAVE_ENVELOPES) { - voices[voice].midi_volume = volume; - dynamic_volume_change(voice); - return 0; - } - compute_and_set_volume(voice, volume, 1); - return 0; - } - if ((patch = patch_map[voice]) == -1) - return -(EINVAL); - if ((samplep = patch_table[patch]) == -1) - return -(EINVAL); - note_freq = note_to_freq(note_num); - - /* - * Find a sample within a patch so that the note_freq is between - * low_note and high_note. - */ - sample = -1; - - best_sample = samplep; - best_delta = 1000000; - while (samplep >= 0 && sample == -1) { - dbg_samples = samples; - dbg_samplep = samplep; - - delta_freq = note_freq - samples[samplep].base_note; - if (delta_freq < 0) - delta_freq = -delta_freq; - if (delta_freq < best_delta) { - best_sample = samplep; - best_delta = delta_freq; - } - if (samples[samplep].low_note <= note_freq && - note_freq <= samples[samplep].high_note) - sample = samplep; - else - samplep = samples[samplep].key; /* Follow link */ - } - if (sample == -1) - sample = best_sample; - - if (sample == -1) { - printf("GUS: Patch %d not defined for note %d\n", patch, note_num); - return 0; /* Should play default patch ??? */ - } - is16bits = (samples[sample].mode & WAVE_16_BITS) ? 1 : 0; - voices[voice].mode = samples[sample].mode; - voices[voice].patch_vol = samples[sample].volume; - - if (voices[voice].mode & WAVE_ENVELOPES) { - int i; - - for (i = 0; i < 6; i++) { - voices[voice].env_rate[i] = samples[sample].env_rate[i]; - voices[voice].env_offset[i] = samples[sample].env_offset[i]; - } - } - sample_map[voice] = sample; - - base_note = samples[sample].base_note / 100; /* Try to avoid overflows */ - note_freq /= 100; - - freq = samples[sample].base_freq * note_freq / base_note; - - voices[voice].orig_freq = freq; - - /* - * Since the pitch bender may have been set before playing the note, - * we have to calculate the bending now. - */ - - freq = compute_finetune(voices[voice].orig_freq, voices[voice].bender, - voices[voice].bender_range); - voices[voice].current_freq = freq; - - pan = (samples[sample].panning + voices[voice].panning) / 32; - pan += 7; - if (pan < 0) - pan = 0; - if (pan > 15) - pan = 15; - - if (samples[sample].mode & WAVE_16_BITS) { - mode |= 0x04; /* 16 bits */ - if ((sample_ptrs[sample] >> 18) != - ((sample_ptrs[sample] + samples[sample].len) >> 18)) - printf("GUS: Sample address error\n"); - } - /* - * CAUTION! Interrupts disabled. Don't return before enabling - */ - - flags = splhigh(); - gus_select_voice(voice); - gus_voice_off(); - gus_rampoff(); - - splx(flags); - - if (voices[voice].mode & WAVE_ENVELOPES) { - compute_volume(voice, volume); - init_envelope(voice); - } else { - compute_and_set_volume(voice, volume, 0); - } - - flags = splhigh(); - gus_select_voice(voice); - - if (samples[sample].mode & WAVE_LOOP_BACK) - gus_write_addr(0x0a, sample_ptrs[sample] + samples[sample].len - - voices[voice].offset_pending, is16bits); /* start=end */ - else - gus_write_addr(0x0a, sample_ptrs[sample] + voices[voice].offset_pending, - is16bits); /* Sample start=begin */ - - if (samples[sample].mode & WAVE_LOOPING) { - mode |= 0x08; - - if (samples[sample].mode & WAVE_BIDIR_LOOP) - mode |= 0x10; - - if (samples[sample].mode & WAVE_LOOP_BACK) { - gus_write_addr(0x0a, - sample_ptrs[sample] + samples[sample].loop_end - - voices[voice].offset_pending, is16bits); - mode |= 0x40; - } - gus_write_addr(0x02, sample_ptrs[sample] + samples[sample].loop_start, - is16bits); /* Loop start location */ - gus_write_addr(0x04, sample_ptrs[sample] + samples[sample].loop_end, - is16bits); /* Loop end location */ - } else { - mode |= 0x20; /* Loop IRQ at the end */ - voices[voice].loop_irq_mode = LMODE_FINISH; /* Ramp down at the end */ - voices[voice].loop_irq_parm = 1; - gus_write_addr(0x02, sample_ptrs[sample], - is16bits); /* Loop start location */ - gus_write_addr(0x04, sample_ptrs[sample] + samples[sample].len - 1, - is16bits); /* Loop end location */ - } - gus_voice_freq(freq); - gus_voice_balance(pan); - gus_voice_on(mode); - splx(flags); - - return 0; -} - -/* - * New guswave_start_note by Andrew J. Robinson attempts to minimize clicking - * when the note playing on the voice is changed. It uses volume ramping. - */ - -static int -guswave_start_note(int dev, int voice, int note_num, int volume) -{ - long int flags; - int mode; - int ret_val = 0; - - flags = splhigh(); - if (note_num == 255) { - if (voices[voice].volume_irq_mode == VMODE_START_NOTE) { - voices[voice].volume_pending = volume; - } else { - ret_val = guswave_start_note2(dev, voice, note_num, volume); - } - } else { - gus_select_voice(voice); - mode = gus_read8(0x00); - if (mode & 0x20) - gus_write8(0x00, mode & 0xdf); /* No interrupt! */ - - voices[voice].offset_pending = 0; - voices[voice].kill_pending = 0; - voices[voice].volume_irq_mode = 0; - voices[voice].loop_irq_mode = 0; - - if (voices[voice].sample_pending >= 0) { - splx(flags); /* Run temporarily with interrupts - * enabled */ - guswave_set_instr(voices[voice].dev_pending, voice, - voices[voice].sample_pending); - voices[voice].sample_pending = -1; - flags = splhigh(); - gus_select_voice(voice); /* Reselect the voice - * (just to be sure) */ - } - if ((mode & 0x01) || (int) ((gus_read16(0x09) >> 4) < 2065)) { - ret_val = guswave_start_note2(dev, voice, note_num, volume); - } else { - voices[voice].dev_pending = dev; - voices[voice].note_pending = note_num; - voices[voice].volume_pending = volume; - voices[voice].volume_irq_mode = VMODE_START_NOTE; - - gus_rampoff(); - gus_ramp_range(2000, 4065); - gus_ramp_rate(0, 63); /* Fastest possible rate */ - gus_rampon(0x20 | 0x40); /* Ramp down, once, irq */ - } - } - splx(flags); - return ret_val; -} - -static void -guswave_reset(int dev) -{ - int i; - - for (i = 0; i < 32; i++) { - gus_voice_init(i); - gus_voice_init2(i); - } -} - -static int -guswave_open(int dev, int mode) -{ - int err; - int otherside = audio_devs[dev]->otherside; - - if (otherside != -1) { - if (audio_devs[otherside]->busy) - return -(EBUSY); - } - if (audio_devs[dev]->busy) - return -(EBUSY); - - gus_initialize(); - voice_alloc->timestamp = 0; - - if ((err = DMAbuf_open_dma(gus_devnum)) < 0) { - printf("GUS: Loading saples without DMA\n"); - gus_no_dma = 1; /* Upload samples using PIO */ - } else - gus_no_dma = 0; - - dram_sleep_flag.aborting = 0; - dram_sleep_flag.mode = WK_NONE; - active_device = GUS_DEV_WAVE; - - audio_devs[dev]->busy = 1; - gus_reset(); - - return 0; -} - -static void -guswave_close(int dev) -{ - int otherside = audio_devs[dev]->otherside; - - if (otherside != -1) { - if (audio_devs[otherside]->busy) - return; - } - audio_devs[dev]->busy = 0; - - active_device = 0; - gus_reset(); - - if (!gus_no_dma) - DMAbuf_close_dma(gus_devnum); -} - -static int -guswave_load_patch(int dev, int format, snd_rw_buf * addr, - int offs, int count, int pmgr_flag) -{ - struct patch_info patch; - int instr; - long sizeof_patch; - - u_long blk_size, blk_end, left, src_offs, target; - - sizeof_patch = offsetof(struct patch_info, data); /* Header size */ - - if (format != GUS_PATCH) { - printf("GUS Error: Invalid patch format (key) 0x%x\n", format); - return -(EINVAL); - } - if (count < sizeof_patch) { - printf("GUS Error: Patch header too short\n"); - return -(EINVAL); - } - count -= sizeof_patch; - - if (free_sample >= MAX_SAMPLE) { - printf("GUS: Sample table full\n"); - return -(ENOSPC); - } - /* - * Copy the header from user space but ignore the first bytes which - * have been transferred already. - */ - - if (uiomove(&((char *) &patch)[offs], sizeof_patch - offs, addr)) { - printf("audio: Bad copyin()!\n"); - }; - - instr = patch.instr_no; - - if (instr < 0 || instr > MAX_PATCH) { - printf("GUS: Invalid patch number %d\n", instr); - return -(EINVAL); - } - if (count < patch.len) { - printf("GUS Warning: Patch record too short (%d<%d)\n", - count, (int) patch.len); - patch.len = count; - } - if (patch.len <= 0 || patch.len > gus_mem_size) { - printf("GUS: Invalid sample length %d\n", (int) patch.len); - return -(EINVAL); - } - if (patch.mode & WAVE_LOOPING) { - if (patch.loop_start < 0 || patch.loop_start >= patch.len) { - printf("GUS: Invalid loop start\n"); - return -(EINVAL); - } - if (patch.loop_end < patch.loop_start || patch.loop_end > patch.len) { - printf("GUS: Invalid loop end\n"); - return -(EINVAL); - } - } - free_mem_ptr = (free_mem_ptr + 31) & ~31; /* 32 byte alignment */ - -#define GUS_BANK_SIZE (256*1024) - - if (patch.mode & WAVE_16_BITS) { - /* - * 16 bit samples must fit one 256k bank. - */ - if (patch.len >= GUS_BANK_SIZE) { - printf("GUS: Sample (16 bit) too long %d\n", (int) patch.len); - return -(ENOSPC); - } - if ((free_mem_ptr / GUS_BANK_SIZE) != - ((free_mem_ptr + patch.len) / GUS_BANK_SIZE)) { - u_long tmp_mem = /* Aligning to 256K */ - ((free_mem_ptr / GUS_BANK_SIZE) + 1) * GUS_BANK_SIZE; - - if ((tmp_mem + patch.len) > gus_mem_size) - return -(ENOSPC); - - free_mem_ptr = tmp_mem; /* This leaves unusable memory */ - } - } - if ((free_mem_ptr + patch.len) > gus_mem_size) - return -(ENOSPC); - - sample_ptrs[free_sample] = free_mem_ptr; - - /* - * Tremolo is not possible with envelopes - */ - - if (patch.mode & WAVE_ENVELOPES) - patch.mode &= ~WAVE_TREMOLO; - - bcopy(&patch, (char *) &samples[free_sample], sizeof_patch); - - /* - * Link this_one sample to the list of samples for patch 'instr'. - */ - - samples[free_sample].key = patch_table[instr]; - patch_table[instr] = free_sample; - - /* - * Use DMA to transfer the wave data to the DRAM - */ - - left = patch.len; - src_offs = 0; - target = free_mem_ptr; - - while (left) { /* Not completely transferred yet */ - /* blk_size = audio_devs[gus_devnum]->buffsize; */ - blk_size = audio_devs[gus_devnum]->dmap_out->bytes_in_use; - if (blk_size > left) - blk_size = left; - - /* - * DMA cannot cross 256k bank boundaries. Check for that. - */ - blk_end = target + blk_size; - - if ((target >> 18) != (blk_end >> 18)) { /* Split the block */ - blk_end &= ~(256 * 1024 - 1); - blk_size = blk_end - target; - } - if (gus_no_dma) { - /* - * For some reason the DMA is not possible. We have - * to use PIO. - */ - long i; - u_char data; - - for (i = 0; i < blk_size; i++) { - uiomove((char *) &(data), 1, addr); - if (patch.mode & WAVE_UNSIGNED) - if (!(patch.mode & WAVE_16_BITS) || (i & 0x01)) - data ^= 0x80; /* Convert to signed */ - gus_poke(target + i, data); - } - } else { - u_long address, hold_address; - u_char dma_command; - u_long flags; - - /* - * OK, move now. First in and then out. - */ - - if (uiomove(audio_devs[gus_devnum]->dmap_out->raw_buf, blk_size, addr)) { - printf("audio: Bad copyin()!\n"); - }; - - flags = splhigh(); - /******** INTERRUPTS DISABLED NOW ********/ - gus_write8(0x41, 0); /* Disable GF1 DMA */ - DMAbuf_start_dma(gus_devnum, - audio_devs[gus_devnum]->dmap_out->raw_buf_phys, - blk_size, 1); - - /* - * Set the DRAM address for the wave data - */ - - address = target; - - if (audio_devs[gus_devnum]->dmachan1 > 3) { - hold_address = address; - address = address >> 1; - address &= 0x0001ffffL; - address |= (hold_address & 0x000c0000L); - } - gus_write16(0x42, (address >> 4) & 0xffff); /* DRAM DMA address */ - - /* - * Start the DMA transfer - */ - - dma_command = 0x21; /* IRQ enable, DMA start */ - if (patch.mode & WAVE_UNSIGNED) - dma_command |= 0x80; /* Invert MSB */ - if (patch.mode & WAVE_16_BITS) - dma_command |= 0x40; /* 16 bit _DATA_ */ - if (audio_devs[gus_devnum]->dmachan1 > 3) - dma_command |= 0x04; /* 16 bit DMA _channel_ */ - - gus_write8(0x41, dma_command); /* Lets bo luteet (=bugs) */ - - /* - * Sleep here until the DRAM DMA done interrupt is - * served - */ - active_device = GUS_DEV_WAVE; - - - { - int chn; - - dram_sleep_flag.mode = WK_SLEEP; - dram_sleeper = &chn; - DO_SLEEP(chn, dram_sleep_flag, hz); - - }; - if ((dram_sleep_flag.mode & WK_TIMEOUT)) - printf("GUS: DMA Transfer timed out\n"); - splx(flags); - } - - /* - * Now the next part - */ - - left -= blk_size; - src_offs += blk_size; - target += blk_size; - - gus_write8(0x41, 0); /* Stop DMA */ - } - - free_mem_ptr += patch.len; - - if (!pmgr_flag) - pmgr_inform(dev, PM_E_PATCH_LOADED, instr, free_sample, 0, 0); - free_sample++; - return 0; -} - -static void -guswave_hw_control(int dev, u_char *event) -{ - int voice, cmd; - u_short p1, p2; - u_long plong, flags; - - cmd = event[2]; - voice = event[3]; - p1 = *(u_short *) &event[4]; - p2 = *(u_short *) &event[6]; - plong = *(u_long *) &event[4]; - - if ((voices[voice].volume_irq_mode == VMODE_START_NOTE) && - (cmd != _GUS_VOICESAMPLE) && (cmd != _GUS_VOICE_POS)) - do_volume_irq(voice); - - switch (cmd) { - - case _GUS_NUMVOICES: - flags = splhigh(); - gus_select_voice(voice); - gus_select_max_voices(p1); - splx(flags); - break; - - case _GUS_VOICESAMPLE: - guswave_set_instr(dev, voice, p1); - break; - - case _GUS_VOICEON: - flags = splhigh(); - gus_select_voice(voice); - p1 &= ~0x20; /* Don't allow interrupts */ - gus_voice_on(p1); - splx(flags); - break; - - case _GUS_VOICEOFF: - flags = splhigh(); - gus_select_voice(voice); - gus_voice_off(); - splx(flags); - break; - - case _GUS_VOICEFADE: - gus_voice_fade(voice); - break; - - case _GUS_VOICEMODE: - flags = splhigh(); - gus_select_voice(voice); - p1 &= ~0x20; /* Don't allow interrupts */ - gus_voice_mode(p1); - splx(flags); - break; - - case _GUS_VOICEBALA: - flags = splhigh(); - gus_select_voice(voice); - gus_voice_balance(p1); - splx(flags); - break; - - case _GUS_VOICEFREQ: - flags = splhigh(); - gus_select_voice(voice); - gus_voice_freq(plong); - splx(flags); - break; - - case _GUS_VOICEVOL: - flags = splhigh(); - gus_select_voice(voice); - gus_voice_volume(p1); - splx(flags); - break; - - case _GUS_VOICEVOL2: /* Just update the software voice level */ - voices[voice].initial_volume = - voices[voice].current_volume = p1; - break; - - case _GUS_RAMPRANGE: - if (voices[voice].mode & WAVE_ENVELOPES) - break; /* NO-NO */ - flags = splhigh(); - gus_select_voice(voice); - gus_ramp_range(p1, p2); - splx(flags); - break; - - case _GUS_RAMPRATE: - if (voices[voice].mode & WAVE_ENVELOPES) - break; /* NJET-NJET */ - flags = splhigh(); - gus_select_voice(voice); - gus_ramp_rate(p1, p2); - splx(flags); - break; - - case _GUS_RAMPMODE: - if (voices[voice].mode & WAVE_ENVELOPES) - break; /* NO-NO */ - flags = splhigh(); - gus_select_voice(voice); - p1 &= ~0x20; /* Don't allow interrupts */ - gus_ramp_mode(p1); - splx(flags); - break; - - case _GUS_RAMPON: - if (voices[voice].mode & WAVE_ENVELOPES) - break; /* EI-EI */ - flags = splhigh(); - gus_select_voice(voice); - p1 &= ~0x20; /* Don't allow interrupts */ - gus_rampon(p1); - splx(flags); - break; - - case _GUS_RAMPOFF: - if (voices[voice].mode & WAVE_ENVELOPES) - break; /* NEJ-NEJ */ - flags = splhigh(); - gus_select_voice(voice); - gus_rampoff(); - splx(flags); - break; - - case _GUS_VOLUME_SCALE: - volume_base = p1; - volume_scale = p2; - break; - - case _GUS_VOICE_POS: - flags = splhigh(); - gus_select_voice(voice); - gus_set_voice_pos(voice, plong); - splx(flags); - break; - - default:; - } -} - -static int -gus_sampling_set_speed(int speed) -{ - - if (speed <= 0) - speed = gus_sampling_speed; - - RANGE(speed, 4000, 44100); - gus_sampling_speed = speed; - - if (only_read_access) { - /* Compute nearest valid recording speed and return it */ - - speed = (9878400 / (gus_sampling_speed + 2)) / 16; - speed = (9878400 / (speed * 16)) - 2; - } - return speed; -} - -static int -gus_sampling_set_channels(int channels) -{ - if (!channels) - return gus_sampling_channels; - RANGE(channels, 1, 2); - gus_sampling_channels = channels; - return channels; -} - -static int -gus_sampling_set_bits(int bits) -{ - if (!bits) - return gus_sampling_bits; - - if (bits != 8 && bits != 16) - bits = 8; - - if (only_8_bits) - bits = 8; - - gus_sampling_bits = bits; - return bits; -} - -static int -gus_sampling_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) -{ - switch (cmd) { - case SOUND_PCM_WRITE_RATE: - if (local) - return gus_sampling_set_speed((int) arg); - return *(int *) arg = gus_sampling_set_speed((*(int *) arg)); - break; - - case SOUND_PCM_READ_RATE: - if (local) - return gus_sampling_speed; - return *(int *) arg = gus_sampling_speed; - break; - - case SNDCTL_DSP_STEREO: - if (local) - return gus_sampling_set_channels((int) arg + 1) - 1; - return *(int *) arg = gus_sampling_set_channels((*(int *) arg) + 1) - 1; - break; - - case SOUND_PCM_WRITE_CHANNELS: - if (local) - return gus_sampling_set_channels((int) arg); - return *(int *) arg = gus_sampling_set_channels((*(int *) arg)); - break; - - case SOUND_PCM_READ_CHANNELS: - if (local) - return gus_sampling_channels; - return *(int *) arg = gus_sampling_channels; - break; - - case SNDCTL_DSP_SETFMT: - if (local) - return gus_sampling_set_bits((int) arg); - return *(int *) arg = gus_sampling_set_bits((*(int *) arg)); - break; - - case SOUND_PCM_READ_BITS: - if (local) - return gus_sampling_bits; - return *(int *) arg = gus_sampling_bits; - - case SOUND_PCM_WRITE_FILTER: /* NOT POSSIBLE */ - return *(int *) arg = -(EINVAL); - break; - - case SOUND_PCM_READ_FILTER: - return *(int *) arg = -(EINVAL); - break; - - } - return -(EINVAL); -} - -static void -gus_sampling_reset(int dev) -{ - if (recording_active) { - gus_write8(0x49, 0x00); /* Halt recording */ - set_input_volumes(); - } -} - -static int -gus_sampling_open(int dev, int mode) -{ - - int otherside = audio_devs[dev]->otherside; - if (otherside != -1) { - if (audio_devs[otherside]->busy) - return -(EBUSY); - } - if (audio_devs[dev]->busy) - return -(EBUSY); - - - gus_initialize(); - - active_device = 0; - - gus_reset(); - reset_sample_memory(); - gus_select_max_voices(14); - - pcm_active = 0; - dma_active = 0; - pcm_opened = 1; - audio_devs[dev]->busy = 1; - - if (mode & OPEN_READ) { - recording_active = 1; - set_input_volumes(); - } - only_read_access = !(mode & OPEN_WRITE); - only_8_bits = mode & OPEN_READ; - if (only_8_bits) - audio_devs[dev]->format_mask = AFMT_U8; - else - audio_devs[dev]->format_mask = AFMT_U8 | AFMT_S16_LE; - - return 0; -} - -static void -gus_sampling_close(int dev) -{ - int otherside = audio_devs[dev]->otherside; - audio_devs[dev]->busy = 0; - - if (otherside != -1) { - if (audio_devs[otherside]->busy) - return; - } - gus_reset(); - - pcm_opened = 0; - active_device = 0; - - if (recording_active) { - gus_write8(0x49, 0x00); /* Halt recording */ - set_input_volumes(); - } - recording_active = 0; -} - -static void -gus_sampling_update_volume(void) -{ - u_long flags; - int voice; - - if (pcm_active && pcm_opened) - for (voice = 0; voice < gus_sampling_channels; voice++) { - flags = splhigh(); - gus_select_voice(voice); - gus_rampoff(); - gus_voice_volume(1530 + (25 * gus_pcm_volume)); - gus_ramp_range(65, 1530 + (25 * gus_pcm_volume)); - splx(flags); - } -} - -static void -play_next_pcm_block(void) -{ - u_long flags; - int speed = gus_sampling_speed; - int this_one, is16bits, chn; - u_long dram_loc; - u_char mode[2], ramp_mode[2]; - - if (!pcm_qlen) - return; - - this_one = pcm_head; - - for (chn = 0; chn < gus_sampling_channels; chn++) { - mode[chn] = 0x00; - ramp_mode[chn] = 0x03; /* Ramping and rollover off */ - - if (chn == 0) { - mode[chn] |= 0x20; /* Loop IRQ */ - voices[chn].loop_irq_mode = LMODE_PCM; - } - if (gus_sampling_bits != 8) { - is16bits = 1; - mode[chn] |= 0x04; /* 16 bit data */ - } else - is16bits = 0; - - dram_loc = this_one * pcm_bsize; - dram_loc += chn * pcm_banksize; - - if (this_one == (pcm_nblk - 1)) { /* Last fragment of the - * DRAM buffer */ - mode[chn] |= 0x08; /* Enable loop */ - ramp_mode[chn] = 0x03; /* Disable rollover bit */ - } else { - if (chn == 0) - ramp_mode[chn] = 0x04; /* Enable rollover bit */ - } - - flags = splhigh(); - gus_select_voice(chn); - gus_voice_freq(speed); - - if (gus_sampling_channels == 1) - gus_voice_balance(7); /* mono */ - else if (chn == 0) - gus_voice_balance(0); /* left */ - else - gus_voice_balance(15); /* right */ - - if (!pcm_active) { /* Playback not already active */ - /* - * The playback was not started yet (or there has - * been a pause). Start the voice (again) and ask for - * a rollover irq at the end of this_one block. If - * this_one one is last of the buffers, use just the - * normal loop with irq. - */ - - gus_voice_off(); - gus_rampoff(); - gus_voice_volume(1530 + (25 * gus_pcm_volume)); - gus_ramp_range(65, 1530 + (25 * gus_pcm_volume)); - - gus_write_addr(0x0a, dram_loc, is16bits); /* Starting position */ - gus_write_addr(0x02, chn * pcm_banksize, is16bits); /* Loop start */ - - if (chn != 0) - gus_write_addr(0x04, pcm_banksize + (pcm_bsize * pcm_nblk) - 1, - is16bits); /* Loop end location */ - } - if (chn == 0) - gus_write_addr(0x04, dram_loc + pcm_datasize[this_one] - 1, - is16bits); /* Loop end location */ - else - mode[chn] |= 0x08; /* Enable looping */ - - if (pcm_datasize[this_one] != pcm_bsize) { - /* - * Incompletely filled block. Possibly the last one. - */ - if (chn == 0) { - mode[chn] &= ~0x08; /* Disable looping */ - mode[chn] |= 0x20; /* Enable IRQ at the end */ - voices[0].loop_irq_mode = LMODE_PCM_STOP; - ramp_mode[chn] = 0x03; /* No rollover bit */ - } else { - gus_write_addr(0x04, dram_loc + pcm_datasize[this_one], - is16bits); /* Loop end location */ - mode[chn] &= ~0x08; /* Disable looping */ - } - } - splx(flags); - } - - for (chn = 0; chn < gus_sampling_channels; chn++) { - flags = splhigh(); - gus_select_voice(chn); - gus_write8(0x0d, ramp_mode[chn]); - gus_voice_on(mode[chn]); - splx(flags); - } - - pcm_active = 1; -} - -static void -gus_transfer_output_block(int dev, u_long buf, - int total_count, int intrflag, int chn) -{ - /* - * This routine transfers one block of audio data to the DRAM. In - * mono mode it's called just once. When in stereo mode, this_one - * routine is called once for both channels. - * - * The left/mono channel data is transferred to the beginning of dram - * and the right data to the area pointed by gus_page_size. - */ - - int this_one, count; - u_long flags; - u_char dma_command; - u_long address, hold_address; - - flags = splhigh(); - - count = total_count / gus_sampling_channels; - - if (chn == 0) { - if (pcm_qlen >= pcm_nblk) - printf("GUS Warning: PCM buffers out of sync\n"); - - this_one = pcm_current_block = pcm_tail; - pcm_qlen++; - pcm_tail = (pcm_tail + 1) % pcm_nblk; - pcm_datasize[this_one] = count; - } else - this_one = pcm_current_block; - - gus_write8(0x41, 0); /* Disable GF1 DMA */ - DMAbuf_start_dma(dev, buf + (chn * count), count, 1); - - address = this_one * pcm_bsize; - address += chn * pcm_banksize; - - if (audio_devs[dev]->dmachan1 > 3) { - hold_address = address; - address = address >> 1; - address &= 0x0001ffffL; - address |= (hold_address & 0x000c0000L); - } - gus_write16(0x42, (address >> 4) & 0xffff); /* DRAM DMA address */ - - dma_command = 0x21; /* IRQ enable, DMA start */ - - if (gus_sampling_bits != 8) - dma_command |= 0x40; /* 16 bit _DATA_ */ - else - dma_command |= 0x80; /* Invert MSB */ - - if (audio_devs[dev]->dmachan1 > 3) - dma_command |= 0x04; /* 16 bit DMA channel */ - - gus_write8(0x41, dma_command); /* Kickstart */ - - if (chn == (gus_sampling_channels - 1)) { /* Last channel */ - /* - * Last (right or mono) channel data - */ - dma_active = 1; /* DMA started. There is a unacknowledged - * buffer */ - active_device = GUS_DEV_PCM_DONE; - if (!pcm_active && (pcm_qlen > 0 || count < pcm_bsize)) { - play_next_pcm_block(); - } - } else { - /* - * Left channel data. The right channel is transferred after - * DMA interrupt - */ - active_device = GUS_DEV_PCM_CONTINUE; - } - - splx(flags); -} - -static void -gus_sampling_output_block(int dev, u_long buf, int total_count, - int intrflag, int restart_dma) -{ - pcm_current_buf = buf; - pcm_current_count = total_count; - pcm_current_intrflag = intrflag; - pcm_current_dev = dev; - gus_transfer_output_block(dev, buf, total_count, intrflag, 0); -} - -static void -gus_sampling_start_input(int dev, u_long buf, int count, - int intrflag, int restart_dma) -{ - u_long flags; - u_char mode; - - flags = splhigh(); - - DMAbuf_start_dma(dev, buf, count, 0); - - mode = 0xa0; /* DMA IRQ enabled, invert MSB */ - - if (audio_devs[dev]->dmachan2 > 3) - mode |= 0x04; /* 16 bit DMA channel */ - if (gus_sampling_channels > 1) - mode |= 0x02; /* Stereo */ - mode |= 0x01; /* DMA enable */ - - gus_write8(0x49, mode); - - splx(flags); -} - -static int -gus_sampling_prepare_for_input(int dev, int bsize, int bcount) -{ - u_int rate; - - rate = (9878400 / (gus_sampling_speed + 2)) / 16; - - gus_write8(0x48, rate & 0xff); /* Set sampling rate */ - - if (gus_sampling_bits != 8) { - printf("GUS Error: 16 bit recording not supported\n"); - return -(EINVAL); - } - return 0; -} - -static int -gus_sampling_prepare_for_output(int dev, int bsize, int bcount) -{ - int i; - - long mem_ptr, mem_size; - - mem_ptr = 0; - mem_size = gus_mem_size / gus_sampling_channels; - - if (mem_size > (256 * 1024)) - mem_size = 256 * 1024; - - pcm_bsize = bsize / gus_sampling_channels; - pcm_head = pcm_tail = pcm_qlen = 0; - - pcm_nblk = MAX_PCM_BUFFERS; - if ((pcm_bsize * pcm_nblk) > mem_size) - pcm_nblk = mem_size / pcm_bsize; - - for (i = 0; i < pcm_nblk; i++) - pcm_datasize[i] = 0; - - pcm_banksize = pcm_nblk * pcm_bsize; - - if (gus_sampling_bits != 8 && pcm_banksize == (256 * 1024)) - pcm_nblk--; - - return 0; -} - -static int -gus_local_qlen(int dev) -{ - return pcm_qlen; -} - -static void -gus_copy_from_user(int dev, char *localbuf, int localoffs, - snd_rw_buf * userbuf, int useroffs, int len) -{ - if (gus_sampling_channels == 1) { - - if (uiomove(&localbuf[localoffs], len, userbuf)) { - printf("audio: Bad copyin()!\n"); - }; - } else if (gus_sampling_bits == 8) { - int in_left = useroffs; - int in_right = useroffs + 1; - char *out_left, *out_right; - int i; - - len /= 2; - localoffs /= 2; - out_left = &localbuf[localoffs]; - out_right = out_left + pcm_bsize; - - for (i = 0; i < len; i++) { - uiomove((char *) &(*out_left++), 1, userbuf); - in_left += 2; - uiomove((char *) &(*out_right++), 1, userbuf); - in_right += 2; - } - } else { - int in_left = useroffs; - int in_right = useroffs + 2; - short *out_left, *out_right; - int i; - - len /= 4; - localoffs /= 2; - - out_left = (short *) &localbuf[localoffs]; - out_right = out_left + (pcm_bsize / 2); - - for (i = 0; i < len; i++) { - uiomove((char *) &(*out_left++), 2, userbuf); - in_left += 2; - uiomove((char *) &(*out_right++), 2, userbuf); - in_right += 2; - } - } -} - -static struct audio_operations gus_sampling_operations = -{ - "Gravis UltraSound", - NEEDS_RESTART, - AFMT_U8 | AFMT_S16_LE, - NULL, - gus_sampling_open, - gus_sampling_close, - gus_sampling_output_block, - gus_sampling_start_input, - gus_sampling_ioctl, - gus_sampling_prepare_for_input, - gus_sampling_prepare_for_output, - gus_sampling_reset, - gus_sampling_reset, - gus_local_qlen, - gus_copy_from_user -}; - -static void -guswave_setup_voice(int dev, int voice, int chn) -{ - struct channel_info *info = - &synth_devs[dev]->chn_info[chn]; - - guswave_set_instr(dev, voice, info->pgm_num); - - voices[voice].expression_vol = - info->controllers[CTL_EXPRESSION]; /* Just msb */ - voices[voice].main_vol = - (info->controllers[CTL_MAIN_VOLUME] * 100) / 128; - voices[voice].panning = - (info->controllers[CTL_PAN] * 2) - 128; - voices[voice].bender = info->bender_value; -} - -static void -guswave_bender(int dev, int voice, int value) -{ - int freq; - u_long flags; - - voices[voice].bender = value - 8192; - freq = compute_finetune(voices[voice].orig_freq, value - 8192, - voices[voice].bender_range); - voices[voice].current_freq = freq; - - flags = splhigh(); - gus_select_voice(voice); - gus_voice_freq(freq); - splx(flags); -} - -static int -guswave_patchmgr(int dev, struct patmgr_info * rec) -{ - int i, n; - - switch (rec->command) { - case PM_GET_DEVTYPE: - rec->parm1 = PMTYPE_WAVE; - return 0; - break; - - case PM_GET_NRPGM: - rec->parm1 = MAX_PATCH; - return 0; - break; - - case PM_GET_PGMMAP: - rec->parm1 = MAX_PATCH; - - for (i = 0; i < MAX_PATCH; i++) { - int ptr = patch_table[i]; - - rec->data.data8[i] = 0; - - while (ptr >= 0 && ptr < free_sample) { - rec->data.data8[i]++; - ptr = samples[ptr].key; /* Follow link */ - } - } - return 0; - break; - - case PM_GET_PGM_PATCHES: - { - int ptr = patch_table[rec->parm1]; - - n = 0; - - while (ptr >= 0 && ptr < free_sample) { - rec->data.data32[n++] = ptr; - ptr = samples[ptr].key; /* Follow link */ - } - } - rec->parm1 = n; - return 0; - break; - - case PM_GET_PATCH: - { - int ptr = rec->parm1; - struct patch_info *pat; - - if (ptr < 0 || ptr >= free_sample) - return -(EINVAL); - - bcopy((char *) &samples[ptr], rec->data.data8, sizeof(struct patch_info)); - - pat = (struct patch_info *) rec->data.data8; - - pat->key = GUS_PATCH; /* Restore patch type */ - rec->parm1 = sample_ptrs[ptr]; /* DRAM location */ - rec->parm2 = sizeof(struct patch_info); - } - return 0; - break; - - case PM_SET_PATCH: - { - int ptr = rec->parm1; - struct patch_info *pat; - - if (ptr < 0 || ptr >= free_sample) - return -(EINVAL); - - pat = (struct patch_info *) rec->data.data8; - - if (pat->len > samples[ptr].len) /* Cannot expand sample */ - return -(EINVAL); - - pat->key = samples[ptr].key; /* Ensure the link is - * correct */ - - bcopy(rec->data.data8, (char *) &samples[ptr], sizeof(struct patch_info)); - - pat->key = GUS_PATCH; - } - return 0; - break; - - case PM_READ_PATCH: /* Returns a block of wave data from the DRAM */ - { - int sample = rec->parm1; - int n; - long offs = rec->parm2; - int l = rec->parm3; - - if (sample < 0 || sample >= free_sample) - return -(EINVAL); - - if (offs < 0 || offs >= samples[sample].len) - return -(EINVAL); /* Invalid offset */ - - n = samples[sample].len - offs; /* Num of bytes left */ - - if (l > n) - l = n; - - if (l > sizeof(rec->data.data8)) - l = sizeof(rec->data.data8); - - if (l <= 0) - return -(EINVAL); /* Was there a bug? */ - - offs += sample_ptrs[sample]; /* Begin offsess + - * offset to DRAM */ - - for (n = 0; n < l; n++) - rec->data.data8[n] = gus_peek(offs++); - rec->parm1 = n; /* Nr of bytes copied */ - } - return 0; - break; - - case PM_WRITE_PATCH: /* Writes a block of wave data to the DRAM */ - { - int sample = rec->parm1; - int n; - long offs = rec->parm2; - int l = rec->parm3; - - if (sample < 0 || sample >= free_sample) - return -(EINVAL); - - if (offs < 0 || offs >= samples[sample].len) - return -(EINVAL); /* Invalid offset */ - - n = samples[sample].len - offs; /* Nr of bytes left */ - - if (l > n) - l = n; - - if (l > sizeof(rec->data.data8)) - l = sizeof(rec->data.data8); - - if (l <= 0) - return -(EINVAL); /* Was there a bug? */ - - offs += sample_ptrs[sample]; /* Begin offsess + - * offset to DRAM */ - - for (n = 0; n < l; n++) - gus_poke(offs++, rec->data.data8[n]); - rec->parm1 = n; /* Nr of bytes copied */ - } - return 0; - break; - - default: - return -(EINVAL); - } -} - -static int -guswave_alloc(int dev, int chn, int note, struct voice_alloc_info * alloc) -{ - int i, p, best = -1, best_time = 0x7fffffff; - - p = alloc->ptr; - /* - * First look for a completely stopped voice - */ - - for (i = 0; i < alloc->max_voice; i++) { - if (alloc->map[p] == 0) { - alloc->ptr = p; - return p; - } - if (alloc->alloc_times[p] < best_time) { - best = p; - best_time = alloc->alloc_times[p]; - } - p = (p + 1) % alloc->max_voice; - } - - /* - * Then look for a releasing voice - */ - - for (i = 0; i < alloc->max_voice; i++) { - if (alloc->map[p] == 0xffff) { - alloc->ptr = p; - return p; - } - p = (p + 1) % alloc->max_voice; - } - - if (best >= 0) - p = best; - - alloc->ptr = p; - return p; -} - -static struct synth_operations guswave_operations = -{ - &gus_info, - 0, - SYNTH_TYPE_SAMPLE, - SAMPLE_TYPE_GUS, - guswave_open, - guswave_close, - guswave_ioctl, - guswave_kill_note, - guswave_start_note, - guswave_set_instr, - guswave_reset, - guswave_hw_control, - guswave_load_patch, - guswave_aftertouch, - guswave_controller, - guswave_panning, - guswave_volume_method, - guswave_patchmgr, - guswave_bender, - guswave_alloc, - guswave_setup_voice -}; - -static void -set_input_volumes(void) -{ - u_long flags; - u_char mask = 0xff & ~0x06; /* Just line out enabled */ - - if (have_gus_max) /* Don't disturb GUS MAX */ - return; - - flags = splhigh(); - - /* - * Enable channels having vol > 10% Note! bit 0x01 means the line in - * DISABLED while 0x04 means the mic in ENABLED. - */ - if (gus_line_vol > 10) - mask &= ~0x01; - if (gus_mic_vol > 10) - mask |= 0x04; - - if (recording_active) { - /* - * Disable channel, if not selected for recording - */ - if (!(gus_recmask & SOUND_MASK_LINE)) - mask |= 0x01; - if (!(gus_recmask & SOUND_MASK_MIC)) - mask &= ~0x04; - } - mix_image &= ~0x07; - mix_image |= mask & 0x07; - outb(u_Mixer, mix_image); - - splx(flags); -} - -int -gus_default_mixer_ioctl(int dev, u_int cmd, ioctl_arg arg) -{ - -#define MIX_DEVS (SOUND_MASK_MIC|SOUND_MASK_LINE| \ - SOUND_MASK_SYNTH|SOUND_MASK_PCM) - - if (((cmd >> 8) & 0xff) == 'M') { - if (cmd & IOC_IN) - switch (cmd & 0xff) { - case SOUND_MIXER_RECSRC: - gus_recmask = (*(int *) arg) & MIX_DEVS; - if (!(gus_recmask & (SOUND_MASK_MIC | SOUND_MASK_LINE))) - gus_recmask = SOUND_MASK_MIC; - /* - * Note! Input volumes are updated during - * next open for recording - */ - return *(int *) arg = gus_recmask; - break; - - case SOUND_MIXER_MIC: - { - int vol = (*(int *) arg) & 0xff; - - if (vol < 0) - vol = 0; - if (vol > 100) - vol = 100; - gus_mic_vol = vol; - set_input_volumes(); - return *(int *) arg = vol | (vol << 8); - } - break; - - case SOUND_MIXER_LINE: - { - int vol = (*(int *) arg) & 0xff; - - if (vol < 0) - vol = 0; - if (vol > 100) - vol = 100; - gus_line_vol = vol; - set_input_volumes(); - return *(int *) arg = vol | (vol << 8); - } - break; - - case SOUND_MIXER_PCM: - gus_pcm_volume = (*(int *) arg) & 0xff; - RANGE (gus_pcm_volume, 0, 100); - gus_sampling_update_volume(); - return *(int *) arg = gus_pcm_volume | (gus_pcm_volume << 8); - break; - - case SOUND_MIXER_SYNTH: - { - int voice; - - gus_wave_volume = (*(int *) arg) & 0xff; - - RANGE (gus_wave_volume , 0, 100); - - if (active_device == GUS_DEV_WAVE) - for (voice = 0; voice < nr_voices; voice++) - dynamic_volume_change(voice); /* Apply the new vol */ - - return *(int *) arg = gus_wave_volume | (gus_wave_volume << 8); - } - break; - - default: - return -(EINVAL); - } - else - switch (cmd & 0xff) { /* Return parameters */ - - case SOUND_MIXER_RECSRC: - return *(int *) arg = gus_recmask; - break; - - case SOUND_MIXER_DEVMASK: - return *(int *) arg = MIX_DEVS; - break; - - case SOUND_MIXER_STEREODEVS: - return *(int *) arg = 0; - break; - - case SOUND_MIXER_RECMASK: - return *(int *) arg = SOUND_MASK_MIC | SOUND_MASK_LINE; - break; - - case SOUND_MIXER_CAPS: - return *(int *) arg = 0; - break; - - case SOUND_MIXER_MIC: - return *(int *) arg = gus_mic_vol | (gus_mic_vol << 8); - break; - - case SOUND_MIXER_LINE: - return *(int *) arg = gus_line_vol | (gus_line_vol << 8); - break; - - case SOUND_MIXER_PCM: - return *(int *) arg = gus_pcm_volume | (gus_pcm_volume << 8); - break; - - case SOUND_MIXER_SYNTH: - return *(int *) arg = gus_wave_volume | (gus_wave_volume << 8); - break; - - default: - return -(EINVAL); - } -} else - return -(EINVAL); -} - -static struct mixer_operations gus_mixer_operations = {"Gravis Ultrasound", gus_default_mixer_ioctl}; - -static void -gus_default_mixer_init() -{ -if (num_mixers < MAX_MIXER_DEV) /* Don't install if there is another - * mixer */ - mixer_devs[num_mixers++] = &gus_mixer_operations; - -if (have_gus_max) { - /* - * Enable all mixer channels on the GF1 side. Otherwise - * recording will not be possible using GUS MAX. - */ - mix_image &= ~0x07; - mix_image |= 0x04; /* All channels enabled */ - outb(u_Mixer, mix_image); -} -} - -/* start of pnp code */ - -static void -SEND(int d, int r) -{ -outb(PADDRESS, d); -outb(PWRITE_DATA, r); -} - - - - -/* - * Get the device's serial number. Returns 1 if the serial is valid. - */ -static int -get_serial(int rd_port, u_char *data) -{ - int i, bit, valid = 0, sum = 0x6a; - - bzero(data, sizeof(char) * 9); - - for (i = 0; i < 72; i++) { - bit = inb((rd_port << 2) | 0x3) == 0x55; - DELAY(250); /* Delay 250 usec */ - - /* Can't Short Circuit the next evaluation, so 'and' is last */ - bit = (inb((rd_port << 2) | 0x3) == 0xaa) && bit; - DELAY(250); /* Delay 250 usec */ - - valid = valid || bit; - - if (i < 64) - sum = (sum >> 1) | - (((sum ^ (sum >> 1) ^ bit) << 7) & 0xff); - - data[i / 8] = (data[i / 8] >> 1) | (bit ? 0x80 : 0); - } - valid = valid && (data[8] == sum); - - return valid; -} - -static void -send_Initiation_LFSR() -{ - int cur, i; - - /* Reset the LSFR */ - outb(PADDRESS, 0); - outb(PADDRESS, 0); - - cur = 0x6a; - outb(PADDRESS, cur); - - for (i = 1; i < 32; i++) { - cur = (cur >> 1) | (((cur ^ (cur >> 1)) << 7) & 0xff); - outb(PADDRESS, cur); - } -} - - - -static int -isolation_protocol(int rd_port) -{ - int csn; - u_char data[9]; - - send_Initiation_LFSR(); - - /* Reset CSN for All Cards */ - SEND(0x02, 0x04); - - for (csn = 1; (csn < MAX_CARDS); csn++) { - /* Wake up cards without a CSN */ - - SEND(WAKE, 0); - SEND(SET_RD_DATA, rd_port); - outb(PADDRESS, SERIAL_ISOLATION); - DELAY(1000); /* Delay 1 msec */ - if (get_serial(rd_port, data)) { - printf("Board Vendor ID: %c%c%c%02x%02x", - ((data[0] & 0x7c) >> 2) + 64, - (((data[0] & 0x03) << 3) | ((data[1] & 0xe0) >> 5)) + 64, - (data[1] & 0x1f) + 64, data[2], data[3]); - printf(" Board Serial Number: %08x\n", *(int *) &(data[4])); - - SEND(SET_CSN, csn); /* Move this out of this - * function XXX */ - outb(PADDRESS, PSTATUS); - - - return rd_port; - } else - break; - } - - return 0; -} - - - -/* - * ######################################################################## - * - * FUNCTION : IwaveInputSource - * - * PROFILE: This function allows the calling program to select among any of - * several possible sources to the ADC's. The possible input sources and - * their corresponding symbolic constants are: - Line (LINE_IN) - Aux1 - * (AUX1_IN) - Microphone (MIC_IN) - Mixer (MIX_IN) - * - * Set the first argument to either LEFT_SOURCE or RIGHT_SOURCE. Always use the - * symbolic contants for the arguments. - * - * ######################################################################## - */ -static void -IwaveInputSource(BYTE index, BYTE source) -{ - BYTE reg; - - ENTER_CRITICAL; - reg = inb(iw.pcodar) & 0xE0; - outb(iw.pcodar, reg | index); /* select register CLICI or CRICI */ - reg = inb(iw.cdatap) & ~MIX_IN; - source &= MIX_IN; - outb(iw.cdatap, (BYTE) (reg | source)); - LEAVE_CRITICAL; -} -static void -IwavePnpGetCfg(void) -{ - WORD val; - - - ENTER_CRITICAL; - IwavePnpDevice(AUDIO); - outb(_PIDXR, 0x60); /* select P2X0HI */ - val = ((WORD) inb(iw.pnprdp)) << 8; /* get P2XR[9:8] */ - outb(_PIDXR, 0x61); /* select P2XRLI */ - iw.p2xr = val + (WORD) inb(iw.pnprdp); /* get P2XR[7:4] */ - - outb(_PIDXR, 0x62); /* select P3X0HI */ - val = ((WORD) inb(iw.pnprdp)) << 8; /* get P3XR[9:8] */ - outb(_PIDXR, 0x63); /* select P3X0LI */ - iw.p3xr = val + (WORD) inb(iw.pnprdp); /* get P3XR[7:3] */ - - outb(_PIDXR, 0x64); /* select PHCAI */ - val = ((WORD) inb(iw.pnprdp)) << 8; /* get PCODAR[9:8] */ - outb(_PIDXR, 0x65); /* select PLCAI */ - iw.pcodar = val + (WORD) inb(iw.pnprdp); /* get PCODAR[7:2] */ - - outb(_PIDXR, 0x70); /* select PUI1SI */ - iw.synth_irq = (WORD) (inb(iw.pnprdp) & 0x0F); /* Synth IRQ number */ - - outb(_PIDXR, 0x72); /* select PUI2SI */ - iw.midi_irq = (WORD) (inb(iw.pnprdp) & 0x0F); /* MIDI IRQ number */ - - outb(_PIDXR, 0x74); /* select PUD1SI */ - iw.dma1_chan = inb(iw.pnprdp) & 0x07; /* DMA1 chan (LMC/Codec Rec) */ - - outb(_PIDXR, 0x75); /* select PUD2SI */ - iw.dma2_chan = inb(iw.pnprdp) & 0x07; /* DMA2 chan (codec play) */ - - - IwavePnpDevice(EXT); /* select external device */ - outb(_PIDXR, 0x60); /* select PRAHI */ - val = ((WORD) inb(iw.pnprdp)) << 8; /* get PCDRAR[9:8] */ - outb(_PIDXR, 0x61); /* select PRALI */ - iw.pcdrar = val + (WORD) inb(iw.pnprdp); /* get PCDRAR[7:4] */ - outb(_PIDXR, 0x62); /* select PATAHI */ - val = ((WORD) inb(iw.pnprdp)) << 8; /* get PATAAR[9:8] */ - outb(_PIDXR, 0x63); /* select PATALI */ - iw.pataar = val + (WORD) inb(iw.pnprdp); /* get PATAAR[7:1] */ - - outb(_PIDXR, 0x70); /* select PRISI */ - iw.ext_irq = (WORD) (inb(iw.pnprdp) & 0x0F); /* Ext Dev IRQ number */ - - outb(_PIDXR, 0x74); /* select PRDSI */ - iw.ext_chan = inb(iw.pnprdp) & 0x07; /* Ext Dev DMA channel */ - - IwavePnpDevice(MPU401); /* Select MPU401 Device */ - outb(_PIDXR, 0x60); /* select P401HI */ - val = ((WORD) inb(iw.pnprdp)) << 8; /* get P401AR[9:8] */ - outb(_PIDXR, 0x61); /* select P401LI */ - iw.p401ar = val + (WORD) inb(iw.pnprdp); /* get P401AR[7:1] */ - - outb(_PIDXR, 0x70); /* select PMISI */ - iw.mpu_irq = (WORD) (inb(iw.pnprdp) & 0x0F); /* MPU401 Dev IRQ number */ - - IwavePnpDevice(GAME); /* Select GAME logical Device */ - outb(_PIDXR, 0x60); /* select P201HI */ - val = ((WORD) inb(iw.pnprdp)) << 8; /* get P201AR[9:8] */ - outb(_PIDXR, 0x61); /* select P201LI */ - iw.p201ar = val + (WORD) inb(iw.pnprdp); /* get P201AR[7:6] */ - - IwavePnpDevice(EMULATION); /* Select SB and ADLIB Device */ - outb(_PIDXR, 0x60); /* select P388HI */ - val = ((WORD) inb(iw.pnprdp)) << 8; /* get P388AR[9:8] */ - outb(_PIDXR, 0x61); /* select P388LI */ - iw.p388ar = val + inb(iw.pnprdp); /* get P388AR[7:6] */ - outb(_PIDXR, 0x70); /* select PSBISI */ - iw.emul_irq = (WORD) (inb(iw.pnprdp) & 0x0F); /* emulation Dev IRQ - * number */ - LEAVE_CRITICAL; -} - -static void -IwavePnpSetCfg(void) -{ - ENTER_CRITICAL; - IwavePnpDevice(AUDIO); /* select audio device */ - outb(_PIDXR, 0x60); /* select P2X0HI */ - outb(_PNPWRP, (BYTE) (iw.p2xr >> 8)); /* set P2XR[9:8] */ - outb(_PIDXR, 0x61); /* select P2X0LI */ - outb(_PNPWRP, (BYTE) iw.p2xr); /* set P2XR[7:4] */ - /* P2XR[3:0]=0 */ - outb(_PIDXR, 0x62); /* select P3X0HI */ - outb(_PNPWRP, (BYTE) (iw.p3xr >> 8)); /* set P3XR[9:8] */ - outb(_PIDXR, 0x63); /* select P3X0LI */ - outb(_PNPWRP, (BYTE) (iw.p3xr)); /* set P3XR[7:3] */ - /* P3XR[2:0]=0 */ - outb(_PIDXR, 0x64); /* select PHCAI */ - outb(_PNPWRP, (BYTE) (iw.pcodar >> 8)); /* set PCODAR[9:8] */ - outb(_PIDXR, 0x65); /* select PLCAI */ - outb(_PNPWRP, (BYTE) iw.pcodar); /* set PCODAR[7:2] */ - - outb(_PIDXR, 0x70); /* select PUI1SI */ - outb(_PNPWRP, (BYTE) (iw.synth_irq & 0x0F)); /* Synth IRQ number */ - outb(_PIDXR, 0x72); /* select PUI2SI */ - outb(_PNPWRP, (BYTE) (iw.midi_irq & 0x0F)); /* MIDI IRQ number */ - - outb(_PIDXR, 0x74); /* select PUD1SI */ - outb(_PNPWRP, (BYTE) (iw.dma1_chan & 0x07)); /* DMA channel 1 */ - outb(_PIDXR, 0x75); /* select PUD2SI */ - outb(_PNPWRP, (BYTE) (iw.dma2_chan & 0x07)); /* DMA channel 2 */ - - IwavePnpDevice(EXT); - outb(_PIDXR, 0x60); /* select PRAHI */ - outb(_PNPWRP, (BYTE) (iw.pcdrar >> 8)); /* set PCDRAR[9:8] */ - outb(_PIDXR, 0x61); /* select PRALI */ - outb(_PNPWRP, (BYTE) iw.pcdrar); /* set PCDRAR[7:3] */ - /* PCDRAR[2:0]=0 */ - outb(_PIDXR, 0x62); /* select PATAHI */ - outb(_PNPWRP, (BYTE) (iw.pataar >> 8)); /* set PATAAR[9:8] */ - outb(_PIDXR, 0x63); /* select PATALI */ - outb(_PNPWRP, (BYTE) iw.pataar); /* set PATAAR[7:1] */ - /* PATAAR[0]=0 */ - outb(_PIDXR, 0x70); /* select PRISI */ - outb(_PNPWRP, (BYTE) (iw.ext_irq & 0x0F)); /* Ext Dev IRQ number */ - outb(_PIDXR, 0x74); /* select PRDSI */ - outb(_PNPWRP, (BYTE) (iw.ext_chan & 0x07)); /* Ext Dev DMA channel */ - - IwavePnpDevice(GAME); - outb(_PIDXR, 0x60); /* select P201HI */ - outb(_PNPWRP, (BYTE) (iw.p201ar >> 8)); /* set P201RAR[9:8] */ - outb(_PIDXR, 0x61); /* select P201LI */ - outb(_PNPWRP, (BYTE) iw.p201ar); /* set P201AR[7:6] */ - - IwavePnpDevice(EMULATION); - outb(_PIDXR, 0x60); /* select P388HI */ - outb(_PNPWRP, (BYTE) (iw.p388ar >> 8)); /* set P388AR[9:8] */ - outb(_PIDXR, 0x61); /* select P388LI */ - outb(_PNPWRP, (BYTE) iw.p388ar); /* set P388AR[7:6] */ - - outb(_PIDXR, 0x70); /* select PSBISI */ - outb(_PNPWRP, (BYTE) (iw.emul_irq & 0x0F)); /* emulation IRQ number */ - - IwavePnpDevice(MPU401); - outb(_PIDXR, 0x60); /* select P401HI */ - outb(_PNPWRP, (BYTE) (iw.p401ar >> 8)); /* set P401AR[9:8] */ - outb(_PIDXR, 0x61); /* select P401LI */ - outb(_PNPWRP, (BYTE) iw.p401ar); /* set P401AR[7:1] */ - - outb(_PIDXR, 0x70); /* select PMISI */ - outb(_PNPWRP, (BYTE) (iw.mpu_irq & 0x0F)); /* MPU emulation IRQ - * number */ - LEAVE_CRITICAL; -} - -/* ######################################################################## */ -/* FILE: iwpnp.c */ -/* */ -/* REMARKS: This file contains the definitions for the InterWave's DDK */ -/* functions dedicated to the configuration of the InterWave */ -/* PNP logic. */ -/* */ -/* UPDATE: 4/07/95 */ -/* ######################################################################## */ -/* */ -/* FUNCTION: IwavePnpKey */ -/* */ -/* PROFILE: This function issues the initiation key that places the PNP */ -/* logic into configuration mode. The PNP logic is quiescent at */ -/* power up and must be enabled by software. This function will */ -/* do 32 I/O writes to the PIDXR (0x0279). The function will */ -/* first reset the LFSR to its initial value by a sequence of two */ -/* write cycles of 0x00 to PIDXR before issuing the key. */ -/* */ -/* ######################################################################## */ -static void -IwavePnpKey(void) -{ - /* send_Initiation_LFSR(); */ - - BYTE code = 0x6A; - BYTE msb; - BYTE i; - - /* ############################################### */ - /* Reset Linear Feedback Shift Reg. */ - /* ############################################### */ - outb(0x279, 0x00); - outb(0x279, 0x00); - - outb(0x279, code); /* Initial value */ - - for (i = 1; i < 32; i++) { - msb = ((code & 0x01) ^ ((code & 0x02) >> 1)) << 7; - code = (code >> 1) | msb; - outb(0x279, code); - } - -} - -static BYTE -IwavePnpIsol(PORT * pnpread) -{ - int num_pnp_devs; - int rd_port = 0; - printf("Checking for GUS Plug-n-Play ...\n"); - - /* Try various READ_DATA ports from 0x203-0x3ff */ - for (rd_port = 0x80; (rd_port < 0xff); rd_port += 0x10) { - if (0) - printf("Trying Read_Port at %x\n", - (rd_port << 2) | 0x3); - - num_pnp_devs = isolation_protocol(rd_port); - if (num_pnp_devs) { - *pnpread = rd_port << 2 | 0x3; - break; - } - } - if (!num_pnp_devs) { - printf("No Plug-n-Play devices were found\n"); - return 0; - } - return 1; -} - -/* ######################################################################## */ -/* */ -/* FUNCTION: IwavePnpPeek */ -/* */ -/* PROFILE: This function will return the number of specified bytes of */ -/* resource data from the serial EEPROM. The function will NOT */ -/* reset the serial EEPROM logic to allow reading the entire */ -/* EEPROM by issuing repeated calls. The caller must supply a */ -/* pointer to where the data are to be stored. */ -/* It is assumed that the InterWave is not in either "sleep" */ -/* or "wait for key" states. Note that on the first call, if */ -/* the caller means to read from the beggining of data the */ -/* serial EEPROM logic must be reset. For this, the caller */ -/* should issue a WAKE[CSN] command */ -/* */ -/* ######################################################################## */ -static void -IwavePnpPeek(PORT pnprdp, WORD bytes, BYTE * data) -{ - WORD i; - BYTE datum; - - for (i = 1; i <= bytes; i++) { - outb(_PIDXR, 0x05); /* select PRESSI */ - - while (TRUE) { /* wait til new data byte is ready */ - if (inb(pnprdp) & PNP_DATA_RDY) - break; /* new resource byte ready */ - } - outb(_PIDXR, 0x04); /* select PRESDI */ - datum = inb(pnprdp); /* read resource byte */ - if (data != NULL) - *(data++) = datum; /* store it */ - } -} -/* ######################################################################## */ -/* */ -/* FUNCTION: IwavePnpActivate */ -/* */ -/* PROFILE: This function will activate or de-activate the audio device */ -/* or the external device on the InterWave. Set the "dev" arg */ -/* to AUDIO for the audio device or EXT for the external device. */ -/* Set "bool" to ON or OFF to turn the device on or off the ISA */ -/* bus. Notice that for a logical device to work, it must be */ -/* activated. */ -/* */ -/* ######################################################################## */ -static void -IwavePnpActivate(BYTE dev, BYTE bool) -{ - IwavePnpDevice(dev); /* select audio device */ - ENTER_CRITICAL; - outb(_PIDXR, ACTIVATE_DEV); /* select Activate Register */ - outb(_PNPWRP, bool); /* write register */ - LEAVE_CRITICAL; - -} -/* ######################################################################## */ -/* */ -/* FUNCTION: IwavePnpDevice */ -/* */ -/* PROFILE: This function allows the caller to select between five */ -/* logical devices available on the InterWave.It is assumed */ -/* that the PNP state machine is in configuration mode. */ -/* */ -/* ######################################################################## */ -static void -IwavePnpDevice(BYTE dev) -{ - ENTER_CRITICAL; - outb(_PIDXR, _PLDNI); /* select PLDNI */ - outb(_PNPWRP, dev); /* write PLDNI */ - LEAVE_CRITICAL; -} -/* ######################################################################## */ -/* */ -/* FUNCTION: IwavePnpWake */ -/* */ -/* PROFILE: This function issues a WAKE[CSN] command to the InterWave. If */ -/* the CSN matches the PNP state machine will enter the */ -/* configuration state. Otherwise it will enter the sleep mode. */ -/* */ -/* It is assumed that the PNP state machine is not in the */ -/* "wait for key" state. */ -/* */ -/* ######################################################################## */ -static void -IwavePnpWake(BYTE csn) -{ - ENTER_CRITICAL; - outb(_PIDXR, _PWAKEI); /* select PWAKEI */ - outb(_PNPWRP, csn); /* write csn */ - LEAVE_CRITICAL; -} -/* ######################################################################## */ -/* */ -/* - * FUNCTION: IwavePnpPing - */ -/* */ -/* PROFILE: This function allows the caller to detect an InterWave based */ -/* adapter board and will return its asigned CSN so that an */ -/* an application can access its PnP interface and determine the */ -/* borad's current configuration. In conducting its search for */ -/* the InterWave IC, the function will use the first 32 bits of */ -/* the Serial Identifier called the vendor ID in the PnP ISA */ -/* spec. The last 4 bits in the Vendor ID represent a revision */ -/* number for the particular product and will not be included */ -/* in the search. The function will return the Vendor ID and the */ -/* calling application should check the revision bits to make */ -/* sure they are compatible with the board. */ -/* */ -/* ######################################################################## */ -static BYTE -IwavePnpPing(DWORD VendorID) -{ - BYTE csn; - - VendorID &= (0xFFFFFFF0); /* reset 4 least significant bits */ - IwavePnpKey(); /* Key to access PnP Interface */ - while (iw.pnprdp <= 0x23F) { - for (csn = 1; csn <= 10; csn++) { - IwavePnpWake(csn); /* Select card */ - IwavePnpPeek(iw.pnprdp, 4, (BYTE *) & iw.vendor); /* get vendor ID */ - - - if (((iw.vendor) & 0xFFFFFFF0) == VendorID) { /* If IDs match, - * InterWave is found */ - - outb(_PIDXR, 0x02); /* Place all cards in - * wait-for-key state */ - outb(0x0A79, 0x02); - return (csn); - } - } - iw.pnprdp += 0x04; - } - outb(_PIDXR, 0x02); /* Place all cards in wait-for-key state */ - outb(0x0A79, 0x02); - return (FALSE); /* InterWave IC not found */ -} - -/* end of pnp code */ - -static WORD -IwaveMemSize(void) -{ - BYTE datum = 0x55; - ADDRESS local = 0L; - - outb(iw.igidxr, _LMCI); - outb(iw.i8dp, inb(iw.i8dp) & 0xFD); /* DRAM I/O cycles selected */ - - while (TRUE) { - IwaveMemPoke(local, datum); - IwaveMemPoke(local + 1L, datum + 1); - if (IwaveMemPeek(local) != datum || IwaveMemPeek(local + 1L) != (datum + 1) || IwaveMemPeek(0L) != 0x55) - break; - local += RAM_STEP; - datum++; - } - return ((WORD) (local >> 10)); -} - -static BYTE -IwaveMemPeek(ADDRESS addr) -{ - PORT p3xr; - - p3xr = iw.p3xr; - - - outb(iw.igidxr, 0x43); /* Select LMALI */ - outw(iw.i16dp, (WORD) addr); /* Lower 16 bits of LM */ - outb(iw.igidxr, 0x44); /* Select LMAHI */ - outb(iw.i8dp, (BYTE) (addr >> 16)); /* Upper 8 bits of LM */ - return (inb(iw.lmbdr)); /* return byte from LMBDR */ -} - - -static void -IwaveMemPoke(ADDRESS addr, BYTE datum) -{ - PORT p3xr; - p3xr = iw.p3xr; - - - outb(iw.igidxr, 0x43); /* Select LMALI */ - outw(iw.i16dp, (WORD) addr); /* Lower 16 bits of LM */ - outb(iw.igidxr, 0x44); /* Select LMAHI */ - outb(iw.i8dp, (BYTE) (addr >> 16)); /* Upper 8 bits of LM */ - outb(iw.lmbdr, datum); /* Write byte to LMBDR */ -} - -/* ######################################################################## */ -/* */ -/* FUNCTION: IwaveMemCfg */ -/* */ -/* PROFILE : This function determines the amount of DRAM from its */ -/* configuration accross all banks. It sets the configuration */ -/* into register LMCFI and stores the total amount of DRAM */ -/* into iw.size_mem (Kbytes). */ -/* */ -/* The function first places the IC in enhanced mode to allow */ -/* full access to all DRAM locations. Then it selects full */ -/* addressing span (LMCFI[3:0]=0x0C). Finally, it determines */ -/* the amount of DRAM in each bank and from this the actual */ -/* configuration. */ -/* */ -/* Note that if a configuration other than one indicated in */ -/* the manual is implemented, this function will select */ -/* full addressing span (LMCFI[3:0]=0xC). */ -/* */ -/* ######################################################################## */ -static void -IwaveMemCfg(DWORD * lpbanks) -{ - DWORD bank[4] = {0L, 0L, 0L, 0L}; - DWORD addr = 0L, base = 0L, cnt = 0L; - BYTE i, reg, ram = FALSE; - WORD lmcfi; - /* */ - ENTER_CRITICAL; - outb(iw.igidxr, 0x99); - reg = inb(iw.i8dp); /* image of sgmi */ - outb(iw.igidxr, 0x19); - outb(iw.i8dp, (BYTE) (reg | 0x01)); /* enable enhaced mode */ - outb(iw.igidxr, _LMCFI);/* select LM Conf Reg */ - lmcfi = inw(iw.i16dp) & 0xFFF0; - outw(iw.i16dp, lmcfi | 0x000C); /* max addr span */ - /* */ - /* Clear every RAM_STEPth location */ - /* */ - while (addr < RAM_MAX) { - IwaveMemPoke(addr, 0x00); - addr += RAM_STEP; - } - /* */ - /* Determine amount of RAM in each bank */ - /* */ - for (i = 0; i < 4; i++) { - IwaveMemPoke(base, 0xAA); /* mark start of bank */ - IwaveMemPoke(base + 1L, 0x55); - if ((IwaveMemPeek(base) == 0xAA) && (IwaveMemPeek(base + 1L) == 0x55)) - ram = TRUE; - if (ram) { - while (cnt < BANK_MAX) { - bank[i] += RAM_STEP; - cnt += RAM_STEP; - addr = base + cnt; - if (IwaveMemPeek(addr) == 0xAA) - break; - } - } - if (lpbanks != NULL) { - *lpbanks = bank[i]; - lpbanks++; - } - bank[i] = bank[i] >> 10; - base += BANK_MAX; - cnt = 0L; - ram = FALSE; - } - /* */ - iw.flags &= ~DRAM_HOLES; - outb(iw.igidxr, _LMCFI); - if (bank[0] == 256 && bank[1] == 0 && bank[2] == 0 && bank[3] == 0) - outw(iw.i16dp, lmcfi); - else if (bank[0] == 256 && bank[1] == 256 && bank[2] == 0 && bank[3] == 0) - outw(iw.i16dp, lmcfi | 0x01); - else if (bank[0] == 256 && bank[1] == 256 && bank[2] == 256 && bank[3] == 256) - outw(iw.i16dp, lmcfi | 0x02); - else if (bank[0] == 256 && bank[1] == 1024 && bank[2] == 0 && bank[3] == 0) - outw(iw.i16dp, lmcfi | 0x03); - else if (bank[0] == 256 && bank[1] == 1024 && bank[2] == 1024 && bank[3] == 1024) - outw(iw.i16dp, lmcfi | 0x04); - else if (bank[0] == 256 && bank[1] == 256 && bank[2] == 1024 && bank[3] == 0) - outw(iw.i16dp, lmcfi | 0x05); - else if (bank[0] == 256 && bank[1] == 256 && bank[2] == 1024 && bank[3] == 1024) - outw(iw.i16dp, lmcfi | 0x06); - else if (bank[0] == 1024 && bank[1] == 0 && bank[2] == 0 && bank[3] == 0) - outw(iw.i16dp, lmcfi | 0x07); - else if (bank[0] == 1024 && bank[1] == 1024 && bank[2] == 0 && bank[3] == 0) - outw(iw.i16dp, lmcfi | 0x08); - else if (bank[0] == 1024 && bank[1] == 1024 && bank[2] == 1024 && bank[3] == 1024) - outw(iw.i16dp, lmcfi | 0x09); - else if (bank[0] == 4096 && bank[1] == 0 && bank[2] == 0 && bank[3] == 0) - outw(iw.i16dp, lmcfi | 0x0A); - else if (bank[0] == 4096 && bank[1] == 4096 && bank[2] == 0 && bank[3] == 0) - outw(iw.i16dp, lmcfi | 0x0B); - else /* Flag the non-contiguous config of memory */ - iw.flags |= DRAM_HOLES; - /* */ - outb(iw.igidxr, 0x19); /* restore sgmi */ - outb(iw.i8dp, reg); - LEAVE_CRITICAL; -} - - -/* ######################################################################## */ -/**/ -/* FUNCTION: IwaveCodecIrq */ -/**/ -/* PROFILE: This function disables or enables the Codec Interrupts. To */ -/* enable interrupts set CEXTI[2] high thus causing all interrupt */ -/* sources (CSR3I[6:4]) to pass onto the IRQ pin. To disable */ -/* interrupts set CEXTI[1]=0. To enable Code IRQs issue this call: */ -/**/ -/* IwaveCodecIrq(CODEC_IRQ_ENABLE). To disable IRQs issue the call */ -/**/ -/* IwaveCodeIrq(~CODEC_IRQ_ENABLE). */ -/**/ -/* ######################################################################## */ -static void -IwaveCodecIrq(BYTE mode) -{ - BYTE reg; - - ENTER_CRITICAL; - reg = inb(iw.pcodar) & 0xE0; - outb(iw.pcodar, reg | _CSR3I); /* select CSR3I */ - outb(iw.cdatap, 0x00); /* clear all interrupts */ - outb(iw.pcodar + 0x02, 0x00); /* clear CSR1R */ - outb(iw.pcodar, reg | _CEXTI); /* select CEXTI */ - reg = inb(iw.cdatap); - if (mode == CODEC_IRQ_ENABLE) /* enable Codec Irqs */ - outb(iw.cdatap, (BYTE) (reg | CODEC_IRQ_ENABLE)); - else /* disable Codec Irqs */ - outb(iw.cdatap, (BYTE) (reg & ~CODEC_IRQ_ENABLE)); - LEAVE_CRITICAL; -} - - -/* ######################################################################### */ -/**/ -/* FUNCTION: IwaveRegPeek */ -/**/ -/* PROFILE : This function returns the value stored in any readable */ -/* InterWave register. It takes as input a pointer to a */ -/* structure containing the addresses of the relocatable I/O */ -/* space as well as a register mnemonic. To correctly use this */ -/* function, the programmer must use the mnemonics defined in */ -/* "iwdefs.h". These mnemonics contain coded information used */ -/* by the function to properly access the desired register. */ -/**/ -/* An attempt to read from a write-only register will return */ -/* meaningless data. */ -/**/ -/* ######################################################################### */ -static WORD -IwaveRegPeek(DWORD reg_mnem) -{ - BYTE index, val; - WORD reg_id, offset; - - offset = (WORD) ((BYTE) reg_mnem); - reg_id = (WORD) (reg_mnem >> 16); - index = (BYTE) (reg_mnem >> 8); - - /* ################################################### */ - /* Logic to read registers in P2XR block & GMCR */ - /* ################################################### */ - - if (reg_id >= 0x0001 && reg_id <= 0x001A) { /* UMCR to GMCR */ - if (reg_id <= 0x000E) /* UMCR to USRR */ - return ((WORD) inb(iw.p2xr + offset)); - - if (reg_id == 0x0019) - return ((WORD) inb(iw.p201ar)); - - else { /* GUS Hidden registers or GMCR */ - BYTE iveri; - - outb(iw.igidxr, 0x5B); /* select IVERI */ - iveri = inb(iw.i8dp); /* read IVERI */ - outb(iw.i8dp, (BYTE) (iveri | 0x09)); /* set IVERI[3,0] */ - if (reg_id == 0x001A) { /* GMCR */ - val = inb(iw.p3xr); - outb(iw.i8dp, iveri); /* restore IVERI */ - return ((WORD) val); - } - val = inb(iw.p2xr + 0x0F); /* read URCR */ - val = (val & 0xF8) | index; /* value for URCR[2:0] */ - outb(iw.p2xr + 0x0F, val); /* set URCR[2:0] */ - - if (reg_mnem == UDCI || reg_mnem == UICI) { - val = inb(iw.p2xr); - if (reg_mnem == UDCI) - outb(iw.p2xr, (BYTE) (val & 0xBF)); - else - outb(iw.p2xr, (BYTE) (val | 0x40)); - } - val = inb(iw.p2xr + 0x0B); - outb(iw.igidxr, 0x5B); /* select IVERI */ - outb(iw.i8dp, iveri); /* restore IVERI */ - return ((WORD) val); /* read register */ - } - } - /* ################################################### */ - /* Logic to read registers in P3XR block */ - /* ################################################### */ - - if (reg_id >= 0x001B && reg_id <= 0x005C) { /* GMSR to LMBDR */ - if (reg_id == 0x005C) /* LMBDR */ - return ((WORD) inb(iw.lmbdr)); - - if (reg_id >= 0x001B && reg_id <= 0x0021) /* GMSR to I8DP */ - if (offset == 0x04) - return (inw(iw.i16dp)); - else - return ((WORD) inb(iw.p3xr + offset)); - else { /* indexed registers */ - - if (reg_id <= 0x003F) - index |= 0x80; /* adjust for reading */ - - outb(iw.igidxr, index); /* select register */ - - if (offset == 0x04) - return (inw(iw.i16dp)); - else - return ((WORD) inb(iw.i8dp)); - } - } - /* #################################################### */ - /* Logic to read registers in PCODAR block */ - /* #################################################### */ - - if (reg_id >= 0x005D && reg_id <= 0x0081) { /* CIDXR to CLRCTI */ - if (reg_id <= 0x0061) - return ((WORD) inb(iw.pcodar + offset)); /* CRDR */ - - else { /* indexed registers */ - BYTE cidxr; - - cidxr = inb(iw.pcodar); - cidxr = (cidxr & 0xE0) + index; - outb(iw.pcodar, cidxr); /* select register */ - return ((WORD) inb(iw.cdatap)); - } - } - /* ##################################################### */ - /* Logic to read the PnP registers */ - /* ##################################################### */ - if (reg_id >= 0x0082 && reg_id <= 0x00B7) { /* PCSNBR to PMITI */ - if (reg_id == 0x0085) - return ((WORD) inb(iw.pnprdp)); - - if (reg_id < 0x0085) - return ((WORD) inb((WORD) reg_mnem)); - - else { /* indexed registers */ - if (reg_id >= 0x008E && reg_id <= 0x00B7) { - outb(0x0279, 0x07); /* select PLDNI */ - outb(0xA79, (BYTE) offset); /* select logical dev */ - } - outb(0x0279, index); /* select the register */ - return ((WORD) inb(iw.pnprdp)); - } - } - return 0; -} -/* ######################################################################### */ -/**/ -/* FUNCTION: IwaveRegPoke */ -/**/ -/* PROFILE : This function writes a value to any writable */ -/* InterWave register. It takes as input a pointer to a */ -/* structure containing the addresses of the relocatable I/O */ -/* space as well as a register mnemonic. To correctly use this */ -/* function, the programmer must use the mnemonics defined in */ -/* "iwdefs.h". These mnemonics contain coded information used */ -/* by the function to properly access the desired register. */ -/**/ -/* This function does not guard against writing to read-only */ -/* registers. It is the programmer's responsibility to ensure */ -/* that the writes are to valid registers. */ -/**/ -/* ######################################################################### */ -static void -IwaveRegPoke(DWORD reg_mnem, WORD datum) -{ - BYTE index; - BYTE val; - WORD reg_id; - WORD offset; - - offset = (WORD) ((BYTE) reg_mnem); - reg_id = (WORD) (reg_mnem >> 16); - index = (BYTE) (reg_mnem >> 8); - - - /* ####################################################### */ - /* Logic to write to registers in P2XR block */ - /* ####################################################### */ - if (reg_id >= 0x0001 && reg_id <= 0x0019) { /* UMCR to GGCR */ - if (reg_id <= 0x000E) { /* UMCR to USRR */ - outb(iw.p2xr + offset, (BYTE) datum); - return; - } - if (reg_id == 0x0019) { - outb(iw.p201ar, (BYTE) datum); - return; - } else { /* GUS Hidden registers */ - - BYTE iveri; - - outb(iw.igidxr, 0x5B); /* select IVERI */ - iveri = inb(iw.i8dp); /* read IVERI */ - outb(iw.i8dp, (BYTE) (iveri | 0x09)); /* set IVERI[3,0] */ - val = inb(iw.p2xr + 0x0F); /* read URCR */ - val = (val & 0xF8) | index; /* value for URCR[2:0] */ - outb(iw.p2xr + 0x0F, val); /* set URCR[2:0] */ - - if (reg_mnem == UDCI || reg_mnem == UICI) { - val = inb(iw.p2xr); /* read UMCR */ - if (reg_mnem == UDCI) - outb(iw.p2xr, (BYTE) (val & 0xBF)); /* set UMCR[6]=0 */ - else - outb(iw.p2xr, (BYTE) (val | 0x40)); /* set UMCR[6]=1 */ - } - outb(iw.p2xr + 0x0B, (BYTE) datum); /* write register */ - outb(iw.igidxr, 0x5B); /* select IVERI */ - outb(iw.i8dp, iveri); /* restore IVERI */ - return; - } - } - /* ############################################################# */ - /* Logic to write to registers in P3XR block */ - /* ############################################################# */ - - if (reg_id >= 0x001A && reg_id <= 0x005C) { /* GMCR to LMBDR */ - - if (reg_id == 0x005C) { /* LMBDR */ - outb(iw.lmbdr, (BYTE) datum); - return; - } - if (reg_id == 0x001B) /* GMSR */ - return; - - if (reg_id >= 0x001A && reg_id <= 0x0021) /* GMCR to I8DP */ - if (offset == 0x04) - outw(iw.i16dp, datum); - else - outb(iw.p3xr + offset, (BYTE) datum); - else { /* indexed registers */ - outb(iw.igidxr, index); /* select register */ - - if (offset == 0x04) - outw(iw.i16dp, datum); - else - outb(iw.i8dp, (BYTE) datum); - } - } - /* /################################################### */ - /* Logic to write to registers in PCODAR block */ - /* ################################################### */ - - if (reg_id >= 0x005C && reg_id <= 0x0081) { /* CIDXR to CLRCTI */ - if (reg_id <= 0x0061) - outb(iw.pcodar + offset, (BYTE) datum); - - else { /* one of the indexed registers */ - BYTE cidxr; - - cidxr = inb(iw.pcodar); - cidxr = (cidxr & 0xE0) + index; - outb(iw.pcodar, cidxr); /* select register */ - outb(iw.cdatap, (BYTE) datum); - } - } - /* ###################################################### */ - /* Logic to write to the PnP registers */ - /* ###################################################### */ - if (reg_id >= 0x0082 && reg_id <= 0x00B7) { - if (reg_id == 0x0085) { - outb(iw.pnprdp, (BYTE) datum); - return; - } - if (reg_id < 0x0085) - outb((WORD) reg_mnem, (BYTE) datum); - - else { /* one of the indexed registers */ - if (reg_id >= 0x008E && reg_id <= 0x00B7) { - outb(0x0279, 0x07); /* select PLDNI */ - outb(0xA79, (BYTE) offset); /* select logical dev */ - } - outb(0x0279, index); /* select the register */ - outb(0xA79, (BYTE) datum); - } - } -} - - -static void -IwaveLineLevel(char level, char index) -{ - char reg; - - level &= 0x1F; - - ENTER_CRITICAL; - reg = inb(iw.pcodar) & 0xE0; - outb(iw.pcodar, reg | index); /* select register */ - outb(iw.cdatap, (BYTE) ((inb(iw.cdatap) & 0x80) | level)); /* set level */ - LEAVE_CRITICAL; -} - -static void -IwaveCodecMode(char mode) -{ - char reg; - - ENTER_CRITICAL; - reg = inb(iw.pcodar) & 0xE0; - outb(iw.pcodar, reg | _CMODEI); /* select CMODEI */ - outb(iw.cdatap, mode); - LEAVE_CRITICAL; - iw.cmode = mode; -} - -static void -IwaveLineMute(BYTE mute, BYTE inx) -{ - BYTE reg; - - ENTER_CRITICAL; - reg = inb(iw.pcodar) & 0xE0; - outb(iw.pcodar, reg | inx); /* select register */ - if (mute == ON) - outb(iw.cdatap, (BYTE) (inb(iw.cdatap) | 0x80)); /* mute */ - else - outb(iw.cdatap, (BYTE) (inb(iw.cdatap) & 0x7F)); /* unmute */ - LEAVE_CRITICAL; -} - -static void -Iwaveinitcodec() -{ - - u_short iwl_codec_base = iw.pcodar; - u_short iwl_codec_data = iw.pcodar + 1; - u_short foo; - - - - /* - * Set the CEXTI register foo = CODEC_CEXTI_DEFAULT; - * IWL_CODEC_OUT(EXTERNAL_CONTROL, foo); - */ - /* - * Disable Interrupts iwl_codec_disable_irqs(); - */ - - /* Set the CODEC to Operate in Mode 3 */ - IWL_CODEC_OUT(MODE_SELECT_ID, 0x6C); - foo = inb(iwl_codec_data); - - /* Set the configuration registers to their default values */ - foo = CODEC_CFIG1I_DEFAULT; - IWL_CODEC_OUT(CONFIG_1 | CODEC_MCE, foo); - outb(iwl_codec_base, CONFIG_1); - foo = CODEC_CFIG2I_DEFAULT; - IWL_CODEC_OUT(CONFIG_2, foo); - - foo = CODEC_CFIG3I_DEFAULT; - IWL_CODEC_OUT(CONFIG_3, foo); - -} - - - -int -IwaveOpen(char voices, char mode, struct address_info * hw) -{ - - u_long flags; - u_char tmp; - - flags = splhigh(); - - iw.pnprdp = 0; - if (IwavePnpIsol(&iw.pnprdp)) { - - iw.vendor = GUS_PNP_ID; - - iw.csn = IwavePnpPing(iw.vendor); - - IwavePnpKey(); - - IwavePnpWake(iw.csn); - - IwavePnpGetCfg(); - IwavePnpKey(); - - IwavePnpWake(iw.csn); - } - if (hw->irq > 0) { - /* I see the user wants to set the GUS PnP */ - /* Okay lets do it */ - iw.csn = 1; - iw.p2xr = hw->io_base; - iw.p3xr = hw->io_base + 0x100; - iw.pcodar = hw->io_base + 0x10c; - - iw.synth_irq = hw->irq; - - iw.midi_irq = hw->irq; - - iw.dma1_chan = hw->dma; - - if (hw->dma2 == -1) { - iw.dma2_chan = hw->dma; - } else { - iw.dma2_chan = hw->dma2; - } - - - } else { - - /* tell the os what we are doing 8) */ - hw->io_base = iw.p2xr; - hw->irq = iw.synth_irq; - /* - * iw.dma1_chan = 1; iw.dma2_chan = 3 ; - */ - hw->dma = iw.dma1_chan; - hw->dma2 = iw.dma2_chan; - - - } - - if (iw.csn > 0 && iw.csn < MAX_GUS_PNP) { - gus_pnp_found[iw.csn] = hw->io_base; - - } - iw.cdatap = iw.pcodar + 1; - iw.csr1r = iw.pcodar + 2; - iw.cxdr = iw.pcodar + 3;/* CPDR or CRDR */ - iw.gmxr = iw.p3xr; - iw.gmxdr = iw.p3xr + 1; /* GMTDR or GMRDR */ - iw.svsr = iw.p3xr + 2; - iw.igidxr = iw.p3xr + 3; - iw.i16dp = iw.p3xr + 4; - iw.i8dp = iw.p3xr + 5; - iw.lmbdr = iw.p3xr + 7; - iw.voices = voices; - - if (iw.pnprdp > 0 && iw.csn > 0) { - IwavePnpSetCfg(); - IwavePnpActivate(AUDIO, ON); - IwavePnpActivate(EXT, ON); - } - /* IwavePnpActivate(EMULATION,ON); */ - - - /* reset */ - outb(iw.igidxr, _URSTI);/* Pull reset */ - outb(iw.i8dp, 0x00); - DELAY(1000 * 30); - - outb(iw.i8dp, 0x01); /* Release reset */ - DELAY(1000 * 30); - - /* end of reset */ - - - IwaveMemCfg(NULL); - - - tmp = IwaveRegPeek(IDECI); - - IwaveRegPoke(IDECI, tmp | 0x18); - - IwaveCodecMode(CODEC_MODE2); /* Default codec mode */ - IwaveRegPoke(ICMPTI, 0); - - outb(iw.igidxr, 0x99); - tmp = inb(iw.i8dp); - outb(iw.igidxr, 0x19); - outb(iw.i8dp, tmp); - - - - IwaveCodecIrq(~CODEC_IRQ_ENABLE); - - Iwaveinitcodec(); - - outb(iw.p2xr, 0x0c); /* Disable line in, mic and line out */ - - IwaveRegPoke(CLCI, 0x3f << 2); - - IwaveLineLevel(0, _CLOAI); - IwaveLineLevel(0, _CROAI); - - IwaveLineMute(OFF, _CLOAI); - IwaveLineMute(OFF, _CROAI); - - IwaveLineLevel(0, _CLLICI); - IwaveLineLevel(0, _CRLICI); - IwaveLineMute(OFF, _CLLICI); - IwaveLineMute(OFF, _CRLICI); - - IwaveLineLevel(0, _CLDACI); - IwaveLineLevel(0, _CRDACI); - IwaveLineMute(ON, _CLDACI); - IwaveLineMute(ON, _CRDACI); - - IwaveLineLevel(0, _CLLICI); - IwaveLineLevel(0, _CRLICI); - IwaveLineMute(ON, _CLLICI); - IwaveLineMute(ON, _CRLICI); - - - IwaveInputSource(LEFT_SOURCE, MIC_IN); - IwaveInputSource(RIGHT_SOURCE, MIC_IN); - - outb(iw.pcodar, 0x9 | 0x40); - outb(iw.cdatap, 0); - IwaveCodecIrq(CODEC_IRQ_ENABLE); - outb(iw.pcodar, _CFIG3I | 0x20); - - - outb(iw.cdatap, 0xC2); /* Enable Mode 3 IRQs & Synth */ - - outb(iw.igidxr, _URSTI); - outb(iw.i8dp, GF1_SET | GF1_OUT_ENABLE | GF1_IRQ_ENABLE); - DELAY(1000 * 30); - iw.size_mem = IwaveMemSize(); /* Bytes of RAM in this mode */ - outb(iw.p2xr, 0xc); /* enable output */ - IwaveRegPoke(CLCI, 0x3f << 2); - - IwaveCodecIrq(CODEC_IRQ_ENABLE); - splx(flags); - - DELAY(1000 * 100); - IwaveRegPoke(CPDFI, 0); - - return (TRUE); -} - - -void -gus_wave_init(struct address_info * hw_config) -{ - u_long flags; - u_char val, gus_pnp_seen = 0; - char *model_num = "2.4"; - int gus_type = 0x24; /* 2.4 */ - int irq = hw_config->irq, dma = hw_config->dma, dma2 = hw_config->dma2; - int otherside = -1, i; - - if (irq < 0 || irq > 15) { - printf("ERROR! Invalid IRQ#%d. GUS Disabled", irq); - return; - } - if (dma < 0 || dma > 7) { - printf("ERROR! Invalid DMA#%d. GUS Disabled", dma); - return; - } - for (i = 0; i < MAX_GUS_PNP; i++) { - if (gus_pnp_found[i] != 0 && gus_pnp_found[i] == hw_config->io_base) - gus_pnp_seen = 1; - } -#ifdef NOGUSPNP - gus_pnp_seen = 0; -#endif - - gus_irq = irq; - gus_dma = dma; - gus_dma2 = dma2; - - if (gus_dma2 == -1) - gus_dma2 = dma; - - /* - * Try to identify the GUS model. - * - * Versions < 3.6 don't have the digital ASIC. Try to probe it first. - */ - - flags = splhigh(); - outb(gus_base + 0x0f, 0x20); - val = inb(gus_base + 0x0f); - splx(flags); - - if (val != 0xff && (val & 0x06)) { /* Should be 0x02?? */ - /* - * It has the digital ASIC so the card is at least v3.4. Next - * try to detect the true model. - */ - - val = inb(u_MixSelect); - - /* - * Value 255 means pre-3.7 which don't have mixer. Values 5 - * thru 9 mean v3.7 which has a ICS2101 mixer. 10 and above - * is GUS MAX which has the CS4231 codec/mixer. - * - */ - - if (gus_pnp_seen) - val = 66; - - if (val == 255 || val < 5) { - model_num = "3.4"; - gus_type = 0x34; - } else if (val < 10) { - model_num = "3.7"; - gus_type = 0x37; - mixer_type = ICS2101; - } else { - if (gus_pnp_seen) - model_num = "PNP"; - else - model_num = "MAX"; - - gus_type = 0x40; - mixer_type = CS4231; -#ifdef CONFIG_GUSMAX - { - u_char max_config = 0x40; /* Codec enable */ - - if (gus_dma2 == -1) - gus_dma2 = gus_dma; - - if (gus_dma > 3) - max_config |= 0x10; /* 16 bit capture DMA */ - - if (gus_dma2 > 3) - max_config |= 0x20; /* 16 bit playback DMA */ - - max_config |= (gus_base >> 4) & 0x0f; /* Extract the X from - * 2X0 */ - - outb(gus_base + 0x106, max_config); /* UltraMax control */ - } - - if (ad1848_detect(gus_base + 0x10c, NULL, hw_config->osp)) { - - gus_mic_vol = gus_line_vol = gus_pcm_volume = 100; - gus_wave_volume = 90; - have_gus_max = 1; - if (gus_pnp_seen) { - - ad1848_init("GUS PNP", gus_base + 0x10c, - -irq, - gus_dma2, /* Playback DMA */ - gus_dma, /* Capture DMA */ - 1, /* Share DMA channels with GF1 */ - hw_config->osp); - - - } else { - ad1848_init("GUS MAX", gus_base + 0x10c, - -irq, - gus_dma2, /* Playback DMA */ - gus_dma, /* Capture DMA */ - 1, /* Share DMA channels with GF1 */ - hw_config->osp); - } - otherside = num_audiodevs - 1; - - } else - printf("[Where's the CS4231?]"); -#else - printf("\n\n\nGUS MAX support was not compiled in!!!\n\n\n\n"); -#endif - } - } else { - /* - * ASIC not detected so the card must be 2.2 or 2.4. There - * could still be the 16-bit/mixer daughter card. - */ - } - - if (gus_pnp_seen) { - snprintf(gus_info.name, sizeof(gus_info.name), - "Gravis %s (%dk)", model_num, (int) gus_mem_size / 1024); - } else { - snprintf(gus_info.name, sizeof(gus_info.name), - "Gravis UltraSound %s (%dk)", model_num, (int) gus_mem_size / 1024); - } - conf_printf(gus_info.name, hw_config); - - if (num_synths >= MAX_SYNTH_DEV) - printf("GUS Error: Too many synthesizers\n"); - else { - voice_alloc = &guswave_operations.alloc; - synth_devs[num_synths++] = &guswave_operations; -#ifdef CONFIG_SEQUENCER - gus_tmr_install(gus_base + 8); -#endif - } - samples = (struct patch_info *) malloc((MAX_SAMPLE + 1) * sizeof(*samples), M_DEVBUF, M_NOWAIT); - if (!samples) - panic("SOUND: Cannot allocate memory\n"); - - reset_sample_memory(); - - gus_initialize(); - - if (num_audiodevs < MAX_AUDIO_DEV) { - audio_devs[gus_devnum = num_audiodevs++] = &gus_sampling_operations; - audio_devs[gus_devnum]->otherside = otherside; - audio_devs[gus_devnum]->dmachan1 = dma; - audio_devs[gus_devnum]->dmachan2 = dma2; - audio_devs[gus_devnum]->buffsize = DSP_BUFFSIZE; - if (otherside != -1) { - /* - * glue logic to prevent people from opening the gus - * max via the gf1 and the cs4231 side . Only the gf1 - * or the cs4231 are allowed to be open - */ - - audio_devs[otherside]->otherside = gus_devnum; - } - if (dma2 != dma && dma2 != -1) - audio_devs[gus_devnum]->flags |= DMA_DUPLEX; - } else - printf("GUS: Too many PCM devices available\n"); - - /* - * Mixer dependent initialization. - */ - - switch (mixer_type) { - case ICS2101: - gus_mic_vol = gus_line_vol = gus_pcm_volume = 100; - gus_wave_volume = 90; - ics2101_mixer_init(); - return; - - case CS4231: - /* Initialized elsewhere (ad1848.c) */ - default: - gus_default_mixer_init(); - return; - } -} - -static void -do_loop_irq(int voice) -{ - u_char tmp; - int mode, parm; - u_long flags; - - flags = splhigh(); - gus_select_voice(voice); - - tmp = gus_read8(0x00); - tmp &= ~0x20; /* Disable wave IRQ for this_one voice */ - gus_write8(0x00, tmp); - - if (tmp & 0x03) /* Voice stopped */ - voice_alloc->map[voice] = 0; - - mode = voices[voice].loop_irq_mode; - voices[voice].loop_irq_mode = 0; - parm = voices[voice].loop_irq_parm; - - switch (mode) { - - case LMODE_FINISH: /* Final loop finished, shoot volume down */ - - if ((int) (gus_read16(0x09) >> 4) < 100) { /* Get current volume */ - gus_voice_off(); - gus_rampoff(); - gus_voice_init(voice); - break; - } - gus_ramp_range(65, 4065); - gus_ramp_rate(0, 63); /* Fastest possible rate */ - gus_rampon(0x20 | 0x40); /* Ramp down, once, irq */ - voices[voice].volume_irq_mode = VMODE_HALT; - break; - - case LMODE_PCM_STOP: - pcm_active = 0; /* Signal to the play_next_pcm_block routine */ - case LMODE_PCM: - { - int flag; /* 0 or 2 */ - - pcm_qlen--; - pcm_head = (pcm_head + 1) % pcm_nblk; - if (pcm_qlen && pcm_active) { - play_next_pcm_block(); - } else {/* Underrun. Just stop the voice */ - gus_select_voice(0); /* Left channel */ - gus_voice_off(); - gus_rampoff(); - gus_select_voice(1); /* Right channel */ - gus_voice_off(); - gus_rampoff(); - pcm_active = 0; - } - - /* - * If the queue was full before this interrupt, the - * DMA transfer was suspended. Let it continue now. - */ - if (dma_active) { - if (pcm_qlen == 0) - flag = 1; /* Underflow */ - else - flag = 0; - dma_active = 0; - } else - flag = 2; /* Just notify the dmabuf.c */ - DMAbuf_outputintr(gus_devnum, flag); - } - break; - - default:; - } - splx(flags); -} - -static void -do_volume_irq(int voice) -{ - u_char tmp; - int mode, parm; - u_long flags; - - flags = splhigh(); - - gus_select_voice(voice); - - tmp = gus_read8(0x0d); - tmp &= ~0x20; /* Disable volume ramp IRQ */ - gus_write8(0x0d, tmp); - - mode = voices[voice].volume_irq_mode; - voices[voice].volume_irq_mode = 0; - parm = voices[voice].volume_irq_parm; - - switch (mode) { - case VMODE_HALT: /* Decay phase finished */ - splx(flags); - gus_voice_init(voice); - break; - - case VMODE_ENVELOPE: - gus_rampoff(); - splx(flags); - step_envelope(voice); - break; - - case VMODE_START_NOTE: - splx(flags); - guswave_start_note2(voices[voice].dev_pending, voice, - voices[voice].note_pending, voices[voice].volume_pending); - if (voices[voice].kill_pending) - guswave_kill_note(voices[voice].dev_pending, voice, - voices[voice].note_pending, 0); - - if (voices[voice].sample_pending >= 0) { - guswave_set_instr(voices[voice].dev_pending, voice, - voices[voice].sample_pending); - voices[voice].sample_pending = -1; - } - break; - - default:; - } -} - -void -gus_voice_irq(void) -{ - u_long wave_ignore = 0, volume_ignore = 0; - u_long voice_bit; - - u_char src, voice; - - while (1) { - src = gus_read8(0x0f); /* Get source info */ - voice = src & 0x1f; - src &= 0xc0; - - if (src == (0x80 | 0x40)) - return; /* No interrupt */ - - voice_bit = 1 << voice; - - if (!(src & 0x80)) /* Wave IRQ pending */ - if (!(wave_ignore & voice_bit) && (int) voice < nr_voices) { /* Not done yet */ - wave_ignore |= voice_bit; - do_loop_irq(voice); - } - if (!(src & 0x40)) /* Volume IRQ pending */ - if (!(volume_ignore & voice_bit) && (int) voice < nr_voices) { /* Not done yet */ - volume_ignore |= voice_bit; - do_volume_irq(voice); - } - } -} - -void -guswave_dma_irq(void) -{ - u_char status; - - status = gus_look8(0x41); /* Get DMA IRQ Status */ - if (status & 0x40) /* DMA interrupt pending */ - switch (active_device) { - case GUS_DEV_WAVE: - if ((dram_sleep_flag.mode & WK_SLEEP)) { - dram_sleep_flag.mode = WK_WAKEUP; - wakeup(dram_sleeper); - }; - break; - - case GUS_DEV_PCM_CONTINUE: /* Left channel data transferred */ - gus_transfer_output_block(pcm_current_dev, pcm_current_buf, - pcm_current_count, pcm_current_intrflag, 1); - break; - - case GUS_DEV_PCM_DONE: /* Right or mono channel data transferred */ - if (pcm_qlen < pcm_nblk) { - int flag = (1 - dma_active) * 2; /* 0 or 2 */ - - if (pcm_qlen == 0) - flag = 1; /* Underrun */ - dma_active = 0; - DMAbuf_outputintr(gus_devnum, flag); - } - break; - - default:; - } - - status = gus_look8(0x49); /* Get Sampling IRQ Status */ - if (status & 0x40) { /* Sampling Irq pending */ - DMAbuf_inputintr(gus_devnum); - } -} - -#ifdef CONFIG_SEQUENCER -/* - * Timer stuff - */ - -static volatile int select_addr, data_addr; -static volatile int curr_timer = 0; - -void -gus_timer_command(u_int addr, u_int val) -{ - int i; - - outb(select_addr, (u_char) (addr & 0xff)); - - for (i = 0; i < 2; i++) - inb(select_addr); - - outb(data_addr, (u_char) (val & 0xff)); - - for (i = 0; i < 2; i++) - inb(select_addr); -} - -static void -arm_timer(int timer, u_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 */ - gus_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 */ - gus_timer_command(0x04, 0x02); /* Start timer 2 */ - } - - gus_timer_enabled = 0; -} - -static u_int -gus_tmr_start(int dev, u_int usecs_per_tick) -{ - int timer_no, resolution; - int divisor; - - 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; - - arm_timer(timer_no, divisor); - - return divisor * resolution; -} - -static void -gus_tmr_disable(int dev) -{ - gus_write8(0x45, 0); /* Disable both timers */ - gus_timer_enabled = 0; -} - -static void -gus_tmr_restart(int dev) -{ - if (curr_timer == 1) - gus_write8(0x45, 0x04); /* Start timer 1 again */ - else - gus_write8(0x45, 0x08); /* Start timer 2 again */ -} - -static struct sound_lowlev_timer gus_tmr = -{ - 0, - gus_tmr_start, - gus_tmr_disable, - gus_tmr_restart -}; - -static void -gus_tmr_install(int io_base) -{ - select_addr = io_base; - data_addr = io_base + 1; - - sound_timer_init(&gus_tmr, "GUS"); -} -#endif -#endif diff --git a/sys/i386/isa/sound/hex2hex.h b/sys/i386/isa/sound/hex2hex.h deleted file mode 100644 index 5c90917..0000000 --- a/sys/i386/isa/sound/hex2hex.h +++ /dev/null @@ -1,97 +0,0 @@ -/* - * This file is a part of configure.c - * - * hex2hex reads an input file in Intel HEX format and produces - * an (unsigned char) array which contains the bytes and writes it to the - * output file using C syntax - */ - -#define MAX_SIZE (256*1024) -#define ABANDON(why) { \ - fprintf(stderr, "%s: " why "\n", source); \ - fclose(inf);fclose(outf);return 0; \ - } - -int hex2hex(char *source, char *target, char *varline) -{ - FILE *inf, *outf; - - int i,l, c; - unsigned char buf[MAX_SIZE]; - - if ((inf=fopen(source, "r"))==NULL) - { - perror(source); - return 0; - } - - if ((outf=fopen(target, "w"))==NULL) - { - perror(target); - fclose(inf); - return 0; - } - - l=0; - - while ((c=getc(inf))!=EOF) - { - if (c == ':') /* Sync with beginning of line */ - { - int n, check; - unsigned char sum; - int addr; - int linetype; - - if (fscanf(inf, "%02x", &n) != 1) - ABANDON("File format error"); - sum = n; - - if (fscanf(inf, "%04x", &addr) != 1) - ABANDON("File format error"); - sum += addr/256; - sum += addr%256; - - if (fscanf(inf, "%02x", &linetype) != 1) - ABANDON("File format error"); - sum += linetype; - - if (linetype != 0) - continue; - - for (i=0;i= MAX_SIZE) - ABANDON("File too large"); - buf[addr++] = c; - if (addr > l) - l = addr; - sum += c; - } - - if (fscanf(inf, "%02x", &check) != 1) - ABANDON("File format error"); - - sum = ~sum + 1; - if (check != sum) - ABANDON("Line checksum error"); - } - } - - fprintf(outf, "/*\n *\t Computer generated file. Do not edit.\n */\n"); - fprintf(outf, "static unsigned char %s[] = {\n", varline); - - for (i=0;i - -#if defined(CONFIG_GUS) - -#include -#include - -#define MIX_DEVS (SOUND_MASK_MIC|SOUND_MASK_LINE| \ - SOUND_MASK_SYNTH| \ - SOUND_MASK_CD | SOUND_MASK_VOLUME) - -extern sound_os_info *gus_osp; -extern int gus_base; -static int volumes[ICS_MIXDEVS]; -static int left_fix[ICS_MIXDEVS] = {1, 1, 1, 2, 1, 2}; -static int right_fix[ICS_MIXDEVS] = {2, 2, 2, 1, 2, 1}; - -static int -scale_vol(int vol) -{ - /* - * Experimental volume scaling by Risto Kankkunen. This should give - * smoother volume response than just a plain multiplication. - */ - int e; - - RANGE(vol, 0, 100); - vol = (31 * vol + 50) / 100; - e = 0; - if (vol) { - while (vol < 16) { - vol <<= 1; - e--; - } - vol -= 16; - e += 7; - } - return ((e << 4) + vol); -} - -static void -write_mix(int dev, int chn, int vol) -{ - int *selector; - unsigned long flags; - int ctrl_addr = dev << 3; - int attn_addr = dev << 3; - - vol = scale_vol(vol); - - if (chn == CHN_LEFT) { - selector = left_fix; - ctrl_addr |= 0x00; - attn_addr |= 0x02; - } else { - selector = right_fix; - ctrl_addr |= 0x01; - attn_addr |= 0x03; - } - - flags = splhigh(); - outb(u_MixSelect, ctrl_addr); - outb(u_MixData, selector[dev]); - outb(u_MixSelect, attn_addr); - outb(u_MixData, (unsigned char) vol); - splx(flags); -} - -static int -set_volumes(int dev, int vol) -{ - int left = vol & 0x00ff; - int right = (vol >> 8) & 0x00ff; - - RANGE (left, 0, 100); - RANGE (right, 0, 100); - - write_mix(dev, CHN_LEFT, left); - write_mix(dev, CHN_RIGHT, right); - - vol = left + (right << 8); - volumes[dev] = vol; - return vol; -} - -static int -ics2101_mixer_ioctl(int dev, unsigned int cmd, ioctl_arg arg) -{ - if (((cmd >> 8) & 0xff) == 'M') { - if (cmd & IOC_IN) - switch (cmd & 0xff) { - case SOUND_MIXER_RECSRC: - return gus_default_mixer_ioctl(dev, cmd, arg); - break; - - case SOUND_MIXER_MIC: - return *(int *) arg = set_volumes(DEV_MIC, (*(int *) arg)); - break; - - case SOUND_MIXER_CD: - return *(int *) arg = set_volumes(DEV_CD, (*(int *) arg)); - break; - - case SOUND_MIXER_LINE: - return *(int *) arg = set_volumes(DEV_LINE, (*(int *) arg)); - break; - - case SOUND_MIXER_SYNTH: - return *(int *) arg = set_volumes(DEV_GF1, (*(int *) arg)); - break; - - case SOUND_MIXER_VOLUME: - return *(int *) arg = set_volumes(DEV_VOL, (*(int *) arg)); - break; - - default: - return -(EINVAL); - } - else - switch (cmd & 0xff) { /* Return parameters */ - - case SOUND_MIXER_RECSRC: - return gus_default_mixer_ioctl(dev, cmd, arg); - break; - - case SOUND_MIXER_DEVMASK: - return *(int *) arg = MIX_DEVS; - break; - - case SOUND_MIXER_STEREODEVS: - return *(int *) arg = SOUND_MASK_LINE | SOUND_MASK_CD | - SOUND_MASK_SYNTH | SOUND_MASK_VOLUME | SOUND_MASK_MIC; - break; - - case SOUND_MIXER_RECMASK: - return *(int *) arg = SOUND_MASK_MIC | SOUND_MASK_LINE; - break; - - case SOUND_MIXER_CAPS: - return *(int *) arg = 0; - break; - - case SOUND_MIXER_MIC: - return *(int *) arg = volumes[DEV_MIC]; - break; - - case SOUND_MIXER_LINE: - return *(int *) arg = volumes[DEV_LINE]; - break; - - case SOUND_MIXER_CD: - return *(int *) arg = volumes[DEV_CD]; - break; - - case SOUND_MIXER_VOLUME: - return *(int *) arg = volumes[DEV_VOL]; - break; - - case SOUND_MIXER_SYNTH: - return *(int *) arg = volumes[DEV_GF1]; - break; - - default: - return -(EINVAL); - } - } - return -(EINVAL); -} - -static struct mixer_operations ics2101_mixer_operations = -{ - "ICS2101 Multimedia Mixer", - ics2101_mixer_ioctl -}; - -void -ics2101_mixer_init() -{ - int i; - - if (num_mixers < MAX_MIXER_DEV) { - mixer_devs[num_mixers++] = &ics2101_mixer_operations; - - /* - * Some GUS v3.7 cards had some channels flipped. Disable the - * flipping feature if the model id is other than 5. - */ - - if (inb(u_MixSelect) != 5) { - for (i = 0; i < ICS_MIXDEVS; i++) - left_fix[i] = 1; - for (i = 0; i < ICS_MIXDEVS; i++) - right_fix[i] = 2; - } - set_volumes(DEV_GF1, 0x5a5a); - set_volumes(DEV_CD, 0x5a5a); - set_volumes(DEV_MIC, 0x0000); - set_volumes(DEV_LINE, 0x5a5a); - set_volumes(DEV_VOL, 0x5a5a); - set_volumes(DEV_UNUSED, 0x0000); - } -} - -#endif diff --git a/sys/i386/isa/sound/iwdefs.h b/sys/i386/isa/sound/iwdefs.h deleted file mode 100644 index 60f50fc..0000000 --- a/sys/i386/isa/sound/iwdefs.h +++ /dev/null @@ -1,712 +0,0 @@ -/*#######################################################################*/ -/* FILE : iwdefs.h*/ -/**/ -/* REMARKS: This file contains all defines used by DDK functions. It*/ -/* should be included by all applications and should be*/ -/* referenced by programmers to make their code easy to read*/ -/* and understand.*/ -/**/ -/* UPDATE: 3/21/95*/ -/* 7/10/95 --- added #def DRAM_HOLES*/ -/*#######################################################################*/ -#ifndef IWDEFS -#define IWDEFS -/*#######################################################################*/ -/**/ -/* Macros for use in loading Synth Addr Regs*/ -/**/ -/*#######################################################################*/ -#define ADDR_HIGH(x) (short)(x>>7) -#define ADDR_LOW(x) (short)(x<<9) -/*#######################################################################*/ -/**/ -/* Defines for DMA Controllers*/ -/**/ -/*#######################################################################*/ -/* DMA Controler #1 (8-bit controller) */ -#define DMA1_STAT 0x08 /* read status register */ -#define DMA1_WCMD 0x08 /* write command register */ -#define DMA1_WREQ 0x09 /* write request register */ -#define DMA1_SNGL 0x0A /* write single bit register */ -#define DMA1_MODE 0x0B /* write mode register */ -#define DMA1_CLRFF 0x0C /* clear byte ptr flip/flop */ -#define DMA1_MCLR 0x0D /* master clear register */ -#define DMA1_CLRM 0x0E /* clear mask register */ -#define DMA1_WRTALL 0x0F /* write all mask register */ - -/* DMA Controler #2 (16-bit controller) */ -#define DMA2_STAT 0xD0 /* read status register */ -#define DMA2_WCMD 0xD0 /* write command register */ -#define DMA2_WREQ 0xD2 /* write request register */ -#define DMA2_SNGL 0xD4 /* write single bit register */ -#define DMA2_MODE 0xD6 /* write mode register */ -#define DMA2_CLRFF 0xD8 /* clear byte ptr flip/flop */ -#define DMA2_MCLR 0xDA /* master clear register */ -#define DMA2_CLRM 0xDC /* clear mask register */ -#define DMA2_WRTALL 0xDE /* write all mask register */ - -#define DMA0_ADDR 0x00 /* chan 0 base adddress */ -#define DMA0_CNT 0x01 /* chan 0 base count */ -#define DMA1_ADDR 0x02 /* chan 1 base adddress */ -#define DMA1_CNT 0x03 /* chan 1 base count */ -#define DMA2_ADDR 0x04 /* chan 2 base adddress */ -#define DMA2_CNT 0x05 /* chan 2 base count */ -#define DMA3_ADDR 0x06 /* chan 3 base adddress */ -#define DMA3_CNT 0x07 /* chan 3 base count */ -#define DMA4_ADDR 0xC0 /* chan 4 base adddress */ -#define DMA4_CNT 0xC2 /* chan 4 base count */ -#define DMA5_ADDR 0xC4 /* chan 5 base adddress */ -#define DMA5_CNT 0xC6 /* chan 5 base count */ -#define DMA6_ADDR 0xC8 /* chan 6 base adddress */ -#define DMA6_CNT 0xCA /* chan 6 base count */ -#define DMA7_ADDR 0xCC /* chan 7 base adddress */ -#define DMA7_CNT 0xCE /* chan 7 base count */ - -#define DMA0_PAGE 0x87 /* chan 0 page register (refresh)*/ -#define DMA1_PAGE 0x83 /* chan 1 page register */ -#define DMA2_PAGE 0x81 /* chan 2 page register */ -#define DMA3_PAGE 0x82 /* chan 3 page register */ -#define DMA4_PAGE 0x8F /* chan 4 page register (unusable)*/ -#define DMA5_PAGE 0x8B /* chan 5 page register */ -#define DMA6_PAGE 0x89 /* chan 6 page register */ -#define DMA7_PAGE 0x8A /* chan 7 page register */ -/*#######################################################################*/ -/**/ -/* Defines for register UISR (Interrupt Status)*/ -/**/ -/*#######################################################################*/ -#define MIDI_TX_IRQ 0x01 -#define MIDI_RX_IRQ 0x02 -#define ALIB_TIMER1_IRQ 0x04 -#define ALIB_TIMER2_IRQ 0x08 -#define _UASBCI 0x45 /* UASBCI index */ -#define SAMPLE_CONTROL 0x49 /* Not used by IW */ -#define SET_VOICES 0x0E -#define WAVETABLE_IRQ 0x20 -#define ENVELOPE_IRQ 0x40 -#define DMA_TC_IRQ 0x80 -/*#######################################################################*/ -/**/ -/* Synthesizer-related defines*/ -/**/ -/*#######################################################################*/ -#define GEN_INDEX 0x03 /* IGIDX offset into p3xr */ -#define VOICE_SELECT 0x02 /* SVSR offset into p3xr */ -#define VOICE_IRQS 0x8F /* SVII index (read) */ -#define _URSTI 0x4C /* URSTI index */ -#define GF1_SET 0x01 /* URSTI[0] */ -#define GF1_OUT_ENABLE 0x02 /* URSTI[1] */ -#define GF1_IRQ_ENABLE 0x04 /* URSTI[2] */ -#define GF1_RESET 0xFE /* URSTI[0]=0 */ -#define VOICE_VOLUME_IRQ 0x04 /* SVII[2] */ -#define VOICE_WAVE_IRQ 0x08 /* SVII[3] */ -#define VC_IRQ_ENABLE 0x20 /* SACI[5] or SVCI[5]*/ -#define VOICE_NUMBER 0x1F /* Mask for SVII[4:0] */ -#define VC_IRQ_PENDING 0x80 /* SACI[7] or SVCI[7] */ -#define VC_DIRECT 0x40 /* SACI[6] or SVCI[6]*/ -#define VC_DATA_WIDTH 0x04 /* SACI[2] */ -#define VOICE_STOP 0x02 /* SACI[1] */ -#define VOICE_STOPPED 0x01 /* SACI[0] */ -#define VOLUME_STOP 0x02 /* SVCI[1] */ -#define VOLUME_STOPPED 0x01 /* SVCI[0] */ -#define VC_ROLLOVER 0x04 /* SVCI[2] */ -#define VC_LOOP_ENABLE 0x08 /* SVCI[3] or SACI[3]*/ -#define VC_BI_LOOP 0x10 /* SVCI[4] or SACI[4]*/ -#define VOICE_OFFSET 0x20 /* SMSI[5] */ -#define VOLUME_RATE0 0x00 /* SVRI[7:6]=(0,0) */ -#define VOLUME_RATE1 0x40 /* SVRI[7:6]=(0,1) */ -#define VOLUME_RATE2 0x80 /* SVRI[7:6]=(1,0) */ -#define VOLUME_RATE3 0xC0 /* SVRI[7:6]=(1,1) */ -/*#######################################################################*/ -/**/ -/* Power-Mode Control Defines*/ -/**/ -/*#######################################################################*/ -#define SHUT_DOWN 0x7E /* shuts InterWave down */ -#define POWER_UP 0xFE /* enables all modules */ -#define CODEC_PWR_UP 0x81 /* enables Codec Analog Ckts */ -#define CODEC_PWR_DOWN 0x01 /* disables Codec Analog Ckts */ -#define CODEC_REC_UP 0x82 /* Enables Record Path */ -#define CODEC_REC_DOWN 0x02 /* Disables Record Path */ -#define CODEC_PLAY_UP 0x84 /* Enables Playback Path */ -#define CODEC_PLAY_DOWN 0x04 /* Disables Playback Path */ -#define CODEC_IRQ_ENABLE 0x02 /* CEXTI[2] */ -#define CODEC_TIMER_IRQ 0x40 /* CSR3I[6] */ -#define CODEC_REC_IRQ 0x20 /* CSR3I[5] */ -#define CODEC_PLAY_IRQ 0x10 /* CSR3I[4] */ -#define CODEC_INT 0x01 /* CSR1R[0] */ -#define MONO_INPUT 0x80 /* CMONOI[7] */ -#define MONO_OUTPUT 0x40 /* CMONOI[6] */ -#define MIDI_UP 0x88 /* Enables MIDI ports */ -#define MIDI_DOWN 0x08 /* Disables MIDI ports */ -#define SYNTH_UP 0x90 /* Enables Synthesizer */ -#define SYNTH_DOWN 0x10 /* Disables Synthesizer */ -#define LMC_UP 0xA0 /* Enables LM Module */ -#define LMC_DOWN 0x20 /* Disbales LM Module */ -#define XTAL24_UP 0xC0 /* Enables 24MHz Osc */ -#define XTAL24_DOWN 0x40 /* Disables 24MHz Osc */ -#define _PPWRI 0xF2 /* PPWRI index */ -#define PLAY 0x0F -#define REC 0x1F -#define LEFT_AUX1_INPUT 0x02 -#define RIGHT_AUX1_INPUT 0x03 -#define LEFT_AUX2_INPUT 0x04 -#define RIGHT_AUX2_INPUT 0x05 -#define LEFT_LINE_IN 0x12 -#define RIGHT_LINE_IN 0x13 -#define LEFT_LINE_OUT 0x19 -#define RIGHT_LINE_OUT 0x1B -#define LEFT_SOURCE 0x00 -#define RIGHT_SOURCE 0x01 -#define LINE_IN 0x00 -#define AUX1_IN 0x40 -#define MIC_IN 0x80 -#define MIX_IN 0xC0 -#define LEFT_DAC 0x06 -#define RIGHT_DAC 0x07 -#define LEFT_MIC_IN 0x16 -#define RIGHT_MIC_IN 0x17 -#define _CUPCTI 0x0E -#define _CLPCTI 0x0F -#define _CURCTI 0x1E -#define _CLRCTI 0x1F -#define _CLAX1I 0x02 -#define _CRAX1I 0x03 -#define _CLAX2I 0x04 -#define _CRAX2I 0x05 -#define _CLLICI 0x12 -#define _CRLICI 0x13 -#define _CLOAI 0x19 -#define _CROAI 0x1B -#define _CLICI 0x00 -#define _CRICI 0x01 -#define _CLDACI 0x06 -#define _CRDACI 0x07 -#define _CPVFI 0x1D -/*#######################################################################*/ -/**/ -/* Defines for DMA transfer related operations*/ -/**/ -/*#######################################################################*/ -#define MAX_DMA 0x07 -#define DMA_DECREMENT 0x20 -#define AUTO_INIT 0x10 -#define DMA_READ 0x01 -#define DMA_WRITE 0x02 -#define AUTO_READ 0x03 -#define AUTO_WRITE 0x04 -#define IDMA_INV 0x0400 -#define IDMA_WIDTH_16 0x0100 -/*#######################################################################*/ -/**/ -/* Bits for dma flags within a DMA structure.*/ -/**/ -/*#######################################################################*/ -#define DMA_USED 0x0001 - -#define DMA_SPLIT 0x0004 /* DMA Controller Page Crossover*/ -#define CODEC_DMA 0x0008 /* Indicates a Codec DMA*/ -#define DMA_WAIT 0x0020 /* Wait for DMA xfer to complete*/ -#define DMA_DOWN 0x0040 /* DMA xfer from PC to InterWave*/ -#define DRAM_HOLES 0x8000 /* Indicates Non-contiguous RAM configuration*/ -#define DMA_UP 0xFFBF /* DMA xfer from InterWave to PC */ -/*#######################################################################*/ -/**/ -/* Bits for DMA Control Register (LDMACI)*/ -/**/ -/*#######################################################################*/ -#define _LDMACI 0x41 /* Index */ -#define DMA_INV 0x80 -#define DMA_IRQ_ENABLE 0x20 -#define DMA_IRQ_PENDING 0x40 /* on reads of LDMACI[6] */ -#define DMA_DATA_16 0x40 /* on writes to LDMACI[6] */ -#define DMA_WIDTH_16 0x04 /* 1=16-bit, 0=8-bit (DMA channel) */ -#define DMA_RATE 0x18 /* 00=fastest,...,11=slowest */ -#define DMA_UPLOAD 0x02 /* From LM to PC */ -#define DMA_ENABLE 0x01 -/*#######################################################################*/ -/**/ -/* DMA Transfer Rates*/ -/**/ -/*#######################################################################*/ -#define DMA_R0 0xE7 /* Fastest (use ANDing to set) */ -#define DMA_R1 0x08 -#define DMA_R2 0x10 -#define DMA_R3 0x18 /* Slowest */ -/*#######################################################################*/ -/**/ -/* Interrupt Controller Defines*/ -/**/ -/*#######################################################################*/ -#define IW_HANDLERS_ON 0x80 /* Flag for when IVT is modified */ -#define EOI 0x20 -#define OCR1 0x20 /* 8259-1 Operation Control Reg. */ -#define IMR1 0x21 /* 8259-1 Interrupt Mask Reg. */ -#define OCR2 0xA0 /* 8259-2 Operation Control Reg. */ -#define IMR2 0xA1 /* 8259-2 Interrupt Mask Reg. */ -#define IRQ0_UNMASK 0xFE /* Mask to clear bit 0 in IMR */ -#define IRQ1_UNMASK 0xFD -#define IRQ2_UNMASK 0xFB -#define IRQ3_UNMASK 0xF7 -#define IRQ4_UNMASK 0xEF -#define IRQ5_UNMASK 0xDF -#define IRQ6_UNMASK 0xBF -#define IRQ7_UNMASK 0x7F -#define IRQ8_UNMASK 0xFE /* Mask to clear bit 0 in IMR */ -#define IRQ9_UNMASK 0xFD -#define IRQ10_UNMASK 0xFB -#define IRQ11_UNMASK 0xF7 -#define IRQ12_UNMASK 0xEF -#define IRQ13_UNMASK 0xDF -#define IRQ14_UNMASK 0xBF -#define IRQ15_UNMASK 0x7F -#define IRQ0_EOI 0x60 /* Spec EOI for IRQ0 */ -#define IRQ1_EOI 0x61 -#define IRQ2_EOI 0x62 -#define IRQ3_EOI 0x63 -#define IRQ4_EOI 0x64 -#define IRQ5_EOI 0x65 -#define IRQ6_EOI 0x66 -#define IRQ7_EOI 0x67 -#define IRQ8_EOI 0x60 /* Spec EOI for IRQ8 */ -#define IRQ9_EOI 0x61 -#define IRQ10_EOI 0x62 -#define IRQ11_EOI 0x63 -#define IRQ12_EOI 0x64 -#define IRQ13_EOI 0x65 -#define IRQ14_EOI 0x66 -#define IRQ15_EOI 0x67 -/*#######################################################################*/ -/**/ -/* Generic defines*/ -/**/ -/*#######################################################################*/ -/**/ -#define MEMBANK0 0L /* Addr of Memory Bank 0*/ -#define MEMBANK1 4194304L /* Addr of Memory Bank 1*/ -#define MEMBANK2 8388608L /* Addr of Memory Bank 2*/ -#define MEMBANK3 12582912L /* Addr of Memory Bank 3*/ -#define IRQ_UNAVAIL 0x0000 -#define IRQ_AVAIL 0x0001 -#define IRQ_USED 0x0002 -#define MAX_IRQ 16 -#define NEXT_OFFSET 0L -#define PREV_OFFSET 4L -#define SIZE_OFFSET 8L -#define MEM_HEADER_SIZE 12L -#define GF1_POOL (usigned long)(256L*1024L) -#define GUS_MODE 0x00 /* SGMI[0]=0*/ -#define ENH_MODE 0x01 /* SGMI[0]=1*/ -#define ENABLE_LFOS 0x02 /* SGMI[1]*/ -#define NO_WAVETABLE 0x04 /* SGMI[2]*/ -#define RAM_TEST 0x08 /* SGMI[3]*/ -#define TRUE 1 -#define FALSE 0 -#define ON 1 -#define OFF 0 -#define AUDIO 0 -#define EXT 1 -#define GAME 2 -#define EMULATION 3 -#define MPU401 4 -#define AUDIO_EXT 2 -#define ALLOC_FAILURE 0xFFFFFFFFL -#define MEM_EXHAUSTED 0xFFFFFFFFL -#define RAM_MAX 16777216L -#define RAM_STEP 65536L -#define BANK_MAX 4194304L -#define ILLEGAL_SIZE -1 -#define MEM_INIT 1 -#define NO_NEXT 0xFFFFFFFFL -#define NO_PREV NO_NEXT -#define DMA_BAD_ADDR -1 -#define DMA_ON -1 -#define DMA_OK 1 -#define MIDI_TX_IRQ 0x01 -#define MIDI_RX_IRQ 0x02 -#define ALIB_TIMER1_IRQ 0x04 -#define ALIB_TIMER2_IRQ 0x08 -#define WAVETABLE_IRQ 0x20 -#define ENVELOPE_IRQ 0x40 -#define DMA_TC_IRQ 0x80 -#define DMA_SET_MASK 0x04 -#define PNP_DATA_RDY 1 /* PRESSI[0] */ -#define IWAVE_ABSENT 2 -#define IWAVE_OPEN 4 -#define IWAVE_OK 5 -#define BAD_VOICES -1 -#define PNP_ABSENT 0xFF /* No PNP cards in system */ -#define DPMI_INT 0x31 -#define _PCCCI 0x02 -#define _PCSNI 0x06 -#define _PIDXR 0x279 -#define _PNPWRP 0xA79 -#define _LDSALI 0x42 -#define _LDSAHI 0x50 -#define _LMALI 0x43 -#define _LMAHI 0x44 -#define _LMCFI 0x52 -#define _LMCI 0x53 -#define _LDIBI 0x58 -#define _LDICI 0x57 -#define _LMSBAI 0x51 -#define _SVCI_RD 0x8D -#define _SVCI_WR 0x0D -#define _SACI_RD 0x80 -#define _SACI_WR 0x00 -#define _SALI_RD 0x8B -#define _SALI_WR 0x0B -#define _SAHI_RD 0x8A -#define _SAHI_WR 0x0A -#define _SASHI_RD 0x82 -#define _SASHI_WR 0x02 -#define _SASLI_RD 0x83 -#define _SASLI_WR 0x03 -#define _SAEHI_RD 0x84 -#define _SAEHI_WR 0x04 -#define _SAELI_RD 0x85 -#define _SAELI_WR 0x05 -#define _SVRI_RD 0x86 -#define _SVRI_WR 0x06 -#define _SVSI_RD 0x87 -#define _SVSI_WR 0x07 -#define _SVEI_RD 0x88 -#define _SVEI_WR 0x08 -#define _SVLI_RD 0x89 -#define _SVLI_WR 0x09 -#define _SROI_RD 0x8C -#define _SROI_WR 0x0C -#define _SLOI_RD 0x93 -#define _SLOI_WR 0x13 -#define _SMSI_RD 0x95 -#define _SMSI_WR 0x15 -#define _SGMI_RD 0x99 -#define _SGMI_WR 0x19 -#define _SFCI_RD 0x81 -#define _SFCI_WR 0x01 -#define _SUAI_RD 0x90 -#define _SUAI_WR 0x10 -#define _SVII 0x8F -#define _CMODEI 0x0C /* index for CMODEI */ -#define _CFIG3I 0x11 -#define _CFIG2I 0x10 -#define _CLTIMI 0x14 -#define _CUTIMI 0x15 -#define _CSR3I 0x18 /* Index to CSR3I (Interrupt Status) */ -#define _CEXTI 0x0A /* Index to External Control Register */ -#define _CFIG1I 0x09 /* Index to Codec Conf Reg 1 */ -#define _CSR2I 0x0B /* Index to Codec Stat Reg 2 */ -#define _CPDFI 0x08 /* Index to Play Data Format Reg */ -#define _CRDFI 0x1C /* Index to Rec Data Format Reg */ -#define _CLMICI 0x16 /* Index to Left Mic Input Ctrl Register */ -#define _CRMICI 0x17 /* Index to Right Mic Input Ctrl Register */ -#define _CLCI 0x0D /* Index to Loopback Ctrl Register */ -#define _IVERI 0x5B /* Index to register IVERI */ -#define CODEC_MODE1 0x00 -#define CODEC_MODE2 0x40 -#define CODEC_MODE3 0x6C /* Enhanced Mode */ -#define CODEC_STATUS1 0x01 -#define CODEC_STATUS2 0x0B /* Index to CSR2I */ -#define CODEC_STATUS3 0x18 /* Index to CSR3I */ -#define PLAYBACK 0x01 /* Enable playback path CFIG1I[0]=1*/ -#define RECORD 0x02 /* Enable Record path CFIG1I[1]=1*/ -#define TIMER_ENABLE 0x40 /* CFIG2I[6] */ -#define CODEC_MCE 0x40 /* CIDXR[6] */ -#define CALIB_IN_PROGRESS 0x20 /* CSR2I[5] */ -#define CODEC_INIT 0x80 /* CIDXR[7] */ -#define BIT16_BIG 0xC0 /* 16-bit signed, big endian */ -#define IMA_ADPCM 0xA0 /* IMA-compliant ADPCM */ -#define BIT8_ALAW 0x60 /* 8-bit A-law */ -#define BIT16_LITTLE 0x40 /* 16-bit signed, lillte endian */ -#define BIT8_ULAW 0x20 /* 8-bit u-law */ -#define BIT8_LINEAR 0x00 /* 8-bit unsigned */ -#define REC_DFORMAT 0x1C -#define PLAY_DFORMAT 0x08 -#define DMA_ACCESS 0x00 -#define PIO_ACCESS 0xC0 -#define DMA_SIMPLEX 0x04 -#define STEREO 0x10 /* CxDFI[4] */ -#define XTAL1 0x00 /* CxDFI[4]=0 selects 24.5Mhz XTAL */ -#define XTAL2 0x01 /* CxDFI[4]=1 selects 16.9Mhz XTAL */ -#define AUTOCALIB 0x08 /* CFIG1I[3] */ -#define ROM_IO 0x02 /* ROM I/O cycles - LMCI[1]=1 */ -#define DRAM_IO 0x4D /* DRAM I/O cycles - LMCI[1]=0 */ -#define AUTOI 0x01 /* LMCI[0]=1 */ -#define _PLDNI 0x07 -#define ACTIVATE_DEV 0x30 -#define _PWAKEI 0x03 /* Index for PWAKEI */ -#define _PISOCI 0x01 /* Index for PISOCI */ -#define _PSECI 0xF1 /* Index for PSECI */ -#define RANGE_IOCHK 0x31 /* PURCI or PRRCI Index */ -#define MIDI_RESET 0x03 -#define IO_OK 5 /* No IO conflict flag */ -#define IO_CONFLICT 6 /* IO Conflict detected */ -#define IO_0x55 0x01 -#define IO_0xAA 0xFE -/*#######################################################################*/ -/**/ -/* Defines for Sound Handlers in "iw".*/ -/**/ -/*#######################################################################*/ -#define PLAY_DMA_HANDLER 0x01 -#define REC_DMA_HANDLER 0x02 -#define MIDI_TX_HANDLER 0x03 -#define MIDI_RX_HANDLER 0x04 -#define TIMER1_HANDLER 0x05 -#define TIMER2_HANDLER 0x06 -#define WAVE_HANDLER 0x07 -#define VOLUME_HANDLER 0x08 -#define CODEC_TIMER_HANDLER 0x09 -#define CODEC_PLAY_HANDLER 0x0A -#define CODEC_REC_HANDLER 0x0B -#define AUX_HANDLER 0x0C -/*#######################################################################*/ -/**/ -/* Mapping for System Control Regs.*/ -/**/ -/*#######################################################################*/ -#define UMCR 0x00010000 /* Mix Control Reg.*/ -#define UISR 0x00020006 /* IRQ Stat Reg. (read) */ -#define U2X6R 0x00030006 /* SB 2X6 reg */ -#define UACWR 0x00040008 /* AdLib Command Write Reg */ -#define UASRR 0x00050008 /* AdLib Stat Read Reg */ -#define UADR 0x00060009 /* AdLib Data Register */ -#define UACRR 0x0007000A /* AdLib Cmd Read Reg */ -#define UASWR 0x0008000A /* AdLib Stat Write Reg */ -#define UHRDP 0x0009000B /* Hidden Reg Data Port */ -#define UI2XCR 0x000A000C /* SB IRQ 2xC Reg */ -#define U2XCR 0x000B000D /* SB 2xC Reg. (No IRQ) */ -#define U2XER 0x000C000E /* SB 2xE Reg. */ -#define URCR 0x000D000F /* Reg Control Register */ -#define USRR 0x000E000F /* Status Read Register */ -#define UDCI 0x000F000B /* DMA Channel Control Reg */ -#define UICI 0x0010000B /* Interrupt Ctrl Reg */ -#define UGP1I 0x0011010B /* GP Reg 1 (Back Door) */ -#define UGP2I 0x0012020B /* GP Reg 2 (Back Door) */ -#define UGPA1I 0x0013030B /* GP reg 1 Address */ -#define UGPA2I 0x0014040B /* GP reg 2 Address */ -#define UCLRII 0x0015050B /* Clear Interrupt Reg */ -#define UJMPI 0x0016060B /* Jumper Register */ -#define UGP1II 0x0017000B /* Gen. Purp Reg 1(Emulation) */ -#define UGP2II 0x0018000B /* Gen. Purp Reg 2(Emulation) */ -#define GGCR 0x00190201 /* Game Control Register */ -#define GMCR 0x001A0000 /* MIDI Control Register */ -#define GMSR 0x001B0000 /* MIDI Status Reg. */ -#define GMTDR 0x001C0001 /* MIDI xmit data reg */ -#define GMRDR 0x001D0001 /* MIDI rcv data reg */ -#define SVSR 0x001E0002 /* Synth Voice Select Reg */ -#define IGIDXR 0x001F0003 /* General Index Register */ -#define I16DP 0x00200004 /* General 16-bit Data Port */ -#define I8DP 0x00210005 /* General 8-bit Data Port */ -/*#######################################################################*/ -/**/ -/* Synth defines*/ -/**/ -/*#######################################################################*/ -#define SACI 0x00220005 /* Synth Addr Control */ -#define SFCI 0x00230104 /* Synth Freq Control */ -#define SASHI 0x00240204 /* Synth Addr Start High */ -#define SASLI 0x00250304 /* Synth Addr Start Low */ -#define SAEHI 0x00260404 /* Synth Addr End High */ -#define SAELI 0x00270504 /* Synth Addr End Low */ -#define SVRI 0x00280605 /* Synth Volume Rate */ -#define SVSI 0x00290705 /* Synth Volume Start */ -#define SVEI 0x002A0805 /* Synth Volume End */ -#define SVLI 0x002B0904 /* Synth Volume Level */ -#define SAHI 0x002C0A04 /* Synth Address High */ -#define SALI 0x002D0B04 /* Synth Address Low */ -#define SROI 0x002E0C04 /* Synth Right Offset */ -#define SVCI 0x002F0D05 /* Synth Volume Control */ -#define SAVI 0x00300E05 /* Synth Active Voices */ -#define SVII 0x00318F05 /* Synth Voice IRQ */ -#define SUAI 0x00321005 /* Synth Upper Addr */ -#define SEAHI 0x00331104 /* Synth Effect Addr High */ -#define SEALI 0x00341204 /* Synth Effect Addr Low */ -#define SLOI 0x00351304 /* Synth Left Offset */ -#define SEASI 0x00361405 /* Synth Effects Accum Sel */ -#define SMSI 0x00371505 /* Synth Mode Select */ -#define SEVI 0x00381604 /* Synth Effect Volume */ -#define SFLFOI 0x00391705 /* Synth Freq LFO */ -#define SVLFOI 0x003A1805 /* Synth Vol LFO */ -#define SGMI 0x003B1905 /* Synth Global Mode */ -#define SLFOBI 0x003C1A04 /* Synth LFO Base Address */ -#define SROFI 0x003D1B04 -#define SLOFI 0x003E1C04 -#define SEVFI 0x003F1D04 -#define SVIRI 0x00409F05 /* Synth Voice Read IRQ */ -#define LDMACI 0x00414105 /* DMA Control Reg. */ -#define LDSALI 0x00424204 /* LMC DMA Start Addr. Low Reg. */ -#define LMALI 0x00434304 /* LMC Addr Low (I/O) */ -#define LMAHI 0x00444405 /* LMC Addr High (I/O) */ -#define UASBCI 0x00454505 /* Adlib-SB Control */ -#define UAT1I 0x00464605 /* AdLib Timer 1 Count */ -#define UAT2I 0x00474705 /* AdLib Timer 2 Count */ -#define USCI 0x00484905 /* Sample Control Reg */ -#define GJTDI 0x00494B05 -#define URSTI 0x004A4C05 -#define LDSAHI 0x004B5005 -#define LMSBAI 0x004C5104 -#define LMCFI 0x004D5204 -#define LMCI 0x004E5305 -#define LMRFAI 0x004F5404 -#define LMPFAI 0x00505504 -#define LMSFI 0x00515604 -#define LDICI 0x00525704 -#define LDIBI 0x00535804 -#define ICMPTI 0x00545905 -#define IDECI 0x00555A05 -#define IVERI 0x00565B05 -#define IEMUAI 0x00575C05 -#define IEMUBI 0x00585D05 -#define GMRFAI 0x00595E05 -#define ITCI 0x005A5F05 -#define IEIRQI 0x005B6005 -#define LMBDR 0x005C0007 -/*##########################################################*/ -/* Mnemonics for Codec Registers*/ -/*##########################################################*/ -#define CIDXR 0x005D0000 -#define CDATAP 0x005E0001 -#define CSR1R 0x005F0002 -#define CPDR 0x00600003 -#define CRDR 0x00610003 -#define CLICI 0x00620001 -#define CRICI 0x00630101 -#define CLAX1I 0x00640201 -#define CRAX1I 0x00650301 -#define CLAX2I 0x00660401 -#define CRAX2I 0x00670501 -#define CLDACI 0x00680601 -#define CRDACI 0x00690701 -#define CPDFI 0x006A0801 -#define CFIG1I 0x006B0901 -#define CEXTI 0x006C0A01 -#define CSR2I 0x006D0B01 -#define CMODEI 0x006E0C01 -#define CLCI 0x006F0D01 -#define CUPCTI 0x00700E01 -#define CLPCTI 0x00710F01 -#define CFIG2I 0x00721001 -#define CFIG3I 0x00731101 -#define CLLICI 0x00741201 -#define CRLICI 0x00751301 -#define CLTIMI 0x00761401 -#define CUTIMI 0x00771501 -#define CLMICI 0x00781601 -#define CRMICI 0x00791701 -#define CSR3I 0x007A1801 -#define CLOAI 0x007B1901 -#define CMONOI 0x007C1A01 -#define CROAI 0x007D1B01 -#define CRDFI 0x007E1C01 -#define CPVFI 0x007F1D01 -#define CURCTI 0x00801E01 -#define CLRCTI 0x00811F01 -/*##########################################################*/ -/* Mnemonics for PnP Registers*/ -/*##########################################################*/ -#define PCSNBR 0x00820201 -#define PIDXR 0x00830279 -#define PNPWRP 0x00840A79 -#define PNPRDP 0x00850000 -#define PSRPAI 0x00860000 -#define PISOCI 0x00870100 -#define PCCCI 0x00880200 -#define PWAKEI 0x00890300 -#define PRESDI 0x008A0400 -#define PRESSI 0x008B0500 -#define PCSNI 0x008C0600 -#define PLDNI 0x008D0700 -#define PUACTI 0x008E3000 -#define PURCI 0x008F3100 -#define P2X0HI 0x00906000 -#define P2X0LI 0x00916100 -#define P3X0HI 0x00926200 -#define P3X0LI 0x00936300 -#define PHCAI 0x00946400 -#define PLCAI 0x00956500 -#define PUI1SI 0x00967000 -#define PUI1TI 0x00977100 -#define PUI2SI 0x00987200 -#define PUI2TI 0x00997300 -#define PUD1SI 0x009A7400 -#define PUD2SI 0x009B7500 -#define PSEENI 0x009CF000 -#define PSECI 0x009DF100 -#define PPWRI 0x009EF200 -#define PRACTI 0x009F3001 -#define PRRCI 0x00A03101 -#define PRAHI 0x00A16001 -#define PRALI 0x00A26101 -#define PATAHI 0x00A36201 -#define PATALI 0x00A46301 -#define PRISI 0x00A57001 -#define PRITI 0x00A67101 -#define PRDSI 0x00A77401 -#define PGACTI 0x00A83002 -#define PGRCI 0x00A93102 -#define P201HI 0x00AA6002 -#define P201LI 0x00AB6102 -#define PSACTI 0x00AC3003 -#define PSRCI 0x00AD3103 -#define P388HI 0x00AE6003 -#define P388LI 0x00AF6103 -#define PSBISI 0x00B07003 -#define PSBITI 0x00B17103 -#define PMACTI 0x00B23004 -#define PMRCI 0x00B33104 -#define P401HI 0x00B46004 -#define P401LI 0x00B56104 -#define PMISI 0x00B67004 -#define PMITI 0x00B77104 - -typedef unsigned char BYTE; -typedef unsigned short WORD; -typedef unsigned short PORT; -typedef unsigned long DWORD; -typedef unsigned long ADDRESS; -typedef int BOOL; -typedef int FLAG; - -typedef struct - { - short flags; /* InterWave stat flags */ - PORT pcodar; /* Base Port for Codec */ - PORT pcdrar; /* Base Port for Ext Device */ - PORT p2xr; /* Compatibility Base Port */ - PORT p3xr; /* MIDI and Synth Base Port */ - PORT p401ar; /* Gen Purpose Reg. 1 address */ - PORT p201ar; /* Game Ctrl normally at 0x201 */ - PORT pataar; /* Base Address for ATAPI I/O Space */ - PORT p388ar; /* Base Port for AdLib. It should be 388h */ - PORT pnprdp; /* PNP read data port */ - PORT igidxr; /* Gen Index Reg at P3XR+0x03 */ - PORT i16dp; /* 16-bit data port at P3XR+0x04 */ - PORT i8dp; /* 8-bit data port at P3XR+0x05 */ - PORT svsr; /* Synth Voice Select at P3XR+0x02 */ - PORT cdatap; /* Codec Indexed Data Port at PCODAR+0x01 */ - PORT csr1r; /* Codec Stat Reg 1 at PCODAR+0x02 */ - PORT cxdr; /* Play or Record Data Reg at PCODAR+0x03 */ - PORT gmxr; /* GMCR or GMSR at P3XR+0x00 */ - PORT gmxdr; /* GMTDR or GMRDR at P3XR+0x01 */ - PORT lmbdr; /* LMBDR at P3XR+0x07 */ - BYTE csn; /* Card Select Number */ - BYTE cmode; /* Codec Operation Mode */ - int dma1_chan; /* DMA channel 1 (local DMA & codec rec) */ - int dma2_chan; /* DMA channel 2 (codec play) */ - int ext_chan; /* Ext Dev DMA channel */ - BYTE voices; /* Number of active voices */ - DWORD vendor; /* Vendor ID and Product Identifier */ - int synth_irq; /* Synth IRQ number */ - int midi_irq; /* MIDI IRQ number */ - int ext_irq; /* Ext Dev IRQ */ - int mpu_irq; /* MPU401 Dev IRQ */ - int emul_irq; /* Sound Blaster/AdLib Dev IRQ */ - ADDRESS free_mem; /* Address of First Free LM Block */ - DWORD reserved_mem; /* Amount of LM reserved by app. */ - BYTE smode; /* Synth Mode */ - WORD size_mem; /* Total LM in Kbytes */ - - } IWAVE; - -#endif diff --git a/sys/i386/isa/sound/local.h b/sys/i386/isa/sound/local.h deleted file mode 100644 index cf8a219..0000000 --- a/sys/i386/isa/sound/local.h +++ /dev/null @@ -1,195 +0,0 @@ -/* - * local.h - * - * This file was generated by configure. But then HAND-EDITED. It will - * probably disappear in future revisions once the configuration process - * will become more like that of standard bsd code. - * lr 970714 - * - */ - -/* build hex2hex /tmp/foo.x trix_boot.h trix_boot */ - -/* - * make everything conditioned on NSND>0 so as to detect errors - * because of missing "controller snd0" statement - */ -#define ALLOW_BUFFER_MAPPING 1 - -#include "snd.h" -#if NSND > 0 - -#include "opt_sound.h" - -#define CONFIGURE_SOUNDCARD - -#define CONFIG_SEQUENCER - -#include "gus.h" -#if NGUS != 0 && !defined(CONFIG_GUS) -#define CONFIG_GUS -#define CONFIG_GUSMAX -#endif - -#include "sscape.h" -#if NSSCAPE != 0 && !defined(CONFIG_SSCAPE) -#define CONFIG_SSCAPE -#endif - -#include "trix.h" -#if NTRIX > 0 -#define INCLUDE_TRIX_BOOT -#define CONFIG_TRIX /* can use NTRIX > 0 instead */ -#define CONFIG_YM3812 -#endif - -#if defined(CONFIG_GUSMAX) || ( NSSCAPE > 0 ) || ( NTRIX > 0 ) -#define CONFIG_AD1848 -#endif - -#if defined(CONFIG_SEQUENCER) && (NTRIX == 0) -#define CONFIG_MIDI -#endif - -#include "sb.h" -#if NSB > 0 -#define CONFIG_SB -#endif - -#include "mss.h" -#if NMSS != 0 -#define CONFIG_AD1848 -#define CONFIG_MSS -#undef CONFIG_CS4232 -#endif - -#include "css.h" -#if NCSS != 0 -#define CONFIG_AD1848 -#undef CONFIG_MSS -#define CONFIG_CS4232 -#endif - -#include "sbxvi.h" -#if NSBXVI != 0 && !defined(CONFIG_SB16) -#define CONFIG_SB16 -#define CONFIG_SBPRO /* FIXME: Also needs to be a sep option */ -#endif - -#include "sbmidi.h" -#if NSBMIDI != 0 && !defined(CONFIG_SB16MIDI) -#define CONFIG_SB16MIDI -#endif - -#include "awe.h" -#if NAWE != 0 && !defined(CONFIG_AWE32) -#define CONFIG_AWE32 -#endif - -#include "pas.h" -#if NPAS != 0 && !defined(CONFIG_PAS) -#define CONFIG_PAS -#endif - -#include "mpu.h" -#if NMPU != 0 && !defined(CONFIG_MPU401) -#define CONFIG_MPU401 -#endif - -#include "opl.h" -#if NOPL != 0 && !defined(CONFIG_YM3812) -#define CONFIG_YM3812 -#endif - -#ifdef PC98 -#include "nss.h" -#if NNSS != 0 -#define CONFIG_NSS -#endif -#endif - -#define ALLOW_POLL - -/* #undef CONFIG_PAS */ -/* #undef CONFIG_ADLIB */ -/* #define CONFIG_GUS */ -/* #undef CONFIG_MPU401 */ -#undef CONFIG_UART6850 -#undef CONFIG_PSS -#undef CONFIG_GUS16 -/* #undef CONFIG_MSS */ -/* #undef CONFIG_SSCAPE */ -#undef CONFIG_MAD16 -/* #undef CONFIG_CS4232 */ -#undef CONFIG_MAUI -#undef CONFIG_PNP -/* #undef CONFIG_SBPRO */ -/* #undef CONFIG_SB16 */ -#undef CONFIG_AEDSP16 -#define CONFIG_AUDIO /* obvious ? */ - -#define CONFIG_MPU_EMU - -#ifdef PC98 -#define DSP_BUFFSIZE 61440 -#else -#define DSP_BUFFSIZE 32768*2 -#endif -/* #define SELECTED_SOUND_OPTIONS 0x0188090a */ - -#ifndef TRIX_SB_BASE -#define TRIX_SB_BASE 0x220 -#endif - -#ifndef TRIX_SB_IRQ -#define TRIX_SB_IRQ 7 -#endif - -#ifndef TRIX_SB_DMA -#define TRIX_SB_DMA 1 -#endif - -#ifndef TRIX_BASE -#define TRIX_BASE 0x530 -#endif - -#ifndef TRIX_IRQ -#define TRIX_IRQ 9 -#endif - -#ifndef TRIX_DMA -#define TRIX_DMA 3 -#endif - -#ifndef TRIX_DMA2 -#define TRIX_DMA2 1 -#endif - -#ifndef GUS_BASE -#define GUS_BASE 0x220 -#endif - -#ifndef GUS_IRQ -#define GUS_IRQ 12 -#endif - -#ifndef GUS_MIDI_IRQ -#define GUS_MIDI_IRQ GUS_IRQ -#endif - -#ifndef GUS_DMA -#define GUS_DMA 4 -#endif - -#ifndef GUS_DMA2 -#define GUS_DMA2 4 -#endif - -#define SOUND_CONFIG_DATE "Wed Aug 6 22:58:35 PDT 1997" -#define SOUND_CONFIG_BY "Amancio Hasty" -#define SOUND_CONFIG_HOST "rah" -#define SOUND_CONFIG_DOMAIN "star-gate.com" - -#else /* NSND = 0 */ -#undef CONFIGURE_SOUNDCARD -#endif diff --git a/sys/i386/isa/sound/mad16.c b/sys/i386/isa/sound/mad16.c deleted file mode 100644 index 0e2064a..0000000 --- a/sys/i386/isa/sound/mad16.c +++ /dev/null @@ -1,524 +0,0 @@ -/* - * sound/mad16.c - * - * Initialization code for OPTi MAD16 compatible audio chips. Including - * - * OPTi 82C928 MAD16 (replaced by C929) OAK OTI-601D Mozart - * OPTi 82C929 MAD16 Pro - * - * These audio interface chips don't prduce sound themselves. They just connect - * some other components (OPL-[234] and a WSS compatible codec) to the PC bus - * and perform I/O, DMA and IRQ address decoding. There is also a UART for - * the MPU-401 mode (not 82C928/Mozart). The Mozart chip appears to be - * compatible with the 82C928 (can anybody confirm this?). - * - * NOTE! If you want to set CD-ROM address and/or joystick enable, define - * MAD16_CONF in local.h as combination of the following bits: - * - * 0x01 - joystick disabled - * - * CD-ROM type selection (select just one): 0x00 - none 0x02 - Sony 31A - * 0x04 - Mitsumi 0x06 - Panasonic (type "LaserMate", not - * "SoundBlaster") 0x08 - Secondary IDE (address 0x170) 0x0a - Primary - * IDE (address 0x1F0) - * - * For example Mitsumi with joystick disabled = 0x04|0x01 = 0x05 For example - * LaserMate (for use with sbpcd) plus joystick = 0x06 - * - * MAD16_CDSEL: This defaults to CD I/O 0x340, no IRQ and DMA3 (DMA5 with - * Mitsumi or IDE). If you like to change these, define MAD16_CDSEL with the - * following bits: - * - * CD-ROM port: 0x00=340, 0x40=330, 0x80=360 or 0xc0=320 OPL4 select: 0x20=OPL4, - * 0x00=OPL3 CD-ROM irq: 0x00=disabled, 0x04=IRQ5, 0x08=IRQ7, 0x0a=IRQ3, - * 0x10=IRQ9, 0x14=IRQ10 and 0x18=IRQ11. - * - * CD-ROM DMA (Sony or Panasonic): 0x00=DMA3, 0x01=DMA2, 0x02=DMA1 or - * 0x03=disabled or CD-ROM DMA (Mitsumi or IDE): 0x00=DMA5, 0x01=DMA6, - * 0x02=DMA7 or 0x03=disabled - * - * For use with sbpcd, address 0x340, set MAD16_CDSEL to 0x03 or 0x23. - * - * 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 - -#if defined(CONFIG_MAD16) - -static int already_initialized = 0; - -#define C928 1 -#define MOZART 2 -#define C929 3 - -/* - * Registers - * - * The MAD16 occupies I/O ports 0xf8d to 0xf93 (fixed locations). All ports are - * inactive by default. They can be activated by writing 0xE2 or 0xE3 to the - * password register. The password is valid only until the next I/O read or - * write. - */ - -#define MC1_PORT 0xf8d /* SB address, CDROM interface type, joystick */ -#define MC2_PORT 0xf8e /* CDROM address, IRQ, DMA, plus OPL4 bit */ -#define MC3_PORT 0xf8f -#define PASSWD_REG 0xf8f -#define MC4_PORT 0xf90 -#define MC5_PORT 0xf91 -#define MC6_PORT 0xf92 -#define MC7_PORT 0xf93 - -static int board_type = C928; - -static sound_os_info *mad16_osp; - -#ifndef DDB -#define DDB(x) -#endif - -static unsigned char -mad_read(int port) -{ - unsigned long flags; - unsigned char tmp; - - flags = splhigh(); - - switch (board_type) { /* Output password */ - case C928: - case MOZART: - outb(PASSWD_REG, 0xE2); - break; - - case C929: - outb(PASSWD_REG, 0xE3); - break; - } - - tmp = inb(port); - splx(flags); - - return tmp; -} - -static void -mad_write(int port, int value) -{ - unsigned long flags; - - flags = splhigh(); - - switch (board_type) { /* Output password */ - case C928: - case MOZART: - outb(PASSWD_REG, 0xE2); - break; - - case C929: - outb(PASSWD_REG, 0xE3); - break; - } - - outb(port, (unsigned char) (value & 0xff)); - splx(flags); -} - -static int -detect_mad16(void) -{ - unsigned char tmp, tmp2; - - /* - * Check that reading a register doesn't return bus float (0xff) when - * the card is accessed using password. This may fail in case the - * card is in low power mode. Normally at least the power saving mode - * bit should be 0. - */ - if ((tmp = mad_read(MC1_PORT)) == 0xff) { - DDB(printf("MC1_PORT returned 0xff\n")); - return 0; - } - /* - * Now check that the gate is closed on first I/O after writing the - * password. (This is how a MAD16 compatible card works). - */ - - if ((tmp2 = inb(MC1_PORT)) == tmp) { /* It didn't close */ - DDB(printf("MC1_PORT didn't close after read (0x%02x)\n", tmp2)); - return 0; - } - mad_write(MC1_PORT, tmp ^ 0x80); /* Togge a bit */ - - if ((tmp2 = mad_read(MC1_PORT)) != (tmp ^ 0x80)) { /* Compare the bit */ - mad_write(MC1_PORT, tmp); /* Restore */ - DDB(printf("Bit revert test failed (0x%02x, 0x%02x)\n", tmp, tmp2)); - return 0; - } - mad_write(MC1_PORT, tmp); /* Restore */ - return 1; /* Bingo */ - -} - -int -probe_mad16(struct address_info * hw_config) -{ - int i; - static int valid_ports[] = - {0x530, 0xe80, 0xf40, 0x604}; - unsigned char tmp; - unsigned char cs4231_mode = 0; - - int ad_flags = 0; - - if (already_initialized) - return 0; - - mad16_osp = hw_config->osp; - /* - * Check that all ports return 0xff (bus float) when no password is - * written to the password register. - */ - - DDB(printf("--- Detecting MAD16 / Mozart ---\n")); - - - /* - * Then try to detect with the old password - */ - board_type = C928; - - DDB(printf("Detect using password = 0xE2\n")); - - if (!detect_mad16()) { /* No luck. Try different model */ - board_type = C929; - - DDB(printf("Detect using password = 0xE3\n")); - - if (!detect_mad16()) - return 0; - - DDB(printf("mad16.c: 82C929 detected\n")); - } else { - unsigned char model; - - if (((model = mad_read(MC3_PORT)) & 0x03) == 0x03) { - DDB(printf("mad16.c: Mozart detected\n")); - board_type = MOZART; - } else { - DDB(printf("mad16.c: 82C928 detected???\n")); - board_type = C928; - } - } - - for (i = 0xf8d; i <= 0xf93; i++) - DDB(printf("port %03x = %03x\n", i, mad_read(i))); - - /* - * Set the WSS address - */ - - tmp = 0x80; /* Enable WSS, Disable SB */ - - for (i = 0; i < 5; i++) { - if (i > 3) { /* Not a valid port */ - printf("MAD16/Mozart: Bad WSS base address 0x%x\n", hw_config->io_base); - return 0; - } - if (valid_ports[i] == hw_config->io_base) { - tmp |= i << 4; /* WSS port select bits */ - break; - } - } - - /* - * Set optional CD-ROM and joystick settings. - */ - -#ifdef MAD16_CONF - tmp |= ((MAD16_CONF) & 0x0f); /* CD-ROM and joystick bits */ -#endif - mad_write(MC1_PORT, tmp); - -#if defined(MAD16_CONF) && defined(MAD16_CDSEL) - tmp = MAD16_CDSEL; -#else - tmp = 0x03; -#endif - -#ifdef MAD16_OPL4 - tmp |= 0x20; /* Enable OPL4 access */ -#endif - - mad_write(MC2_PORT, tmp); - mad_write(MC3_PORT, 0xf0); /* Disable SB */ - - if (!ad1848_detect(hw_config->io_base + 4, &ad_flags, mad16_osp)) - return 0; - - if (ad_flags & (AD_F_CS4231 | AD_F_CS4248)) - cs4231_mode = 0x02; /* CS4248/CS4231 sync delay switch */ - - if (board_type == C929) { - mad_write(MC4_PORT, 0xa2); - mad_write(MC5_PORT, 0xA5 | cs4231_mode); - mad_write(MC6_PORT, 0x03); /* Disable MPU401 */ - } else { - mad_write(MC4_PORT, 0x02); - mad_write(MC5_PORT, 0x30 | cs4231_mode); - } - - for (i = 0xf8d; i <= 0xf93; i++) - DDB(printf("port %03x after init = %03x\n", i, mad_read(i))); - - /* - * Verify the WSS parameters - */ - - if (0) { - printf("MSS: I/O port conflict\n"); - 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 ((inb(hw_config->io_base + 3) & 0x3f) != 0x04 && - (inb(hw_config->io_base + 3) & 0x3f) != 0x00) { - DDB(printf("No MSS signature detected on port 0x%x (0x%x)\n", - hw_config->io_base, inb(hw_config->io_base + 3))); - return 0; - } - if (hw_config->irq > 11) { - printf("MSS: Bad IRQ %d\n", hw_config->irq); - return 0; - } - if (hw_config->dma != 0 && hw_config->dma != 1 && hw_config->dma != 3) { - printf("MSS: Bad DMA %d\n", hw_config->dma); - 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) { - printf("MSS: Can't use DMA0 with a 8 bit card/slot\n"); - return 0; - } - if (hw_config->irq > 7 && hw_config->irq != 9 && inb(hw_config->io_base + 3) & 0x80) { - printf("MSS: Can't use IRQ%d with a 8 bit card/slot\n", hw_config->irq); - return 0; - } - return 1; -} - -void -attach_mad16(struct address_info * hw_config) -{ - - static char interrupt_bits[12] = - { - -1, -1, -1, -1, -1, -1, -1, 0x08, -1, 0x10, 0x18, 0x20 - }; - char bits; - - static char dma_bits[4] = - { - 1, 2, 0, 3 - }; - - int config_port = hw_config->io_base + 0, version_port = hw_config->io_base + 3; - int ad_flags = 0, dma = hw_config->dma, dma2 = hw_config->dma2; - unsigned char dma2_bit = 0; - - already_initialized = 1; - - if (!ad1848_detect(hw_config->io_base + 4, &ad_flags, mad16_osp)) - return; - - /* - * Set the IRQ and DMA addresses. - */ - - bits = interrupt_bits[hw_config->irq]; - if (bits == -1) - return; - - outb(config_port, bits | 0x40); - if ((inb(version_port) & 0x40) == 0) - printf("[IRQ Conflict?]"); - - /* - * Handle the capture DMA channel - */ - - if (ad_flags & AD_F_CS4231 && dma2 != -1 && dma2 != dma) { - if ((dma == 0 && dma2 == 1) || - (dma == 1 && dma2 == 0) || - (dma == 3 && dma2 == 0)) { - dma2_bit = 0x04; /* Enable capture DMA */ - } else { - printf("MAD16: Invalid capture DMA\n"); - dma2 = dma; - } - } else - dma2 = dma; - - outb(config_port, bits | dma_bits[dma] | dma2_bit); /* Write IRQ+DMA setup */ - - ad1848_init("MAD16 WSS", hw_config->io_base + 4, - hw_config->irq, - dma, - dma2, 0, - hw_config->osp); -} - -void -attach_mad16_mpu(struct address_info * hw_config) -{ - if (board_type < C929) {/* Early chip. No MPU support. Just SB MIDI */ -#ifdef CONFIG_MIDI - - if (mad_read(MC1_PORT) & 0x20) - hw_config->io_base = 0x240; - else - hw_config->io_base = 0x220; - - return mad16_sb_dsp_init(hw_config); -#else - return 0; -#endif - } -#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) - if (!already_initialized) - return; - - attach_mpu401(hw_config); -#endif -} - -int -probe_mad16_mpu(struct address_info * hw_config) -{ -#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) - static int mpu_attached = 0; - static int valid_ports[] = - {0x330, 0x320, 0x310, 0x300}; - static short valid_irqs[] = - {9, 10, 5, 7}; - unsigned char tmp; - - int i; /* A variable with secret power */ - - if (!already_initialized) /* The MSS port must be initialized - * first */ - return 0; - - if (mpu_attached) /* Don't let them call this twice */ - return 0; - mpu_attached = 1; - - if (board_type < C929) {/* Early chip. No MPU support. Just SB MIDI */ - -#ifdef CONFIG_MIDI - unsigned char tmp; - - tmp = mad_read(MC3_PORT); - - /* - * MAD16 SB base is defined by the WSS base. It cannot be - * changed alone. Ignore configured I/O base. Use the active - * setting. - */ - - if (mad_read(MC1_PORT) & 0x20) - hw_config->io_base = 0x240; - else - hw_config->io_base = 0x220; - - switch (hw_config->irq) { - case 5: - tmp = (tmp & 0x3f) | 0x80; - break; - case 7: - tmp = (tmp & 0x3f); - break; - case 11: - tmp = (tmp & 0x3f) | 0x40; - break; - default: - printf("mad16/Mozart: Invalid MIDI IRQ\n"); - return 0; - } - - mad_write(MC3_PORT, tmp | 0x04); - return mad16_sb_dsp_detect(hw_config); -#else - return 0; -#endif - } - tmp = 0x83; /* MPU-401 enable */ - - /* - * Set the MPU base bits - */ - - for (i = 0; i < 5; i++) { - if (i > 3) { /* Out of array bounds */ - printf("MAD16 / Mozart: Invalid MIDI port 0x%x\n", hw_config->io_base); - return 0; - } - if (valid_ports[i] == hw_config->io_base) { - tmp |= i << 5; - break; - } - } - - /* - * Set the MPU IRQ bits - */ - - for (i = 0; i < 5; i++) { - if (i > 3) { /* Out of array bounds */ - printf("MAD16 / Mozart: Invalid MIDI IRQ %d\n", hw_config->irq); - return 0; - } - if (valid_irqs[i] == hw_config->irq) { - tmp |= i << 3; - break; - } - } - mad_write(MC6_PORT, tmp); /* Write MPU401 config */ - - return probe_mpu401(hw_config); -#else - return 0; -#endif -} - -/* That's all folks */ -#endif diff --git a/sys/i386/isa/sound/mad16.h b/sys/i386/isa/sound/mad16.h deleted file mode 100644 index 0370973..0000000 --- a/sys/i386/isa/sound/mad16.h +++ /dev/null @@ -1,91 +0,0 @@ - -/* - * Initialization code for OPTI MAD16 interface chip by - * Davor Jadrijevic - * (Included by ad1848.c when MAD16 support is enabled) - * - * It looks like MAD16 is similar than the Mozart chip (OAK OTI-601). - * It could be even possible that these chips are exactly the same. Can - * anybody confirm this? - */ - -static void wr_a_mad16(int base, int v, int a) -{ - OUTB(a, base + 0xf); - OUTB(v, base + 0x11); -} - -static void wr_b_mad16(int base, int v, int a) -{ - OUTB(a, base + 0xf); - OUTB(v, base + 0xd); -} - -/* -static int rd_a_mad16(int base, int a) -{ - OUTB(a, base + 0xf); - return INB(base + 0x11); -} -*/ - -static int rd_b_mad16(int base, int a) -{ - OUTB(a, base + 0xf); - return INB(base + 0xd); -} - -/* -static int rd_0_mad16(int base, int a) -{ - OUTB(a, base + 0xf); - return INB(base + 0xf); -} - -static void wr_ad(int base, int v, int a) -{ - OUTB(a, base + 4); - OUTB(v, base + 5); -} - -static int rd_ad(int base, int a) -{ - OUTB(a, base + 4); - return INB(base + 5); -} -*/ - -static int mad16init(int adr) -{ - int j; - long i; - - static int ad1848_bases[] = -{ 0x220, -1, -1, 0x240, -1, -1, -1, -1, 0x530, 0xE80, 0xF40, 0x604, 0 }; - - int mad16_base = 0xf80, ad1848_base; - - - for(j = 0; (j < 16) && (ad1848_bases[j] != 0); j++) - if(adr == ad1848_bases[j]) - break; - - if( (ad1848_base = ad1848_bases[j]) < 0x530) - { - printk("Unknown MAD16 setting 0x%3X\n", adr); - return -1; - } - - /* printk("OPTi MAD16 WSS at 0x%3X\n", ad1848_base); */ - - rd_b_mad16(mad16_base, 0xe2); - wr_a_mad16(mad16_base, 0x1a, 0xe2); - wr_b_mad16(mad16_base, j * 16 + 1, 0xe2); - wr_a_mad16(mad16_base, 0x1a, 0xe2); - for( i = 0; i < 10000; i++) - if( (INB(ad1848_base+4) & 0x80) == 0 ) - break; - - return 0; -}; - diff --git a/sys/i386/isa/sound/mad16_sb_midi.c b/sys/i386/isa/sound/mad16_sb_midi.c deleted file mode 100644 index d1b3ad0..0000000 --- a/sys/i386/isa/sound/mad16_sb_midi.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - * sound/mad16_sb_midi.c - * - * The low level driver for MAD16 SoundBlaster-DS-chip-based MIDI. - * - * Copyright by Hannu Savolainen 1993, Aaron Ucko 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 - -#if defined(CONFIG_MAD16) && defined(CONFIG_MIDI) - -#define sbc_base mad16_sb_base -#include - -static int input_opened = 0; -static int my_dev; -static int mad16_sb_base = 0x220; -static int mad16_sb_irq = 0; -static int mad16_sb_dsp_ok = 0; -static sound_os_info *midi_osp; - -int mad16_sb_midi_mode = NORMAL_MIDI; -int mad16_sb_midi_busy = 0; - -int mad16_sb_duplex_midi = 0; -volatile int mad16_sb_intr_active = 0; - -void (*midi_input_intr) (int dev, unsigned char data); - -static void mad16_sb_midi_init(int model); - -static int -mad16_sb_dsp_command(unsigned 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 - * mad16_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; - } - } - - printf("MAD16 (SBP mode): DSP Command(%x) Timeout.\n", val); - printf("IRQ conflict???\n"); - return 0; -} - -void -mad16_sbintr(int irq) -{ - int status; - - unsigned long flags; - unsigned char data; - - status = inb(DSP_DATA_AVAIL); /* Clear interrupt */ - - flags = splhigh(); - - data = inb(DSP_READ); - if (input_opened) - midi_input_intr(my_dev, data); - - splx(flags); -} - -static int -mad16_sb_reset_dsp(void) -{ - int loopc; - - outb(DSP_RESET, 1); - DELAY(10); - outb(DSP_RESET, 0); - DELAY(30); - - for (loopc = 0; loopc < 100 && !(inb(DSP_DATA_AVAIL) & 0x80); loopc++) - DELAY(10); - /* Wait for data available status */ - - if (inb(DSP_READ) != 0xAA) - return 0; /* Sorry */ - - return 1; -} - -int -mad16_sb_dsp_detect(struct address_info * hw_config) -{ - mad16_sb_base = hw_config->io_base; - mad16_sb_irq = hw_config->irq; - midi_osp = hw_config->osp; - - if (mad16_sb_dsp_ok) - return 0; /* Already initialized */ - if (!mad16_sb_reset_dsp()) - return 0; - - return 1; /* Detected */ -} - -void -mad16_sb_dsp_init(struct address_info * hw_config) -/* - * this function now just verifies the reported version and calls - * mad16_sb_midi_init -- everything else is done elsewhere - */ -{ - - midi_osp = hw_config->osp; - if (snd_set_irq_handler(mad16_sb_irq, mad16_sbintr, midi_osp) < 0) { - printf("MAD16 SB MIDI: IRQ not free\n"); - return; - } - - conf_printf("MAD16 MIDI (SB mode)", hw_config); - mad16_sb_midi_init(2); - - mad16_sb_dsp_ok = 1; - return; -} - -static int -mad16_sb_midi_open(int dev, int mode, - void (*input) (int dev, unsigned char data), - void (*output) (int dev) -) -{ - - if (!mad16_sb_dsp_ok) { - printf("MAD16_SB Error: MIDI hardware not installed\n"); - return -(ENXIO); - } - if (mad16_sb_midi_busy) - return -(EBUSY); - - if (mode != OPEN_WRITE && !mad16_sb_duplex_midi) { - if (num_midis == 1) - printf("MAD16 (SBP mode): Midi input not currently supported\n"); - return -(EPERM); - } - mad16_sb_midi_mode = NORMAL_MIDI; - if (mode != OPEN_WRITE) { - if (mad16_sb_intr_active) - return -(EBUSY); - mad16_sb_midi_mode = UART_MIDI; - } - if (mad16_sb_midi_mode == UART_MIDI) { - mad16_sb_reset_dsp(); - - if (!mad16_sb_dsp_command(0x35)) - return -(EIO); /* Enter the UART mode */ - mad16_sb_intr_active = 1; - - input_opened = 1; - midi_input_intr = input; - } - mad16_sb_midi_busy = 1; - - return 0; -} - -static void -mad16_sb_midi_close(int dev) -{ - if (mad16_sb_midi_mode == UART_MIDI) { - mad16_sb_reset_dsp(); /* The only way to kill the UART mode */ - } - mad16_sb_intr_active = 0; - mad16_sb_midi_busy = 0; - input_opened = 0; -} - -static int -mad16_sb_midi_out(int dev, unsigned char midi_byte) -{ - unsigned long flags; - - if (mad16_sb_midi_mode == NORMAL_MIDI) { - flags = splhigh(); - if (mad16_sb_dsp_command(0x38)) - mad16_sb_dsp_command(midi_byte); - else - printf("MAD16_SB Error: Unable to send a MIDI byte\n"); - splx(flags); - } else - mad16_sb_dsp_command(midi_byte); /* UART write */ - - return 1; -} - -static int -mad16_sb_midi_start_read(int dev) -{ - if (mad16_sb_midi_mode != UART_MIDI) { - printf("MAD16 (SBP mode): MIDI input not implemented.\n"); - return -(EPERM); - } - return 0; -} - -static int -mad16_sb_midi_end_read(int dev) -{ - if (mad16_sb_midi_mode == UART_MIDI) { - mad16_sb_reset_dsp(); - mad16_sb_intr_active = 0; - } - return 0; -} - -static int -mad16_sb_midi_ioctl(int dev, unsigned cmd, ioctl_arg arg) -{ - return -(EPERM); -} - -#define MIDI_SYNTH_NAME "pseudo-SoundBlaster Midi" -#define MIDI_SYNTH_CAPS 0 -#include - -static struct midi_operations mad16_sb_midi_operations = -{ - {"MAD16 (SBP mode)", 0, 0, SNDCARD_MAD16}, - &std_midi_synth, - {0}, - mad16_sb_midi_open, - mad16_sb_midi_close, - mad16_sb_midi_ioctl, - mad16_sb_midi_out, - mad16_sb_midi_start_read, - mad16_sb_midi_end_read, - NULL, /* Kick */ - NULL, /* command */ - NULL, /* buffer_status */ - NULL -}; - -static void -mad16_sb_midi_init(int model) -{ - 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++] = &mad16_sb_midi_operations; -} - -#endif diff --git a/sys/i386/isa/sound/maui.c b/sys/i386/isa/sound/maui.c deleted file mode 100644 index e92b48a..0000000 --- a/sys/i386/isa/sound/maui.c +++ /dev/null @@ -1,225 +0,0 @@ -/* - * sound/maui.c - * - * The low level driver for Turtle Beach Maui and Tropez. - * - * 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. - * - */ - -#define USE_SEQ_MACROS -#define USE_SIMPLE_MACROS - -#include - - -#if defined(CONFIG_MAUI) - -static int maui_base = 0x330; - -static volatile int irq_ok = 0; -static sound_os_info *maui_osp; - -#define HOST_DATA_PORT (maui_base + 2) -#define HOST_STAT_PORT (maui_base + 3) -#define HOST_CTRL_PORT (maui_base + 3) - -#define STAT_TX_INTR 0x40 -#define STAT_TX_AVAIL 0x20 -#define STAT_TX_IENA 0x10 -#define STAT_RX_INTR 0x04 -#define STAT_RX_AVAIL 0x02 -#define STAT_RX_IENA 0x01 - -static int (*orig_load_patch) (int dev, int format, snd_rw_buf * addr, - int offs, int count, int pmgr_flag) = NULL; - -static int -maui_read(void) -{ - int timeout; - - for (timeout = 0; timeout < 1000000; timeout++) - if (inb(HOST_STAT_PORT) & STAT_RX_AVAIL) - return inb(HOST_DATA_PORT); - - printf("Maui: Receive timeout\n"); - - return -1; -} - -static int -maui_write(u_char data) -{ - int timeout; - - for (timeout = 0; timeout < 10000000; timeout++) { - if (inb(HOST_STAT_PORT) & STAT_TX_AVAIL) { - outb(HOST_DATA_PORT, data); - return 1; - } - } - - printf("Maui: Write timeout\n"); - - return 0; -} - -void -mauiintr(int irq) -{ - irq_ok = 1; -} - - -int -maui_load_patch(int dev, int format, snd_rw_buf * addr, - int offs, int count, int pmgr_flag) -{ - - struct sysex_info header; - u_long left, src_offs; - int hdr_size = (u_long) &header.data[0] - (u_long) &header; - int i; - - if (format == SYSEX_PATCH) /* Handled by midi_synth.c */ - return orig_load_patch(dev, format, addr, offs, count, pmgr_flag); - - if (format != MAUI_PATCH) { - printf("Maui: Unknown patch format\n"); - } - if (count < hdr_size) { - printf("Maui error: Patch header too short\n"); - return -(EINVAL); - } - count -= hdr_size; - - /* - * Copy the header from user space but ignore the first bytes which - * have been transferred already. - */ - - if (uiomove(&((char *) &header)[offs], hdr_size - offs, addr)) { - printf("sb: Bad copyin()!\n"); - }; - - if (count < header.len) { - printf("Maui warning: Host command record too short (%d<%d)\n", - count, (int) header.len); - header.len = count; - } - left = header.len; - src_offs = 0; - - for (i = 0; i < left; i++) { - u_char data; - uiomove((char *) &(data), 1, addr); - if (i == 0 && !(data & 0x80)) - return -(EINVAL); - - if (maui_write(data) == -1) - return -(EIO); - } - - if ((i = maui_read()) != 0x80) { - if (i != -1) - printf("Maui: Error status %02x\n", i); - - return -(EIO); - } - return 0; -} - -int -probe_maui(struct address_info * hw_config) -{ - int i; - int tmp1, tmp2; - - maui_base = hw_config->io_base; - maui_osp = hw_config->osp; - - if (snd_set_irq_handler(hw_config->irq, mauiintr, maui_osp) < 0) - return 0; - - if (!maui_write(0xCF)) {/* Report hardware version */ - /* snd_release_irq(hw_config->irq); */ - return 0; - } - if ((tmp1 = maui_read()) == -1 || (tmp2 = maui_read()) == -1) { - /* snd_release_irq(hw_config->irq); */ - return 0; - } - printf("WaveFront hardware version %d.%d\n", tmp1, tmp2); - - if (!maui_write(0x9F)) /* Report firmware version */ - return 0; - if ((tmp1 = maui_read()) == -1 || (tmp2 = maui_read()) == -1) - return 0; - printf("WaveFront firmware version %d.%d\n", tmp1, tmp2); - - if (!maui_write(0x85)) /* Report free DRAM */ - return 0; - tmp1 = 0; - for (i = 0; i < 4; i++) { - tmp1 |= maui_read() << (7 * i); - } - printf("Available DRAM %dk\n", tmp1 / 1024); - - for (i = 0; i < 1000; i++) - if (probe_mpu401(hw_config)) - break; - - return probe_mpu401(hw_config); -} - -void -attach_maui(struct address_info * hw_config) -{ - int this_dev = num_midis; - - conf_printf("Maui", hw_config); - - hw_config->irq *= -1; - attach_mpu401(hw_config); - - if (num_midis > this_dev) { /* The MPU401 driver installed itself */ - struct synth_operations *synth; - - /* - * Intercept patch loading calls so that they canbe handled - * by the Maui driver. - */ - - synth = midi_devs[this_dev]->converter; - - if (synth != NULL) { - orig_load_patch = synth->load_patch; - synth->load_patch = &maui_load_patch; - } else - printf("Maui: Can't install patch loader\n"); - } - return; -} - -#endif diff --git a/sys/i386/isa/sound/midi_ctrl.h b/sys/i386/isa/sound/midi_ctrl.h deleted file mode 100644 index 8b68c7d..0000000 --- a/sys/i386/isa/sound/midi_ctrl.h +++ /dev/null @@ -1,22 +0,0 @@ -static unsigned char ctrl_def_values[128] = -{ - 0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40, /* 0 to 7 */ - 0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40, /* 8 to 15 */ - 0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40, /* 16 to 23 */ - 0x40,0x40,0x40,0x40, 0x40,0x40,0x40,0x40, /* 24 to 31 */ - - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 32 to 39 */ - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 40 to 47 */ - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 48 to 55 */ - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 56 to 63 */ - - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 64 to 71 */ - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 72 to 79 */ - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 80 to 87 */ - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 88 to 95 */ - - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 96 to 103 */ - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 104 to 111 */ - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 112 to 119 */ - 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00, /* 120 to 127 */ -}; diff --git a/sys/i386/isa/sound/midi_synth.c b/sys/i386/isa/sound/midi_synth.c deleted file mode 100644 index e63b24a..0000000 --- a/sys/i386/isa/sound/midi_synth.c +++ /dev/null @@ -1,675 +0,0 @@ -/* - * sound/midi_synth.c - * - * High level midi sequencer manager for dumb MIDI interfaces. - * - * 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. - * - */ - -#define USE_SEQ_MACROS -#define USE_SIMPLE_MACROS - -#include - -#include - -#if defined(CONFIGURE_SOUNDCARD) /* && defined(CONFIG_MIDI) */ - -#define _MIDI_SYNTH_C_ - -static int *sysex_sleeper = NULL; -static volatile struct snd_wait sysex_sleep_flag = {0}; - -#include - -static int midi2synth[MAX_MIDI_DEV]; -static int sysex_state[MAX_MIDI_DEV] = -{0}; -static unsigned char prev_out_status[MAX_MIDI_DEV]; - -#ifndef CONFIG_SEQUENCER -#define STORE(cmd) -#else -#define STORE(cmd) { \ - int len; \ - unsigned char obuf[8]; \ - cmd; \ - seq_input_event(obuf, len); \ -} -#endif - -#define _seqbuf obuf -#define _seqbufptr 0 -#define _SEQ_ADVBUF(x) len=x - -void -do_midi_msg(int synthno, unsigned char *msg, int mlen) -{ - switch (msg[0] & 0xf0) { - case 0x90: - if (msg[2] != 0) { - STORE(SEQ_START_NOTE(synthno, msg[0] & 0x0f, msg[1], msg[2])); - break; - } - msg[2] = 64; - - case 0x80: - STORE(SEQ_STOP_NOTE(synthno, msg[0] & 0x0f, msg[1], msg[2])); - break; - - case 0xA0: - STORE(SEQ_KEY_PRESSURE(synthno, msg[0] & 0x0f, msg[1], msg[2])); - break; - - case 0xB0: - STORE(SEQ_CONTROL(synthno, msg[0] & 0x0f, msg[1], msg[2])); - break; - - case 0xC0: - STORE(SEQ_SET_PATCH(synthno, msg[0] & 0x0f, msg[1])); - break; - - case 0xD0: - STORE(SEQ_CHN_PRESSURE(synthno, msg[0] & 0x0f, msg[1])); - break; - - case 0xE0: - STORE(SEQ_BENDER(synthno, msg[0] & 0x0f, - (msg[1] % 0x7f) | ((msg[2] & 0x7f) << 7))); - break; - - default: - /* - * printf ("MPU: Unknown midi channel message %02x\n", - * msg[0]); - */ - ; - } -} - -static void -midi_outc(int midi_dev, int data) -{ - int timeout; - - for (timeout = 0; timeout < 32000; timeout++) - if (midi_devs[midi_dev]->putc(midi_dev, (unsigned char) (data & 0xff))) { - if (data & 0x80) /* Status byte */ - prev_out_status[midi_dev] = - (unsigned char) (data & 0xff); /* Store for running - * status */ - return; /* Mission complete */ - } - /* - * Sorry! No space on buffers. - */ - printf("Midi send timed out\n"); -} - -static int -prefix_cmd(int midi_dev, unsigned char status) -{ - if ((char *) midi_devs[midi_dev]->prefix_cmd == NULL) - return 1; - - return midi_devs[midi_dev]->prefix_cmd(midi_dev, status); -} - -static void -midi_synth_input(int orig_dev, unsigned char data) -{ - int dev; - struct midi_input_info *inc; - - static unsigned char len_tab[] = /* # of data bytes following a status */ - { - 2, /* 8x */ - 2, /* 9x */ - 2, /* Ax */ - 2, /* Bx */ - 1, /* Cx */ - 1, /* Dx */ - 2, /* Ex */ - 0 /* Fx */ - }; - - if (orig_dev < 0 || orig_dev > num_midis) - return; - - if (data == 0xfe) /* Ignore active sensing */ - return; - - dev = midi2synth[orig_dev]; - inc = &midi_devs[orig_dev]->in_info; - - switch (inc->m_state) { - case MST_INIT: - if (data & 0x80) { /* MIDI status byte */ - if ((data & 0xf0) == 0xf0) { /* Common message */ - switch (data) { - case 0xf0: /* Sysex */ - inc->m_state = MST_SYSEX; - break; /* Sysex */ - - case 0xf1: /* MTC quarter frame */ - case 0xf3: /* Song select */ - inc->m_state = MST_DATA; - inc->m_ptr = 1; - inc->m_left = 1; - inc->m_buf[0] = data; - break; - - case 0xf2: /* Song position pointer */ - inc->m_state = MST_DATA; - inc->m_ptr = 1; - inc->m_left = 2; - inc->m_buf[0] = data; - break; - - default: - inc->m_buf[0] = data; - inc->m_ptr = 1; - do_midi_msg(dev, inc->m_buf, inc->m_ptr); - inc->m_ptr = 0; - inc->m_left = 0; - } - } else { - inc->m_state = MST_DATA; - inc->m_ptr = 1; - inc->m_left = len_tab[(data >> 4) - 8]; - inc->m_buf[0] = inc->m_prev_status = data; - } - } else if (inc->m_prev_status & 0x80) { /* Ignore if no previous - * status (yet) *//* Data byte (use running status) */ - inc->m_state = MST_DATA; - inc->m_ptr = 2; - inc->m_left = len_tab[(data >> 4) - 8] - 1; - inc->m_buf[0] = inc->m_prev_status; - inc->m_buf[1] = data; - } - break; /* MST_INIT */ - - case MST_DATA: - inc->m_buf[inc->m_ptr++] = data; - if (--inc->m_left <= 0) { - inc->m_state = MST_INIT; - do_midi_msg(dev, inc->m_buf, inc->m_ptr); - inc->m_ptr = 0; - } - break; /* MST_DATA */ - - case MST_SYSEX: - if (data == 0xf7) { /* Sysex end */ - inc->m_state = MST_INIT; - inc->m_left = 0; - inc->m_ptr = 0; - } - break; /* MST_SYSEX */ - - default: - printf("MIDI%d: Unexpected state %d (%02x)\n", orig_dev, inc->m_state, - (int) data); - inc->m_state = MST_INIT; - } -} - -static void -leave_sysex(int dev) -{ - int orig_dev = synth_devs[dev]->midi_dev; - int timeout = 0; - - if (!sysex_state[dev]) - return; - - sysex_state[dev] = 0; - - while (!midi_devs[orig_dev]->putc(orig_dev, 0xf7) && timeout < 1000) - timeout++; - - sysex_state[dev] = 0; -} - -static void -midi_synth_output(int dev) -{ - /* - * Currently NOP - */ -} - -int -midi_synth_ioctl(int dev, unsigned int cmd, ioctl_arg arg) -{ - /* - * int orig_dev = synth_devs[dev]->midi_dev; - */ - - switch (cmd) { - - case SNDCTL_SYNTH_INFO: - bcopy(synth_devs[dev]->info, &(((char *) arg)[0]), sizeof(struct synth_info)); - return 0; - break; - - case SNDCTL_SYNTH_MEMAVL: - return 0x7fffffff; - break; - - default: - return -(EINVAL); - } -} - -int -midi_synth_kill_note(int dev, int channel, int note, int velocity) -{ - int orig_dev = synth_devs[dev]->midi_dev; - int msg, chn; - - if (note < 0 || note > 127) - return 0; - if (channel < 0 || channel > 15) - return 0; - RANGE (velocity, 0, 127 ) ; - leave_sysex(dev); - - msg = prev_out_status[orig_dev] & 0xf0; - chn = prev_out_status[orig_dev] & 0x0f; - - if (chn == channel && ((msg == 0x90 && velocity == 64) || msg == 0x80)) { /* Use running status */ - if (!prefix_cmd(orig_dev, note)) - return 0; - - midi_outc(orig_dev, note); - - if (msg == 0x90)/* Running status = Note on */ - midi_outc(orig_dev, 0); /* Note on with velocity 0 == note off */ - else - midi_outc(orig_dev, velocity); - } else { - if (velocity == 64) { - if (!prefix_cmd(orig_dev, 0x90 | (channel & 0x0f))) - return 0; - midi_outc(orig_dev, 0x90 | (channel & 0x0f)); /* Note on */ - midi_outc(orig_dev, note); - midi_outc(orig_dev, 0); /* Zero G */ - } else { - if (!prefix_cmd(orig_dev, 0x80 | (channel & 0x0f))) - return 0; - midi_outc(orig_dev, 0x80 | (channel & 0x0f)); /* Note off */ - midi_outc(orig_dev, note); - midi_outc(orig_dev, velocity); - } - } - - return 0; -} - -int -midi_synth_set_instr(int dev, int channel, int instr_no) -{ - int orig_dev = synth_devs[dev]->midi_dev; - - if (instr_no < 0 || instr_no > 127) - return 0; - if (channel < 0 || channel > 15) - return 0; - - leave_sysex(dev); - - if (!prefix_cmd(orig_dev, 0xc0 | (channel & 0x0f))) - return 0; - midi_outc(orig_dev, 0xc0 | (channel & 0x0f)); /* Program change */ - midi_outc(orig_dev, instr_no); - - return 0; -} - -int -midi_synth_start_note(int dev, int channel, int note, int velocity) -{ - int orig_dev = synth_devs[dev]->midi_dev; - int msg, chn; - - if (note < 0 || note > 127) - return 0; - if (channel < 0 || channel > 15) - return 0; - RANGE (velocity, 0, 127 ); - leave_sysex(dev); - - msg = prev_out_status[orig_dev] & 0xf0; - chn = prev_out_status[orig_dev] & 0x0f; - - if (chn == channel && msg == 0x90) { /* Use running status */ - if (!prefix_cmd(orig_dev, note)) - return 0; - midi_outc(orig_dev, note); - midi_outc(orig_dev, velocity); - } else { - if (!prefix_cmd(orig_dev, 0x90 | (channel & 0x0f))) - return 0; - midi_outc(orig_dev, 0x90 | (channel & 0x0f)); /* Note on */ - midi_outc(orig_dev, note); - midi_outc(orig_dev, velocity); - } - return 0; -} - -void -midi_synth_reset(int dev) -{ - - leave_sysex(dev); -} - -int -midi_synth_open(int dev, int mode) -{ - int orig_dev = synth_devs[dev]->midi_dev; - int err; - unsigned long flags; - struct midi_input_info *inc; - - if (orig_dev < 0 || orig_dev > num_midis) - return -(ENXIO); - - midi2synth[orig_dev] = dev; - sysex_state[dev] = 0; - prev_out_status[orig_dev] = 0; - - if ((err = midi_devs[orig_dev]->open(orig_dev, mode, - midi_synth_input, midi_synth_output)) < 0) - return err; - - inc = &midi_devs[orig_dev]->in_info; - - flags = splhigh(); - inc->m_busy = 0; - inc->m_state = MST_INIT; - inc->m_ptr = 0; - inc->m_left = 0; - inc->m_prev_status = 0x00; - splx(flags); - - sysex_sleep_flag.aborting = 0; - sysex_sleep_flag.mode = WK_NONE; - - return 1; -} - -void -midi_synth_close(int dev) -{ - int orig_dev = synth_devs[dev]->midi_dev; - - leave_sysex(dev); - - /* - * Shut up the synths by sending just single active sensing message. - */ - midi_devs[orig_dev]->putc(orig_dev, 0xfe); - - midi_devs[orig_dev]->close(orig_dev); -} - -void -midi_synth_hw_control(int dev, unsigned char *event) -{ -} - -int -midi_synth_load_patch(int dev, int format, snd_rw_buf * addr, - int offs, int count, int pmgr_flag) -{ - int orig_dev = synth_devs[dev]->midi_dev; - - struct sysex_info sysex; - int i; - unsigned long left, src_offs, eox_seen = 0; - int first_byte = 1; - int hdr_size = offsetof(struct sysex_info, data); - - leave_sysex(dev); - - if (!prefix_cmd(orig_dev, 0xf0)) - return 0; - - if (format != SYSEX_PATCH) { - printf("MIDI Error: Invalid patch format (key) 0x%x\n", format); - return -(EINVAL); - } - if (count < hdr_size) { - printf("MIDI Error: Patch header too short\n"); - return -(EINVAL); - } - count -= hdr_size; - - /* - * Copy the header from user space but ignore the first bytes which - * have been transferred already. - */ - - - if (uiomove(&((char *) &sysex)[offs], hdr_size - offs, addr)) { - printf("sb: Bad copyin()!\n"); - }; - - if (count < sysex.len) { - printf("MIDI Warning: Sysex record too short (%d<%d)\n", - count, (int) sysex.len); - sysex.len = count; - } - left = sysex.len; - src_offs = 0; - - sysex_sleep_flag.aborting = 0; - sysex_sleep_flag.mode = WK_NONE; - - for (i = 0; i < left && !(sysex_sleep_flag.aborting); i++) { - unsigned char data; - - uiomove((char *) &(data), 1, addr); - - eox_seen = (i > 0 && data & 0x80); /* End of sysex */ - - if (eox_seen && data != 0xf7) - data = 0xf7; - - if (i == 0) { - if (data != 0xf0) { - printf("Error: Sysex start missing\n"); - return -(EINVAL); - } - } - while (!midi_devs[orig_dev]->putc(orig_dev, - (unsigned char) (data & 0xff)) && - !(sysex_sleep_flag.aborting)) { - int chn; - - - sysex_sleeper = &chn; - DO_SLEEP(chn, sysex_sleep_flag, 1); - - }; /* Wait for timeout */ - - if (!first_byte && data & 0x80) - return 0; - first_byte = 0; - } - - if (!eox_seen) - midi_outc(orig_dev, 0xf7); - return 0; -} - -void -midi_synth_panning(int dev, int channel, int pressure) -{ -} - -void -midi_synth_aftertouch(int dev, int channel, int pressure) -{ - int orig_dev = synth_devs[dev]->midi_dev; - int msg, chn; - - if (pressure < 0 || pressure > 127) - return; - if (channel < 0 || channel > 15) - return; - - leave_sysex(dev); - - msg = prev_out_status[orig_dev] & 0xf0; - chn = prev_out_status[orig_dev] & 0x0f; - - if (msg != 0xd0 || chn != channel) { /* Test for running status */ - if (!prefix_cmd(orig_dev, 0xd0 | (channel & 0x0f))) - return; - midi_outc(orig_dev, 0xd0 | (channel & 0x0f)); /* Channel pressure */ - } else if (!prefix_cmd(orig_dev, pressure)) - return; - - midi_outc(orig_dev, pressure); -} - -void -midi_synth_controller(int dev, int channel, int ctrl_num, int value) -{ - int orig_dev = synth_devs[dev]->midi_dev; - int chn, msg; - - if (ctrl_num < 1 || ctrl_num > 127) - return; /* NOTE! Controller # 0 ignored */ - if (channel < 0 || channel > 15) - return; - - leave_sysex(dev); - - msg = prev_out_status[orig_dev] & 0xf0; - chn = prev_out_status[orig_dev] & 0x0f; - - if (msg != 0xb0 || chn != channel) { - if (!prefix_cmd(orig_dev, 0xb0 | (channel & 0x0f))) - return; - midi_outc(orig_dev, 0xb0 | (channel & 0x0f)); - } else if (!prefix_cmd(orig_dev, ctrl_num)) - return; - - midi_outc(orig_dev, ctrl_num); - midi_outc(orig_dev, value & 0x7f); -} - -int -midi_synth_patchmgr(int dev, struct patmgr_info * rec) -{ - return -(EINVAL); -} - -void -midi_synth_bender(int dev, int channel, int value) -{ - int orig_dev = synth_devs[dev]->midi_dev; - int msg, prev_chn; - - if (channel < 0 || channel > 15) - return; - - if (value < 0 || value > 16383) - return; - - leave_sysex(dev); - - msg = prev_out_status[orig_dev] & 0xf0; - prev_chn = prev_out_status[orig_dev] & 0x0f; - - if (msg != 0xd0 || prev_chn != channel) { /* Test for running status */ - if (!prefix_cmd(orig_dev, 0xe0 | (channel & 0x0f))) - return; - midi_outc(orig_dev, 0xe0 | (channel & 0x0f)); - } else if (!prefix_cmd(orig_dev, value & 0x7f)) - return; - - midi_outc(orig_dev, value & 0x7f); - midi_outc(orig_dev, (value >> 7) & 0x7f); -} - -void -midi_synth_setup_voice(int dev, int voice, int channel) -{ -} - -int -midi_synth_send_sysex(int dev, unsigned char *bytes, int len) -{ - int orig_dev = synth_devs[dev]->midi_dev; - int i; - - for (i = 0; i < len; i++) { - switch (bytes[i]) { - case 0xf0: /* Start sysex */ - if (!prefix_cmd(orig_dev, 0xf0)) - return 0; - sysex_state[dev] = 1; - break; - - case 0xf7: /* End sysex */ - if (!sysex_state[dev]) /* Orphan sysex end */ - return 0; - sysex_state[dev] = 0; - break; - - default: - if (!sysex_state[dev]) - return 0; - - if (bytes[i] & 0x80) { /* Error. Another message before sysex end */ - bytes[i] = 0xf7; /* Sysex end */ - sysex_state[dev] = 0; - } - } - - if (!midi_devs[orig_dev]->putc(orig_dev, bytes[i])) { - /* - * Hardware leve buffer is full. Abort the sysex message. - */ - - int timeout = 0; - - bytes[i] = 0xf7; - sysex_state[dev] = 0; - - while (!midi_devs[orig_dev]->putc(orig_dev, bytes[i]) && - timeout < 1000) - timeout++; - } - if (!sysex_state[dev]) - return 0; - } - - return 0; -} -#endif diff --git a/sys/i386/isa/sound/midi_synth.h b/sys/i386/isa/sound/midi_synth.h deleted file mode 100644 index 80e627b..0000000 --- a/sys/i386/isa/sound/midi_synth.h +++ /dev/null @@ -1,49 +0,0 @@ -int midi_synth_ioctl (int dev, - unsigned int cmd, ioctl_arg arg); -int midi_synth_kill_note (int dev, int channel, int note, int velocity); -int midi_synth_set_instr (int dev, int channel, int instr_no); -int midi_synth_start_note (int dev, int channel, int note, int volume); -void midi_synth_reset (int dev); -int midi_synth_open (int dev, int mode); -void midi_synth_close (int dev); -void midi_synth_hw_control (int dev, unsigned char *event); -int midi_synth_load_patch (int dev, int format, snd_rw_buf * addr, - int offs, int count, int pmgr_flag); -void midi_synth_panning (int dev, int channel, int pressure); -void midi_synth_aftertouch (int dev, int channel, int pressure); -void midi_synth_controller (int dev, int channel, int ctrl_num, int value); -int midi_synth_patchmgr (int dev, struct patmgr_info *rec); -void midi_synth_bender (int dev, int chn, int value); -void midi_synth_setup_voice (int dev, int voice, int chn); -int midi_synth_send_sysex(int dev, unsigned char *bytes,int len); - -#ifndef _MIDI_SYNTH_C_ -static struct synth_info std_synth_info = -{MIDI_SYNTH_NAME, 0, SYNTH_TYPE_MIDI, 0, 0, 128, 0, 128, MIDI_SYNTH_CAPS}; - -static struct synth_operations std_midi_synth = -{ - &std_synth_info, - 0, - SYNTH_TYPE_MIDI, - 0, - midi_synth_open, - midi_synth_close, - midi_synth_ioctl, - midi_synth_kill_note, - midi_synth_start_note, - midi_synth_set_instr, - midi_synth_reset, - midi_synth_hw_control, - midi_synth_load_patch, - midi_synth_aftertouch, - midi_synth_controller, - midi_synth_panning, - NULL, - midi_synth_patchmgr, - midi_synth_bender, - NULL, /* alloc_voice */ - midi_synth_setup_voice, - midi_synth_send_sysex -}; -#endif diff --git a/sys/i386/isa/sound/midibuf.c b/sys/i386/isa/sound/midibuf.c deleted file mode 100644 index 75e5c32..0000000 --- a/sys/i386/isa/sound/midibuf.c +++ /dev/null @@ -1,431 +0,0 @@ -/* - * sound/midibuf.c - * - * Device file manager for /dev/midi# - * - * 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 - - -#if defined(CONFIG_MIDI) - -#include - -/* - * Don't make MAX_QUEUE_SIZE larger than 4000 - */ - -#define MAX_QUEUE_SIZE 4000 -int -MIDIbuf_poll (int dev, struct fileinfo *file, int events, select_table * wait); - -static void -drain_midi_queue(int dev); - -static int *midi_sleeper[MAX_MIDI_DEV] = {NULL}; -static volatile struct snd_wait midi_sleep_flag[MAX_MIDI_DEV] = { {0}}; -static int *input_sleeper[MAX_MIDI_DEV] = {NULL}; -static volatile struct snd_wait input_sleep_flag[MAX_MIDI_DEV] = { {0}}; - -struct midi_buf { - int len, head, tail; - u_char queue[MAX_QUEUE_SIZE]; -}; - -struct midi_parms { - int prech_timeout; /* Timeout before the first ch */ -}; - -static struct midi_buf *midi_out_buf[MAX_MIDI_DEV] = {NULL}; -static struct midi_buf *midi_in_buf[MAX_MIDI_DEV] = {NULL}; -static struct midi_parms parms[MAX_MIDI_DEV]; - -static void midi_poll(void *dummy); - -static volatile int open_devs = 0; - -#define DATA_AVAIL(q) (q->len) -#define SPACE_AVAIL(q) (MAX_QUEUE_SIZE - q->len) - -#define QUEUE_BYTE(q, data) \ - if (SPACE_AVAIL(q)) { \ - u_long flags; \ - flags = splhigh(); \ - q->queue[q->tail] = (data); \ - q->len++; q->tail = (q->tail+1) % MAX_QUEUE_SIZE; \ - splx(flags); \ - } - -#define REMOVE_BYTE(q, data) \ - if (DATA_AVAIL(q)) { \ - u_long flags; \ - flags = splhigh(); \ - data = q->queue[q->head]; \ - q->len--; q->head = (q->head+1) % MAX_QUEUE_SIZE; \ - splx(flags); \ - } - -static void -drain_midi_queue(int dev) -{ - - /* - * Give the Midi driver time to drain its output queues - */ - - if (midi_devs[dev]->buffer_status != NULL) - while (!(PROCESS_ABORTING (midi_sleep_flag[dev])) && - midi_devs[dev]->buffer_status(dev)) { - int chn; - - midi_sleeper[dev] = &chn; - DO_SLEEP(chn, midi_sleep_flag[dev], hz / 10); - - }; -} - -static void -midi_input_intr(int dev, u_char data) -{ - if (midi_in_buf[dev] == NULL) - return; - - if (data == 0xfe) /* Active sensing */ - return; /* Ignore */ - - if (SPACE_AVAIL(midi_in_buf[dev])) { - QUEUE_BYTE(midi_in_buf[dev], data); - if ((input_sleep_flag[dev].mode & WK_SLEEP)) { - input_sleep_flag[dev].mode = WK_WAKEUP; - wakeup(input_sleeper[dev]); - }; - } -} - -static void -midi_output_intr(int dev) -{ - /* - * Currently NOP - */ -} - -static void -midi_poll(void *dummy) -{ - u_long flags; - int dev; - - flags = splhigh(); - if (open_devs) { - for (dev = 0; dev < num_midis; dev++) - if (midi_out_buf[dev] != NULL) { - while (DATA_AVAIL(midi_out_buf[dev]) && - midi_devs[dev]->putc(dev, - midi_out_buf[dev]->queue[midi_out_buf[dev]->head])) { - midi_out_buf[dev]->head = (midi_out_buf[dev]->head + 1) % MAX_QUEUE_SIZE; - midi_out_buf[dev]->len--; - } - - if (DATA_AVAIL(midi_out_buf[dev]) < 100 && - (midi_sleep_flag[dev].mode & WK_SLEEP)) { - midi_sleep_flag[dev].mode = WK_WAKEUP; - wakeup(midi_sleeper[dev]); - }; - } - timeout( midi_poll, 0, 1);; /* Come back later */ - } - splx(flags); -} - -int -MIDIbuf_open(int dev, struct fileinfo * file) -{ - int mode, err; - - dev = dev >> 4; - mode = file->mode & O_ACCMODE; - - if (num_midis > MAX_MIDI_DEV) { - printf("Sound: FATAL ERROR: Too many midi interfaces\n"); - num_midis = MAX_MIDI_DEV; - } - if (dev < 0 || dev >= num_midis) { - printf("Sound: Nonexistent MIDI interface %d\n", dev); - return -(ENXIO); - } - /* - * Interrupts disabled. Be careful - */ - - if ((err = midi_devs[dev]->open(dev, mode, - midi_input_intr, midi_output_intr)) < 0) { - return err; - } - parms[dev].prech_timeout = 0; - - midi_in_buf[dev] = (struct midi_buf *) malloc(sizeof(struct midi_buf), M_TEMP, M_WAITOK); - - if (midi_in_buf[dev] == NULL) { - printf("midi: Can't allocate buffer\n"); - midi_devs[dev]->close(dev); - return -(EIO); - } - midi_in_buf[dev]->len = midi_in_buf[dev]->head = midi_in_buf[dev]->tail = 0; - - midi_out_buf[dev] = (struct midi_buf *) malloc(sizeof(struct midi_buf), M_TEMP, M_WAITOK); - - if (midi_out_buf[dev] == NULL) { - printf("midi: Can't allocate buffer\n"); - midi_devs[dev]->close(dev); - free(midi_in_buf[dev], M_TEMP); - midi_in_buf[dev] = NULL; - return -(EIO); - } - midi_out_buf[dev]->len = midi_out_buf[dev]->head = midi_out_buf[dev]->tail = 0; - open_devs++; - - { - midi_sleep_flag[dev].aborting = 0; - midi_sleep_flag[dev].mode = WK_NONE; - }; - { - input_sleep_flag[dev].aborting = 0; - input_sleep_flag[dev].mode = WK_NONE; - }; - - if (open_devs < 2) { /* This was first open */ - { - }; - - timeout( midi_poll, 0, 1);; /* Start polling */ - } - return err; -} - -void -MIDIbuf_release(int dev, struct fileinfo * file) -{ - int mode; - u_long flags; - - dev = dev >> 4; - mode = file->mode & O_ACCMODE; - - if (dev < 0 || dev >= num_midis) - return; - - flags = splhigh(); - - /* - * Wait until the queue is empty - */ - - if (mode != OPEN_READ) { - midi_devs[dev]->putc(dev, 0xfe); /* Active sensing to - * shut the devices */ - - while (!(PROCESS_ABORTING (midi_sleep_flag[dev])) && - DATA_AVAIL(midi_out_buf[dev])) { - int chn; - midi_sleeper[dev] = &chn; - DO_SLEEP(chn, midi_sleep_flag[dev], 0); - - }; /* Sync */ - - drain_midi_queue(dev); /* Ensure the output queues are empty */ - } - splx(flags); - - midi_devs[dev]->close(dev); - - free(midi_in_buf[dev], M_TEMP); - free(midi_out_buf[dev], M_TEMP); - midi_in_buf[dev] = NULL; - midi_out_buf[dev] = NULL; - if (open_devs < 2) { - }; - open_devs--; -} - -int -MIDIbuf_write(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) -{ - u_long flags; - int c, n, i; - u_char tmp_data; - - dev = dev >> 4; - - if (!count) - return 0; - - flags = splhigh(); - - c = 0; - - while (c < count) { - n = SPACE_AVAIL(midi_out_buf[dev]); - - if (n == 0) { /* No space just now. We have to sleep */ - - { - int chn; - - midi_sleeper[dev] = &chn; - DO_SLEEP(chn, midi_sleep_flag[dev], 0); - }; - - if (PROCESS_ABORTING(midi_sleep_flag[dev])) { - splx(flags); - return -(EINTR); - } - n = SPACE_AVAIL(midi_out_buf[dev]); - } - if (n > (count - c)) - n = count - c; - - for (i = 0; i < n; i++) { - - if (uiomove((char *) &tmp_data, 1, buf)) { - printf("sb: Bad copyin()!\n"); - }; - QUEUE_BYTE(midi_out_buf[dev], tmp_data); - c++; - } - } - - splx(flags); - - return c; -} - - -int -MIDIbuf_read(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) -{ - int n, c = 0; - u_long flags; - u_char tmp_data; - - dev = dev >> 4; - - flags = splhigh(); - - if (!DATA_AVAIL(midi_in_buf[dev])) { /* No data yet, wait */ - - { - int chn; - - - input_sleeper[dev] = &chn; - DO_SLEEP(chn, input_sleep_flag[dev], - parms[dev].prech_timeout); - - }; - if (PROCESS_ABORTING(input_sleep_flag[dev])) - c = -(EINTR); /* The user is getting restless */ - } - if (c == 0 && DATA_AVAIL(midi_in_buf[dev])) { /* Got some bytes */ - n = DATA_AVAIL(midi_in_buf[dev]); - if (n > count) - n = count; - c = 0; - - while (c < n) { - REMOVE_BYTE(midi_in_buf[dev], tmp_data); - - if (uiomove((char *) &tmp_data, 1, buf)) { - printf("sb: Bad copyout()!\n"); - }; - c++; - } - } - splx(flags); - - return c; -} - -int -MIDIbuf_ioctl(int dev, struct fileinfo * file, u_int cmd, ioctl_arg arg) -{ - int val; - - dev = dev >> 4; - - if (((cmd >> 8) & 0xff) == 'C') { - if (midi_devs[dev]->coproc) /* Coprocessor ioctl */ - return midi_devs[dev]->coproc->ioctl(midi_devs[dev]->coproc->devc, cmd, arg, 0); - else - printf("/dev/midi%d: No coprocessor for this device\n", dev); - - return -(ENXIO); - } else - switch (cmd) { - - case SNDCTL_MIDI_PRETIME: - val = (int) (*(int *) arg); - if (val < 0) - val = 0; - - val = (hz * val) / 10; - parms[dev].prech_timeout = val; - return *(int *) arg = val; - break; - - default: - return midi_devs[dev]->ioctl(dev, cmd, arg); - } -} - -#ifdef ALLOW_POLL -int -MIDIbuf_poll (int dev, struct fileinfo *file, int events, select_table * wait) -{ - int revents = 0; - - dev = dev >> 4; - - if (events & (POLLIN | POLLRDNORM)) - if (!DATA_AVAIL (midi_in_buf[dev])) - selrecord(wait, &selinfo[dev]); - else - revents |= events & (POLLIN | POLLRDNORM); - - if (events & (POLLOUT | POLLWRNORM)) - if (SPACE_AVAIL (midi_out_buf[dev])) - selrecord(wait, &selinfo[dev]); - else - revents |= events & (POLLOUT | POLLWRNORM); - - return revents; -} - -#endif /* ALLOW_SELECT */ - - - -#endif diff --git a/sys/i386/isa/sound/mmap_test.c b/sys/i386/isa/sound/mmap_test.c deleted file mode 100644 index db5cbc0..0000000 --- a/sys/i386/isa/sound/mmap_test.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - * This is a simple program which demonstrates use of mmapped DMA buffer - * of the sound driver directly from application program. - * - * This sample program works (currently) only with Linux, FreeBSD and BSD/OS - * (FreeBSD and BSD/OS require OSS version 3.8-beta16 or later. - * - * Note! Don't use mmapped DMA buffers (direct audio) unless you have - * very good reasons to do it. Programs using this feature will not - * work with all soundcards. GUS (GF1) is one of them (GUS MAX works). - * - * This program requires version 3.5-beta7 or later of OSS - * (3.8-beta16 or later in FreeBSD and BSD/OS). - */ - -#ifndef lint -static const char rcsid[] = - "$FreeBSD$"; -#endif /* not lint */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -int -main() -{ - int fd, sz, fsz, tmp, nfrag; - int caps; - - int sd, sl=0, sp; - - unsigned char data[500000], *dp = data; - - caddr_t buf; - struct timeval tim; - - unsigned char *op; - - struct audio_buf_info info; - - int frag = 0xffff000c; /* Max # fragments of 2^13=8k bytes */ - - fd_set writeset; - - close(0); - if ((fd=open("/dev/dsp", O_RDWR, 0))==-1) - err(1, "/dev/dsp"); -/* - * Then setup sampling parameters. Just sampling rate in this case. - */ - - tmp = 8000; - ioctl(fd, SNDCTL_DSP_SPEED, &tmp); - -/* - * Load some test data. - */ - - sl = sp = 0; - if ((sd=open("smpl", O_RDONLY, 0))!=-1) - { - sl = read(sd, data, sizeof(data)); - printf("%d bytes read from file.\n", sl); - close(sd); - } - else warn("smpl"); - - if (ioctl(fd, SNDCTL_DSP_GETCAPS, &caps)==-1) - { - warn("sorry but your sound driver is too old"); - err(1, "/dev/dsp"); - } - -/* - * Check that the device has capability to do this. Currently just - * CS4231 based cards will work. - * - * The application should also check for DSP_CAP_MMAP bit but this - * version of driver doesn't have it yet. - */ -/* ioctl(fd, SNDCTL_DSP_SETSYNCRO, 0); */ - -/* - * You need version 3.5-beta7 or later of the sound driver before next - * two lines compile. There is no point to modify this program to - * compile with older driver versions since they don't have working - * mmap() support. - */ - if (!(caps & DSP_CAP_TRIGGER) || - !(caps & DSP_CAP_MMAP)) - errx(1, "sorry but your soundcard can't do this"); - -/* - * Select the fragment size. This is propably important only when - * the program uses select(). Fragment size defines how often - * select call returns. - */ - - ioctl(fd, SNDCTL_DSP_SETFRAGMENT, &frag); - -/* - * Compute total size of the buffer. It's important to use this value - * in mmap() call. - */ - - if (ioctl(fd, SNDCTL_DSP_GETOSPACE, &info)==-1) - err(1, "GETOSPACE"); - - sz = info.fragstotal * info.fragsize; - fsz = info.fragsize; -/* - * Call mmap(). - * - * IMPORTANT NOTE!!!!!!!!!!! - * - * Full duplex audio devices have separate input and output buffers. - * It is not possible to map both of them at the same mmap() call. The buffer - * is selected based on the prot argument in the following way: - * - * - PROT_READ (alone) selects the input buffer. - * - PROT_WRITE (alone) selects the output buffer. - * - PROT_WRITE|PROT_READ together select the output buffer. This combination - * is required in BSD to make the buffer accessible. With just PROT_WRITE - * every attempt to access the returned buffer will result in segmentation/bus - * error. PROT_READ|PROT_WRITE is also permitted in Linux with OSS version - * 3.8-beta16 and later (earlier versions don't accept it). - * - * Non duplex devices have just one buffer. When an application wants to do both - * input and output it's recommended that the device is closed and re-opened when - * switching between modes. PROT_READ|PROT_WRITE can be used to open the buffer - * for both input and output (with OSS 3.8-beta16 and later) but the result may be - * unpredictable. - */ - - if ((buf=mmap(NULL, sz, PROT_WRITE | PROT_READ, MAP_FILE|MAP_SHARED, fd, 0))==(caddr_t)-1) - err(1, "mmap (write)"); - printf("mmap (out) returned %08x\n", buf); - op=buf; - -/* - * op contains now a pointer to the DMA buffer - */ - -/* - * Then it's time to start the engine. The driver doesn't allow read() and/or - * write() when the buffer is mapped. So the only way to start operation is - * to togle device's enable bits. First set them off. Setting them on enables - * recording and/or playback. - */ - - tmp = 0; - ioctl(fd, SNDCTL_DSP_SETTRIGGER, &tmp); - -/* - * It might be usefull to write some data to the buffer before starting. - */ - - tmp = PCM_ENABLE_OUTPUT; - ioctl(fd, SNDCTL_DSP_SETTRIGGER, &tmp); - -/* - * The machine is up and running now. Use SNDCTL_DSP_GETOPTR to get the - * buffer status. - * - * NOTE! The driver empties each buffer fragmen after they have been - * played. This prevents looping sound if there are some performance problems - * in the application side. For similar reasons it recommended that the - * application uses some amout of play ahead. It can rewrite the unplayed - * data later if necessary. - */ - - nfrag = 0; - while (1) - { - struct count_info count; - int extra; - - FD_ZERO(&writeset); - FD_SET(fd, &writeset); - - tim.tv_sec = 10; - tim.tv_usec= 0; - - select(fd+1, &writeset, &writeset, NULL, NULL); -/* - * SNDCTL_DSP_GETOPTR (and GETIPTR as well) return three items. The - * bytes field returns number of bytes played since start. It can be used - * as a real time clock. - * - * The blocks field returns number of fragment transitions (interrupts) since - * previous GETOPTR call. It can be used as a method to detect underrun - * situations. - * - * The ptr field is the DMA pointer inside the buffer area (in bytes from - * the beginning of total buffer area). - */ - - if (ioctl(fd, SNDCTL_DSP_GETOPTR, &count)==-1) - err(1, "GETOPTR"); - if (count.ptr < 0 ) count.ptr = 0; - nfrag += count.blocks; - - -#ifdef VERBOSE - - printf("\rTotal: %09d, Fragment: %03d, Ptr: %06d", - count.bytes, nfrag, count.ptr); - fflush(stdout); -#endif - -/* - * Caution! This version doesn't check for bounds of the DMA - * memory area. It's possible that the returned pointer value is not aligned - * to fragment boundaries. It may be several samples behind the boundary - * in case there was extra delay between the actual hardware interrupt and - * the time when DSP_GETOPTR was called. - * - * Don't just call memcpy() with length set to 'fragment_size' without - * first checking that the transfer really fits to the buffer area. - * A mistake of just one byte causes seg fault. It may be easiest just - * to align the returned pointer value to fragment boundary before using it. - * - * It would be very good idea to write few extra samples to next fragment - * too. Otherwise several (uninitialized) samples from next fragment - * will get played before your program gets chance to initialize them. - * Take in count the fact thaat there are other processes batling about - * the same CPU. This effect is likely to be very annoying if fragment - * size is decreased too much. - */ - -/* - * Just a minor clarification to the above. The following line alings - * the pointer to fragment boundaries. Note! Don't trust that fragment - * size is always a power of 2. It may not be so in future. - */ - count.ptr = ((count.ptr+16)/fsz )*fsz; -#ifdef VERBOSE - printf(" memcpy(%6d, %4d)", (dp-data), fsz); - fflush(stdout); -#endif - -/* - * Set few bytes in the beginning of next fragment too. - */ - - if ((count.ptr+fsz+16) < sz) /* Last fragment? */ - extra = 16; - else - extra = 0; - memcpy(op+count.ptr, dp, (fsz+extra)); - dp += fsz; - if (dp > (data+sl-fsz)) - dp = data; - - } - - exit(0); -} diff --git a/sys/i386/isa/sound/mpu401.c b/sys/i386/isa/sound/mpu401.c deleted file mode 100644 index 2858ef3..0000000 --- a/sys/i386/isa/sound/mpu401.c +++ /dev/null @@ -1,1644 +0,0 @@ -/* - * sound/mpu401.c - * - * The low level driver for Roland MPU-401 compatible Midi 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 - * 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. - * - * Modified: Riccardo Facchetti 24 Mar 1995 - Added the Audio Excel DSP 16 - * initialization routine. - */ - -#define USE_SEQ_MACROS -#define USE_SIMPLE_MACROS - -#include - -#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) -#include - -static int init_sequence[20]; /* NOTE! pos 0 = len, start pos 1. */ - -#ifdef CONFIG_SEQUENCER -static int timer_mode = TMR_INTERNAL, timer_caps = TMR_INTERNAL; - -#endif - -struct mpu_config { - int base; /* I/O base */ - int irq; - int opened; /* Open mode */ - int devno; - int synthno; - int uart_mode; - int initialized; - int mode; -#define MODE_MIDI 1 -#define MODE_SYNTH 2 - u_char version, revision; - u_int capabilities; -#define MPU_CAP_INTLG 0x10000000 -#define MPU_CAP_SYNC 0x00000010 -#define MPU_CAP_FSK 0x00000020 -#define MPU_CAP_CLS 0x00000040 -#define MPU_CAP_SMPTE 0x00000080 -#define MPU_CAP_2PORT 0x00000001 - int timer_flag; - -#define MBUF_MAX 10 -#define BUFTEST(dc) if (dc->m_ptr >= MBUF_MAX || dc->m_ptr < 0) \ - {printf("MPU: Invalid buffer pointer %d/%d, s=%d\n", dc->m_ptr, dc->m_left, dc->m_state);dc->m_ptr--;} - int m_busy; - u_char m_buf[MBUF_MAX]; - int m_ptr; - int m_state; - int m_left; - u_char last_status; - void (*inputintr) (int dev, u_char data); - int shared_irq; - sound_os_info *osp; -}; - -#ifdef PC98 -#define DATAPORT(base) (base) -#define COMDPORT(base) (base+2) -#define STATPORT(base) (base+2) -#else -#define DATAPORT(base) (base) -#define COMDPORT(base) (base+1) -#define STATPORT(base) (base+1) -#endif /* PC98 */ - -#define mpu401_status(devc) inb( STATPORT((devc)->base)) -#define input_avail(devc) (!(mpu401_status(devc)&INPUT_AVAIL)) -#define output_ready(devc) (!(mpu401_status(devc)&OUTPUT_READY)) -#define write_command(devc, cmd) outb( COMDPORT((devc)->base), cmd) -#define read_data(devc) inb( DATAPORT((devc)->base)) - -#define write_data(devc, byte) outb( DATAPORT((devc)->base), byte) - -#define OUTPUT_READY 0x40 -#define INPUT_AVAIL 0x80 -#define MPU_ACK 0xFE -#define MPU_RESET 0xFF -#define UART_MODE_ON 0x3F - -static struct mpu_config dev_conf[MAX_MIDI_DEV] = { {0}}; - -static int n_mpu_devs = 0; -static volatile int irq2dev[17] = - {-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}; - -static int reset_mpu401(struct mpu_config * devc); -static void set_uart_mode(int dev, struct mpu_config * devc, int arg); - -static void mpu_timer_init(int midi_dev); -static void mpu_timer_interrupt(void); -static void timer_ext_event(struct mpu_config * devc, int event, int parm); - -static struct synth_info mpu_synth_info_proto = -{"MPU-401 MIDI interface", 0, SYNTH_TYPE_MIDI, 0, 0, 128, 0, 128, SYNTH_CAP_INPUT}; - -static struct synth_info mpu_synth_info[MAX_MIDI_DEV]; - -/* - * States for the input scanner - */ - -#define ST_INIT 0 /* Ready for timing byte or msg */ -#define ST_TIMED 1 /* Leading timing byte rcvd */ -#define ST_DATABYTE 2 /* Waiting for (nr_left) data bytes */ - -#define ST_SYSMSG 100 /* System message (sysx etc). */ -#define ST_SYSEX 101 /* System exclusive msg */ -#define ST_MTC 102 /* Midi Time Code (MTC) qframe msg */ -#define ST_SONGSEL 103 /* Song select */ -#define ST_SONGPOS 104 /* Song position pointer */ - -static u_char len_tab[] =/* # of data bytes following a status */ -{ - 2, /* 8x */ - 2, /* 9x */ - 2, /* Ax */ - 2, /* Bx */ - 1, /* Cx */ - 1, /* Dx */ - 2, /* Ex */ - 0 /* Fx */ -}; - -#ifndef CONFIG_SEQUENCER -#define STORE(cmd) -#else -#define STORE(cmd) \ -{ \ - int len; \ - u_char obuf[8]; \ - cmd; \ - seq_input_event(obuf, len); \ -} -#endif - -#define _seqbuf obuf -#define _seqbufptr 0 -#define _SEQ_ADVBUF(x) len=x - -static int -mpu_input_scanner(struct mpu_config * devc, u_char midic) -{ - - switch (devc->m_state) { - case ST_INIT: - switch (midic) { - case 0xf8: - /* Timer overflow */ - break; - - case 0xfc: - printf(""); - break; - - case 0xfd: - if (devc->timer_flag) - mpu_timer_interrupt(); - break; - - case 0xfe: - return MPU_ACK; - break; - - case 0xf0: - case 0xf1: - case 0xf2: - case 0xf3: - case 0xf4: - case 0xf5: - case 0xf6: - case 0xf7: - printf("", midic & 0x0f); - break; - - case 0xf9: - printf(""); - break; - - case 0xff: - devc->m_state = ST_SYSMSG; - break; - - default: - if (midic <= 0xef) { - /* printf("mpu time: %d ", midic); */ - devc->m_state = ST_TIMED; - } else - printf(" ", midic); - } - break; - - case ST_TIMED: - { - int msg = ((int) (midic & 0xf0) >> 4); - - devc->m_state = ST_DATABYTE; - - if (msg < 8) { /* Data byte */ - /* printf("midi msg (running status) "); */ - msg = ((int) (devc->last_status & 0xf0) >> 4); - msg -= 8; - devc->m_left = len_tab[msg] - 1; - - devc->m_ptr = 2; - devc->m_buf[0] = devc->last_status; - devc->m_buf[1] = midic; - - if (devc->m_left <= 0) { - devc->m_state = ST_INIT; - do_midi_msg(devc->synthno, devc->m_buf, devc->m_ptr); - devc->m_ptr = 0; - } - } else if (msg == 0xf) { /* MPU MARK */ - devc->m_state = ST_INIT; - - switch (midic) { - case 0xf8: - /* printf("NOP "); */ - break; - - case 0xf9: - /* printf("meas end "); */ - break; - - case 0xfc: - /* printf("data end "); */ - break; - - default: - printf("Unknown MPU mark %02x\n", midic); - } - } else { - devc->last_status = midic; - /* printf ("midi msg "); */ - msg -= 8; - devc->m_left = len_tab[msg]; - - devc->m_ptr = 1; - devc->m_buf[0] = midic; - - if (devc->m_left <= 0) { - devc->m_state = ST_INIT; - do_midi_msg(devc->synthno, devc->m_buf, devc->m_ptr); - devc->m_ptr = 0; - } - } - } - break; - - case ST_SYSMSG: - switch (midic) { - case 0xf0: - printf(""); - devc->m_state = ST_SYSEX; - break; - - case 0xf1: - devc->m_state = ST_MTC; - break; - - case 0xf2: - devc->m_state = ST_SONGPOS; - devc->m_ptr = 0; - break; - - case 0xf3: - devc->m_state = ST_SONGSEL; - break; - - case 0xf6: - /* printf("tune_request\n"); */ - devc->m_state = ST_INIT; - /* XXX do we need a break here ? - lr 970710 */ - - /* - * Real time messages - */ - case 0xf8: - /* midi clock */ - devc->m_state = ST_INIT; - timer_ext_event(devc, TMR_CLOCK, 0); - break; - - case 0xfA: - devc->m_state = ST_INIT; - timer_ext_event(devc, TMR_START, 0); - break; - - case 0xFB: - devc->m_state = ST_INIT; - timer_ext_event(devc, TMR_CONTINUE, 0); - break; - - case 0xFC: - devc->m_state = ST_INIT; - timer_ext_event(devc, TMR_STOP, 0); - break; - - case 0xFE: - /* active sensing */ - devc->m_state = ST_INIT; - break; - - case 0xff: - /* printf("midi hard reset"); */ - devc->m_state = ST_INIT; - break; - - default: - printf("unknown MIDI sysmsg %0x\n", midic); - devc->m_state = ST_INIT; - } - break; - - case ST_MTC: - devc->m_state = ST_INIT; - printf("MTC frame %x02\n", midic); - break; - - case ST_SYSEX: - if (midic == 0xf7) { - printf(""); - devc->m_state = ST_INIT; - } else - printf("%02x ", midic); - break; - - case ST_SONGPOS: - BUFTEST(devc); - devc->m_buf[devc->m_ptr++] = midic; - if (devc->m_ptr == 2) { - devc->m_state = ST_INIT; - devc->m_ptr = 0; - timer_ext_event(devc, TMR_SPP, - ((devc->m_buf[1] & 0x7f) << 7) | (devc->m_buf[0] & 0x7f)); - } - break; - - case ST_DATABYTE: - BUFTEST(devc); - devc->m_buf[devc->m_ptr++] = midic; - if ((--devc->m_left) <= 0) { - devc->m_state = ST_INIT; - do_midi_msg(devc->synthno, devc->m_buf, devc->m_ptr); - devc->m_ptr = 0; - } - break; - - default: - printf("Bad state %d ", devc->m_state); - devc->m_state = ST_INIT; - } - - return 1; -} - -static void -mpu401_input_loop(struct mpu_config * devc) -{ - u_long flags; - int n, busy; - - flags = splhigh(); - busy = devc->m_busy; - devc->m_busy = 1; - splx(flags); - - if (busy) /* Already inside the scanner */ - return; - - n = 50; - - while (input_avail(devc) && n-- > 0) { - u_char c = read_data(devc); - - if (devc->mode == MODE_SYNTH) { - mpu_input_scanner(devc, c); - } else if (devc->opened & OPEN_READ && devc->inputintr != NULL) - devc->inputintr(devc->devno, c); - } - - devc->m_busy = 0; -} - -void -mpuintr(int irq) -{ - struct mpu_config *devc; - int dev; - - /* - * FreeBSD (and some others) pass unit number to the interrupt - * handler. In this case we have to scan the table for first handler. - */ - - if (irq < 1 || irq > 15) { - dev = -1; - } else - dev = irq2dev[irq]; - - if (dev == -1) { - int origirq = irq; - - for (irq = 0; irq <= 16; irq++) - if (irq2dev[irq] != -1) - break; - if (irq > 15) { - printf("MPU-401: Bogus interrupt #%d?\n", origirq); - return; - } - dev = irq2dev[irq]; - devc = &dev_conf[dev]; - } else - devc = &dev_conf[dev]; - - if (input_avail(devc)) - if (devc->base != 0 && (devc->opened & OPEN_READ || devc->mode == MODE_SYNTH)) - mpu401_input_loop(devc); - else { - /* Dummy read (just to acknowledge the interrupt) */ - read_data(devc); - } - -} - -static int -mpu401_open(int dev, int mode, - void (*input) (int dev, u_char data), void (*output) (int dev)) -{ - int err; - struct mpu_config *devc; - - if (dev < 0 || dev >= num_midis) - return -(ENXIO); - - devc = &dev_conf[dev]; - - if (devc->opened) { - printf("MPU-401: Midi busy\n"); - return -(EBUSY); - } - /* - * Verify that the device is really running. Some devices (such as - * Ensoniq SoundScape don't work before the on board processor (OBP) - * is initialized by downloading its microcode. - */ - - if (!devc->initialized) { - if (mpu401_status(devc) == 0xff) { /* Bus float */ - printf("MPU-401: Device not initialized properly\n"); - return -(EIO); - } - reset_mpu401(devc); - } - irq2dev[devc->irq] = dev; - - if (midi_devs[dev]->coproc) - if ((err = midi_devs[dev]->coproc-> - open(midi_devs[dev]->coproc->devc, COPR_MIDI)) < 0) { - printf("MPU-401: Can't access coprocessor device\n"); - - return err; - } - set_uart_mode(dev, devc, 1); - devc->mode = MODE_MIDI; - devc->synthno = 0; - - mpu401_input_loop(devc); - - devc->inputintr = input; - devc->opened = mode; - - return 0; -} - -static void -mpu401_close(int dev) -{ - struct mpu_config *devc; - - devc = &dev_conf[dev]; - - if (devc->uart_mode) - reset_mpu401(devc); /* This disables the UART mode */ - devc->mode = 0; - - devc->inputintr = NULL; - - if (midi_devs[dev]->coproc) - midi_devs[dev]->coproc->close(midi_devs[dev]->coproc->devc, COPR_MIDI); - devc->opened = 0; -} - -static int -mpu401_out(int dev, u_char midi_byte) -{ - int timeout; - u_long flags; - - struct mpu_config *devc; - - devc = &dev_conf[dev]; - - /* - * Sometimes it takes about 13000 loops before the output becomes - * ready (After reset). Normally it takes just about 10 loops. - */ - -#ifdef PC98 - for (timeout = 23000; timeout > 0 && !output_ready(devc); timeout--); -#else - for (timeout = 3000; timeout > 0 && !output_ready(devc); timeout--); -#endif - - flags = splhigh(); - if (!output_ready(devc)) { - printf("MPU-401: Send data timeout\n"); - splx(flags); - return 0; - } - write_data(devc, midi_byte); - splx(flags); - return 1; -} - -static int -mpu401_command(int dev, mpu_command_rec * cmd) -{ - int i, timeout, ok; - int ret = 0; - u_long flags; - struct mpu_config *devc; - - devc = &dev_conf[dev]; - - if (devc->uart_mode) { /* Not possible in UART mode */ - printf("MPU-401 commands not possible in the UART mode\n"); - return -(EINVAL); - } - /* - * Test for input since pending input seems to block the output. - */ - if (input_avail(devc)) - mpu401_input_loop(devc); - - /* - * Sometimes it takes about 30000 loops before the output becomes - * ready (After reset). Normally it takes just about 10 loops. - */ - -#ifdef PC98 - timeout = 50000; -#else - timeout = 30000; -#endif -retry: - if (timeout-- <= 0) { - printf("MPU-401: Command (0x%x) timeout\n", (int) cmd->cmd); - return -(EIO); - } - flags = splhigh(); - - if (!output_ready(devc)) { - splx(flags); - goto retry; - } - write_command(devc, cmd->cmd); - ok = 0; - for (timeout = 50000; timeout > 0 && !ok; timeout--) - if (input_avail(devc)) - if (devc->opened && devc->mode == MODE_SYNTH) { - if (mpu_input_scanner(devc, read_data(devc)) == MPU_ACK) - ok = 1; - } else {/* Device is not currently open. Use simplier method */ - if (read_data(devc) == MPU_ACK) - ok = 1; - } - - if (!ok) { - splx(flags); - /* printf ("MPU: No ACK to command (0x%x)\n", (int) cmd->cmd); */ - return -(EIO); - } - if (cmd->nr_args) - for (i = 0; i < cmd->nr_args; i++) { - for (timeout = 3000; timeout > 0 && !output_ready(devc); timeout--); - if (!mpu401_out(dev, cmd->data[i])) { - splx(flags); - printf("MPU: Command (0x%x), parm send failed.\n", (int) cmd->cmd); - return -(EIO); - } - } - - ret = 0; - cmd->data[0] = 0; - - if (cmd->nr_returns) - for (i = 0; i < cmd->nr_returns; i++) { - ok = 0; - for (timeout = 5000; timeout > 0 && !ok; timeout--) - if (input_avail(devc)) { - cmd->data[i] = read_data(devc); - ok = 1; - } - if (!ok) { - splx(flags); - /* printf ("MPU: No response(%d) to command (0x%x)\n", - * i, (int) cmd->cmd); - */ - return -(EIO); - } - } - - splx(flags); - - return ret; -} - -static int -mpu_cmd(int dev, int cmd, int data) -{ - int ret; - - static mpu_command_rec rec; - - rec.cmd = cmd & 0xff; - rec.nr_args = ((cmd & 0xf0) == 0xE0); - rec.nr_returns = ((cmd & 0xf0) == 0xA0); - rec.data[0] = data & 0xff; - - if ((ret = mpu401_command(dev, &rec)) < 0) { - return ret; - } - return (u_char) rec.data[0]; -} - -static int -mpu401_prefix_cmd(int dev, u_char status) -{ - struct mpu_config *devc = &dev_conf[dev]; - - if (devc->uart_mode) - return 1; - - if (status < 0xf0) { - if (mpu_cmd(dev, 0xD0, 0) < 0) { - return 0; - } - return 1; - } - switch (status) { - case 0xF0: - if (mpu_cmd(dev, 0xDF, 0) < 0) { - return 0; - } - return 1; - break; - - default: - return 0; - } - -} - -static int -mpu401_start_read(int dev) -{ - return 0; -} - -static int -mpu401_end_read(int dev) -{ - return 0; -} - -static int -mpu401_ioctl(int dev, u_int cmd, ioctl_arg arg) -{ - struct mpu_config *devc; - - devc = &dev_conf[dev]; - - switch (cmd) { - case 1: - bcopy(&(((char *) arg)[0]), (char *) init_sequence, sizeof(init_sequence)); - return 0; - break; - - case SNDCTL_MIDI_MPUMODE: - if (!(devc->capabilities & MPU_CAP_INTLG)) { /* No intelligent mode */ - printf("MPU-401: Intelligent mode not supported by the HW\n"); - return -(EINVAL); - } - set_uart_mode(dev, devc, !(*(int *) arg)); - return 0; - break; - - case SNDCTL_MIDI_MPUCMD: - { - int ret; - mpu_command_rec rec; - - bcopy(&(((char *) arg)[0]), (char *) &rec, sizeof(rec)); - - if ((ret = mpu401_command(dev, &rec)) < 0) - return ret; - bcopy((char *) &rec, &(((char *) arg)[0]), sizeof(rec)); - return 0; - } - break; - - default: - return -(EINVAL); - } -} - -static void -mpu401_kick(int dev) -{ -} - -static int -mpu401_buffer_status(int dev) -{ - return 0; /* No data in buffers */ -} - -static int -mpu_synth_ioctl(int dev, - u_int cmd, ioctl_arg arg) -{ - int midi_dev; - struct mpu_config *devc; - - midi_dev = synth_devs[dev]->midi_dev; - - if (midi_dev < 0 || midi_dev > num_midis) - return -(ENXIO); - - devc = &dev_conf[midi_dev]; - - switch (cmd) { - - case SNDCTL_SYNTH_INFO: - bcopy(&mpu_synth_info[midi_dev], &(((char *) arg)[0]), sizeof(struct synth_info)); - return 0; - break; - - case SNDCTL_SYNTH_MEMAVL: - return 0x7fffffff; - break; - - default: - return -(EINVAL); - } -} - -static int -mpu_synth_open(int dev, int mode) -{ - int midi_dev, err; - struct mpu_config *devc; - - midi_dev = synth_devs[dev]->midi_dev; - - if (midi_dev < 0 || midi_dev > num_midis) { - return -(ENXIO); - } - devc = &dev_conf[midi_dev]; - - /* - * Verify that the device is really running. Some devices (such as - * Ensoniq SoundScape don't work before the on board processor (OBP) - * is initialized by downloading its microcode. - */ - - if (!devc->initialized) { - if (mpu401_status(devc) == 0xff) { /* Bus float */ - printf("MPU-401: Device not initialized properly\n"); - return -(EIO); - } - reset_mpu401(devc); - } - if (devc->opened) { - printf("MPU-401: Midi busy\n"); - return -(EBUSY); - } - devc->mode = MODE_SYNTH; - devc->synthno = dev; - - devc->inputintr = NULL; - irq2dev[devc->irq] = midi_dev; - - if (midi_devs[midi_dev]->coproc) - if ((err = midi_devs[midi_dev]->coproc-> - open(midi_devs[midi_dev]->coproc->devc, COPR_MIDI)) < 0) { - printf("MPU-401: Can't access coprocessor device\n"); - - return err; - } - devc->opened = mode; - reset_mpu401(devc); - - if (mode & OPEN_READ) { - mpu_cmd(midi_dev, 0x8B, 0); /* Enable data in stop mode */ - mpu_cmd(midi_dev, 0x34, 0); /* Return timing bytes in stop mode */ - } - return 0; -} - -static void -mpu_synth_close(int dev) -{ - int midi_dev; - struct mpu_config *devc; - - midi_dev = synth_devs[dev]->midi_dev; - - devc = &dev_conf[midi_dev]; - mpu_cmd(midi_dev, 0x15, 0); /* Stop recording, playback and MIDI */ - mpu_cmd(midi_dev, 0x8a, 0); /* Disable data in stopped mode */ - - devc->inputintr = NULL; - - if (midi_devs[midi_dev]->coproc) - midi_devs[midi_dev]->coproc->close(midi_devs[midi_dev]->coproc->devc, COPR_MIDI); - devc->opened = 0; - devc->mode = 0; -} - -#define MIDI_SYNTH_NAME "MPU-401 UART Midi" -#define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT -#include - -static struct synth_operations mpu401_synth_proto = -{ - NULL, - 0, - SYNTH_TYPE_MIDI, - 0, - mpu_synth_open, - mpu_synth_close, - mpu_synth_ioctl, - midi_synth_kill_note, - midi_synth_start_note, - midi_synth_set_instr, - midi_synth_reset, - midi_synth_hw_control, - midi_synth_load_patch, - midi_synth_aftertouch, - midi_synth_controller, - midi_synth_panning, - NULL, - midi_synth_patchmgr, - midi_synth_bender, - NULL, /* alloc */ - midi_synth_setup_voice, - midi_synth_send_sysex -}; - -static struct synth_operations *mpu401_synth_operations[MAX_MIDI_DEV]; - -static struct midi_operations mpu401_midi_proto = -{ - {"MPU-401 Midi", 0, MIDI_CAP_MPU401, SNDCARD_MPU401}, - NULL, - {0}, - mpu401_open, - mpu401_close, - mpu401_ioctl, - mpu401_out, - mpu401_start_read, - mpu401_end_read, - mpu401_kick, - NULL, - mpu401_buffer_status, - mpu401_prefix_cmd -}; - -static struct midi_operations mpu401_midi_operations[MAX_MIDI_DEV]; - -static void -mpu401_chk_version(struct mpu_config * devc) -{ - int tmp; - - devc->version = devc->revision = 0; - - if ((tmp = mpu_cmd(num_midis, 0xAC, 0)) < 0) - return; - - if ((tmp & 0xf0) > 0x20)/* Why is it larger than 2.x ??? */ - return; - - devc->version = tmp; - - if ((tmp = mpu_cmd(num_midis, 0xAD, 0)) < 0) { - devc->version = 0; - return; - } - devc->revision = tmp; -} - -void -attach_mpu401(struct address_info * hw_config) -{ - u_long flags; - char revision_char; - - struct mpu_config *devc; - - if (num_midis >= MAX_MIDI_DEV) { - printf("MPU-401: Too many midi devices detected\n"); - return ; - } - devc = &dev_conf[num_midis]; - - devc->base = hw_config->io_base; - devc->osp = hw_config->osp; - devc->irq = hw_config->irq; - devc->opened = 0; - devc->uart_mode = 0; - devc->initialized = 0; - devc->version = 0; - devc->revision = 0; - devc->capabilities = 0; - devc->timer_flag = 0; - devc->m_busy = 0; - devc->m_state = ST_INIT; - devc->shared_irq = hw_config->always_detect; - devc->irq = hw_config->irq; - - if (devc->irq < 0) { - devc->irq *= -1; - devc->shared_irq = 1; - } - irq2dev[devc->irq] = num_midis; - - if (!hw_config->always_detect) { - /* Verify the hardware again */ - if (!reset_mpu401(devc)) - return ; - - if (!devc->shared_irq) - if (snd_set_irq_handler(devc->irq, mpuintr, devc->osp) < 0) { - return ; - } - flags = splhigh(); - mpu401_chk_version(devc); - if (devc->version == 0) - mpu401_chk_version(devc); - splx(flags); - }; - - if (devc->version != 0) - if (mpu_cmd(num_midis, 0xC5, 0) >= 0) /* Set timebase OK */ - if (mpu_cmd(num_midis, 0xE0, 120) >= 0) /* Set tempo OK */ - devc->capabilities |= MPU_CAP_INTLG; /* Supports intelligent - * mode */ - - mpu401_synth_operations[num_midis] = (struct synth_operations *) malloc(sizeof(struct synth_operations), M_DEVBUF, M_NOWAIT); - - if (!mpu401_synth_operations[num_midis]) - panic("SOUND: Cannot allocate memory\n"); - - if (mpu401_synth_operations[num_midis] == NULL) { - printf("mpu401: Can't allocate memory\n"); - return ; - } - if (!(devc->capabilities & MPU_CAP_INTLG)) { /* No intelligent mode */ - bcopy((char *) &std_midi_synth, (char *) mpu401_synth_operations[num_midis], sizeof(struct synth_operations)); - } else { - bcopy((char *) &mpu401_synth_proto, (char *) mpu401_synth_operations[num_midis], sizeof(struct synth_operations)); - } - - bcopy((char *) &mpu401_midi_proto, (char *) &mpu401_midi_operations[num_midis], sizeof(struct midi_operations)); - - mpu401_midi_operations[num_midis].converter = - mpu401_synth_operations[num_midis]; - - bcopy((char *) &mpu_synth_info_proto, (char *) &mpu_synth_info[num_midis], sizeof(struct synth_info)); - - n_mpu_devs++; - - if (devc->version == 0x20 && devc->revision >= 0x07) { /* MusicQuest interface */ - int ports = (devc->revision & 0x08) ? 32 : 16; - - devc->capabilities |= MPU_CAP_SYNC | MPU_CAP_SMPTE | - MPU_CAP_CLS | MPU_CAP_2PORT; - - revision_char = (devc->revision == 0x7f) ? 'M' : ' '; - snprintf(mpu_synth_info[num_midis].name, - sizeof(mpu_synth_info[num_midis].name), - "MQX-%d%c MIDI Interface #%d", - ports, - revision_char, - n_mpu_devs); - } else { - - revision_char = devc->revision ? devc->revision + '@' : ' '; - if ((int) devc->revision > ('Z' - '@')) - revision_char = '+'; - - devc->capabilities |= MPU_CAP_SYNC | MPU_CAP_FSK; - - snprintf(mpu_synth_info[num_midis].name, - sizeof(mpu_synth_info[num_midis].name), - "MPU-401 %d.%d%c Midi interface", - (int) (devc->version & 0xf0) >> 4, - devc->version & 0x0f, - revision_char); - } - - strcpy(mpu401_midi_operations[num_midis].info.name, - mpu_synth_info[num_midis].name); - - conf_printf(mpu_synth_info[num_midis].name, hw_config); - - mpu401_synth_operations[num_midis]->midi_dev = devc->devno = num_midis; - mpu401_synth_operations[devc->devno]->info = - &mpu_synth_info[devc->devno]; - - if (devc->capabilities & MPU_CAP_INTLG) /* Intelligent mode */ - mpu_timer_init(num_midis); - - irq2dev[devc->irq] = num_midis; - midi_devs[num_midis++] = &mpu401_midi_operations[devc->devno]; - return ; -} - -static int -reset_mpu401(struct mpu_config * devc) -{ - u_long flags; - int ok, timeout, n; - int timeout_limit; - - /* - * Send the RESET command. Try again if no success at the first time. - * (If the device is in the UART mode, it will not ack the reset - * cmd). - */ - - ok = 0; - - timeout_limit = devc->initialized ? 30000 : 100000; - devc->initialized = 1; - - for (n = 0; n < 2 && !ok; n++) { - for (timeout = timeout_limit; timeout > 0 && !ok; timeout--) - ok = output_ready(devc); - - write_command(devc, MPU_RESET); /* Send MPU-401 RESET Command */ - - /* - * 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 = timeout_limit * 2; timeout > 0 && !ok; timeout--) { - flags = splhigh(); - if ( (input_avail(devc)) && (read_data(devc) == MPU_ACK) ) - ok = 1; - splx(flags); - } - - } - - devc->m_state = ST_INIT; - devc->m_ptr = 0; - devc->m_left = 0; - devc->last_status = 0; - devc->uart_mode = 0; - - return ok; -} - -static void -set_uart_mode(int dev, struct mpu_config * devc, int arg) -{ - if (!arg && (devc->capabilities & MPU_CAP_INTLG)) - return; - if ((devc->uart_mode == 0) == (arg == 0)) - return; /* Already set */ - reset_mpu401(devc); /* This exits the uart mode */ - - if (arg && (mpu_cmd(dev, UART_MODE_ON, 0) < 0) ) { - printf("MPU%d: Can't enter UART mode\n", devc->devno); - devc->uart_mode = 0; - return; - } - devc->uart_mode = arg; -} - -int -probe_mpu401(struct address_info * hw_config) -{ - int ok = 0; - struct mpu_config tmp_devc; - - tmp_devc.base = hw_config->io_base; - tmp_devc.irq = hw_config->irq; - tmp_devc.initialized = 0; - tmp_devc.opened = 0; - tmp_devc.osp = hw_config->osp; - -#if defined(CONFIG_AEDSP16) && defined(AEDSP16_MPU401) - /* - * Initialize Audio Excel DSP 16 to MPU-401, before any operation. - */ - InitAEDSP16_MPU401(hw_config); -#endif - - if (hw_config->always_detect) - return 1; - - if (mpu401_status(&tmp_devc) == 0xff) { - DDB(printf("MPU401: Port %x looks dead.\n", hw_config->io_base)); - return 0; /* Just bus float? */ - } - ok = reset_mpu401(&tmp_devc); - - if (!ok) { - DDB(printf("MPU401: Reset failed on port %x\n", hw_config->io_base)); - } - return ok; -} - - -/* - * Timer stuff - */ - -#if defined(CONFIG_SEQUENCER) - -static volatile int timer_initialized = 0, timer_open = 0, tmr_running = 0; -static volatile int curr_tempo, curr_timebase, hw_timebase; -static int max_timebase = 8; /* 8*24=192 ppqn */ -static volatile u_long next_event_time; -static volatile u_long curr_ticks, curr_clocks; -static u_long prev_event_time; -static int metronome_mode; - -static u_long -clocks2ticks(u_long clocks) -{ - /* - * The MPU-401 supports just a limited set of possible timebase - * values. Since the applications require more choices, the driver - * has to program the HW to do its best and to convert between the - * HW and actual timebases. - */ - - return ((clocks * curr_timebase) + (hw_timebase / 2)) / hw_timebase; -} - -static void -set_timebase(int midi_dev, int val) -{ - int hw_val; - - if (val < 48) - val = 48; - if (val > 1000) - val = 1000; - - hw_val = val; - hw_val = (hw_val + 12) / 24; - if (hw_val > max_timebase) - hw_val = max_timebase; - - if (mpu_cmd(midi_dev, 0xC0 | (hw_val & 0x0f), 0) < 0) { - printf("MPU: Can't set HW timebase to %d\n", hw_val * 24); - return; - } - hw_timebase = hw_val * 24; - curr_timebase = val; -} - -static void -tmr_reset(void) -{ - u_long flags; - - flags = splhigh(); - next_event_time = 0xffffffff; - prev_event_time = 0; - curr_ticks = curr_clocks = 0; - splx(flags); -} - -static void -set_timer_mode(int midi_dev) -{ - if (timer_mode & TMR_MODE_CLS) - mpu_cmd(midi_dev, 0x3c, 0); /* Use CLS sync */ - else if (timer_mode & TMR_MODE_SMPTE) - mpu_cmd(midi_dev, 0x3d, 0); /* Use SMPTE sync */ - - if (timer_mode & TMR_INTERNAL) - mpu_cmd(midi_dev, 0x80, 0); /* Use MIDI sync */ - else { - if (timer_mode & (TMR_MODE_MIDI | TMR_MODE_CLS)) { - mpu_cmd(midi_dev, 0x82, 0); /* Use MIDI sync */ - mpu_cmd(midi_dev, 0x91, 0); /* Enable ext MIDI ctrl */ - } else if (timer_mode & TMR_MODE_FSK) - mpu_cmd(midi_dev, 0x81, 0); /* Use FSK sync */ - } -} - -static void -stop_metronome(int midi_dev) -{ - mpu_cmd(midi_dev, 0x84, 0); /* Disable metronome */ -} - -static void -setup_metronome(int midi_dev) -{ - int numerator, denominator; - int clks_per_click, num_32nds_per_beat; - int beats_per_measure; - - numerator = ((u_int) metronome_mode >> 24) & 0xff; - denominator = ((u_int) metronome_mode >> 16) & 0xff; - clks_per_click = ((u_int) metronome_mode >> 8) & 0xff; - num_32nds_per_beat = (u_int) metronome_mode & 0xff; - beats_per_measure = (numerator * 4) >> denominator; - - if (!metronome_mode) - mpu_cmd(midi_dev, 0x84, 0); /* Disable metronome */ - else { - mpu_cmd(midi_dev, 0xE4, clks_per_click); - mpu_cmd(midi_dev, 0xE6, beats_per_measure); - mpu_cmd(midi_dev, 0x83, 0); /* Enable metronome without - * accents */ - } -} - -static int -mpu_start_timer(int midi_dev) -{ - tmr_reset(); - set_timer_mode(midi_dev); - - if (tmr_running) - return TIMER_NOT_ARMED; /* Already running */ - - if (timer_mode & TMR_INTERNAL) { - mpu_cmd(midi_dev, 0x02, 0); /* Send MIDI start */ - tmr_running = 1; - return TIMER_NOT_ARMED; - } else { - mpu_cmd(midi_dev, 0x35, 0); /* Enable mode messages to PC */ - mpu_cmd(midi_dev, 0x38, 0); /* Enable sys common messages to PC */ - mpu_cmd(midi_dev, 0x39, 0); /* Enable real time messages to PC */ - mpu_cmd(midi_dev, 0x97, 0); /* Enable system exclusive - * messages to PC */ - } - - return TIMER_ARMED; -} - -static int -mpu_timer_open(int dev, int mode) -{ - int midi_dev = sound_timer_devs[dev]->devlink; - - if (timer_open) - return -(EBUSY); - - tmr_reset(); - curr_tempo = 50; - mpu_cmd(midi_dev, 0xE0, 50); - curr_timebase = hw_timebase = 120; - set_timebase(midi_dev, 120); - timer_open = 1; - metronome_mode = 0; - set_timer_mode(midi_dev); - - mpu_cmd(midi_dev, 0xe7, 0x04); /* Send all clocks to host */ - mpu_cmd(midi_dev, 0x95, 0); /* Enable clock to host */ - - return 0; -} - -static void -mpu_timer_close(int dev) -{ - int midi_dev = sound_timer_devs[dev]->devlink; - - timer_open = tmr_running = 0; - mpu_cmd(midi_dev, 0x15, 0); /* Stop all */ - mpu_cmd(midi_dev, 0x94, 0); /* Disable clock to host */ - mpu_cmd(midi_dev, 0x8c, 0); /* Disable measure end messages to - * host */ - stop_metronome(midi_dev); -} - -static int -mpu_timer_event(int dev, u_char *event) -{ - u_char command = event[1]; - u_long parm = *(u_int *) &event[4]; - int midi_dev = sound_timer_devs[dev]->devlink; - - switch (command) { - case TMR_WAIT_REL: - parm += prev_event_time; - case TMR_WAIT_ABS: - if (parm > 0) { - long time; - - if (parm <= curr_ticks) /* It's the time */ - return TIMER_NOT_ARMED; - - time = parm; - next_event_time = prev_event_time = time; - - return TIMER_ARMED; - } - break; - - case TMR_START: - if (tmr_running) - break; - return mpu_start_timer(midi_dev); - break; - - case TMR_STOP: - mpu_cmd(midi_dev, 0x01, 0); /* Send MIDI stop */ - stop_metronome(midi_dev); - tmr_running = 0; - break; - - case TMR_CONTINUE: - if (tmr_running) - break; - mpu_cmd(midi_dev, 0x03, 0); /* Send MIDI continue */ - setup_metronome(midi_dev); - tmr_running = 1; - break; - - case TMR_TEMPO: - if (parm) { - if (parm < 8) - parm = 8; - if (parm > 250) - parm = 250; - - if (mpu_cmd(midi_dev, 0xE0, parm) < 0) - printf("MPU: Can't set tempo to %d\n", (int) parm); - curr_tempo = parm; - } - break; - - case TMR_ECHO: - seq_copy_to_input(event, 8); - break; - - case TMR_TIMESIG: - if (metronome_mode) { /* Metronome enabled */ - metronome_mode = parm; - setup_metronome(midi_dev); - } - break; - - default:; - } - - return TIMER_NOT_ARMED; -} - -static u_long -mpu_timer_get_time(int dev) -{ - if (!timer_open) - return 0; - - return curr_ticks; -} - -static int -mpu_timer_ioctl(int dev, u_int command, ioctl_arg arg) -{ - int midi_dev = sound_timer_devs[dev]->devlink; - - switch (command) { - case SNDCTL_TMR_SOURCE: - { - int parm = (int) (*(int *) arg) & timer_caps; - - if (parm != 0) { - timer_mode = parm; - - if (timer_mode & TMR_MODE_CLS) - mpu_cmd(midi_dev, 0x3c, 0); /* Use CLS sync */ - else if (timer_mode & TMR_MODE_SMPTE) - mpu_cmd(midi_dev, 0x3d, 0); /* Use SMPTE sync */ - } - return *(int *) arg = timer_mode; - } - break; - - case SNDCTL_TMR_START: - mpu_start_timer(midi_dev); - return 0; - break; - - case SNDCTL_TMR_STOP: - tmr_running = 0; - mpu_cmd(midi_dev, 0x01, 0); /* Send MIDI stop */ - stop_metronome(midi_dev); - return 0; - break; - - case SNDCTL_TMR_CONTINUE: - if (tmr_running) - return 0; - tmr_running = 1; - mpu_cmd(midi_dev, 0x03, 0); /* Send MIDI continue */ - return 0; - break; - - case SNDCTL_TMR_TIMEBASE: - { - int val = (int) (*(int *) arg); - - if (val) - set_timebase(midi_dev, val); - - return *(int *) arg = curr_timebase; - } - break; - - case SNDCTL_TMR_TEMPO: - { - int val = (int) (*(int *) arg); - int ret; - - if (val) { - RANGE (val, 8 , 250 ); - if ((ret = mpu_cmd(midi_dev, 0xE0, val)) < 0) { - printf("MPU: Can't set tempo to %d\n", (int) val); - return ret; - } - curr_tempo = val; - } - return *(int *) arg = curr_tempo; - } - break; - - case SNDCTL_SEQ_CTRLRATE: - if ((*(int *) arg) != 0) /* Can't change */ - return -(EINVAL); - - return *(int *) arg = ((curr_tempo * curr_timebase) + 30) / 60; - break; - - case SNDCTL_TMR_METRONOME: - metronome_mode = (int) (*(int *) arg); - setup_metronome(midi_dev); - return 0; - break; - - default:; - } - - return -(EINVAL); -} - -static void -mpu_timer_arm(int dev, long time) -{ - if (time < 0) - time = curr_ticks + 1; - else if (time <= curr_ticks) /* It's the time */ - return; - - next_event_time = prev_event_time = time; - - return; -} - -static struct sound_timer_operations mpu_timer = -{ - {"MPU-401 Timer", 0}, - 10, /* Priority */ - 0, /* Local device link */ - mpu_timer_open, - mpu_timer_close, - mpu_timer_event, - mpu_timer_get_time, - mpu_timer_ioctl, - mpu_timer_arm -}; - -static void -mpu_timer_interrupt(void) -{ - - if (!timer_open) - return; - - if (!tmr_running) - return; - - curr_clocks++; - curr_ticks = clocks2ticks(curr_clocks); - - if (curr_ticks >= next_event_time) { - next_event_time = 0xffffffff; - sequencer_timer(0); - } -} - -static void -timer_ext_event(struct mpu_config * devc, int event, int parm) -{ - int midi_dev = devc->devno; - - if (!devc->timer_flag) - return; - - switch (event) { - case TMR_CLOCK: - printf(""); - break; - - case TMR_START: - printf("Ext MIDI start\n"); - if (!tmr_running) - if (timer_mode & TMR_EXTERNAL) { - tmr_running = 1; - setup_metronome(midi_dev); - next_event_time = 0; - STORE(SEQ_START_TIMER()); - } - break; - - case TMR_STOP: - printf("Ext MIDI stop\n"); - if (timer_mode & TMR_EXTERNAL) { - tmr_running = 0; - stop_metronome(midi_dev); - STORE(SEQ_STOP_TIMER()); - } - break; - - case TMR_CONTINUE: - printf("Ext MIDI continue\n"); - if (timer_mode & TMR_EXTERNAL) { - tmr_running = 1; - setup_metronome(midi_dev); - STORE(SEQ_CONTINUE_TIMER()); - } - break; - - case TMR_SPP: - printf("Songpos: %d\n", parm); - if (timer_mode & TMR_EXTERNAL) { - STORE(SEQ_SONGPOS(parm)); - } - break; - } -} - -static void -mpu_timer_init(int midi_dev) -{ - struct mpu_config *devc; - int n; - - devc = &dev_conf[midi_dev]; - - if (timer_initialized) - return; /* There is already a similar timer */ - - timer_initialized = 1; - - mpu_timer.devlink = midi_dev; - dev_conf[midi_dev].timer_flag = 1; - - if (num_sound_timers >= MAX_TIMER_DEV) - n = 0; /* Overwrite the system timer */ - else - n = num_sound_timers++; - sound_timer_devs[n] = &mpu_timer; - - if (devc->version < 0x20) /* Original MPU-401 */ - timer_caps = TMR_INTERNAL | TMR_EXTERNAL | TMR_MODE_FSK | TMR_MODE_MIDI; - else { - /* - * The version number 2.0 is used (at least) by the - * MusicQuest cards and the Roland Super-MPU. - * - * MusicQuest has given a special meaning to the bits of the - * revision number. The Super-MPU returns 0. - */ - - if (devc->revision) - timer_caps |= TMR_EXTERNAL | TMR_MODE_MIDI; - - if (devc->revision & 0x02) - timer_caps |= TMR_MODE_CLS; - - - if (devc->revision & 0x40) - max_timebase = 10; /* Has the 216 and 240 ppqn modes */ - } - timer_mode = (TMR_INTERNAL | TMR_MODE_MIDI) & timer_caps; -} - -#endif - -#endif diff --git a/sys/i386/isa/sound/opl3.c b/sys/i386/isa/sound/opl3.c deleted file mode 100644 index 1302437..0000000 --- a/sys/i386/isa/sound/opl3.c +++ /dev/null @@ -1,1137 +0,0 @@ -/* - * sound/opl3.c - * - * A low level driver for Yamaha YM3812 and OPL-3 -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 - * 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. - * - * $FreeBSD$ - * - */ - -/* - * Major improvements to the FM handling 30AUG92 by Rob Hooft, - */ -/* - * hooft@chem.ruu.nl - */ -#include - - -#if defined(CONFIG_YM3812) - -#include -#include - -#define MAX_VOICE 18 -#define OFFS_4OP 11 - -struct voice_info { - u_char keyon_byte; - long bender; - long bender_range; - u_long orig_freq; - u_long current_freq; - int volume; - int mode; -}; - -typedef struct opl_devinfo { - int left_io, right_io; - int nr_voice; - int lv_map[MAX_VOICE]; - - struct voice_info voc[MAX_VOICE]; - struct voice_alloc_info *v_alloc; - struct channel_info *chn_info; - - struct sbi_instrument i_map[SBFM_MAXINSTR]; - struct sbi_instrument *act_i[MAX_VOICE]; - - struct synth_info fm_info; - - int busy; - int model; - u_char cmask; - - int is_opl4; - sound_os_info *osp; -} - opl_devinfo; - -static struct opl_devinfo *devc = NULL; - - -static int detected_model; - -static int store_instr(int instr_no, struct sbi_instrument * instr); -static void freq_to_fnum(int freq, int *block, int *fnum); -static void opl3_command(int io_addr, u_int addr, u_int val); -static int opl3_kill_note(int dev, int voice, int note, int velocity); - -void -enable_opl3_mode(int left, int right, int both) -{ - /* NOP */ -} - -static void -enter_4op_mode(void) -{ - int i; - static int v4op[MAX_VOICE] = - {0, 1, 2, 9, 10, 11, 6, 7, 8, 15, 16, 17}; - - devc->cmask = 0x3f; /* Connect all possible 4 OP voice operators */ - opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, 0x3f); - - for (i = 0; i < 3; i++) - pv_map[i].voice_mode = 4; - for (i = 3; i < 6; i++) - pv_map[i].voice_mode = 0; - - for (i = 9; i < 12; i++) - pv_map[i].voice_mode = 4; - for (i = 12; i < 15; i++) - pv_map[i].voice_mode = 0; - - for (i = 0; i < 12; i++) - devc->lv_map[i] = v4op[i]; - devc->v_alloc->max_voice = devc->nr_voice = 12; -} - -static int -opl3_ioctl(int dev, - u_int cmd, ioctl_arg arg) -{ - switch (cmd) { - - case SNDCTL_FM_LOAD_INSTR: - { - struct sbi_instrument ins; - - bcopy(&(((char *) arg)[0]), (char *) &ins, sizeof(ins)); - - if (ins.channel < 0 || ins.channel >= SBFM_MAXINSTR) { - printf("FM Error: Invalid instrument number %d\n", ins.channel); - return -(EINVAL); - } - pmgr_inform(dev, PM_E_PATCH_LOADED, ins.channel, 0, 0, 0); - return store_instr(ins.channel, &ins); - } - break; - - case SNDCTL_SYNTH_INFO: - devc->fm_info.nr_voices = (devc->nr_voice == 12) ? 6 : devc->nr_voice; - bcopy(&devc->fm_info, &(((char *) arg)[0]), sizeof(devc->fm_info)); - return 0; - break; - - case SNDCTL_SYNTH_MEMAVL: - return 0x7fffffff; - break; - - case SNDCTL_FM_4OP_ENABLE: - if (devc->model == 2) - enter_4op_mode(); - return 0; - break; - - default: - return -(EINVAL); - } - -} - -int -opl3_detect(int ioaddr, sound_os_info * osp) -{ - /* - * This function returns 1 if the FM chip is present at the given - * I/O port The detection algorithm plays with the timer built in the - * FM chip and looks for a change in the status register. - * - * Note! The timers of the FM chip are not connected to AdLib (and - * compatible) boards. - * - * Note2! The chip is initialized if detected. - */ - - u_char stat1, stat2, signature; - int i; - - if (devc != NULL) - return 0; - - devc = (struct opl_devinfo *) malloc(sizeof(*devc), M_DEVBUF, M_NOWAIT); - if (!devc) - panic("SOUND: Cannot allocate memory\n"); - - if (devc == NULL) { - printf("OPL3: Can't allocate memory for device control structure\n"); - return 0; - } - devc->osp = osp; - - /* Reset timers 1 and 2 */ - opl3_command(ioaddr, TIMER_CONTROL_REGISTER, TIMER1_MASK | TIMER2_MASK); - - /* Reset the IRQ of the FM chip */ - opl3_command(ioaddr, TIMER_CONTROL_REGISTER, IRQ_RESET); - - signature = stat1 = inb(ioaddr); /* Status register */ - - if ((stat1 & 0xE0) != 0x00) { - return 0; /* Should be 0x00 */ - } - opl3_command(ioaddr, TIMER1_REGISTER, 0xff); /* Set timer1 to 0xff */ - - opl3_command(ioaddr, TIMER_CONTROL_REGISTER, - TIMER2_MASK | TIMER1_START); /* Unmask and start timer 1 */ - - - DELAY(150); /* Now we have to delay at least 80 usec */ - - stat2 = inb(ioaddr); /* Read status after timers have expired */ - - /* - * Stop the timers - */ - - /* Reset timers 1 and 2 */ - opl3_command(ioaddr, TIMER_CONTROL_REGISTER, TIMER1_MASK | TIMER2_MASK); - /* Reset the IRQ of the FM chip */ - opl3_command(ioaddr, TIMER_CONTROL_REGISTER, IRQ_RESET); - - if ((stat2 & 0xE0) != 0xc0) { - return 0; /* There is no YM3812 */ - } - /* - * There is a FM chicp in this address. Detect the type (OPL2 to - * OPL4) - */ - - if (signature == 0x06) {/* OPL2 */ - detected_model = 2; - } else if (signature == 0x00) { /* OPL3 or OPL4 */ - u_char tmp; - - detected_model = 3; - - /* - * Detect availability of OPL4 (_experimental_). Works - * propably only after a cold boot. In addition the OPL4 port - * of the chip may not be connected to the PC bus at all. - */ - - opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, 0x00); - opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, OPL3_ENABLE | OPL4_ENABLE); - - if ((tmp = inb(ioaddr)) == 0x02) { /* Have a OPL4 */ - detected_model = 4; - } - if (!0) { /* OPL4 port is free */ /* XXX check here lr970711 */ - int tmp; - - outb(ioaddr - 8, 0x02); /* Select OPL4 ID register */ - DELAY(10); - tmp = inb(ioaddr - 7); /* Read it */ - DELAY(10); - - if (tmp == 0x20) { /* OPL4 should return 0x20 here */ - detected_model = 4; - - outb(ioaddr - 8, 0xF8); /* Select OPL4 FM mixer control */ - DELAY(10); - outb(ioaddr - 7, 0x1B); /* Write value */ - DELAY(10); - } else - detected_model = 3; - } - opl3_command(ioaddr + 2, OPL3_MODE_REGISTER, 0); - - } - for (i = 0; i < 9; i++) - opl3_command(ioaddr, KEYON_BLOCK + i, 0); /* Note off */ - - opl3_command(ioaddr, TEST_REGISTER, ENABLE_WAVE_SELECT); - opl3_command(ioaddr, PERCUSSION_REGISTER, 0x00); /* Melodic mode. */ - - return 1; -} - -static int -opl3_kill_note(int dev, int voice, int note, int velocity) -{ - struct physical_voice_info *map; - - if (voice < 0 || voice >= devc->nr_voice) - return 0; - - devc->v_alloc->map[voice] = 0; - - map = &pv_map[devc->lv_map[voice]]; - - DEB(printf("Kill note %d\n", voice)); - - if (map->voice_mode == 0) - return 0; - - opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, - devc->voc[voice].keyon_byte & ~0x20); - - devc->voc[voice].keyon_byte = 0; - devc->voc[voice].bender = 0; - devc->voc[voice].volume = 64; - devc->voc[voice].bender_range = 200; /* 200 cents = 2 semitones */ - devc->voc[voice].orig_freq = 0; - devc->voc[voice].current_freq = 0; - devc->voc[voice].mode = 0; - - return 0; -} - -#define HIHAT 0 -#define CYMBAL 1 -#define TOMTOM 2 -#define SNARE 3 -#define BDRUM 4 -#define UNDEFINED TOMTOM -#define DEFAULT TOMTOM - -static int -store_instr(int instr_no, struct sbi_instrument * instr) -{ - - if (instr->key !=FM_PATCH && (instr->key !=OPL3_PATCH || devc->model != 2)) - printf("FM warning: Invalid patch format field (key) 0x%x\n", - instr->key); - bcopy((char *) instr, (char *) &(devc->i_map[instr_no]), sizeof(*instr)); - - return 0; -} - -static int -opl3_set_instr(int dev, int voice, int instr_no) -{ - if (voice < 0 || voice >= devc->nr_voice) - return 0; - - if (instr_no < 0 || instr_no >= SBFM_MAXINSTR) - return 0; - - devc->act_i[voice] = &devc->i_map[instr_no]; - return 0; -} - -/* - * The next table looks magical, but it certainly is not. Its values have - * been calculated as table[i]=8*log(i/64)/log(2) with an obvious exception - * for i=0. This log-table converts a linear volume-scaling (0..127) to a - * logarithmic scaling as present in the FM-synthesizer chips. so : Volume - * 64 = 0 db = relative volume 0 and: Volume 32 = -6 db = relative - * volume -8 it was implemented as a table because it is only 128 bytes and - * it saves a lot of log() calculations. (RH) - */ -static char fm_volume_table[128] = -{ - -64, -48, -40, -35, -32, -29, -27, -26, - -24, -23, -21, -20, -19, -18, -18, -17, - -16, -15, -15, -14, -13, -13, -12, -12, - -11, -11, -10, -10, -10, -9, -9, -8, - -8, -8, -7, -7, -7, -6, -6, -6, - -5, -5, -5, -5, -4, -4, -4, -4, - -3, -3, -3, -3, -2, -2, -2, -2, - -2, -1, -1, -1, -1, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 1, - 1, 2, 2, 2, 2, 2, 2, 2, - 3, 3, 3, 3, 3, 3, 3, 4, - 4, 4, 4, 4, 4, 4, 4, 5, - 5, 5, 5, 5, 5, 5, 5, 5, - 6, 6, 6, 6, 6, 6, 6, 6, - 6, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 8, 8, 8, 8, 8}; - -static void -calc_vol(u_char *regbyte, int volume, int main_vol) -{ - int level = (~*regbyte & 0x3f); - - if (main_vol > 127) - main_vol = 127; - - volume = (volume * main_vol) / 127; - - if (level) - level += fm_volume_table[volume]; - - RANGE (level, 0, 0x3f ); - - *regbyte = (*regbyte & 0xc0) | (~level & 0x3f); -} - -static void -set_voice_volume(int voice, int volume, int main_vol) -{ - u_char vol1, vol2, vol3, vol4; - struct sbi_instrument *instr; - struct physical_voice_info *map; - - if (voice < 0 || voice >= devc->nr_voice) - return; - - map = &pv_map[devc->lv_map[voice]]; - - instr = devc->act_i[voice]; - - if (!instr) - instr = &devc->i_map[0]; - - if (instr->channel < 0) - return; - - if (devc->voc[voice].mode == 0) - return; - - if (devc->voc[voice].mode == 2) { - - vol1 = instr->operators[2]; - vol2 = instr->operators[3]; - - if ((instr->operators[10] & 0x01)) { - calc_vol(&vol1, volume, main_vol); - } - calc_vol(&vol2, volume, main_vol); - - opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], vol1); - opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], vol2); - } else { /* 4 OP voice */ - int connection; - - vol1 = instr->operators[2]; - vol2 = instr->operators[3]; - vol3 = instr->operators[OFFS_4OP + 2]; - vol4 = instr->operators[OFFS_4OP + 3]; - - /* - * The connection method for 4 OP devc->voc is defined by the - * rightmost bits at the offsets 10 and 10+OFFS_4OP - */ - - connection = ((instr->operators[10] & 0x01) << 1) | (instr->operators[10 + OFFS_4OP] & 0x01); - - switch (connection) { - case 0: - calc_vol(&vol4, volume, main_vol); - break; - - case 1: - calc_vol(&vol2, volume, main_vol); - calc_vol(&vol4, volume, main_vol); - break; - - case 2: - calc_vol(&vol1, volume, main_vol); - calc_vol(&vol4, volume, main_vol); - break; - - case 3: - calc_vol(&vol1, volume, main_vol); - calc_vol(&vol3, volume, main_vol); - calc_vol(&vol4, volume, main_vol); - break; - - default:; - } - - opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], vol1); - opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], vol2); - opl3_command(map->ioaddr, KSL_LEVEL + map->op[2], vol3); - opl3_command(map->ioaddr, KSL_LEVEL + map->op[3], vol4); - } -} - -static int -opl3_start_note(int dev, int voice, int note, int volume) -{ - u_char data, fpc; - int block, fnum, freq, voice_mode; - struct sbi_instrument *instr; - struct physical_voice_info *map; - - if (voice < 0 || voice >= devc->nr_voice) - return 0; - - map = &pv_map[devc->lv_map[voice]]; - - if (map->voice_mode == 0) - return 0; - - if (note == 255) { /* Just change the volume */ - set_voice_volume(voice, volume, devc->voc[voice].volume); - return 0; - } - /* - * Kill previous note before playing - */ - opl3_command(map->ioaddr, KSL_LEVEL + map->op[1], 0xff); /* Carrier volume to min */ - opl3_command(map->ioaddr, KSL_LEVEL + map->op[0], 0xff); /* Modulator volume to */ - - if (map->voice_mode == 4) { - opl3_command(map->ioaddr, KSL_LEVEL + map->op[2], 0xff); - opl3_command(map->ioaddr, KSL_LEVEL + map->op[3], 0xff); - } - opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, 0x00); /* Note off */ - - instr = devc->act_i[voice]; - - if (!instr) - instr = &devc->i_map[0]; - - if (instr->channel < 0) { - printf( "OPL3: Initializing voice %d with undefined instrument\n", - voice); - return 0; - } - if (map->voice_mode == 2 && instr->key == OPL3_PATCH) - return 0; /* Cannot play */ - - voice_mode = map->voice_mode; - - if (voice_mode == 4) { - int voice_shift; - - voice_shift = (map->ioaddr == devc->left_io) ? 0 : 3; - voice_shift += map->voice_num; - - if (instr->key != OPL3_PATCH) { /* Just 2 OP patch */ - voice_mode = 2; - devc->cmask &= ~(1 << voice_shift); - } else - devc->cmask |= (1 << voice_shift); - - opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, devc->cmask); - } - /* - * Set Sound Characteristics - */ - opl3_command(map->ioaddr, AM_VIB + map->op[0], instr->operators[0]); - opl3_command(map->ioaddr, AM_VIB + map->op[1], instr->operators[1]); - - /* - * Set Attack/Decay - */ - opl3_command(map->ioaddr, ATTACK_DECAY + map->op[0], instr->operators[4]); - opl3_command(map->ioaddr, ATTACK_DECAY + map->op[1], instr->operators[5]); - - /* - * Set Sustain/Release - */ - opl3_command(map->ioaddr,SUSTAIN_RELEASE + map->op[0], instr->operators[6]); - opl3_command(map->ioaddr,SUSTAIN_RELEASE + map->op[1], instr->operators[7]); - - /* - * Set Wave Select - */ - opl3_command(map->ioaddr, WAVE_SELECT + map->op[0], instr->operators[8]); - opl3_command(map->ioaddr, WAVE_SELECT + map->op[1], instr->operators[9]); - - /* - * Set Feedback/Connection - */ - fpc = instr->operators[10]; - if (!(fpc & 0x30)) - fpc |= 0x30; /* Ensure that at least one chn is enabled */ - opl3_command(map->ioaddr, FEEDBACK_CONNECTION + map->voice_num, fpc); - - /* - * If the voice is a 4 OP one, initialize the operators 3 and 4 also - */ - - if (voice_mode == 4) { - - /* - * Set Sound Characteristics - */ - opl3_command(map->ioaddr, AM_VIB + map->op[2], - instr->operators[OFFS_4OP + 0]); - opl3_command(map->ioaddr, AM_VIB + map->op[3], - instr->operators[OFFS_4OP + 1]); - - /* - * Set Attack/Decay - */ - opl3_command(map->ioaddr, ATTACK_DECAY + map->op[2], - instr->operators[OFFS_4OP + 4]); - opl3_command(map->ioaddr, ATTACK_DECAY + map->op[3], - instr->operators[OFFS_4OP + 5]); - - /* - * Set Sustain/Release - */ - opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[2], - instr->operators[OFFS_4OP + 6]); - opl3_command(map->ioaddr, SUSTAIN_RELEASE + map->op[3], - instr->operators[OFFS_4OP + 7]); - - /* - * Set Wave Select - */ - opl3_command(map->ioaddr, WAVE_SELECT + map->op[2], - instr->operators[OFFS_4OP + 8]); - opl3_command(map->ioaddr, WAVE_SELECT + map->op[3], - instr->operators[OFFS_4OP + 9]); - - /* - * Set Feedback/Connection - */ - fpc = instr->operators[OFFS_4OP + 10]; - if (!(fpc & 0x30)) - fpc |= 0x30; /* Ensure that at least one chn is enabled */ - opl3_command(map->ioaddr,FEEDBACK_CONNECTION + map->voice_num + 3, fpc); - } - devc->voc[voice].mode = voice_mode; - - set_voice_volume(voice, volume, devc->voc[voice].volume); - - freq = devc->voc[voice].orig_freq = note_to_freq(note) / 1000; - - /* - * Since the pitch bender may have been set before playing the note, - * we have to calculate the bending now. - */ - - freq = compute_finetune(devc->voc[voice].orig_freq, - devc->voc[voice].bender, devc->voc[voice].bender_range); - devc->voc[voice].current_freq = freq; - - freq_to_fnum(freq, &block, &fnum); - - /* - * Play note - */ - - data = fnum & 0xff; /* Least significant bits of fnumber */ - opl3_command(map->ioaddr, FNUM_LOW + map->voice_num, data); - - data = 0x20 | ((block & 0x7) << 2) | ((fnum >> 8) & 0x3); - devc->voc[voice].keyon_byte = data; - opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, data); - if (voice_mode == 4) - opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num + 3, data); - - return 0; -} - -static void -freq_to_fnum(int freq, int *block, int *fnum) -{ - int f, octave; - - /* - * Converts the note frequency to block and fnum values for the FM - * chip - */ - /* - * First try to compute the block -value (octave) where the note - * belongs - */ - - f = freq; - - octave = 5; - - if (f == 0) - octave = 0; - else if (f < 261) { - while (f < 261) { - octave--; - f <<= 1; - } - } else if (f > 493) { - while (f > 493) { - octave++; - f >>= 1; - } - } - if (octave > 7) - octave = 7; - - *fnum = freq * (1 << (20 - octave)) / 49716; - *block = octave; -} - -static void -opl3_command(int io_addr, u_int addr, u_int val) -{ - int i; - - /* - * The original 2-OP synth requires a quite long delay after writing - * to a register. The OPL-3 survives with just two INBs - */ - - outb(io_addr, (u_char) (addr & 0xff)); - - if (!devc->model != 2) - DELAY(10); - else - for (i = 0; i < 2; i++) - inb(io_addr); - -#ifdef PC98 - outb(io_addr + 0x100, (u_char) (val & 0xff)); -#else - outb(io_addr + 1, (u_char) (val & 0xff)); -#endif - if (devc->model != 2) - DELAY(30); - else - for (i = 0; i < 2; i++) - inb(io_addr); -} - -static void -opl3_reset(int dev) -{ - int i; - - for (i = 0; i < 18; i++) - devc->lv_map[i] = i; - - for (i = 0; i < devc->nr_voice; i++) { - opl3_command(pv_map[devc->lv_map[i]].ioaddr, - KSL_LEVEL + pv_map[devc->lv_map[i]].op[0], 0xff); - - opl3_command(pv_map[devc->lv_map[i]].ioaddr, - KSL_LEVEL + pv_map[devc->lv_map[i]].op[1], 0xff); - - if (pv_map[devc->lv_map[i]].voice_mode == 4) { - opl3_command(pv_map[devc->lv_map[i]].ioaddr, - KSL_LEVEL + pv_map[devc->lv_map[i]].op[2], 0xff); - - opl3_command(pv_map[devc->lv_map[i]].ioaddr, - KSL_LEVEL + pv_map[devc->lv_map[i]].op[3], 0xff); - } - opl3_kill_note(dev, i, 0, 64); - } - - if (devc->model == 2) { - devc->v_alloc->max_voice = devc->nr_voice = 18; - - for (i = 0; i < 18; i++) - pv_map[i].voice_mode = 2; - - } -} - -static int -opl3_open(int dev, int mode) -{ - int i; - - if (devc->busy) - return -(EBUSY); - devc->busy = 1; - - devc->v_alloc->max_voice = devc->nr_voice = (devc->model == 2) ? 18 : 9; - devc->v_alloc->timestamp = 0; - - for (i = 0; i < 18; i++) { - devc->v_alloc->map[i] = 0; - devc->v_alloc->alloc_times[i] = 0; - } - - devc->cmask = 0x00; /* Just 2 OP mode */ - if (devc->model == 2) - opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, devc->cmask); - return 0; -} - -static void -opl3_close(int dev) -{ - devc->busy = 0; - devc->v_alloc->max_voice = devc->nr_voice = (devc->model == 2) ? 18 : 9; - - devc->fm_info.nr_drums = 0; - devc->fm_info.perc_mode = 0; - - opl3_reset(dev); -} - -static void -opl3_hw_control(int dev, u_char *event) -{ -} - -static int -opl3_load_patch(int dev, int format, snd_rw_buf * addr, - int offs, int count, int pmgr_flag) -{ - struct sbi_instrument ins; - - if (count < sizeof(ins)) { - printf("FM Error: Patch record too short\n"); - return -(EINVAL); - } - if (uiomove(&((char *) &ins)[offs], sizeof(ins) - offs, addr)) { - printf("sb: Bad copyin()!\n"); - }; - - if (ins.channel < 0 || ins.channel >= SBFM_MAXINSTR) { - printf("FM Error: Invalid instrument number %d\n", ins.channel); - return -(EINVAL); - } - ins.key = format; - - return store_instr(ins.channel, &ins); -} - -static void -opl3_panning(int dev, int voice, int pressure) -{ -} - -static void -opl3_volume_method(int dev, int mode) -{ -} - -#define SET_VIBRATO(cell) { \ - tmp = instr->operators[(cell-1)+(((cell-1)/2)*OFFS_4OP)]; \ - if (pressure > 110) \ - tmp |= 0x40; /* Vibrato on */ \ - opl3_command (map->ioaddr, AM_VIB + map->op[cell-1], tmp);} - -static void -opl3_aftertouch(int dev, int voice, int pressure) -{ - int tmp; - struct sbi_instrument *instr; - struct physical_voice_info *map; - - if (voice < 0 || voice >= devc->nr_voice) - return; - - map = &pv_map[devc->lv_map[voice]]; - - DEB(printf("Aftertouch %d\n", voice)); - - if (map->voice_mode == 0) - return; - - /* - * Adjust the amount of vibrato depending the pressure - */ - - instr = devc->act_i[voice]; - - if (!instr) - instr = &devc->i_map[0]; - - if (devc->voc[voice].mode == 4) { - int connection = ((instr->operators[10] & 0x01) << 1) | (instr->operators[10 + OFFS_4OP] & 0x01); - - switch (connection) { - case 0: - SET_VIBRATO(4); - break; - - case 1: - SET_VIBRATO(2); - SET_VIBRATO(4); - break; - - case 2: - SET_VIBRATO(1); - SET_VIBRATO(4); - break; - - case 3: - SET_VIBRATO(1); - SET_VIBRATO(3); - SET_VIBRATO(4); - break; - - } - /* - * Not implemented yet - */ - } else { - SET_VIBRATO(1); - - if ((instr->operators[10] & 0x01)) /* Additive synthesis */ - SET_VIBRATO(2); - } -} - -#undef SET_VIBRATO - -static void -bend_pitch(int dev, int voice, int value) -{ - u_char data; - int block, fnum, freq; - struct physical_voice_info *map; - - map = &pv_map[devc->lv_map[voice]]; - - if (map->voice_mode == 0) - return; - - devc->voc[voice].bender = value; - if (!value) - return; - if (!(devc->voc[voice].keyon_byte & 0x20)) - return; /* Not keyed on */ - - freq = compute_finetune(devc->voc[voice].orig_freq, devc->voc[voice].bender, devc->voc[voice].bender_range); - devc->voc[voice].current_freq = freq; - - freq_to_fnum(freq, &block, &fnum); - - data = fnum & 0xff; /* Least significant bits of fnumber */ - opl3_command(map->ioaddr, FNUM_LOW + map->voice_num, data); - - data = 0x20 | ((block & 0x7) << 2) | ((fnum >> 8) & 0x3); - /* KEYON|OCTAVE|MS bits of f-num */ - devc->voc[voice].keyon_byte = data; - opl3_command(map->ioaddr, KEYON_BLOCK + map->voice_num, data); -} - -static void -opl3_controller(int dev, int voice, int ctrl_num, int value) -{ - if (voice < 0 || voice >= devc->nr_voice) - return; - - switch (ctrl_num) { - case CTRL_PITCH_BENDER: - bend_pitch(dev, voice, value); - break; - - case CTRL_PITCH_BENDER_RANGE: - devc->voc[voice].bender_range = value; - break; - - case CTL_MAIN_VOLUME: - devc->voc[voice].volume = value / 128; - break; - } -} - -static int -opl3_patchmgr(int dev, struct patmgr_info * rec) -{ - return -(EINVAL); -} - -static void -opl3_bender(int dev, int voice, int value) -{ - if (voice < 0 || voice >= devc->nr_voice) - return; - - bend_pitch(dev, voice, value - 8192); -} - -static int -opl3_alloc_voice(int dev, int chn, int note, struct voice_alloc_info * alloc) -{ - int i, p, best, first, avail, best_time = 0x7fffffff; - struct sbi_instrument *instr; - int is4op; - int instr_no; - - if (chn < 0 || chn > 15) - instr_no = 0; - else - instr_no = devc->chn_info[chn].pgm_num; - - instr = &devc->i_map[instr_no]; - if (instr->channel < 0 || /* Instrument not loaded */ - devc->nr_voice != 12) /* Not in 4 OP mode */ - is4op = 0; - else if (devc->nr_voice == 12) /* 4 OP mode */ - is4op = (instr->key == OPL3_PATCH); - else - is4op = 0; - - if (is4op) { - first = p = 0; - avail = 6; - } else { - if (devc->nr_voice == 12) /* 4 OP mode. Use the '2 OP - * only' operators first */ - first = p = 6; - else - first = p = 0; - avail = devc->nr_voice; - } - - /* - * Now try to find a free voice - */ - best = first; - - for (i = 0; i < avail; i++) { - if (alloc->map[p] == 0) { - return p; - } - if (alloc->alloc_times[p] < best_time) { /* Find oldest playing note */ - best_time = alloc->alloc_times[p]; - best = p; - } - p = (p + 1) % avail; - } - - /* - * Insert some kind of priority mechanism here. - */ - - if (best < 0) - best = 0; - if (best > devc->nr_voice) - best -= devc->nr_voice; - - return best; /* All devc->voc in use. Select the first - * one. */ -} - -static void -opl3_setup_voice(int dev, int voice, int chn) -{ - struct channel_info *info = - &synth_devs[dev]->chn_info[chn]; - - opl3_set_instr(dev, voice, info->pgm_num); - - devc->voc[voice].bender = info->bender_value; - devc->voc[voice].volume = info->controllers[CTL_MAIN_VOLUME]; -} - -static struct synth_operations opl3_operations = -{ - NULL, - 0, - SYNTH_TYPE_FM, - FM_TYPE_ADLIB, - opl3_open, - opl3_close, - opl3_ioctl, - opl3_kill_note, - opl3_start_note, - opl3_set_instr, - opl3_reset, - opl3_hw_control, - opl3_load_patch, - opl3_aftertouch, - opl3_controller, - opl3_panning, - opl3_volume_method, - opl3_patchmgr, - opl3_bender, - opl3_alloc_voice, - opl3_setup_voice -}; - -void -opl3_init(int ioaddr, sound_os_info * osp) -{ - int i; - - if (num_synths >= MAX_SYNTH_DEV) { - printf("OPL3 Error: Too many synthesizers\n"); - return ; - } - if (devc == NULL) { - printf("OPL3: Device control structure not initialized.\n"); - return ; - } - bzero((char *) devc, sizeof(*devc)); - devc->osp = osp; - - devc->nr_voice = 9; - strcpy(devc->fm_info.name, "OPL2-"); - - devc->fm_info.device = 0; - devc->fm_info.synth_type = SYNTH_TYPE_FM; - devc->fm_info.synth_subtype = FM_TYPE_ADLIB; - devc->fm_info.perc_mode = 0; - devc->fm_info.nr_voices = 9; - devc->fm_info.nr_drums = 0; - devc->fm_info.instr_bank_size = SBFM_MAXINSTR; - devc->fm_info.capabilities = 0; - devc->left_io = ioaddr; - devc->right_io = ioaddr + 2; - - if (detected_model <= 2) - devc->model = 1; - else { - devc->model = 2; - if (detected_model == 4) - devc->is_opl4 = 1; - } - - opl3_operations.info = &devc->fm_info; - - synth_devs[num_synths++] = &opl3_operations; - devc->v_alloc = &opl3_operations.alloc; - devc->chn_info = &opl3_operations.chn_info[0]; - - if (devc->model == 2) { - if (devc->is_opl4) - conf_printf2("Yamaha OPL4/OPL3 FM", ioaddr, 0, -1, -1); - else - conf_printf2("Yamaha OPL3 FM", ioaddr, 0, -1, -1); - - devc->v_alloc->max_voice = devc->nr_voice = 18; - devc->fm_info.nr_drums = 0; - devc->fm_info.capabilities |= SYNTH_CAP_OPL3; - strcpy(devc->fm_info.name, "Yamaha OPL-3"); - - for (i = 0; i < 18; i++) - if (pv_map[i].ioaddr == USE_LEFT) - pv_map[i].ioaddr = devc->left_io; - else - pv_map[i].ioaddr = devc->right_io; - - opl3_command(devc->right_io, OPL3_MODE_REGISTER, OPL3_ENABLE); - opl3_command(devc->right_io, CONNECTION_SELECT_REGISTER, 0x00); - } else { - conf_printf2("Yamaha OPL2 FM", ioaddr, 0, -1, -1); - devc->v_alloc->max_voice = devc->nr_voice = 9; - devc->fm_info.nr_drums = 0; - - for (i = 0; i < 18; i++) - pv_map[i].ioaddr = devc->left_io; - }; - - for (i = 0; i < SBFM_MAXINSTR; i++) - devc->i_map[i].channel = -1; - - return ; -} - -#endif diff --git a/sys/i386/isa/sound/opl3.h b/sys/i386/isa/sound/opl3.h deleted file mode 100644 index afa8d16..0000000 --- a/sys/i386/isa/sound/opl3.h +++ /dev/null @@ -1,261 +0,0 @@ -/* - * opl3.h - Definitions of the OPL-3 registers - * - * 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. - * - */ - -/* - * The OPL-3 mode is switched on by writing 0x01, to the offset 5 - * of the right side. - * - * Another special register at the right side is at offset 4. It contains - * a bit mask defining which voices are used as 4 OP voices. - * - * The percussive mode is implemented in the left side only. - * - * With the above exeptions the both sides can be operated independently. - * - * A 4 OP voice can be created by setting the corresponding - * bit at offset 4 of the right side. - * - * For example setting the rightmost bit (0x01) changes the - * first voice on the right side to the 4 OP mode. The fourth - * voice is made inaccessible. - * - * If a voice is set to the 2 OP mode, it works like 2 OP modes - * of the original YM3812 (AdLib). In addition the voice can - * be connected the left, right or both stereo channels. It can - * even be left unconnected. This works with 4 OP voices also. - * - * The stereo connection bits are located in the FEEDBACK_CONNECTION - * register of the voice (0xC0-0xC8). In 4 OP voices these bits are - * in the second half of the voice. - */ - -/* - * Register numbers for the global registers - */ - -#define TEST_REGISTER 0x01 -#define ENABLE_WAVE_SELECT 0x20 - -#define TIMER1_REGISTER 0x02 -#define TIMER2_REGISTER 0x03 -#define TIMER_CONTROL_REGISTER 0x04 /* Left side */ -#define IRQ_RESET 0x80 -#define TIMER1_MASK 0x40 -#define TIMER2_MASK 0x20 -#define TIMER1_START 0x01 -#define TIMER2_START 0x02 - -#define CONNECTION_SELECT_REGISTER 0x04 /* Right side */ -#define RIGHT_4OP_0 0x01 -#define RIGHT_4OP_1 0x02 -#define RIGHT_4OP_2 0x04 -#define LEFT_4OP_0 0x08 -#define LEFT_4OP_1 0x10 -#define LEFT_4OP_2 0x20 - -#define OPL3_MODE_REGISTER 0x05 /* Right side */ -#define OPL3_ENABLE 0x01 -#define OPL4_ENABLE 0x02 - -#define KBD_SPLIT_REGISTER 0x08 /* Left side */ -#define COMPOSITE_SINE_WAVE_MODE 0x80 /* Don't use with OPL-3? */ -#define KEYBOARD_SPLIT 0x40 - -#define PERCUSSION_REGISTER 0xbd /* Left side only */ -#define TREMOLO_DEPTH 0x80 -#define VIBRATO_DEPTH 0x40 -#define PERCUSSION_ENABLE 0x20 -#define BASSDRUM_ON 0x10 -#define SNAREDRUM_ON 0x08 -#define TOMTOM_ON 0x04 -#define CYMBAL_ON 0x02 -#define HIHAT_ON 0x01 - -/* - * Offsets to the register banks for operators. To get the - * register number just add the operator offset to the bank offset - * - * AM/VIB/EG/KSR/Multiple (0x20 to 0x35) - */ -#define AM_VIB 0x20 -#define TREMOLO_ON 0x80 -#define VIBRATO_ON 0x40 -#define SUSTAIN_ON 0x20 -#define KSR 0x10 /* Key scaling rate */ -#define MULTIPLE_MASK 0x0f /* Frequency multiplier */ - - /* - * KSL/Total level (0x40 to 0x55) - */ -#define KSL_LEVEL 0x40 -#define KSL_MASK 0xc0 /* Envelope scaling bits */ -#define TOTAL_LEVEL_MASK 0x3f /* Strength (volume) of OP */ - -/* - * Attack / Decay rate (0x60 to 0x75) - */ -#define ATTACK_DECAY 0x60 -#define ATTACK_MASK 0xf0 -#define DECAY_MASK 0x0f - -/* - * Sustain level / Release rate (0x80 to 0x95) - */ -#define SUSTAIN_RELEASE 0x80 -#define SUSTAIN_MASK 0xf0 -#define RELEASE_MASK 0x0f - -/* - * Wave select (0xE0 to 0xF5) - */ -#define WAVE_SELECT 0xe0 - -/* - * Offsets to the register banks for voices. Just add to the - * voice number to get the register number. - * - * F-Number low bits (0xA0 to 0xA8). - */ -#define FNUM_LOW 0xa0 - -/* - * F-number high bits / Key on / Block (octave) (0xB0 to 0xB8) - */ -#define KEYON_BLOCK 0xb0 -#define KEYON_BIT 0x20 -#define BLOCKNUM_MASK 0x1c -#define FNUM_HIGH_MASK 0x03 - -/* - * Feedback / Connection (0xc0 to 0xc8) - * - * These registers have two new bits when the OPL-3 mode - * is selected. These bits controls connecting the voice - * to the stereo channels. For 4 OP voices this bit is - * defined in the second half of the voice (add 3 to the - * register offset). - * - * For 4 OP voices the connection bit is used in the - * both halfs (gives 4 ways to connect the operators). - */ -#define FEEDBACK_CONNECTION 0xc0 -#define FEEDBACK_MASK 0x0e /* Valid just for 1st OP of a voice */ -#define CONNECTION_BIT 0x01 -/* - * In the 4 OP mode there is four possible configurations how the - * operators can be connected together (in 2 OP modes there is just - * AM or FM). The 4 OP connection mode is defined by the rightmost - * bit of the FEEDBACK_CONNECTION (0xC0-0xC8) on the both halfs. - * - * First half Second half Mode - * - * +---+ - * v | - * 0 0 >+-1-+--2--3--4--> - * - * - * - * +---+ - * | | - * 0 1 >+-1-+--2-+ - * |-> - * >--3----4-+ - * - * +---+ - * | | - * 1 0 >+-1-+-----+ - * |-> - * >--2--3--4-+ - * - * +---+ - * | | - * 1 1 >+-1-+--+ - * | - * >--2--3-+-> - * | - * >--4----+ - */ -#define STEREO_BITS 0x30 /* OPL-3 only */ -#define VOICE_TO_LEFT 0x10 -#define VOICE_TO_RIGHT 0x20 - -/* - * Definition table for the physical voices - */ - -struct physical_voice_info { - unsigned char voice_num; - unsigned char voice_mode; /* 0=unavailable, 2=2 OP, 4=4 OP */ - unsigned short ioaddr; /* I/O port (left or right side) */ - unsigned char op[4]; /* Operator offsets */ - }; - -/* - * There is 18 possible 2 OP voices - * (9 in the left and 9 in the right). - * The first OP is the modulator and 2nd is the carrier. - * - * The first three voices in the both sides may be connected - * with another voice to a 4 OP voice. For example voice 0 - * can be connected with voice 3. The operators of voice 3 are - * used as operators 3 and 4 of the new 4 OP voice. - * In this case the 2 OP voice number 0 is the 'first half' and - * voice 3 is the second. - */ - -#define USE_LEFT 0 -#define USE_RIGHT 1 - -static struct physical_voice_info pv_map[18] = -{ -/* No Mode Side OP1 OP2 OP3 OP4 */ -/* --------------------------------------------------- */ - { 0, 2, USE_LEFT, {0x00, 0x03, 0x08, 0x0b}}, - { 1, 2, USE_LEFT, {0x01, 0x04, 0x09, 0x0c}}, - { 2, 2, USE_LEFT, {0x02, 0x05, 0x0a, 0x0d}}, - - { 3, 2, USE_LEFT, {0x08, 0x0b, 0x00, 0x00}}, - { 4, 2, USE_LEFT, {0x09, 0x0c, 0x00, 0x00}}, - { 5, 2, USE_LEFT, {0x0a, 0x0d, 0x00, 0x00}}, - - { 6, 2, USE_LEFT, {0x10, 0x13, 0x00, 0x00}}, /* Used by percussive voices */ - { 7, 2, USE_LEFT, {0x11, 0x14, 0x00, 0x00}}, /* if the percussive mode */ - { 8, 2, USE_LEFT, {0x12, 0x15, 0x00, 0x00}}, /* is selected */ - - { 0, 2, USE_RIGHT, {0x00, 0x03, 0x08, 0x0b}}, - { 1, 2, USE_RIGHT, {0x01, 0x04, 0x09, 0x0c}}, - { 2, 2, USE_RIGHT, {0x02, 0x05, 0x0a, 0x0d}}, - - { 3, 2, USE_RIGHT, {0x08, 0x0b, 0x00, 0x00}}, - { 4, 2, USE_RIGHT, {0x09, 0x0c, 0x00, 0x00}}, - { 5, 2, USE_RIGHT, {0x0a, 0x0d, 0x00, 0x00}}, - - { 6, 2, USE_RIGHT, {0x10, 0x13, 0x00, 0x00}}, - { 7, 2, USE_RIGHT, {0x11, 0x14, 0x00, 0x00}}, - { 8, 2, USE_RIGHT, {0x12, 0x15, 0x00, 0x00}} -}; diff --git a/sys/i386/isa/sound/os.h b/sys/i386/isa/sound/os.h deleted file mode 100644 index fb94008..0000000 --- a/sys/i386/isa/sound/os.h +++ /dev/null @@ -1,101 +0,0 @@ -/* - * os.h -- only included by sound_config.h right after local.h - * - * $FreeBSD$ - */ - -#ifndef _OS_H_ -#define _OS_H_ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#undef DELAY -#define DELAY(x) tenmicrosec(x) -typedef struct uio snd_rw_buf; - -struct snd_wait { - int mode; - int aborting; -}; - - -unsigned long get_time(void); - -#endif /* _OS_H_ */ - -typedef caddr_t ioctl_arg; - -typedef struct sound_os_info { - int unit; -} sound_os_info; - - -/* - * The following macro calls tsleep. It should be implemented such that - * the process is resumed if it receives a signal. - * The q parameter is a wait_queue defined with DEFINE_WAIT_QUEUE(), - * and the second is a workarea parameter. The third is a timeout - * in ticks. Zero means no timeout. - */ -#define DO_SLEEP(q, f, time_limit) \ - { \ - int flag; \ - f.mode = WK_SLEEP; \ - flag=tsleep(&q, (PRIBIO-5)|PCATCH, "sndint", time_limit); \ - f.mode &= ~WK_SLEEP; \ - if (flag == EWOULDBLOCK) { \ - f.mode |= WK_TIMEOUT; \ - f.aborting = 0; \ - } else \ - f.aborting = flag; \ - } - -#define DO_SLEEP1(q, f, time_limit) \ - { \ - int flag; \ - f.mode = WK_SLEEP; \ - flag=tsleep(&q, (PRIBIO-5)|PCATCH, "snd1", time_limit); \ - f.mode &= ~WK_SLEEP; \ - if (flag == EWOULDBLOCK) { \ - f.mode |= WK_TIMEOUT; \ - f.aborting = 0; \ - } else \ - f.aborting = flag; \ - } - -#define DO_SLEEP2(q, f, time_limit) \ - { \ - int flag; \ - f.mode = WK_SLEEP; \ - flag=tsleep(&q, (PRIBIO-5)|PCATCH, "snd2", time_limit); \ - f.mode &= ~WK_SLEEP; \ - if (flag == EWOULDBLOCK) { \ - f.mode |= WK_TIMEOUT; \ - f.aborting = 0; \ - } else \ - f.aborting = flag; \ - } - -#define PROCESS_ABORTING( f) (f.aborting || CURSIG(curproc)) -#define TIMED_OUT( f) (f.mode & WK_TIMEOUT) - -#ifdef ALLOW_POLL -typedef struct proc select_table; -extern struct selinfo selinfo[]; -#endif diff --git a/sys/i386/isa/sound/pas2_card.c b/sys/i386/isa/sound/pas2_card.c deleted file mode 100644 index dc78afa..0000000 --- a/sys/i386/isa/sound/pas2_card.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * sound/pas2_card.c - * - * Detection routine for the Pro Audio Spectrum 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 - * 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 - -#if defined(CONFIG_PAS) -#define _PAS2_CARD_C_ - -#define DEFINE_TRANSLATIONS -#include - -/* - * The Address Translation code is used to convert I/O register addresses to - * be relative to the given base -register - */ - -int translat_code; -static int pas_intr_mask = 0; -static int pas_irq = 0; - -static sound_os_info *pas_osp; - -char pas_model; -static char *pas_model_names[] = -{"", "Pro AudioSpectrum+", "CDPC", "Pro AudioSpectrum 16", "Pro AudioSpectrum 16D"}; - -/* - * pas_read() and pas_write() are equivalents of inb and outb - */ -/* - * These routines perform the I/O address translation required - */ -/* - * to support other than the default base address - */ -extern void mix_write(u_char data, int ioaddr); - -u_char -pas_read(int ioaddr) -{ - return inb(ioaddr ^ translat_code); -} - -void -pas_write(u_char data, int ioaddr) -{ - outb(ioaddr ^ translat_code, data); -} - -static void -pas2_msg(char *foo) -{ - printf(" PAS2: %s.\n", foo); -} - -/******************* Begin of the Interrupt Handler ********************/ - -void -pasintr(int irq) -{ - int status; - - status = pas_read(INTERRUPT_STATUS); - pas_write(status, INTERRUPT_STATUS); /* Clear interrupt */ - - if (status & I_S_PCM_SAMPLE_BUFFER_IRQ) { -#ifdef CONFIG_AUDIO - pas_pcm_interrupt(status, 1); -#endif - status &= ~I_S_PCM_SAMPLE_BUFFER_IRQ; - } - if (status & I_S_MIDI_IRQ) { -#ifdef CONFIG_MIDI - pas_midi_interrupt(); -#endif - status &= ~I_S_MIDI_IRQ; - } -} - -int -pas_set_intr(int mask) -{ - if (!mask) - return 0; - - pas_intr_mask |= mask; - - pas_write(pas_intr_mask, INTERRUPT_MASK); - return 0; -} - -int -pas_remove_intr(int mask) -{ - if (!mask) - return 0; - - pas_intr_mask &= ~mask; - pas_write(pas_intr_mask, INTERRUPT_MASK); - - return 0; -} - -/******************* End of the Interrupt handler **********************/ - -/******************* Begin of the Initialization Code ******************/ - -static int -config_pas_hw(struct address_info * hw_config) -{ - char ok = 1; - u_int int_ptrs; /* scsi/sound interrupt pointers */ - - pas_irq = hw_config->irq; - - pas_write(0x00, INTERRUPT_MASK); - - pas_write(0x36, SAMPLE_COUNTER_CONTROL); /* Local timer control * - * register */ - - pas_write(0x36, SAMPLE_RATE_TIMER); /* Sample rate timer (16 bit) */ - pas_write(0, SAMPLE_RATE_TIMER); - - pas_write(0x74, SAMPLE_COUNTER_CONTROL); /* Local timer control * - * register */ - - pas_write(0x74, SAMPLE_BUFFER_COUNTER); /* Sample count register (16 * - * bit) */ - pas_write(0, SAMPLE_BUFFER_COUNTER); - - pas_write(F_F_PCM_BUFFER_COUNTER | F_F_PCM_RATE_COUNTER | F_F_MIXER_UNMUTE | 1, FILTER_FREQUENCY); - pas_write(P_C_PCM_DMA_ENABLE | P_C_PCM_MONO | P_C_PCM_DAC_MODE | P_C_MIXER_CROSS_L_TO_L | P_C_MIXER_CROSS_R_TO_R, PCM_CONTROL); - pas_write(S_M_PCM_RESET | S_M_FM_RESET | S_M_SB_RESET | S_M_MIXER_RESET /* | S_M_OPL3_DUAL_MONO */ , SERIAL_MIXER); - - pas_write(I_C_1_BOOT_RESET_ENABLE -#ifdef PAS_JOYSTICK_ENABLE - | I_C_1_JOYSTICK_ENABLE -#endif - ,IO_CONFIGURATION_1); - - if (pas_irq < 0 || pas_irq > 15) { - printf("PAS2: Invalid IRQ %d", pas_irq); - ok = 0; - } else { - int_ptrs = pas_read(IO_CONFIGURATION_3); - int_ptrs |= I_C_3_PCM_IRQ_translate[pas_irq] & 0xf; - pas_write(int_ptrs, IO_CONFIGURATION_3); - if (!I_C_3_PCM_IRQ_translate[pas_irq]) { - printf("PAS2: Invalid IRQ %d", pas_irq); - ok = 0; - } else { - if (snd_set_irq_handler(pas_irq, pasintr, hw_config->osp) < 0) - ok = 0; - } - } - - if (hw_config->dma < 0 || hw_config->dma > 7) { - printf("PAS2: Invalid DMA selection %d", hw_config->dma); - ok = 0; - } else { - pas_write(I_C_2_PCM_DMA_translate[hw_config->dma], IO_CONFIGURATION_2); - if (!I_C_2_PCM_DMA_translate[hw_config->dma]) { - printf("PAS2: Invalid DMA selection %d", hw_config->dma); - ok = 0; - } else { - if (0) { - printf("pas2_card.c: Can't allocate DMA channel\n"); - ok = 0; - } - } - } - - /* - * This fixes the timing problems of the PAS due to the Symphony - * chipset as per Media Vision. Only define this if your PAS doesn't - * work correctly. - */ -#ifdef SYMPHONY_PAS - outb(0xa8, 0x05); - outb(0xa9, 0x60); -#endif - -#ifdef BROKEN_BUS_CLOCK - pas_write(S_C_1_PCS_ENABLE | S_C_1_PCS_STEREO | S_C_1_PCS_REALSOUND | S_C_1_FM_EMULATE_CLOCK, SYSTEM_CONFIGURATION_1); -#else - /* - * pas_write(S_C_1_PCS_ENABLE, SYSTEM_CONFIGURATION_1); - */ - pas_write(S_C_1_PCS_ENABLE | S_C_1_PCS_STEREO | S_C_1_PCS_REALSOUND, SYSTEM_CONFIGURATION_1); -#endif - pas_write(0x18, SYSTEM_CONFIGURATION_3); /* ??? */ - - pas_write(F_F_MIXER_UNMUTE | 0x01, FILTER_FREQUENCY); /* Sets mute off and * - * selects filter rate * - * of 17.897 kHz */ - pas_write(8, PRESCALE_DIVIDER); - - mix_write(P_M_MV508_ADDRESS | 5, PARALLEL_MIXER); - mix_write(5, PARALLEL_MIXER); - -#if defined(CONFIG_SB_EMULATION) && defined(CONFIG_SB) - - { - struct address_info *sb_config; - - if ((sb_config = sound_getconf(SNDCARD_SB))) { - u_char irq_dma; - - /* - * Turn on Sound Blaster compatibility - */ - /* - * bit 1 = SB emulation - */ - /* - * bit 0 = MPU401 emulation (CDPC only :-( ) - */ - pas_write(0x02, COMPATIBILITY_ENABLE); - - /* - * "Emulation address" - */ - pas_write((sb_config->io_base >> 4) & 0x0f, EMULATION_ADDRESS); - - if (!E_C_SB_DMA_translate[sb_config->dma]) - printf("\n\nPAS16 Warning: Invalid SB DMA %d\n\n", - sb_config->dma); - - if (!E_C_SB_IRQ_translate[sb_config->irq]) - printf("\n\nPAS16 Warning: Invalid SB IRQ %d\n\n", - sb_config->irq); - - irq_dma = E_C_SB_DMA_translate[sb_config->dma] | - E_C_SB_IRQ_translate[sb_config->irq]; - - pas_write(irq_dma, EMULATION_CONFIGURATION); - } - } -#else - pas_write(0x00, COMPATIBILITY_ENABLE); -#endif - - if (!ok) - pas2_msg("Driver not enabled"); - - return ok; -} - -static int -detect_pas_hw(struct address_info * hw_config) -{ - u_char board_id, foo; - - /* - * WARNING: Setting an option like W:1 or so that disables warm boot - * reset of the card will screw up this detect code something fierce. - * Adding code to handle this means possibly interfering with other - * cards on the bus if you have something on base port 0x388. SO be - * forewarned. - */ - - outb(MASTER_DECODE, 0xBC); /* Talk to first board */ - outb(MASTER_DECODE, hw_config->io_base >> 2); /* Set base address */ - translat_code = PAS_DEFAULT_BASE ^ hw_config->io_base; - pas_write(1, WAIT_STATE); /* One wait-state */ - - board_id = pas_read(INTERRUPT_MASK); - - if (board_id == 0xff) - return 0; - - /* - * We probably have a PAS-series board, now check for a PAS2-series - * board by trying to change the board revision bits. PAS2-series - * hardware won't let you do this - the bits are read-only. - */ - - foo = board_id ^ 0xe0; - - pas_write(foo, INTERRUPT_MASK); - foo = inb(INTERRUPT_MASK); - pas_write(board_id, INTERRUPT_MASK); - - if (board_id != foo) /* Not a PAS2 */ - return 0; - - pas_model = pas_read(CHIP_REV); - - return pas_model; -} - -void -attach_pas_card(struct address_info * hw_config) -{ - pas_irq = hw_config->irq; - pas_osp = hw_config->osp; - - if (detect_pas_hw(hw_config)) { - - if ((pas_model = pas_read(CHIP_REV))) { - char temp[100]; - - snprintf(temp, sizeof(temp), - "%s rev %d", pas_model_names[(int) pas_model], - pas_read(BOARD_REV_ID)); - conf_printf(temp, hw_config); - } - if (config_pas_hw(hw_config)) { - -#ifdef CONFIG_AUDIO - pas_pcm_init(hw_config); -#endif - -#if defined(CONFIG_SB_EMULATION) && defined(CONFIG_SB) - - sb_dsp_disable_midi(); /* The SB emulation don't - * support * midi */ -#endif - - -#ifdef CONFIG_MIDI - pas_midi_init(); -#endif - pas_init_mixer(); - } - } -} - -int -probe_pas(struct address_info * hw_config) -{ - pas_osp = hw_config->osp; - return detect_pas_hw(hw_config); -} - -#endif diff --git a/sys/i386/isa/sound/pas2_midi.c b/sys/i386/isa/sound/pas2_midi.c deleted file mode 100644 index 006b7d4c..0000000 --- a/sys/i386/isa/sound/pas2_midi.c +++ /dev/null @@ -1,285 +0,0 @@ -/* - * sound/pas2_midi.c - * - * The low level driver for the PAS Midi Interface. - * - * 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 - -#if defined(CONFIG_PAS) && defined(CONFIG_MIDI) -#include - -static int midi_busy = 0, input_opened = 0; -static int my_dev; -static volatile int ofifo_bytes = 0; - -static u_char tmp_queue[256]; -static volatile int qlen; -static volatile u_char qhead, qtail; - -static void (*midi_input_intr) (int dev, u_char data); - -static int -pas_midi_open(int dev, int mode, - void (*input) (int dev, u_char data), - void (*output) (int dev) -) -{ - int err; - u_long flags; - u_char ctrl; - - - if (midi_busy) { - printf("PAS2: Midi busy\n"); - return -(EBUSY); - } - /* - * Reset input and output FIFO pointers - */ - pas_write(M_C_RESET_INPUT_FIFO | M_C_RESET_OUTPUT_FIFO, - MIDI_CONTROL); - - flags = splhigh(); - - if ((err = pas_set_intr(I_M_MIDI_IRQ_ENABLE)) < 0) - return err; - - /* - * Enable input available and output FIFO empty interrupts - */ - - ctrl = 0; - input_opened = 0; - midi_input_intr = input; - - if (mode == OPEN_READ || mode == OPEN_READWRITE) { - ctrl |= M_C_ENA_INPUT_IRQ; /* Enable input */ - input_opened = 1; - } - if (mode == OPEN_WRITE || mode == OPEN_READWRITE) { - ctrl |= M_C_ENA_OUTPUT_IRQ | /* Enable output */ - M_C_ENA_OUTPUT_HALF_IRQ; - } - pas_write(ctrl, - MIDI_CONTROL); - - /* - * Acknowledge any pending interrupts - */ - - pas_write(0xff, MIDI_STATUS); - ofifo_bytes = 0; - - splx(flags); - - midi_busy = 1; - qlen = qhead = qtail = 0; - return 0; -} - -static void -pas_midi_close(int dev) -{ - - /* - * Reset FIFO pointers, disable intrs - */ - pas_write(M_C_RESET_INPUT_FIFO | M_C_RESET_OUTPUT_FIFO, MIDI_CONTROL); - - pas_remove_intr(I_M_MIDI_IRQ_ENABLE); - midi_busy = 0; -} - -static int -dump_to_midi(u_char midi_byte) -{ - int fifo_space, x; - - fifo_space = ((x = pas_read(MIDI_FIFO_STATUS)) >> 4) & 0x0f; - - if (fifo_space == 15 || (fifo_space < 2 && ofifo_bytes > 13)) { /* Fifo full */ - return 0; /* Upper layer will call again */ - } - ofifo_bytes++; - - pas_write(midi_byte, MIDI_DATA); - - return 1; -} - -static int -pas_midi_out(int dev, u_char midi_byte) -{ - - u_long flags; - - /* - * Drain the local queue first - */ - - flags = splhigh(); - - while (qlen && dump_to_midi(tmp_queue[qhead])) { - qlen--; - qhead++; - } - - splx(flags); - - /* - * Output the byte if the local queue is empty. - */ - - if (!qlen) - if (dump_to_midi(midi_byte)) - return 1; /* OK */ - - /* - * Put to the local queue - */ - - if (qlen >= 256) - return 0; /* Local queue full */ - - flags = splhigh(); - - tmp_queue[qtail] = midi_byte; - qlen++; - qtail++; - - splx(flags); - - return 1; -} - -static int -pas_midi_start_read(int dev) -{ - return 0; -} - -static int -pas_midi_end_read(int dev) -{ - return 0; -} - -static int -pas_midi_ioctl(int dev, u_int cmd, ioctl_arg arg) -{ - return -(EINVAL); -} - -static void -pas_midi_kick(int dev) -{ - ofifo_bytes = 0; -} - -static int -pas_buffer_status(int dev) -{ - return qlen; -} - -#define MIDI_SYNTH_NAME "Pro Audio Spectrum Midi" -#define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT -#include - -static struct midi_operations pas_midi_operations = -{ - {"Pro Audio Spectrum", 0, 0, SNDCARD_PAS}, - &std_midi_synth, - {0}, - pas_midi_open, - pas_midi_close, - pas_midi_ioctl, - pas_midi_out, - pas_midi_start_read, - pas_midi_end_read, - pas_midi_kick, - NULL, /* command */ - pas_buffer_status, - NULL -}; - -void -pas_midi_init() -{ - if (num_midis >= MAX_MIDI_DEV) { - printf("Sound: Too many midi devices detected\n"); - return; - } - std_midi_synth.midi_dev = my_dev = num_midis; - midi_devs[num_midis++] = &pas_midi_operations; - return; -} - -void -pas_midi_interrupt(void) -{ - u_char stat; - int i, incount; - u_long flags; - - stat = pas_read(MIDI_STATUS); - - if (stat & M_S_INPUT_AVAIL) { /* Input byte available */ - incount = pas_read(MIDI_FIFO_STATUS) & 0x0f; /* Input FIFO count */ - if (!incount) - incount = 16; - - for (i = 0; i < incount; i++) - if (input_opened) { - midi_input_intr(my_dev, pas_read(MIDI_DATA)); - } else - pas_read(MIDI_DATA); /* Flush */ - } - if (stat & (M_S_OUTPUT_EMPTY | M_S_OUTPUT_HALF_EMPTY)) { - if (!(stat & M_S_OUTPUT_EMPTY)) { - ofifo_bytes = 8; - } else { - ofifo_bytes = 0; - } - - flags = splhigh(); - - while (qlen && dump_to_midi(tmp_queue[qhead])) { - qlen--; - qhead++; - } - - splx(flags); - } - if (stat & M_S_OUTPUT_OVERRUN) { - printf("MIDI output overrun %x,%x,%d \n", pas_read(MIDI_FIFO_STATUS), stat, ofifo_bytes); - ofifo_bytes = 100; - } - pas_write(stat, MIDI_STATUS); /* Acknowledge interrupts */ -} - -#endif diff --git a/sys/i386/isa/sound/pas2_mixer.c b/sys/i386/isa/sound/pas2_mixer.c deleted file mode 100644 index 380bcfe..0000000 --- a/sys/i386/isa/sound/pas2_mixer.c +++ /dev/null @@ -1,325 +0,0 @@ -/* - * sound/pas2_mixer.c - * - * Mixer routines for the Pro Audio Spectrum 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 - * 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. - * - * $FreeBSD$ - */ - -#define _PAS2_MIXER_C_ - -#include - -#if defined(CONFIG_PAS) - -#include - -#define TRACE(what) /* (what) */ - -extern int translat_code; -extern char pas_model; -extern sound_os_info *pas_osp; - -static int rec_devices = (SOUND_MASK_MIC); /* Default recording source */ -static int mode_control = 0; - -#define POSSIBLE_RECORDING_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_SPEAKER | SOUND_MASK_LINE | SOUND_MASK_MIC | \ - SOUND_MASK_CD | SOUND_MASK_ALTPCM) - -#define SUPPORTED_MIXER_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_PCM | SOUND_MASK_SPEAKER | SOUND_MASK_LINE | SOUND_MASK_MIC | \ - SOUND_MASK_CD | SOUND_MASK_ALTPCM | SOUND_MASK_IMIX | \ - SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE | SOUND_MASK_RECLEV | \ - SOUND_MASK_MUTE | SOUND_MASK_ENHANCE | SOUND_MASK_LOUD) - -static u_short levels[SOUND_MIXER_NRDEVICES] = -{ - 0x3232, /* Master Volume */ - 0x3232, /* Bass */ - 0x3232, /* Treble */ - 0x5050, /* FM */ - 0x4b4b, /* PCM */ - 0x3232, /* PC Speaker */ - 0x4b4b, /* Ext Line */ - 0x4b4b, /* Mic */ - 0x4b4b, /* CD */ - 0x6464, /* Recording monitor */ - 0x4b4b, /* SB PCM */ - 0x6464 /* Recording level */ -}; - -void mix_write(u_char data, int ioaddr); - -void -mix_write(u_char data, int ioaddr) -{ - /* - * The Revision D cards have a problem with their MVA508 interface. - * The kludge-o-rama fix is to make a 16-bit quantity with identical - * LSB and MSBs out of the output byte and to do a 16-bit out to the - * mixer port - 1. We need to do this because it isn't timing problem - * but chip access sequence problem. - */ - - if (pas_model == PAS_16D) { - outw((ioaddr ^ translat_code) - 1, data | (data << 8)); - outb(0, 0x80); - } else - pas_write(data, ioaddr); -} - -static int -mixer_output(int right_vol, int left_vol, int div, int bits, - int mixer) -{ /* Input or output mixer */ - int left = left_vol * div / 100; - int right = right_vol * div / 100; - - - if (bits & P_M_MV508_MIXER) { /* Select input or output mixer */ - left |= mixer; - right |= mixer; - } - if (bits == P_M_MV508_BASS || bits == P_M_MV508_TREBLE) { /* Bass and treble are - * mono devices */ - mix_write(P_M_MV508_ADDRESS | bits, PARALLEL_MIXER); - mix_write(left, PARALLEL_MIXER); - right_vol = left_vol; - } else { - mix_write(P_M_MV508_ADDRESS | P_M_MV508_LEFT | bits, PARALLEL_MIXER); - mix_write(left, PARALLEL_MIXER); - mix_write(P_M_MV508_ADDRESS | P_M_MV508_RIGHT | bits, PARALLEL_MIXER); - mix_write(right, PARALLEL_MIXER); - } - - return (left_vol | (right_vol << 8)); -} - -static void -set_mode(int new_mode) -{ - mix_write(P_M_MV508_ADDRESS | P_M_MV508_MODE, PARALLEL_MIXER); - mix_write(new_mode, PARALLEL_MIXER); - - mode_control = new_mode; -} - -static int -pas_mixer_set(int whichDev, u_int level) -{ - int left, right, devmask, changed, i, mixer = 0; - - TRACE(printf("static int pas_mixer_set(int whichDev = %d, u_int level = %X)\n", whichDev, level)); - - left = level & 0x7f; - right = (level & 0x7f00) >> 8; - - if (whichDev < SOUND_MIXER_NRDEVICES) { - if ((1 << whichDev) & rec_devices) - mixer = P_M_MV508_INPUTMIX; - else - mixer = P_M_MV508_OUTPUTMIX; - } - switch (whichDev) { - case SOUND_MIXER_VOLUME: /* Master volume (0-63) */ - levels[whichDev] = mixer_output(right, left, 63, P_M_MV508_MASTER_A, 0); - break; - - /* - * Note! Bass and Treble are mono devices. Will use just the - * left channel. - */ - case SOUND_MIXER_BASS: /* Bass (0-12) */ - levels[whichDev] = mixer_output(right, left, 12, P_M_MV508_BASS, 0); - break; - case SOUND_MIXER_TREBLE: /* Treble (0-12) */ - levels[whichDev] = mixer_output(right, left, 12, P_M_MV508_TREBLE, 0); - break; - - case SOUND_MIXER_SYNTH:/* Internal synthesizer (0-31) */ - levels[whichDev] = mixer_output(right, left, 31, P_M_MV508_MIXER | P_M_MV508_FM, mixer); - break; - case SOUND_MIXER_PCM: /* PAS PCM (0-31) */ - levels[whichDev] = mixer_output(right, left, 31, P_M_MV508_MIXER | P_M_MV508_PCM, mixer); - break; - case SOUND_MIXER_ALTPCM: /* SB PCM (0-31) */ - levels[whichDev] = mixer_output(right, left, 31, P_M_MV508_MIXER | P_M_MV508_SB, mixer); - break; - case SOUND_MIXER_SPEAKER: /* PC speaker (0-31) */ - levels[whichDev] = mixer_output(right, left, 31, P_M_MV508_MIXER | P_M_MV508_SPEAKER, mixer); - break; - case SOUND_MIXER_LINE: /* External line (0-31) */ - levels[whichDev] = mixer_output(right, left, 31, P_M_MV508_MIXER | P_M_MV508_LINE, mixer); - break; - case SOUND_MIXER_CD: /* CD (0-31) */ - levels[whichDev] = mixer_output(right, left, 31, P_M_MV508_MIXER | P_M_MV508_CDROM, mixer); - break; - case SOUND_MIXER_MIC: /* External microphone (0-31) */ - levels[whichDev] = mixer_output(right, left, 31, P_M_MV508_MIXER | P_M_MV508_MIC, mixer); - break; - case SOUND_MIXER_IMIX: /* Recording monitor (0-31) (Output mixer - * only) */ - levels[whichDev] = mixer_output(right, left, 31, P_M_MV508_MIXER | P_M_MV508_IMIXER, - P_M_MV508_OUTPUTMIX); - break; - case SOUND_MIXER_RECLEV: /* Recording level (0-15) */ - levels[whichDev] = mixer_output(right, left, 15, P_M_MV508_MASTER_B, 0); - break; - - case SOUND_MIXER_MUTE: - return 0; - break; - - case SOUND_MIXER_ENHANCE: - i = 0; - level &= 0x7f; - if (level) - i = (level / 20) - 1; - - mode_control &= ~P_M_MV508_ENHANCE_BITS; - mode_control |= P_M_MV508_ENHANCE_BITS; - set_mode(mode_control); - - if (i) - i = (i + 1) * 20; - return i; - break; - - case SOUND_MIXER_LOUD: - mode_control &= ~P_M_MV508_LOUDNESS; - if (level) - mode_control |= P_M_MV508_LOUDNESS; - set_mode(mode_control); - return !!level; /* 0 or 1 */ - break; - - case SOUND_MIXER_RECSRC: - devmask = level & POSSIBLE_RECORDING_DEVICES; - - changed = devmask ^ rec_devices; - rec_devices = devmask; - - for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) - if (changed & (1 << i)) { - pas_mixer_set(i, levels[i]); - } - return rec_devices; - break; - - default: - return -(EINVAL); - } - - return (levels[whichDev]); -} - -/*****/ - -static void -pas_mixer_reset(void) -{ - int foo; - - TRACE(printf("pas2_mixer.c: void pas_mixer_reset(void)\n")); - - for (foo = 0; foo < SOUND_MIXER_NRDEVICES; foo++) - pas_mixer_set(foo, levels[foo]); - - set_mode(P_M_MV508_LOUDNESS | P_M_MV508_ENHANCE_40); -} - -static int -pas_mixer_ioctl(int dev, u_int cmd, ioctl_arg arg) -{ - TRACE(printf("pas2_mixer.c: int pas_mixer_ioctl(u_int cmd = %X, u_int arg = %X)\n", cmd, arg)); - - if (((cmd >> 8) & 0xff) == 'M') { - if (cmd & IOC_IN) - return *(int *) arg = pas_mixer_set(cmd & 0xff, (*(int *) arg)); - else { /* Read parameters */ - - switch (cmd & 0xff) { - - case SOUND_MIXER_RECSRC: - return *(int *) arg = rec_devices; - break; - - case SOUND_MIXER_STEREODEVS: - return *(int *) arg = SUPPORTED_MIXER_DEVICES & ~(SOUND_MASK_BASS | SOUND_MASK_TREBLE); - break; - - case SOUND_MIXER_DEVMASK: - return *(int *) arg = SUPPORTED_MIXER_DEVICES; - break; - - case SOUND_MIXER_RECMASK: - return *(int *) arg = POSSIBLE_RECORDING_DEVICES & SUPPORTED_MIXER_DEVICES; - break; - - case SOUND_MIXER_CAPS: - return *(int *) arg = 0; /* No special - * capabilities */ - break; - - case SOUND_MIXER_MUTE: - return *(int *) arg = 0; /* No mute yet */ - break; - - case SOUND_MIXER_ENHANCE: - if (!(mode_control & P_M_MV508_ENHANCE_BITS)) - return *(int *) arg = 0; - return *(int *) arg = ((mode_control & P_M_MV508_ENHANCE_BITS) + 1) * 20; - break; - - case SOUND_MIXER_LOUD: - if (mode_control & P_M_MV508_LOUDNESS) - return *(int *) arg = 1; - return *(int *) arg = 0; - break; - - default: - return *(int *) arg = levels[cmd & 0xff]; - } - } - } - return -(EINVAL); -} - -static struct mixer_operations pas_mixer_operations = -{ - "Pro Audio Spectrum 16", - pas_mixer_ioctl -}; - -int -pas_init_mixer(void) -{ - pas_mixer_reset(); - - if (num_mixers < MAX_MIXER_DEV) - mixer_devs[num_mixers++] = &pas_mixer_operations; - return 1; -} - -#endif diff --git a/sys/i386/isa/sound/pas2_pcm.c b/sys/i386/isa/sound/pas2_pcm.c deleted file mode 100644 index f2fc95c..0000000 --- a/sys/i386/isa/sound/pas2_pcm.c +++ /dev/null @@ -1,449 +0,0 @@ -#define _PAS2_PCM_C_ -/* - * sound/pas2_pcm.c - * - * The low level driver for the Pro Audio Spectrum ADC/DAC. - * - * 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 - -#if defined(CONFIG_PAS) && defined(CONFIG_AUDIO) -#include - - -#define TRACE(WHAT) /* * * (WHAT) */ - -#define PAS_PCM_INTRBITS (0x08) -/* - * Sample buffer timer interrupt enable - */ - -#define PCM_NON 0 -#define PCM_DAC 1 -#define PCM_ADC 2 - -static u_long pcm_speed = 0; /* sampling rate */ -static u_char pcm_channels = 1; /* channels (1 or 2) */ -static u_char pcm_bits = 8; /* bits/sample (8 or 16) */ -static u_char pcm_filter = 0; /* filter FLAG */ -static u_char pcm_mode = PCM_NON; -static u_long pcm_count = 0; -static u_short pcm_bitsok = 8; /* mask of OK bits */ -static int my_devnum = 0; -static int open_mode = 0; - -static int -pcm_set_speed(int arg) -{ - int foo, tmp; - u_long flags; - - if (arg > 44100) - arg = 44100; - if (arg < 5000) - arg = 5000; - - foo = (1193180 + (arg / 2)) / arg; - arg = 1193180 / foo; - - if (pcm_channels & 2) - foo = foo >> 1; - - pcm_speed = arg; - - tmp = pas_read(FILTER_FREQUENCY); - - /* - * Set anti-aliasing filters according to sample rate. You reall - * *NEED* to enable this feature for all normal recording unless you - * want to experiment with aliasing effects. These filters apply to - * the selected "recording" source. I (pfw) don't know the encoding - * of these 5 bits. The values shown come from the SDK found on - * ftp.uwp.edu:/pub/msdos/proaudio/. - */ -#if !defined NO_AUTO_FILTER_SET - tmp &= 0xe0; - if (pcm_speed >= 2 * 17897) - tmp |= 0x21; - else if (pcm_speed >= 2 * 15909) - tmp |= 0x22; - else if (pcm_speed >= 2 * 11931) - tmp |= 0x29; - else if (pcm_speed >= 2 * 8948) - tmp |= 0x31; - else if (pcm_speed >= 2 * 5965) - tmp |= 0x39; - else if (pcm_speed >= 2 * 2982) - tmp |= 0x24; - pcm_filter = tmp; -#endif - - flags = splhigh(); - - pas_write(tmp & ~(F_F_PCM_RATE_COUNTER | F_F_PCM_BUFFER_COUNTER), FILTER_FREQUENCY); - pas_write(S_C_C_SAMPLE_RATE | S_C_C_LSB_THEN_MSB | S_C_C_SQUARE_WAVE, SAMPLE_COUNTER_CONTROL); - pas_write(foo & 0xff, SAMPLE_RATE_TIMER); - pas_write((foo >> 8) & 0xff, SAMPLE_RATE_TIMER); - pas_write(tmp, FILTER_FREQUENCY); - - splx(flags); - - return pcm_speed; -} - -static int -pcm_set_channels(int arg) -{ - - if ((arg != 1) && (arg != 2)) - return pcm_channels; - - if (arg != pcm_channels) { - pas_write(pas_read(PCM_CONTROL) ^ P_C_PCM_MONO, PCM_CONTROL); - - pcm_channels = arg; - pcm_set_speed(pcm_speed); /* The speed must be - * reinitialized */ - } - return pcm_channels; -} - -static int -pcm_set_bits(int arg) -{ - if ((arg & pcm_bitsok) != arg) - return pcm_bits; - - if (arg != pcm_bits) { - pas_write(pas_read(SYSTEM_CONFIGURATION_2) ^ S_C_2_PCM_16_BIT, SYSTEM_CONFIGURATION_2); - - pcm_bits = arg; - } - return pcm_bits; -} - -static int -pas_pcm_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) -{ - TRACE(printf("pas2_pcm.c: static int pas_pcm_ioctl(u_int cmd = %X, u_int arg = %X)\n", cmd, arg)); - - switch (cmd) { - case SOUND_PCM_WRITE_RATE: - if (local) - return pcm_set_speed((int) arg); - return *(int *) arg = pcm_set_speed((*(int *) arg)); - break; - - case SOUND_PCM_READ_RATE: - if (local) - return pcm_speed; - return *(int *) arg = pcm_speed; - break; - - case SNDCTL_DSP_STEREO: - if (local) - return pcm_set_channels((int) arg + 1) - 1; - return *(int *) arg = pcm_set_channels((*(int *) arg) + 1) - 1; - break; - - case SOUND_PCM_WRITE_CHANNELS: - if (local) - return pcm_set_channels((int) arg); - return *(int *) arg = pcm_set_channels((*(int *) arg)); - break; - - case SOUND_PCM_READ_CHANNELS: - if (local) - return pcm_channels; - return *(int *) arg = pcm_channels; - break; - - case SNDCTL_DSP_SETFMT: - if (local) - return pcm_set_bits((int) arg); - return *(int *) arg = pcm_set_bits((*(int *) arg)); - break; - - case SOUND_PCM_READ_BITS: - if (local) - return pcm_bits; - return *(int *) arg = pcm_bits; - - case SOUND_PCM_WRITE_FILTER: /* NOT YET IMPLEMENTED */ - if ((*(int *) arg) > 1) - return -(EINVAL); - pcm_filter = (*(int *) arg); - break; - - case SOUND_PCM_READ_FILTER: - return *(int *) arg = pcm_filter; - break; - - default: - return -(EINVAL); - } - - return -(EINVAL); -} - -static void -pas_pcm_reset(int dev) -{ - TRACE(printf("pas2_pcm.c: static void pas_pcm_reset(void)\n")); - - pas_write(pas_read(PCM_CONTROL) & ~P_C_PCM_ENABLE, PCM_CONTROL); -} - -static int -pas_pcm_open(int dev, int mode) -{ - int err; - - TRACE(printf("pas2_pcm.c: static int pas_pcm_open(int mode = %X)\n", mode)); - - if ((err = pas_set_intr(PAS_PCM_INTRBITS)) < 0) - return err; - - - pcm_count = 0; - open_mode = mode; - - return 0; -} - -static void -pas_pcm_close(int dev) -{ - u_long flags; - - TRACE(printf("pas2_pcm.c: static void pas_pcm_close(void)\n")); - - flags = splhigh(); - - pas_pcm_reset(dev); - pas_remove_intr(PAS_PCM_INTRBITS); - pcm_mode = PCM_NON; - - open_mode = 0; - - splx(flags); -} - -static void -pas_pcm_output_block(int dev, u_long buf, int count, - int intrflag, int restart_dma) -{ - u_long flags, cnt; - - TRACE(printf("pas2_pcm.c: static void pas_pcm_output_block(char *buf = %P, int count = %X)\n", buf, count)); - - cnt = count; - if (audio_devs[dev]->dmachan1 > 3) - cnt >>= 1; - - if (audio_devs[dev]->flags & DMA_AUTOMODE && - intrflag && - cnt == pcm_count) - return; /* Auto mode on. No need to react */ - - flags = splhigh(); - - pas_write(pas_read(PCM_CONTROL) & ~P_C_PCM_ENABLE, - PCM_CONTROL); - - if (restart_dma) - DMAbuf_start_dma(dev, buf, count, 1); - - if (audio_devs[dev]->dmachan1 > 3) - count >>= 1; - - if (count != pcm_count) { - pas_write(pas_read(FILTER_FREQUENCY) & ~F_F_PCM_BUFFER_COUNTER, FILTER_FREQUENCY); - pas_write(S_C_C_SAMPLE_BUFFER | S_C_C_LSB_THEN_MSB | S_C_C_SQUARE_WAVE, SAMPLE_COUNTER_CONTROL); - pas_write(count & 0xff, SAMPLE_BUFFER_COUNTER); - pas_write((count >> 8) & 0xff, SAMPLE_BUFFER_COUNTER); - pas_write(pas_read(FILTER_FREQUENCY) | F_F_PCM_BUFFER_COUNTER, FILTER_FREQUENCY); - - pcm_count = count; - } - pas_write(pas_read(FILTER_FREQUENCY) | F_F_PCM_BUFFER_COUNTER | F_F_PCM_RATE_COUNTER, FILTER_FREQUENCY); -#ifdef NO_TRIGGER - pas_write(pas_read(PCM_CONTROL) | P_C_PCM_ENABLE | P_C_PCM_DAC_MODE, PCM_CONTROL); -#endif - - pcm_mode = PCM_DAC; - - splx(flags); -} - -static void -pas_pcm_start_input(int dev, u_long buf, int count, - int intrflag, int restart_dma) -{ - u_long flags; - int cnt; - - TRACE(printf("pas2_pcm.c: static void pas_pcm_start_input(char *buf = %P, int count = %X)\n", buf, count)); - - cnt = count; - if (audio_devs[dev]->dmachan1 > 3) - cnt >>= 1; - - if (audio_devs[my_devnum]->flags & DMA_AUTOMODE && - intrflag && - cnt == pcm_count) - return; /* Auto mode on. No need to react */ - - flags = splhigh(); - - if (restart_dma) - DMAbuf_start_dma(dev, buf, count, 0); - - if (audio_devs[dev]->dmachan1 > 3) - count >>= 1; - - if (count != pcm_count) { - pas_write(pas_read(FILTER_FREQUENCY) & ~F_F_PCM_BUFFER_COUNTER, FILTER_FREQUENCY); - pas_write(S_C_C_SAMPLE_BUFFER | S_C_C_LSB_THEN_MSB | S_C_C_SQUARE_WAVE, SAMPLE_COUNTER_CONTROL); - pas_write(count & 0xff, SAMPLE_BUFFER_COUNTER); - pas_write((count >> 8) & 0xff, SAMPLE_BUFFER_COUNTER); - pas_write(pas_read(FILTER_FREQUENCY) | F_F_PCM_BUFFER_COUNTER, FILTER_FREQUENCY); - - pcm_count = count; - } - pas_write(pas_read(FILTER_FREQUENCY) | F_F_PCM_BUFFER_COUNTER | F_F_PCM_RATE_COUNTER, FILTER_FREQUENCY); -#ifdef NO_TRIGGER - pas_write((pas_read(PCM_CONTROL) | P_C_PCM_ENABLE) & ~P_C_PCM_DAC_MODE, PCM_CONTROL); -#endif - - pcm_mode = PCM_ADC; - - splx(flags); -} -#ifndef NO_TRIGGER -static void -pas_audio_trigger (int dev, int state) -{ - unsigned long flags; - - flags = splhigh(); - - state &= open_mode; - - if (state & PCM_ENABLE_OUTPUT) - pas_write (pas_read (0xF8A) | 0x40 | 0x10, 0xF8A); - else if (state & PCM_ENABLE_INPUT) - pas_write ((pas_read (0xF8A) | 0x40) & ~0x10, 0xF8A); - else - pas_write (pas_read (0xF8A) & ~0x40, 0xF8A); - - splx(flags); -} -#endif - -static int -pas_pcm_prepare_for_input(int dev, int bsize, int bcount) -{ - return 0; -} -static int -pas_pcm_prepare_for_output(int dev, int bsize, int bcount) -{ - return 0; -} - -static struct audio_operations pas_pcm_operations = -{ - "Pro Audio Spectrum", - DMA_AUTOMODE, - AFMT_U8 | AFMT_S16_LE, - NULL, - pas_pcm_open, - pas_pcm_close, - pas_pcm_output_block, - pas_pcm_start_input, - pas_pcm_ioctl, - pas_pcm_prepare_for_input, - pas_pcm_prepare_for_output, - pas_pcm_reset, - pas_pcm_reset, - NULL, - NULL, - NULL, - NULL, - pas_audio_trigger -}; - -void -pas_pcm_init(struct address_info * hw_config) -{ - pcm_bitsok = 8; - if (pas_read(OPERATION_MODE_1) & O_M_1_PCM_TYPE) - pcm_bitsok |= 16; - - pcm_set_speed(DSP_DEFAULT_SPEED); - - if (num_audiodevs < MAX_AUDIO_DEV) { - audio_devs[my_devnum = num_audiodevs++] = &pas_pcm_operations; - audio_devs[my_devnum]->dmachan1 = hw_config->dma; - audio_devs[my_devnum]->buffsize = DSP_BUFFSIZE; - } else - printf("PAS2: Too many PCM devices available\n"); - - return; -} - -void -pas_pcm_interrupt(u_char status, int cause) -{ - if (cause == 1) { /* PCM buffer done */ - /* - * Halt the PCM first. Otherwise we don't have time to start - * a new block before the PCM chip proceeds to the next - * sample - */ - - if (!(audio_devs[my_devnum]->flags & DMA_AUTOMODE)) { - pas_write(pas_read(PCM_CONTROL) & ~P_C_PCM_ENABLE, - PCM_CONTROL); - } - switch (pcm_mode) { - - case PCM_DAC: - DMAbuf_outputintr(my_devnum, 1); - break; - - case PCM_ADC: - DMAbuf_inputintr(my_devnum); - break; - - default: - printf("PAS: Unexpected PCM interrupt\n"); - } - } -} - -#endif diff --git a/sys/i386/isa/sound/pas_defs.h b/sys/i386/isa/sound/pas_defs.h deleted file mode 100644 index c4af2d4..0000000 --- a/sys/i386/isa/sound/pas_defs.h +++ /dev/null @@ -1,250 +0,0 @@ -/* */ -/* Port addresses and bit fields for the Media Vision Pro AudioSpectrum second generation sound cards. */ -/* */ -/* Feel free to use this header file in any application you create that has support for the Media Vision */ -/* Pro AudioSpectrum second generation sound cards. Other uses prohibited without prior permission. */ -/* */ -/* - cmetz@thor.tjhsst.edu */ -/* */ -/* Notes: */ -/* */ -/* * All of these ports go into the MVD101 multimedia controller chip, which then signals the other chips to do */ -/* the actual work. Many ports like the FM ones functionally attach directly to the destination chip though */ -/* they don't actually have a direct connection. */ -/* */ -/* * The PAS2 series cards have an MVD101 multimedia controller chip, the original PAS cards don't. The original */ -/* PAS cards are pretty defunct now, so no attempt is made here to support them. */ -/* */ -/* * The PAS2 series cards are all really different at the hardware level, though the MVD101 hides some of the */ -/* incompatibilities, there still are differences that need to be accounted for. */ -/* */ -/* Card CD-ROM interface PCM chip Mixer chip FM chip */ -/* PAS Plus Sony proprietary (Crystal?) 8-bit DAC National OPL3 */ -/* PAS 16 Zilog SCSI MVA416 16-bit Codec MVA508 OPL3 */ -/* CDPC Sony proprietary Sony 16-bit Codec National OPL3 */ -/* Fusion CD 16 Sony proprietary MVA416 16-bit Codec MVA508 OPL3 */ -/* Fusion CD Sony proprietary (Crystal?) 8-bit DAC National OPL3 */ -/* */ -#define PAS_DEFAULT_BASE 0x388 - -/* Symbolic Name Value R W Subsystem Description */ -#define SPEAKER_CONTROL 0x61 /* W PC speaker Control register */ -#define SPEAKER_CONTROL_GHOST 0x738B /* R W PC speaker Control ghost register */ -#define SPEAKER_TIMER_CONTROL 0x43 /* W PC speaker Timer control register */ -#define SPEAKER_TIMER_CONTROL_GHOST 0x778B /* R W PC speaker Timer control register ghost */ -#define SPEAKER_TIMER_DATA 0x42 /* W PC speaker Timer data register */ -#define SPEAKER_TIMER_DATA_GHOST 0x138A /* R W PC speaker Timer data register ghost */ - -#define WARM_BOOT 0x41 /* W Control Used to detect system warm boot */ -#define WARM_BOOT_GHOST 0x7789 /* ? W Control Use to get the card to fake warm boot */ -#define MASTER_DECODE 0x9A01 /* W Control Address >> 2 of card base address */ -#define PRESCALE_DIVIDER 0xBF8A /* R W PCM Ration between Codec clock and master clock */ -#define WAIT_STATE 0xBF88 /* R W Control Four-bit bus wait-state count (~140ns ea.) */ -#define BOARD_REV_ID 0x2789 /* R Control Extended Board Revision ID */ - -#define CHIP_REV 0xFF88 /* R 0=PAS, 1=PAS+, 2=CDPC, 3=PAS16C, 4=PAS16D */ - -#define SYSTEM_CONFIGURATION_1 0x8388 /* R W Control */ - #define S_C_1_PCS_ENABLE 0x01 /* R W PC speaker 1=enable, 0=disable PC speaker emulation */ - #define S_C_1_PCM_CLOCK_SELECT 0x02 /* R W PCM 1=14.31818Mhz/12, 0=28.224Mhz master clock */ - #define S_C_1_FM_EMULATE_CLOCK 0x04 /* R W FM 1=use 28.224Mhz/2, 0=use 14.31818Mhz clock */ - #define S_C_1_PCS_STEREO 0x10 /* R W PC speaker 1=enable PC speaker stereo effect, 0=disable */ - #define S_C_1_PCS_REALSOUND 0x20 /* R W PC speaker 1=enable RealSound enhancement, 0=disable */ - #define S_C_1_FORCE_EXT_RESET 0x40 /* R W Control Force external reset */ - #define S_C_1_FORCE_INT_RESET 0x80 /* R W Control Force internal reset */ -#define SYSTEM_CONFIGURATION_2 0x8389 /* R W Control */ - #define S_C_2_PCM_OVERSAMPLING 0x03 /* R W PCM 00=0x, 01=2x, 10=4x, 11=reserved */ - #define S_C_2_PCM_16_BIT 0x04 /* R W PCM 1=16-bit, 0=8-bit samples */ -#define SYSTEM_CONFIGURATION_3 0x838A /* R W Control */ - #define S_C_3_PCM_CLOCK_SELECT 0x02 /* R W PCM 1=use 1.008Mhz clock for PCM, 0=don't */ -#define SYSTEM_CONFIGURATION_4 0x838B /* R W Control CD-ROM interface controls */ - -#define IO_CONFIGURATION_1 0xF388 /* R W Control */ - #define I_C_1_BOOT_RESET_ENABLE 0x80 /* R W Control 1=reset board on warm boot, 0=don't */ - #define I_C_1_JOYSTICK_ENABLE 0x40 /* R W Control 1=enable joystick port, 0=don't */ -#define IO_CONFIGURATION_2 0xF389 /* R W Control */ - #define I_C_2_PCM_DMA_DISABLED 0x00 /* R W PCM PCM DMA disabled */ -#define IO_CONFIGURATION_3 0xF38A /* R W Control */ - #define I_C_3_PCM_IRQ_DISABLED 0x00 /* R W PCM PCM IRQ disabled */ - -#define COMPATIBILITY_ENABLE 0xF788 /* R W Control */ - #define C_E_MPU401_ENABLE 0x01 /* R W MIDI 1=enable, 0=disable MPU401 MIDI emulation */ - #define C_E_SB_ENABLE 0x02 /* R W PCM 1=enable, 0=disable Sound Blaster emulation */ - #define C_E_SB_ACTIVE 0x04 /* R PCM "Sound Blaster Interrupt active" */ - #define C_E_MPU401_ACTIVE 0x08 /* R MIDI "MPU UART mode active" */ - #define C_E_PCM_COMPRESSION 0x10 /* R W PCM 1=enable, 0=disabled compression */ -#define EMULATION_ADDRESS 0xF789 /* R W Control */ - #define E_A_SB_BASE 0x0f /* R W PCM bits A4-A7 for SB base port */ - #define E_A_MPU401_BASE 0xf0 /* R W MIDI bits A4-A7 for MPU401 base port */ -#define EMULATION_CONFIGURATION 0xFB8A /* R W ***** Only valid on newer PAS2 cards (?) ***** */ - #define E_C_MPU401_IRQ 0x07 /* R W MIDI MPU401 emulation IRQ */ - #define E_C_SB_IRQ 0x38 /* R W PCM SB emulation IRQ */ - #define E_C_SB_DMA 0xC0 /* R W PCM SB emulation DMA */ - -#define OPERATION_MODE_1 0xEF8B /* R Control */ - #define O_M_1_CDROM_TYPE 0x03 /* R CD-ROM 3=SCSI, 2=Sony, 0=no CD-ROM interface */ - #define O_M_1_FM_TYPE 0x04 /* R FM 1=sterero, 0=mono FM chip */ - #define O_M_1_PCM_TYPE 0x08 /* R PCM 1=16-bit Codec, 0=8-bit DAC */ -#define OPERATION_MODE_2 0xFF8B /* R Control */ - #define O_M_2_PCS_ENABLED 0x02 /* R PC speaker PC speaker emulation 1=enabled, 0=disabled */ - #define O_M_2_BUS_TIMING 0x10 /* R Control 1=AT bus timing, 0=XT bus timing */ - #define O_M_2_BOARD_REVISION 0xe0 /* R Control Board revision */ - -#define INTERRUPT_MASK 0x0B8B /* R W Control */ - #define I_M_FM_LEFT_IRQ_ENABLE 0x01 /* R W FM Enable FM left interrupt */ - #define I_M_FM_RIGHT_IRQ_ENABLE 0x02 /* R W FM Enable FM right interrupt */ - #define I_M_PCM_RATE_IRQ_ENABLE 0x04 /* R W PCM Enable Sample Rate interrupt */ - #define I_M_PCM_BUFFER_IRQ_ENABLE 0x08 /* R W PCM Enable Sample Buffer interrupt */ - #define I_M_MIDI_IRQ_ENABLE 0x10 /* R W MIDI Enable MIDI interrupt */ - #define I_M_BOARD_REV 0xE0 /* R Control Board revision */ - -#define INTERRUPT_STATUS 0x0B89 /* R W Control */ - #define I_S_FM_LEFT_IRQ 0x01 /* R W FM Left FM Interrupt Pending */ - #define I_S_FM_RIGHT_IRQ 0x02 /* R W FM Right FM Interrupt Pending */ - #define I_S_PCM_SAMPLE_RATE_IRQ 0x04 /* R W PCM Sample Rate Interrupt Pending */ - #define I_S_PCM_SAMPLE_BUFFER_IRQ 0x08 /* R W PCM Sample Buffer Interrupt Pending */ - #define I_S_MIDI_IRQ 0x10 /* R W MIDI MIDI Interrupt Pending */ - #define I_S_PCM_CHANNEL 0x20 /* R W PCM 1=right, 0=left */ - #define I_S_RESET_ACTIVE 0x40 /* R W Control Reset is active (Timed pulse not finished) */ - #define I_S_PCM_CLIPPING 0x80 /* R W PCM Clipping has occurred */ - -#define FILTER_FREQUENCY 0x0B8A /* R W Control */ - #define F_F_FILTER_DISABLED 0x00 /* R W Mixer No filter */ -#if 0 - struct { /* R W Mixer Filter translation */ - unsigned int freq:24; - unsigned int value:8; - } F_F_FILTER_translate[] = - { { 73500, 0x01 }, /* 73500Hz - divide by 16 */ - { 65333, 0x02 }, /* 65333Hz - divide by 18 */ - { 49000, 0x09 }, /* 49000Hz - divide by 24 */ - { 36750, 0x11 }, /* 36750Hz - divide by 32 */ - { 24500, 0x19 }, /* 24500Hz - divide by 48 */ - { 18375, 0x07 }, /* 18375Hz - divide by 64 */ - { 12783, 0x0f }, /* 12783Hz - divide by 92 */ - { 12250, 0x04 }, /* 12250Hz - divide by 96 */ - { 9188, 0x17 }, /* 9188Hz - divide by 128 */ - { 6125, 0x1f }, /* 6125Hz - divide by 192 */ - }; -#endif - #define F_F_MIXER_UNMUTE 0x20 /* R W Mixer 1=disable, 0=enable board mute */ - #define F_F_PCM_RATE_COUNTER 0x40 /* R W PCM 1=enable, 0=disable sample rate counter */ - #define F_F_PCM_BUFFER_COUNTER 0x80 /* R W PCM 1=enable, 0=disable sample buffer counter */ - -#define PAS_NONE 0 -#define PAS_PLUS 1 -#define PAS_CDPC 2 -#define PAS_16 3 -#define PAS_16D 4 - -#ifdef DEFINE_TRANSLATIONS -static unsigned char I_C_2_PCM_DMA_translate[] = /* R W PCM PCM DMA channel value translations */ - { 4, 1, 2, 3, 0, 5, 6, 7 }; -static unsigned char I_C_3_PCM_IRQ_translate[] = /* R W PCM PCM IRQ level value translation */ - { 0, 0, 1, 2, 3, 4, 5, 6, 0, 1, 7, 8, 9, 0, 10, 11 }; -#ifdef unused -static unsigned char E_C_MPU401_IRQ_translate[] = /* R W MIDI MPU401 emulation IRQ value translation */ - { 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x05, 0x06, 0x07 }; -#endif -static unsigned char E_C_SB_IRQ_translate[] = /* R W PCM SB emulation IRQ translate */ - { 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x00, 0x20, 0x00, 0x08, 0x28, 0x30, 0x38, 0, 0 }; -static unsigned char E_C_SB_DMA_translate[] = /* R W PCM SB emulation DMA translate */ - { 0x00, 0x40, 0x80, 0xC0, 0, 0, 0, 0 }; -#ifdef unused -static unsigned char O_M_1_to_card[] = /* R W Control Translate (OM1 & 0x0f) to card type */ - { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 0, 2, 3 }; -#endif -#endif - -#define PARALLEL_MIXER 0x078B /* W Mixer Documented for MVD101 as FM Mono Right decode?? */ - #define P_M_MV508_ADDRESS 0x80 /* W Mixer MVD508 Address/mixer select */ - #define P_M_MV508_DATA 0x00 - #define P_M_MV508_LEFT 0x20 /* W Mixer MVD508 Left channel select */ - #define P_M_MV508_RIGHT 0x40 /* W Mixer MVD508 Right channel select */ - #define P_M_MV508_BOTH 0x00 /* W Mixer MVD508 Both channel select */ - #define P_M_MV508_MIXER 0x10 /* W Mixer MVD508 Select a mixer (rather than a volume) */ - #define P_M_MV508_VOLUME 0x00 - - #define P_M_MV508_INPUTMIX 0x20 /* W Mixer MVD508 Select mixer A */ - #define P_M_MV508_OUTPUTMIX 0x00 /* W Mixer MVD508 Select mixer B */ - - #define P_M_MV508_MASTER_A 0x01 /* W Mixer MVD508 Master volume control A (output) */ - #define P_M_MV508_MASTER_B 0x02 /* W Mixer MVD508 Master volume control B (DSP input) */ - #define P_M_MV508_BASS 0x03 /* W Mixer MVD508 Bass control */ - #define P_M_MV508_TREBLE 0x04 /* W Mixer MVD508 Treble control */ - #define P_M_MV508_MODE 0x05 /* W Mixer MVD508 Master mode control */ - - #define P_M_MV508_LOUDNESS 0x04 /* W Mixer MVD508 Mode control - Loudness filter */ - #define P_M_MV508_ENHANCE_BITS 0x03 - #define P_M_MV508_ENHANCE_NONE 0x00 /* W Mixer MVD508 Mode control - No stereo enhancement */ - #define P_M_MV508_ENHANCE_40 0x01 /* W Mixer MVD508 Mode control - 40% stereo enhancement */ - #define P_M_MV508_ENHANCE_60 0x02 /* W Mixer MVD508 Mode control - 60% stereo enhancement */ - #define P_M_MV508_ENHANCE_80 0x03 /* W Mixer MVD508 Mode control - 80% stereo enhancement */ - - #define P_M_MV508_FM 0x00 /* W Mixer MVD508 Channel 0 - FM */ - #define P_M_MV508_IMIXER 0x01 /* W Mixer MVD508 Channel 1 - Input mixer (rec monitor) */ - #define P_M_MV508_LINE 0x02 /* W Mixer MVD508 Channel 2 - Line in */ - #define P_M_MV508_CDROM 0x03 /* W Mixer MVD508 Channel 3 - CD-ROM */ - #define P_M_MV508_MIC 0x04 /* W Mixer MVD508 Channel 4 - Microphone */ - #define P_M_MV508_PCM 0x05 /* W Mixer MVD508 Channel 5 - PCM */ - #define P_M_MV508_SPEAKER 0x06 /* W Mixer MVD508 Channel 6 - PC Speaker */ - #define P_M_MV508_SB 0x07 /* W Mixer MVD508 Channel 7 - SB DSP */ - -#define SERIAL_MIXER 0xB88 /* R W Control Serial mixer control (used other ways) */ - #define S_M_PCM_RESET 0x01 /* R W PCM Codec/DSP reset */ - #define S_M_FM_RESET 0x02 /* R W FM FM chip reset */ - #define S_M_SB_RESET 0x04 /* R W PCM SB emulation chip reset */ - #define S_M_MIXER_RESET 0x10 /* R W Mixer Mixer chip reset */ - #define S_M_INTEGRATOR_ENABLE 0x40 /* R W Speaker Enable PC speaker integrator (FORCE RealSound) */ - #define S_M_OPL3_DUAL_MONO 0x80 /* R W FM Set the OPL-3 to dual mono mode */ - -#define PCM_CONTROL 0xF8A /* R W PCM PCM Control Register */ - #define P_C_MIXER_CROSS_FIELD 0x0f - #define P_C_MIXER_CROSS_R_TO_R 0x01 /* R W Mixer Connect Right to Right */ - #define P_C_MIXER_CROSS_L_TO_R 0x02 /* R W Mixer Connect Left to Right */ - #define P_C_MIXER_CROSS_R_TO_L 0x04 /* R W Mixer Connect Right to Left */ - #define P_C_MIXER_CROSS_L_TO_L 0x08 /* R W Mixer Connect Left to Left */ - #define P_C_PCM_DAC_MODE 0x10 /* R W PCM Playback (DAC) mode */ - #define P_C_PCM_ADC_MODE 0x00 /* R W PCM Record (ADC) mode */ - #define P_C_PCM_MONO 0x20 /* R W PCM Mono mode */ - #define P_C_PCM_STEREO 0x00 /* R W PCM Stereo mode */ - #define P_C_PCM_ENABLE 0x40 /* R W PCM Enable PCM engine */ - #define P_C_PCM_DMA_ENABLE 0x80 /* R W PCM Enable DRQ */ - -#define SAMPLE_COUNTER_CONTROL 0x138B /* R W PCM Sample counter control register */ - #define S_C_C_SQUARE_WAVE 0x04 /* R W PCM Square wave generator (use for sample rate) */ - #define S_C_C_RATE 0x06 /* R W PCM Rate generator (use for sample buffer count) */ - #define S_C_C_LSB_THEN_MSB 0x30 /* R W PCM Change all 16 bits, LSB first, then MSB */ - - /* MVD101 and SDK documentations have S_C_C_SAMPLE_RATE and S_C_C_SAMPLE_BUFFER transposed. Only one works :-) */ - #define S_C_C_SAMPLE_RATE 0x00 /* R W PCM Select sample rate timer */ - #define S_C_C_SAMPLE_BUFFER 0x40 /* R W PCM Select sample buffer counter */ - - #define S_C_C_PC_SPEAKER 0x80 /* R W PCM Select PC speaker counter */ - -#define SAMPLE_RATE_TIMER 0x1388 /* W PCM Sample rate timer register (PCM wait interval) */ -#define SAMPLE_BUFFER_COUNTER 0x1389 /* R W PCM Sample buffer counter (DMA buffer size) */ - -#define MIDI_CONTROL 0x178b /* R W MIDI Midi control register */ - #define M_C_ENA_TSTAMP_IRQ 0x01 /* R W MIDI Enable Time Stamp Interrupts */ - #define M_C_ENA_TME_COMP_IRQ 0x02 /* R W MIDI Enable time compare interrupts */ - #define M_C_ENA_INPUT_IRQ 0x04 /* R W MIDI Enable input FIFO interrupts */ - #define M_C_ENA_OUTPUT_IRQ 0x08 /* R W MIDI Enable output FIFO interrupts */ - #define M_C_ENA_OUTPUT_HALF_IRQ 0x10 /* R W MIDI Enable output FIFO half full interrupts */ - #define M_C_RESET_INPUT_FIFO 0x20 /* R W MIDI Reset input FIFO pointer */ - #define M_C_RESET_OUTPUT_FIFO 0x40 /* R W MIDI Reset output FIFO pointer */ - #define M_C_ENA_THRU_MODE 0x80 /* R W MIDI Echo input to output (THRU) */ - -#define MIDI_STATUS 0x1B88 /* R W MIDI Midi (interrupt) status register */ - #define M_S_TIMESTAMP 0x01 /* R W MIDI Midi time stamp interrupt occurred */ - #define M_S_COMPARE 0x02 /* R W MIDI Midi compare time interrupt occurred */ - #define M_S_INPUT_AVAIL 0x04 /* R W MIDI Midi input data available interrupt occurred */ - #define M_S_OUTPUT_EMPTY 0x08 /* R W MIDI Midi output FIFO empty interrupt occurred */ - #define M_S_OUTPUT_HALF_EMPTY 0x10 /* R W MIDI Midi output FIFO half empty interrupt occurred */ - #define M_S_INPUT_OVERRUN 0x20 /* R W MIDI Midi input overrun error occurred */ - #define M_S_OUTPUT_OVERRUN 0x40 /* R W MIDI Midi output overrun error occurred */ - #define M_S_FRAMING_ERROR 0x80 /* R W MIDI Midi input framing error occurred */ - -#define MIDI_FIFO_STATUS 0x1B89 /* R W MIDI Midi fifo status */ -#define MIDI_DATA 0x178A /* R W MIDI Midi data register */ -#define MIDI_INPUT_AVAILABLE 0x0f /* RW MIDI */ diff --git a/sys/i386/isa/sound/pas_hw.h b/sys/i386/isa/sound/pas_hw.h deleted file mode 100644 index 5f82328..0000000 --- a/sys/i386/isa/sound/pas_hw.h +++ /dev/null @@ -1,236 +0,0 @@ -/* */ -/* Port addresses and bit fields for the Media Vision Pro AudioSpectrum second generation sound cards. */ -/* */ -/* Feel free to use this header file in any application you create that has support for the Media Vision */ -/* Pro AudioSpectrum second generation sound cards. Other uses prohibited without prior permission. */ -/* */ -/* - cmetz@thor.tjhsst.edu */ -/* */ -/* Notes: */ -/* */ -/* * All of these ports go into the MVD101 multimedia controller chip, which then signals the other chips to do */ -/* the actual work. Many ports like the FM ones functionally attach directly to the destination chip though */ -/* they don't actually have a direct connection. */ -/* */ -/* * The PAS2 series cards have an MVD101 multimedia controller chip, the original PAS cards don't. The original */ -/* PAS cards are pretty defunct now, so no attempt is made here to support them. */ -/* */ -/* * The PAS2 series cards are all really different at the hardware level, though the MVD101 hides some of the */ -/* incompatibilities, there still are differences that need to be accounted for. */ -/* */ -/* Card CD-ROM interface PCM chip Mixer chip FM chip */ -/* PAS Plus Sony proprietary (Crystal?) 8-bit DAC National OPL3 */ -/* PAS 16 Zilog SCSI MVA416 16-bit Codec MVA508 OPL3 */ -/* CDPC Sony proprietary Sony 16-bit Codec National OPL3 */ -/* Fusion CD 16 Sony proprietary MVA416 16-bit Codec MVA508 OPL3 */ -/* Fusion CD Sony proprietary (Crystal?) 8-bit DAC National OPL3 */ -/* */ -#define PAS_DEFAULT_BASE 0x388 - -/* Symbolic Name Value R W Subsystem Description */ -#define SPEAKER_CONTROL 0x61 /* W PC speaker Control register */ -#define SPEAKER_CONTROL_GHOST 0x738B /* R W PC speaker Control ghost register */ -#define SPEAKER_TIMER_CONTROL 0x43 /* W PC speaker Timer control register */ -#define SPEAKER_TIMER_CONTROL_GHOST 0x778B /* R W PC speaker Timer control register ghost */ -#define SPEAKER_TIMER_DATA 0x42 /* W PC speaker Timer data register */ -#define SPEAKER_TIMER_DATA_GHOST 0x138A /* R W PC speaker Timer data register ghost */ - -#define WARM_BOOT 0x41 /* W Control Used to detect system warm boot */ -#define WARM_BOOT_GHOST 0x7789 /* ? W Control Use to get the card to fake warm boot */ -#define MASTER_DECODE 0x9A01 /* W Control Address >> 2 of card base address */ -#define PRESCALE_DIVIDER 0xBF8A /* R W PCM Ration between Codec clock and master clock */ -#define WAIT_STATE 0xBF88 /* R W Control Four-bit bus wait-state count (~140ns ea.) */ -#define BOARD_REV_ID 0x2789 /* R Control Extended Board Revision ID */ - -#define CHIP_REV 0xFF88 /* R 0=PAS, 1=PAS+, 2=CDPC, 3=PAS16C, 4=PAS16D */ - -#define SYSTEM_CONFIGURATION_1 0x8388 /* R W Control */ -# define S_C_1_PCS_ENABLE 0x01 /* R W PC speaker 1=enable, 0=disable PC speaker emulation */ -# define S_C_1_PCM_CLOCK_SELECT 0x02 /* R W PCM 1=14.31818Mhz/12, 0=28.224Mhz master clock */ -# define S_C_1_FM_EMULATE_CLOCK 0x04 /* R W FM 1=use 28.224Mhz/2, 0=use 14.31818Mhz clock */ -# define S_C_1_PCS_STEREO 0x10 /* R W PC speaker 1=enable PC speaker stereo effect, 0=disable */ -# define S_C_1_PCS_REALSOUND 0x20 /* R W PC speaker 1=enable RealSound enhancement, 0=disable */ -# define S_C_1_FORCE_EXT_RESET 0x40 /* R W Control Force external reset */ -# define S_C_1_FORCE_INT_RESET 0x80 /* R W Control Force internal reset */ -#define SYSTEM_CONFIGURATION_2 0x8389 /* R W Control */ -# define S_C_2_PCM_OVERSAMPLING 0x03 /* R W PCM 00=0x, 01=2x, 10=4x, 11=reserved */ -# define S_C_2_PCM_16_BIT 0x04 /* R W PCM 1=16-bit, 0=8-bit samples */ -#define SYSTEM_CONFIGURATION_3 0x838A /* R W Control */ -# define S_C_3_PCM_CLOCK_SELECT 0x02 /* R W PCM 1=use 1.008Mhz clock for PCM, 0=don't */ -#define SYSTEM_CONFIGURATION_4 0x838B /* R W Control CD-ROM interface controls */ - -#define IO_CONFIGURATION_1 0xF388 /* R W Control */ -# define I_C_1_BOOT_RESET_ENABLE 0x80 /* R W Control 1=reset board on warm boot, 0=don't */ -# define I_C_1_JOYSTICK_ENABLE 0x40 /* R W Control 1=enable joystick port, 0=don't */ -#define IO_CONFIGURATION_2 0xF389 /* R W Control */ -# define I_C_2_PCM_DMA_DISABLED 0x00 /* R W PCM PCM DMA disabled */ -#define IO_CONFIGURATION_3 0xF38A /* R W Control */ -# define I_C_3_PCM_IRQ_DISABLED 0x00 /* R W PCM PCM IRQ disabled */ - -#define COMPATIBILITY_ENABLE 0xF788 /* R W Control */ -# define C_E_MPU401_ENABLE 0x01 /* R W MIDI 1=enable, 0=disable MPU401 MIDI emulation */ -# define C_E_SB_ENABLE 0x02 /* R W PCM 1=enable, 0=disable Sound Blaster emulation */ -# define C_E_SB_ACTIVE 0x04 /* R PCM "Sound Blaster Interrupt active" */ -# define C_E_MPU401_ACTIVE 0x08 /* R MIDI "MPU UART mode active" */ -# define C_E_PCM_COMPRESSION 0x10 /* R W PCM 1=enable, 0=disabled compression */ -#define EMULATION_ADDRESS 0xF789 /* R W Control */ -# define E_A_SB_BASE 0x0f /* R W PCM bits A4-A7 for SB base port */ -# define E_A_MPU401_BASE 0xf0 /* R W MIDI bits A4-A7 for MPU401 base port */ -#define EMULATION_CONFIGURATION 0xFB8A /* R W ***** Only valid on newer PAS2 cards (?) ***** */ -# define E_C_MPU401_IRQ 0x07 /* R W MIDI MPU401 emulation IRQ */ -# define E_C_SB_IRQ 0x38 /* R W PCM SB emulation IRQ */ -# define E_C_SB_DMA 0xC0 /* R W PCM SB emulation DMA */ - -#define OPERATION_MODE_1 0xEF8B /* R Control */ -# define O_M_1_CDROM_TYPE 0x03 /* R CD-ROM 3=SCSI, 2=Sony, 0=no CD-ROM interface */ -# define O_M_1_FM_TYPE 0x04 /* R FM 1=sterero, 0=mono FM chip */ -# define O_M_1_PCM_TYPE 0x08 /* R PCM 1=16-bit Codec, 0=8-bit DAC */ -#define OPERATION_MODE_2 0xFF8B /* R Control */ -# define O_M_2_PCS_ENABLED 0x02 /* R PC speaker PC speaker emulation 1=enabled, 0=disabled */ -# define O_M_2_BUS_TIMING 0x10 /* R Control 1=AT bus timing, 0=XT bus timing */ -# define O_M_2_BOARD_REVISION 0xe0 /* R Control Board revision */ - -#define INTERRUPT_MASK 0x0B8B /* R W Control */ -# define I_M_FM_LEFT_IRQ_ENABLE 0x01 /* R W FM Enable FM left interrupt */ -# define I_M_FM_RIGHT_IRQ_ENABLE 0x02 /* R W FM Enable FM right interrupt */ -# define I_M_PCM_RATE_IRQ_ENABLE 0x04 /* R W PCM Enable Sample Rate interrupt */ -# define I_M_PCM_BUFFER_IRQ_ENABLE 0x08 /* R W PCM Enable Sample Buffer interrupt */ -# define I_M_MIDI_IRQ_ENABLE 0x10 /* R W MIDI Enable MIDI interrupt */ -# define I_M_BOARD_REV 0xE0 /* R Control Board revision */ - -#define INTERRUPT_STATUS 0x0B89 /* R W Control */ -# define I_S_FM_LEFT_IRQ 0x01 /* R W FM Left FM Interrupt Pending */ -# define I_S_FM_RIGHT_IRQ 0x02 /* R W FM Right FM Interrupt Pending */ -# define I_S_PCM_SAMPLE_RATE_IRQ 0x04 /* R W PCM Sample Rate Interrupt Pending */ -# define I_S_PCM_SAMPLE_BUFFER_IRQ 0x08 /* R W PCM Sample Buffer Interrupt Pending */ -# define I_S_MIDI_IRQ 0x10 /* R W MIDI MIDI Interrupt Pending */ -# define I_S_PCM_CHANNEL 0x20 /* R W PCM 1=right, 0=left */ -# define I_S_RESET_ACTIVE 0x40 /* R W Control Reset is active (Timed pulse not finished) */ -# define I_S_PCM_CLIPPING 0x80 /* R W PCM Clipping has occurred */ - -#define FILTER_FREQUENCY 0x0B8A /* R W Control */ -# define F_F_FILTER_DISABLED 0x00 /* R W Mixer No filter */ -# define F_F_MIXER_UNMUTE 0x20 /* R W Mixer 1=disable, 0=enable board mute */ -# define F_F_PCM_RATE_COUNTER 0x40 /* R W PCM 1=enable, 0=disable sample rate counter */ -# define F_F_PCM_BUFFER_COUNTER 0x80 /* R W PCM 1=enable, 0=disable sample buffer counter */ - -#define PAS_NONE 0 -#define PAS_PLUS 1 -#define PAS_CDPC 2 -#define PAS_16 3 -#define PAS_16D 4 - -#ifdef DEFINE_TRANSLATIONS - unsigned char I_C_2_PCM_DMA_translate[] = /* R W PCM PCM DMA channel value translations */ - { 4, 1, 2, 3, 0, 5, 6, 7 }; - unsigned char I_C_3_PCM_IRQ_translate[] = /* R W PCM PCM IRQ level value translation */ - { 0, 0, 1, 2, 3, 4, 5, 6, 0, 1, 7, 8, 9, 0, 10, 11 }; - unsigned char E_C_MPU401_IRQ_translate[] = /* R W MIDI MPU401 emulation IRQ value translation */ - { 0x00, 0x00, 0x01, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x05, 0x06, 0x07 }; - unsigned char E_C_SB_IRQ_translate[] = /* R W PCM SB emulation IRQ translate */ - { 0x00, 0x00, 0x08, 0x10, 0x00, 0x18, 0x00, 0x20, 0x00, 0x08, 0x28, 0x30, 0x38, 0, 0 }; - unsigned char E_C_SB_DMA_translate[] = /* R W PCM SB emulation DMA translate */ - { 0x00, 0x40, 0x80, 0xC0, 0, 0, 0, 0 }; - unsigned char O_M_1_to_card[] = /* R W Control Translate (OM1 & 0x0f) to card type */ - { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 4, 0, 2, 3 }; -#else - extern unsigned char I_C_2_PCM_DMA_translate[]; /* R W PCM PCM DMA channel value translations */ - extern unsigned char I_C_3_PCM_IRQ_translate[]; /* R W PCM PCM IRQ level value translation */ - extern unsigned char E_C_MPU401_IRQ_translate[]; /* R W MIDI MPU401 emulation IRQ value translation */ - extern unsigned char E_C_SB_IRQ_translate[]; /* R W PCM SB emulation IRQ translate */ - extern unsigned char E_C_SB_DMA_translate[]; /* R W PCM SB emulation DMA translate */ - extern unsigned char O_M_1_to_card[]; /* R W Control Translate (OM1 & 0x0f) to card type */ -#endif - -#define PARALLEL_MIXER 0x078B /* W Mixer Documented for MVD101 as FM Mono Right decode?? */ -# define P_M_MV508_ADDRESS 0x80 /* W Mixer MVD508 Address/mixer select */ -# define P_M_MV508_DATA 0x00 -# define P_M_MV508_LEFT 0x20 /* W Mixer MVD508 Left channel select */ -# define P_M_MV508_RIGHT 0x40 /* W Mixer MVD508 Right channel select */ -# define P_M_MV508_BOTH 0x00 /* W Mixer MVD508 Both channel select */ -# define P_M_MV508_MIXER 0x10 /* W Mixer MVD508 Select a mixer (rather than a volume) */ -# define P_M_MV508_VOLUME 0x00 - -# define P_M_MV508_INPUTMIX 0x20 /* W Mixer MVD508 Select mixer A */ -# define P_M_MV508_OUTPUTMIX 0x00 /* W Mixer MVD508 Select mixer B */ - -# define P_M_MV508_MASTER_A 0x01 /* W Mixer MVD508 Master volume control A (output) */ -# define P_M_MV508_MASTER_B 0x02 /* W Mixer MVD508 Master volume control B (DSP input) */ -# define P_M_MV508_BASS 0x03 /* W Mixer MVD508 Bass control */ -# define P_M_MV508_TREBLE 0x04 /* W Mixer MVD508 Treble control */ -# define P_M_MV508_MODE 0x05 /* W Mixer MVD508 Master mode control */ - -# define P_M_MV508_LOUDNESS 0x04 /* W Mixer MVD508 Mode control - Loudness filter */ -# define P_M_MV508_ENHANCE_BITS 0x03 -# define P_M_MV508_ENHANCE_NONE 0x00 /* W Mixer MVD508 Mode control - No stereo enhancement */ -# define P_M_MV508_ENHANCE_40 0x01 /* W Mixer MVD508 Mode control - 40% stereo enhancement */ -# define P_M_MV508_ENHANCE_60 0x02 /* W Mixer MVD508 Mode control - 60% stereo enhancement */ -# define P_M_MV508_ENHANCE_80 0x03 /* W Mixer MVD508 Mode control - 80% stereo enhancement */ - -# define P_M_MV508_FM 0x00 /* W Mixer MVD508 Channel 0 - FM */ -# define P_M_MV508_IMIXER 0x01 /* W Mixer MVD508 Channel 1 - Input mixer (rec monitor) */ -# define P_M_MV508_LINE 0x02 /* W Mixer MVD508 Channel 2 - Line in */ -# define P_M_MV508_CDROM 0x03 /* W Mixer MVD508 Channel 3 - CD-ROM */ -# define P_M_MV508_MIC 0x04 /* W Mixer MVD508 Channel 4 - Microphone */ -# define P_M_MV508_PCM 0x05 /* W Mixer MVD508 Channel 5 - PCM */ -# define P_M_MV508_SPEAKER 0x06 /* W Mixer MVD508 Channel 6 - PC Speaker */ -# define P_M_MV508_SB 0x07 /* W Mixer MVD508 Channel 7 - SB DSP */ - -#define SERIAL_MIXER 0xB88 /* R W Control Serial mixer control (used other ways) */ -# define S_M_PCM_RESET 0x01 /* R W PCM Codec/DSP reset */ -# define S_M_FM_RESET 0x02 /* R W FM FM chip reset */ -# define S_M_SB_RESET 0x04 /* R W PCM SB emulation chip reset */ -# define S_M_MIXER_RESET 0x10 /* R W Mixer Mixer chip reset */ -# define S_M_INTEGRATOR_ENABLE 0x40 /* R W Speaker Enable PC speaker integrator (FORCE RealSound) */ -# define S_M_OPL3_DUAL_MONO 0x80 /* R W FM Set the OPL-3 to dual mono mode */ - -#define PCM_CONTROL 0xF8A /* R W PCM PCM Control Register */ -# define P_C_MIXER_CROSS_FIELD 0x0f -# define P_C_MIXER_CROSS_R_TO_R 0x01 /* R W Mixer Connect Right to Right */ -# define P_C_MIXER_CROSS_L_TO_R 0x02 /* R W Mixer Connect Left to Right */ -# define P_C_MIXER_CROSS_R_TO_L 0x04 /* R W Mixer Connect Right to Left */ -# define P_C_MIXER_CROSS_L_TO_L 0x08 /* R W Mixer Connect Left to Left */ -# define P_C_PCM_DAC_MODE 0x10 /* R W PCM Playback (DAC) mode */ -# define P_C_PCM_ADC_MODE 0x00 /* R W PCM Record (ADC) mode */ -# define P_C_PCM_MONO 0x20 /* R W PCM Mono mode */ -# define P_C_PCM_STEREO 0x00 /* R W PCM Stereo mode */ -# define P_C_PCM_ENABLE 0x40 /* R W PCM Enable PCM engine */ -# define P_C_PCM_DMA_ENABLE 0x80 /* R W PCM Enable DRQ */ - -#define SAMPLE_COUNTER_CONTROL 0x138B /* R W PCM Sample counter control register */ -# define S_C_C_SQUARE_WAVE 0x04 /* R W PCM Square wave generator (use for sample rate) */ -# define S_C_C_RATE 0x06 /* R W PCM Rate generator (use for sample buffer count) */ -# define S_C_C_LSB_THEN_MSB 0x30 /* R W PCM Change all 16 bits, LSB first, then MSB */ - - /* MVD101 and SDK documentations have S_C_C_SAMPLE_RATE and S_C_C_SAMPLE_BUFFER transposed. Only one works :-) */ -# define S_C_C_SAMPLE_RATE 0x00 /* R W PCM Select sample rate timer */ -# define S_C_C_SAMPLE_BUFFER 0x40 /* R W PCM Select sample buffer counter */ - -# define S_C_C_PC_SPEAKER 0x80 /* R W PCM Select PC speaker counter */ - -#define SAMPLE_RATE_TIMER 0x1388 /* W PCM Sample rate timer register (PCM wait interval) */ -#define SAMPLE_BUFFER_COUNTER 0x1389 /* R W PCM Sample buffer counter (DMA buffer size) */ - -#define MIDI_CONTROL 0x178b /* R W MIDI Midi control register */ -# define M_C_ENA_TSTAMP_IRQ 0x01 /* R W MIDI Enable Time Stamp Interrupts */ -# define M_C_ENA_TME_COMP_IRQ 0x02 /* R W MIDI Enable time compare interrupts */ -# define M_C_ENA_INPUT_IRQ 0x04 /* R W MIDI Enable input FIFO interrupts */ -# define M_C_ENA_OUTPUT_IRQ 0x08 /* R W MIDI Enable output FIFO interrupts */ -# define M_C_ENA_OUTPUT_HALF_IRQ 0x10 /* R W MIDI Enable output FIFO half full interrupts */ -# define M_C_RESET_INPUT_FIFO 0x20 /* R W MIDI Reset input FIFO pointer */ -# define M_C_RESET_OUTPUT_FIFO 0x40 /* R W MIDI Reset output FIFO pointer */ -# define M_C_ENA_THRU_MODE 0x80 /* R W MIDI Echo input to output (THRU) */ - -#define MIDI_STATUS 0x1B88 /* R W MIDI Midi (interrupt) status register */ -# define M_S_TIMESTAMP 0x01 /* R W MIDI Midi time stamp interrupt occurred */ -# define M_S_COMPARE 0x02 /* R W MIDI Midi compare time interrupt occurred */ -# define M_S_INPUT_AVAIL 0x04 /* R W MIDI Midi input data available interrupt occurred */ -# define M_S_OUTPUT_EMPTY 0x08 /* R W MIDI Midi output FIFO empty interrupt occurred */ -# define M_S_OUTPUT_HALF_EMPTY 0x10 /* R W MIDI Midi output FIFO half empty interrupt occurred */ -# define M_S_INPUT_OVERRUN 0x20 /* R W MIDI Midi input overrun error occurred */ -# define M_S_OUTPUT_OVERRUN 0x40 /* R W MIDI Midi output overrun error occurred */ -# define M_S_FRAMING_ERROR 0x80 /* R W MIDI Midi input framing error occurred */ - -#define MIDI_FIFO_STATUS 0x1B89 /* R W MIDI Midi fifo status */ -#define MIDI_DATA 0x178A /* R W MIDI Midi data register */ -#define MIDI_INPUT_AVAILABLE 0x0f /* RW MIDI */ diff --git a/sys/i386/isa/sound/patmgr.c b/sys/i386/isa/sound/patmgr.c deleted file mode 100644 index 752b2e9..0000000 --- a/sys/i386/isa/sound/patmgr.c +++ /dev/null @@ -1,267 +0,0 @@ -/* - * sound/patmgr.c - * - * The patch maneger interface for the /dev/sequencer - * - * 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. - * - */ - -#define PATMGR_C -#include - -#if defined(CONFIG_SEQUENCER) - -static int *server_procs[MAX_SYNTH_DEV] = {NULL}; -static volatile struct snd_wait server_wait_flag[MAX_SYNTH_DEV] = { {0}}; - -static struct patmgr_info *mbox[MAX_SYNTH_DEV] = {NULL}; -static volatile int msg_direction[MAX_SYNTH_DEV] = {0}; - -static int pmgr_opened[MAX_SYNTH_DEV] = {0}; - -#define A_TO_S 1 -#define S_TO_A 2 - -static int *appl_proc = NULL; -static volatile struct snd_wait appl_wait_flag = -{0}; - -int -pmgr_open(int dev) -{ - if (dev < 0 || dev >= num_synths) - return -(ENXIO); - - if (pmgr_opened[dev]) - return -(EBUSY); - pmgr_opened[dev] = 1; - - server_wait_flag[dev].aborting = 0; - server_wait_flag[dev].mode = WK_NONE; - - return 0; -} - -void -pmgr_release(int dev) -{ - - if (mbox[dev]) { /* Killed in action. Inform the client */ - - mbox[dev]->key = PM_ERROR; - mbox[dev]->parm1 = -(EIO); - - if ((appl_wait_flag.mode & WK_SLEEP)) { - appl_wait_flag.mode = WK_WAKEUP; - wakeup(appl_proc); - }; - } - pmgr_opened[dev] = 0; -} - -int -pmgr_read(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) -{ - u_long flags; - int ok = 0; - - if (count != sizeof(struct patmgr_info)) { - printf("PATMGR%d: Invalid read count\n", dev); - return -(EIO); - } - while (!ok && !(server_wait_flag[dev].aborting)) { - flags = splhigh(); - - while (!(mbox[dev] && msg_direction[dev] == A_TO_S) && - !(server_wait_flag[dev].aborting)) { - - int chn; - server_procs[dev] = &chn; - DO_SLEEP(chn, server_wait_flag[dev], 0); - - } - - if (mbox[dev] && msg_direction[dev] == A_TO_S) { - - if (uiomove((char *) mbox[dev], count, buf)) { - printf("sb: Bad copyout()!\n"); - }; - msg_direction[dev] = 0; - ok = 1; - } - splx(flags); - - } - - if (!ok) - return -(EINTR); - return count; -} - -int -pmgr_write(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) -{ - u_long flags; - - if (count < 4) { - printf("PATMGR%d: Write count < 4\n", dev); - return -(EIO); - } - if (uiomove((char *) mbox[dev], 4, buf)) { - printf("sb: Bad copyin()!\n"); - }; - - if (*(u_char *) mbox[dev] == SEQ_FULLSIZE) { - int tmp_dev; - - tmp_dev = ((u_short *) mbox[dev])[2]; - if (tmp_dev != dev) - return -(ENXIO); - - return synth_devs[dev]->load_patch(dev, *(u_short *) mbox[dev], - buf, 4, count, 1); - } - if (count != sizeof(struct patmgr_info)) { - printf("PATMGR%d: Invalid write count\n", dev); - return -(EIO); - } - /* - * If everything went OK, there should be a preallocated buffer in - * the mailbox and a client waiting. - */ - - flags = splhigh(); - - if (mbox[dev] && !msg_direction[dev]) { - - if (uiomove(&((char *) mbox[dev])[4], count - 4, buf)) { - printf("sb: Bad copyin()!\n"); - }; - msg_direction[dev] = S_TO_A; - - if ((appl_wait_flag.mode & WK_SLEEP)) { - appl_wait_flag.mode = WK_WAKEUP; - wakeup(appl_proc); - } - } - splx(flags); - - return count; -} - -int -pmgr_access(int dev, struct patmgr_info * rec) -{ - u_long flags; - int err = 0; - - flags = splhigh(); - - if (mbox[dev]) - printf(" PATMGR: Server %d mbox full. Why?\n", dev); - else { - int chn; - - rec->key = PM_K_COMMAND; - mbox[dev] = rec; - msg_direction[dev] = A_TO_S; - - if ((server_wait_flag[dev].mode & WK_SLEEP)) { - server_wait_flag[dev].mode = WK_WAKEUP; - wakeup(server_procs[dev]); - } - - - appl_proc = &chn; - DO_SLEEP(chn, appl_wait_flag, 0); - - if (msg_direction[dev] != S_TO_A) { - rec->key = PM_ERROR; - rec->parm1 = -(EIO); - } else if (rec->key == PM_ERROR) { - err = rec->parm1; - if (err > 0) - err = -err; - } - mbox[dev] = NULL; - msg_direction[dev] = 0; - } - - splx(flags); - - return err; -} - -int -pmgr_inform(int dev, int event, u_long p1, u_long p2, u_long p3, u_long p4) -{ - u_long flags; - int err = 0; - - struct patmgr_info *tmp_mbox; - - if (!pmgr_opened[dev]) - return 0; - - tmp_mbox = (struct patmgr_info *) malloc(sizeof(struct patmgr_info), M_TEMP, M_WAITOK); - - if (tmp_mbox == NULL) { - printf("pmgr: Couldn't allocate memory for a message\n"); - return 0; - } - flags = splhigh(); - - if (mbox[dev]) - printf(" PATMGR: Server %d mbox full. Why?\n", dev); - else { - int chn; - - mbox[dev] = tmp_mbox; - mbox[dev]->key = PM_K_EVENT; - mbox[dev]->command = event; - mbox[dev]->parm1 = p1; - mbox[dev]->parm2 = p2; - mbox[dev]->parm3 = p3; - msg_direction[dev] = A_TO_S; - - if ((server_wait_flag[dev].mode & WK_SLEEP)) { - server_wait_flag[dev].mode = WK_WAKEUP; - wakeup(server_procs[dev]); - } - - - appl_proc = &chn; - DO_SLEEP(chn, appl_wait_flag, 0); - - mbox[dev] = NULL; - msg_direction[dev] = 0; - } - - splx(flags); - free(tmp_mbox, M_TEMP); - - return err; -} - -#endif diff --git a/sys/i386/isa/sound/pcm86.c b/sys/i386/isa/sound/pcm86.c deleted file mode 100644 index 11cbdee..0000000 --- a/sys/i386/isa/sound/pcm86.c +++ /dev/null @@ -1,2212 +0,0 @@ -/* - * PC-9801-86 PCM driver for FreeBSD(98). - * - * Copyright (c) 1995 NAGAO Tadaaki (ABTK) - * All rights reserved. - * - * 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 AND 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. - * - * $FreeBSD$ - */ - -/* - * !! NOTE !! : - * This file DOES NOT belong to the VoxWare distribution though it works - * as part of the VoxWare drivers. It is FreeBSD(98) original. - * -- Nagao (nagao@cs.titech.ac.jp) - */ - - -#include - -#ifdef CONFIGURE_SOUNDCARD - -#if !defined(EXCLUDE_NSS) && !defined(EXCLUDE_AUDIO) - - -/* - * Constants - */ - -#define YES 1 -#define NO 0 - -#define IMODE_NONE 0 -#define IMODE_INPUT 1 -#define IMODE_OUTPUT 2 - -/* PC-9801-86 specific constants */ -#define PCM86_IOBASE 0xa460 /* PCM I/O ports */ -#define PCM86_FIFOSIZE 32768 /* There is a 32kB FIFO buffer on 86-board */ - -/* XXX -- These values should be chosen appropriately. */ -#define PCM86_INTRSIZE_OUT 1024 -#define PCM86_INTRSIZE_IN (PCM86_FIFOSIZE / 2 - 128) -#define DEFAULT_VOLUME 15 /* 0(min) - 15(max) */ - - -/* - * Switches for debugging and experiments - */ - -/* #define NSS_DEBUG */ - -#ifdef NSS_DEBUG -# ifdef DEB -# undef DEB -# endif -# define DEB(x) x -#endif - - -/* - * Private variables and types - */ - -typedef unsigned char pcm_data; - -enum board_type { - NO_SUPPORTED_BOARD = 0, - PC980186_FAMILY = 1, - PC980173_FAMILY = 2 -}; - -static char *board_name[] = { - /* Each must be of the length less than 32 bytes. */ - "No supported board", - "PC-9801-86 soundboard", - "PC-9801-73 soundboard" -}; - -/* Current status of the driver */ -static struct { - int iobase; - int irq; - enum board_type board_type; - int opened; - int format; - int bytes; - int chipspeedno; - int chipspeed; - int speed; - int stereo; - int volume; - int intr_busy; - int intr_size; - int intr_mode; - int intr_last; - int intr_trailer; - pcm_data * pdma_buf; - int pdma_count; - int pdma_chunkcount; - int acc; - int last_l; - int last_r; - sound_os_info *osp; -} pcm_s; - -static struct { - pcm_data buff[4]; - int size; -} tmpbuf; - -static int my_dev = 0; -static char nss_initialized = NO; - -/* 86-board supports only the following rates. */ -static int rates_tbl[8] = { -#ifndef WAVEMASTER_FREQ - 44100, 33075, 22050, 16538, 11025, 8269, 5513, 4134 -#else - /* - * It is said that Q-Vision's WaveMaster of some earlier lot(s?) has - * sampling rates incompatible with PC-9801-86. - * But I'm not sure whether the following rates are correct, especially - * 4000Hz. - */ - 44100, 33075, 22050, 16000, 11025, 8000, 5510, 4000 -#endif -}; - -/* u-law to linear translation table */ -static pcm_data ulaw2linear[256] = { - 130, 134, 138, 142, 146, 150, 154, 158, - 162, 166, 170, 174, 178, 182, 186, 190, - 193, 195, 197, 199, 201, 203, 205, 207, - 209, 211, 213, 215, 217, 219, 221, 223, - 225, 226, 227, 228, 229, 230, 231, 232, - 233, 234, 235, 236, 237, 238, 239, 240, - 240, 241, 241, 242, 242, 243, 243, 244, - 244, 245, 245, 246, 246, 247, 247, 248, - 248, 248, 249, 249, 249, 249, 250, 250, - 250, 250, 251, 251, 251, 251, 252, 252, - 252, 252, 252, 252, 253, 253, 253, 253, - 253, 253, 253, 253, 254, 254, 254, 254, - 254, 254, 254, 254, 254, 254, 254, 254, - 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, - 125, 121, 117, 113, 109, 105, 101, 97, - 93, 89, 85, 81, 77, 73, 69, 65, - 62, 60, 58, 56, 54, 52, 50, 48, - 46, 44, 42, 40, 38, 36, 34, 32, - 30, 29, 28, 27, 26, 25, 24, 23, - 22, 21, 20, 19, 18, 17, 16, 15, - 15, 14, 14, 13, 13, 12, 12, 11, - 11, 10, 10, 9, 9, 8, 8, 7, - 7, 7, 6, 6, 6, 6, 5, 5, - 5, 5, 4, 4, 4, 4, 3, 3, - 3, 3, 3, 3, 2, 2, 2, 2, - 2, 2, 2, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -/* linear to u-law translation table */ -static pcm_data linear2ulaw[256] = { - 255, 231, 219, 211, 205, 201, 197, 193, - 190, 188, 186, 184, 182, 180, 178, 176, - 175, 174, 173, 172, 171, 170, 169, 168, - 167, 166, 165, 164, 163, 162, 161, 160, - 159, 159, 158, 158, 157, 157, 156, 156, - 155, 155, 154, 154, 153, 153, 152, 152, - 151, 151, 150, 150, 149, 149, 148, 148, - 147, 147, 146, 146, 145, 145, 144, 144, - 143, 143, 143, 143, 142, 142, 142, 142, - 141, 141, 141, 141, 140, 140, 140, 140, - 139, 139, 139, 139, 138, 138, 138, 138, - 137, 137, 137, 137, 136, 136, 136, 136, - 135, 135, 135, 135, 134, 134, 134, 134, - 133, 133, 133, 133, 132, 132, 132, 132, - 131, 131, 131, 131, 130, 130, 130, 130, - 129, 129, 129, 129, 128, 128, 128, 128, - 0, 0, 0, 0, 0, 1, 1, 1, - 1, 2, 2, 2, 2, 3, 3, 3, - 3, 4, 4, 4, 4, 5, 5, 5, - 5, 6, 6, 6, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 9, 9, 9, - 9, 10, 10, 10, 10, 11, 11, 11, - 11, 12, 12, 12, 12, 13, 13, 13, - 13, 14, 14, 14, 14, 15, 15, 15, - 15, 16, 16, 17, 17, 18, 18, 19, - 19, 20, 20, 21, 21, 22, 22, 23, - 23, 24, 24, 25, 25, 26, 26, 27, - 27, 28, 28, 29, 29, 30, 30, 31, - 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 50, 52, 54, 56, 58, 60, - 62, 65, 69, 73, 77, 83, 91, 103 -}; - - -/* - * Prototypes - */ - -static int nss_detect(struct address_info *); - -static int nss_open(int, int); -static void nss_close(int); -static void nss_output_block(int, unsigned long, int, int, int); -static void nss_start_input(int, unsigned long, int, int, int); -static int nss_ioctl(int, u_int, ioctl_arg, int); -static int nss_prepare_for_input(int, int, int); -static int nss_prepare_for_output(int, int, int); -static void nss_reset(int); -static void nss_halt_xfer(int); - -static void dsp73_send_command(unsigned char); -static void dsp73_send_data(unsigned char); -static void dsp73_init(void); -static int set_format(int); -static int set_speed(int); -static int set_stereo(int); -static void set_volume(int); -static void fifo_start(int); -static void fifo_stop(void); -static void fifo_reset(void); -static void fifo_output_block(void); -static int fifo_send(pcm_data *, int); -static void fifo_sendtrailer(int); -static void fifo_send_stereo(pcm_data *, int); -static void fifo_send_monoral(pcm_data *, int); -static void fifo_send_stereo_ulaw(pcm_data *, int); -static void fifo_send_stereo_8(pcm_data *, int, int); -static void fifo_send_stereo_16le(pcm_data *, int, int); -static void fifo_send_stereo_16be(pcm_data *, int, int); -static void fifo_send_mono_ulaw(pcm_data *, int); -static void fifo_send_mono_8(pcm_data *, int, int); -static void fifo_send_mono_16le(pcm_data *, int, int); -static void fifo_send_mono_16be(pcm_data *, int, int); -static void fifo_input_block(void); -static void fifo_recv(pcm_data *, int); -static void fifo_recv_stereo(pcm_data *, int); -static void fifo_recv_monoral(pcm_data *, int); -static void fifo_recv_stereo_ulaw(pcm_data *, int); -static void fifo_recv_stereo_8(pcm_data *, int, int); -static void fifo_recv_stereo_16le(pcm_data *, int, int); -static void fifo_recv_stereo_16be(pcm_data *, int, int); -static void fifo_recv_mono_ulaw(pcm_data *, int); -static void fifo_recv_mono_8(pcm_data *, int, int); -static void fifo_recv_mono_16le(pcm_data *, int, int); -static void fifo_recv_mono_16be(pcm_data *, int, int); -static void nss_stop(void); -static void nss_init(void); - - -/* - * Identity - */ - -static struct audio_operations nss_operations = -{ - "PC-9801-86 SoundBoard", /* filled in properly by auto configuration */ - DMA_DISABLE, - ( AFMT_MU_LAW | - AFMT_U8 | AFMT_S16_LE | AFMT_S16_BE | - AFMT_S8 | AFMT_U16_LE | AFMT_U16_BE ), - NULL, - nss_open, - nss_close, - nss_output_block, - nss_start_input, - nss_ioctl, - nss_prepare_for_input, - nss_prepare_for_output, - nss_reset, - nss_halt_xfer, - NULL, - NULL -}; - - -/* - * Codes for internal use - */ - -static void -dsp73_send_command(unsigned char command) -{ - /* wait for RDY */ - while ((inb(pcm_s.iobase + 2) & 0x48) != 8); - - /* command mode */ - outb(pcm_s.iobase + 2, (inb(pcm_s.iobase + 2) & 0x20) | 3); - - /* wait for RDY */ - while ((inb(pcm_s.iobase + 2) & 0x48) != 8); - - /* send command */ - outb(pcm_s.iobase + 4, command); -} - - -static void -dsp73_send_data(unsigned char data) -{ - /* wait for RDY */ - while ((inb(pcm_s.iobase + 2) & 0x48) != 8); - - /* data mode */ - outb(pcm_s.iobase + 2, (inb(pcm_s.iobase + 2) & 0x20) | 0x83); - - /* wait for RDY */ - while ((inb(pcm_s.iobase + 2) & 0x48) != 8); - - /* send command */ - outb(pcm_s.iobase + 4, data); -} - - -static void -dsp73_init(void) -{ - const unsigned char dspinst[15] = { - 0x00, 0x00, 0x27, - 0x3f, 0xe0, 0x01, - 0x00, 0x00, 0x27, - 0x36, 0x5a, 0x0d, - 0x3e, 0x60, 0x04 - }; - unsigned char t; - int i; - - /* reset DSP */ - t = inb(pcm_s.iobase + 2); - outb(pcm_s.iobase + 2, (t & 0x80) | 0x23); - - /* mute on */ - dsp73_send_command(0x04); - dsp73_send_data(0x6f); - dsp73_send_data(0x3c); - - /* write DSP instructions */ - dsp73_send_command(0x01); - dsp73_send_data(0x00); - for (i = 0; i < 16; i++) - dsp73_send_data(dspinst[i]); - - /* mute off */ - dsp73_send_command(0x04); - dsp73_send_data(0x6f); - dsp73_send_data(0x30); - - /* wait for RDY */ - while ((inb(pcm_s.iobase + 2) & 0x48) != 8); - - outb(pcm_s.iobase + 2, 3); -} - - -static int -set_format(int format) -{ - switch (format) { - case AFMT_MU_LAW: - case AFMT_S8: - case AFMT_U8: - pcm_s.format = format; - pcm_s.bytes = 1; /* 8bit */ - break; - case AFMT_S16_LE: - case AFMT_U16_LE: - case AFMT_S16_BE: - case AFMT_U16_BE: - pcm_s.format = format; - pcm_s.bytes = 2; /* 16bit */ - break; - case AFMT_QUERY: - break; - default: - return -1; - } - - return pcm_s.format; -} - - -static int -set_speed(int speed) -{ - int i; - - if (speed < 4000) /* Minimum 4000Hz */ - speed = 4000; - if (speed > 44100) /* Maximum 44100Hz */ - speed = 44100; - for (i = 7; i >= 0; i--) { - if (speed <= rates_tbl[i]) { - pcm_s.chipspeedno = i; - pcm_s.chipspeed = rates_tbl[i]; - break; - } - } - pcm_s.speed = speed; - - return speed; -} - - -static int -set_stereo(int stereo) -{ - pcm_s.stereo = stereo ? YES : NO; - - return pcm_s.stereo; -} - - -static void -set_volume(int volume) -{ - if (volume < 0) - volume = 0; - if (volume > 15) - volume = 15; - pcm_s.volume = volume; - - outb(pcm_s.iobase + 6, 0xaf - volume); /* D/A -> LINE OUT */ - outb(0x5f,0); - outb(0x5f,0); - outb(0x5f,0); - outb(0x5f,0); - outb(pcm_s.iobase + 6, 0x20); /* FM -> A/D */ - outb(0x5f,0); - outb(0x5f,0); - outb(0x5f,0); - outb(0x5f,0); - outb(pcm_s.iobase + 6, 0x60); /* LINE IN -> A/D */ - outb(0x5f,0); - outb(0x5f,0); - outb(0x5f,0); - outb(0x5f,0); -} - - -static void -fifo_start(int mode) -{ - unsigned char tmp; - - /* Set frame length & panpot(LR). */ - tmp = inb(pcm_s.iobase + 10) & 0x88; - outb(pcm_s.iobase + 10, tmp | ((pcm_s.bytes == 1) ? 0x72 : 0x32)); - - tmp = pcm_s.chipspeedno; - if (mode == IMODE_INPUT) - tmp |= 0x40; - - /* Reset intr. flag. */ - outb(pcm_s.iobase + 8, tmp); - outb(pcm_s.iobase + 8, tmp | 0x10); - - /* Enable FIFO intr. */ - outb(pcm_s.iobase + 8, tmp | 0x30); - - /* Set intr. interval. */ - outb(pcm_s.iobase + 10, pcm_s.intr_size / 128 - 1); - - /* Start intr. */ - outb(pcm_s.iobase + 8, tmp | 0xb0); -} - - -static void -fifo_stop(void) -{ - unsigned char tmp; - - /* Reset intr. flag, and disable FIFO intr. */ - tmp = inb(pcm_s.iobase + 8) & 0x0f; - outb(pcm_s.iobase + 8, tmp); -} - - -static void -fifo_reset(void) -{ - unsigned char tmp; - - /* Reset FIFO. */ - tmp = inb(pcm_s.iobase + 8) & 0x77; - outb(pcm_s.iobase + 8, tmp | 0x8); - outb(pcm_s.iobase + 8, tmp); -} - - -static void -fifo_output_block(void) -{ - int chunksize, count; - - if (pcm_s.pdma_chunkcount) { - /* Update chunksize and then send the next chunk to FIFO. */ - chunksize = pcm_s.pdma_count / pcm_s.pdma_chunkcount--; - count = fifo_send(pcm_s.pdma_buf, chunksize); - } else { - /* ??? something wrong... */ - printf("nss0: chunkcount overrun\n"); - chunksize = count = 0; - } - - if (((audio_devs[my_dev]->dmap_out->qlen < 2) && (pcm_s.pdma_chunkcount == 0)) - || (count < pcm_s.intr_size)) { - /* The sent chunk seems to be the last one. */ - fifo_sendtrailer(pcm_s.intr_size); - pcm_s.intr_last = YES; - } - - pcm_s.pdma_buf += chunksize; - pcm_s.pdma_count -= chunksize; -} - - -static int -fifo_send(pcm_data *buf, int count) -{ - int i, length, r, cnt, rslt; - pcm_data *p; - - /* Calculate the length of PCM frames. */ - cnt = count + tmpbuf.size; - length = pcm_s.bytes << pcm_s.stereo; - r = cnt % length; - cnt -= r; - - if (cnt > 0) { - if (pcm_s.stereo) - fifo_send_stereo(buf, cnt); - else - fifo_send_monoral(buf, cnt); - /* Carry over extra data which doesn't seem to be a full PCM frame. */ - p = (pcm_data *)buf + count - r; - for (i = 0; i < r; i++) - tmpbuf.buff[i] = *p++; - } else { - /* Carry over extra data which doesn't seem to be a full PCM frame. */ - p = (pcm_data *)buf; - for (i = tmpbuf.size; i < r; i++) - tmpbuf.buff[i] = *p++; - } - tmpbuf.size = r; - - rslt = ((cnt / length) * pcm_s.chipspeed / pcm_s.speed) * pcm_s.bytes * 2; -#ifdef NSS_DEBUG - printf("fifo_send(): %d bytes sent\n", rslt); -#endif - return rslt; -} - - -static void -fifo_sendtrailer(int count) -{ - /* Send trailing zeros to the FIFO buffer. */ - int i; - - for (i = 0; i < count; i++) - outb(pcm_s.iobase + 12, 0); - pcm_s.intr_trailer = YES; - -#ifdef NSS_DEBUG - printf("fifo_sendtrailer(): %d bytes sent\n", count); -#endif -} - - -static void -fifo_send_stereo(pcm_data *buf, int count) -{ - /* Convert format and sampling speed. */ - switch (pcm_s.format) { - case AFMT_MU_LAW: - fifo_send_stereo_ulaw(buf, count); - break; - case AFMT_S8: - fifo_send_stereo_8(buf, count, NO); - break; - case AFMT_U8: - fifo_send_stereo_8(buf, count, YES); - break; - case AFMT_S16_LE: - fifo_send_stereo_16le(buf, count, NO); - break; - case AFMT_U16_LE: - fifo_send_stereo_16le(buf, count, YES); - break; - case AFMT_S16_BE: - fifo_send_stereo_16be(buf, count, NO); - break; - case AFMT_U16_BE: - fifo_send_stereo_16be(buf, count, YES); - break; - } -} - - -static void -fifo_send_monoral(pcm_data *buf, int count) -{ - /* Convert format and sampling speed. */ - switch (pcm_s.format) { - case AFMT_MU_LAW: - fifo_send_mono_ulaw(buf, count); - break; - case AFMT_S8: - fifo_send_mono_8(buf, count, NO); - break; - case AFMT_U8: - fifo_send_mono_8(buf, count, YES); - break; - case AFMT_S16_LE: - fifo_send_mono_16le(buf, count, NO); - break; - case AFMT_U16_LE: - fifo_send_mono_16le(buf, count, YES); - break; - case AFMT_S16_BE: - fifo_send_mono_16be(buf, count, NO); - break; - case AFMT_U16_BE: - fifo_send_mono_16be(buf, count, YES); - break; - } -} - - -static void -fifo_send_stereo_ulaw(pcm_data *buf, int count) -{ - int i; - signed char dl, dl0, dl1, dr, dr0, dr1; - pcm_data t[2]; - - if (tmpbuf.size > 0) - t[0] = ulaw2linear[tmpbuf.buff[0]]; - else - t[0] = ulaw2linear[*buf++]; - t[1] = ulaw2linear[*buf++]; - - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - outb(pcm_s.iobase + 12, t[0]); - outb(pcm_s.iobase + 12, t[1]); - count -= 2; - for (i = 0; i < count; i++) - outb(pcm_s.iobase + 12, ulaw2linear[*buf++]); - } else { - /* Speed conversion with linear interpolation method. */ - dl0 = pcm_s.last_l; - dr0 = pcm_s.last_r; - dl1 = t[0]; - dr1 = t[1]; - i = 0; - count /= 2; - while (i < count) { - while (pcm_s.acc >= pcm_s.chipspeed) { - pcm_s.acc -= pcm_s.chipspeed; - i++; - dl0 = dl1; - dr0 = dr1; - if (i < count) { - dl1 = ulaw2linear[*buf++]; - dr1 = ulaw2linear[*buf++]; - } else - dl1 = dr1 = 0; - } - dl = ((dl0 * (pcm_s.chipspeed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.chipspeed; - dr = ((dr0 * (pcm_s.chipspeed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.chipspeed; - outb(pcm_s.iobase + 12, dl); - outb(pcm_s.iobase + 12, dr); - pcm_s.acc += pcm_s.speed; - } - - pcm_s.last_l = dl0; - pcm_s.last_r = dr0; - } -} - - -static void -fifo_send_stereo_8(pcm_data *buf, int count, int uflag) -{ - int i; - signed char dl, dl0, dl1, dr, dr0, dr1, zlev; - pcm_data t[2]; - - zlev = uflag ? -128 : 0; - - if (tmpbuf.size > 0) - t[0] = tmpbuf.buff[0] + zlev; - else - t[0] = *buf++ + zlev; - t[1] = *buf++ + zlev; - - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - outb(pcm_s.iobase + 12, t[0]); - outb(pcm_s.iobase + 12, t[1]); - count -= 2; - for (i = 0; i < count; i++) - outb(pcm_s.iobase + 12, *buf++ + zlev); - } else { - /* Speed conversion with linear interpolation method. */ - dl0 = pcm_s.last_l; - dr0 = pcm_s.last_r; - dl1 = t[0]; - dr1 = t[1]; - i = 0; - count /= 2; - while (i < count) { - while (pcm_s.acc >= pcm_s.chipspeed) { - pcm_s.acc -= pcm_s.chipspeed; - i++; - dl0 = dl1; - dr0 = dr1; - if (i < count) { - dl1 = *buf++ + zlev; - dr1 = *buf++ + zlev; - } else - dl1 = dr1 = 0; - } - dl = ((dl0 * (pcm_s.chipspeed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.chipspeed; - dr = ((dr0 * (pcm_s.chipspeed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.chipspeed; - outb(pcm_s.iobase + 12, dl); - outb(pcm_s.iobase + 12, dr); - pcm_s.acc += pcm_s.speed; - } - - pcm_s.last_l = dl0; - pcm_s.last_r = dr0; - } -} - - -static void -fifo_send_stereo_16le(pcm_data *buf, int count, int uflag) -{ - int i; - short dl, dl0, dl1, dr, dr0, dr1, zlev; - pcm_data t[4]; - - zlev = uflag ? -128 : 0; - - for (i = 0; i < 4; i++) - t[i] = (tmpbuf.size > i) ? tmpbuf.buff[i] : *buf++; - - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - outb(pcm_s.iobase + 12, t[1] + zlev); - outb(pcm_s.iobase + 12, t[0]); - outb(pcm_s.iobase + 12, t[3] + zlev); - outb(pcm_s.iobase + 12, t[2]); - count = count / 2 - 2; - for (i = 0; i < count; i++) { - outb(pcm_s.iobase + 12, *(buf + 1) + zlev); - outb(pcm_s.iobase + 12, *buf); - buf += 2; - } - } else { - /* Speed conversion with linear interpolation method. */ - dl0 = pcm_s.last_l; - dr0 = pcm_s.last_r; - dl1 = t[0] + ((t[1] + zlev) << 8); - dr1 = t[2] + ((t[3] + zlev) << 8); - i = 0; - count /= 4; - while (i < count) { - while (pcm_s.acc >= pcm_s.chipspeed) { - pcm_s.acc -= pcm_s.chipspeed; - i++; - dl0 = dl1; - dr0 = dr1; - if (i < count) { - dl1 = *buf + ((*(buf + 1) + zlev) << 8); - buf += 2; - dr1 = *buf + ((*(buf + 1) + zlev) << 8); - buf += 2; - } else - dl1 = dr1 = 0; - } - dl = ((dl0 * (pcm_s.chipspeed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.chipspeed; - dr = ((dr0 * (pcm_s.chipspeed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.chipspeed; - outb(pcm_s.iobase + 12, (dl >> 8) & 0xff); - outb(pcm_s.iobase + 12, dl & 0xff); - outb(pcm_s.iobase + 12, (dr >> 8) & 0xff); - outb(pcm_s.iobase + 12, dr & 0xff); - pcm_s.acc += pcm_s.speed; - } - - pcm_s.last_l = dl0; - pcm_s.last_r = dr0; - } -} - - -static void -fifo_send_stereo_16be(pcm_data *buf, int count, int uflag) -{ - int i; - short dl, dl0, dl1, dr, dr0, dr1, zlev; - pcm_data t[4]; - - zlev = uflag ? -128 : 0; - - for (i = 0; i < 4; i++) - t[i] = (tmpbuf.size > i) ? tmpbuf.buff[i] : *buf++; - - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - outb(pcm_s.iobase + 12, t[0] + zlev); - outb(pcm_s.iobase + 12, t[1]); - outb(pcm_s.iobase + 12, t[2] + zlev); - outb(pcm_s.iobase + 12, t[3]); - count = count / 2 - 2; - for (i = 0; i < count; i++) { - outb(pcm_s.iobase + 12, *buf + zlev); - outb(pcm_s.iobase + 12, *(buf + 1)); - buf += 2; - } - } else { - /* Speed conversion with linear interpolation method. */ - dl0 = pcm_s.last_l; - dr0 = pcm_s.last_r; - dl1 = ((t[0] + zlev) << 8) + t[1]; - dr1 = ((t[2] + zlev) << 8) + t[3]; - i = 0; - count /= 4; - while (i < count) { - while (pcm_s.acc >= pcm_s.chipspeed) { - pcm_s.acc -= pcm_s.chipspeed; - i++; - dl0 = dl1; - dr0 = dr1; - if (i < count) { - dl1 = ((*buf + zlev) << 8) + *(buf + 1); - buf += 2; - dr1 = ((*buf + zlev) << 8) + *(buf + 1); - buf += 2; - } else - dl1 = dr1 = 0; - } - dl = ((dl0 * (pcm_s.chipspeed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.chipspeed; - dr = ((dr0 * (pcm_s.chipspeed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.chipspeed; - outb(pcm_s.iobase + 12, (dl >> 8) & 0xff); - outb(pcm_s.iobase + 12, dl & 0xff); - outb(pcm_s.iobase + 12, (dr >> 8) & 0xff); - outb(pcm_s.iobase + 12, dr & 0xff); - pcm_s.acc += pcm_s.speed; - } - - pcm_s.last_l = dl0; - pcm_s.last_r = dr0; - } -} - - -static void -fifo_send_mono_ulaw(pcm_data *buf, int count) -{ - int i; - signed char d, d0, d1; - - if (pcm_s.speed == pcm_s.chipspeed) - /* No reason to convert the pcm speed. */ - for (i = 0; i < count; i++) { - d = ulaw2linear[*buf++]; - outb(pcm_s.iobase + 12, d); - outb(pcm_s.iobase + 12, d); - } - else { - /* Speed conversion with linear interpolation method. */ - d0 = pcm_s.last_l; - d1 = ulaw2linear[*buf++]; - i = 0; - while (i < count) { - while (pcm_s.acc >= pcm_s.chipspeed) { - pcm_s.acc -= pcm_s.chipspeed; - i++; - d0 = d1; - d1 = (i < count) ? ulaw2linear[*buf++] : 0; - } - d = ((d0 * (pcm_s.chipspeed - pcm_s.acc)) + (d1 * pcm_s.acc)) - / pcm_s.chipspeed; - outb(pcm_s.iobase + 12, d); - outb(pcm_s.iobase + 12, d); - pcm_s.acc += pcm_s.speed; - } - - pcm_s.last_l = d0; - } -} - - -static void -fifo_send_mono_8(pcm_data *buf, int count, int uflag) -{ - int i; - signed char d, d0, d1, zlev; - - zlev = uflag ? -128 : 0; - - if (pcm_s.speed == pcm_s.chipspeed) - /* No reason to convert the pcm speed. */ - for (i = 0; i < count; i++) { - d = *buf++ + zlev; - outb(pcm_s.iobase + 12, d); - outb(pcm_s.iobase + 12, d); - } - else { - /* Speed conversion with linear interpolation method. */ - d0 = pcm_s.last_l; - d1 = *buf++ + zlev; - i = 0; - while (i < count) { - while (pcm_s.acc >= pcm_s.chipspeed) { - pcm_s.acc -= pcm_s.chipspeed; - i++; - d0 = d1; - d1 = (i < count) ? *buf++ + zlev : 0; - } - d = ((d0 * (pcm_s.chipspeed - pcm_s.acc)) + (d1 * pcm_s.acc)) - / pcm_s.chipspeed; - outb(pcm_s.iobase + 12, d); - outb(pcm_s.iobase + 12, d); - pcm_s.acc += pcm_s.speed; - } - - pcm_s.last_l = d0; - } -} - - -static void -fifo_send_mono_16le(pcm_data *buf, int count, int uflag) -{ - int i; - short d, d0, d1, zlev; - pcm_data t[2]; - - zlev = uflag ? -128 : 0; - - for (i = 0; i < 2; i++) - t[i] = (tmpbuf.size > i) ? tmpbuf.buff[i] : *buf++; - - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - outb(pcm_s.iobase + 12, t[1] + zlev); - outb(pcm_s.iobase + 12, t[0]); - outb(pcm_s.iobase + 12, t[1] + zlev); - outb(pcm_s.iobase + 12, t[0]); - count = count / 2 - 1; - for (i = 0; i < count; i++) { - outb(pcm_s.iobase + 12, *(buf + 1) + zlev); - outb(pcm_s.iobase + 12, *buf); - outb(pcm_s.iobase + 12, *(buf + 1) + zlev); - outb(pcm_s.iobase + 12, *buf); - buf += 2; - } - } else { - /* Speed conversion with linear interpolation method. */ - d0 = pcm_s.last_l; - d1 = t[0] + ((t[1] + zlev) << 8); - i = 0; - count /= 2; - while (i < count) { - while (pcm_s.acc >= pcm_s.chipspeed) { - pcm_s.acc -= pcm_s.chipspeed; - i++; - d0 = d1; - if (i < count) { - d1 = *buf + ((*(buf + 1) + zlev) << 8); - buf += 2; - } else - d1 = 0; - } - d = ((d0 * (pcm_s.chipspeed - pcm_s.acc)) + (d1 * pcm_s.acc)) - / pcm_s.chipspeed; - outb(pcm_s.iobase + 12, (d >> 8) & 0xff); - outb(pcm_s.iobase + 12, d & 0xff); - outb(pcm_s.iobase + 12, (d >> 8) & 0xff); - outb(pcm_s.iobase + 12, d & 0xff); - pcm_s.acc += pcm_s.speed; - } - - pcm_s.last_l = d0; - } -} - - -static void -fifo_send_mono_16be(pcm_data *buf, int count, int uflag) -{ - int i; - short d, d0, d1, zlev; - pcm_data t[2]; - - zlev = uflag ? -128 : 0; - - for (i = 0; i < 2; i++) - t[i] = (tmpbuf.size > i) ? tmpbuf.buff[i] : *buf++; - - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - outb(pcm_s.iobase + 12, t[0] + zlev); - outb(pcm_s.iobase + 12, t[1]); - outb(pcm_s.iobase + 12, t[0] + zlev); - outb(pcm_s.iobase + 12, t[1]); - count = count / 2 - 1; - for (i = 0; i < count; i++) { - outb(pcm_s.iobase + 12, *buf + zlev); - outb(pcm_s.iobase + 12, *(buf + 1)); - outb(pcm_s.iobase + 12, *buf + zlev); - outb(pcm_s.iobase + 12, *(buf + 1)); - buf += 2; - } - } else { - /* Speed conversion with linear interpolation method. */ - d0 = pcm_s.last_l; - d1 = ((t[0] + zlev) << 8) + t[1]; - i = 0; - count /= 2; - while (i < count) { - while (pcm_s.acc >= pcm_s.chipspeed) { - pcm_s.acc -= pcm_s.chipspeed; - i++; - d0 = d1; - if (i < count) { - d1 = ((*buf + zlev) << 8) + *(buf + 1); - buf += 2; - } else - d1 = 0; - } - d = ((d0 * (pcm_s.chipspeed - pcm_s.acc)) + (d1 * pcm_s.acc)) - / pcm_s.chipspeed; -/* outb(pcm_s.iobase + 12, d & 0xff); - outb(pcm_s.iobase + 12, (d >> 8) & 0xff); - outb(pcm_s.iobase + 12, d & 0xff); - outb(pcm_s.iobase + 12, (d >> 8) & 0xff); */ - outb(pcm_s.iobase + 12, (d >> 8) & 0xff); - outb(pcm_s.iobase + 12, d & 0xff); - outb(pcm_s.iobase + 12, (d >> 8) & 0xff); - outb(pcm_s.iobase + 12, d & 0xff); - pcm_s.acc += pcm_s.speed; - } - - pcm_s.last_l = d0; - } -} - - -static void -fifo_input_block(void) -{ - int chunksize; - - if (pcm_s.pdma_chunkcount) { - /* Update chunksize and then receive the next chunk from FIFO. */ - chunksize = pcm_s.pdma_count / pcm_s.pdma_chunkcount--; - fifo_recv(pcm_s.pdma_buf, chunksize); - pcm_s.pdma_buf += chunksize; - pcm_s.pdma_count -= chunksize; - } else - /* ??? something wrong... */ - printf("nss0: chunkcount overrun\n"); -} - - -static void -fifo_recv(pcm_data *buf, int count) -{ - int i; - - if (count > tmpbuf.size) { - for (i = 0; i < tmpbuf.size; i++) - *buf++ = tmpbuf.buff[i]; - count -= tmpbuf.size; - tmpbuf.size = 0; - if (pcm_s.stereo) - fifo_recv_stereo(buf, count); - else - fifo_recv_monoral(buf, count); - } else { - for (i = 0; i < count; i++) - *buf++ = tmpbuf.buff[i]; - for (i = 0; i < tmpbuf.size - count; i++) - tmpbuf.buff[i] = tmpbuf.buff[i + count]; - tmpbuf.size -= count; - } - -#ifdef NSS_DEBUG - printf("fifo_recv(): %d bytes received\n", - ((count / (pcm_s.bytes << pcm_s.stereo)) * pcm_s.chipspeed - / pcm_s.speed) * pcm_s.bytes * 2); -#endif -} - - -static void -fifo_recv_stereo(pcm_data *buf, int count) -{ - /* Convert format and sampling speed. */ - switch (pcm_s.format) { - case AFMT_MU_LAW: - fifo_recv_stereo_ulaw(buf, count); - break; - case AFMT_S8: - fifo_recv_stereo_8(buf, count, NO); - break; - case AFMT_U8: - fifo_recv_stereo_8(buf, count, YES); - break; - case AFMT_S16_LE: - fifo_recv_stereo_16le(buf, count, NO); - break; - case AFMT_U16_LE: - fifo_recv_stereo_16le(buf, count, YES); - break; - case AFMT_S16_BE: - fifo_recv_stereo_16be(buf, count, NO); - break; - case AFMT_U16_BE: - fifo_recv_stereo_16be(buf, count, YES); - break; - } -} - - -static void -fifo_recv_monoral(pcm_data *buf, int count) -{ - /* Convert format and sampling speed. */ - switch (pcm_s.format) { - case AFMT_MU_LAW: - fifo_recv_mono_ulaw(buf, count); - break; - case AFMT_S8: - fifo_recv_mono_8(buf, count, NO); - break; - case AFMT_U8: - fifo_recv_mono_8(buf, count, YES); - break; - case AFMT_S16_LE: - fifo_recv_mono_16le(buf, count, NO); - break; - case AFMT_U16_LE: - fifo_recv_mono_16le(buf, count, YES); - break; - case AFMT_S16_BE: - fifo_recv_mono_16be(buf, count, NO); - break; - case AFMT_U16_BE: - fifo_recv_mono_16be(buf, count, YES); - break; - } -} - - -static void -fifo_recv_stereo_ulaw(pcm_data *buf, int count) -{ - int i, cnt; - signed char dl, dl0, dl1, dr, dr0, dr1; - - cnt = count / 2; - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - for (i = 0; i < cnt; i++) { - *buf++ = linear2ulaw[inb(pcm_s.iobase + 12)]; - *buf++ = linear2ulaw[inb(pcm_s.iobase + 12)]; - } - if (count % 2) { - *buf++ = linear2ulaw[inb(pcm_s.iobase + 12)]; - tmpbuf.buff[0] = linear2ulaw[inb(pcm_s.iobase + 12)]; - tmpbuf.size = 1; - } - } else { - /* Speed conversion with linear interpolation method. */ - dl0 = pcm_s.last_l; - dr0 = pcm_s.last_r; - dl1 = inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12); - for (i = 0; i < cnt; i++) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - dl0 = dl1; - dr0 = dr1; - dl1 = inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12); - } - dl = ((dl0 * (pcm_s.speed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.speed; - dr = ((dr0 * (pcm_s.speed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = linear2ulaw[dl & 0xff]; - *buf++ = linear2ulaw[dr & 0xff]; - pcm_s.acc += pcm_s.chipspeed; - } - if (count % 2) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - dl0 = dl1; - dr0 = dr1; - dl1 = inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12); - } - dl = ((dl0 * (pcm_s.speed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.speed; - dr = ((dr0 * (pcm_s.speed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = linear2ulaw[dl & 0xff]; - tmpbuf.buff[0] = linear2ulaw[dr & 0xff]; - tmpbuf.size = 1; - } - - pcm_s.last_l = dl0; - pcm_s.last_r = dr0; - } -} - - -static void -fifo_recv_stereo_8(pcm_data *buf, int count, int uflag) -{ - int i, cnt; - signed char dl, dl0, dl1, dr, dr0, dr1, zlev; - - zlev = uflag ? -128 : 0; - - cnt = count / 2; - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - for (i = 0; i < cnt; i++) { - *buf++ = inb(pcm_s.iobase + 12) + zlev; - *buf++ = inb(pcm_s.iobase + 12) + zlev; - } - if (count % 2) { - *buf++ = inb(pcm_s.iobase + 12) + zlev; - tmpbuf.buff[0] = inb(pcm_s.iobase + 12) + zlev; - tmpbuf.size = 1; - } - } else { - /* Speed conversion with linear interpolation method. */ - dl0 = pcm_s.last_l; - dr0 = pcm_s.last_r; - dl1 = inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12); - for (i = 0; i < cnt; i++) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - dl0 = dl1; - dr0 = dr1; - dl1 = inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12); - } - dl = ((dl0 * (pcm_s.speed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.speed; - dr = ((dr0 * (pcm_s.speed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = dl + zlev; - *buf++ = dr + zlev; - pcm_s.acc += pcm_s.chipspeed; - } - if (count % 2) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - dl0 = dl1; - dr0 = dr1; - dl1 = inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12); - } - dl = ((dl0 * (pcm_s.speed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.speed; - dr = ((dr0 * (pcm_s.speed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = dl + zlev; - tmpbuf.buff[0] = dr + zlev; - tmpbuf.size = 1; - } - - pcm_s.last_l = dl0; - pcm_s.last_r = dr0; - } -} - - -static void -fifo_recv_stereo_16le(pcm_data *buf, int count, int uflag) -{ - int i, cnt; - short dl, dl0, dl1, dr, dr0, dr1, zlev; - pcm_data t[4]; - - zlev = uflag ? -128 : 0; - - cnt = count / 4; - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - for (i = 0; i < cnt; i++) { - *(buf + 1) = inb(pcm_s.iobase + 12) + zlev; - *buf = inb(pcm_s.iobase + 12); - *(buf + 3) = inb(pcm_s.iobase + 12) + zlev; - *(buf + 2) = inb(pcm_s.iobase + 12); - buf += 4; - } - if (count % 4) { - t[1] = inb(pcm_s.iobase + 12) + zlev; - t[0] = inb(pcm_s.iobase + 12); - t[3] = inb(pcm_s.iobase + 12) + zlev; - t[2] = inb(pcm_s.iobase + 12); - tmpbuf.size = 0; - for (i = 0; i < count % 4; i++) - *buf++ = t[i]; - for (i = count % 4; i < 4; i++) - tmpbuf.buff[tmpbuf.size++] = t[i]; - } - } else { - /* Speed conversion with linear interpolation method. */ - dl0 = pcm_s.last_l; - dr0 = pcm_s.last_r; - dl1 = inb(pcm_s.iobase + 12) << 8; - dl1 |= inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12) << 8; - dr1 |= inb(pcm_s.iobase + 12); - for (i = 0; i < cnt; i++) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - dl0 = dl1; - dr0 = dr1; - dl1 = inb(pcm_s.iobase + 12) << 8; - dl1 |= inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12) << 8; - dr1 |= inb(pcm_s.iobase + 12); - } - dl = ((dl0 * (pcm_s.speed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.speed; - dr = ((dr0 * (pcm_s.speed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = dl & 0xff; - *buf++ = ((dl >> 8) & 0xff) + zlev; - *buf++ = dr & 0xff; - *buf++ = ((dr >> 8) & 0xff) + zlev; - pcm_s.acc += pcm_s.chipspeed; - } - if (count % 4) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - dl0 = dl1; - dr0 = dr1; - dl1 = inb(pcm_s.iobase + 12) << 8; - dl1 |= inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12) << 8; - dr1 |= inb(pcm_s.iobase + 12); - } - dl = ((dl0 * (pcm_s.speed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.speed; - dr = ((dr0 * (pcm_s.speed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.speed; - t[0] = dl & 0xff; - t[1] = ((dl >> 8) & 0xff) + zlev; - t[2] = dr & 0xff; - t[3] = ((dr >> 8) & 0xff) + zlev; - tmpbuf.size = 0; - for (i = 0; i < count % 4; i++) - *buf++ = t[i]; - for (i = count % 4; i < 4; i++) - tmpbuf.buff[tmpbuf.size++] = t[i]; - } - - pcm_s.last_l = dl0; - pcm_s.last_r = dr0; - } -} - - -static void -fifo_recv_stereo_16be(pcm_data *buf, int count, int uflag) -{ - int i, cnt; - short dl, dl0, dl1, dr, dr0, dr1, zlev; - pcm_data t[4]; - - zlev = uflag ? -128 : 0; - - cnt = count / 4; - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - for (i = 0; i < cnt; i++) { - *buf++ = inb(pcm_s.iobase + 12) + zlev; - *buf++ = inb(pcm_s.iobase + 12); - *buf++ = inb(pcm_s.iobase + 12) + zlev; - *buf++ = inb(pcm_s.iobase + 12); - } - if (count % 4) { - t[0] = inb(pcm_s.iobase + 12) + zlev; - t[1] = inb(pcm_s.iobase + 12); - t[2] = inb(pcm_s.iobase + 12) + zlev; - t[3] = inb(pcm_s.iobase + 12); - tmpbuf.size = 0; - for (i = 0; i < count % 4; i++) - *buf++ = t[i]; - for (i = count % 4; i < 4; i++) - tmpbuf.buff[tmpbuf.size++] = t[i]; - } - } else { - /* Speed conversion with linear interpolation method. */ - dl0 = pcm_s.last_l; - dr0 = pcm_s.last_r; - dl1 = inb(pcm_s.iobase + 12) << 8; - dl1 |= inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12) << 8; - dr1 |= inb(pcm_s.iobase + 12); - for (i = 0; i < cnt; i++) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - dl0 = dl1; - dr0 = dr1; - dl1 = inb(pcm_s.iobase + 12) << 8; - dl1 |= inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12) << 8; - dr1 |= inb(pcm_s.iobase + 12); - } - dl = ((dl0 * (pcm_s.speed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.speed; - dr = ((dr0 * (pcm_s.speed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = ((dl >> 8) & 0xff) + zlev; - *buf++ = dl & 0xff; - *buf++ = ((dr >> 8) & 0xff) + zlev; - *buf++ = dr & 0xff; - pcm_s.acc += pcm_s.chipspeed; - } - if (count % 4) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - dl0 = dl1; - dr0 = dr1; - dl1 = inb(pcm_s.iobase + 12) << 8; - dl1 |= inb(pcm_s.iobase + 12); - dr1 = inb(pcm_s.iobase + 12) << 8; - dr1 |= inb(pcm_s.iobase + 12); - } - dl = ((dl0 * (pcm_s.speed - pcm_s.acc)) + (dl1 * pcm_s.acc)) - / pcm_s.speed; - dr = ((dr0 * (pcm_s.speed - pcm_s.acc)) + (dr1 * pcm_s.acc)) - / pcm_s.speed; - t[0] = ((dl >> 8) & 0xff) + zlev; - t[1] = dl & 0xff; - t[2] = ((dr >> 8) & 0xff) + zlev; - t[3] = dr & 0xff; - tmpbuf.size = 0; - for (i = 0; i < count % 4; i++) - *buf++ = t[i]; - for (i = count % 4; i < 4; i++) - tmpbuf.buff[tmpbuf.size++] = t[i]; - } - - pcm_s.last_l = dl0; - pcm_s.last_r = dr0; - } -} - - -static void -fifo_recv_mono_ulaw(pcm_data *buf, int count) -{ - int i; - signed char d, d0, d1; - - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - for (i = 0; i < count; i++) { - d = ((signed char)inb(pcm_s.iobase + 12) - + (signed char)inb(pcm_s.iobase + 12)) >> 1; - *buf++ = linear2ulaw[d & 0xff]; - } - } else { - /* Speed conversion with linear interpolation method. */ - d0 = pcm_s.last_l; - d1 = ((signed char)inb(pcm_s.iobase + 12) - + (signed char)inb(pcm_s.iobase + 12)) >> 1; - for (i = 0; i < count; i++) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - d0 = d1; - d1 = ((signed char)inb(pcm_s.iobase + 12) - + (signed char)inb(pcm_s.iobase + 12)) >> 1; - } - d = ((d0 * (pcm_s.speed - pcm_s.acc)) + (d1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = linear2ulaw[d & 0xff]; - pcm_s.acc += pcm_s.chipspeed; - } - - pcm_s.last_l = d0; - } -} - - -static void -fifo_recv_mono_8(pcm_data *buf, int count, int uflag) -{ - int i; - signed char d, d0, d1, zlev; - - zlev = uflag ? -128 : 0; - - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - for (i = 0; i < count; i++) { - d = ((signed char)inb(pcm_s.iobase + 12) - + (signed char)inb(pcm_s.iobase + 12)) >> 1; - *buf++ = d + zlev; - } - } else { - /* Speed conversion with linear interpolation method. */ - d0 = pcm_s.last_l; - d1 = ((signed char)inb(pcm_s.iobase + 12) - + (signed char)inb(pcm_s.iobase + 12)) >> 1; - for (i = 0; i < count; i++) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - d0 = d1; - d1 = ((signed char)inb(pcm_s.iobase + 12) - + (signed char)inb(pcm_s.iobase + 12)) >> 1; - } - d = ((d0 * (pcm_s.speed - pcm_s.acc)) + (d1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = d + zlev; - pcm_s.acc += pcm_s.chipspeed; - } - - pcm_s.last_l = d0; - } -} - - -static void -fifo_recv_mono_16le(pcm_data *buf, int count, int uflag) -{ - int i, cnt; - short d, d0, d1, el, er, zlev; - - zlev = uflag ? -128 : 0; - - cnt = count / 2; - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - for (i = 0; i < cnt; i++) { - el = inb(pcm_s.iobase + 12) << 8; - el |= inb(pcm_s.iobase + 12); - er = inb(pcm_s.iobase + 12) << 8; - er |= inb(pcm_s.iobase + 12); - d = (el + er) >> 1; - *buf++ = d & 0xff; - *buf++ = ((d >> 8) & 0xff) + zlev; - } - if (count % 2) { - el = inb(pcm_s.iobase + 12) << 8; - el |= inb(pcm_s.iobase + 12); - er = inb(pcm_s.iobase + 12) << 8; - er |= inb(pcm_s.iobase + 12); - d = (el + er) >> 1; - *buf++ = d & 0xff; - tmpbuf.buff[0] = ((d >> 8) & 0xff) + zlev; - tmpbuf.size = 1; - } - } else { - /* Speed conversion with linear interpolation method. */ - d0 = pcm_s.last_l; - el = inb(pcm_s.iobase + 12) << 8; - el |= inb(pcm_s.iobase + 12); - er = inb(pcm_s.iobase + 12) << 8; - er |= inb(pcm_s.iobase + 12); - d1 = (el + er) >> 1; - for (i = 0; i < cnt; i++) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - d0 = d1; - el = inb(pcm_s.iobase + 12) << 8; - el |= inb(pcm_s.iobase + 12); - er = inb(pcm_s.iobase + 12) << 8; - er |= inb(pcm_s.iobase + 12); - d1 = (el + er) >> 1; - } - d = ((d0 * (pcm_s.speed - pcm_s.acc)) + (d1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = d & 0xff; - *buf++ = ((d >> 8) & 0xff) + zlev; - pcm_s.acc += pcm_s.chipspeed; - } - if (count % 2) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - d0 = d1; - el = inb(pcm_s.iobase + 12) << 8; - el |= inb(pcm_s.iobase + 12); - er = inb(pcm_s.iobase + 12) << 8; - er |= inb(pcm_s.iobase + 12); - d1 = (el + er) >> 1; - } - d = ((d0 * (pcm_s.speed - pcm_s.acc)) + (d1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = d & 0xff; - tmpbuf.buff[0] = ((d >> 8) & 0xff) + zlev; - tmpbuf.size = 1; - } - - pcm_s.last_l = d0; - } -} - - -static void -fifo_recv_mono_16be(pcm_data *buf, int count, int uflag) -{ - int i, cnt; - short d, d0, d1, el, er, zlev; - - zlev = uflag ? -128 : 0; - - cnt = count / 2; - if (pcm_s.speed == pcm_s.chipspeed) { - /* No reason to convert the pcm speed. */ - for (i = 0; i < cnt; i++) { - el = inb(pcm_s.iobase + 12) << 8; - el |= inb(pcm_s.iobase + 12); - er = inb(pcm_s.iobase + 12) << 8; - er |= inb(pcm_s.iobase + 12); - d = (el + er) >> 1; - *buf++ = ((d >> 8) & 0xff) + zlev; - *buf++ = d & 0xff; - } - if (count % 2) { - el = inb(pcm_s.iobase + 12) << 8; - el |= inb(pcm_s.iobase + 12); - er = inb(pcm_s.iobase + 12) << 8; - er |= inb(pcm_s.iobase + 12); - d = (el + er) >> 1; - *buf++ = ((d >> 8) & 0xff) + zlev; - tmpbuf.buff[0] = d & 0xff; - tmpbuf.size = 1; - } - } else { - /* Speed conversion with linear interpolation method. */ - d0 = pcm_s.last_l; - el = inb(pcm_s.iobase + 12) << 8; - el |= inb(pcm_s.iobase + 12); - er = inb(pcm_s.iobase + 12) << 8; - er |= inb(pcm_s.iobase + 12); - d1 = (el + er) >> 1; - for (i = 0; i < cnt; i++) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - d0 = d1; - el = inb(pcm_s.iobase + 12) << 8; - el |= inb(pcm_s.iobase + 12); - er = inb(pcm_s.iobase + 12) << 8; - er |= inb(pcm_s.iobase + 12); - d1 = (el + er) >> 1; - } - d = ((d0 * (pcm_s.speed - pcm_s.acc)) + (d1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = ((d >> 8) & 0xff) + zlev; - *buf++ = d & 0xff; - pcm_s.acc += pcm_s.chipspeed; - } - if (count % 2) { - while (pcm_s.acc >= pcm_s.speed) { - pcm_s.acc -= pcm_s.speed; - d0 = d1; - el = inb(pcm_s.iobase + 12) << 8; - el |= inb(pcm_s.iobase + 12); - er = inb(pcm_s.iobase + 12) << 8; - er |= inb(pcm_s.iobase + 12); - d1 = (el + er) >> 1; - } - d = ((d0 * (pcm_s.speed - pcm_s.acc)) + (d1 * pcm_s.acc)) - / pcm_s.speed; - *buf++ = ((d >> 8) & 0xff) + zlev; - tmpbuf.buff[0] = d & 0xff; - tmpbuf.size = 1; - } - - pcm_s.last_l = d0; - } -} - - -static void -nss_stop(void) -{ - fifo_stop(); /* stop FIFO */ - fifo_reset(); /* reset FIFO buffer */ - - /* Reset driver's status. */ - pcm_s.intr_busy = NO; - pcm_s.intr_last = NO; - pcm_s.intr_trailer = NO; - pcm_s.acc = 0; - pcm_s.last_l = 0; - pcm_s.last_r = 0; - - DEB(printf("nss_stop\n")); -} - - -static void -nss_init(void) -{ - /* Initialize registers on the board. */ - nss_stop(); - if (pcm_s.board_type == PC980173_FAMILY) - dsp73_init(); - - /* Set default volume. */ - set_volume(DEFAULT_VOLUME); - - /* Initialize driver's status. */ - pcm_s.opened = NO; - nss_initialized = YES; -} - - -/* - * Codes for global use - */ - -int -probe_nss(struct address_info *hw_config) -{ - return nss_detect(hw_config); -} - - -void -attach_nss(struct address_info *hw_config) -{ - if (pcm_s.board_type == NO_SUPPORTED_BOARD) - return ; - - /* Initialize the board. */ - nss_init(); - - conf_printf(nss_operations.name, hw_config); - - if (num_audiodevs < MAX_AUDIO_DEV) { - my_dev = num_audiodevs++; - audio_devs[my_dev] = &nss_operations; - /* audio_devs[my_dev]->buffcount = DSP_BUFFCOUNT; */ - audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; -#ifdef NSS_DEBUG - printf("\nbuffsize = %d", DSP_BUFFSIZE); -#endif - } else - printf("nss0: Too many PCM devices available"); - - return ; -} - - -static int -nss_detect(struct address_info *hw_config) -{ - int opna_iobase = 0x188, irq = 12, i; - unsigned char tmp; - - if (hw_config->io_base == -1) { - printf("nss0: iobase not specified. Assume default port(0x%x)\n", - PCM86_IOBASE); - hw_config->io_base = PCM86_IOBASE; - } - pcm_s.iobase = hw_config->io_base; - - /* auto configuration */ - tmp = (inb(pcm_s.iobase) & 0xf0) >> 4; - if (tmp == 0x07) { - /* - * Remap MATE-X PCM Sound ID register (0xA460 -> 0xB460) - * to avoid corrision with 86 Sound System. - */ - /* - printf("nss0: Found MATE-X PCM Sound ID\n"); - printf("nss0: Remaped 0xa460 to 0xb460\n"); - */ - outb(0xc24, 0xe1); - outb(0xc2b, 0x60); - outb(0xc2d, 0xb4); - } - - tmp = inb(pcm_s.iobase) & 0xfc; - switch ((tmp & 0xf0) >> 4) { - case 2: - opna_iobase = 0x188; - pcm_s.board_type = PC980173_FAMILY; - break; - case 3: - opna_iobase = 0x288; - pcm_s.board_type = PC980173_FAMILY; - break; - case 4: - opna_iobase = 0x188; - pcm_s.board_type = PC980186_FAMILY; - break; - case 5: - opna_iobase = 0x288; - pcm_s.board_type = PC980186_FAMILY; - break; - default: - pcm_s.board_type = NO_SUPPORTED_BOARD; - return NO; - } - - /* Enable OPNA(YM2608) facilities. */ - outb(pcm_s.iobase, tmp | 0x01); - - /* Wait for OPNA to be ready. */ - i = 100000; /* Some large value */ - while((inb(opna_iobase) & 0x80) && (i-- > 0)); - - /* Make IOA/IOB port ready (IOA:input, IOB:output) */ - outb(opna_iobase, 0x07); - outb(0x5f, 0); /* Because OPNA ports are comparatively slow(?), */ - outb(0x5f, 0); /* we'd better wait a moment. */ - outb(0x5f, 0); - outb(0x5f, 0); - tmp = inb(opna_iobase + 2) & 0x3f; - outb(opna_iobase + 2, tmp | 0x80); - - /* Wait for OPNA to be ready. */ - i = 100000; /* Some large value */ - while((inb(opna_iobase) & 0x80) && (i-- > 0)); - - /* Get irq number from IOA port. */ - outb(opna_iobase, 0x0e); - outb(0x5f, 0); - outb(0x5f, 0); - outb(0x5f, 0); - outb(0x5f, 0); - tmp = inb(opna_iobase + 2) & 0xc0; - switch (tmp >> 6) { - case 0: /* INT0 (IRQ3)*/ - irq = 3; - break; - case 1: /* INT6 (IRQ13)*/ - irq = 13; - break; - case 2: /* INT4 (IRQ10)*/ - irq = 10; - break; - case 3: /* INT5 (IRQ12)*/ - irq = 12; - break; - default: /* error */ - return NO; - } - - /* Wait for OPNA to be ready. */ - i = 100000; /* Some large value */ - while((inb(opna_iobase) & 0x80) && (i-- > 0)); - - /* Reset OPNA timer register. */ - outb(opna_iobase, 0x27); - outb(0x5f, 0); - outb(0x5f, 0); - outb(0x5f, 0); - outb(0x5f, 0); - outb(opna_iobase + 2, 0x30); - - /* Ok. Detection finished. */ - snprintf(nss_operations.name, sizeof(nss_operations.name), - "%s", board_name[pcm_s.board_type]); - nss_initialized = NO; - pcm_s.irq = irq; - - if ((hw_config->irq > 0) && (hw_config->irq != irq)) - printf("nss0: change irq %d -> %d\n", hw_config->irq, irq); - hw_config->irq = irq; - - pcm_s.osp = hw_config->osp; - - return YES; -} - - -static int -nss_open(int dev, int mode) -{ - int err; - - if (!nss_initialized) - return -(ENXIO); - - if (pcm_s.intr_busy || pcm_s.opened) - return -(EBUSY); - - if ((err = snd_set_irq_handler(pcm_s.irq, nssintr, pcm_s.osp)) < 0) - return err; - - nss_stop(); - - tmpbuf.size = 0; - pcm_s.intr_mode = IMODE_NONE; - pcm_s.opened = YES; - - return 0; -} - - -static void -nss_close(int dev) -{ - /* snd_release_irq(pcm_s.irq); */ - - pcm_s.opened = NO; -} - - -static void -nss_output_block(int dev, unsigned long buf, int count, int intrflag, - int dma_restart) -{ - unsigned long flags, cnt; - int maxchunksize; - -#ifdef NSS_DEBUG - printf("nss_output_block():"); - if (audio_devs[dev]->dmap_out->flags & DMA_BUSY) - printf(" DMA_BUSY"); - if (audio_devs[dev]->dmap_out->flags & DMA_RESTART) - printf(" DMA_RESTART"); - if (audio_devs[dev]->dmap_out->flags & DMA_ACTIVE) - printf(" DMA_ACTIVE"); - if (audio_devs[dev]->dmap_out->flags & DMA_STARTED) - printf(" DMA_STARTED"); - if (audio_devs[dev]->dmap_out->flags & DMA_ALLOC_DONE) - printf(" DMA_ALLOC_DONE"); - printf("\n"); -#endif - -#if 0 - DISABLE_INTR(flags); -#endif - -#ifdef NSS_DEBUG - printf("nss_output_block(): count = %d, intrsize= %d\n", - count, pcm_s.intr_size); -#endif - - pcm_s.pdma_buf = (pcm_data *)buf; - pcm_s.pdma_count = count; - pcm_s.pdma_chunkcount = 1; - maxchunksize = (((PCM86_FIFOSIZE - pcm_s.intr_size * 2) - / (pcm_s.bytes * 2)) * pcm_s.speed - / pcm_s.chipspeed) * (pcm_s.bytes << pcm_s.stereo); - if (count > maxchunksize) - pcm_s.pdma_chunkcount = 2 * count / maxchunksize; - /* - * Let chunksize = (float)count / (float)pcm_s.pdma_chunkcount. - * Data of size chunksize is sent to the FIFO buffer on the 86-board - * on every occuring of interrupt. - * By assuming that pcm_s.intr_size < PCM86_FIFOSIZE / 2, we can conclude - * that the FIFO buffer never overflows from the following lemma. - * - * Lemma: - * maxchunksize / 2 <= chunksize <= maxchunksize. - * (Though pcm_s.pdma_chunkcount is obtained through the flooring - * function, this inequality holds.) - * Proof) Omitted. - */ - - fifo_output_block(); - - pcm_s.intr_last = NO; - pcm_s.intr_mode = IMODE_OUTPUT; - if (!pcm_s.intr_busy) - fifo_start(IMODE_OUTPUT); - pcm_s.intr_busy = YES; - -#if 0 - RESTORE_INTR(flags); -#endif -} - - -static void -nss_start_input(int dev, unsigned long buf, int count, int intrflag, - int dma_restart) -{ - unsigned long flags, cnt; - int maxchunksize; - -#ifdef NSS_DEBUG - printf("nss_start_input():"); - if (audio_devs[dev]->dmap_in->flags & DMA_BUSY) - printf(" DMA_BUSY"); - if (audio_devs[dev]->dmap_in->flags & DMA_RESTART) - printf(" DMA_RESTART"); - if (audio_devs[dev]->dmap_in->flags & DMA_ACTIVE) - printf(" DMA_ACTIVE"); - if (audio_devs[dev]->dmap_in->flags & DMA_STARTED) - printf(" DMA_STARTED"); - if (audio_devs[dev]->dmap_in->flags & DMA_ALLOC_DONE) - printf(" DMA_ALLOC_DONE"); - printf("\n"); -#endif - -#if 0 - DISABLE_INTR(flags); -#endif - - pcm_s.intr_size = PCM86_INTRSIZE_IN; - -#ifdef NSS_DEBUG - printf("nss_start_input(): count = %d, intrsize= %d\n", - count, pcm_s.intr_size); -#endif - - pcm_s.pdma_buf = (pcm_data *)buf; - pcm_s.pdma_count = count; - pcm_s.pdma_chunkcount = 1; - maxchunksize = ((pcm_s.intr_size / (pcm_s.bytes * 2)) * pcm_s.speed - / pcm_s.chipspeed) * (pcm_s.bytes << pcm_s.stereo); - if (count > maxchunksize) - pcm_s.pdma_chunkcount = 2 * count / maxchunksize; - - pcm_s.intr_mode = IMODE_INPUT; - if (!pcm_s.intr_busy) - fifo_start(IMODE_INPUT); - pcm_s.intr_busy = YES; - -#if 0 - RESTORE_INTR(flags); -#endif -} - - -static int -nss_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) -{ - switch (cmd) { - case SOUND_PCM_WRITE_RATE: - if (local) - return set_speed((int) arg); - return *(int *) arg = set_speed((*(int *) arg)); - - case SOUND_PCM_READ_RATE: - if (local) - return pcm_s.speed; - return *(int *) arg = pcm_s.speed; - - case SNDCTL_DSP_STEREO: - if (local) - return set_stereo((int) arg); - return *(int *) arg = set_stereo((*(int *) arg)); - - case SOUND_PCM_WRITE_CHANNELS: - if (local) - return set_stereo((int) arg - 1) + 1; - return *(int *) arg = set_stereo((*(int *) arg) - 1) + 1; - - case SOUND_PCM_READ_CHANNELS: - if (local) - return pcm_s.stereo + 1; - return *(int *) arg = pcm_s.stereo + 1; - - case SNDCTL_DSP_SETFMT: - if (local) - return set_format((int) arg); - return *(int *) arg = set_format((*(int *) arg)); - - case SOUND_PCM_READ_BITS: - if (local) - return pcm_s.bytes * 8; - return *(int *) arg = pcm_s.bytes * 8; - } - - /* Invalid ioctl request */ - return -(EINVAL); -} - - -static int -nss_prepare_for_input(int dev, int bufsize, int nbufs) -{ - pcm_s.intr_size = PCM86_INTRSIZE_IN; - pcm_s.intr_mode = IMODE_NONE; - pcm_s.acc = 0; - pcm_s.last_l = 0; - pcm_s.last_r = 0; - - DEB(printf("nss_prepare_for_input\n")); - - return 0; -} - - -static int -nss_prepare_for_output(int dev, int bufsize, int nbufs) -{ - pcm_s.intr_size = PCM86_INTRSIZE_OUT; - pcm_s.intr_mode = IMODE_NONE; - pcm_s.acc = 0; - pcm_s.last_l = 0; - pcm_s.last_r = 0; - - DEB(printf("nss_prepare_for_output\n")); - - return 0; -} - - -static void -nss_reset(int dev) -{ - nss_stop(); -} - - -static void -nss_halt_xfer(int dev) -{ - nss_stop(); - - DEB(printf("nss_halt_xfer\n")); -} - - -void -nssintr(int unit) -{ - unsigned char tmp; - - if ((inb(pcm_s.iobase + 8) & 0x10) == 0) - return; /* not FIFO intr. */ - - switch(pcm_s.intr_mode) { - case IMODE_OUTPUT: - if (pcm_s.intr_trailer) { - DEB(printf("nssintr(): fifo_reset\n")); - fifo_reset(); - pcm_s.intr_trailer = NO; - pcm_s.intr_busy = NO; - } - if (pcm_s.pdma_count > 0) - fifo_output_block(); - else - DMAbuf_outputintr(my_dev, 1); - /* Reset intr. flag. */ - tmp = inb(pcm_s.iobase + 8); - outb(pcm_s.iobase + 8, tmp & ~0x10); - outb(pcm_s.iobase + 8, tmp | 0x10); - break; - - case IMODE_INPUT: - fifo_input_block(); - if (pcm_s.pdma_count == 0) - DMAbuf_inputintr(my_dev); - /* Reset intr. flag. */ - tmp = inb(pcm_s.iobase + 8); - outb(pcm_s.iobase + 8, tmp & ~0x10); - outb(pcm_s.iobase + 8, tmp | 0x10); - break; - - default: - nss_stop(); - printf("nss0: unexpected interrupt\n"); - } -} - - -#endif /* EXCLUDE_NSS, EXCLUDE_AUDIO */ - -#endif /* CONFIGURE_SOUNDCARD */ diff --git a/sys/i386/isa/sound/pss.c b/sys/i386/isa/sound/pss.c deleted file mode 100644 index a6a5b65..0000000 --- a/sys/i386/isa/sound/pss.c +++ /dev/null @@ -1,693 +0,0 @@ -/* - * 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 - -#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("", 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; - snprintf(tmp, sizeof(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 deleted file mode 100644 index e020af6..0000000 --- a/sys/i386/isa/sound/pss.h +++ /dev/null @@ -1,371 +0,0 @@ -/****************************************************************************** - - 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 deleted file mode 100644 index c78ce24..0000000 --- a/sys/i386/isa/sound/sb16_dsp.c +++ /dev/null @@ -1,561 +0,0 @@ -/* - * 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 - * 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. - * - * $FreeBSD$ - * - */ - -#define DEB(x) -#define DEB1(x) -#include -#include "sb.h" -#include -#include - -#if defined(CONFIG_SB16) && (NSB > 0) && defined(CONFIG_AUDIO) && defined(CONFIG_SBPRO) - - -extern sound_os_info *sb_osp; -extern int sbc_base; - -static int sb16_dsp_ok = 0; -static int dsp_16bit = 0; -static int dsp_stereo = 0; -static int dsp_current_speed = 8000; -static int dsp_busy = 0; -static int dma16, dma8; - - -static int trigger_bits = 0; -static u_long dsp_count = 0; - -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, 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, - NULL, - NULL, - sb16_dsp_trigger -}; - -static int -sb_dsp_command01(u_char val) -{ - int i = 1 << 16; - - 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) -{ - DEB(printf("dsp_set_speed(%d)\n", mode)); - if (mode) { - RANGE (mode, 5000, 44100); - dsp_current_speed = mode; - } - return mode; -} - -static int -dsp_set_stereo(int mode) -{ - DEB(printf("dsp_set_stereo(%d)\n", mode)); - dsp_stereo = mode; - return mode; -} - -static int -dsp_set_bits(int arg) -{ - DEB(printf("dsp_set_bits(%d)\n", arg)); - - if (arg) - dsp_16bit = (arg == 16) ? 1 : 0 ; - return dsp_16bit ? 16 : 8; -} - -static int -sb16_dsp_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) -{ - switch (cmd) { - case SOUND_PCM_WRITE_RATE: - 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 *(int *) arg = dsp_current_speed; - - case SNDCTL_DSP_STEREO: - 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((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 *(int *) arg = dsp_stereo + 1; - - case SNDCTL_DSP_SETFMT: - 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 *(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 -(EINVAL); - } - - return -(EINVAL); -} - -static int -sb16_dsp_open(int dev, int mode) -{ - 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); - - sb_reset_dsp(); - - - irq_mode = IMODE_NONE; - dsp_busy = 1; - trigger_bits = 0; - - return 0; -} - -static void -sb16_dsp_close(int dev) -{ - u_long flags; - - DEB(printf("sb16_dsp_close()\n")); - sb_dsp_command01(0xd9); - sb_dsp_command01(0xd5); - - flags = splhigh(); - - audio_devs[dev]->dmachan1 = dma8; - - dsp_cleanup(); - dsp_busy = 0; - - - splx(flags); -} - -static void -sb16_dsp_output_block(int dev, u_long buf, int count, int intrflag, int dma_restart) -{ - 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 */ - } - flags = splhigh(); - - if (dma_restart) { - - sb16_dsp_halt(dev); - DMAbuf_start_dma(dev, buf, count, 1); - } - - - 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, u_long buf, int count, int intrflag, int dma_restart) -{ - 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_INPUT; - intr_active = 1; - return; /* Auto mode on. No need to react */ - } - flags = splhigh(); - - 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) -{ - int fudge; - struct dma_buffparms *dmap = audio_devs[dev]->dmap_in; - - audio_devs[my_dev]->dmachan2 = dsp_16bit ? dma16 : dma8; - - - fudge = audio_devs[my_dev]->dmachan2 ; - - if (dmap->dma_chan != fudge ) { - isa_dma_release( dmap->dma_chan); - isa_dma_acquire(fudge); - dmap->dma_chan = 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 int -sb16_dsp_prepare_for_output(int dev, int bsize, int bcount) -{ - int fudge = dsp_16bit ? dma16 : dma8; - struct dma_buffparms *dmap = audio_devs[dev]->dmap_out; - - if (dmap->dma_chan != fudge ) { - isa_dma_release( dmap->dma_chan); - isa_dma_acquire(fudge); - dmap->dma_chan = 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) { - if (dsp_16bit) - sb_dsp_command(0xd6); /* Continue 16bit DMA */ - else - sb_dsp_command(0xd4); /* Continue 8bit DMA */ - } -} - -static void -dsp_cleanup(void) -{ - irq_mode = IMODE_NONE; - intr_active = 0; -} - -static void -sb16_dsp_reset(int dev) -{ - u_long flags; - - flags = splhigh(); - - sb_reset_dsp(); - dsp_cleanup(); - - splx(flags); -} - -static void -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); - } - - -} - -static void -set_irq_hw(int level) -{ - int ival; - - switch (level) { -#ifdef PC98 - case 5: - ival = 8; - break; - case 3: - ival = 1; - break; - case 10: - ival = 2; - break; -#else - case 5: - ival = 2; - break; - case 7: - ival = 4; - break; - case 9: - ival = 1; - break; - case 10: - ival = 8; - break; -#endif - default: - printf("SB16_IRQ_LEVEL %d does not exist\n", level); - return; - } - sb_setmixer(IRQ_NR, ival); -} - -void -sb16_dsp_init(struct address_info * hw_config) -{ - if (sbc_major < 4) - return; /* Not a SB16 */ - - snprintf(sb16_dsp_operations.name, sizeof(sb16_dsp_operations.name), - "SoundBlaster 16 %d.%d", sbc_major, sbc_minor); - - 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]->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) -{ - struct address_info *sb_config; - - if (sb16_dsp_ok) - return 1; /* Can't drive two cards */ - - 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; - */ - - if (!sb_reset_dsp()) - return 0; - - if (sbc_major < 4) /* Set by the plain SB driver */ - return 0; /* Not a SB16 */ - -#ifdef PC98 - hw_config->dma = sb_config->dma; -#else - 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; - } -#endif - 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); - -#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 - - 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 1; -} - -void -sb16_dsp_interrupt(int unused) -{ - int data; - - data = inb(DSP_DATA_AVL16); /* Interrupt acknowledge */ - - 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 deleted file mode 100644 index 86b338f..0000000 --- a/sys/i386/isa/sound/sb16_midi.c +++ /dev/null @@ -1,311 +0,0 @@ -/* - * 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 - * 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. - * - * $FreeBSD$ - * - */ - -#include -#include - -#if defined(CONFIG_SB) && defined(CONFIG_SB16) && defined(CONFIG_MIDI) - -#include "sb.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 - -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( COMDPORT, cmd) -#define sb16midi_read() inb( DATAPORT) -#define sb16midi_write(byte) outb( DATAPORT, byte) - -#define OUTPUT_READY 0x40 -#define INPUT_AVAIL 0x80 -#define MPU_ACK 0xFE -#define MPU_RESET 0xFF -#define UART_MODE_ON 0x3F - -static int sb16midi_opened = 0; -#ifdef PC98 -static int sb16midi_base = 0x80d2; -#else -static int sb16midi_base = 0x330; -#endif -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, u_char data); -static volatile u_char input_byte; - -static void -sb16midi_input_loop(void) -{ - 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) -{ - if (input_avail()) - sb16midi_input_loop(); -} - -static int -sb16midi_open(int dev, int mode, - void (*input) (int dev, u_char data), - void (*output) (int dev) -) -{ - if (sb16midi_opened) { - return -(EBUSY); - } - sb16midi_input_loop(); - - midi_input_intr = input; - sb16midi_opened = mode; - - return 0; -} - -static void -sb16midi_close(int dev) -{ - sb16midi_opened = 0; -} - -static int -sb16midi_out(int dev, u_char midi_byte) -{ - int timeout; - u_long flags; - - /* - * Test for input since pending input seems to block the output. - */ - - flags = splhigh(); - - if (input_avail()) - sb16midi_input_loop(); - - splx(flags); - - /* - * 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 */ - - if (!output_ready()) { - printf("MPU-401: Timeout\n"); - return 0; - } - sb16midi_write(midi_byte); - return 1; -} - -static int -sb16midi_start_read(int dev) -{ - return 0; -} - -static int -sb16midi_end_read(int dev) -{ - return 0; -} - -static int -sb16midi_ioctl(int dev, u_int cmd, ioctl_arg arg) -{ - return -(EINVAL); -} - -static void -sb16midi_kick(int dev) -{ -} - -static int -sb16midi_buffer_status(int dev) -{ - return 0; /* No data in buffers */ -} - -#define MIDI_SYNTH_NAME "SoundBlaster 16 Midi" -#define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT -#include - -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 -}; - - -void -attach_sb16midi(struct address_info * hw_config) -{ - 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) -{ - int ok, timeout, n; - - /* - * Send the RESET command. Try again if no success at the first time. - */ - - if (inb(STATPORT) == 0xff) - return 0; - - ok = 0; - - /* flags = splhigh(); */ - - 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 */ - - /* - * 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 */ - - /* splx(flags); */ - - return ok; -} - - -int -probe_sb16midi(struct address_info * hw_config) -{ - int ok = 0; - struct address_info *sb_config; - - if (sbc_major < 4) - return 0; /* Not a SB16 */ - - if (!(sb_config = sound_getconf(SNDCARD_SB))) { - printf("SB16 Error: Plain SB not configured\n"); - return 0; - } - - sb16midi_base = hw_config->io_base; - - ok = reset_sb16midi(); - - sb16midi_detected = ok; - return ok; -} - -#endif - diff --git a/sys/i386/isa/sound/sb_card.c b/sys/i386/isa/sound/sb_card.c deleted file mode 100644 index 37da6b4..0000000 --- a/sys/i386/isa/sound/sb_card.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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 - * 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. - * - * 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 - -#if NSB > 0 -#include - -void -attach_sb_card(struct address_info * 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 ; -} - -int -probe_sb(struct address_info * hw_config) -{ - -#if defined(CONFIG_AEDSP16) && defined(AEDSP16_SBPRO) - /* - * Initialize Audio Excel DSP 16 to SBPRO. - */ - InitAEDSP16_SBPRO(hw_config); -#endif - return sb_dsp_detect(hw_config); -} -#endif diff --git a/sys/i386/isa/sound/sb_defs.h b/sys/i386/isa/sound/sb_defs.h deleted file mode 100644 index e21c7c8..0000000 --- a/sys/i386/isa/sound/sb_defs.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifdef PC98 -#define DSP_RESET (sbc_base + 0x600) -#define DSP_READ (sbc_base + 0xA00) -#define DSP_WRITE (sbc_base + 0xC00) -#define DSP_COMMAND (sbc_base + 0xC00) -#define DSP_STATUS (sbc_base + 0xC00) -#define DSP_DATA_AVAIL (sbc_base + 0xE00) -#define DSP_DATA_AVL16 (sbc_base + 0xF00) -#define MIXER_ADDR (sbc_base + 0x400) -#define MIXER_DATA (sbc_base + 0x500) -#define OPL3_LEFT (sbc_base + 0x000) -#define OPL3_RIGHT (sbc_base + 0x200) -#define OPL3_BOTH (sbc_base + 0x800) -#else -#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) -#endif -/* DSP Commands */ - -#define DSP_CMD_SPKON 0xD1 -#define DSP_CMD_SPKOFF 0xD3 -#define DSP_CMD_DMAON 0xD0 -#define DSP_CMD_DMAOFF 0xD4 - -#define IMODE_NONE 0 -#define IMODE_OUTPUT 1 -#define IMODE_INPUT 2 -#define IMODE_INIT 3 -#define IMODE_MIDI 4 - -#define NORMAL_MIDI 0 -#define UART_MIDI 1 - diff --git a/sys/i386/isa/sound/sb_dsp.c b/sys/i386/isa/sound/sb_dsp.c deleted file mode 100644 index 7033ba9..0000000 --- a/sys/i386/isa/sound/sb_dsp.c +++ /dev/null @@ -1,1155 +0,0 @@ -/* - * 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 - * 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. - * - * 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 - * - * $FreeBSD$ - */ - -#include - -#if (NSB > 0) - -#ifdef SM_WAVE -#define JAZZ16 -#endif - -#include -#include -#include - -#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; -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 - * 'sb_irq_mode' will be set when the program calls read or write first time - * after open. Current version doesn't support mode changes without closing - * and reopening the device. Support for this feature may be implemented in a - * future version of this driver. - */ - -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 */ -static int dsp_stereo = 0; -static int dsp_current_speed = DSP_DEFAULT_SPEED; -static int sb16 = 0; - -int sb_midi_mode = NORMAL_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; /* or IMODE_INPUT or IMODE_OUTPUT */ - -static int dma8 = 1; - -#ifdef JAZZ16 /* 16 bit support for JAZZ16 */ - -static int dsp_16bit = 0; -static int dma16 = 5; - -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 void sb_dsp_reset(int dev); -sound_os_info *sb_osp = NULL; - -#if defined(CONFIG_MIDI) || defined(CONFIG_AUDIO) -static void dsp_speaker(char state); - -/* - * Common code for the midi and pcm functions - */ - -int -sb_dsp_command(u_char val) -{ - 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; - } - } - - printf("SoundBlaster: DSP Command(0x%02x) timeout. IRQ conflict ?\n", val); - return 0; -} - -void -sbintr(int irq) -{ - 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; - - default: - printf("SoundBlaster: Unexpected interrupt\n"); - } -} - - -int -sb_reset_dsp(void) -{ - int loopc; - - outb(DSP_RESET, 1); - DELAY(10); - outb(DSP_RESET, 0); - DELAY(30); - - - for (loopc = 0; loopc < 100 && !(inb(DSP_DATA_AVAIL) & 0x80); loopc++) - DELAY(10); - - if (inb(DSP_READ) != 0xAA) { - printf("sb_reset_dsp failed\n"); - return 0; /* Sorry */ - } - - return 1; -} - -#endif - -#ifdef CONFIG_AUDIO - -static void -dsp_speaker(char state) -{ - if (state) - sb_dsp_command(DSP_CMD_SPKON); - else - sb_dsp_command(DSP_CMD_SPKOFF); -} - -static int -dsp_speed(int speed) -{ - u_char tconst; - u_long flags; - int max_speed = 44100; - - 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; - - /* - * 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 !defined (SM_GAMES) - /* - * Max. stereo speed is 22050 - */ - if (dsp_stereo && speed > 22050 && Jazz16_detected == 0) - speed = 22050; -#endif - - 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; - - /* - * Now the speed should be valid - */ - - if (speed > 22050) { /* High speed mode */ - int tmp; - - tconst = (u_char) ((65536 - ((256000000 + speed / 2) / speed)) >> 8); - sb_dsp_highspeed = 1; - - 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; - - sb_dsp_highspeed = 0; - tconst = (256 - ((1000000 + speed / 2) / speed)) & 0xff; - - 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; - } - - if (dsp_stereo) - speed /= 2; - - dsp_current_speed = speed; - return speed; -} - -static int -dsp_set_stereo(int mode) -{ - dsp_stereo = 0; - -#ifndef CONFIG_SBPRO - return 0; -#else - if (sbc_major < 3 || sb16) - return 0; /* Sorry no stereo */ - - 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; -#endif -} - -static void -sb_dsp_output_block(int dev, u_long buf, int count, - int intrflag, int restart_dma) -{ - 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; -} - -static void -sb_dsp_start_input(int dev, u_long buf, int count, int intrflag, - int restart_dma) -{ - u_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); - } - - sb_intr_active = 1; -} - -static void -sb_dsp_trigger(int dev, int bits) -{ - if (bits == trigger_bits) - return; - - if (!bits) - sb_dsp_command(0xd0); /* Halt DMA */ - else if (bits & sb_irq_mode) - sb_dsp_command(0xd4); /* Continue DMA */ - - trigger_bits = bits; -} - -static void -dsp_cleanup(void) -{ - sb_intr_active = 0; -} - -static int -sb_dsp_prepare_for_input(int dev, int bsize, int bcount) -{ - int fudge = -1; - struct dma_buffparms *dmap = audio_devs[dev]->dmap_in; - - dsp_cleanup(); - dsp_speaker(OFF); - - if (sbc_major == 3) { /* SB Pro */ -#ifdef JAZZ16 - /* - * 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); -#endif - dsp_speed(dsp_current_speed); /* Speed must be recalculated - * if #channels * changes */ - } - - fudge = audio_devs[my_dev]->dmachan1; - if (dmap->dma_chan != fudge ) { - isa_dma_release( dmap->dma_chan); - isa_dma_acquire(fudge); - dmap->dma_chan = fudge; - } - - 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) -{ - - int fudge; - struct dma_buffparms *dmap = audio_devs[dev]->dmap_out; - - dsp_cleanup(); - dsp_speaker(ON); - -#ifdef CONFIG_SBPRO - if (sbc_major == 3) { /* SB Pro */ -#ifdef JAZZ16 - /* - * 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); -#endif - dsp_speed(dsp_current_speed); /* Speed must be recalculated - * if #channels * changes */ - } -#endif - fudge = audio_devs[my_dev]->dmachan1; - - if (dmap->dma_chan != fudge ) { - isa_dma_release( dmap->dma_chan); - isa_dma_acquire(fudge); - dmap->dma_chan = fudge; - } - - trigger_bits = 0; - sb_dsp_command(DSP_CMD_DMAHALT); /* Halt DMA */ - return 0; -} - -static void -sb_dsp_halt_xfer(int dev) -{ -} - -static int -sb_dsp_open(int dev, int mode) -{ - if (!sb_dsp_ok) { - printf("SB Error: SoundBlaster board not installed\n"); - return -(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)) { - printf("SB: PCM not possible during MIDI input\n"); - return -(EBUSY); - } - /* - * Allocate 8 bit dma - */ -#ifdef JAZZ16 - 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_dsp_busy = 1; - open_mode = mode; - - - return 0; -} - -static void -sb_dsp_close(int dev) -{ -#ifdef JAZZ16 - /* - * Release 16 bit dma channel - */ - if (Jazz16_detected) { - audio_devs[my_dev]->dmachan1 = dma8; - - } -#endif - - 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 - */ -static int -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; -} - -#endif /* ifdef JAZZ16 */ - -static int -sb_dsp_ioctl(int dev, u_int cmd, ioctl_arg arg, int local) -{ - switch (cmd) { - case SOUND_PCM_WRITE_RATE: - 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 *(int *) arg = dsp_current_speed; - break; - - case SOUND_PCM_WRITE_CHANNELS: - 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 *(int *) arg = dsp_stereo + 1; - break; - - case SNDCTL_DSP_STEREO: - 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 - */ - case SNDCTL_DSP_SETFMT: - 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 *(int *) arg = dsp_16bit ? 16 : 8; - break; -#else - case SOUND_PCM_WRITE_BITS: - case SOUND_PCM_READ_BITS: - 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 -(EINVAL); - break; - - default:; - } - - return -(EINVAL); -} - -static void -sb_dsp_reset(int dev) -{ - u_long flags; - - flags = splhigh(); - - sb_reset_dsp(); - dsp_speed(dsp_current_speed); - dsp_cleanup(); - - splx(flags); -} - -#endif - - -#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. - * - * Also used by Jazz 16 (same card, different name) - * - * written 1994 by Rainer Vranken E-Mail: - * rvranken@polaris.informatik.uni-essen.de - */ - -u_int -get_sb_byte(void) -{ - int i; - - 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. - */ - -static void -smw_putmem(int base, int addr, u_char val) -{ - u_long flags; - - flags = splhigh(); - - outb(base + 1, addr & 0xff); /* Low address bits */ - outb(base + 2, addr >> 8); /* High address bits */ - outb(base, val); /* Data */ - - splx(flags); -} - -static u_char -smw_getmem(int base, int addr) -{ - u_long flags; - u_char val; - - flags = splhigh(); - - outb(base + 1, addr & 0xff); /* Low address bits */ - outb(base + 2, addr >> 8); /* High address bits */ - val = inb(base); /* Data */ - - splx(flags); - return val; -} - -#ifdef SMW_MIDI0001_INCLUDED -#include -#else -u_char *smw_ucode = NULL; -int smw_ucodeLen = 0; - -#endif - -static int -initialize_smw(int mpu_base) -{ - - 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 - */ - - for (i = 0; i < 8192; i++) - smw_putmem(mp_base, i, smw_ucode[i]); - - /* - * Verify microcode - */ - - 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 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; - } -#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 */ -#endif - - outb(mpu_base + 7, control | 0x03); /* xxxxxx11 restarts */ - return 1; -} - -#endif - -static int -initialize_ProSonic16(void) -{ - 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 (mpu_base != 0) - if (initialize_smw(mpu_base)) - Jazz16_detected = 2; -#endif - sb_dsp_disable_midi(); - } - return 1; /* There was at least a SB */ - } - return 0; /* No SB or ProSonic16 detected */ -} - -#endif /* ifdef JAZZ16 */ - -int -sb_dsp_detect(struct address_info * hw_config) -{ - 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; - -#ifdef JAZZ16 - dma16 = JAZZ_DMA16; - - 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; - } -#endif - - return 1; /* Detected */ -} - -#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 */ - NULL, - NULL, - sb_dsp_trigger -}; - -#endif - -void -sb_dsp_init(struct address_info * hw_config) -{ - int i; - char *fmt = NULL ; - -#ifdef CONFIG_SBPRO - int mixer_type = 0; - -#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 == 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 == 3 && sbc_minor == 1) { - int ess_major = 0, ess_minor = 0; - - /* - * Try to detect ESS chips. - */ - - sb_dsp_command(DSP_CMD_GETID); /* Return identification bytes. */ - - 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; - } - } - } - - 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");; - -#ifdef CONFIG_SBPRO - if (sbc_major >= 3) - mixer_type = sb_mixer_init(sbc_major); -#else - if (sbc_major >= 3) - printf("\nNOTE! SB Pro support required with your soundcard!\n"); -#endif - - -#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" ; - } - - snprintf(sb_dsp_operations.name, sizeof(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"); -#if defined(CONFIG_SB16) && defined(CONFIG_SBPRO) - } -#endif /* CONFIG_SB16 && CONFIG_SBPRO */ -#else - conf_printf("SoundBlaster (configured without audio support)", hw_config); -#endif - -#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) -{ - midi_disabled = 1; -} -#endif diff --git a/sys/i386/isa/sound/sb_midi.c b/sys/i386/isa/sound/sb_midi.c deleted file mode 100644 index 3d773be..0000000 --- a/sys/i386/isa/sound/sb_midi.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - * 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 - * 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 - -#if (NSND > 0) && defined(CONFIG_SB) && defined(CONFIG_MIDI) - -#include -#undef SB_TEST_IRQ - -/* - * The DSP channel can be used either for input or output. Variable - * 'sb_irq_mode' will be set when the program calls read or write first time - * after open. Current version doesn't support mode changes without closing - * and reopening the device. Support for this feature may be implemented in a - * future version of this driver. - */ - -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_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; -static int my_dev; - -extern sound_os_info *sb_osp; - -static void (*midi_input_intr) (int dev, u_char data); - -static int -sb_midi_open(int dev, int mode, void (*input) (int dev, u_char data), - void (*output) (int dev)) -{ - int ret; - - if (!sb_dsp_ok) { - printf("SB Error: MIDI hardware not installed\n"); - return -(ENXIO); - } - if (sb_midi_busy) - return -(EBUSY); - - 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 -(EBUSY); - sb_midi_mode = UART_MIDI; - } - 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; - - sb_reset_dsp(); - - if (!sb_dsp_command(0x35)) - return -(EIO); /* Enter the UART mode */ - sb_intr_active = 1; - - input_opened = 1; - midi_input_intr = input; - } - sb_midi_busy = 1; - - return 0; -} - -static void -sb_midi_close(int dev) -{ - 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; -} - -static int -sb_midi_out(int dev, u_char midi_byte) -{ - 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) -{ - if (sb_midi_mode != UART_MIDI) { - printf("SoundBlaster: MIDI input not implemented.\n"); - return -(EPERM); - } - return 0; -} - -static int -sb_midi_end_read(int dev) -{ - if (sb_midi_mode == UART_MIDI) { - sb_reset_dsp(); - sb_intr_active = 0; - } - return 0; -} - -static int -sb_midi_ioctl(int dev, u_int cmd, ioctl_arg arg) -{ - return -(EPERM); -} - -void -sb_midi_interrupt(int dummy) -{ - u_long flags; - u_char data; - - flags = splhigh(); - - data = inb(DSP_READ); - if (input_opened) - midi_input_intr(my_dev, data); - - splx(flags); -} - -#define MIDI_SYNTH_NAME "SoundBlaster Midi" -#define MIDI_SYNTH_CAPS 0 -#include - -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 -}; - -void -sb_midi_init(int model) -{ - 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; -} - -#endif diff --git a/sys/i386/isa/sound/sb_mixer.c b/sys/i386/isa/sound/sb_mixer.c deleted file mode 100644 index 14db176..0000000 --- a/sys/i386/isa/sound/sb_mixer.c +++ /dev/null @@ -1,529 +0,0 @@ -/* - * 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 - * 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. - * - * Modified: Hunyue Yau Jan 6 1994 Added code to support the Sound Galaxy - * NX Pro mixer. - * - */ - -#include - -#if (NSB > 0) && defined(CONFIG_SBPRO) -#define __SB_MIXER_C__ - -#include -#include -#undef SB_TEST_IRQ - -extern int sbc_base; -extern int Jazz16_detected; -extern sound_os_info *sb_osp; - -static int mixer_initialized = 0; - -static int supported_rec_devices; -static int supported_devices; -static int recmask = 0; -static int mixer_model; -static int mixer_caps; -static mixer_tab *iomap; - -void -sb_setmixer(u_int port, u_int value) -{ - 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(u_int port) -{ - 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) -{ - if (!mixer_initialized) - return; - - 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. - */ -static int -detect_mixer(void) -{ - -#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; - -#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. - * - * Also place the card into WSS mode. - */ - if (sbc_major == 3) { - outb(sbc_base + 0x1c, 0x01); - outb(sbc_base + 0x1a, 0x00); - } -#endif - return retcode; -} - -static void -change_bits(u_char *regval, int dev, int chn, int newval) -{ - 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) -{ - if (!((1 << dev) & supported_devices)) - return -(EINVAL); - - return levels[dev]; -} - -#ifdef JAZZ16 -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 */ -}; - -static void -smw_mixer_init(void) -{ - int i; - - 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_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) -{ - int left = value & 0x000000ff; - int right = (value & 0x0000ff00) >> 8; - int reg, val; - - if (left > 100) - left = 100; - if (right > 100) - right = 100; - - if (dev > 31) - return -(EINVAL); - - if (!(supported_devices & (1 << dev))) /* Not supported */ - return -(EINVAL); - - 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; - - case SOUND_MIXER_BASS: - case SOUND_MIXER_TREBLE: - 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 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 -(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); -} - -#endif - -static int -sb_mixer_set(int dev, int value) -{ - int left = value & 0x000000ff; - int right = (value & 0x0000ff00) >> 8; - - int regoffs; - u_char val; - -#ifdef JAZZ16 - if (Jazz16_detected == 2) - return smw_mixer_set(dev, value); -#endif - - if (left > 100) - left = 100; - if (right > 100) - right = 100; - - if (dev > 31) - return -(EINVAL); - - if (!(supported_devices & (1 << dev))) /* Not supported */ - return -(EINVAL); - - regoffs = (*iomap)[dev][LEFT_CHN].regno; - - if (regoffs == 0) - return -(EINVAL); - - val = sb_getmixer(regoffs); - change_bits(&val, dev, LEFT_CHN, left); - - 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 (regoffs == 0) - return left | (left << 8); /* Just left channel present */ - - val = sb_getmixer(regoffs); /* Read the new one */ - } - change_bits(&val, dev, RIGHT_CHN, right); - - sb_setmixer(regoffs, val); - - levels[dev] = left | (right << 8); - return left | (right << 8); -} - -static void -set_recsrc(int src) -{ - sb_setmixer(RECORD_SRC, (sb_getmixer(RECORD_SRC) & ~7) | (src & 0x7)); -} - -static int -set_recmask(int mask) -{ - int devmask, i; - u_char regimageL, regimageR; - - devmask = mask & supported_rec_devices; - - 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. Default to mic */ - devmask = SOUND_MASK_MIC; - } - if (devmask ^ recmask) { /* Input source changed */ - switch (devmask) { - - case SOUND_MASK_MIC: - set_recsrc(SRC_MIC); - break; - - case SOUND_MASK_LINE: - set_recsrc(SRC_LINE); - break; - - case SOUND_MASK_CD: - set_recsrc(SRC_CD); - break; - - default: - set_recsrc(SRC_MIC); - } - } - 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; - } - - recmask = devmask; - return recmask; -} - -static int -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 *(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 -}; - -static void -sb_mixer_reset(void) -{ - int i; - - 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 - * - * Used to update message. - */ -int -sb_mixer_init(int major_model) -{ - int mixer_type = 0; - - sb_setmixer(0x00, 0); /* Reset mixer */ - - if (!(mixer_type = detect_mixer())) - return 0; /* No mixer. Why? */ - - mixer_initialized = 1; - mixer_model = major_model; - - switch (major_model) { - case 3: - 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 -#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 -#endif - { - supported_devices = SBPRO_MIXER_DEVICES; - supported_rec_devices = SBPRO_RECORDING_DEVICES; - iomap = &sbpro_mix; - mixer_type = 1; - } - break; - - case 4: - mixer_caps = 0; - supported_devices = SB16_MIXER_DEVICES; - supported_rec_devices = SB16_RECORDING_DEVICES; - iomap = &sb16_mix; - mixer_type = 3; - break; - - default: - 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; -} - -#endif diff --git a/sys/i386/isa/sound/sb_mixer.h b/sys/i386/isa/sound/sb_mixer.h deleted file mode 100644 index 155d6c7..0000000 --- a/sys/i386/isa/sound/sb_mixer.h +++ /dev/null @@ -1,255 +0,0 @@ -/* - * sound/sb_mixer.h - * - * Definitions for the SB Pro and SB16 mixers - * - * 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. - * - * Modified: Hunyue Yau Jan 6 1994 Added defines for the Sound Galaxy NX Pro - * mixer. - * - */ - -#define SBPRO_RECORDING_DEVICES (SOUND_MASK_LINE | SOUND_MASK_MIC | SOUND_MASK_CD) - -/* Same as SB Pro, unless I find otherwise */ -#define SGNXPRO_RECORDING_DEVICES SBPRO_RECORDING_DEVICES - -#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? - */ -#define SGNXPRO_MIXER_DEVICES (SBPRO_MIXER_DEVICES|SOUND_MASK_BASS| \ - SOUND_MASK_TREBLE|SOUND_MASK_SPEAKER ) - -#define SB16_RECORDING_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_LINE | SOUND_MASK_MIC | \ - SOUND_MASK_CD) - -#define SB16_MIXER_DEVICES (SOUND_MASK_SYNTH | SOUND_MASK_PCM | SOUND_MASK_SPEAKER | SOUND_MASK_LINE | SOUND_MASK_MIC | \ - SOUND_MASK_CD | \ - SOUND_MASK_IGAIN | SOUND_MASK_OGAIN | \ - SOUND_MASK_VOLUME | SOUND_MASK_BASS | SOUND_MASK_TREBLE) - -/* - * Mixer registers - * - * NOTE! RECORD_SRC == IN_FILTER - */ - -/* - * Mixer registers of SB Pro - */ -#define VOC_VOL 0x04 -#define MIC_VOL 0x0A -#define MIC_MIX 0x0A -#define RECORD_SRC 0x0C -#define IN_FILTER 0x0C -#define OUT_FILTER 0x0E -#define MASTER_VOL 0x22 -#define FM_VOL 0x26 -#define CD_VOL 0x28 -#define LINE_VOL 0x2E -#define IRQ_NR 0x80 -#define DMA_NR 0x81 -#define IRQ_STAT 0x82 -#define OPSW 0x3c - -/* - * Additional registers on the SG NX Pro - */ -#define COVOX_VOL 0x42 -#define TREBLE_LVL 0x44 -#define BASS_LVL 0x46 - -#define FREQ_HI (1 << 3)/* Use High-frequency ANFI filters */ -#define FREQ_LOW 0 /* Use Low-frequency ANFI filters */ -#define FILT_ON 0 /* Yes, 0 to turn it on, 1 for off */ -#define FILT_OFF (1 << 5) - -#define MONO_DAC 0x00 -#define STEREO_DAC 0x02 - -/* - * Mixer registers of SB16 - */ -#define SB16_IMASK_L 0x3d -#define SB16_IMASK_R 0x3e - -#define LEFT_CHN 0 -#define RIGHT_CHN 1 - -struct mixer_def { - unsigned int regno:8; - unsigned int bitoffs:4; - unsigned int nbits:4; -}; - - -typedef struct mixer_def mixer_tab[32][2]; -typedef struct mixer_def mixer_ent; - -#define MIX_ENT(name, reg_l, bit_l, len_l, reg_r, bit_r, len_r) \ - {{reg_l, bit_l, len_l}, {reg_r, bit_r, len_r}} - -#ifdef __SB_MIXER_C__ -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__ -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 - -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 */ - -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 */ - -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 */ - -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 */ -}; - -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 */ -}; - -/* - * Recording sources (SB Pro) - */ - -#define SRC_MIC 1 /* Select Microphone recording source */ -#define SRC_CD 3 /* Select CD recording source */ -#define SRC_LINE 7 /* Use Line-in for recording source */ - -#endif diff --git a/sys/i386/isa/sound/sbcard.h b/sys/i386/isa/sound/sbcard.h deleted file mode 100644 index 20e33a1..0000000 --- a/sys/i386/isa/sound/sbcard.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * file: sbcard.h - * - * $FreeBSD$ - * - */ - -extern int sbc_major, sbc_minor ; -/* - * sound blaster registers - */ - -#ifdef PC98 -#define DSP_RESET (sbc_base + 0x600) -#define DSP_READ (sbc_base + 0xA00) -#define DSP_WRITE (sbc_base + 0xC00) -#define DSP_COMMAND (sbc_base + 0xC00) -#define DSP_STATUS (sbc_base + 0xC00) -#define DSP_DATA_AVAIL (sbc_base + 0xE00) -#define DSP_DATA_AVL16 (sbc_base + 0xF00) -#define MIXER_ADDR (sbc_base + 0x400) -#define MIXER_DATA (sbc_base + 0x500) -#define OPL3_LEFT (sbc_base + 0x000) -#define OPL3_RIGHT (sbc_base + 0x200) -#define OPL3_BOTH (sbc_base + 0x800) -#else -#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) -#endif - -/* - * 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 deleted file mode 100644 index ec3bb9b..0000000 --- a/sys/i386/isa/sound/sequencer.c +++ /dev/null @@ -1,1824 +0,0 @@ -/* - * 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 - * 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. - * - */ - -#define SEQUENCER_C -#include - -#if NSND > 0 - -#ifdef CONFIG_SEQUENCER - -#include - -#include - -static void seq_drain_midi_queues(void); -int -sequencer_poll (int dev, struct fileinfo *file, int events, select_table * wait); -static int sequencer_ok = 0; -static struct sound_timer_operations *tmr; -static int tmr_no = -1; /* Currently selected timer */ -static int pending_timer = -1; /* For timer change operation */ - -/* - * Local counts for number of synth and MIDI devices. These are initialized - * by the sequencer_open. - */ -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) - */ - -#define SEQ_1 1 -#define SEQ_2 2 -static int seq_mode = SEQ_1; - -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 u_long prev_input_time = 0; -static int prev_event_time; -static u_long seq_time = 0; - -#include - -#define EV_SZ 8 -#define IEV_SZ 8 -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 volatile int sequencer_busy = 0; -static int output_treshold; -static int pre_event_timeout; -static u_int synth_open_mask; - -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) -{ - int c = count, p = 0; - int ev_len; - u_long flags; - - dev = dev >> 4; - - ev_len = seq_mode == SEQ_1 ? 4 : 8; - - if (dev) /* Patch manager device */ - return pmgr_read(dev - 1, file, buf, count); - - flags = splhigh(); - if (!iqlen) { - int chn; - - - midi_sleeper = &chn; - DO_SLEEP(chn, midi_sleep_flag, pre_event_timeout); - - if (!iqlen) { - splx(flags); - return 0; - } - } - while (iqlen && 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--; - } - splx(flags); - - return count - c; -} - -static void -sequencer_midi_output(int dev) -{ - /* - * Currently NOP - */ -} - -void -seq_copy_to_input(u_char *event, int len) -{ - 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 (iqlen >= (SEQ_MAX_QUEUE - 1)) - return; /* Overflow */ - - flags = splhigh(); - bcopy(event, &iqueue[iqtail * IEV_SZ], len); - iqlen++; - iqtail = (iqtail + 1) % SEQ_MAX_QUEUE; - - if ((midi_sleep_flag.mode & WK_SLEEP)) { - midi_sleep_flag.mode = WK_WAKEUP; - wakeup(midi_sleeper); - } - splx(flags); -} - -static void -sequencer_midi_input(int dev, u_char data) -{ - u_int tstamp; - u_char event[4]; - - if (data == 0xfe) /* Ignore active sensing */ - return; - - tstamp = get_time() - seq_time; - if (tstamp != prev_input_time) { - tstamp = (tstamp << 8) | SEQ_WAIT; - - 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; - - seq_copy_to_input(event, 4); -} - -void -seq_input_event(u_char *event, int len) -{ - u_long this_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) { - u_char tmp_event[8]; - - 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(event, len); -} - -int -sequencer_write(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) -{ - u_char event[EV_SZ], ev_code; - int p = 0, c, ev_size; - int err; - int mode = file->mode & O_ACCMODE; - - dev = dev >> 4; - - DEB(printf("sequencer_write(dev=%d, count=%d)\n", dev, count)); - - if (mode == OPEN_READ) - return -(EIO); - - if (dev) - return pmgr_write(dev - 1, file, buf, count); - - c = count; - - while (c >= 4) { - - if (uiomove((char *) event, 4, buf)) - printf("sb: Bad copyin()!\n"); - ev_code = event[0]; - - if (ev_code == SEQ_FULLSIZE) { - int err; - - dev = *(u_short *) &event[2]; - if (dev < 0 || dev >= max_synthdev) - return -(ENXIO); - - if (!(synth_open_mask & (1 << dev))) - return -(ENXIO); - - err = synth_devs[dev]->load_patch(dev, - *(short *) &event[0], buf, p + 4, c, 0); - if (err < 0) - return err; - - 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; - - if (c < ev_size) { - if (!seq_playing) - seq_startplay(); - return count - c; - } - 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; - } - - if (event[0] == SEQ_MIDIPUTC) { - - if (!midi_opened[event[2]]) { - int mode; - int dev = event[2]; - - if (dev >= max_mididev) { - printf("Sequencer Error: Nonexistent MIDI device %d\n",dev); - return -(ENXIO); - } - mode = file->mode & O_ACCMODE; - - 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; - } - } - if (!seq_queue(event, 0)) { - int processed = count - c; - - if (!seq_playing) - seq_startplay(); - - if (!processed && 0) - return -(EAGAIN); - else - return processed; - } - p += ev_size; - c -= ev_size; - } - - if (!seq_playing) - seq_startplay(); - - return count; /* This will "eat" chunks shorter than 4 bytes - * (if written alone) Should we really do that ? - */ -} - -static int -seq_queue(u_char *note, char nonblock) -{ - - /* - * 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 (!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 */ - bcopy(note, &queue[qtail * EV_SZ], EV_SZ); - - qtail = (qtail + 1) % SEQ_MAX_QUEUE; - qlen++; - - return 1; -} - -static int -extended_event(u_char *q) -{ - int dev = q[2]; - - if (dev < 0 || dev >= max_synthdev) - return -(ENXIO); - - if (!(synth_open_mask & (1 << dev))) - return -(ENXIO); - - switch (q[1]) { - case SEQ_NOTEOFF: - 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; - - 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; - - case SEQ_AFTERTOUCH: - synth_devs[dev]->aftertouch(dev, q[3], q[4]); - break; - - case SEQ_BALANCE: - 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; - - case SEQ_VOLMODE: - if (synth_devs[dev]->volume_method != NULL) - synth_devs[dev]->volume_method(dev, q[3]); - break; - - default: - return -(EINVAL); - } - - return 0; -} - -static int -find_voice(int dev, int chn, int note) -{ - u_short key; - int i; - - 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; - - return -1; -} - -static int -alloc_voice(int dev, int chn, int note) -{ - u_short key; - int voice; - - 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; -} - -static void -seq_chn_voice_event(u_char *event) -{ - 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 (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) { - case MIDI_NOTEON: - 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) - voice = chn; - - 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 (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; - - case MIDI_KEY_PRESSURE: - if (voice == -1) - voice = chn; - synth_devs[dev]->aftertouch(dev, voice, parm); - break; - - default:; - } -} - -static void -seq_chn_common_event(u_char *event) -{ - 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 ((int) dev >= num_synths) - synth_devs[dev]->set_instr(dev, chn, p1); - } else - synth_devs[dev]->set_instr(dev, chn, p1); - - break; - - case MIDI_CTL_CHANGE: - if (seq_mode == SEQ_2) { - if (chn > 15 || p1 > 127) - break; - - synth_devs[dev]->chn_info[chn].controllers[p1] = w14 & 0x7f; - - if (p1 < 32) /* Setting MSB should clear LSB to 0 */ - synth_devs[dev]->chn_info[chn].controllers[p1 + 32] = 0; - - if ((int) 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; - } - /* 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 ((int) dev < num_synths) { /* Handle all playing - * notes on this channel */ - int i, key; - - 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; - - default:; - } -} - -static int -seq_timing_event(u_char *event) -{ - u_char cmd = event[1]; - u_int parm = *(int *) &event[4]; - - if (seq_mode == SEQ_2) { - int ret; - - 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); - } - splx(flags); - } - } - return ret; - } - switch (cmd) { - case TMR_WAIT_REL: - parm += prev_event_time; - - /* - * 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; - - seq_playing = 1; - time = parm; - prev_event_time = time; - - request_sound_timer(time); - - 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); - } - splx(flags); - } - return TIMER_ARMED; - } - break; - - case TMR_START: - seq_time = get_time(); - prev_input_time = 0; - prev_event_time = 0; - break; - - case TMR_STOP: - break; - - case TMR_CONTINUE: - break; - - case TMR_TEMPO: - 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((u_char *) &parm, 4); - } - break; - - default:; - } - - 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_sysex_message(u_char *event) -{ - 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; - - if (l > 0) - synth_devs[dev]->send_sysex(dev, buf, l); -} - -static int -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 - */ - 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; - - 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; - - case SEQ_WAIT: - delay = (u_long *) q; /* Bytes 1 to 3 are - * containing the * delay in - * get_time() */ - *delay = (*delay >> 8) & 0xffffff; - - if (*delay > 0) { - long time; - - seq_playing = 1; - time = *delay; - prev_event_time = time; - - request_sound_timer(time); - - 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); - } - splx(flags); - } - /* - * The timer is now active and will reinvoke this - * function after the timer expires. Return to the - * caller now. - */ - return 1; - } - 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; - } - break; - - case SEQ_ECHO: - 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; - - case SEQ_EXTENDED: - extended_event(q); - break; - - case EV_CHN_VOICE: - seq_chn_voice_event(q); - break; - - case EV_CHN_COMMON: - seq_chn_common_event(q); - break; - - case EV_TIMING: - if (seq_timing_event(q) == TIMER_ARMED) { - return 1; - } - break; - - case EV_SEQ_LOCAL: - seq_local_event(q); - break; - - case EV_SYSEX: - seq_sysex_message(q); - break; - - default:; - } - - return 0; -} - -static void -seq_startplay(void) -{ - u_long flags; - int this_one, action; - - while (qlen > 0) { - - flags = splhigh(); - qhead = ((this_one = qhead) + 1) % SEQ_MAX_QUEUE; - qlen--; - splx(flags); - - 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; - } - return; - } - } - - seq_playing = 0; - - 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); - } - splx(flags); - } -} - -static void -reset_controllers(int dev, u_char *controller, int update_dev) -{ - - int i; - - for (i = 0; i < 128; i++) - controller[i] = ctrl_def_values[i]; -} - -static void -setup_mode2(void) -{ - int dev; - - 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 < 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 */ - } - } - - max_mididev = 0; - seq_mode = SEQ_2; -} - -int -sequencer_open(int dev, struct fileinfo * file) -{ - int retval, mode, i; - int level, tmp; - u_long flags; - - level = ((dev & 0x0f) == SND_DEV_SEQ2) ? 2 : 1; - - dev = dev >> 4; - mode = file->mode & O_ACCMODE; - - DEB(printf("sequencer_open(dev=%d)\n", dev)); - - if (!sequencer_ok) { - printf("Soundcard: Sequencer not initialized\n"); - return -(ENXIO); - } - if (dev) { /* Patch manager device */ - int err; - - printf("Patch manager interface is currently broken. Sorry\n"); - return -(ENXIO); - - dev--; - - 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; - } - 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; - - 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; - } - tmr = sound_timer_devs[tmr_no]; - - if (level == 2) { - if (tmr == NULL) { - printf("sequencer: No timer for level 2\n"); - sequencer_busy = 0; - return -(ENXIO); - } - 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); - - synth_open_mask = 0; - - for (i = 0; i < max_mididev; i++) { - midi_opened[i] = 0; - midi_written[i] = 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; - } - - 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, - sequencer_midi_input, sequencer_midi_output)) >= 0) - midi_opened[i] = 1; - } - } - 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; - - for (i = 0; i < num_synths; i++) - if (pmgr_present[i]) - pmgr_inform(i, PM_E_OPENED, 0, 0, 0, 0); - - return 0; -} - -static void -seq_drain_midi_queues(void) -{ - int i, n; - - /* - * Give the Midi drivers time to drain their output queues - */ - - 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); - - } - } -} - -void -sequencer_release(int dev, struct fileinfo * file) -{ - int i; - int mode = file->mode & O_ACCMODE; - - dev = dev >> 4; - - DEB(printf("sequencer_release(dev=%d)\n", dev)); - - 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) - */ - - if (mode != OPEN_READ && !0) - while (!(seq_sleep_flag.aborting) && 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; - } - 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; -} - -static int -seq_sync(void) -{ - u_long flags; - - 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); - - } - splx(flags); - - return qlen; -} - -static void -midi_outc(int dev, u_char data) -{ - /* - * NOTE! Calls sleep(). Don't call this from interrupt. - */ - - 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 - */ - - n = 3 * hz; /* Timeout */ - - flags = splhigh(); - while (n && !midi_devs[dev]->putc(dev, data)) { - int chn; - seq_sleeper = &chn; - DO_SLEEP(chn, seq_sleep_flag, 4); - - n--; - } - splx(flags); -} - -static void -seq_reset(void) -{ - /* - * NOTE! Calls sleep(). Don't call this from interrupt. - */ - - int i; - int chn; - u_long flags; - - sound_stop_timer(); - seq_time = get_time(); - prev_input_time = 0; - prev_event_time = 0; - - qlen = qhead = qtail = 0; - iqlen = iqhead = iqtail = 0; - - for (i = 0; i < max_synthdev; i++) - if (synth_open_mask & (1 << i)) - if (synth_devs[i]) - 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 */ - } - - } 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_written[i] = 0; - midi_opened[i] = 0; - } - } - - seq_playing = 0; - - flags = splhigh(); - if ((seq_sleep_flag.mode & WK_SLEEP)) { - seq_sleep_flag.mode = WK_WAKEUP; - wakeup(seq_sleeper); - } - splx(flags); - -} - -static void -seq_panic(void) -{ - /* - * This routine is called by the application in case the user wants - * to reset the system to the default state. - */ - - 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 - */ - - /* - * Also return the controllers to their default states - */ -} - -int -sequencer_ioctl(int dev, struct fileinfo * file, - u_int cmd, ioctl_arg arg) -{ - int midi_dev, orig_dev; - int mode = file->mode & O_ACCMODE; - - orig_dev = dev = dev >> 4; - - switch (cmd) { - case SNDCTL_TMR_TIMEBASE: - case SNDCTL_TMR_TEMPO: - case SNDCTL_TMR_START: - case SNDCTL_TMR_STOP: - case SNDCTL_TMR_CONTINUE: - case SNDCTL_TMR_METRONOME: - case SNDCTL_TMR_SOURCE: - if (dev) /* Patch manager */ - return -(EIO); - - if (seq_mode != SEQ_2) - return -(EINVAL); - return tmr->ioctl(tmr_no, cmd, arg); - break; - - case SNDCTL_TMR_SELECT: - if (dev) /* Patch manager */ - return -(EIO); - - if (seq_mode != SEQ_2) - return -(EINVAL); - pending_timer = (*(int *) arg); - - if (pending_timer < 0 || pending_timer >= num_sound_timers) { - pending_timer = -1; - return -(EINVAL); - } - return *(int *) arg = pending_timer; - break; - - case SNDCTL_SEQ_PANIC: - seq_panic(); - break; - - case SNDCTL_SEQ_SYNC: - 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 -(EIO); - - seq_reset(); - return 0; - break; - - case SNDCTL_SEQ_TESTMIDI: - if (dev) /* Patch manager */ - return -(EIO); - - midi_dev = (*(int *) arg); - if (midi_dev >= max_mididev) - return -(ENXIO); - - 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; - } - midi_opened[midi_dev] = 1; - - return 0; - break; - - case SNDCTL_SEQ_GETINCOUNT: - if (dev) /* Patch manager */ - return -(EIO); - - if (mode == OPEN_WRITE) - return 0; - return *(int *) arg = iqlen; - break; - - case SNDCTL_SEQ_GETOUTCOUNT: - - if (mode == OPEN_READ) - return 0; - return *(int *) arg = SEQ_MAX_QUEUE - qlen; - break; - - case SNDCTL_SEQ_CTRLRATE: - 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 ((*(int *) arg) != 0) - return -(EINVAL); - - return *(int *) arg = hz; - break; - - case SNDCTL_SEQ_RESETSAMPLES: - { - int err; - - 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); - - err = synth_devs[dev]->ioctl(dev, cmd, arg); - return err; - } - break; - - case SNDCTL_SEQ_NRSYNTHS: - return *(int *) arg = max_synthdev; - break; - - case SNDCTL_SEQ_NRMIDIS: - return *(int *) arg = max_mididev; - break; - - case SNDCTL_SYNTH_MEMAVL: - { - int dev = (*(int *) arg); - - if (dev < 0 || dev >= num_synths) - return -(ENXIO); - - if (!(synth_open_mask & (1 << dev)) && !orig_dev) - return -(EBUSY); - - return *(int *) arg = synth_devs[dev]->ioctl(dev, cmd, arg); - } - break; - - case SNDCTL_FM_4OP_ENABLE: - { - int dev = (*(int *) arg); - - if (dev < 0 || dev >= num_synths) - return -(ENXIO); - - if (!(synth_open_mask & (1 << dev))) - return -(ENXIO); - - synth_devs[dev]->ioctl(dev, cmd, arg); - return 0; - } - break; - - case SNDCTL_SYNTH_INFO: - { - struct synth_info inf; - int dev; - - bcopy(&(((char *) arg)[0]), (char *) &inf, sizeof(inf)); - dev = inf.device; - - if (dev < 0 || dev >= max_synthdev) - return -(ENXIO); - - if (!(synth_open_mask & (1 << dev)) && !orig_dev) - return -(EBUSY); - - return synth_devs[dev]->ioctl(dev, cmd, arg); - } - break; - - case SNDCTL_SEQ_OUTOFBAND: - { - struct seq_event_rec event; - u_long flags; - - bcopy(&(((char *) arg)[0]), (char *) &event, sizeof(event)); - - flags = splhigh(); - play_event(event.arr); - splx(flags); - - return 0; - } - break; - - case SNDCTL_MIDI_INFO: - { - struct midi_info inf; - int dev; - - bcopy(&(((char *) arg)[0]), (char *) &inf, sizeof(inf)); - dev = inf.device; - - if (dev < 0 || dev >= max_mididev) - return -(ENXIO); - - 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 *) 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; - - 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_PMGR_ACCESS: - { - struct patmgr_info *inf; - int dev, 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; - - 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; - - case SNDCTL_SEQ_THRESHOLD: - { - int tmp = (*(int *) arg); - - if (dev)/* Patch manager */ - return -(EIO); - - if (tmp < 1) - tmp = 1; - if (tmp >= SEQ_MAX_QUEUE) - tmp = SEQ_MAX_QUEUE - 1; - output_treshold = tmp; - return 0; - } - break; - - case SNDCTL_MIDI_PRETIME: - { - int val = (*(int *) arg); - - if (val < 0) - val = 0; - - val = (hz * val) / 10; - pre_event_timeout = val; - return *(int *) arg = val; - } - break; - - 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; - } - - return -(EINVAL); -} - -#ifdef ALLOW_POLL -int -sequencer_poll (int dev, struct fileinfo *file, int events, select_table * wait) -{ - unsigned long flags; - int revents = 0; - - dev = dev >> 4; - flags = splhigh(); - - - if (events & (POLLIN | POLLRDNORM)) { - if (!iqlen) - selrecord(wait, &selinfo[dev]); - else { - revents |= events & (POLLIN | POLLRDNORM); - midi_sleep_flag.mode &= ~WK_SLEEP; - } - } - if (events & (POLLOUT | POLLWRNORM)) { - if (qlen >= SEQ_MAX_QUEUE) - selrecord(wait, &selinfo[dev]); - else { - revents |= events & (POLLOUT | POLLWRNORM); - seq_sleep_flag.mode &= ~WK_SLEEP; - } - } - splx(flags); - - return (revents); -} - -#endif - - -void -sequencer_timer(void *dummy) -{ - seq_startplay(); -} - -int -note_to_freq(int note_num) -{ - - /* - * 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 - }; - -#define BASE_OCTAVE 5 - - octave = note_num / 12; - note = note_num % 12; - - note_freq = notes[note]; - - if (octave < BASE_OCTAVE) - note_freq >>= (BASE_OCTAVE - octave); - else if (octave > BASE_OCTAVE) - note_freq <<= (octave - BASE_OCTAVE); - - /* - * note_freq >>= 1; - */ - - return note_freq; -} - -u_long -compute_finetune(u_long base_freq, int bend, int range) -{ - u_long amount; - int negative, semitones, cents, multiplier = 1; - - if (!bend) - return base_freq; - if (!range) - return base_freq; - - if (!base_freq) - return base_freq; - - if (range >= 8192) - range = 8192; - - bend = bend * range / 8192; - if (!bend) - return base_freq; - - negative = bend < 0 ? 1 : 0; - - if (bend < 0) - bend *= -1; - if (bend > range) - bend = range; - - /* - * 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 */ -} - - -void -sequencer_init() -{ - - sequencer_ok = 1; - - queue = (u_char *) malloc(SEQ_MAX_QUEUE * EV_SZ, M_DEVBUF, M_NOWAIT); - if (!queue) - panic("SOUND: Cannot allocate memory\n"); - - iqueue = (u_char *) malloc(SEQ_MAX_QUEUE * IEV_SZ, M_DEVBUF, M_NOWAIT); - if (!iqueue) - panic("SOUND: Cannot allocate memory\n"); -} - -#endif -#endif diff --git a/sys/i386/isa/sound/sound.doc b/sys/i386/isa/sound/sound.doc deleted file mode 100644 index 13f3702..0000000 --- a/sys/i386/isa/sound/sound.doc +++ /dev/null @@ -1,120 +0,0 @@ -$FreeBSD$ - -Instructions on using audio on a FreeBSD 2.1 (or 2.0-current) system. -See also /sys/i386/conf/LINT. - -To enable sound driver support, the controller sound code must be included -in your config file: - -# SB = SoundBlaster; PAS = ProAudioSpectrum; GUS = Gravis UltraSound -# Controls all sound devices -controller snd0 - -Uncomment one or more of these device entries, depending on what type of -sound card you have: - -# ProAudioSpectrum PCM and Midi - for PAS -#device pas0 at isa? port 0x388 irq 10 drq 6 - -# SoundBlaster DSP driver - for SB, SB Pro, SB16, PAS(emulating SB) -#device sb0 at isa? port 0x220 irq 7 drq 1 - -# SoundBlaster 16 DSP driver - for SB16 - requires sb0 device -#device sbxvi0 at isa? drq 5 - -# SoundBlaster 16 MIDI - for SB16 - requires sb0 device -#device sbmidi0 at isa? port 0x300 - -# Gravis UltraSound - for GUS, GUS16, GUSMAX -# For cards that use 2 DMA Channels: -# drq = Write DMA Channel, flags = Read DMA Channel -#device gus0 at isa? port 0x220 irq 11 drq 1 flags 0x3 - -# Gravis UltraSound 16 bit option - for GUS16 - requires gus0 -#device gusxvi0 at isa? port 0x530 irq 7 drq 3 - -# MS Sound System (AD1848 Based Boards) -#device mss0 at isa? port 0x530 irq 10 drq 1 - -# Yamaha OPL-2/OPL-3 FM - for SB, SB Pro, SB16, PAS -#device opl0 at isa? port 0x388 - -# MPU-401 - for MPU-401 standalone card -#device mpu0 at isa? port 0x330 irq 6 drq 0 - -# 6850 UART Midi -#device uart0 at isa? port 0x330 irq 5 - -You may add one or more of the following depending on what you do and don't -want compiled into your kernel. Note: Excluding things with EXCLUDE_... -is NOT recommended unless you really know what you're doing. - -#options EXCLUDE_AUDIO # NO digital audio support -#options EXCLUDE_SEQUENCER # NO sequencer support -#options EXCLUDE_MIDI # NO MIDI support whatsoever -#options EXCLUDE_SBPRO # EXCLUDE SB Pro support -#options EXCLUDE_SB_EMULATION # NO PAS SB emulation support -#options EXCLUDE_GUS_IODETECT # NO GUS io detection -#options EXCLUDE_PRO_MIDI # NO PAS MIDI support - -Other Options: - -#options SYMPHONY_PAS - Adds some code to make pas work with Symphony chipsets. Only use - this if your pas doesn't work and you have a Symphony chipset. - -#options BROKEN_BUS_CLOCK - Some systems with the OPTI chipset and a PAS will require you to - use this option. Symptoms are that you will hear a lot of clicking and - popping sounds, like a geiger counter, coming out of the PAS even when - it is not playing anything. - -#options MOZART_PORT - Adds support for Mozart (OAK OTI-601). (Part of the MSS driver) - -#options OPTI_MAD16_PORT - Adds support for the OPTI MAD16 Chip. (Part of the MSS driver) - If your soundcard has a chip labeled "OPTi 82C929" then try this. - -#options __SGNXPRO__ - Adds support for the SG NX Pro mixer. (Part of the SB driver) - -#options JAZZ16 - Adds support for the MV Jazz16 (ProSonic etc). (Part of the SB Driver) - -#options SM_WAVE - Adds support for the SoundMan Wave (Part of the SB Driver) - Note: You will need to do some work to get this to work. - See i386/isa/sound/configure.c - -#options SM_GAMES - Adds support for the Logitech SoundMan Games (Part of the SB Driver) - -#options PAS_JOYSTICK_ENABLE - Enables the gameport on the ProAudio Spectrum - -NOTE: The MPU-401 driver may or may not work, and is unfortunately -unverifiable since no one I know has one. If you can test this, -please let me know! Also note that you will have to change these -settings if your soundcard is set for a non-standard address or IRQ. -Please check your documentation (or verify with any provided DOS utilities -that may have come with your card) and set the IRQ or address fields -accordingly. - - -Also: You can configure more then one card on a single DMA using -the conflicts keyword in your configuration file. This is useful for boards -with more then one type of emulation. - - -Probing problems: Since the SB16 uses the same IRQ and addresses for -the different drivers, some of the snd drivers will not be probed because -the kernel thinks there is a conflict. This can be worked-around by -using the "conflicts" keyword on the sb16's device line. - - -For further information, contact multimedia@freebsd.org - - - Jordan Hubbard (jkh@freefall.cdrom.com) - - Steven Wallace (swallace@freefall.cdrom.com) - - Sujal Patel (smpatel@wam.umd.edu) diff --git a/sys/i386/isa/sound/sound_calls.h b/sys/i386/isa/sound/sound_calls.h deleted file mode 100644 index 7f96317..0000000 --- a/sys/i386/isa/sound/sound_calls.h +++ /dev/null @@ -1,293 +0,0 @@ -/* - * DMA buffer calls - */ - -int DMAbuf_open(int dev, int mode); -int DMAbuf_release(int dev, int mode); -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, 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_POLL -int DMAbuf_select(int dev, struct fileinfo *file, int sel_type, select_table * wait); -#endif - -/* - * System calls for /dev/dsp and /dev/audio - */ - -int audio_read (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); -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, - u_int cmd, ioctl_arg arg); -int audio_lseek (int dev, struct fileinfo *file, off_t offset, int orig); -/* long audio_init (void); */ - -#ifdef ALLOW_SELECT -int audio_poll(int dev, struct fileinfo *file, int events, select_table * wait); -#endif - -/* - * System calls for the /dev/sequencer - */ - -int sequencer_read (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); -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, - u_int cmd, ioctl_arg arg); -int sequencer_lseek (int dev, struct fileinfo *file, off_t offset, int orig); -void sequencer_init (void); -void sequencer_timer(void *dummy); -int note_to_freq(int note_num); -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); - - -/* - * System calls for the /dev/midi - */ - -int MIDIbuf_read (int dev, struct fileinfo *file, snd_rw_buf *buf, int count); -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, - 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, u_char *buf, int count); - -/* - * - * Misc calls from various sources - */ - -/* From soundcard.c */ -void soundcard_init(void); -void tenmicrosec(int); -void request_sound_timer (int count); -void sound_stop_timer(void); -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, u_int cmd, ioctl_arg arg); - -/* From sb_dsp.c */ -int sb_dsp_detect (struct address_info *hw_config); -void sb_dsp_init (struct address_info *hw_config); -void sb_dsp_disable_midi(void); -int sb_dsp_command (u_char val); -ointhand2_t sbintr; -int sb_reset_dsp (void); - -/* From sb16_dsp.c */ -void sb16_dsp_interrupt (int irq); -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); -void attach_sb16midi(struct address_info * hw_config); -int probe_sb16midi(struct address_info *hw_config); -void sb_midi_interrupt(int dummy); - -/* From sb_midi.c */ -void sb_midi_init(int model); - -/* From sb_mixer.c */ -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, sound_os_info *osp); -void opl3_init(int ioaddr, sound_os_info *osp); - -/* From sb_card.c */ -void attach_sb_card(struct address_info *hw_config); -int probe_sb(struct address_info *hw_config); - -/* From awe_wave.c */ -void attach_awe(struct address_info *hw_config); -int probe_awe(struct address_info *hw_config); - -/* From adlib_card.c */ -void attach_adlib_card(struct address_info *hw_config); -int probe_adlib(struct address_info *hw_config); - -/* From pas_card.c */ -void attach_pas_card(struct address_info *hw_config); -int probe_pas(struct address_info *hw_config); -ointhand2_t pasintr; -int pas_set_intr(int mask); -int pas_remove_intr(int mask); -u_char pas_read(int ioaddr); -void pas_write(u_char data, int ioaddr); - -/* From pas_audio.c */ -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 */ -void pas_midi_init(void); -void pas_midi_interrupt(void); - -/* From gus_card.c */ -void attach_gus_card(struct address_info * hw_config); -int probe_gus(struct address_info *hw_config); -int gus_set_midi_irq(int num); -ointhand2_t gusintr; -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); -void gus_wave_init(struct address_info *hw_config); -void gus_voice_irq(void); -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, u_int cmd, ioctl_arg arg); -void gus_timer_command (u_int addr, u_int val); - -/* From gus_midi.c */ -void gus_midi_init(void); -void gus_midi_interrupt(int dummy); - -/* From mpu401.c */ -void attach_mpu401(struct address_info * hw_config); -int probe_mpu401(struct address_info *hw_config); -ointhand2_t mpuintr; - -/* From uart6850.c */ -void attach_uart6850(struct address_info * hw_config); -ointhand2_t m6850intr; -int probe_uart6850(struct address_info *hw_config); - -/* From opl3.c */ -void enable_opl3_mode(int left, int right, int both); - -/* From patmgr.c */ -int pmgr_open(int dev); -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, u_long parm1, u_long parm2, - u_long parm3, u_long parm4); - -/* From ics2101.c */ -void ics2101_mixer_init(void); - -/* From sound_timer.c */ -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 share_dma, sound_os_info *osp); -ointhand2_t adintr; - -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); -void attach_pss (struct address_info *hw_config); -int probe_pss_mpu (struct address_info *hw_config); -void attach_pss_mpu (struct address_info *hw_config); -int probe_pss_mss (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); -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); -ointhand2_t sscapeintr; - -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, - u_int cmd, ioctl_arg arg); -int pss_lseek (int dev, struct fileinfo *file, off_t offset, int orig); -void pss_init(void); - -/* From aedsp16.c */ -int InitAEDSP16_SBPRO(struct address_info *hw_config); -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, u_char *msg, int mlen); - -/* From trix.c */ -void attach_trix_wss (struct address_info *hw_config); -int probe_trix_wss (struct address_info *hw_config); -void attach_trix_sb (struct address_info *hw_config); -int probe_trix_sb (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); - -/* From pcm86.c */ -void attach_nss(struct address_info * hw_config); -int probe_nss(struct address_info *hw_config); -ointhand2_t nssintr; diff --git a/sys/i386/isa/sound/sound_config.h b/sys/i386/isa/sound/sound_config.h deleted file mode 100644 index 91f4391..0000000 --- a/sys/i386/isa/sound/sound_config.h +++ /dev/null @@ -1,211 +0,0 @@ -/* sound_config.h - * - * A driver for Soundcards, misc configuration parameters. - * - * 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. - * - * $FreeBSD$ - * - */ - -/* - * many variables should be reduced to a range. Here define a macro - */ - -#define RANGE(var, low, high) (var) = \ - ((var)<(low)?(low) : (var)>(high)?(high) : (var)) - -#undef CONFIGURE_SOUNDCARD -#undef DYNAMIC_BUFFER - -#include - -#define CONFIGURE_SOUNDCARD -#define DYNAMIC_BUFFER -#undef LOADABLE_SOUNDCARD - -#include -#include - -#if defined(ISC) || defined(SCO) || defined(SVR42) -#define GENERIC_SYSV -#endif - -#ifndef SND_DEFAULT_ENABLE -#define SND_DEFAULT_ENABLE 1 -#endif - -#ifdef CONFIGURE_SOUNDCARD - -#ifndef MAX_REALTIME_FACTOR -#define MAX_REALTIME_FACTOR 4 -#endif - -/************* PCM DMA buffer sizes *******************/ - -/* If you are using high playback or recording speeds, the default buffersize - is too small. DSP_BUFFSIZE must be 64k or less. - - A rule of thumb is 64k for PAS16, 32k for PAS+, 16k for SB Pro and - 4k for SB. - - If you change the DSP_BUFFSIZE, don't modify this file. - Use the make config command instead. Seems to allow only 4K, 16K, - 32K, 64K. - */ - -#ifndef DSP_BUFFSIZE -#define DSP_BUFFSIZE (32760) -#endif - -#ifndef DSP_BUFFCOUNT -#define DSP_BUFFCOUNT 1 /* 1 is recommended. */ -#endif - -#define DMA_AUTOINIT 0x10 /* XXX never used */ - -#ifdef PC98 -#define FM_MONO 0x28d2 -#else -#define FM_MONO 0x388 /* This is the I/O address used by AdLib */ -#endif - -#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 - driver. (There is no need to alter this) */ -#define SEQ_MAX_QUEUE 1024 - -#define SBFM_MAXINSTR (256) /* Size of the FM Instrument bank */ -/* 128 instruments for general MIDI setup and 16 unassigned */ - -/* - * Minor numbers for the sound driver. - * - * Unfortunately Creative called the codec chip of SB as a DSP. For this - * reason the /dev/dsp is reserved for digitized audio use. There is a - * device for true DSP processors but it will be called something else. - * In v3.0 it's /dev/sndproc but this could be a temporary solution. - */ - -#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) */ -#define SND_DEV_MIDIN 2 /* Raw midi access */ -#define SND_DEV_DSP 3 /* Digitized voice /dev/dsp */ -#define SND_DEV_AUDIO 4 /* Sparc compatible /dev/audio */ -#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/sequencer, level 2 interface */ -#define SND_DEV_SNDPROC 9 /* /dev/sndproc for programmable devices */ -#define SND_DEV_PSS SND_DEV_SNDPROC - -#define DSP_DEFAULT_SPEED 8000 - -#define ON 1 -#define OFF 0 - -#define MAX_AUDIO_DEV 5 -#define MAX_MIXER_DEV 5 -#define MAX_SYNTH_DEV 3 -#define MAX_MIDI_DEV 6 -#define MAX_TIMER_DEV 3 - -struct fileinfo { - int mode; /* Open mode */ - int flags; - int dummy; /* Reference to file-flags. OS-dependent. */ -}; - -struct address_info { - int io_base; - int irq; - 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]; -}; - -struct channel_info { - int pgm_num; - int bender_value; - unsigned char controllers[128]; -}; - -/* - * Process wakeup reasons - */ -#define WK_NONE 0x00 -#define WK_WAKEUP 0x01 -#define WK_TIMEOUT 0x02 -#define WK_SIGNAL 0x04 -#define WK_SLEEP 0x08 - -#define OPEN_READ PCM_ENABLE_INPUT -#define OPEN_WRITE PCM_ENABLE_OUTPUT -#define OPEN_READWRITE (OPEN_READ|OPEN_WRITE) - -#include -#include - -#ifndef DEB -#define DEB(x) -#endif -#ifndef DDB -/* #define DDB(x) x XXX */ -#define DDB(x) -#endif - -#define TIMER_ARMED 121234 -#define TIMER_NOT_ARMED 1 - -#endif diff --git a/sys/i386/isa/sound/sound_pnp.c b/sys/i386/isa/sound/sound_pnp.c deleted file mode 100644 index d3d278b..0000000 --- a/sys/i386/isa/sound/sound_pnp.c +++ /dev/null @@ -1,186 +0,0 @@ -/* - * 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 - -/* - * XXX check what to use in place of CONFIG_PNP - */ -#if (NSND > 0) && defined(CONFIG_PNP) - -#include - -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 deleted file mode 100644 index 763a10c..0000000 --- a/sys/i386/isa/sound/sound_switch.c +++ /dev/null @@ -1,499 +0,0 @@ -/* - * 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 - * 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 - -#if NSND > 0 - -#define SNDSTAT_BUF_SIZE 4000 - -/* - * /dev/sndstatus -device - */ -static char *status_buf = NULL; -static int status_len, status_ptr; -static int status_busy = 0; - -static int -put_status(char *s) -{ - int l = strlen(s); - - if (status_len + l >= SNDSTAT_BUF_SIZE) - return 0; - - bcopy(s, &status_buf[status_len], l); - status_len += l; - - return 1; -} - -/* - * in principle, we never overflow the buffer. But... if radix=2 ... - * and if smaller... lr970711 - */ - -static int -put_status_int(u_int val, int radix) -{ - int l, v; - static char hx[] = "0123456789abcdef"; - char buf[33]; /* int is 32 bit+null, in base 2 */ - - if (radix < 2 || radix > 16) /* better than panic */ - return put_status("???"); - - if (!val) - return put_status("0"); - - l = 0; - buf[10] = 0; - - while (val) { - v = val % radix; - val = val / radix; - - buf[9 - l] = hx[v]; - l++; - } - - if (status_len + l >= SNDSTAT_BUF_SIZE) - return 0; - - bcopy(&buf[10 - l], &status_buf[status_len], l); - status_len += l; - - return 1; -} - -static void -init_status(void) -{ - /* - * 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. - */ - - int i; - - status_ptr = 0; - -#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 - - 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; - } -#ifndef CONFIG_AUDIO - put_status("\nAudio devices: NOT ENABLED IN CONFIG\n") ; -#else - put_status("\nAudio devices:\n") ; - - 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 - -#ifndef CONFIG_SEQUENCER - put_status("\nSynth devices: NOT ENABLED IN CONFIG\n"); -#else - put_status("\nSynth devices:\n") ; - - 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 - -#ifndef CONFIG_MIDI - put_status("\nMidi devices: NOT ENABLED IN CONFIG\n") ; -#else - put_status("\nMidi devices:\n") ; - - 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 - - put_status("\nTimers:\n"); - - 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"); - } - - put_status("\nMixers:\n"); - - 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) -{ - /* - * Return at most 'count' bytes from the status_buf. - */ - int l, c; - - l = count; - c = status_len - status_ptr; - - if (l > c) - l = c; - if (l <= 0) - return 0; - - - 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) -{ - DEB(printf("sound_read_sw(dev=%d, count=%d)\n", dev, count)); - - switch (dev & 0x0f) { - case SND_DEV_STATUS: - 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; -#endif - -#ifdef CONFIG_SEQUENCER - case SND_DEV_SEQ: - case SND_DEV_SEQ2: - return sequencer_read(dev, file, buf, count); - break; -#endif - -#ifdef CONFIG_MIDI - case SND_DEV_MIDIN: - return MIDIbuf_read(dev, file, buf, count); -#endif - - default: - printf("Sound: Undefined minor device %d\n", dev); - } - - return -(EPERM); -} - -int -sound_write_sw(int dev, struct fileinfo * file, snd_rw_buf * buf, int count) -{ - - DEB(printf("sound_write_sw(dev=%d, count=%d)\n", dev, count)); - - switch (dev & 0x0f) { - -#ifdef CONFIG_SEQUENCER - case SND_DEV_SEQ: - case SND_DEV_SEQ2: - 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; -#endif - -#ifdef CONFIG_MIDI - case SND_DEV_MIDIN: - return MIDIbuf_write(dev, file, buf, count); -#endif - - default: - return -(EPERM); - } - - return count; -} - -int -sound_open_sw(int dev, struct fileinfo * file) -{ - int retval; - - DEB(printf("sound_open_sw(dev=%d)\n", dev)); - - if ((dev >= SND_NDEVS) || (dev < 0)) { - printf("Invalid minor device %d\n", dev); - return -(ENXIO); - } - switch (dev & 0x0f) { - case SND_DEV_STATUS: - 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; - -#ifdef CONFIG_SEQUENCER - case SND_DEV_SEQ: - case SND_DEV_SEQ2: - if ((retval = sequencer_open(dev, file)) < 0) - return retval; - break; -#endif - -#ifdef CONFIG_MIDI - case SND_DEV_MIDIN: - 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; -#endif - - default: - printf("Invalid minor device %d\n", dev); - return -(ENXIO); - } - - return 0; -} - -void -sound_release_sw(int dev, struct fileinfo * file) -{ - - DEB(printf("sound_release_sw(dev=%d)\n", dev)); - - switch (dev & 0x0f) { - case SND_DEV_STATUS: - if (status_buf) - free(status_buf, M_TEMP); - status_buf = NULL; - status_busy = 0; - break; - - case SND_DEV_CTL: - break; - -#ifdef CONFIG_SEQUENCER - case SND_DEV_SEQ: - case SND_DEV_SEQ2: - sequencer_release(dev, file); - break; -#endif - -#ifdef CONFIG_MIDI - case SND_DEV_MIDIN: - 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; -#endif - - default: - printf("Sound error: Releasing unknown device 0x%02x\n", dev); - } -} - -int -sound_ioctl_sw(int dev, struct fileinfo * file, u_int cmd, ioctl_arg 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 - - default: - return mixer_devs[0]->ioctl(0, cmd, arg); - } - } - switch (dev & 0x0f) { - - case SND_DEV_CTL: - - if (!num_mixers) - return -(ENXIO); - - dev = dev >> 4; - - if (dev >= num_mixers) - return -(ENXIO); - - 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; -#endif - -#ifdef CONFIG_AUDIO - case SND_DEV_DSP: - case SND_DEV_DSP16: - case SND_DEV_AUDIO: - return audio_ioctl(dev, file, cmd, arg); - break; -#endif - -#ifdef CONFIG_MIDI - case SND_DEV_MIDIN: - return MIDIbuf_ioctl(dev, file, cmd, arg); - break; -#endif - - default: - return -(EPERM); - break; - } - - return -(EPERM); -} - -#endif diff --git a/sys/i386/isa/sound/sound_timer.c b/sys/i386/isa/sound/sound_timer.c deleted file mode 100644 index cef7596..0000000 --- a/sys/i386/isa/sound/sound_timer.c +++ /dev/null @@ -1,344 +0,0 @@ -/* - * sound/sound_timer.c - * - * 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. - * - */ - -#define SEQUENCER_C -#include - -#if NSND > 0 - -#if defined(CONFIG_SEQUENCER) - -static volatile int initialized = 0, opened = 0, tmr_running = 0; -static volatile time_t tmr_offs, tmr_ctr; -static volatile u_long ticks_offs; -static volatile int curr_tempo, curr_timebase; -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 u_long -tmr2ticks(int tmr_value) -{ - /* - * Convert timer ticks to MIDI ticks - */ - - u_long tmp; - u_long scale; - - tmp = tmr_value * usecs_per_tmr; /* Convert to usecs */ - - scale = (60 * 1000000) / (curr_tempo * curr_timebase); /* usecs per MIDI tick */ - - return (tmp + (scale / 2)) / scale; -} - -static void -reprogram_timer(void) -{ - u_long usecs_per_tick; - - 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; - - usecs_per_tmr = tmr->tmr_start(tmr->dev, usecs_per_tick); -} - -void -sound_timer_syncinterval(u_int new_usecs) -{ - /* - * 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) -{ - 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) -{ - if (opened) - return -(EBUSY); - - tmr_reset(); - curr_tempo = 60; - curr_timebase = hz; - opened = 1; - reprogram_timer(); - - return 0; -} - -static void -timer_close(int dev) -{ - opened = tmr_running = 0; - tmr->tmr_disable(tmr->dev); -} - -static int -timer_event(int dev, u_char *event) -{ - u_char cmd = event[1]; - u_long parm = *(int *) &event[4]; - - switch (cmd) { - case TMR_WAIT_REL: - parm += prev_event_time; - case TMR_WAIT_ABS: - if (parm > 0) { - long time; - - if (parm <= curr_ticks) /* It's the time */ - return TIMER_NOT_ARMED; - - time = parm; - next_event_time = prev_event_time = time; - - return TIMER_ARMED; - } - break; - - case TMR_START: - tmr_reset(); - tmr_running = 1; - reprogram_timer(); - break; - - case TMR_STOP: - tmr_running = 0; - break; - - case TMR_CONTINUE: - 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(); - } - break; - - case TMR_ECHO: - seq_copy_to_input(event, 8); - break; - - default:; - } - - return TIMER_NOT_ARMED; -} - -static u_long -timer_get_time(int dev) -{ - if (!opened) - return 0; - - return curr_ticks; -} - -static int -timer_ioctl(int dev, u_int cmd, ioctl_arg arg) -{ - switch (cmd) { - case SNDCTL_TMR_SOURCE: - return *(int *) arg = TMR_INTERNAL; - break; - - case SNDCTL_TMR_START: - tmr_reset(); - tmr_running = 1; - return 0; - break; - - case SNDCTL_TMR_STOP: - tmr_running = 0; - return 0; - break; - - case SNDCTL_TMR_CONTINUE: - tmr_running = 1; - return 0; - break; - - case SNDCTL_TMR_TIMEBASE: - { - 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 = (*(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 ((*(int *) arg) != 0) /* Can't change */ - return -(EINVAL); - - return *(int *) arg = ((curr_tempo * curr_timebase) + 30) / 60; - break; - - case SNDCTL_TMR_METRONOME: - /* NOP */ - break; - - default:; - } - - return -(EINVAL); -} - -static void -timer_arm(int dev, long time) -{ - if (time < 0) - time = curr_ticks + 1; - else if (time <= curr_ticks) /* It's the time */ - return; - - next_event_time = prev_event_time = time; - - return; -} - -static struct sound_timer_operations sound_timer = -{ - {"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) -{ - if (!opened) - return; - - tmr->tmr_restart(tmr->dev); - - if (!tmr_running) - return; - - tmr_ctr++; - curr_ticks = ticks_offs + tmr2ticks(tmr_ctr); - - if (curr_ticks >= next_event_time) { - next_event_time = 0xffffffff; - sequencer_timer(0); - } -} - -void -sound_timer_init(struct sound_lowlev_timer * t, char *name) -{ - int n; - - if (initialized || t == NULL) - return; /* There is already a similar timer */ - - initialized = 1; - tmr = t; - - if (num_sound_timers >= MAX_TIMER_DEV) - n = 0; /* Overwrite the system timer */ - else - n = num_sound_timers++; - - snprintf(sound_timer.info.name, sizeof(sound_timer.info.name), "%s", name); - - sound_timer_devs[n] = &sound_timer; -} - -#endif -#endif diff --git a/sys/i386/isa/sound/soundcard.c b/sys/i386/isa/sound/soundcard.c deleted file mode 100644 index 4c3de31..0000000 --- a/sys/i386/isa/sound/soundcard.c +++ /dev/null @@ -1,679 +0,0 @@ -/* - * sound/386bsd/soundcard.c - * - * 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 - * 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. - * - * $FreeBSD$ - * - */ -#include -#if NSND > 0 /* from "snd.h" */ -#include "uart.h" - -#include -#include -#include -#include - -#include - - -/* -** 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 */ - - -#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]; - -int -MIDIbuf_poll (int dev, struct fileinfo *file, int events, select_table * wait); - -int -audio_poll(int dev, struct fileinfo * file, int events, select_table * wait); - -int -sequencer_poll (int dev, struct fileinfo *file, int events, select_table * wait); - -static int sndprobe __P((struct isa_device *)); -static int sndattach __P((struct isa_device *)); - -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_mmap_t sndmmap; - -static char driver_name[] = "snd"; - -#define CDEV_MAJOR 30 -static struct cdevsw snd_cdevsw = { - /* open */ sndopen, - /* close */ sndclose, - /* read */ sndread, - /* write */ sndwrite, - /* ioctl */ sndioctl, - /* poll */ sndpoll, - /* mmap */ sndmmap, - /* strategy */ nostrategy, - /* name */ driver_name, - /* maj */ CDEV_MAJOR, - /* dump */ nodump, - /* psize */ nopsize, - /* flags */ 0, - /* bmaj */ -1 -}; - - - - -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"}; -struct isa_driver cssdriver = {sndprobe, sndattach, "css"}; -struct isa_driver sscapedriver = {sndprobe, sndattach, "sscape"}; -struct isa_driver sscape_mssdriver = {sndprobe, sndattach, "sscape_mss"}; -struct isa_driver nssdriver = {sndprobe, sndattach, "nss"}; - -short ipri_to_irq(u_short ipri); - -static ointhand2_t sndintr; - -u_long -get_time(void) -{ - struct timeval timecopy; - - getmicrotime(&timecopy); - return timecopy.tv_usec / (1000000 / hz) + - (u_long) timecopy.tv_sec * hz; -} - -static int -sndmmap( dev_t dev, vm_offset_t offset, int nprot ) -{ - struct dma_buffparms * dmap; - u_int min = minor(dev) >> 4; - - if (min > 0 ) return (-1); - - dmap = audio_devs[min]->dmap_out; - - if (nprot & PROT_EXEC) - return( -1 ); - dmap->mapping_flags |= DMA_MAP_MAPPED ; - return( i386_btop(vtophys(dmap->raw_buf) + offset) ); -} - - -static int -sndread(dev_t dev, struct uio * buf, int flag) -{ - int count = buf->uio_resid; - u_int min = minor(dev); - - FIX_RETURN(sound_read_sw(min, &files[min], buf, count)); -} - - -static int -sndwrite(dev_t dev, struct uio * buf, int flag) -{ - int count = buf->uio_resid; - u_int min = minor(dev); - - FIX_RETURN(sound_write_sw(min, &files[min], buf, count)); -} - -static int -sndopen(dev_t dev, int flags, int mode, struct proc * p) -{ - int retval; - struct fileinfo tmp_file; - u_int min = minor(dev); - - if (!soundcard_configured && min) { - printf("SoundCard Error: soundcard system has not been configured\n"); - return ENODEV ; - } - tmp_file.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; - - selinfo[min >> 4].si_pid = 0; - selinfo[min >> 4].si_flags = 0; - if ((retval = sound_open_sw(min, &tmp_file)) < 0) - FIX_RETURN(retval); - - bcopy((char *) &tmp_file, (char *) &files[min], sizeof(tmp_file)); - - FIX_RETURN(retval); -} - - -static int -sndclose(dev_t dev, int flags, int mode, struct proc * p) -{ - u_int min = minor(dev); - - sound_release_sw(min, &files[min]); - return 0 ; -} - -static int -sndioctl(dev_t dev, u_long cmd, caddr_t arg, int mode, struct proc * p) -{ - u_int min = minor(dev); - FIX_RETURN(sound_ioctl_sw(min, &files[min], cmd, arg)); -} - -int -sndpoll(dev_t dev, int events, struct proc * p) -{ - u_int min = minor(dev); - - /* printf ("snd_select(dev=%d, rw=%d, pid=%d)\n", min, rw, p->p_pid); */ -#ifdef ALLOW_POLL - switch (min & 0x0f) { -#ifdef CONFIG_SEQUENCER - case SND_DEV_SEQ: - case SND_DEV_SEQ2: - return sequencer_poll(min, &files[min], events, p); - break; -#endif - -#ifdef CONFIG_MIDI - case SND_DEV_MIDIN: - return MIDIbuf_poll(min, &files[min], events, p); - break; -#endif - -#ifdef CONFIG_AUDIO - case SND_DEV_DSP: - case SND_DEV_DSP16: - case SND_DEV_AUDIO: - - return audio_poll(min, &files[min], events, p); - break; -#endif - - default: - return 0; - } - -#endif /* ALLOW_POLL */ - DEB(printf("sound_ioctl(min=%d, cmd=0x%x, arg=0x%x)\n", min, cmd, arg)); - - return 0 ; -} - -/* 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; - - for (irq = 0; irq < 16; irq++) - if (ipri == (1 << irq)) - return irq; - - return -1; /* Invalid argument */ -} - -static int -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); - else if (driver == &cssdriver) - return (SNDCARD_CS4232); - else if (driver == &sscapedriver) - return(SNDCARD_SSCAPE); - else if (driver == &sscape_mssdriver) - return(SNDCARD_SSCAPE_MSS); - else if (driver == &trixdriver) - return (SNDCARD_TRXPRO); - else if (driver == &trixsbdriver) - return (SNDCARD_TRXPRO_SB); - else if (driver == &nssdriver) - return (SNDCARD_NSS); - else - return (0); -} - -/* - * 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. - */ - -static int -sndprobe(struct isa_device * dev) -{ - 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 unit; - static int midi_initialized = 0; - static int seq_initialized = 0; - struct address_info hw_config; - char *dname; - - /* - * Associate interrupt handlers with devices. XXX this may be incomplete. - */ - dname = dev->id_driver->name; -#if defined(CONFIG_AD1848) - if (strcmp(dname, "css") == 0 || strcmp(dname, "gusxvi") == 0 || - strcmp(dname, "mss") == 0) - dev->id_ointr = adintr; -#endif -#ifdef CONFIG_GUS - if (strcmp(dname, "gus") == 0) - dev->id_ointr = gusintr; -#endif -#ifdef CONFIG_PAS - if (strcmp(dname, "pas") == 0) - dev->id_ointr = pasintr; -#endif -#if NSB > 0 && (defined(CONFIG_MIDI) || defined(CONFIG_AUDIO)) - if (strcmp(dname, "sb") == 0) - dev->id_ointr = sbintr; -#endif - if (strcmp(dname, "sscape_mss") == 0) - dev->id_ointr = sndintr; -#if NSSCAPE > 0 - if (strcmp(dname, "sscape") == 0 || strcmp(dname, "trix") == 0) - dev->id_ointr = sscapeintr; -#endif -#if NUART > 0 - if (strcmp(dname, "uart0") == 0) - dev->id_ointr = m6850intr; -#endif -#if NMPU > 0 && defined(CONFIG_MIDI) - if (strcmp(dname, "mpu") == 0) - dev->id_ointr = mpuintr; -#endif -#if NNSS > 0 - if (strcmp(dname, "nss") == 0) - dev->id_ointr = nssintr; -#endif - - 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(" "); - return FALSE; - } - /* - * Init the high level sound driver - */ - - if (!(soundcards_installed = sndtable_get_cardcount())) { - DDB(printf("No drivers actually installed\n")); - return FALSE; /* No cards detected */ - } - printf("\n"); - -#ifdef CONFIG_AUDIO - if (num_audiodevs) { /* Audio devices present */ - DMAbuf_init(); - sound_mem_init(); - } - soundcard_configured = 1; -#endif - - if (num_midis && !midi_initialized) - midi_initialized = 1; - - if ((num_midis + num_synths) && !seq_initialized) { - seq_initialized = 1; - sequencer_init(); - } - - cdevsw_add(&snd_cdevsw); -#define GID_SND GID_GAMES -#define UID_SND UID_ROOT -#define PERM_SND 0660 - /* - * make links to first successfully probed device, don't do it if - * duplicate creation of same node failed (ie. bad cookie returned) - */ - if (dev->id_driver == &opldriver){ - make_dev(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_SEQ, - UID_SND, GID_SND, PERM_SND, "sequencer%r", dev->id_unit); - } else if (dev->id_driver == &mpudriver || - dev->id_driver == &sbmididriver || - dev->id_driver == &uartdriver){ - make_dev(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_MIDIN, - UID_SND, GID_SND, PERM_SND, "midi%r", dev->id_unit); - } else { - make_dev(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_DSP, - UID_SND, GID_SND, PERM_SND, "dsp%r", dev->id_unit); - make_dev(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_DSP16, - UID_SND, GID_SND, PERM_SND, "dspW%r", dev->id_unit); - make_dev(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_AUDIO, - UID_SND, GID_SND, PERM_SND, "audio%r", dev->id_unit); - make_dev(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_CTL, - UID_SND, GID_SND, PERM_SND, "mixer%r", dev->id_unit); - make_dev(&snd_cdevsw, (dev->id_unit << 4) | SND_DEV_STATUS, - UID_SND, GID_SND, PERM_SND, "sndstat%r", dev->id_unit); - } - return TRUE; -} - - -#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 = (uintptr_t) 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 - - -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; - } - irq_proc[osp->unit] = hndlr; - irq_irq[osp->unit] = int_lvl; - return 1; -} - -static void -sndintr(int unit) -{ - if ( (unit >= MAX_UNIT) || (irq_proc[unit] == NULL) ) - return; - - irq_proc[unit] (irq_irq[unit]); /* Call the installed handler */ -} - -void -conf_printf(char *name, struct address_info * hw_config) -{ - if (!trace_init) - return; - - printf("snd0: <%s> ", name); -#if 0 - if (hw_config->io_base != -1 ) - printf("at 0x%03x", hw_config->io_base); - - if (hw_config->irq != -1 ) - printf(" irq %d", hw_config->irq); - - 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); - } -#endif - -} - -void -conf_printf2(char *name, int base, int irq, int dma, int dma2) -{ - if (!trace_init) - return; - - printf("snd0: <%s> ", name); -#if 0 - if (hw_config->io_base != -1 ) - printf("at 0x%03x", hw_config->io_base); - - if (irq) - printf(" irq %d", irq); - - if (dma != -1 || dma2 != -1) { - printf(" dma %d", dma); - if (dma2 != -1) - printf(",%d", dma2); - } -#endif - -} - - -void tenmicrosec (int j) -{ - int i, k; - for (k = 0; k < j/10 ; k++) { - for (i = 0; i < 16; i++) - inb (0x80); - } -} - -#endif /* NSND > 0 */ - - - - diff --git a/sys/i386/isa/sound/soundvers.h b/sys/i386/isa/sound/soundvers.h deleted file mode 100644 index 66ca10d..0000000 --- a/sys/i386/isa/sound/soundvers.h +++ /dev/null @@ -1,2 +0,0 @@ -#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 deleted file mode 100644 index 6b73a91..0000000 --- a/sys/i386/isa/sound/sscape.c +++ /dev/null @@ -1,921 +0,0 @@ -/* - * 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 - * 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. - * - * $FreeBSD$ - */ - -#include - -#if NSSCAPE > 0 - -#include - -#define EXCLUDE_NATIVE_PCM - -/* - * I/O ports - */ -#define MIDI_DATA 0 -#define MIDI_CTRL 1 -#define HOST_CTRL 2 -#define TX_READY 0x02 -#define RX_READY 0x01 -#define HOST_DATA 3 -#define ODIE_ADDR 4 -#define ODIE_DATA 5 - -/* - * Indirect registers - */ -#define GA_INTSTAT_REG 0 -#define GA_INTENA_REG 1 -#define GA_DMAA_REG 2 -#define GA_DMAB_REG 3 -#define GA_INTCFG_REG 4 -#define GA_DMACFG_REG 5 -#define GA_CDCFG_REG 6 -#define GA_SMCFGA_REG 7 -#define GA_SMCFGB_REG 8 -#define GA_HMCTL_REG 9 - -/* - * DMA channel identifiers (A and B) - */ -#define SSCAPE_DMA_A 0 -#define SSCAPE_DMA_B 1 - -#define PORT(name) (devc->base+name) - -/* - * Host commands recognized by the OBP microcode - */ -#define CMD_GEN_HOST_ACK 0x80 -#define CMD_GEN_MPU_ACK 0x81 -#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 -#define CMD_GET_EXTMIDI 0x9c - -#define CMD_ACK 0x80 - -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; -static struct sscape_info dev_info = -{0}; -static struct sscape_info *devc = &dev_info; - -static int *sscape_sleeper = NULL; -static volatile struct snd_wait sscape_sleep_flag = -{0}; - -/* Some older cards have assigned interrupt bits differently than new ones */ -static char valid_interrupts_old[] = -{9, 7, 5, 15}; - -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 u_char -sscape_read(struct sscape_info * devc, int reg) -{ - 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) -{ - u_long flags; - - flags = splhigh(); - outb(PORT(ODIE_ADDR), reg); - outb(PORT(ODIE_DATA), data); - splx(flags); -} - -static void -host_open(struct sscape_info * devc) -{ - outb(PORT(HOST_CTRL), 0x00); /* Put the board to the host mode */ -} - -static void -host_close(struct sscape_info * devc) -{ - outb(PORT(HOST_CTRL), 0x03); /* Put the board to the MIDI mode */ -} - -static int -host_write(struct sscape_info * devc, u_char *data, int count) -{ - u_long flags; - int i, timeout_val; - - flags = splhigh(); - - /* - * Send the command and data bytes - */ - - 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_val <= 0) { - splx(flags); - return 0; - } - outb(PORT(HOST_DATA), data[i]); - } - - - splx(flags); - - return 1; -} - -static int -host_read(struct sscape_info * devc) -{ - u_long flags; - int timeout_val; - u_char data; - - flags = splhigh(); - - /* - * Read a byte - */ - - for (timeout_val = 10000; timeout_val > 0; timeout_val--) - if (inb(PORT(HOST_CTRL)) & RX_READY) - break; - - if (timeout_val <= 0) { - splx(flags); - return -1; - } - data = inb(PORT(HOST_DATA)); - - splx(flags); - - return data; -} - -static int -host_command1(struct sscape_info * devc, int cmd) -{ - u_char buf[10]; - - buf[0] = (u_char) (cmd & 0xff); - - return host_write(devc, buf, 1); -} - -static int -host_command2(struct sscape_info * devc, int cmd, int parm1) -{ - u_char buf[10]; - - buf[0] = (u_char) (cmd & 0xff); - buf[1] = (u_char) (parm1 & 0xff); - - return host_write(devc, buf, 2); -} - -static int -host_command3(struct sscape_info * devc, int cmd, int parm1, int parm2) -{ - u_char buf[10]; - - buf[0] = (u_char) (cmd & 0xff); - buf[1] = (u_char) (parm1 & 0xff); - buf[2] = (u_char) (parm2 & 0xff); - - return host_write(devc, buf, 3); -} - -static void -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) { - 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) -{ - 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 irq) -{ - u_char bits, tmp; - - bits = sscape_read(devc, GA_INTSTAT_REG); - DEB(printf("sscapeintr(0x%02x)\n", bits)); - if ((sscape_sleep_flag.mode & WK_SLEEP)) { - sscape_sleep_flag.mode = WK_WAKEUP; - wakeup(sscape_sleeper); - } - if (bits & 0x02) { /* Host interface interrupt */ - printf("SSCAPE: Host interrupt, data=%02x\n", host_read(devc)); - } -#if (defined(CONFIG_MPU401) || defined(CONFIG_MPU_EMU)) && defined(CONFIG_MIDI) - if (bits & 0x01) { - static int debug = 0; - - 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 -do_dma(struct sscape_info * devc, int dma_chan, u_long buf, int blk_size, int mode) -{ - u_char temp; - - 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); - - 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); -} - -static int -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; - - for (i = 0; i < 10; i++) { - if (inb(devc->base + HOST_CTRL) & 0x80) - return 1; - - if (inb(devc->base) != 0x00) - return 1; - } - - 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) -{ - if (sub_device == COPR_MIDI) { - set_mt32(devc, 0); - if (!verify_mpu(devc)) - return -(EIO); - } - sscape_sleep_flag.aborting = 0; - sscape_sleep_flag.mode = WK_NONE; - return 0; -} - -static void -sscape_coproc_close(void *dev_info, int sub_device) -{ - struct sscape_info *devc = dev_info; - u_long flags; - - 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; - } - sscape_sleep_flag.aborting = 0; - sscape_sleep_flag.mode = WK_NONE; - splx(flags); - - return; -} - -static void -sscape_coproc_reset(void *dev_info) -{ -} - -static int -sscape_download_boot(struct sscape_info * devc, u_char *block, int size, int flag) -{ - 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; - } - splx(flags); - - sscape_write(devc, GA_HMCTL_REG, - (temp = sscape_read(devc, GA_HMCTL_REG)) & 0x3f); /* Reset */ - - 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); - } - /* - * Transfer one code block using DMA - */ - 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 chn; - sscape_sleeper = &chn; - DO_SLEEP(chn, sscape_sleep_flag, 1); - - done = 1; - } - - splx(flags); - if (!done) - return 0; - - 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; - } - 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; - - sscape_sleeper = &chn; - DO_SLEEP(chn, sscape_sleep_flag, 1); - - if (inb(PORT(HOST_DATA)) == 0xfe) /* Host startup acknowledge */ - done = 1; - } - 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)); - - 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; - - for (i = 0; i < 13; i++) - printf("I%d = %02x (new value)\n", i, sscape_read(devc, i)); - } -#endif - - } - return 1; -} - -static int -download_boot_block(void *dev_info, copr_buffer * buf) -{ - if (buf->len <= 0 || buf->len > sizeof(buf->data)) - return -(EINVAL); - - 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; -} - -static int -sscape_coproc_ioctl(void *dev_info, u_int cmd, ioctl_arg arg, int local) -{ - - switch (cmd) { - case SNDCTL_COPR_RESET: - sscape_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; - - default: - return -(EINVAL); - } - -} - -static coproc_operations sscape_coproc_operations = -{ - "SoundScape M68K", - sscape_coproc_open, - sscape_coproc_close, - sscape_coproc_ioctl, - sscape_coproc_reset, - &dev_info -}; - -#if !defined(EXCLUDE_NATIVE_PCM) && defined(CONFIG_AUDIO) -static struct audio_operations sscape_audio_operations = -{ - "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 -}; -#endif /* !defined(EXCLUDE_NATIVE_PCM) && defined(CONFIG_AUDIO) */ - -static int sscape_detected = 0; - -void -attach_sscape(struct address_info * hw_config) -{ -#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 - */ -#define SSCAPE_REGS { \ -/* I0 */ 0x00, \ - 0xf0, /* Note! Ignored. Set always to 0xf0 */ \ - 0x20, /* Note! Ignored. Set always to 0x20 */ \ - 0x20, /* Note! Ignored. Set always to 0x20 */ \ - 0xf5, /* Ignored */ \ - 0x10, \ - 0x00, \ - 0x2e, /* I7 MEM config A. Likely to vary between models */ \ - 0x00, /* I8 MEM config B. Likely to vary between models */ \ -/* I9 */ 0x40 /* Ignored */ \ - } -#endif - - u_long flags; - static u_char regs[10] = SSCAPE_REGS; - - int i, irq_bits = 0xff; - - if (sscape_detected != hw_config->io_base) - return; - - 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)) { - 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]); - } - - splx(flags); - -#ifdef SSCAPE_DEBUG2 - /* - * Temporary debugging aid. Print contents of the registers after - * changing them. - */ - { - int i; - - for (i = 0; i < 13; i++) - printf("I%d = %02x (new value)\n", i, sscape_read(devc, i)); - } -#endif - -#if defined(CONFIG_MIDI) && defined(CONFIG_MPU_EMU) - if (probe_mpu401(hw_config)) - hw_config->always_detect = 1; - { - int prev_devs; - - 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; - } -#endif - -#ifndef EXCLUDE_NATIVE_PCM - /* Not supported yet */ - -#ifdef CONFIG_AUDIO - if (num_audiodevs < MAX_AUDIO_DEV) { - int my_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; - devc->failed = 0; - return; -} - -int -probe_sscape(struct address_info * hw_config) -{ - u_char save; - - devc->failed = 1; - devc->base = hw_config->io_base; - devc->irq = hw_config->irq; - devc->dma = hw_config->dma; - devc->osp = hw_config->osp; - - 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(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... - */ - - if (sscape_read(devc, 0) & 0x0c) - return 0; - - if (sscape_read(devc, 1) & 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; - - for (i = 0; i < 13; i++) - printf("I%d = %02x (old value)\n", i, sscape_read(devc, i)); - } -#endif - - 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_mss(struct address_info * hw_config) -{ - int i, irq_bits = 0xff; - - if (devc->failed) - return 0; - - if (devc->ok == 0) { - printf("SoundScape: Invalid initialization order.\n"); - return 0; - } - 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); -} - -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 - * config registers of the "ODIE". - */ - - 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); - - /* - * Take the gate-arry off of the DMA channel. - */ - 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) - 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; -} - -#endif diff --git a/sys/i386/isa/sound/sys_timer.c b/sys/i386/isa/sound/sys_timer.c deleted file mode 100644 index a605dfc..0000000 --- a/sys/i386/isa/sound/sys_timer.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * sound/sys_timer.c - * - * 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 - * 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. - * - */ - -#define SEQUENCER_C -#include - -#if NSND > 0 - -#if defined(CONFIG_SEQUENCER) - -static volatile int opened = 0, tmr_running = 0; -static volatile time_t tmr_offs, tmr_ctr; -static volatile u_long ticks_offs; -static volatile int curr_tempo, curr_timebase; -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 u_long -tmr2ticks(int tmr_value) -{ - /* - * Convert system timer ticks (hz) to MIDI ticks (divide # of MIDI - * ticks/minute by # of system ticks/minute). - */ - - return ((tmr_value * curr_tempo * curr_timebase) + (30 * hz)) / (60 * hz); -} - -static void -poll_def_tmr(void *dummy) -{ - - if (opened) { - - 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(0); - } - } - } -} - -static void -tmr_reset(void) -{ - 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) -{ - if (opened) - return -(EBUSY); - - tmr_reset(); - curr_tempo = 60; - curr_timebase = hz; - opened = 1; - - timeout( poll_def_tmr, 0, 1);; - - return 0; -} - -static void -def_tmr_close(int dev) -{ - opened = tmr_running = 0; -} - -static int -def_tmr_event(int dev, u_char *event) -{ - u_char cmd = event[1]; - u_long parm = *(int *) &event[4]; - - switch (cmd) { - case TMR_WAIT_REL: - parm += prev_event_time; - case TMR_WAIT_ABS: - if (parm > 0) { - long time; - - if (parm <= curr_ticks) /* It's the time */ - return TIMER_NOT_ARMED; - - time = parm; - next_event_time = prev_event_time = time; - - return TIMER_ARMED; - } - break; - - case TMR_START: - tmr_reset(); - tmr_running = 1; - break; - - case TMR_STOP: - tmr_running = 0; - break; - - case TMR_CONTINUE: - tmr_running = 1; - break; - - case TMR_TEMPO: - if (parm) { - RANGE (parm, 8, 360) ; - tmr_offs = tmr_ctr; - ticks_offs += tmr2ticks(tmr_ctr); - tmr_ctr = 0; - curr_tempo = parm; - } - break; - - case TMR_ECHO: - seq_copy_to_input(event, 8); - break; - - default:; - } - - return TIMER_NOT_ARMED; -} - -static u_long -def_tmr_get_time(int dev) -{ - if (!opened) - return 0; - - return curr_ticks; -} - -static int -def_tmr_ioctl(int dev, u_int cmd, ioctl_arg arg) -{ - switch (cmd) { - case SNDCTL_TMR_SOURCE: - return *(int *) arg = TMR_INTERNAL; - break; - - case SNDCTL_TMR_START: - tmr_reset(); - tmr_running = 1; - return 0; - break; - - case SNDCTL_TMR_STOP: - tmr_running = 0; - return 0; - break; - - case SNDCTL_TMR_CONTINUE: - tmr_running = 1; - return 0; - break; - - case SNDCTL_TMR_TIMEBASE: - { - int val = (*(int *) arg); - - if (val) { - RANGE (val, 1, 1000) ; - curr_timebase = val; - } - return *(int *) arg = curr_timebase; - } - 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 ((*(int *) arg) != 0) /* Can't change */ - return -(EINVAL); - - return *(int *) arg = ((curr_tempo * curr_timebase) + 30) / 60; - break; - - case SNDCTL_TMR_METRONOME: - /* NOP */ - break; - - default:; - } - - return -(EINVAL); -} - -static void -def_tmr_arm(int dev, long time) -{ - if (time < 0) - time = curr_ticks + 1; - else if (time <= curr_ticks) /* It's the time */ - return; - - next_event_time = prev_event_time = time; - - return; -} - -struct sound_timer_operations default_sound_timer = -{ - {"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 /* NSND > 0 */ diff --git a/sys/i386/isa/sound/trix.c b/sys/i386/isa/sound/trix.c deleted file mode 100644 index 818ad5f..0000000 --- a/sys/i386/isa/sound/trix.c +++ /dev/null @@ -1,368 +0,0 @@ -/* - * sound/trix.c - * - * 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 - * 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 - -#if NTRIX > 0 - -#ifdef INCLUDE_TRIX_BOOT -#include -#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 sound_os_info *trix_osp = NULL; - -static u_char -trix_read(int addr) -{ - 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) -{ - 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) -{ -#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) -{ - u_char addr_bits; - - if (0) { - printf("AudioTriX: Config port I/O conflict\n"); - return 0; - } - if (kilroy_was_here) /* Already initialized */ - return 0; - - if (trix_read(0x15) != 0x71) { /* No asic signature */ - DDB(printf("No AudioTriX ASIC signature found\n")); - return 0; - } - - kilroy_was_here = 1; - - /* - * Reset some registers. - */ - - 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) { - case 0x530: - addr_bits = 0; - break; - case 0x604: - addr_bits = 1; - break; - case 0xE80: - addr_bits = 2; - break; - case 0xF40: - addr_bits = 3; - break; - default: - return 0; - } - - trix_write(0x19, (trix_read(0x19) & 0x03) | addr_bits); - return 1; -} - -/* - * Probe and attach routines for the Windows Sound System mode of AudioTriX - * Pro - */ - -int -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 (0) { - printf("AudioTriX: MSS I/O port conflict\n"); - return 0; - } - trix_osp = hw_config->osp; - - if (!trix_set_wss_port(hw_config)) - 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) { - 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) { - 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, NULL, hw_config->osp); -} - -void -attach_trix_wss(struct address_info * hw_config) -{ - static u_char interrupt_bits[12] = - {-1, -1, -1, -1, -1, -1, -1, 0x08, -1, 0x10, 0x18, 0x20}; - char bits; - - 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 dma1 = hw_config->dma, dma2 = hw_config->dma2; - - 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?]"); - - if (hw_config->dma2 == -1) { /* Single DMA mode */ - bits |= dma_bits[dma1]; - dma2 = dma1; - } else { - u_char tmp; - - tmp = trix_read(0x13) & ~30; - trix_write(0x13, tmp | 0x80 | (dma1 << 4)); - - 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, - dma1, - dma2, - 0, - hw_config->osp); - return ; -} - -int -probe_trix_sb(struct address_info * hw_config) -{ - 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 */ -#endif - if (!kilroy_was_here) - return 0; /* AudioTriX Pro has not been detected earlier */ - - if (sb_initialized) - 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->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); - - download_boot(hw_config->io_base); - sb_initialized = 1; - - return 1; -} - -void -attach_trix_sb(struct address_info * hw_config) -{ -#if (NSB > 0) - sb_dsp_disable_midi(); - sb_no_recording = 1; -#endif - conf_printf("AudioTriX (SB)", hw_config); -} - -void -attach_trix_mpu(struct address_info * 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) -{ -#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 (!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; - case 0x370: - conf = 0x04; - break; - case 0x3b0: - conf = 0x08; - break; - case 0x3f0: - conf = 0x0c; - break; - default: - return 0; /* Invalid port */ - } - - conf |= irq_bits[hw_config->irq] << 4; - - trix_write(0x19, (trix_read(0x19) & 0x83) | conf); - - mpu_initialized = 1; - - 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 deleted file mode 100644 index d6bd16a..0000000 --- a/sys/i386/isa/sound/trix_boot.h +++ /dev/null @@ -1,2488 +0,0 @@ -/* - * 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 deleted file mode 100644 index 858e1fe..0000000 --- a/sys/i386/isa/sound/tuning.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifdef SEQUENCER_C - -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 -}; - -unsigned short cent_tuning[100] = -{ -/* 0 */ 10000, 10006, 10012, 10017, 10023, 10029, 10035, 10041, -/* 8 */ 10046, 10052, 10058, 10064, 10070, 10075, 10081, 10087, -/* 16 */ 10093, 10099, 10105, 10110, 10116, 10122, 10128, 10134, -/* 24 */ 10140, 10145, 10151, 10157, 10163, 10169, 10175, 10181, -/* 32 */ 10187, 10192, 10198, 10204, 10210, 10216, 10222, 10228, -/* 40 */ 10234, 10240, 10246, 10251, 10257, 10263, 10269, 10275, -/* 48 */ 10281, 10287, 10293, 10299, 10305, 10311, 10317, 10323, -/* 56 */ 10329, 10335, 10341, 10347, 10353, 10359, 10365, 10371, -/* 64 */ 10377, 10383, 10389, 10395, 10401, 10407, 10413, 10419, -/* 72 */ 10425, 10431, 10437, 10443, 10449, 10455, 10461, 10467, -/* 80 */ 10473, 10479, 10485, 10491, 10497, 10503, 10509, 10515, -/* 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 deleted file mode 100644 index e978fc7..0000000 --- a/sys/i386/isa/sound/uart6850.c +++ /dev/null @@ -1,296 +0,0 @@ -/* - * 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. - * - * 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 - -#if NSND > 0 - -#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 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 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; -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, u_char data); -static void poll_uart6850(void *dummy); - - -static sound_os_info *uart6850_osp; - -static void -uart6850_input_loop(void) -{ - int count; - - count = 10; - - while (count) /* Not timed out */ - if (input_avail()) { - u_char c = uart6850_read(); - - count = 100; - - if (uart6850_opened & OPEN_READ) - midi_input_intr(my_dev, c); - } else - while (!input_avail() && count) - count--; -} - -void -m6850intr(int irq) -{ - if (input_avail()) - uart6850_input_loop(); -} - -/* - * It looks like there is no input interrupts in the UART mode. Let's try - * polling. - */ - -static void -poll_uart6850(void * dummy) -{ - u_long flags; - - if (!(uart6850_opened & OPEN_READ)) - return; /* Device has been closed */ - - flags = splhigh(); - - if (input_avail()) - uart6850_input_loop(); - - - timeout( poll_uart6850, 0, 1); /* Come back later */ - - splx(flags); -} - -static int -uart6850_open(int dev, int mode, - void (*input) (int dev, u_char data), - void (*output) (int dev) -) -{ - if (uart6850_opened) { - printf("Midi6850: Midi busy\n"); - return -(EBUSY); - } - uart6850_cmd(UART_RESET); - - uart6850_input_loop(); - - midi_input_intr = input; - uart6850_opened = mode; - poll_uart6850(0); /* Enable input polling */ - - return 0; -} - -static void -uart6850_close(int dev) -{ - uart6850_cmd(UART_MODE_ON); - - uart6850_opened = 0; -} - -static int -uart6850_out(int dev, u_char midi_byte) -{ - int timeout; - u_long flags; - - /* - * Test for input since pending input seems to block the output. - */ - - flags = splhigh(); - - if (input_avail()) - uart6850_input_loop(); - - splx(flags); - - /* - * 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 */ - - if (!output_ready()) { - printf("Midi6850: Timeout\n"); - return 0; - } - uart6850_write(midi_byte); - return 1; -} - -static int -uart6850_command(int dev, u_char *midi_byte) -{ - return 1; -} - -static int -uart6850_start_read(int dev) -{ - return 0; -} - -static int -uart6850_end_read(int dev) -{ - return 0; -} - -static int -uart6850_ioctl(int dev, u_int cmd, ioctl_arg arg) -{ - return -(EINVAL); -} - -static void -uart6850_kick(int dev) -{ -} - -static int -uart6850_buffer_status(int dev) -{ - return 0; /* No data in buffers */ -} - -#define MIDI_SYNTH_NAME "6850 UART Midi" -#define MIDI_SYNTH_CAPS SYNTH_CAP_INPUT -#include - -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 -}; - - -void -attach_uart6850(struct address_info * hw_config) -{ - int ok, timeout; - u_long flags; - - 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; - - if (!uart6850_detected) - return ; - - flags = splhigh(); - - for (timeout = 30000; timeout < 0 && !output_ready(); timeout--); /* Wait */ - uart6850_cmd(UART_MODE_ON); - - ok = 1; - - splx(flags); - - conf_printf("6850 Midi Interface", hw_config); - - std_midi_synth.midi_dev = my_dev = num_midis; - midi_devs[num_midis++] = &uart6850_operations; - return ; -} - -static int -reset_uart6850(void) -{ - uart6850_read(); - return 1; /* OK */ -} - - -int -probe_uart6850(struct address_info * hw_config) -{ - int ok = 0; - - uart6850_osp = hw_config->osp; - uart6850_base = hw_config->io_base; - uart6850_irq = hw_config->irq; - - if (snd_set_irq_handler(uart6850_irq, m6850intr, uart6850_osp) < 0) - return 0; - - ok = reset_uart6850(); - - uart6850_detected = ok; - return ok; -} - -#endif -#endif diff --git a/sys/i386/isa/sound/ulaw.h b/sys/i386/isa/sound/ulaw.h deleted file mode 100644 index 6a25ab4..0000000 --- a/sys/i386/isa/sound/ulaw.h +++ /dev/null @@ -1,71 +0,0 @@ -static unsigned char ulaw_dsp[] = { - 3, 7, 11, 15, 19, 23, 27, 31, - 35, 39, 43, 47, 51, 55, 59, 63, - 66, 68, 70, 72, 74, 76, 78, 80, - 82, 84, 86, 88, 90, 92, 94, 96, - 98, 99, 100, 101, 102, 103, 104, 105, - 106, 107, 108, 109, 110, 111, 112, 113, - 113, 114, 114, 115, 115, 116, 116, 117, - 117, 118, 118, 119, 119, 120, 120, 121, - 121, 121, 122, 122, 122, 122, 123, 123, - 123, 123, 124, 124, 124, 124, 125, 125, - 125, 125, 125, 125, 126, 126, 126, 126, - 126, 126, 126, 126, 127, 127, 127, 127, - 127, 127, 127, 127, 127, 127, 127, 127, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 253, 249, 245, 241, 237, 233, 229, 225, - 221, 217, 213, 209, 205, 201, 197, 193, - 190, 188, 186, 184, 182, 180, 178, 176, - 174, 172, 170, 168, 166, 164, 162, 160, - 158, 157, 156, 155, 154, 153, 152, 151, - 150, 149, 148, 147, 146, 145, 144, 143, - 143, 142, 142, 141, 141, 140, 140, 139, - 139, 138, 138, 137, 137, 136, 136, 135, - 135, 135, 134, 134, 134, 134, 133, 133, - 133, 133, 132, 132, 132, 132, 131, 131, - 131, 131, 131, 131, 130, 130, 130, 130, - 130, 130, 130, 130, 129, 129, 129, 129, - 129, 129, 129, 129, 129, 129, 129, 129, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, -}; - -#ifndef DSP_ULAW_NOT_WANTED -static unsigned char dsp_ulaw[] = { - 0, 0, 0, 0, 0, 1, 1, 1, - 1, 2, 2, 2, 2, 3, 3, 3, - 3, 4, 4, 4, 4, 5, 5, 5, - 5, 6, 6, 6, 6, 7, 7, 7, - 7, 8, 8, 8, 8, 9, 9, 9, - 9, 10, 10, 10, 10, 11, 11, 11, - 11, 12, 12, 12, 12, 13, 13, 13, - 13, 14, 14, 14, 14, 15, 15, 15, - 15, 16, 16, 17, 17, 18, 18, 19, - 19, 20, 20, 21, 21, 22, 22, 23, - 23, 24, 24, 25, 25, 26, 26, 27, - 27, 28, 28, 29, 29, 30, 30, 31, - 31, 32, 33, 34, 35, 36, 37, 38, - 39, 40, 41, 42, 43, 44, 45, 46, - 47, 49, 51, 53, 55, 57, 59, 61, - 63, 66, 70, 74, 78, 84, 92, 104, - 254, 231, 219, 211, 205, 201, 197, 193, - 190, 188, 186, 184, 182, 180, 178, 176, - 175, 174, 173, 172, 171, 170, 169, 168, - 167, 166, 165, 164, 163, 162, 161, 160, - 159, 159, 158, 158, 157, 157, 156, 156, - 155, 155, 154, 154, 153, 153, 152, 152, - 151, 151, 150, 150, 149, 149, 148, 148, - 147, 147, 146, 146, 145, 145, 144, 144, - 143, 143, 143, 143, 142, 142, 142, 142, - 141, 141, 141, 141, 140, 140, 140, 140, - 139, 139, 139, 139, 138, 138, 138, 138, - 137, 137, 137, 137, 136, 136, 136, 136, - 135, 135, 135, 135, 134, 134, 134, 134, - 133, 133, 133, 133, 132, 132, 132, 132, - 131, 131, 131, 131, 130, 130, 130, 130, - 129, 129, 129, 129, 128, 128, 128, 128, -}; -#endif /* !DSP_ULAW_NOT_WANTED */ diff --git a/sys/i386/isa/sound/ultrasound.h b/sys/i386/isa/sound/ultrasound.h deleted file mode 100644 index 5c63b03..0000000 --- a/sys/i386/isa/sound/ultrasound.h +++ /dev/null @@ -1,137 +0,0 @@ -#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 -- cgit v1.1