summaryrefslogtreecommitdiffstatshomepage
path: root/trunk/src/emu/machine/8257dma.h
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/src/emu/machine/8257dma.h')
-rw-r--r--trunk/src/emu/machine/8257dma.h165
1 files changed, 165 insertions, 0 deletions
diff --git a/trunk/src/emu/machine/8257dma.h b/trunk/src/emu/machine/8257dma.h
new file mode 100644
index 00000000000..0c96150dfa7
--- /dev/null
+++ b/trunk/src/emu/machine/8257dma.h
@@ -0,0 +1,165 @@
+/***************************************************************************
+
+ Intel 8257 Programmable DMA Controller emulation
+
+ Copyright Nicola Salmoria and the MAME Team.
+ Visit http://mamedev.org for licensing and usage restrictions.
+
+****************************************************************************
+ _____ _____
+ _I/OR 1 |* \_/ | 40 A7
+ _I/OW 2 | | 39 A6
+ _MEMR 3 | | 38 A5
+ _MEMW 4 | | 37 A4
+ MARK 5 | | 36 TC
+ READY 6 | | 35 A3
+ HLDA 7 | | 34 A2
+ ADSTB 8 | | 33 A1
+ AEN 9 | | 32 A0
+ HRQ 10 | 8257 | 31 Vcc
+ _CS 11 | | 30 D0
+ CLK 12 | | 29 D1
+ RESET 13 | | 28 D2
+ _DACK2 14 | | 27 D3
+ _DACK3 15 | | 26 D4
+ DRQ3 16 | | 25 _DACK0
+ DRQ2 17 | | 24 _DACK1
+ DRQ1 18 | | 23 D5
+ DRQ0 19 | | 22 D6
+ GND 20 |_____________| 21 D7
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __I8257__
+#define __I8257__
+
+#include "emu.h"
+
+
+
+/***************************************************************************
+ DEVICE CONFIGURATION MACROS
+***************************************************************************/
+
+#define MCFG_I8257_ADD(_tag, _clock, _config) \
+ MCFG_DEVICE_ADD(_tag, I8257, _clock) \
+ MCFG_DEVICE_CONFIG(_config)
+
+#define I8257_INTERFACE(_name) \
+ const i8257_interface (_name) =
+
+#define I8257_NUM_CHANNELS (4)
+
+
+/***************************************************************************
+ TYPE DEFINITIONS
+***************************************************************************/
+
+
+// ======================> i8257_interface
+
+struct i8257_interface
+{
+ devcb_write_line m_out_hrq_cb;
+ devcb_write_line m_out_tc_cb;
+ devcb_write_line m_out_mark_cb;
+
+ /* accessors to main memory */
+ devcb_read8 m_in_memr_cb; // TODO m_in_memr_cb[I8257_NUM_CHANNELS];
+ devcb_write8 m_out_memw_cb; // TODO m_out_memw_cb[I8257_NUM_CHANNELS];
+
+ /* channel accesors */
+ devcb_read8 m_in_ior_cb[I8257_NUM_CHANNELS];
+ devcb_write8 m_out_iow_cb[I8257_NUM_CHANNELS];
+};
+
+
+
+// ======================> i8257_device
+
+class i8257_device : public device_t,
+ public i8257_interface
+{
+public:
+ // construction/destruction
+ i8257_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ /* register access */
+ UINT8 i8257_r(UINT32 offset);
+ void i8257_w(UINT32 offset, UINT8 data);
+
+ /* data request */
+ void i8257_drq_w(int channel, int state);
+
+protected:
+ // device-level overrides
+ virtual void device_config_complete();
+ virtual void device_start();
+ virtual void device_reset();
+ virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
+
+private:
+ static const device_timer_id TIMER_OPERATION = 0;
+ static const device_timer_id TIMER_MSBFLIP = 1;
+ static const device_timer_id TIMER_DRQ_SYNC = 2;
+
+ int i8257_do_operation(int channel);
+ void i8257_update_status();
+ void i8257_prepare_msb_flip();
+
+ devcb_resolved_write_line m_out_hrq_func;
+ devcb_resolved_write_line m_out_tc_func;
+ devcb_resolved_write_line m_out_mark_func;
+ devcb_resolved_read8 m_in_memr_func;
+ devcb_resolved_write8 m_out_memw_func;
+ devcb_resolved_read8 m_in_ior_func[I8257_NUM_CHANNELS];
+ devcb_resolved_write8 m_out_iow_func[I8257_NUM_CHANNELS];
+
+ emu_timer *m_timer;
+ emu_timer *m_msbflip_timer;
+
+ UINT16 m_registers[I8257_NUM_CHANNELS*2];
+
+ UINT16 m_address[I8257_NUM_CHANNELS];
+ UINT16 m_count[I8257_NUM_CHANNELS];
+ UINT8 m_rwmode[I8257_NUM_CHANNELS];
+
+ UINT8 m_mode;
+ UINT8 m_rr;
+
+ UINT8 m_msb;
+ UINT8 m_drq;
+
+ /* bits 0- 3 : Terminal count for channels 0-3 */
+ UINT8 m_status;
+};
+
+
+// device type definition
+extern const device_type I8257;
+
+
+
+/***************************************************************************
+ PROTOTYPES
+***************************************************************************/
+
+/* register access */
+READ8_DEVICE_HANDLER( i8257_r );
+WRITE8_DEVICE_HANDLER( i8257_w );
+
+/* hold acknowledge */
+WRITE_LINE_DEVICE_HANDLER( i8257_hlda_w );
+
+/* ready */
+WRITE_LINE_DEVICE_HANDLER( i8257_ready_w );
+
+/* data request */
+WRITE_LINE_DEVICE_HANDLER( i8257_drq0_w );
+WRITE_LINE_DEVICE_HANDLER( i8257_drq1_w );
+WRITE_LINE_DEVICE_HANDLER( i8257_drq2_w );
+WRITE_LINE_DEVICE_HANDLER( i8257_drq3_w );
+
+#endif