summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/sound/ym2151.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/sound/ym2151.h')
-rw-r--r--src/devices/sound/ym2151.h271
1 files changed, 0 insertions, 271 deletions
diff --git a/src/devices/sound/ym2151.h b/src/devices/sound/ym2151.h
deleted file mode 100644
index 562c6bb10a2..00000000000
--- a/src/devices/sound/ym2151.h
+++ /dev/null
@@ -1,271 +0,0 @@
-// license:GPL-2.0+
-// copyright-holders:Jarek Burczynski,Ernesto Corvi
-/*
-** File: ym2151.h - header file for software implementation of YM2151
-** FM Operator Type-M(OPM)
-**
-** (c) 1997-2002 Jarek Burczynski (s0246@poczta.onet.pl, bujar@mame.net)
-** Some of the optimizing ideas by Tatsuyuki Satoh
-**
-** Version 2.150 final beta May, 11th 2002
-**
-**
-** I would like to thank following people for making this project possible:
-**
-** Beauty Planets - for making a lot of real YM2151 samples and providing
-** additional informations about the chip. Also for the time spent making
-** the samples and the speed of replying to my endless requests.
-**
-** Shigeharu Isoda - for general help, for taking time to scan his YM2151
-** Japanese Manual first of all, and answering MANY of my questions.
-**
-** Nao - for giving me some info about YM2151 and pointing me to Shigeharu.
-** Also for creating fmemu (which I still use to test the emulator).
-**
-** Aaron Giles and Chris Hardy - they made some samples of one of my favourite
-** arcade games so I could compare it to my emulator.
-**
-** Bryan McPhail and Tim (powerjaw) - for making some samples.
-**
-** Ishmair - for the datasheet and motivation.
-*/
-
-#ifndef MAME_SOUND_YM2151_H
-#define MAME_SOUND_YM2151_H
-
-#pragma once
-
-
-//**************************************************************************
-// TYPE DEFINITIONS
-//**************************************************************************
-
-
-// ======================> ym2151_device
-
-class ym2151_device : public device_t,
- public device_sound_interface
-{
-public:
- // construction/destruction
- ym2151_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
-
- // configuration helpers
- auto irq_handler() { return m_irqhandler.bind(); }
- auto port_write_handler() { return m_portwritehandler.bind(); }
-
- // read/write
- u8 read(offs_t offset);
- void write(offs_t offset, u8 data);
-
- u8 status_r();
- void register_w(u8 data);
- void data_w(u8 data);
-
- DECLARE_WRITE_LINE_MEMBER(reset_w);
-
-protected:
- // device-level overrides
- virtual void device_start() override;
- virtual void device_reset() override;
- virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
- virtual void device_post_load() override;
- virtual void device_clock_changed() override;
-
- // sound stream update overrides
- virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) override;
-
-private:
- enum {
- TIMER_IRQ_A_OFF,
- TIMER_IRQ_B_OFF,
- TIMER_A,
- TIMER_B
- };
-
- enum {
- RATE_STEPS = 8,
- TL_RES_LEN = 256, /* 8 bits addressing (real chip) */
-
- /* TL_TAB_LEN is calculated as:
- * 13 - sinus amplitude bits (Y axis)
- * 2 - sinus sign bit (Y axis)
- * TL_RES_LEN - sinus resolution (X axis)
- */
- TL_TAB_LEN = 13*2*TL_RES_LEN,
-
- SIN_BITS = 10,
- SIN_LEN = 1 << SIN_BITS,
- SIN_MASK = SIN_LEN - 1
- };
-
- int tl_tab[TL_TAB_LEN];
- unsigned int sin_tab[SIN_LEN];
- uint32_t d1l_tab[16];
-
- static const uint8_t eg_inc[19*RATE_STEPS];
- static const uint8_t eg_rate_select[32+64+32];
- static const uint8_t eg_rate_shift[32+64+32];
- static const uint32_t dt2_tab[4];
- static const uint8_t dt1_tab[4*32];
- static const uint16_t phaseinc_rom[768];
- static const uint8_t lfo_noise_waveform[256];
-
- /* struct describing a single operator */
- struct YM2151Operator
- {
- uint32_t phase; /* accumulated operator phase */
- uint32_t freq; /* operator frequency count */
- int32_t dt1; /* current DT1 (detune 1 phase inc/decrement) value */
- uint32_t mul; /* frequency count multiply */
- uint32_t dt1_i; /* DT1 index * 32 */
- uint32_t dt2; /* current DT2 (detune 2) value */
-
- signed int *connect; /* operator output 'direction' */
-
- /* only M1 (operator 0) is filled with this data: */
- signed int *mem_connect; /* where to put the delayed sample (MEM) */
- int32_t mem_value; /* delayed sample (MEM) value */
-
- /* channel specific data; note: each operator number 0 contains channel specific data */
- uint32_t fb_shift; /* feedback shift value for operators 0 in each channel */
- int32_t fb_out_curr; /* operator feedback value (used only by operators 0) */
- int32_t fb_out_prev; /* previous feedback value (used only by operators 0) */
- uint32_t kc; /* channel KC (copied to all operators) */
- uint32_t kc_i; /* just for speedup */
- uint32_t pms; /* channel PMS */
- uint32_t ams; /* channel AMS */
- /* end of channel specific data */
-
- uint32_t AMmask; /* LFO Amplitude Modulation enable mask */
- uint32_t state; /* Envelope state: 4-attack(AR) 3-decay(D1R) 2-sustain(D2R) 1-release(RR) 0-off */
- uint8_t eg_sh_ar; /* (attack state) */
- uint8_t eg_sel_ar; /* (attack state) */
- uint32_t tl; /* Total attenuation Level */
- int32_t volume; /* current envelope attenuation level */
- uint8_t eg_sh_d1r; /* (decay state) */
- uint8_t eg_sel_d1r; /* (decay state) */
- uint32_t d1l; /* envelope switches to sustain state after reaching this level */
- uint8_t eg_sh_d2r; /* (sustain state) */
- uint8_t eg_sel_d2r; /* (sustain state) */
- uint8_t eg_sh_rr; /* (release state) */
- uint8_t eg_sel_rr; /* (release state) */
-
- uint32_t key; /* 0=last key was KEY OFF, 1=last key was KEY ON */
-
- uint32_t ks; /* key scale */
- uint32_t ar; /* attack rate */
- uint32_t d1r; /* decay rate */
- uint32_t d2r; /* sustain rate */
- uint32_t rr; /* release rate */
-
- uint32_t reserved0; /**/
- uint32_t reserved1; /**/
-
- void key_on(uint32_t key_set, uint32_t eg_cnt);
- void key_off(uint32_t key_set);
- };
-
- signed int chanout[8];
- signed int m2,c1,c2; /* Phase Modulation input for operators 2,3,4 */
- signed int mem; /* one sample delay memory */
-
- YM2151Operator oper[32]; /* the 32 operators */
-
- uint32_t pan[16]; /* channels output masks (0xffffffff = enable) */
-
- uint32_t eg_cnt; /* global envelope generator counter */
- uint32_t eg_timer; /* global envelope generator counter works at frequency = chipclock/64/3 */
- uint32_t eg_timer_add; /* step of eg_timer */
- uint32_t eg_timer_overflow; /* envelope generator timer overflows every 3 samples (on real chip) */
-
- uint32_t lfo_phase; /* accumulated LFO phase (0 to 255) */
- uint32_t lfo_timer; /* LFO timer */
- uint32_t lfo_timer_add; /* step of lfo_timer */
- uint32_t lfo_overflow; /* LFO generates new output when lfo_timer reaches this value */
- uint32_t lfo_counter; /* LFO phase increment counter */
- uint32_t lfo_counter_add; /* step of lfo_counter */
- uint8_t lfo_wsel; /* LFO waveform (0-saw, 1-square, 2-triangle, 3-random noise) */
- uint8_t amd; /* LFO Amplitude Modulation Depth */
- int8_t pmd; /* LFO Phase Modulation Depth */
- uint32_t lfa; /* LFO current AM output */
- int32_t lfp; /* LFO current PM output */
-
- uint8_t test; /* TEST register */
- uint8_t ct; /* output control pins (bit1-CT2, bit0-CT1) */
-
- uint32_t noise; /* noise enable/period register (bit 7 - noise enable, bits 4-0 - noise period */
- uint32_t noise_rng; /* 17 bit noise shift register */
- uint32_t noise_p; /* current noise 'phase'*/
- uint32_t noise_f; /* current noise period */
-
- uint32_t csm_req; /* CSM KEY ON / KEY OFF sequence request */
-
- uint32_t irq_enable; /* IRQ enable for timer B (bit 3) and timer A (bit 2); bit 7 - CSM mode (keyon to all slots, everytime timer A overflows) */
- uint32_t status; /* chip status (BUSY, IRQ Flags) */
- uint8_t connect[8]; /* channels connections */
-
- emu_timer *timer_A, *timer_A_irq_off;
- emu_timer *timer_B, *timer_B_irq_off;
-
- attotime timer_A_time[1024]; /* timer A times for MAME */
- attotime timer_B_time[256]; /* timer B times for MAME */
- int irqlinestate;
-
- uint32_t timer_A_index; /* timer A index */
- uint32_t timer_B_index; /* timer B index */
- uint32_t timer_A_index_old; /* timer A previous index */
- uint32_t timer_B_index_old; /* timer B previous index */
-
- /* Frequency-deltas to get the closest frequency possible.
- * There are 11 octaves because of DT2 (max 950 cents over base frequency)
- * and LFO phase modulation (max 800 cents below AND over base frequency)
- * Summary: octave explanation
- * 0 note code - LFO PM
- * 1 note code
- * 2 note code
- * 3 note code
- * 4 note code
- * 5 note code
- * 6 note code
- * 7 note code
- * 8 note code
- * 9 note code + DT2 + LFO PM
- * 10 note code + DT2 + LFO PM
- */
- uint32_t freq[11*768]; /* 11 octaves, 768 'cents' per octave */
-
- /* Frequency deltas for DT1. These deltas alter operator frequency
- * after it has been taken from frequency-deltas table.
- */
- int32_t dt1_freq[8*32]; /* 8 DT1 levels, 32 KC values */
-
- uint32_t noise_tab[32]; /* 17bit Noise Generator periods */
-
- // internal state
- sound_stream * m_stream;
- uint8_t m_lastreg;
- devcb_write_line m_irqhandler;
- devcb_write8 m_portwritehandler;
- bool m_reset_active;
-
- void init_tables();
- void calculate_timers();
- void envelope_KONKOFF(YM2151Operator * op, int v);
- void set_connect(YM2151Operator *om1, int cha, int v);
- void advance();
- void advance_eg();
- void write_reg(int r, int v);
- void chan_calc(unsigned int chan);
- void chan7_calc();
- int op_calc(YM2151Operator * OP, unsigned int env, signed int pm);
- int op_calc1(YM2151Operator * OP, unsigned int env, signed int pm);
- void refresh_EG(YM2151Operator * op);
-};
-
-
-// device type definition
-DECLARE_DEVICE_TYPE(YM2151, ym2151_device)
-
-
-#endif // MAME_SOUND_YM2151_H