/* audio_hard.c */ /* access to the audio hardware */ /* $Author: Espie $ * $Date: 91/05/20 22:44:23 $ * $Revision: 1.24 $ * $Log: audio_hard.c,v $ * Revision 1.24 91/05/20 22:44:23 Espie * *** empty log message *** * * Revision 1.23 91/05/16 15:04:17 Espie * Modified stuff for more compatibility with other compilers. * * Revision 1.22 91/05/12 22:38:42 Espie * Included right prototypes. * * Revision 1.21 91/05/05 19:06:56 Espie * *** empty log message *** * * Revision 1.20 91/05/05 15:39:36 Espie * Got rid of local variables. Enforcer hits free. * * Revision 1.19 91/05/02 23:32:37 Espie * *** empty log message *** * * Revision 1.18 91/04/30 00:36:12 Espie * Stable version III. * * Revision 1.17 91/04/29 15:07:15 Espie * Cleaned-up. * * Revision 1.16 91/04/27 20:48:06 Espie * Doesn't need to suppress the interrupts, finally. * * Revision 1.15 91/04/27 16:44:04 Espie * Moved interrupts disabling from audio_soft. * * Revision 1.14 91/04/27 04:00:22 Espie * saved the mask for a channel (gain ????). * * Revision 1.13 91/04/26 16:30:11 Espie * added turn_on_dma(). * between() is now obsolescent. * * Revision 1.12 91/04/26 01:29:45 Espie * Fixed trivial bug with filter_restore() * (was restoring the OPPOSITE state). * * Revision 1.11 91/04/25 02:06:30 Espie * There was a bug with the filter on command. * There is now a bug with the automatic recovery * of the filter state. Doesn't work as it should. * * Revision 1.10 91/04/23 21:32:44 Espie * New function: restart_dma(). * * Revision 1.1 91/04/23 21:31:43 Espie * Initial revision * * Revision 1.9 91/04/21 12:10:58 Espie * Stable version, known as bunch II. * Also features ``right'' log description. * * Revision 1.8 91/04/21 11:16:01 Espie * * Revision 1.7 91/04/20 18:14:34 Espie * New audio routines, they do only what they have to do. * Symbolic constants everywhere. * Added audio filter control. * * Revision 1.6 91/04/19 13:22:32 Espie * * Revision 1.5 91/04/19 02:18:00 Espie * simplified audio.c, since we can change period/volume on the run * without more care. * * Revision 1.4 91/04/18 20:23:07 Espie * no big change in this file. * * Revision 1.3 91/04/18 02:26:00 Espie * bunch I. * Revision 1.2 91/04/18 02:18:25 Espie * First ``real'' interface with the hardware. * * Revision 1.1 91/04/17 18:51:36 Espie * Initial revision * */ #include #include #include #include #include #include #include #include "song.h" #include "player.h" #include "proto.h" #include "lproto.h" BOOL saved_filter; #ifdef LATTICE #define FAR_SUPPORT __far #else #error #endif extern volatile struct Custom FAR_SUPPORT custom; extern volatile struct CIA FAR_SUPPORT ciaa; void init_audio_hard(struct priv_play *private) { private->channel_mask[0] = DMAF_AUD0; private->channel_mask[1] = DMAF_AUD1; private->channel_mask[2] = DMAF_AUD2; private->channel_mask[3] = DMAF_AUD3; private->mask = 0; } void clear_mask(struct priv_play *private) { private->mask = 0; } void turn_on_dma(struct priv_play *private) { custom.dmacon = private->mask | DMAF_SETCLR | DMAF_MASTER; } void set_note(struct priv_play *private, struct sample_info *i, int channel, int period) { custom.dmacon = private->channel_mask[channel]; private->mask |= private->channel_mask[channel]; custom.aud[channel].ac_ptr = i->start; custom.aud[channel].ac_len = i->length; custom.aud[channel].ac_per = period; } void change_volume(struct priv_play *private, int channel, int volume) { custom.aud[channel].ac_vol = volume; } void change_period(struct priv_play *private, int channel, int period) { custom.aud[channel].ac_per = period; } void set_replay(struct priv_play *private, struct sample_info *i, int channel) { private->mask |= private->channel_mask[channel]; custom.aud[channel].ac_ptr = i->rp_start; custom.aud[channel].ac_len = i->rp_length; } void reset_audio(void) { custom.aud[0].ac_vol = 0; custom.aud[1].ac_vol = 0; custom.aud[2].ac_vol = 0; custom.aud[3].ac_vol = 0; /* turn off every channel and audio dma */ custom.dmacon = DMAF_AUDIO; } /*** * * Management of the audio filter * ***/ /* The LED and the filter are driven by the same bit */ void save_filter(void) { saved_filter = ciaa.ciapra & CIAF_LED; } void restore_filter(void) { if (saved_filter) filter_off(); else filter_on(); } void filter_on(void) { ciaa.ciapra &= ~CIAF_LED; } void filter_off(void) { ciaa.ciapra |= CIAF_LED; }