mirror of
https://github.com/freebsd/freebsd-src
synced 2024-09-29 05:04:50 +00:00
Another round of merge/updates.
(1) Add #ifdef PC98: sys/pc98/boot/biosboot/boot2.S (2) Fix bug that made it impossible to boot from sd's other than unit 0: sys/pc98/boot/biosboot/sys.c (3) Delete redundant $Id$: sys/pc98/pc98/clock.c (reject$B$5$l$k$+$b$7$l$J$$(B) (4) unt -> u_int: sys/pc98/pc98/if_ed.c (5) Add support for rebooting by the hot-key sequence: sys/pc98/pc98/kbdtables.h (6) Display now looks like PC/AT version: sys/pc98/pc98/npx.c (7) Change comment to match that of PC/AT version: sys/pc98/pc98/pc98.c (8) Add function prototypes: sys/pc98/pc98/pc98_machdep.c (9) Include PC98 headers: sys/pc98/pc98/sound/adlib_card.c sys/pc98/pc98/sound/audio.c sys/pc98/pc98/sound/dev_table.c sys/pc98/pc98/sound/dmabuf.c sys/pc98/pc98/sound/midi_synth.c sys/pc98/pc98/sound/midibuf.c sys/pc98/pc98/sound/opl3.c sys/pc98/pc98/sound/oatmgr.c sys/pc98/pc98/sound/sb16_dsp.c sys/pc98/pc98/sound/sb16_midi.c sys/pc98/pc98/sound/sb_card.c sys/pc98/pc98/sound/sb_dsp.c sys/pc98/pc98/sound/sb_midi.c sys/pc98/pc98/sound/sb_mixer.c sys/pc98/pc98/sound/sequencer.c sys/pc98/pc98/sound/sound_config.h sys/pc98/pc98/sound/sound_switch.c sys/pc98/pc98/sound/soundcard.c sys/pc98/pc98/sound/sys_timer.c (10) Merge in PC98 changes: sys/i386/isa/sound/os.h (11) Deleted as result of 9. and 10. above: sys/pc98/pc98/sound/ad1848_mixer.h sys/pc98/pc98/sound/aedsp16.c sys/pc98/pc98/sound/coproc.h sys/pc98/pc98/sound/finetune.h sys/pc98/pc98/sound/gus_hw.h sys/pc98/pc98/sound/gus_linearvol.h sys/pc98/pc98/sound/hex2hex.h sys/pc98/pc98/sound/mad16.h sys/pc98/pc98/sound/midi_ctrl.h sys/pc98/pc98/sound/midi_synth.h sys/pc98/pc98/sound/opl3.h sys/pc98/pc98/sound/os.h sys/pc98/pc98/sound/pas.h sys/pc98/pc98/sound/sb_mixer.h sys/pc98/pc98/sound/soundvers.h sys/pc98/pc98/sound/tuning.h Submitted by: The FreeBSD(98) Development Team
This commit is contained in:
parent
aedbf2687d
commit
4d2d765487
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=19248
|
@ -1,4 +1,4 @@
|
|||
# $Id: options.pc98,v 1.5 1996/10/09 21:45:47 asami Exp $
|
||||
# $Id: options.pc98,v 1.6 1996/10/23 07:24:55 asami Exp $
|
||||
BOUNCEPAGES opt_bounce.h
|
||||
USER_LDT
|
||||
MATH_EMULATE opt_math_emulate.h
|
||||
|
@ -15,6 +15,8 @@ AUTO_EOI_1 opt_auto_eoi.h
|
|||
AUTO_EOI_2 opt_auto_eoi.h
|
||||
BREAK_TO_DEBUGGER opt_comconsole.h
|
||||
COMCONSOLE opt_comconsole.h
|
||||
CONADDR opt_comconsole.h
|
||||
CONUNIT opt_comconsole.h
|
||||
COM_ESP opt_sio.h
|
||||
COM_MULTIPORT opt_sio.h
|
||||
DSI_SOFT_MODEM opt_sio.h
|
||||
|
@ -41,7 +43,6 @@ I586_FAST_BCOPY opt_temporary.h
|
|||
I586_OPTIMIZED_BCOPY opt_temporary.h
|
||||
I586_OPTIMIZED_BZERO opt_temporary.h
|
||||
|
||||
SC_KBD_PROBE_WORKS opt_syscons.h
|
||||
SC_SPLASH_SCREEN opt_syscons.h
|
||||
MAXCONS opt_syscons.h
|
||||
SLOW_VGA opt_syscons.h
|
||||
|
|
|
@ -247,8 +247,13 @@ extern unsigned long get_time(void);
|
|||
* The outb(0, 0x80) is just for slowdown. It's bit unsafe since
|
||||
* this address could be used for something usefull.
|
||||
*/
|
||||
#define OUTB(addr, data) {outb(data, addr);outb(0, 0x80);}
|
||||
#define OUTW(addr, data) {outw(data, addr);outb(0, 0x80);}
|
||||
#ifdef PC98
|
||||
#define OUTB(addr, data) {outb(data, addr);outb(0x5f, 0);}
|
||||
#define OUTW(addr, data) {outw(data, addr);outb(0x5f, 0);}
|
||||
#else /* IBM-PC */
|
||||
#define OUTB(addr, data) {outb(data, addr);outb(0x80, 0);}
|
||||
#define OUTW(addr, data) {outw(data, addr);outb(0x80, 0);}
|
||||
#endif /* PC98 */
|
||||
#else
|
||||
#define OUTB(addr, data) outb(data, addr)
|
||||
#define OUTW(addr, data) outw(data, addr)
|
||||
|
|
|
@ -172,7 +172,9 @@ ENTRY(boot2)
|
|||
movl %esp, EXT(dflt_name)
|
||||
#endif
|
||||
|
||||
#ifdef PC98
|
||||
movb 0x11584, %dl
|
||||
#endif
|
||||
movzbl %dl, %edx /* discard head (%dh) and random high bits */
|
||||
pushl %edx
|
||||
call EXT(boot)
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
* the rights to redistribute these changes.
|
||||
*
|
||||
* from: Mach, Revision 2.2 92/04/04 11:36:34 rpd
|
||||
* $Id: sys.c,v 1.4 1996/09/12 11:36:09 asami Exp $
|
||||
* $Id: sys.c,v 1.5 1996/10/09 21:45:32 asami Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -275,8 +275,9 @@ openrd(void)
|
|||
#ifdef PC98
|
||||
dosdev_copy = unit | 0xa0;
|
||||
disk_equips = *(unsigned char *)0x11482;
|
||||
sdunit = unit;
|
||||
unit = 0;
|
||||
for (i = 0; i < unit; i++)
|
||||
for (i = 0; i < sdunit; i++)
|
||||
unit += ((disk_equips >> i) & 0x01);
|
||||
#else /* IBM-PC */
|
||||
dosdev_copy = biosdrive | 0x80;
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)clock.c 7.2 (Berkeley) 5/12/91
|
||||
* $Id: clock.c,v 1.7 1996/10/09 21:46:11 asami Exp $
|
||||
* $Id: clock.c,v 1.8 1996/10/23 07:25:13 asami Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -45,8 +45,7 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
* modified for PC98
|
||||
* $Id: clock.c,v 1.7 1996/10/09 21:46:11 asami Exp $
|
||||
* modified for PC98 by Kakefuda
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -482,7 +481,6 @@ DELAY(int n)
|
|||
n -= 20;
|
||||
/*
|
||||
* Calculate (n * (timer_freq / 1e6)) without using floating point
|
||||
* Calculate (n * (TIMER_FREQ / 1e6)) without using floating point
|
||||
* and without any avoidable overflows.
|
||||
*/
|
||||
sec = n / 1000000;
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)clock.c 7.2 (Berkeley) 5/12/91
|
||||
* $Id: clock.c,v 1.7 1996/10/09 21:46:11 asami Exp $
|
||||
* $Id: clock.c,v 1.8 1996/10/23 07:25:13 asami Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -45,8 +45,7 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
* modified for PC98
|
||||
* $Id: clock.c,v 1.7 1996/10/09 21:46:11 asami Exp $
|
||||
* modified for PC98 by Kakefuda
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -482,7 +481,6 @@ DELAY(int n)
|
|||
n -= 20;
|
||||
/*
|
||||
* Calculate (n * (timer_freq / 1e6)) without using floating point
|
||||
* Calculate (n * (TIMER_FREQ / 1e6)) without using floating point
|
||||
* and without any avoidable overflows.
|
||||
*/
|
||||
sec = n / 1000000;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
$Id: majors.pc98,v 1.3 1996/09/03 10:23:13 asami Exp $
|
||||
$Id: majors.pc98,v 1.4 1996/10/23 07:24:52 asami Exp $
|
||||
|
||||
Hopefully, this list will one day be obsoleted by DEVFS, but for now
|
||||
this is the current allocation of device major numbers.
|
||||
|
@ -91,13 +91,13 @@ chrdev name comments
|
|||
51 joy joystick
|
||||
52 tun IP tunnel device
|
||||
53 snp tty snoop
|
||||
54 nic ISDN system
|
||||
55 isdn ISDN system
|
||||
56 ity ISDN system
|
||||
57 itel ISDN system
|
||||
54 OLDnic ISDN system
|
||||
55 OLDisdn ISDN system
|
||||
56 OLDity ISDN system
|
||||
57 OLDitel ISDN system
|
||||
58 dgb Digiboard
|
||||
59 ispy ISDN system
|
||||
60 nnic ISDN system
|
||||
59 OLDispy ISDN system
|
||||
60 OLDnnic ISDN system
|
||||
61 pt SCSI "processor type"
|
||||
62 worm SCSI "worm type"
|
||||
63 rc Riscom/8 driver
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $Id: options.pc98,v 1.5 1996/10/09 21:45:47 asami Exp $
|
||||
# $Id: options.pc98,v 1.6 1996/10/23 07:24:55 asami Exp $
|
||||
BOUNCEPAGES opt_bounce.h
|
||||
USER_LDT
|
||||
MATH_EMULATE opt_math_emulate.h
|
||||
|
@ -15,6 +15,8 @@ AUTO_EOI_1 opt_auto_eoi.h
|
|||
AUTO_EOI_2 opt_auto_eoi.h
|
||||
BREAK_TO_DEBUGGER opt_comconsole.h
|
||||
COMCONSOLE opt_comconsole.h
|
||||
CONADDR opt_comconsole.h
|
||||
CONUNIT opt_comconsole.h
|
||||
COM_ESP opt_sio.h
|
||||
COM_MULTIPORT opt_sio.h
|
||||
DSI_SOFT_MODEM opt_sio.h
|
||||
|
@ -41,7 +43,6 @@ I586_FAST_BCOPY opt_temporary.h
|
|||
I586_OPTIMIZED_BCOPY opt_temporary.h
|
||||
I586_OPTIMIZED_BZERO opt_temporary.h
|
||||
|
||||
SC_KBD_PROBE_WORKS opt_syscons.h
|
||||
SC_SPLASH_SCREEN opt_syscons.h
|
||||
MAXCONS opt_syscons.h
|
||||
SLOW_VGA opt_syscons.h
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
|
||||
* $Id: machdep.c,v 1.9 1996/10/09 21:45:56 asami Exp $
|
||||
* $Id: machdep.c,v 1.10 1996/10/23 07:25:00 asami Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h"
|
||||
|
@ -257,12 +257,6 @@ cpu_startup(dummy)
|
|||
*/
|
||||
setup_netisrs(&netisr_set);
|
||||
|
||||
/*
|
||||
#ifdef ISDN
|
||||
DONET(isdnintr, NETISR_ISDN);
|
||||
#endif
|
||||
*/
|
||||
|
||||
/*
|
||||
* Allocate space for system data structures.
|
||||
* The first available kernel virtual address is in "v".
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
**
|
||||
** $Id: userconfig.c,v 1.7 1996/10/09 21:46:01 asami Exp $
|
||||
** $Id: userconfig.c,v 1.8 1996/10/23 07:25:04 asami Exp $
|
||||
**/
|
||||
|
||||
/**
|
||||
|
@ -283,8 +283,6 @@ static DEV_INFO device_info[] = {
|
|||
{"cy", "Cyclades multiport async adapter", 0, CLS_COMMS},
|
||||
#endif
|
||||
{"lpt", "Parallel printer port", 0, CLS_COMMS},
|
||||
{"nic", "ISDN driver", 0, CLS_COMMS},
|
||||
{"nnic", "ISDN driver", 0, CLS_COMMS},
|
||||
#ifndef PC98
|
||||
{"gp", "National Instruments AT-GPIB/TNT driver", 0, CLS_COMMS},
|
||||
#endif
|
||||
|
@ -2249,7 +2247,7 @@ visuserconfig(void)
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: userconfig.c,v 1.7 1996/10/09 21:46:01 asami Exp $
|
||||
* $Id: userconfig.c,v 1.8 1996/10/23 07:25:04 asami Exp $
|
||||
*/
|
||||
|
||||
#include "scbus.h"
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)clock.c 7.2 (Berkeley) 5/12/91
|
||||
* $Id: clock.c,v 1.7 1996/10/09 21:46:11 asami Exp $
|
||||
* $Id: clock.c,v 1.8 1996/10/23 07:25:13 asami Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -45,8 +45,7 @@
|
|||
*/
|
||||
|
||||
/*
|
||||
* modified for PC98
|
||||
* $Id: clock.c,v 1.7 1996/10/09 21:46:11 asami Exp $
|
||||
* modified for PC98 by Kakefuda
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -482,7 +481,6 @@ DELAY(int n)
|
|||
n -= 20;
|
||||
/*
|
||||
* Calculate (n * (timer_freq / 1e6)) without using floating point
|
||||
* Calculate (n * (TIMER_FREQ / 1e6)) without using floating point
|
||||
* and without any avoidable overflows.
|
||||
*/
|
||||
sec = n / 1000000;
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: if_ed.c,v 1.8 1996/10/09 21:46:18 asami Exp $
|
||||
* $Id: if_ed.c,v 1.9 1996/10/23 07:25:17 asami Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -1941,7 +1941,7 @@ ed_hpp_set_physical_link(struct ed_softc *sc)
|
|||
#ifdef PC98
|
||||
static int ed_probe_SIC98(struct isa_device* pc98_dev)
|
||||
{
|
||||
int i;
|
||||
u_int i;
|
||||
struct ed_softc *sc = &ed_softc[pc98_dev->id_unit];
|
||||
u_char sum;
|
||||
u_int memsize;
|
||||
|
@ -2030,7 +2030,7 @@ ed_probe_CNET98(isa_dev)
|
|||
|
||||
{
|
||||
struct ed_softc *sc = &ed_softc[isa_dev->id_unit];
|
||||
int i;
|
||||
u_int i;
|
||||
u_char sum;
|
||||
|
||||
/*
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Id: kbdtables.h,v 1.31 1996/01/25 16:37:20 ache Exp $
|
||||
* $Id: kbdtables.h,v 1.1.1.1 1996/06/14 10:04:44 asami Exp $
|
||||
*/
|
||||
|
||||
#define SET8 0x80 /* set eight bit on */
|
||||
|
@ -98,7 +98,7 @@ static keymap_t key_map = { 0x80, /* PC98 keymap */
|
|||
/* sc=36 */ F(51), F(51), F(51), F(51), F(51), F(51), F(51), F(51), 0xFF, 0x00,
|
||||
/* sc=37 */ F(59), F(59), F(59), F(59), F(59), F(59), F(59), F(59), 0xFF, 0x00,
|
||||
/* sc=38 */ F(60), F(60), F(60), F(60), F(60), F(60), F(60), F(60), 0xFF, 0x00,
|
||||
/* sc=39 */ 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00,
|
||||
/* sc=39 */ 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, RBT, RBT, 0x00, 0x00,
|
||||
/* sc=3a */ F(50), F(50), F(50), F(50), F(50), F(50), F(50), F(50), 0xFF, 0x00,
|
||||
/* sc=3b */ F(53), F(53), F(53), F(53), F(53), F(53), F(53), F(53), 0xFF, 0x00,
|
||||
/* sc=3c */ F(55), F(55), F(55), F(55), F(55), F(55), F(55), F(55), 0xFF, 0x00,
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)machdep.c 7.4 (Berkeley) 6/3/91
|
||||
* $Id: machdep.c,v 1.9 1996/10/09 21:45:56 asami Exp $
|
||||
* $Id: machdep.c,v 1.10 1996/10/23 07:25:00 asami Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h"
|
||||
|
@ -257,12 +257,6 @@ cpu_startup(dummy)
|
|||
*/
|
||||
setup_netisrs(&netisr_set);
|
||||
|
||||
/*
|
||||
#ifdef ISDN
|
||||
DONET(isdnintr, NETISR_ISDN);
|
||||
#endif
|
||||
*/
|
||||
|
||||
/*
|
||||
* Allocate space for system data structures.
|
||||
* The first available kernel virtual address is in "v".
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)npx.c 7.2 (Berkeley) 5/12/91
|
||||
* $Id: npx.c,v 1.6 1996/09/10 09:38:17 asami Exp $
|
||||
* $Id: npx.c,v 1.7 1996/10/09 21:46:29 asami Exp $
|
||||
*/
|
||||
|
||||
#include "npx.h"
|
||||
|
@ -367,7 +367,7 @@ npxattach(dvp)
|
|||
struct isa_device *dvp;
|
||||
{
|
||||
if (npx_ex16)
|
||||
printf("npx%d: Exception 16 interface\n", dvp->id_unit);
|
||||
printf("npx%d: INT 16 interface\n", dvp->id_unit);
|
||||
else if (npx_irq13)
|
||||
; /* higher level has printed "irq 13" */
|
||||
#if defined(MATH_EMULATE) || defined(GPL_MATH_EMULATE)
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
* SUCH DAMAGE.
|
||||
*
|
||||
* from: @(#)isa.c 7.2 (Berkeley) 5/13/91
|
||||
* $Id: pc98.c,v 1.8 1996/10/09 21:46:31 asami Exp $
|
||||
* $Id: pc98.c,v 1.9 1996/10/23 07:25:20 asami Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
|
@ -739,6 +739,10 @@ void isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan)
|
|||
|
||||
#ifndef PC98
|
||||
if ((chan & 4) == 0) {
|
||||
/*
|
||||
* Program one of DMA channels 0..3. These are
|
||||
* byte mode channels.
|
||||
*/
|
||||
#endif
|
||||
/* set dma channel mode, and reset address ff */
|
||||
|
||||
|
@ -763,11 +767,11 @@ void isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan)
|
|||
outb(dmapageport[chan], phys>>16);
|
||||
|
||||
/* send count */
|
||||
outb(waport + 2, --nbytes); /* 0x3, 0x7, 0xb, 0xf */
|
||||
outb(waport + 2, --nbytes);
|
||||
outb(waport + 2, nbytes>>8);
|
||||
|
||||
/* unmask channel */
|
||||
outb(DMA1_SMSK, chan & 3);
|
||||
outb(DMA1_SMSK, chan);
|
||||
#ifndef PC98
|
||||
} else {
|
||||
/*
|
||||
|
@ -802,7 +806,7 @@ void isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan)
|
|||
outb(waport + 2, nbytes>>8);
|
||||
|
||||
/* unmask channel */
|
||||
outb(DMA2_SMSK, chan);
|
||||
outb(DMA2_SMSK, chan & 3);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -48,6 +48,7 @@ extern int Maxmem_under16M;
|
|||
|
||||
static void init_cpu_accel_mem __P((void));
|
||||
void pc98_init_dmac __P((void));
|
||||
void pc98_getmemsize __P((void));
|
||||
|
||||
#ifdef EPSON_MEMWIN
|
||||
static void init_epson_memwin __P((void));
|
||||
|
|
|
@ -1,130 +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).
|
||||
*/
|
||||
#ifdef GUSMAX_MIXER
|
||||
#define MODE1_REC_DEVICES (SOUND_MASK_LINE | SOUND_MASK_MIC | \
|
||||
SOUND_MASK_CD)
|
||||
|
||||
#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)
|
||||
|
||||
#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;
|
||||
};
|
||||
|
||||
|
||||
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_r, len_l}, {reg_r, pola_r, pos_r, len_r}}
|
||||
|
||||
static 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, 1, 5, 1, 1, 1, 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 */
|
||||
0x6464, /* PCM */
|
||||
0x4b4b, /* PC Speaker */
|
||||
0x4b4b, /* Ext Line */
|
||||
0x1010, /* Mic */
|
||||
0x4b4b, /* CD */
|
||||
0x0000, /* Recording monitor */
|
||||
0x4b4b, /* SB PCM */
|
||||
0x4b4b, /* Recording level */
|
||||
0x4b4b, /* Input gain */
|
||||
0x4b4b, /* Output gain */
|
||||
0x4b4b, /* Line1 */
|
||||
0x4b4b, /* Line2 */
|
||||
0x4b4b /* Line3 */
|
||||
};
|
||||
|
||||
#define LEFT_CHN 0
|
||||
#define RIGHT_CHN 1
|
|
@ -27,7 +27,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_YM3812)
|
||||
|
||||
|
|
|
@ -1,838 +0,0 @@
|
|||
/*
|
||||
sound/aedsp16.c
|
||||
|
||||
Audio Excel DSP 16 software configuration routines
|
||||
|
||||
Copyright (C) 1995 Riccardo Facchetti (riccardo@cdc8g5.cdc.polimi.it)
|
||||
|
||||
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.
|
||||
|
||||
READ THIS
|
||||
|
||||
This module is intended for Audio Excel DSP 16 Sound Card.
|
||||
|
||||
Audio Excel DSP 16 is an SB pro II, Microsoft Sound System
|
||||
and MPU-401 compatible card.
|
||||
It is software-only configurable (no jumpers to hard-set irq/dma/mpu-irq),
|
||||
so before this module, the only way to configure the DSP under linux was
|
||||
boot the MS-BAU loading the sound.sys device driver (this driver soft-
|
||||
configure the sound board hardware by massaging someone of its registers),
|
||||
and then ctrl-alt-del to boot linux with the DSP configured by the DOG
|
||||
driver.
|
||||
|
||||
This module works configuring your Audio Excel DSP 16's
|
||||
irq, dma and mpu-401-irq. The voxware probe routines rely on the
|
||||
fact that if the hardware is there, they can detect it. The problem
|
||||
with AEDSP16 is that no hardware can be found by the probe routines
|
||||
if the sound card is not well configured. Sometimes the kernel probe
|
||||
routines can find an SBPRO even when the card is not configured (this
|
||||
is the standard setup of the card), but the SBPRO emulation don't work
|
||||
well if the card is not properly initialized. For this reason
|
||||
|
||||
InitAEDSP16_...()
|
||||
|
||||
routines are called before the voxware probe routines try to detect the
|
||||
hardware.
|
||||
|
||||
NOTE (READ THE NOTE TOO, IT CONTAIN USEFUL INFORMATIONS)
|
||||
|
||||
The Audio Excel DSP 16 Sound Card emulates both SBPRO and MSS;
|
||||
the voxware sound driver can be configured for SBPRO and MSS cards
|
||||
at the same time, but the aedsp16 can't be two cards!!
|
||||
When we configure it, we have to choose the SBPRO or the MSS emulation
|
||||
for AEDSP16. We also can install a *REAL* card of the other type
|
||||
(see [1], not tested but I can't see any reason for it to fail).
|
||||
|
||||
NOTE: If someone can test the combination AEDSP16+MSS or AEDSP16+SBPRO
|
||||
please let me know if it works.
|
||||
|
||||
The MPU-401 support can be compiled in together with one of the other
|
||||
two operating modes.
|
||||
|
||||
The board configuration calls, are in the probe_...() routines because
|
||||
we have to configure the board before probing it for a particular
|
||||
hardware. After card configuration, we can probe the hardware.
|
||||
|
||||
NOTE: This is something like plug-and-play: we have only to plug
|
||||
the AEDSP16 board in the socket, and then configure and compile
|
||||
a kernel that uses the AEDSP16 software configuration capability.
|
||||
No jumper setting is needed!
|
||||
|
||||
For example, if you want AEDSP16 to be an SBPro, on irq 10, dma 3
|
||||
you have just to make config the voxware package, configuring
|
||||
the SBPro sound card with that parameters, then when configure
|
||||
asks if you have an AEDSP16, answer yes. That's it.
|
||||
Compile the kernel and run it.
|
||||
|
||||
NOTE: This means that you can choose irq and dma, but not the
|
||||
I/O addresses. To change I/O addresses you have to set them
|
||||
with jumpers.
|
||||
|
||||
NOTE: InitAEDSP16_...() routines get as parameter the hw_config,
|
||||
the hardware configuration of the - to be configured - board.
|
||||
The InitAEDSP16() routine, configure the board following our
|
||||
wishes, that are in the hw_config structure.
|
||||
|
||||
You can change the irq/dma/mirq settings WITHOUT THE NEED to open
|
||||
your computer and massage the jumpers (there are no irq/dma/mirq
|
||||
jumpers to be configured anyway, only I/O port ones have to be
|
||||
configured with jumpers)
|
||||
|
||||
For some ununderstandable reason, the card default of irq 7, dma 1,
|
||||
don't work for me. Seems to be an IRQ or DMA conflict. Under heavy
|
||||
HDD work, the kernel start to erupt out a lot of messages like:
|
||||
|
||||
'Sound: DMA timed out - IRQ/DRQ config error?'
|
||||
|
||||
For what I can say, I have NOT any conflict at irq 7 (under linux I'm
|
||||
using the lp polling driver), and dma line 1 is unused as stated by
|
||||
/proc/dma. I can suppose this is a bug of AEDSP16. I know my hardware so
|
||||
I'm pretty sure I have not any conflict, but may be I'm wrong. Who knows!
|
||||
Anyway a setting of irq 10, dma 3 works really fine.
|
||||
|
||||
NOTE: if someone can use AEDSP16 with irq 7, dma 1, please let me know
|
||||
the emulation mode, all the installed hardware and the hardware
|
||||
configuration (irq and dma settings of all the hardware).
|
||||
|
||||
This init module should work with SBPRO+MSS, when one of the two is
|
||||
the AEDSP16 emulation and the other the real card. (see [1])
|
||||
For example:
|
||||
|
||||
AEDSP16 (0x220) in SBPRO emu (0x220) + real MSS + other
|
||||
AEDSP16 (0x220) in MSS emu + real SBPRO (0x240) + other
|
||||
|
||||
MPU401 should work. (see [1])
|
||||
|
||||
[1] Not tested by me for lack of hardware.
|
||||
|
||||
TODO, WISHES AND TECH
|
||||
|
||||
May be there's lot of redundant delays, but for now I want to leave it
|
||||
this way.
|
||||
|
||||
Should be interesting eventually write down a new ioctl for the
|
||||
aedsp16, to let the suser() change the irq/dma/mirq on the fly.
|
||||
The thing is not trivial.
|
||||
In the real world, there's no need to have such an ioctl because
|
||||
when we configure the kernel for compile, we can choose the config
|
||||
parameters. If we change our mind, we can easily re-config the kernel
|
||||
and re-compile.
|
||||
Why let the suser() change the config parameters on the fly ?
|
||||
If anyone have a reasonable answer to this question, I will write down
|
||||
the code to do it.
|
||||
|
||||
More integration with voxware, using voxware low level routines to
|
||||
read-write dsp is not possible because you may want to have MSS
|
||||
support and in that case we can not rely on the functions included
|
||||
in sb_dsp.c to control 0x2yy I/O ports. I will continue to use my
|
||||
own I/O functions.
|
||||
|
||||
- About I/O ports allocation -
|
||||
|
||||
The request_region should be done at device probe in every sound card
|
||||
module. This module is not the best site for requesting regions.
|
||||
When the request_region code will be added to the main modules such as
|
||||
sb, adlib, gus, ad1848, etc, the requesting code in this module should
|
||||
go away.
|
||||
|
||||
I think the request regions should be done this way:
|
||||
|
||||
if (check_region(...))
|
||||
return ERR; // I/O region alredy reserved
|
||||
device_probe(...);
|
||||
device_attach(...);
|
||||
request_region(...); // reserve only when we are sure all is okay
|
||||
|
||||
Request the 2x0h region in any case if we are using this card.
|
||||
|
||||
NOTE: the "(sbpro)" string with which we are requesting the aedsp16 region
|
||||
(see code) does not mean necessarly that we are emulating sbpro.
|
||||
It mean that the region is the sbpro I/O ports region. We use this
|
||||
region to access the control registers of the card, and if emulating
|
||||
sbpro, I/O sbpro registers too. If we are emulating MSS, the sbpro
|
||||
registers are not used, in no way, to emulate an sbpro: they are
|
||||
used only for configuration pourposes.
|
||||
|
||||
Someone pointed out that should be possible use both the SBPRO and MSS
|
||||
modes because the sound card have all the two chipsets, supposing that
|
||||
the card is really two cards. I have tried something to have the two
|
||||
modes work together, but, for some reason unknown to me, without success.
|
||||
|
||||
I think all the soft-config only cards have an init sequence similar to
|
||||
this. If you have a card that is not an aedsp16, you can try to start
|
||||
with this module changing it (mainly in the CMD? I think) to fit your
|
||||
needs.
|
||||
|
||||
Started Fri Mar 17 16:13:18 MET 1995
|
||||
|
||||
v0.1 (ALPHA, was an user-level program called AudioExcelDSP16.c)
|
||||
- Initial code.
|
||||
v0.2 (ALPHA)
|
||||
- Cleanups.
|
||||
- Integrated with Linux voxware v 2.90-2 kernel sound driver.
|
||||
- SoundBlaster Pro mode configuration.
|
||||
- Microsoft Sound System mode configuration.
|
||||
- MPU-401 mode configuration.
|
||||
v0.3 (ALPHA)
|
||||
- Cleanups.
|
||||
- Rearranged the code to let InitAEDSP16 be more general.
|
||||
- Erased the REALLY_SLOW_IO. We don't need it. Erased the linux/io.h
|
||||
inclusion too. We rely on os.h
|
||||
- Used the INB and OUTB #defined in os.h instead of inb and outb.
|
||||
- Corrected the code for GetCardName (DSP Copyright) to get a variable
|
||||
len string (we are not sure about the len of Copyright string).
|
||||
This works with any SB and compatible.
|
||||
- Added the code to request_region at device init (should go in
|
||||
the main body of voxware).
|
||||
v0.4 (BETA)
|
||||
- Better configure.c patch for aedsp16 configuration (better
|
||||
logic of inclusion of AEDSP16 support)
|
||||
- Modified the conditional compilation to better support more than
|
||||
one sound card of the emulated type (read the NOTES above)
|
||||
- Moved the sb init routine from the attach to the very first
|
||||
probe in sb_card.c
|
||||
- Rearrangemens and cleanups
|
||||
- Wiped out some unnecessary code and variables: this is kernel
|
||||
code so it is better save some TEXT and DATA
|
||||
- Fixed the request_region code. We must allocate the aedsp16 (sbpro)
|
||||
I/O ports in any case because they are used to access the DSP
|
||||
configuration registers and we can not allow anyone to get them.
|
||||
v0.5
|
||||
- cleanups on comments
|
||||
- prep for diffs against v3.0-proto-950402
|
||||
|
||||
*/
|
||||
|
||||
/*
|
||||
* Include the main voxware header file. It include all the os/voxware/etc
|
||||
* headers needed by this source.
|
||||
*/
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
/*
|
||||
* all but ioport.h :)
|
||||
*/
|
||||
#include <linux/ioport.h>
|
||||
|
||||
#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_AEDSP16)
|
||||
|
||||
#define VERSION "0.5" /* Version of Audio Excel DSP 16 driver */
|
||||
|
||||
#undef AEDSP16_DEBUG /* Define this to enable debug code */
|
||||
/* Actually no debug code is activated */
|
||||
|
||||
/*
|
||||
* Hardware related defaults
|
||||
*/
|
||||
#define IRQ 7 /* 5 7(default) 9 10 11 */
|
||||
#define MIRQ 0 /* 5 7 9 10 0(default), 0 means disable */
|
||||
#define DMA 1 /* 0 1(default) 3 */
|
||||
|
||||
/*
|
||||
* Commands of AEDSP16's DSP (SBPRO+special).
|
||||
* For now they are CMDn, in the future they may change.
|
||||
*/
|
||||
#define CMD1 0xe3 /* Get DSP Copyright */
|
||||
#define CMD2 0xe1 /* Get DSP Version */
|
||||
#define CMD3 0x88 /* */
|
||||
#define CMD4 0x5c /* */
|
||||
#define CMD5 0x50 /* Set M&I&DRQ mask (the real config) */
|
||||
#define CMD6 0x8c /* Enable Microsoft Sound System mode */
|
||||
|
||||
/*
|
||||
* Offsets of AEDSP16 DSP I/O ports. The offest is added to portbase
|
||||
* to have the actual I/O port.
|
||||
* Register permissions are:
|
||||
* (wo) == Write Only
|
||||
* (ro) == Read Only
|
||||
* (w-) == Write
|
||||
* (r-) == Read
|
||||
*/
|
||||
#define DSP_RESET 0x06 /* offset of DSP RESET (wo) */
|
||||
#define DSP_READ 0x0a /* offset of DSP READ (ro) */
|
||||
#define DSP_WRITE 0x0c /* offset of DSP WRITE (w-) */
|
||||
#define DSP_COMMAND 0x0c /* offset of DSP COMMAND (w-) */
|
||||
#define DSP_STATUS 0x0c /* offset of DSP STATUS (r-) */
|
||||
#define DSP_DATAVAIL 0x0e /* offset of DSP DATA AVAILABLE (ro) */
|
||||
|
||||
|
||||
#define RETRY 10 /* Various retry values on I/O opera- */
|
||||
#define STATUSRETRY 1000 /* tions. Sometimes we have to */
|
||||
#define HARDRETRY 500000 /* wait for previous cmd to complete */
|
||||
|
||||
/*
|
||||
* Size of character arrays that store name and version of sound card
|
||||
*/
|
||||
#define CARDNAMELEN 15 /* Size of the card's name in chars */
|
||||
#define CARDVERLEN 2 /* Size of the card's version in chars */
|
||||
|
||||
/*
|
||||
* Bit mapped flags for calling InitAEDSP16(), and saving the current
|
||||
* emulation mode.
|
||||
*/
|
||||
#define INIT_NONE (0 )
|
||||
#define INIT_SBPRO (1<<0)
|
||||
#define INIT_MSS (1<<1)
|
||||
#define INIT_MPU401 (1<<2)
|
||||
#define RESET_DSP16 (1<<3)
|
||||
|
||||
/* Base HW Port for Audio Card */
|
||||
static int portbase = AEDSP16_BASE;
|
||||
static int irq = IRQ; /* irq for DSP I/O */
|
||||
static int mirq = MIRQ; /* irq for MPU-401 I/O */
|
||||
static int dma = DMA; /* dma for DSP I/O */
|
||||
|
||||
/* Init status of the card */
|
||||
static int ae_init = INIT_NONE; /* (bitmapped variable) */
|
||||
static int oredparams = 0; /* Will contain or'ed values of params */
|
||||
static int gc = 0; /* generic counter (utility counter) */
|
||||
struct orVals
|
||||
{ /* Contain the values to be or'ed */
|
||||
int val; /* irq|mirq|dma */
|
||||
int or; /* oredparams |= TheStruct.or */
|
||||
};
|
||||
|
||||
/*
|
||||
* Magic values that the DSP will eat when configuring irq/mirq/dma
|
||||
*/
|
||||
/* DSP IRQ conversion array */
|
||||
static struct orVals orIRQ[] =
|
||||
{
|
||||
{0x05, 0x28},
|
||||
{0x07, 0x08},
|
||||
{0x09, 0x10},
|
||||
{0x0a, 0x18},
|
||||
{0x0b, 0x20},
|
||||
{0x00, 0x00}
|
||||
};
|
||||
|
||||
/* MPU-401 IRQ conversion array */
|
||||
static struct orVals orMIRQ[] =
|
||||
{
|
||||
{0x05, 0x04},
|
||||
{0x07, 0x44},
|
||||
{0x09, 0x84},
|
||||
{0x0a, 0xc4},
|
||||
{0x00, 0x00}
|
||||
};
|
||||
|
||||
/* DMA Channels conversion array */
|
||||
static struct orVals orDMA[] =
|
||||
{
|
||||
{0x00, 0x01},
|
||||
{0x01, 0x02},
|
||||
{0x03, 0x03},
|
||||
{0x00, 0x00}
|
||||
};
|
||||
|
||||
/*
|
||||
* Buffers to store audio card informations
|
||||
*/
|
||||
static char AudioExcelName[CARDNAMELEN + 1];
|
||||
static char AudioExcelVersion[CARDVERLEN + 1];
|
||||
|
||||
static void
|
||||
tenmillisec (void)
|
||||
{
|
||||
|
||||
for (gc = 0; gc < 1000; gc++)
|
||||
tenmicrosec ();
|
||||
}
|
||||
|
||||
static int
|
||||
WaitForDataAvail (int port)
|
||||
{
|
||||
int loop = STATUSRETRY;
|
||||
unsigned char ret = 0;
|
||||
|
||||
do
|
||||
{
|
||||
ret = INB (port + DSP_DATAVAIL);
|
||||
/*
|
||||
* Wait for data available (bit 7 of ret == 1)
|
||||
*/
|
||||
}
|
||||
while (!(ret & 0x80) && loop--);
|
||||
|
||||
if (ret & 0x80)
|
||||
return 0;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
ReadData (int port)
|
||||
{
|
||||
if (WaitForDataAvail (port))
|
||||
return -1;
|
||||
return INB (port + DSP_READ);
|
||||
}
|
||||
|
||||
static int
|
||||
CheckDSPOkay (int port)
|
||||
{
|
||||
return ((ReadData (port) == 0xaa) ? 0 : -1);
|
||||
}
|
||||
|
||||
static int
|
||||
ResetBoard (int port)
|
||||
{
|
||||
/*
|
||||
* Reset DSP
|
||||
*/
|
||||
OUTB (1, (port + DSP_RESET));
|
||||
tenmicrosec ();
|
||||
OUTB (0, (port + DSP_RESET));
|
||||
tenmicrosec ();
|
||||
tenmicrosec ();
|
||||
return CheckDSPOkay (port);
|
||||
}
|
||||
|
||||
static int
|
||||
WriteDSPCommand (int port, int cmd)
|
||||
{
|
||||
unsigned char ret;
|
||||
int loop = HARDRETRY;
|
||||
|
||||
do
|
||||
{
|
||||
ret = INB (port + DSP_STATUS);
|
||||
/*
|
||||
* DSP ready to receive data if bit 7 of ret == 0
|
||||
*/
|
||||
if (!(ret & 0x80))
|
||||
{
|
||||
OUTB (cmd, port + DSP_COMMAND);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
while (loop--);
|
||||
|
||||
printk ("[aedsp16] DSP Command (0x%x) timeout.\n", cmd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
InitMSS (int port)
|
||||
{
|
||||
|
||||
tenmillisec ();
|
||||
|
||||
if (WriteDSPCommand (port, CMD6))
|
||||
{
|
||||
printk ("[aedsp16] CMD 0x%x: failed!\n", CMD6);
|
||||
return -1;
|
||||
}
|
||||
|
||||
tenmillisec ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
SetUpBoard (int port)
|
||||
{
|
||||
int loop = RETRY;
|
||||
|
||||
do
|
||||
{
|
||||
if (WriteDSPCommand (portbase, CMD3))
|
||||
{
|
||||
printk ("[aedsp16] CMD 0x%x: failed!\n", CMD3);
|
||||
return -1;
|
||||
}
|
||||
|
||||
tenmillisec ();
|
||||
|
||||
}
|
||||
while (WaitForDataAvail (port) && loop--);
|
||||
|
||||
#if defined(THIS_SHOULD_GO_AWAY)
|
||||
if (CheckDSPOkay (port))
|
||||
{
|
||||
printk ("[aedsp16] CheckDSPOkay: failed\n");
|
||||
return -1;
|
||||
}
|
||||
#else
|
||||
if (ReadData (port) == -1)
|
||||
{
|
||||
printk ("[aedsp16] ReadData after CMD 0x%x: failed\n", CMD3);
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (WriteDSPCommand (portbase, CMD4))
|
||||
{
|
||||
printk ("[aedsp16] CMD 0x%x: failed!\n", CMD4);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (WriteDSPCommand (portbase, CMD5))
|
||||
{
|
||||
printk ("[aedsp16] CMD 0x%x: failed!\n", CMD5);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (WriteDSPCommand (portbase, oredparams))
|
||||
{
|
||||
printk ("[aedsp16] Initialization of (M)IRQ and DMA: failed!\n");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
GetCardVersion (int port)
|
||||
{
|
||||
int len = 0;
|
||||
int ret;
|
||||
int ver[3];
|
||||
|
||||
do
|
||||
{
|
||||
if ((ret = ReadData (port)) == -1)
|
||||
return -1;
|
||||
/*
|
||||
* We alredy know how many int are stored (2), so we know when the
|
||||
* string is finished.
|
||||
*/
|
||||
ver[len++] = ret;
|
||||
}
|
||||
while (len < CARDVERLEN);
|
||||
sprintf (AudioExcelVersion, "%d.%d", ver[0], ver[1]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
GetCardName (int port)
|
||||
{
|
||||
int len = 0;
|
||||
int ret;
|
||||
|
||||
do
|
||||
{
|
||||
if ((ret = ReadData (port)) == -1)
|
||||
/*
|
||||
* If no more data availabe, return to the caller, no error if len>0.
|
||||
* We have no other way to know when the string is finished.
|
||||
*/
|
||||
return (len ? 0 : -1);
|
||||
|
||||
AudioExcelName[len++] = ret;
|
||||
|
||||
}
|
||||
while (len < CARDNAMELEN);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
InitializeHardParams (void)
|
||||
{
|
||||
|
||||
memset (AudioExcelName, 0, CARDNAMELEN + 1);
|
||||
memset (AudioExcelVersion, 0, CARDVERLEN + 1);
|
||||
|
||||
for (gc = 0; orIRQ[gc].or; gc++)
|
||||
if (orIRQ[gc].val == irq)
|
||||
oredparams |= orIRQ[gc].or;
|
||||
|
||||
for (gc = 0; orMIRQ[gc].or; gc++)
|
||||
if (orMIRQ[gc].or == mirq)
|
||||
oredparams |= orMIRQ[gc].or;
|
||||
|
||||
for (gc = 0; orDMA[gc].or; gc++)
|
||||
if (orDMA[gc].val == dma)
|
||||
oredparams |= orDMA[gc].or;
|
||||
}
|
||||
|
||||
static int
|
||||
InitAEDSP16 (int which)
|
||||
{
|
||||
static char *InitName = NULL;
|
||||
|
||||
InitializeHardParams ();
|
||||
|
||||
if (ResetBoard (portbase))
|
||||
{
|
||||
printk ("[aedsp16] ResetBoard: failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
#if defined(THIS_SHOULD_GO_AWAY)
|
||||
if (CheckDSPOkay (portbase))
|
||||
{
|
||||
printk ("[aedsp16] CheckDSPOkay: failed!\n");
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (WriteDSPCommand (portbase, CMD1))
|
||||
{
|
||||
printk ("[aedsp16] CMD 0x%x: failed!\n", CMD1);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (GetCardName (portbase))
|
||||
{
|
||||
printk ("[aedsp16] GetCardName: failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* My AEDSP16 card return SC-6000 in AudioExcelName, so
|
||||
* if we have something different, we have to be warned.
|
||||
*/
|
||||
if (strcmp ("SC-6000", AudioExcelName))
|
||||
printk ("[aedsp16] Warning: non SC-6000 audio card!\n");
|
||||
|
||||
if (WriteDSPCommand (portbase, CMD2))
|
||||
{
|
||||
printk ("[aedsp16] CMD 0x%x: failed!\n", CMD2);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (GetCardVersion (portbase))
|
||||
{
|
||||
printk ("[aedsp16] GetCardVersion: failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (SetUpBoard (portbase))
|
||||
{
|
||||
printk ("[aedsp16] SetUpBoard: failed!\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (which == INIT_MSS)
|
||||
{
|
||||
if (InitMSS (portbase))
|
||||
{
|
||||
printk ("[aedsp16] Can't initialize Microsoft Sound System mode.\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If we are resetting, do not print any message because we may be
|
||||
* in playing and we do not want lost too much time.
|
||||
*/
|
||||
if (!(which & RESET_DSP16))
|
||||
{
|
||||
if (which & INIT_MPU401)
|
||||
InitName = "MPU401";
|
||||
else if (which & INIT_SBPRO)
|
||||
InitName = "SBPro";
|
||||
else if (which & INIT_MSS)
|
||||
InitName = "MSS";
|
||||
else
|
||||
InitName = "None";
|
||||
|
||||
printk ("Audio Excel DSP 16 init v%s (%s %s) [%s]\n",
|
||||
VERSION, AudioExcelName,
|
||||
AudioExcelVersion, InitName);
|
||||
}
|
||||
|
||||
tenmillisec ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(AEDSP16_SBPRO)
|
||||
|
||||
int
|
||||
InitAEDSP16_SBPRO (struct address_info *hw_config)
|
||||
{
|
||||
/*
|
||||
* If the card is alredy init'ed MSS, we can not init it to SBPRO too
|
||||
* because the board can not emulate simultaneously MSS and SBPRO.
|
||||
*/
|
||||
if (ae_init & INIT_MSS)
|
||||
return -1;
|
||||
if (ae_init & INIT_SBPRO)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* For now we will leave this
|
||||
* code included only when INCLUDE_AEDSP16 is configured in, but it should
|
||||
* be better include it every time.
|
||||
*/
|
||||
if (!(ae_init & INIT_MPU401))
|
||||
{
|
||||
if (check_region (hw_config->io_base, 0x0f))
|
||||
{
|
||||
printk ("AEDSP16/SBPRO I/O port region is alredy in use.\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up the internal hardware parameters, to let the driver reach
|
||||
* the Sound Card.
|
||||
*/
|
||||
portbase = hw_config->io_base;
|
||||
irq = hw_config->irq;
|
||||
dma = hw_config->dma;
|
||||
if (InitAEDSP16 (INIT_SBPRO))
|
||||
return -1;
|
||||
|
||||
if (!(ae_init & INIT_MPU401))
|
||||
request_region (hw_config->io_base, 0x0f, "aedsp16 (sbpro)");
|
||||
|
||||
ae_init |= INIT_SBPRO;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* AEDSP16_SBPRO */
|
||||
|
||||
#if defined(AEDSP16_MSS)
|
||||
|
||||
int
|
||||
InitAEDSP16_MSS (struct address_info *hw_config)
|
||||
{
|
||||
/*
|
||||
* If the card is alredy init'ed SBPRO, we can not init it to MSS too
|
||||
* because the board can not emulate simultaneously MSS and SBPRO.
|
||||
*/
|
||||
if (ae_init & INIT_SBPRO)
|
||||
return -1;
|
||||
if (ae_init & INIT_MSS)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* For now we will leave this
|
||||
* code included only when INCLUDE_AEDSP16 is configured in, but it should
|
||||
* be better include it every time.
|
||||
*/
|
||||
if (check_region (hw_config->io_base, 0x08))
|
||||
{
|
||||
printk ("MSS I/O port region is alredy in use.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* We must allocate the AEDSP16 region too because these are the I/O ports
|
||||
* to access card's control registers.
|
||||
*/
|
||||
if (!(ae_init & INIT_MPU401))
|
||||
{
|
||||
if (check_region (AEDSP16_BASE, 0x0f))
|
||||
{
|
||||
printk ("AEDSP16 I/O port region is alredy in use.\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* If we are configuring the card for MSS, the portbase for card configuration
|
||||
* is the default one (0x220 unless you have changed the factory default
|
||||
* with board switches), so no need to modify the portbase variable.
|
||||
* The default is AEDSP16_BASE, that is the right value.
|
||||
*/
|
||||
irq = hw_config->irq;
|
||||
dma = hw_config->dma;
|
||||
if (InitAEDSP16 (INIT_MSS))
|
||||
return -1;
|
||||
|
||||
request_region (hw_config->io_base, 0x08, "aedsp16 (mss)");
|
||||
|
||||
if (!(ae_init & INIT_MPU401))
|
||||
request_region (AEDSP16_BASE, 0x0f, "aedsp16 (sbpro)");
|
||||
|
||||
ae_init |= INIT_MSS;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* AEDSP16_MSS */
|
||||
|
||||
#if defined(AEDSP16_MPU401)
|
||||
|
||||
int
|
||||
InitAEDSP16_MPU401 (struct address_info *hw_config)
|
||||
{
|
||||
if (ae_init & INIT_MPU401)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* For now we will leave this
|
||||
* code included only when INCLUDE_AEDSP16 is configured in, but it should
|
||||
* be better include it every time.
|
||||
*/
|
||||
if (check_region (hw_config->io_base, 0x02))
|
||||
{
|
||||
printk ("SB I/O port region is alredy in use.\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* We must allocate the AEDSP16 region too because these are the I/O ports
|
||||
* to access card's control registers.
|
||||
*/
|
||||
if (!(ae_init & (INIT_MSS | INIT_SBPRO)))
|
||||
{
|
||||
if (check_region (AEDSP16_BASE, 0x0f))
|
||||
{
|
||||
printk ("AEDSP16 I/O port region is alredy in use.\n");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If mpu401, the irq and dma are not important, do not touch it
|
||||
* because we may use the default if sbpro is not yet configured,
|
||||
* we may use the sbpro ones if configured, and nothing wrong
|
||||
* should happen.
|
||||
*
|
||||
* The mirq default is 0, but once set it to non-0 value, we should
|
||||
* not touch it anymore (unless I write an ioctl to do it, of course).
|
||||
*/
|
||||
mirq = hw_config->irq;
|
||||
if (InitAEDSP16 (INIT_MPU401))
|
||||
return -1;
|
||||
|
||||
request_region (hw_config->io_base, 0x02, "aedsp16 (mpu401)");
|
||||
|
||||
if (!(ae_init & (INIT_MSS | INIT_SBPRO)))
|
||||
request_region (AEDSP16_BASE, 0x0f, "aedsp16 (sbpro)");
|
||||
|
||||
ae_init |= INIT_MPU401;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* AEDSP16_MPU401 */
|
||||
|
||||
#if 0 /* Leave it out for now. We are not using this portion of code. */
|
||||
|
||||
/*
|
||||
* Entry point for a reset function.
|
||||
* May be I will write the infamous ioctl :)
|
||||
*/
|
||||
int
|
||||
ResetAEDSP16 (void)
|
||||
{
|
||||
#if defined(AEDSP16_DEBUG)
|
||||
printk ("[aedsp16] ResetAEDSP16 called.\n");
|
||||
#endif
|
||||
return InitAEDSP16 (RESET_DSP16);
|
||||
}
|
||||
|
||||
#endif /* 0 */
|
||||
|
||||
#endif /* !EXCLUDE_AEDSP16 */
|
|
@ -27,7 +27,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIGURE_SOUNDCARD
|
||||
#ifndef EXCLUDE_AUDIO
|
||||
|
|
|
@ -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 */
|
|
@ -28,7 +28,11 @@
|
|||
*/
|
||||
|
||||
#define _DEV_TABLE_C_
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIGURE_SOUNDCARD
|
||||
|
||||
|
|
|
@ -27,7 +27,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIGURE_SOUNDCARD
|
||||
|
||||
|
|
|
@ -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
|
|
@ -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)
|
|
@ -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
|
||||
};
|
|
@ -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<n;i++)
|
||||
{
|
||||
if (fscanf(inf, "%02x", &c) != 1)
|
||||
ABANDON("File format error");
|
||||
if (addr >= 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, "%s[] = {\n", varline);
|
||||
|
||||
for (i=0;i<l;i++)
|
||||
{
|
||||
if (i) fprintf(outf, ",");
|
||||
if (i && !(i % 16)) fprintf(outf, "\n");
|
||||
fprintf(outf, "0x%02x", buf[i]);
|
||||
}
|
||||
|
||||
fprintf(outf, "\n};\n\n");
|
||||
fclose(inf);
|
||||
fclose(outf);
|
||||
return 1;
|
||||
}
|
|
@ -57,7 +57,7 @@
|
|||
# define GUSMAX_MIXER
|
||||
#endif
|
||||
|
||||
#include <sb.h>
|
||||
#include "sb.h"
|
||||
#if NSB == 0 && !defined(EXCLUDE_SB)
|
||||
#define EXCLUDE_SB
|
||||
#endif
|
||||
|
@ -72,7 +72,7 @@
|
|||
#define EXCLUDE_SB16MIDI
|
||||
#endif
|
||||
|
||||
#include <pas.h>
|
||||
#include "pas.h"
|
||||
#if NPAS == 0 && !defined(EXCLUDE_PAS)
|
||||
#define EXCLUDE_PAS
|
||||
#endif
|
||||
|
|
|
@ -1,91 +0,0 @@
|
|||
|
||||
/*
|
||||
* Initialization code for OPTI MAD16 interface chip by
|
||||
* Davor Jadrijevic <davor@emard.pub.hr>
|
||||
* (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;
|
||||
};
|
||||
|
|
@ -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 */
|
||||
};
|
|
@ -30,7 +30,11 @@
|
|||
#define USE_SEQ_MACROS
|
||||
#define USE_SIMPLE_MACROS
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_MIDI)
|
||||
|
||||
|
|
|
@ -1,48 +0,0 @@
|
|||
int midi_synth_ioctl (int dev,
|
||||
unsigned int cmd, unsigned int 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);
|
||||
|
||||
|
||||
#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
|
||||
};
|
||||
#endif
|
|
@ -27,7 +27,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
static void drain_midi_queue __P((int dev));
|
||||
|
||||
|
|
|
@ -34,7 +34,11 @@
|
|||
* hooft@chem.ruu.nl
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_YM3812)
|
||||
|
||||
|
|
|
@ -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 physical_voices[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}}
|
||||
};
|
|
@ -1,353 +0,0 @@
|
|||
#ifndef _OS_H_
|
||||
#define _OS_H_
|
||||
/*
|
||||
* OS specific settings for FreeBSD
|
||||
*
|
||||
* This chould be used as an example when porting the driver to a new
|
||||
* operating systems.
|
||||
*
|
||||
* What you should do is to rewrite the soundcard.c and os.h (this file).
|
||||
* You should create a new subdirectory and put these two files there.
|
||||
* In addition you have to do a makefile.<OS>.
|
||||
*
|
||||
* If you have to make changes to other than these two files, please contact me
|
||||
* before making the changes. It's possible that I have already made the
|
||||
* change.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Insert here the includes required by your kernel.
|
||||
*/
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/systm.h>
|
||||
#include <sys/proc.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/filio.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/kernel.h>
|
||||
#include <sys/syslog.h>
|
||||
#include <sys/errno.h>
|
||||
#include <sys/malloc.h>
|
||||
#include <sys/buf.h>
|
||||
#include <i386/isa/isa_device.h>
|
||||
#include <machine/cpufunc.h>
|
||||
#include <sys/signalvar.h>
|
||||
|
||||
#if NSND > 0
|
||||
#define CONFIGURE_SOUNDCARD
|
||||
#else
|
||||
#undef CONFIGURED_SOUNDCARD
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Rest of the file is compiled only if the driver is really required.
|
||||
*/
|
||||
#ifdef CONFIGURE_SOUNDCARD
|
||||
|
||||
/*
|
||||
* select() is currently implemented in Linux specific way. Don't enable.
|
||||
* I don't remember what the SHORT_BANNERS means so forget it.
|
||||
*/
|
||||
|
||||
/*#undef ALLOW_SELECT*/
|
||||
#define SHORT_BANNERS
|
||||
|
||||
/* The soundcard.h could be in a nonstandard place so inclyde it here. */
|
||||
#include <machine/soundcard.h>
|
||||
|
||||
/*
|
||||
* Here is the first portability problem. Every OS has it's own way to
|
||||
* pass a pointer to the buffer in read() and write() calls. In Linux it's
|
||||
* just a char*. In BSD it's struct uio. This parameter is passed to
|
||||
* all functions called from read() or write(). Since nothing can be
|
||||
* assumed about this structure, the driver uses set of macros for
|
||||
* accessing the user buffer.
|
||||
*
|
||||
* The driver reads/writes bytes in the user buffer sequentially which
|
||||
* means that calls like uiomove() can be used.
|
||||
*
|
||||
* snd_rw_buf is the type which is passed to the device file specific
|
||||
* read() and write() calls.
|
||||
*
|
||||
* The following macros are used to move date to and from the
|
||||
* user buffer. These macros should be used only when the
|
||||
* target or source parameter has snd_rw_buf type.
|
||||
* The offs parameter is a offset relative to the beginning of
|
||||
* the user buffer. In Linux the offset is required but for example
|
||||
* BSD passes the offset info in the uio structure. It could be usefull
|
||||
* if these macros verify that the offs parameter and the value in
|
||||
* the snd_rw_buf structure are equal.
|
||||
*/
|
||||
typedef struct uio snd_rw_buf;
|
||||
|
||||
/*
|
||||
* Move bytes from the buffer which the application given in a
|
||||
* write() call.
|
||||
* offs is position relative to the beginning of the buffer in
|
||||
* user space. The count is number of bytes to be moved.
|
||||
*/
|
||||
#define COPY_FROM_USER(target, source, offs, count) \
|
||||
do { if (uiomove((caddr_t ) target, count, (struct uio *)source)) { \
|
||||
printf ("sb: Bad copyin()!\n"); \
|
||||
} } while(0)
|
||||
|
||||
/* Like COPY_FOM_USER but for writes. */
|
||||
|
||||
#define COPY_TO_USER(target, offs, source, count) \
|
||||
do { if (uiomove(source, count, (struct uio *)target)) { \
|
||||
printf ("sb: Bad copyout()!\n"); \
|
||||
} } while(0)
|
||||
/*
|
||||
* The following macros are like COPY_*_USER but work just with one byte (8bit),
|
||||
* short (16 bit) or long (32 bit) at a time.
|
||||
* The same restrictions apply than for COPY_*_USER
|
||||
*/
|
||||
#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 GET_WORD_FROM_USER(target, addr, offs) {uiomove((char*)&(target), 4, (struct uio *)addr);}
|
||||
#define PUT_WORD_TO_USER(addr, offs, data) {uiomove((char*)&(data), 4, (struct uio *)addr);}
|
||||
|
||||
|
||||
#define EREMOTEIO -1
|
||||
|
||||
/*
|
||||
* The way how the ioctl arguments are passed is another nonportable thing.
|
||||
* In Linux the argument is just a pointer directly to the user segment. On
|
||||
* FreeBSD the data is already moved to the kernel space. The following
|
||||
* macros should handle the difference.
|
||||
*/
|
||||
|
||||
/*
|
||||
* IOCTL_FROM_USER is used to copy a record pointed by the argument to
|
||||
* a buffer in the kernel space. On FreeBSD it can be done just by calling
|
||||
* memcpy. With Linux a memcpy_from_fs should be called instead.
|
||||
* Parameters of the following macros are like in the COPY_*_USER macros.
|
||||
*/
|
||||
|
||||
/*
|
||||
* When the ioctl argument points to a record or array (longer than 32 bits),
|
||||
* the macros IOCTL_*_USER are used. It's assumed that the source and target
|
||||
* parameters are direct memory addresses.
|
||||
*/
|
||||
#define IOCTL_FROM_USER(target, source, offs, count) {memcpy(target, &((source)[offs]), count);}
|
||||
#define IOCTL_TO_USER(target, offs, source, count) {memcpy(&((target)[offs]), source, count);}
|
||||
/* The following macros are used if the ioctl argument points to 32 bit int */
|
||||
#define IOCTL_IN(arg) (*(int*)arg)
|
||||
#define IOCTL_OUT(arg, ret) *(int*)arg = ret
|
||||
|
||||
/*
|
||||
* When the driver displays something to the console, printk() will be called.
|
||||
* The name can be changed here.
|
||||
*/
|
||||
#define printk printf
|
||||
|
||||
/*
|
||||
* The following macros define an interface to the process management.
|
||||
*/
|
||||
|
||||
struct snd_wait {
|
||||
int mode;
|
||||
int aborting;
|
||||
};
|
||||
|
||||
/*
|
||||
* DEFINE_WAIT_QUEUE is used where a wait queue is required. It must define
|
||||
* a structure which can be passed as a parameter to a sleep(). The second
|
||||
* parameter is name of a flag variable (must be defined as int).
|
||||
*/
|
||||
#define DEFINE_WAIT_QUEUE(qname, flag) static int *qname = NULL; \
|
||||
static volatile struct snd_wait flag = {0}
|
||||
/* Like the above but defines an array of wait queues and flags */
|
||||
#define DEFINE_WAIT_QUEUES(qname, flag) static int *qname = {NULL}; \
|
||||
static volatile struct snd_wait flag = {{0}}
|
||||
|
||||
#define RESET_WAIT_QUEUE(q, f) {f.aborting = 0;f.mode = WK_NONE;}
|
||||
#define SET_ABORT_FLAG(q, f) f.aborting = 1
|
||||
#define TIMED_OUT(q, f) (f.mode & WK_TIMEOUT)
|
||||
#define SOMEONE_WAITING(q, f) (f.mode & WK_SLEEP)
|
||||
/*
|
||||
* This driver handles interrupts little bit nonstandard way. The following
|
||||
* macro is used to test if the current process has received a signal which
|
||||
* is aborts the process. This macro is called from close() to see if the
|
||||
* buffers should be discarded. If this kind info is not available, a constant
|
||||
* 1 or 0 could be returned (1 should be better than 0).
|
||||
*/
|
||||
#define PROCESS_ABORTING(q, f) (f.aborting || CURSIG(curproc))
|
||||
|
||||
/*
|
||||
* 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; \
|
||||
}
|
||||
/* An the following wakes up a process */
|
||||
#define WAKE_UP(q, f) wakeup(&q)
|
||||
|
||||
/*
|
||||
* Timing macros. This driver assumes that there is a timer running in the
|
||||
* kernel. The timer should return a value which is increased once at every
|
||||
* timer tick. The macro HZ should return the number of such ticks/sec.
|
||||
*/
|
||||
|
||||
#ifndef HZ
|
||||
#define HZ hz
|
||||
#endif
|
||||
|
||||
/*
|
||||
* GET_TIME() returns current value of the counter incremented at timer
|
||||
* ticks. This can overflow, so the timeout might be real big...
|
||||
*
|
||||
*/
|
||||
|
||||
extern unsigned long get_time(void);
|
||||
#define GET_TIME() get_time()
|
||||
/*#define GET_TIME() (lbolt) */ /* Returns current time (1/HZ secs since boot) */
|
||||
|
||||
/*
|
||||
* The following three macros are called before and after atomic
|
||||
* code sequences. The flags parameter has always type of unsigned long.
|
||||
* The macro DISABLE_INTR() should ensure that all interrupts which
|
||||
* may invoke any part of the driver (timer, soundcard interrupts) are
|
||||
* disabled.
|
||||
* RESTORE_INTR() should return the interrupt status back to the
|
||||
* state when DISABLE_INTR() was called. The flags parameter is
|
||||
* a variable which can carry 32 bits of state information between
|
||||
* DISABLE_INTR() and RESTORE_INTR() calls.
|
||||
*/
|
||||
#define DISABLE_INTR(flags) flags = splhigh()
|
||||
#define RESTORE_INTR(flags) splx(flags)
|
||||
|
||||
/*
|
||||
* INB() and OUTB() should be obvious. NOTE! The order of
|
||||
* paratemeters of OUTB() is different than on some other
|
||||
* operating systems.
|
||||
*/
|
||||
|
||||
#define INB inb
|
||||
#define INW inb
|
||||
|
||||
#if 0
|
||||
/*
|
||||
* The outb(0, 0x80) is just for slowdown. It's bit unsafe since
|
||||
* this address could be used for something usefull.
|
||||
*/
|
||||
#ifdef PC98
|
||||
#define OUTB(addr, data) {outb(data, addr);outb(0x5f, 0);}
|
||||
#define OUTW(addr, data) {outw(data, addr);outb(0x5f, 0);}
|
||||
#else
|
||||
#define OUTB(addr, data) {outb(data, addr);outb(0, 0x80);}
|
||||
#define OUTW(addr, data) {outw(data, addr);outb(0, 0x80);}
|
||||
#endif
|
||||
#else
|
||||
#define OUTB(addr, data) outb(data, addr)
|
||||
#define OUTW(addr, data) outw(data, addr)
|
||||
#endif
|
||||
|
||||
/* memcpy() was not defined on FreeBSD. Lets define it here */
|
||||
#define memcpy(d, s, c) bcopy(s, d, c)
|
||||
|
||||
/*
|
||||
* When a error (such as EINVAL) is returned by a function,
|
||||
* the following macro is used. The driver assumes that a
|
||||
* error is signalled by returning a negative value.
|
||||
*/
|
||||
|
||||
#define RET_ERROR(err) -(err)
|
||||
|
||||
/*
|
||||
KERNEL_MALLOC() allocates requested number of memory and
|
||||
KERNEL_FREE is used to free it.
|
||||
These macros are never called from interrupt, in addition the
|
||||
nbytes will never be more than 4096 bytes. Generally the driver
|
||||
will allocate memory in blocks of 4k. If the kernel has just a
|
||||
page level memory allocation, 4K can be safely used as the size
|
||||
(the nbytes parameter can be ignored).
|
||||
*/
|
||||
#define KERNEL_MALLOC(nbytes) malloc(nbytes, M_TEMP, M_WAITOK)
|
||||
#define KERNEL_FREE(addr) free(addr, M_TEMP)
|
||||
|
||||
/*
|
||||
* The macro PERMANENT_MALLOC(typecast, mem_ptr, size, linux_ptr)
|
||||
* returns size bytes of
|
||||
* (kernel virtual) memory which will never get freed by the driver.
|
||||
* This macro is called only during boot. The linux_ptr is a linux specific
|
||||
* parameter which should be ignored in other operating systems.
|
||||
* The mem_ptr is a pointer variable where the macro assigns pointer to the
|
||||
* memory area. The type is the type of the mem_ptr.
|
||||
*/
|
||||
#define PERMANENT_MALLOC(typecast, mem_ptr, size, linux_ptr) \
|
||||
{mem_ptr = (typecast)malloc(size, M_DEVBUF, M_NOWAIT); \
|
||||
if (!mem_ptr)panic("SOUND: Cannot allocate memory\n");}
|
||||
|
||||
/*
|
||||
* The macro DEFINE_TIMER defines variables for the ACTIVATE_TIMER if
|
||||
* required. The name is the variable/name to be used and the proc is
|
||||
* the procedure to be called when the timer expires.
|
||||
*/
|
||||
|
||||
#define DEFINE_TIMER(name, proc)
|
||||
|
||||
/*
|
||||
* The ACTIVATE_TIMER requests system to call 'proc' after 'time' ticks.
|
||||
*/
|
||||
|
||||
#define ACTIVATE_TIMER(name, proc, time) \
|
||||
timeout((timeout_func_t)proc, 0, time);
|
||||
/*
|
||||
* The rest of this file is not complete yet. The functions using these
|
||||
* macros will not work
|
||||
*/
|
||||
#define ALLOC_DMA_CHN(chn,deviceID) (isa_dma_acquire(chn))
|
||||
#define RELEASE_DMA_CHN(chn) (isa_dma_release(chn))
|
||||
#define DMA_MODE_READ 0
|
||||
#define DMA_MODE_WRITE 1
|
||||
#define RELEASE_IRQ(irq_no)
|
||||
|
||||
/*
|
||||
* The macro DECLARE_FILE() adds an entry to struct fileinfo referencing the
|
||||
* connected filestructure.
|
||||
* This entry must be initialized in sound_open() in soundcard.c
|
||||
*
|
||||
* ISSET_FILE_FLAG() allows checking of flags like O_NONBLOCK on files
|
||||
*
|
||||
*/
|
||||
|
||||
#define DECLARE_FILE() struct file *filp
|
||||
#ifdef notdef
|
||||
#define ISSET_FILE_FLAG(fileinfo, flag) (fileinfo->filp->f_flag & (flag) ? \
|
||||
1 : 0)
|
||||
#else
|
||||
#define ISSET_FILE_FLAG(fileinfo, flag) 0
|
||||
#endif
|
||||
#define INT_HANDLER_PROTO() void(*hndlr)(int)
|
||||
#define INT_HANDLER_PARMS(irq, parms) int irq
|
||||
#define INT_HANDLER_CALL(irq) irq
|
||||
|
||||
/*
|
||||
* For select call...
|
||||
*/
|
||||
#ifdef ALLOW_SELECT
|
||||
typedef struct proc select_table;
|
||||
#define SEL_IN FREAD
|
||||
#define SEL_OUT FWRITE
|
||||
#define SEL_EX 0
|
||||
extern struct selinfo selinfo[];
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
|
@ -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 */
|
|
@ -28,7 +28,11 @@
|
|||
*/
|
||||
|
||||
#define PATMGR_C
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SEQUENCER)
|
||||
|
||||
|
|
|
@ -34,7 +34,11 @@
|
|||
/*
|
||||
* #define DEB_DMARES
|
||||
*/
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
#include <i386/isa/sound/sb.h>
|
||||
#include <i386/isa/sound/sb_mixer.h>
|
||||
|
||||
|
|
|
@ -27,7 +27,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIGURE_SOUNDCARD
|
||||
|
||||
|
|
|
@ -30,7 +30,11 @@
|
|||
* - Added the Audio Excel DSP 16 initialization routine.
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB)
|
||||
|
||||
|
|
|
@ -33,7 +33,11 @@
|
|||
* Code added for MV ProSonic/Jazz 16 in 16 bit mode
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB)
|
||||
|
||||
|
|
|
@ -27,7 +27,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB) && !defined(EXCLUDE_MIDI)
|
||||
|
||||
|
|
|
@ -32,7 +32,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#if defined(CONFIGURE_SOUNDCARD) && !defined(EXCLUDE_SB) && !defined(EXCLUDE_SBPRO)
|
||||
#define __SB_MIXER_C__
|
||||
|
|
|
@ -1,256 +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__
|
||||
static mixer_tab sbpro_mix = {
|
||||
MIX_ENT(SOUND_MIXER_VOLUME, 0x22, 7, 4, 0x22, 3, 4),
|
||||
MIX_ENT(SOUND_MIXER_BASS, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_TREBLE, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_SYNTH, 0x26, 7, 4, 0x26, 3, 4),
|
||||
MIX_ENT(SOUND_MIXER_PCM, 0x04, 7, 4, 0x04, 3, 4),
|
||||
MIX_ENT(SOUND_MIXER_SPEAKER, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_LINE, 0x2e, 7, 4, 0x2e, 3, 4),
|
||||
MIX_ENT(SOUND_MIXER_MIC, 0x0a, 2, 3, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_CD, 0x28, 7, 4, 0x28, 3, 4),
|
||||
MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_RECLEV, 0x00, 0, 0, 0x00, 0, 0)
|
||||
};
|
||||
|
||||
#ifdef __SGNXPRO__
|
||||
static mixer_tab sgnxpro_mix = {
|
||||
MIX_ENT(SOUND_MIXER_VOLUME, 0x22, 7, 4, 0x22, 3, 4),
|
||||
MIX_ENT(SOUND_MIXER_BASS, 0x46, 2, 3, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_TREBLE, 0x44, 2, 3, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_SYNTH, 0x26, 7, 4, 0x26, 3, 4),
|
||||
MIX_ENT(SOUND_MIXER_PCM, 0x04, 7, 4, 0x04, 3, 4),
|
||||
MIX_ENT(SOUND_MIXER_SPEAKER, 0x42, 2, 3, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_LINE, 0x2e, 7, 4, 0x2e, 3, 4),
|
||||
MIX_ENT(SOUND_MIXER_MIC, 0x0a, 2, 3, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_CD, 0x28, 7, 4, 0x28, 3, 4),
|
||||
MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_RECLEV, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_IGAIN, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_OGAIN, 0x00, 0, 0, 0x00, 0, 0)
|
||||
};
|
||||
#endif
|
||||
|
||||
static mixer_tab sb16_mix = {
|
||||
MIX_ENT(SOUND_MIXER_VOLUME, 0x30, 7, 5, 0x31, 7, 5),
|
||||
MIX_ENT(SOUND_MIXER_BASS, 0x46, 7, 4, 0x47, 7, 4),
|
||||
MIX_ENT(SOUND_MIXER_TREBLE, 0x44, 7, 4, 0x45, 7, 4),
|
||||
MIX_ENT(SOUND_MIXER_SYNTH, 0x34, 7, 5, 0x35, 7, 5),
|
||||
MIX_ENT(SOUND_MIXER_PCM, 0x32, 7, 5, 0x33, 7, 5),
|
||||
MIX_ENT(SOUND_MIXER_SPEAKER, 0x3b, 7, 2, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_LINE, 0x38, 7, 5, 0x39, 7, 5),
|
||||
MIX_ENT(SOUND_MIXER_MIC, 0x3a, 7, 5, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_CD, 0x36, 7, 5, 0x37, 7, 5),
|
||||
MIX_ENT(SOUND_MIXER_IMIX, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_ALTPCM, 0x00, 0, 0, 0x00, 0, 0),
|
||||
MIX_ENT(SOUND_MIXER_RECLEV, 0x3f, 7, 2, 0x40, 7, 2), /* Obsolete. Use IGAIN */
|
||||
MIX_ENT(SOUND_MIXER_IGAIN, 0x3f, 7, 2, 0x40, 7, 2),
|
||||
MIX_ENT(SOUND_MIXER_OGAIN, 0x41, 7, 2, 0x42, 7, 2)
|
||||
};
|
||||
|
||||
#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
|
|
@ -28,7 +28,11 @@
|
|||
*/
|
||||
|
||||
#define SEQUENCER_C
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
#include <i386/isa/sound/midi_ctrl.h>
|
||||
|
||||
extern void seq_drain_midi_queues __P((void));
|
||||
|
|
|
@ -28,7 +28,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/local.h>
|
||||
#else
|
||||
#include <i386/isa/sound/local.h>
|
||||
#endif
|
||||
#include <i386/isa/sound/os.h>
|
||||
#include <i386/isa/sound/soundvers.h>
|
||||
|
||||
|
@ -358,8 +362,13 @@ struct channel_info {
|
|||
#define OPEN_WRITE 2
|
||||
#define OPEN_READWRITE 3
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_calls.h>
|
||||
#include <pc98/pc98/sound/dev_table.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_calls.h>
|
||||
#include <i386/isa/sound/dev_table.h>
|
||||
#endif
|
||||
|
||||
#ifndef DEB
|
||||
#define DEB(x)
|
||||
|
|
|
@ -27,7 +27,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIGURE_SOUNDCARD
|
||||
|
||||
|
|
|
@ -26,16 +26,24 @@
|
|||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* $Id: soundcard.c,v 1.43 1996/09/10 08:26:06 bde Exp $
|
||||
* $Id: soundcard.c,v 1.5 1996/09/12 11:11:59 asami Exp $
|
||||
*/
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
#include <vm/vm.h>
|
||||
#include <vm/vm_extern.h>
|
||||
|
||||
#ifdef CONFIGURE_SOUNDCARD
|
||||
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/dev_table.h>
|
||||
#else
|
||||
#include <i386/isa/sound/dev_table.h>
|
||||
#endif
|
||||
#include <i386/isa/isa_device.h>
|
||||
#include <sys/conf.h>
|
||||
#include <sys/kernel.h>
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
#define SOUND_VERSION_STRING "3.0-beta-950506"
|
|
@ -29,7 +29,11 @@
|
|||
*/
|
||||
|
||||
#define SEQUENCER_C
|
||||
#ifdef PC98
|
||||
#include <pc98/pc98/sound/sound_config.h>
|
||||
#else
|
||||
#include <i386/isa/sound/sound_config.h>
|
||||
#endif
|
||||
|
||||
#ifdef CONFIGURE_SOUNDCARD
|
||||
|
||||
|
|
|
@ -1,26 +0,0 @@
|
|||
#ifdef SEQUENCER_C
|
||||
|
||||
static unsigned short semitone_tuning[24] =
|
||||
{
|
||||
/* 0 */ 10000, 10595, 11225, 11892, 12599, 13348, 14142, 14983,
|
||||
/* 8 */ 15874, 16818, 17818, 18877, 20000, 21189, 22449, 23784,
|
||||
/* 16 */ 25198, 26697, 28284, 29966, 31748, 33636, 35636, 37755
|
||||
};
|
||||
|
||||
static unsigned short cent_tuning[100] =
|
||||
{
|
||||
/* 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
|
||||
};
|
||||
#endif
|
|
@ -25,7 +25,7 @@
|
|||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Id: syscons.c,v 1.10 1996/10/09 21:46:49 asami Exp $
|
||||
* $Id: syscons.c,v 1.11 1996/10/23 07:25:30 asami Exp $
|
||||
*/
|
||||
|
||||
#include "sc.h"
|
||||
|
@ -424,9 +424,7 @@ scprobe(struct isa_device *dev)
|
|||
gotres:
|
||||
if (retries < 0) {
|
||||
printf("scprobe: keyboard won't accept RESET command\n");
|
||||
#ifdef SC_KBD_PROBE_WORKS
|
||||
return (0);
|
||||
#endif
|
||||
goto fail;
|
||||
} else {
|
||||
i = 10; /* At most 10 retries. */
|
||||
gotack:
|
||||
|
@ -439,9 +437,7 @@ scprobe(struct isa_device *dev)
|
|||
goto gotack;
|
||||
if (val != KB_RESET_DONE) {
|
||||
printf("scprobe: keyboard RESET failed (result = 0x%02x)\n", val);
|
||||
#ifdef SC_KBD_PROBE_WORKS
|
||||
return (0);
|
||||
#endif
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
#ifdef XT_KEYBOARD
|
||||
|
@ -451,7 +447,12 @@ scprobe(struct isa_device *dev)
|
|||
outb(KB_DATA, 1);
|
||||
kbd_wait();
|
||||
#endif /* XT_KEYBOARD */
|
||||
|
||||
succeed:
|
||||
return (IO_KBDSIZE);
|
||||
|
||||
fail:
|
||||
return ((dev->id_flags & DETECT_KBD) ? 0 : IO_KBDSIZE);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* $Id: syscons.h,v 1.4 1996/10/09 21:46:51 asami Exp $
|
||||
* $Id: syscons.h,v 1.5 1996/10/23 07:25:33 asami Exp $
|
||||
*/
|
||||
|
||||
#ifndef _PC98_PC98_SYSCONS_H_
|
||||
|
@ -69,6 +69,7 @@
|
|||
#define VISUAL_BELL 0x00001
|
||||
#define BLINK_CURSOR 0x00002
|
||||
#define CHAR_CURSOR 0x00004
|
||||
#define DETECT_KBD 0x00008
|
||||
|
||||
/* attribute flags */
|
||||
#define NORMAL_ATTR 0x00
|
||||
|
|
Loading…
Reference in a new issue