Metropoli BBS
VIEWER: gus.h MODE: TEXT (ASCII)
/*

  GUS.H

  Michael Chen
  mchen@cs.psu.edu
  4/18/1993
  
  See the included .TXT file for terms and other information.

*/

#ifndef __GUS_H
#define __GUS_H

/* A few typedefs for convenience. */

typedef unsigned char byte;
typedef unsigned int word;
typedef unsigned long longword;

/* Define minimum and maximum number of voices. */

#define MINVOICES             14
#define MAXVOICES             32

/* Command (GUSCommand) defines */

#define G_SetVoiceMode        0x0
#define G_SetVoiceFreq        0x1
#define G_SetLoopStartLo      0x2
#define G_SetLoopStartHi      0x3
#define G_SetLoopEndLo        0x4
#define G_SetLoopEndHi        0x5
#define G_SetVolumeRampRate   0x6
#define G_SetVolumeRampStart  0x7
#define G_SetVolumeRampEnd    0x8
#define G_SetVolume           0x9
#define G_SetPositionLo       0xA
#define G_SetPositionHi       0xB
#define G_SetVoiceBalance     0xC
#define G_SetVolumeControl    0xD
#define G_SetMaxVoice         0xE
#define G_DMAControl          0x41
#define G_SetDRAMLo           0x43
#define G_SetDRAMHi           0x44
#define G_TimerControl        0x45
#define G_TimerSpeed          0x46
#define G_SampleControl       0x49
#define G_Initialize          0x4C
#define G_ReadVoiceMode       0x80
#define G_ReadVoiceFreq       0x81
#define G_ReadLoopStartLo     0x82
#define G_ReadLoopStartHi     0x83
#define G_ReadLoopEndLo       0x84
#define G_ReadLoopEndHi       0x85
#define G_ReadVolumeRampRate  0x86
#define G_ReadVolumeRampStart 0x87
#define G_ReadVolumeRampEnd   0x88
#define G_ReadVolume          0x89
#define G_ReadPositionLo      0x8A
#define G_ReadPositionHi      0x8B
#define G_ReadVoiceBalance    0x8C
#define G_ReadVolumeControl   0x8D
#define G_ReadMaxVoice        0x8E
#define G_IRQStatus           0x8F

/* Voice mask for use with G_Set/ReadMaxVoice. */

#define G_VoiceMask           0xC0

/* Mixer control (GUSMixer) defines */

#define M_LineInOn            0x0
#define M_LineInOff           0x1
#define M_OutputOn            0x0
#define M_OutputOff           0x2
#define M_MicInOn             0x4
#define M_MicInOff            0x0
#define M_IRQControl          0x40
#define M_DMAControl          0x0

/* Voice mode (G_Set/ReadVoiceMode) defines */

#define V_VoiceStopped        0x1
#define V_VoiceStarted        0x0
#define V_StopVoice           0x2
#define V_StartVoice          0x0
#define V_16Bit               0x4
#define V_8Bit                0x0
#define V_Loop                0x8
#define V_NoLoop              0x0
#define V_Bidirectional       0x10
#define V_Unidirectional      0x0
#define V_IRQLoop             0x20
#define V_NoIRQLoop           0x0
#define V_Forward             0x0
#define V_Backward            0x40

/* Volume control (G_Set/ReadVolumeControl) defines */

#define V_RampStopped         0x1
#define V_RampStarted         0x0
#define V_StartRamp           0x0
#define V_StopRamp            0x2
/* same V_Loop/NoLoop defines */
/* same V_Uni/Bidirectional   */
#define V_IRQRamp             0x20
#define V_NoIRQRamp           0x0
#define V_Increasing          0x0
#define V_Decreasing          0x40

/* Ramp scale defines */

#define R_Every1              0x0
#define R_Every8              0x1
#define R_Every64             0x2
#define R_Every512            0x3

/* Voice balance (pan) defines */

#define P_Center              0x7
#define P_Left                0x0
#define P_Right               0xF
 
/* Addresses of ports. */

extern int GUSBase;
extern int GUSMixer;              /* base         */
extern int GUSStatus;             /* base + 6     */
extern int GUSTimerControl;       /* base + 8     */
extern int GUSTimerData;          /* base + 9     */
extern int GUSIRQDMAControl;      /* base + 0xB   */
extern int GUSMIDIControl;        /* base + 0x100 */
extern int GUSMIDIData;           /* base + 0x101 */
extern int GUSVoice;              /* base + 0x102 */
extern int GUSCommand;            /* base + 0x103 */
extern int GUSDataLo;             /* base + 0x104 */
extern int GUSDataHi;             /* base + 0x105 */
extern int GUSDRAMIO;             /* base + 0x107 */

/* Internal variables, but can be seen externally. */

extern int GUSCurrentVoice;
extern int GUSVoices;

/* Declare frequency divisor table. */

extern byte GUSFreqDivisorTable[MAXVOICES+1];

/* Prototypes for extern routines. */

#ifdef __cplusplus
extern "C" {
#endif

extern void GUSDelay();
extern void GUSReset();
extern unsigned char GUSPeek(longword);
extern void GUSPoke(longword, byte);
extern unsigned char GUSPokePeek(longword, byte);
extern unsigned char GUS_Peek(byte, word);
extern void GUS_Poke(byte, word, byte);
extern unsigned char GUS_PokePeek(byte, word, byte);
extern int ProbeGUS();
extern int DetectGUS();

#ifdef __cplusplus
}
#endif


#define GUS_PeekSame()           (inportb(GUSDRAMIO))
#define GUS_PokeSame(x)          (outportb(GUSDRAMIO,x))

#ifdef __cplusplus
extern "C" {
#endif

extern void GUS_SelectVoice(byte);
extern void GUSSelectVoice(byte);
extern void GUSStopVoice(byte);
extern void GUSStartVoice(byte);
extern void GUSSetVoiceMode(byte voice, byte mode);
extern void GUSSetLoopStart(byte voice, longword addr);
extern void GUSSetLoopEnd(byte voice, longword addr);
extern void GUSSetPosition(byte voice, longword addr);
extern void GUSSetVoiceFreq(byte voice, word freq);
extern void GUSSetVoices(byte voices);
extern longword GUSReadLoopStart(byte voice);
extern longword GUSReadLoopEnd(byte voice);
extern longword GUSReadPosition(byte voice);
extern byte GUSReadVoiceMode(byte voice);
extern word GUSReadVoiceFreq(byte voice);
extern word GUSReadVolume(byte voice);
extern void GUSSetVolume(byte voice, word vol);
extern void GUSSetDRAM(longword addr, void* buf, longword len);
extern void GUSReadDRAM(longword addr, void* buf, longword len);
extern void GUSFillDRAM(longword addr, byte b, longword len);

#ifdef __cplusplus
}
#endif


#define GUS_SetMixer(b)          (outportb(GUSMixer,b))
#define GUS_ReadMixer()          (inportb(GUSMixer))
#define GUS_SetStatus(b)         (outportb(GUSStatus,b))
#define GUS_ReadStatus()         (inportb(GUSStatus))
#define GUS_SetTimerControl(b)   (outportb(GUSTimerControl,b))
#define GUS_ReadTimerControl()   (inportb(GUSTimerControl))
#define GUS_SetTimerData(b)      (outportb(GUSTimerData,b))
#define GUS_ReadTimerData()      (inportb(GUSTimerData))
#define GUS_SetIRQDMAControl(b)  (outport(GUSIRQDMAControl,b))
#define GUS_ReadIRQDMAControl()  (inportb(GUSIRQDMAControl))
#define GUS_SetMIDIControl(b)    (outportb(GUSMIDIControl,b))
#define GUS_ReadMIDIControl()    (inportb(GUSMIDIControl))
#define GUS_SetMIDIData(b)       (outportb(GUSMIDIData,b))
#define GUS_ReadMIDIData()       (inportb(GUSMIDIData))
#define GUS_SetVoice(b)          (outportb(GUSVoice,b))
#define GUS_ReadVoice()          (inportb(GUSVoice))
#define GUS_SetCommand(b)        (outportb(GUSCommand,b))
#define GUS_ReadCommand()        (inportb(GUSCommand))
#define GUS_SetDRAMIO(b)         (outportb(GUSDRAMIO,b))
#define GUS_ReadDRAMIO()         (inportb(GUSDRAMIO))

#ifdef __cplusplus
extern "C" {
#endif

extern void GUSSetVolumeRampRate(byte voice, byte incr, byte scale);
extern byte GUSReadVolumeRampRate(byte voice);
extern void GUSSetVolumeRampStart(byte voice, word vol);
extern void GUSSetVolumeRampEnd(byte voice, word vol);
extern word GUSReadVolumeRampStart(byte voice);
extern word GUSReadVolumeRampEnd(byte voice);
extern void GUSSetVolumeControl(byte voice, byte mode);
extern byte GUSReadVolumeControl(byte voice);
extern void GUSSetMixer(byte mode);
extern byte GUSReadMixer();
extern void GUSShutUp();
extern void GUSStartRamp(byte voice);
extern void GUSStopRamp(byte voice);
extern void GUSSetVoiceBalance(byte voice, byte pan);
extern byte GUSReadVoiceBalance(byte voice);

#ifdef __cplusplus
}
#endif

#endif
[ RETURN TO DIRECTORY ]