mirror of
https://github.com/holub/mame
synced 2025-04-16 21:44:32 +03:00
198 lines
3.5 KiB
C++
198 lines
3.5 KiB
C++
// license:BSD-3-Clause
|
|
// copyright-holders:Olivier Galibert
|
|
|
|
// Motorola 6843 floppy drive controller
|
|
//
|
|
// The Hitachi HD46503S, HD6843 and HD68A43 seem identical
|
|
|
|
#ifndef MAME_MACHINE_MC6843_H
|
|
#define MAME_MACHINE_MC6843_H
|
|
|
|
#pragma once
|
|
|
|
#include "imagedev/floppy.h"
|
|
#include "fdc_pll.h"
|
|
|
|
class mc6843_device : public device_t
|
|
{
|
|
public:
|
|
mc6843_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
|
|
|
|
void force_ready() { m_force_ready = true; }
|
|
|
|
auto irq() { return m_irq.bind(); }
|
|
|
|
void set_floppy(floppy_image_device *floppy);
|
|
|
|
void map(address_map &map);
|
|
|
|
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;
|
|
|
|
private:
|
|
// Status flags
|
|
enum {
|
|
SA_BUSY = 0x80,
|
|
SA_IDX = 0x40,
|
|
SA_TNEQ = 0x20,
|
|
SA_WPT = 0x10,
|
|
SA_TRK0 = 0x08,
|
|
SA_RDY = 0x04,
|
|
SA_DDM = 0x02,
|
|
SA_DTR = 0x01,
|
|
|
|
SB_HERR = 0x80,
|
|
SB_WERR = 0x40,
|
|
SB_FI = 0x20,
|
|
SB_SERR = 0x10,
|
|
SB_SAERR = 0x08,
|
|
SB_DMERR = 0x04,
|
|
SB_CRC = 0x02,
|
|
SB_DTERR = 0x01,
|
|
|
|
I_STRB = 0x08,
|
|
I_SSR = 0x04,
|
|
I_SCE = 0x02,
|
|
I_RWCE = 0x01,
|
|
|
|
C_STZ = 0x2,
|
|
C_SEK = 0x3,
|
|
C_SSR = 0x4,
|
|
C_SSW = 0x5,
|
|
C_RCR = 0x6,
|
|
C_SWD = 0x7,
|
|
C_FFR = 0xa,
|
|
C_FFW = 0xb,
|
|
C_MSR = 0xc,
|
|
C_MSW = 0xd,
|
|
};
|
|
|
|
enum {
|
|
S_IDLE,
|
|
|
|
S_STZ_STEP,
|
|
S_STZ_STEP_WAIT,
|
|
S_STZ_HEAD_SETTLING,
|
|
|
|
S_SEEK_STEP,
|
|
S_SEEK_STEP_WAIT,
|
|
S_SEEK_HEAD_SETTLING,
|
|
|
|
S_SRW_WAIT_READY,
|
|
S_SRW_HEAD_SETTLING,
|
|
S_SRW_START,
|
|
|
|
S_FFW_WAIT_READY,
|
|
S_FFW_HEAD_SETTLING,
|
|
S_FFW_START,
|
|
|
|
S_IDAM_BAD_TRACK,
|
|
S_IDAM_BAD_CRC,
|
|
S_IDAM_FOUND,
|
|
S_IDAM_NOT_FOUND,
|
|
|
|
S_DAM_NOT_FOUND,
|
|
S_DAM_BAD_CRC,
|
|
S_DAM_DONE,
|
|
};
|
|
|
|
enum {
|
|
L_IDLE,
|
|
|
|
L_IDAM_SEARCH,
|
|
L_IDAM_CHECK_TRACK,
|
|
L_IDAM_CHECK_SECTOR,
|
|
L_IDAM_CHECK_CRC,
|
|
|
|
L_DAM_SEARCH,
|
|
L_DAM_DELETED,
|
|
L_DAM_READ,
|
|
L_DAM_READ_BYTE,
|
|
|
|
L_DAM_WAIT,
|
|
L_DAM_WRITE,
|
|
L_DAM_WRITE_BYTE,
|
|
|
|
L_FFW_BYTE,
|
|
L_FFW_WRITE,
|
|
};
|
|
|
|
struct live_info {
|
|
attotime tm;
|
|
fdc_pll_t pll;
|
|
int state, next_state;
|
|
u16 shift_reg;
|
|
u16 crc;
|
|
int bit_counter;
|
|
bool data_separator_phase, data_bit_context;
|
|
uint8_t data_reg;
|
|
};
|
|
|
|
devcb_write_line m_irq;
|
|
bool m_force_ready;
|
|
|
|
emu_timer *m_timer;
|
|
floppy_image_device *m_floppy;
|
|
|
|
live_info m_cur_live, m_checkpoint_live;
|
|
|
|
int m_state;
|
|
|
|
bool m_head_loaded, m_dir_loaded, m_dor_loaded, m_dor_needed;
|
|
|
|
u8 m_dir;
|
|
u8 m_dor;
|
|
u8 m_ctar;
|
|
u8 m_cmr;
|
|
u8 m_isr;
|
|
u8 m_sur;
|
|
u8 m_stra;
|
|
u8 m_sar;
|
|
u8 m_strb;
|
|
u8 m_gcr;
|
|
u8 m_ccr;
|
|
u8 m_ltar;
|
|
|
|
u8 m_step_count;
|
|
u8 m_idam_turns;
|
|
|
|
u8 dir_r();
|
|
void dor_w(u8 data);
|
|
u8 ctar_r();
|
|
void ctar_w(u8 data);
|
|
u8 isr_r();
|
|
void cmr_w(u8 data);
|
|
u8 stra_r();
|
|
void sur_w(u8 data);
|
|
u8 strb_r();
|
|
void sar_w(u8 data);
|
|
void gcr_w(u8 data);
|
|
void ccr_w(u8 data);
|
|
void ltar_w(u8 data);
|
|
|
|
void index_callback(floppy_image_device *floppy, int state);
|
|
void ready_callback(floppy_image_device *floppy, int state);
|
|
|
|
void command_start();
|
|
void run(bool timeout, bool ready, bool index);
|
|
void isr_raise(u8 flag);
|
|
void delay(int);
|
|
void live_start(int state, bool start_writing = false);
|
|
void checkpoint();
|
|
void rollback();
|
|
void live_delay(int state);
|
|
void live_sync();
|
|
void live_abort();
|
|
bool read_one_bit(const attotime &limit);
|
|
bool write_one_bit(const attotime &limit);
|
|
void live_run(attotime limit = attotime::never);
|
|
bool is_ready() const;
|
|
};
|
|
|
|
DECLARE_DEVICE_TYPE(MC6843, mc6843_device)
|
|
|
|
#endif // MAME_MACHINE_MC6843_H
|