// license:BSD-3-Clause// copyright-holders:Kevin Thacker/***************************************************************************** * * machine/i8271.h * ****************************************************************************/#ifndef I8271_H_#define I8271_H_#include"imagedev/flopdrv.h"#define MCFG_I8271_IRQ_CALLBACK(_write) \ devcb = &i8271_device::set_irq_wr_callback(*device, DEVCB_##_write);#define MCFG_I8271_DRQ_CALLBACK(_write) \ devcb = &i8271_device::set_drq_wr_callback(*device, DEVCB_##_write);#define MCFG_I8271_FLOPPIES(_tag1, _tag2) \ i8271_device::set_floppy_tags(*device, _tag1, _tag2);/*************************************************************************** MACROS***************************************************************************/classi8271_device:publicdevice_t{public:i8271_device(constmachine_config&mconfig,constchar*tag,device_t*owner,UINT32clock);~i8271_device(){}template<class_Object>staticdevcb_base&set_irq_wr_callback(device_t&device,_Objectobject){returndowncast<i8271_device&>(device).m_write_irq.set_callback(object);}template<class_Object>staticdevcb_base&set_drq_wr_callback(device_t&device,_Objectobject){returndowncast<i8271_device&>(device).m_write_drq.set_callback(object);}staticvoidset_floppy_tags(device_t&device,constchar*tag1,constchar*tag2){i8271_device&dev=downcast<i8271_device&>(device);dev.m_floppy_tag1=tag1;dev.m_floppy_tag2=tag2;}DECLARE_READ8_MEMBER(read);DECLARE_WRITE8_MEMBER(write);DECLARE_READ8_MEMBER(dack_r);DECLARE_WRITE8_MEMBER(dack_w);DECLARE_READ8_MEMBER(data_r);DECLARE_WRITE8_MEMBER(data_w);protected:// device-level overridesvirtualvoiddevice_start();virtualvoiddevice_reset();virtualvoiddevice_timer(emu_timer&timer,device_timer_idid,intparam,void*ptr);private:// internal stateenum{TIMER_DATA_CALLBACK,TIMER_TIMED_COMMAND_COMPLETE};devcb_write_linem_write_irq;devcb_write_linem_write_drq;constchar*m_floppy_tag1,*m_floppy_tag2;legacy_floppy_image_device*m_floppy[2];intm_flags;intm_state;unsignedcharm_Command;unsignedcharm_StatusRegister;unsignedcharm_CommandRegister;unsignedcharm_ResultRegister;unsignedcharm_ParameterRegister;unsignedcharm_ResetRegister;unsignedcharm_data;/* number of parameters required after command is specified */unsignedlongm_ParameterCount;/* number of parameters written so far */unsignedlongm_ParameterCountWritten;unsignedcharm_CommandParameters[8];/* current track for each drive */unsignedlongm_CurrentTrack[2];/* 2 bad tracks for drive 0, followed by 2 bad tracks for drive 1 */unsignedlongm_BadTracks[4];/* mode special register */unsignedlongm_Mode;/* drive outputs */intm_drive;intm_side;/* drive control output special register */intm_drive_control_output;/* drive control input special register */intm_drive_control_input;unsignedlongm_StepRate;unsignedlongm_HeadSettlingTime;unsignedlongm_IndexCountBeforeHeadUnload;unsignedlongm_HeadLoadTime;/* id on disc to find *///int m_ID_C;//int m_ID_H;intm_ID_R;intm_ID_N;/* id of data for read/write */intm_data_id;intm_ExecutionPhaseTransferCount;char*m_pExecutionPhaseData;intm_ExecutionPhaseCount;/* sector counter and id counter */intm_Counter;/* ==0, to cpu, !=0 =from cpu *///int m_data_direction;emu_timer*m_data_timer;emu_timer*m_command_complete_timer;voidseek_to_track(inttrack);voidload_bad_tracks(intsurface);voidwrite_bad_track(intsurface,inttrack,intdata);voidwrite_current_track(intsurface,inttrack);intread_current_track(intsurface);intread_bad_track(intsurface,inttrack);voidget_drive();voidcheck_all_parameters_written();voidupdate_state();voidinitialise_execution_phase_read(inttransfer_size);voidinitialise_execution_phase_write(inttransfer_size);voidcommand_execute();voidcommand_continue();voidcommand_complete(intresult,intint_rq);voidtimed_command_complete();voiddata_request();voidclear_data_request();voidtimed_data_request();/* locate sector for read/write operation */intfind_sector();/* do a read operation */voiddo_read();voiddo_write();voiddo_read_id();voidset_irq_state(int);voidset_dma_drq();};externconstdevice_typeI8271;#endif /* I8271_H_ */