2 SHARP MZ-2500 Emulator 'EmuZ-2500'
4 Author : Takeda.Toshiya
12 #define STATUS_INT 0x00 // unknown
13 #define STATUS_IXO 0x04
14 #define STATUS_CXD 0x08
15 #define STATUS_MSG 0x10
16 #define STATUS_BSY 0x20
17 #define STATUS_REQ 0x80
22 void MZ1E30::initialize()
25 FILEIO* fio = new FILEIO();
26 if(fio->Fopen(create_local_path(_T("MZ-1E30.ROM")), FILEIO_READ_BINARY) ||
27 fio->Fopen(create_local_path(_T("SASI.ROM")), FILEIO_READ_BINARY) ||
28 fio->Fopen(create_local_path(_T("FILE.ROM")), FILEIO_READ_BINARY)) {
29 fio->Fseek(0, FILEIO_SEEK_END);
30 if((rom_size = fio->Ftell()) > 0x1000000) {
33 rom_buffer = (uint8_t*)malloc(rom_size);
35 fio->Fseek(0, FILEIO_SEEK_SET);
36 fio->Fread(rom_buffer, rom_size, 1);
40 rom_buffer = (uint8_t*)malloc(1);
46 void MZ1E30::release()
48 if(rom_buffer != NULL) {
55 irq_status = drq_status = false;
58 void MZ1E30::write_io8(uint32_t addr, uint32_t data)
62 #ifdef _SCSI_DEBUG_LOG
63 this->out_debug_log(_T("[MZ1E30] out %04X %02X\n"), addr, data);
65 d_host->write_dma_io8(addr, data);
68 #ifdef _SCSI_DEBUG_LOG
69 this->out_debug_log(_T("[MZ1E30] out %04X %02X\n"), addr, data);
71 d_host->write_signal(SIG_SCSI_RST, data, 0x40);
72 d_host->write_signal(SIG_SCSI_SEL, data, 0x20);
76 rom_address = ((addr & 0xff00) << 8) | (data << 8) | (rom_address & 0x0000ff);
81 uint32_t MZ1E30::read_io8(uint32_t addr)
87 val = d_host->read_dma_io8(addr);
88 #ifdef _SCSI_DEBUG_LOG
89 this->out_debug_log(_T("[MZ1E30] in %04X %02X\n"), addr, value);
93 val = (d_host->read_signal(SIG_SCSI_REQ) ? STATUS_REQ : 0) |
94 // (d_host->read_signal(SIG_SCSI_ACK) ? STATUS_ACK : 0) |
95 (d_host->read_signal(SIG_SCSI_BSY) ? STATUS_BSY : 0) |
96 (d_host->read_signal(SIG_SCSI_MSG) ? STATUS_MSG : 0) |
97 (d_host->read_signal(SIG_SCSI_CD ) ? STATUS_CXD : 0) |
98 (d_host->read_signal(SIG_SCSI_IO ) ? STATUS_IXO : 0) |
99 (irq_status ? STATUS_INT : 0);
101 #ifdef _SCSI_DEBUG_LOG
102 this->out_debug_log(_T("[MZ1E30] in %04X %02X (REQ=%d,BSY=%d,MSG=%d,CxD=%d,IxO=%d)\n"), addr, val,
103 (val & STATUS_REQ) ? 1 : 0,
104 (val & STATUS_BSY) ? 1 : 0,
105 (val & STATUS_MSG) ? 1 : 0,
106 (val & STATUS_CXD) ? 1 : 0,
107 (val & STATUS_IXO) ? 1 : 0);
112 rom_address = (rom_address & 0xffff00) | ((addr & 0xff00) >> 8);
113 if(rom_address < rom_size) {
114 return rom_buffer[rom_address];
121 void MZ1E30::write_dma_io8(uint32_t addr, uint32_t data)
123 write_io8(0xa4, data);
126 uint32_t MZ1E30::read_dma_io8(uint32_t addr)
128 return read_io8(0xa4);
131 void MZ1E30::write_signal(int id, uint32_t data, uint32_t mask)
135 irq_status = ((data & mask) != 0);
138 drq_status = ((data & mask) != 0);
143 #define STATE_VERSION 2
145 #include "../../statesub.h"
147 void MZ1E30::decl_state()
149 enter_decl_state(STATE_VERSION);
151 DECL_STATE_ENTRY_UINT32(rom_address);
152 DECL_STATE_ENTRY_BOOL(irq_status);
153 DECL_STATE_ENTRY_BOOL(drq_status);
158 void MZ1E30::save_state(FILEIO* state_fio)
160 if(state_entry != NULL) {
161 state_entry->save_state(state_fio);
163 // state_fio->FputUint32(STATE_VERSION);
164 // state_fio->FputInt32(this_device_id);
166 // state_fio->FputUint32(rom_address);
167 // state_fio->FputBool(irq_status);
168 // state_fio->FputBool(drq_status);
171 bool MZ1E30::load_state(FILEIO* state_fio)
174 if(state_entry != NULL) {
175 mb = state_entry->load_state(state_fio);
180 // if(state_fio->FgetUint32() != STATE_VERSION) {
183 // if(state_fio->FgetInt32() != this_device_id) {
186 // rom_address = state_fio->FgetUint32();
187 // irq_status = state_fio->FgetBool();
188 // drq_status = state_fio->FgetBool();
192 bool MZ1E30::process_state(FILEIO* state_fio, bool loading)
194 if(!state_fio->StateCheckUint32(STATE_VERSION)) {
197 if(!state_fio->StateCheckInt32(this_device_id)) {
200 state_fio->StateUint32(rom_address);
201 state_fio->StateBool(irq_status);
202 state_fio->StateBool(drq_status);