diff options
Diffstat (limited to 'src/devices/machine/64h156.h')
-rw-r--r-- | src/devices/machine/64h156.h | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/src/devices/machine/64h156.h b/src/devices/machine/64h156.h new file mode 100644 index 00000000000..d21ce389dd0 --- /dev/null +++ b/src/devices/machine/64h156.h @@ -0,0 +1,205 @@ +// license:BSD-3-Clause +// copyright-holders:Curt Coder +/********************************************************************** + + Commodore 64H156 Gate Array emulation + + Used in 1541B/1541C/1541-II/1551/1571 + +********************************************************************** + _____ _____ + TEST 1 |* \_/ | 40 _BYTE + YB0 2 | | 39 SOE + YB1 3 | | 38 B + YB2 4 | | 37 CK + YB3 5 | | 36 _QX + YB4 6 | | 35 Q + YB5 7 | | 34 R/_W + YB6 8 | | 33 LOCK + YB7 9 | | 32 PLL + Vss 10 | 64H156-01 | 31 CLR + STP1 11 | 251828-01 | 30 Vcc + STP0 12 | | 29 _XRW + MTR 13 | | 28 Y3 + _A 14 | | 27 Y2 + DS0 15 | | 26 Y1 + DS1 16 | | 25 Y0 + _SYNC 17 | | 24 ATN + TED 18 | | 23 ATNI + OE 19 | | 22 ATNA + _ACCL 20 |_____________| 21 OSC + + _____ _____ + TEST 1 |* \_/ | 42 _BYTE + YB0 2 | | 41 SOE + YB1 3 | | 40 B + YB2 4 | | 39 CK + YB3 5 | | 38 _QX + YB4 6 | | 37 Q + YB5 7 | | 36 R/_W + YB6 8 | | 35 LOCK + YB7 9 | | 34 PLL + Vss 10 | 64H156-02 | 33 CLR + STP1 11 | 251828-02 | 32 Vcc + STP0 12 | | 31 _XRW + MTR 13 | | 30 Y3 + _A 14 | | 29 Y2 + DS0 15 | | 28 Y1 + DS1 16 | | 27 Y0 + _SYNC 17 | | 26 ATN + TED 18 | | 25 ATNI + OE 19 | | 24 ATNA + _ACCL 20 | | 23 OSC + Vcc 21 |_____________| 22 Vss + +**********************************************************************/ + +#pragma once + +#ifndef __C64H156__ +#define __C64H156__ + +#include "emu.h" +#include "imagedev/floppy.h" +#include "formats/d64_dsk.h" +#include "formats/g64_dsk.h" +#include "formats/d71_dsk.h" + + + +//************************************************************************** +// INTERFACE CONFIGURATION MACROS +//************************************************************************** + +#define MCFG_64H156_ATN_CALLBACK(_write) \ + devcb = &c64h156_device::set_atn_wr_callback(*device, DEVCB_##_write); + +#define MCFG_64H156_SYNC_CALLBACK(_write) \ + devcb = &c64h156_device::set_sync_wr_callback(*device, DEVCB_##_write); + +#define MCFG_64H156_BYTE_CALLBACK(_write) \ + devcb = &c64h156_device::set_byte_wr_callback(*device, DEVCB_##_write); + + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +// ======================> c64h156_device + +class c64h156_device : public device_t +{ +public: + // construction/destruction + c64h156_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + + template<class _Object> static devcb_base &set_atn_wr_callback(device_t &device, _Object object) { return downcast<c64h156_device &>(device).m_write_atn.set_callback(object); } + template<class _Object> static devcb_base &set_sync_wr_callback(device_t &device, _Object object) { return downcast<c64h156_device &>(device).m_write_sync.set_callback(object); } + template<class _Object> static devcb_base &set_byte_wr_callback(device_t &device, _Object object) { return downcast<c64h156_device &>(device).m_write_byte.set_callback(object); } + + DECLARE_READ8_MEMBER( yb_r ); + DECLARE_WRITE8_MEMBER( yb_w ); + + DECLARE_WRITE_LINE_MEMBER( test_w ); + DECLARE_WRITE_LINE_MEMBER( accl_w ); + DECLARE_WRITE_LINE_MEMBER( ted_w ); + DECLARE_WRITE_LINE_MEMBER( mtr_w ); + DECLARE_WRITE_LINE_MEMBER( oe_w ); + DECLARE_WRITE_LINE_MEMBER( soe_w ); + DECLARE_WRITE_LINE_MEMBER( atni_w ); + DECLARE_WRITE_LINE_MEMBER( atna_w ); + + DECLARE_READ_LINE_MEMBER( sync_r ) { return checkpoint_live.sync; } + DECLARE_READ_LINE_MEMBER( byte_r ) { return checkpoint_live.byte; } + DECLARE_READ_LINE_MEMBER( atn_r ) { return m_atni ^ m_atna; } + + void stp_w(int stp); + void ds_w(int ds); + + void set_floppy(floppy_image_device *floppy); + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); + +private: + enum { + IDLE, + RUNNING, + RUNNING_SYNCPOINT + }; + + struct live_info { + attotime tm; + int state, next_state; + int sync; + int byte; + int ds; + int oe; + int soe; + int accl; + UINT8 accl_yb; + + attotime edge; + UINT16 shift_reg; + int cycle_counter; + int cell_counter; + int bit_counter; + int zero_counter; + int cycles_until_random_flux; + + UINT8 yb; + UINT8 shift_reg_write; + attotime write_start_time; + attotime write_buffer[32]; + int write_position; + }; + + devcb_write_line m_write_atn; + devcb_write_line m_write_sync; + devcb_write_line m_write_byte; + + floppy_image_device *m_floppy; + + int m_mtr; + int m_accl; + int m_stp; + int m_ds; + int m_soe; + int m_oe; + int m_ted; + UINT8 m_yb; + int m_atni; + int m_atna; + + attotime m_period; + + live_info cur_live, checkpoint_live; + emu_timer *t_gen; + + void live_start(); + void checkpoint(); + void rollback(); + bool write_next_bit(bool bit, const attotime &limit); + void start_writing(const attotime &tm); + void commit(const attotime &tm); + void stop_writing(const attotime &tm); + void live_delay(int state); + void live_sync(); + void live_abort(); + void live_run(const attotime &limit = attotime::never); + void get_next_edge(const attotime &when); + int get_next_bit(attotime &tm, const attotime &limit); +}; + + + +// device type definition +extern const device_type C64H156; + + + +#endif |