#if defined(HAS_DMA)
#include "hd6844.h"
#endif
-
+#if defined(_FM8)
+#include "bubblecasette.h"
+#endif
FM7_MAINIO::FM7_MAINIO(VM* parent_vm, EMU* parent_emu) : DEVICE(parent_vm, parent_emu)
{
int i;
p_vm = parent_vm;
p_emu = parent_emu;
+#if defined(_FM8)
+ opn[0] = NULL;
+#else
+ for(i = 0; i < 4; i++) {
+ opn[i] = NULL;
+ }
+#endif
+ drec = NULL;
+ pcm1bit = NULL;
+ joystick = NULL;
+ fdc = NULL;
+ printer = NULL;
+
kanjiclass1 = NULL;
kanjiclass2 = NULL;
- opn_psg_77av = false;
+
+ display = NULL;
+ keyboard = NULL;
+ maincpu = NULL;
+ mainmem = NULL;
+ subcpu = NULL;
+#ifdef WITH_Z80
+ z80 = NULL;
+#endif
+#if defined(_FM8)
+ bubble_casette[0] = NULL;
+ bubble_casette[1] = NULL;
+#endif
// FD00
clock_fast = true;
- lpt_strobe = false;
- lpt_slctin = false;
+ lpt_strobe = false; // bit6
+ lpt_slctin = false; // bit7
// FD01
lpt_outdata = 0x00;
// FD02
- cmt_indat = false; // bit7
+ cmt_indat = true; // bit7
cmt_invert = false; // Invert signal
- lpt_det2 = true;
- lpt_det1 = true;
- lpt_pe = false;
- lpt_ackng_inv = false;
- lpt_error_inv = false;
- lpt_busy = true;
+ irqstat_reg0 = 0xff;
+
// FD04
#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
defined(_FM77AV20) || defined(_FM77AV20EX) || defined(_FM77AV20SX)
intstat_syndet = false;
intstat_rxrdy = false;
intstat_txrdy = false;
+ irqstat_timer = false;
+ irqstat_printer = false;
+ irqstat_keyboard = false;
// FD0B
// FD0D
// FD0F
- stat_romrammode = true; // ROM ON
-
// FD15/ FD46 / FD51
#if defined(_FM8)
connect_psg = false;
fdc_headreg = 0x00;
fdc_drvsel = 0x00;
fdc_motor = false;
- irqstat_fdc = 0;
+ irqstat_fdc = false;
+ irqreg_fdc = 0xff; //0b11111111;
+ irqmask_syndet = true;
+ irqmask_rxrdy = true;
+ irqmask_txrdy = true;
+ irqmask_mfd = true;
+ irqmask_timer = true;
+ irqmask_printer = true;
+ irqmask_keyboard = true;
+ irqstat_reg0 = 0xff;
+
+
+ irqreq_syndet = false;
+ irqreq_rxrdy = false;
+ irqreq_txrdy = false;
+ irqreq_printer = false;
+ irqreq_keyboard = false;
+
// FD20, FD21, FD22, FD23
connect_kanjiroml1 = false;
#if defined(_FM77AV_VARIANTS)
#if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
boot_ram = false;
#endif
+
#if defined(HAS_DMA)
dmac = NULL;
#endif
+ bootmode = config.boot_mode & 3;
memset(io_w_latch, 0xff, 0x100);
+ initialize_output_signals(&clock_status);
+ initialize_output_signals(&printer_reset_bus);
+ initialize_output_signals(&printer_strobe_bus);
+ initialize_output_signals(&printer_select_bus);
}
FM7_MAINIO::~FM7_MAINIO()
}
-
void FM7_MAINIO::initialize()
{
event_beep = -1;
event_beep_oneshot = -1;
event_timerirq = -1;
event_fdc_motor = -1;
+ lpt_type = config.printer_device_type;
+ fdc_cmdreg = 0x00;
+
#if defined(_FM77_VARIANTS) || defined(_FM77AV_VARIANTS)
boot_ram = false;
# if defined(_FM77_VARIANTS)
# endif
# endif
#endif
- irqmask_syndet = true;
- irqmask_rxrdy = true;
- irqmask_txrdy = true;
- irqmask_mfd = true;
- irqmask_timer = true;
- irqmask_printer = true;
- irqmask_keyboard = true;
- irqstat_reg0 = 0xff;
-
- intstat_syndet = false;
- intstat_rxrdy = false;
- intstat_txrdy = false;
- irqstat_timer = false;
- irqstat_printer = false;
- irqstat_keyboard = false;
-
- irqreq_syndet = false;
- irqreq_rxrdy = false;
- irqreq_txrdy = false;
- irqreq_printer = false;
- irqreq_keyboard = false;
#if defined(_FM77AV_VARIANTS)
- reg_fd12 = 0x00;
+ reg_fd12 = 0xbc; // 0b10111100
#endif
-
+ bootmode = config.boot_mode & 3;
+ reset_printer();
}
void FM7_MAINIO::reset()
register_event(this, EVENT_BEEP_CYCLE, (1000.0 * 1000.0) / (1200.0 * 2.0), true, &event_beep);
// Sound
#if defined(_FM77AV_VARIANTS)
- opn_psg_77av = true;
hotreset = false;
-#else
- opn_psg_77av = false;
#endif
-#if defined(_FM8)
- connect_psg = false;
-#else
- connect_opn = false;
- connect_thg = false;
- connect_whg = false;
-#endif
// Around boot rom
#if defined(_FM77_VARIANTS)
- boot_ram = (mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) == 0) ? false : true;
-#endif
-#if defined(_FM77AV_VARIANTS)
- //enable_initiator = true;
- //mainmem->write_signal(FM7_MAINIO_INITROM_ENABLED, (enable_initiator) ? 0xffffffff : 0 , 0xffffffff);
- boot_ram = (mainmem->read_signal(FM7_MAINIO_BOOTRAM_RW) == 0) ? false : true;
+ boot_ram = false;
+#elif defined(_FM77AV_VARIANTS)
+ boot_ram = true;
#endif
// FD05
- extdet_neg = false;
sub_cancel = false; // bit6 : '1' Cancel req.
sub_halt = false; // bit6 : '1' Cancel req.
sub_cancel_bak = sub_cancel; // bit6 : '1' Cancel req.
sub_halt_bak = sub_halt; // bit6 : '1' Cancel req.
- //sub_busy = false;
// FD02
- extdet_neg = false;
-
- //stat_romrammode = true;
- // IF BASIC BOOT THEN ROM
- // ELSE RAM
- mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, ((config.boot_mode & 3) == 0) ? 0xffffffff : 0, 0xffffffff);
+ cmt_indat = true; // bit7
+ cmt_invert = false; // Invert signal
+ lpt_det2 = true;
+ lpt_det1 = true;
+ lpt_type = config.printer_device_type;
+ reset_printer();
+
#if defined(_FM77AV_VARIANTS)
sub_monitor_type = 0x00;
#endif
- // MMR
-#ifdef HAS_MMR
- mainmem->write_signal(FM7_MAINIO_WINDOW_ENABLED, 0, 0xffffffff);
- mainmem->write_data8(FM7_MAINIO_WINDOW_OFFSET, 0x00);
- mainmem->write_signal(FM7_MAINIO_FASTMMR_ENABLED, 0, 0xffffffff);
- mainmem->write_signal(FM7_MAINIO_MMR_ENABLED, 0, 0xffffffff);
- //mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, mmr_segment);
-#endif
- switch(config.cpu_type){
- case 0:
- clock_fast = true;
- break;
- case 1:
- clock_fast = false;
- break;
+ if(config.cpu_type == 0) {
+ clock_fast = true;
+ } else {
+ clock_fast = false;
}
- this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
- //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
+ this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
// FD03
irqmask_syndet = true;
intstat_txrdy = false;
irqstat_timer = false;
irqstat_printer = false;
- //irqstat_keyboard = false;
+ irqstat_keyboard = false;
irqreq_syndet = false;
irqreq_rxrdy = false;
irqreq_txrdy = false;
irqreq_printer = false;
- //irqreq_keyboard = false;
+ irqreq_keyboard = false;
// FD00
drec->write_signal(SIG_DATAREC_MIC, 0x00, 0x01);
- drec->write_signal(SIG_DATAREC_REMOTE, 0x00, 0x02);
+ drec->set_remote(false);
reset_fdc();
reset_sound();
stat_fdmode_2hd = false; // R/W : bit6, '0' = 2HD, '1' = 2DD. FM-77 Only.
stat_kanjirom = true; // R/W : bit5, '0' = sub, '1' = main. FM-77 Only.
#endif
- //display->write_signal(SIG_FM7_SUB_KEY_MASK, 1, 1);
- //display->write_signal(SIG_FM7_SUB_KEY_FIRQ, 0, 1);
maincpu->write_signal(SIG_CPU_FIRQ, 0, 1);
#if defined(HAS_DMA)
intstat_dma = false;
dma_addr = 0;
#endif
#if defined(_FM77AV_VARIANTS)
- reg_fd12 = 0x00;
+ reg_fd12 = 0xbc; // 0b10111100
#endif
+//#if defined(_FM8)
+// bubble_casette[0]->reset();
+// bubble_casette[1]->reset();
+//#endif
+
+
#if !defined(_FM8)
register_event(this, EVENT_TIMERIRQ_ON, 10000.0 / 4.9152, true, &event_timerirq); // TIMER IRQ
-#endif
+#endif
+ bootmode = config.boot_mode & 3;
memset(io_w_latch, 0xff, 0x100);
}
+void FM7_MAINIO::reset_printer()
+{
+ lpt_slctin = false;
+ lpt_strobe = false;
+ // FD01
+ lpt_outdata = 0x00;
+ this->write_signals(&printer_strobe_bus, 0);
+ this->write_signals(&printer_select_bus, 0xffffffff);
+ this->write_signals(&printer_reset_bus, 0xffffffff);
+ register_event(this, EVENT_PRINTER_RESET_COMPLETED, 5.0 * 1000.0, false, NULL);
+ if(lpt_type == 0) {
+ printer->write_signal(SIG_PRINTER_STROBE, 0x00, 0xff);
+ }
+ lpt_busy = false;
+ lpt_error_inv = true;
+ lpt_ackng_inv = true;
+ lpt_pe = false;
+
+}
-void FM7_MAINIO::set_clockmode(uint8 flags)
+void FM7_MAINIO::set_clockmode(uint8_t flags)
{
bool f = clock_fast;
if((flags & FM7_MAINCLOCK_SLOW) != 0) {
}
if(f != clock_fast) {
this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
- //mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
}
}
-uint8 FM7_MAINIO::get_clockmode(void)
+uint8_t FM7_MAINIO::get_clockmode(void)
{
if(!clock_fast) return FM7_MAINCLOCK_SLOW;
return FM7_MAINCLOCK_HIGH;
}
-uint8 FM7_MAINIO::get_port_fd00(void)
+uint8_t FM7_MAINIO::get_port_fd00(void)
{
- uint8 ret = 0x7e; //0b01111110;
+ uint8_t ret = 0x7e; //0b01111110;
#if defined(_FM8)
ret = 0xfe;
#else
return ret;
}
-void FM7_MAINIO::set_port_fd00(uint8 data)
+void FM7_MAINIO::set_port_fd00(uint8_t data)
{
- drec->write_signal(SIG_DATAREC_MIC, data, 0x01);
- drec->write_signal(SIG_DATAREC_REMOTE, data, 0x02);
- lpt_slctin = ((data & 0x80) != 0);
- lpt_strobe = ((data & 0x40) != 0);
- printer->write_signal(SIG_PRINTER_STROBE, lpt_strobe ? 0xff : 0x00, 0xff);
+ drec->write_signal(SIG_DATAREC_MIC, data, 0x01);
+ drec->set_remote(((data & 0x02) != 0));
+ lpt_slctin = ((data & 0x80) == 0);
+ lpt_strobe = ((data & 0x40) != 0);
+ this->write_signals(&printer_strobe_bus, lpt_strobe ? 0xffffffff : 0);
+ this->write_signals(&printer_select_bus, lpt_slctin ? 0xffffffff : 0);
+ if((lpt_type == 0) && (lpt_slctin)) {
+ printer->write_signal(SIG_PRINTER_STROBE, lpt_strobe ? 0xff : 0x00, 0xff);
+ }
}
-uint8 FM7_MAINIO::get_port_fd02(void)
+uint8_t FM7_MAINIO::get_port_fd02(void)
{
- uint8 ret;
- // Still unimplemented printer.
+ uint8_t ret;
+ bool ack_bak = lpt_ackng_inv;
+
ret = (cmt_indat) ? 0xff : 0x7f; // CMT
-
- if(config.printer_device_type == 0) {
+ if(lpt_type == 0) {
lpt_busy = (printer->read_signal(SIG_PRINTER_BUSY) != 0);
- lpt_error_inv = false;
- lpt_ackng_inv = false;
+ lpt_error_inv = true;
+ lpt_ackng_inv = (printer->read_signal(SIG_PRINTER_ACK) != 0);
lpt_pe = false;
- } else if((config.printer_device_type == 1) || (config.printer_device_type == 2)) {
- lpt_pe = (joystick->read_data8(config.printer_device_type + 1) != 0); // check joy port;
+ } else if((lpt_type == 1) || (lpt_type == 2)) {
+ lpt_pe = (joystick->read_data8(lpt_type + 1) != 0); // check joy port;
lpt_busy = true;
- lpt_error_inv = false;
- lpt_ackng_inv = false;
+ lpt_error_inv = true;
+ lpt_ackng_inv = true;
} else {
lpt_busy = true;
- lpt_error_inv = false;
- lpt_ackng_inv = false;
+ lpt_error_inv = true;
+ lpt_ackng_inv = true;
lpt_pe = true;
}
- ret &= (lpt_busy) ? 0xff : ~0x01;
- ret &= (lpt_error_inv) ? ~0x02 : 0xff;
- ret &= (lpt_ackng_inv) ? ~0x04 : 0xff;
- ret &= (lpt_pe) ? 0xff : ~0x08;
- ret &= (lpt_det1) ? 0xff : ~0x10;
- ret &= (lpt_det2) ? 0xff : ~0x20;
+ ret &= (lpt_busy) ? 0xff : ~0x01;
+ ret &= (lpt_error_inv) ? 0xff : ~0x02;
+ ret &= (lpt_ackng_inv) ? 0xff : ~0x04;
+ ret &= (lpt_pe) ? 0xff : ~0x08;
+ ret &= (lpt_det1) ? 0xff : ~0x10;
+ ret &= (lpt_det2) ? 0xff : ~0x20;
+ if((lpt_ackng_inv == true) && (ack_bak == false)) set_irq_printer(true);
return ret;
}
-void FM7_MAINIO::set_port_fd02(uint8 val)
+void FM7_MAINIO::set_port_fd02(uint8_t val)
{
#if !defined(_FM8)
irqmask_reg0 = val;
} else {
irqmask_mfd = true;
}
-// if(mfdirq_bak != irqmask_mfd) {
-// set_irq_mfd(irqreq_fdc);
-// }
if((val & 0x04) != 0) {
irqmask_timer = false;
void FM7_MAINIO::set_irq_printer(bool flag)
{
#if !defined(_FM8)
- uint8 backup = irqstat_reg0;
+ uint8_t backup = irqstat_reg0;
irqreq_printer = flag;
if(flag && !(irqmask_printer)) {
irqstat_reg0 &= ~0x02;
void FM7_MAINIO::set_irq_keyboard(bool flag)
{
- //uint8 backup = irqstat_reg0;
+ //uint8_t backup = irqstat_reg0;
//printf("MAIN: KEYBOARD: IRQ=%d MASK=%d\n", flag ,irqmask_keyboard);
irqreq_keyboard = flag;
if(flag && !irqmask_keyboard) {
}
-uint8 FM7_MAINIO::get_fd04(void)
+uint8_t FM7_MAINIO::get_fd04(void)
{
- uint8 val = 0x00;
+ uint8_t val = 0x00;
if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
if(!firq_break_key) val |= 0x02;
if(!firq_sub_attention) {
return val;
}
-void FM7_MAINIO::set_fd04(uint8 val)
+void FM7_MAINIO::set_fd04(uint8_t val)
{
// NOOP?
#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX)
}
// FD05
- uint8 FM7_MAINIO::get_fd05(void)
+ uint8_t FM7_MAINIO::get_fd05(void)
{
- uint8 val = 0x7e;
- //val = (sub_busy) ? 0xfe : 0x7e;
+ uint8_t val = 0x7e;
if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
if(!extdet_neg) val |= 0x01;
- //printf("FD05: READ: %d VAL=%02x\n", SDL_GetTicks(), val);
return val;
}
- void FM7_MAINIO::set_fd05(uint8 val)
+ void FM7_MAINIO::set_fd05(uint8_t val)
{
sub_cancel = ((val & 0x40) != 0) ? true : false;
sub_halt = ((val & 0x80) != 0) ? true : false;
if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) {
return;
}
- config.boot_mode = 1; // DOS : Where BUBBLE?
- mainmem->write_signal(FM7_MAINIO_BOOTMODE, config.boot_mode, 0xffffffff);
+ bootmode = 1; // DOS : Where BUBBLE?
+ mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff);
mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff);
#endif
mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0, 0xffffffff);
}
-uint8 FM7_MAINIO::read_fd0f(void)
+uint8_t FM7_MAINIO::read_fd0f(void)
{
#if defined(_FM8)
if((config.dipswitch & FM7_DIPSW_FM8_PROTECT_FD0F) != 0) {
return 0xff;
}
- config.boot_mode = 0; // BASIC
- mainmem->write_signal(FM7_MAINIO_BOOTMODE, config.boot_mode, 0xffffffff);
+ bootmode = 0; // BASIC
+ mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff);
mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0xffffffff, 0xffffffff);
#endif
mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, 0xffffffff, 0xffffffff);
// Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
-void FM7_MAINIO::write_kanjiaddr_hi(uint8 addr)
+void FM7_MAINIO::write_kanjiaddr_hi(uint8_t addr)
{
if(!connect_kanjiroml1) return;
#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
return;
}
-void FM7_MAINIO::write_kanjiaddr_lo(uint8 addr)
+void FM7_MAINIO::write_kanjiaddr_lo(uint8_t addr)
{
if(!connect_kanjiroml1) return;
#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
return;
}
-uint8 FM7_MAINIO::read_kanjidata_left(void)
+uint8_t FM7_MAINIO::read_kanjidata_left(void)
{
if(!connect_kanjiroml1) return 0xff;
#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
}
}
-uint8 FM7_MAINIO::read_kanjidata_right(void)
+uint8_t FM7_MAINIO::read_kanjidata_right(void)
{
if(!connect_kanjiroml1) return 0xff;
#if defined(_FM77AV40) || defined(_FM77AV40EX) || defined(_FM77AV40SX) || \
#ifdef CAPABLE_KANJI_CLASS2
// Kanji ROM, FD20 AND FD21 (or SUBSYSTEM)
-void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8 addr)
+void FM7_MAINIO::write_kanjiaddr_hi_l2(uint8_t addr)
{
if(!connect_kanjiroml2) return;
if(!stat_kanjirom) return;
return;
}
-void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8 addr)
+void FM7_MAINIO::write_kanjiaddr_lo_l2(uint8_t addr)
{
if(!connect_kanjiroml2) return;
if(!stat_kanjirom) return;
return;
}
-uint8 FM7_MAINIO::read_kanjidata_left_l2(void)
+uint8_t FM7_MAINIO::read_kanjidata_left_l2(void)
{
if(!connect_kanjiroml2) return 0xff;
if(!stat_kanjirom) return 0xff;
}
}
-uint8 FM7_MAINIO::read_kanjidata_right_l2(void)
+uint8_t FM7_MAINIO::read_kanjidata_right_l2(void)
{
if(!connect_kanjiroml2) return 0xff;
if(!stat_kanjirom) return 0xff;
#endif
-uint32 FM7_MAINIO::read_signal(int id)
+uint32_t FM7_MAINIO::read_signal(int id)
{
- uint32 retval;
+ uint32_t retval;
switch(id) {
case FM7_MAINIO_KEYBOARDIRQ_MASK:
retval = (irqmask_keyboard) ? 0xffffffff : 0x00000000;
}
-void FM7_MAINIO::write_signal(int id, uint32 data, uint32 mask)
+void FM7_MAINIO::write_signal(int id, uint32_t data, uint32_t mask)
{
bool val_b;
val_b = ((data & mask) != 0);
} else {
clock_fast = false;
}
- {
-#if 0
- uint32 clocks = 1794000;
-#if defined(_FM77AV_VARIANTS) || defined(_FM77_VARIANTS)
- if(mainmem->read_signal(FM7_MAINIO_MMR_ENABLED) != 0) {
- if(mainmem->read_signal(FM7_MAINIO_FASTMMR_ENABLED)) {
- if(clock_fast) {
- clocks = 2016000; // Hz
- } else {
- clocks = 1230502; // (2016 * 1095 / 1794)[KHz]
- }
- } else {
- if(clock_fast) {
- clocks = 1565000; // Hz
- } else {
- clocks = 955226; // (1565 * 1095 / 1794)[KHz]
- }
- }
- } else {
- if(clock_fast) {
- clocks = 1794000; // Hz
- } else {
- clocks = 1095000; // Hz
- }
- }
-#else // 7/8
- if(clock_fast) {
- clocks = 1794000; // Hz
- } else {
- clocks = 1095000; // Hz
- }
-#endif
- p_vm->set_cpu_clock(this->maincpu, clocks);
-#endif
- mainmem->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
- display->write_signal(SIG_DISPLAY_CLOCK, clock_fast ? 1 : 0, 1);
- }
+ this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
break;
case FM7_MAINIO_CMT_RECV: // FD02
cmt_indat = val_b ^ cmt_invert;
case FM7_MAINIO_LPTIRQ: //
set_irq_printer(val_b);
break;
+ case FM7_MAINIO_LPT_BUSY:
+ lpt_busy = val_b;
+ break;
+ case FM7_MAINIO_LPT_ERROR:
+ lpt_error_inv = val_b;
+ break;
+ case FM7_MAINIO_LPT_ACK:
+ {
+ bool f = lpt_ackng_inv;
+ lpt_ackng_inv = val_b;
+ if((lpt_ackng_inv == true) && (f == false)) set_irq_printer(true);
+ }
+ break;
+ case FM7_MAINIO_LPT_PAPER_EMPTY:
+ lpt_busy = val_b;
+ break;
+ case FM7_MAINIO_LPT_DET1:
+ lpt_det1 = val_b;
+ break;
+ case FM7_MAINIO_LPT_DET2:
+ lpt_det2 = val_b;
+ break;
case FM7_MAINIO_KEYBOARDIRQ: //
set_irq_keyboard(val_b);
break;
}
- uint8 FM7_MAINIO::get_irqstat_fd03(void)
+ uint8_t FM7_MAINIO::get_irqstat_fd03(void)
{
- uint8 val;
+ uint8_t val;
bool extirq;
#if !defined(_FM8)
extirq = irqstat_fdc | intstat_opn | intstat_whg | intstat_thg;
#endif
}
-uint8 FM7_MAINIO::get_extirq_fd17(void)
+uint8_t FM7_MAINIO::get_extirq_fd17(void)
{
- uint8 val = 0xff;
+ uint8_t val = 0xff;
#if !defined(_FM8)
if(intstat_opn && connect_opn) val &= ~0x08;
if(intstat_mouse) val &= ~0x04;
return val;
}
-void FM7_MAINIO::set_ext_fd17(uint8 data)
+void FM7_MAINIO::set_ext_fd17(uint8_t data)
{
#if !defined(_FM8)
if((data & 0x04) != 0) {
#if defined(_FM77AV_VARIANTS)
// FD12
-uint8 FM7_MAINIO::subsystem_read_status(void)
+uint8_t FM7_MAINIO::subsystem_read_status(void)
{
return reg_fd12;
}
#endif
-uint32 FM7_MAINIO::read_io8(uint32 addr)
+uint32_t FM7_MAINIO::read_io8(uint32_t addr)
{ // This is only for debug.
addr = addr & 0xfff;
if(addr < 0x100) {
return io_w_latch[addr];
} else if(addr < 0x500) {
- uint32 ofset = addr & 0xff;
+ uint32_t ofset = addr & 0xff;
uint opnbank = (addr - 0x100) >> 8;
return opn_regs[opnbank][ofset];
} else if(addr < 0x600) {
return 0xff;
}
-uint32 FM7_MAINIO::read_dma_io8(uint32 addr)
+uint32_t FM7_MAINIO::read_dma_io8(uint32_t addr)
{
return this->read_data8(addr & 0xff);
}
-uint32 FM7_MAINIO::read_dma_data8(uint32 addr)
+uint32_t FM7_MAINIO::read_dma_data8(uint32_t addr)
{
return this->read_data8(addr & 0xff);
}
-uint32 FM7_MAINIO::read_data8(uint32 addr)
+uint32_t FM7_MAINIO::read_data8(uint32_t addr)
{
- uint32 retval;
- uint32 mmr_segment;
+ uint32_t retval;
+ uint32_t mmr_segment;
if(addr < FM7_MAINIO_IS_BASICROM) {
addr = addr & 0xff;
retval = 0xff;
// if((addr >= 0x0006) && !(addr == 0x1f) && !(addr == 0x0b)) printf("MAINIO: READ: %08x \n", addr);
switch(addr) {
case 0x00: // FD00
- retval = (uint32) get_port_fd00();
+ retval = (uint32_t) get_port_fd00();
break;
case 0x01: // FD01
#if !defined(_FM8)
#endif
break;
case 0x02: // FD02
- retval = (uint32) get_port_fd02();
+ retval = (uint32_t) get_port_fd02();
break;
case 0x03: // FD03
#if !defined(_FM8)
- retval = (uint32) get_irqstat_fd03();
+ retval = (uint32_t) get_irqstat_fd03();
#endif
break;
case 0x04: // FD04
- retval = (uint32) get_fd04();
+ retval = (uint32_t) get_fd04();
break;
case 0x05: // FD05
- retval = (uint32) get_fd05();
+ retval = (uint32_t) get_fd05();
break;
case 0x06: // RS-232C
case 0x07:
break;
#endif
case 0x0e: // PSG DATA
- retval = (uint32) get_psg();
+ retval = (uint32_t) get_psg();
//printf("PSG DATA READ val=%02x\n", retval);
break;
case 0x0f: // FD0F
read_fd0f();
retval = 0xff;
break;
+#if defined(_FM8)
+ case 0x10:
+ case 0x11:
+ case 0x12:
+ case 0x13:
+ case 0x14:
+ case 0x15:
+ case 0x16:
+ case 0x17:
+ retval = bubble_casette[0]->read_data8(addr);
+ break;
+#else
#if defined(_FM77AV_VARIANTS)
case 0x12:
retval = subsystem_read_status();
//printf("OPN CMD READ \n");
break;
case 0x16: // OPN DATA
- retval = (uint32) get_opn(0);
+ retval = (uint32_t) get_opn(0);
break;
case 0x17:
- retval = (uint32) get_extirq_fd17();
+ retval = (uint32_t) get_extirq_fd17();
break;
+#endif
case 0x18: // FDC: STATUS
- retval = (uint32) get_fdc_stat();
+ retval = (uint32_t) get_fdc_stat();
//printf("FDC: READ STATUS %02x PC=%04x\n", retval, maincpu->get_pc());
break;
case 0x19: // FDC: Track
- retval = (uint32) get_fdc_track();
+ retval = (uint32_t) get_fdc_track();
//printf("FDC: READ TRACK REG %02x\n", retval);
break;
case 0x1a: // FDC: Sector
- retval = (uint32) get_fdc_sector();
+ retval = (uint32_t) get_fdc_sector();
//printf("FDC: READ SECTOR REG %02x\n", retval);
break;
case 0x1b: // FDC: Data
- retval = (uint32) get_fdc_data();
+ retval = (uint32_t) get_fdc_data();
break;
case 0x1c:
- retval = (uint32) get_fdc_fd1c();
+ retval = (uint32_t) get_fdc_fd1c();
//printf("FDC: READ HEAD REG %02x\n", retval);
break;
case 0x1d:
- retval = (uint32) get_fdc_motor();
+ retval = (uint32_t) get_fdc_motor();
//printf("FDC: READ MOTOR REG %02x\n", retval);
break;
case 0x1e:
- retval = (uint32) get_fdc_fd1e();
+ retval = (uint32_t) get_fdc_fd1e();
//printf("FDC: READ MOTOR REG %02x\n", retval);
break;
case 0x1f:
- retval = (uint32) fdc_getdrqirq();
+ retval = (uint32_t) fdc_getdrqirq();
break;
case 0x22: // Kanji ROM
- retval = (uint32) read_kanjidata_left();
+ retval = (uint32_t) read_kanjidata_left();
break;
case 0x23: // Kanji ROM
- retval = (uint32) read_kanjidata_right();
+ retval = (uint32_t) read_kanjidata_right();
break;
#if defined(CAPABLE_KANJI_CLASS2)
case 0x2e: // Kanji ROM Level2
- retval = (uint32) read_kanjidata_left_l2();
+ retval = (uint32_t) read_kanjidata_left_l2();
break;
case 0x2f: // Kanji ROM Level2
- retval = (uint32) read_kanjidata_right_l2();
+ retval = (uint32_t) read_kanjidata_right_l2();
break;
#endif
#if !defined(_FM8)
case 0x37: // Multi page
- //retval = (uint32)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
+ //retval = (uint32_t)display->read_data8(DISPLAY_ADDR_MULTIPAGE);
break;
case 0x45: // WHG CMD
break;
case 0x46: // WHG DATA
- retval = (uint32) get_opn(1);
+ retval = (uint32_t) get_opn(1);
break;
case 0x47:
- retval = (uint32) get_extirq_whg();
+ retval = (uint32_t) get_extirq_whg();
break;
case 0x51: // THG CMD
break;
case 0x52: // THG DATA
- retval = (uint32) get_opn(2);
+ retval = (uint32_t) get_opn(2);
break;
case 0x53:
- retval = (uint32) get_extirq_thg();
+ retval = (uint32_t) get_extirq_thg();
break;
#endif
#if defined(HAS_MMR)
#if !defined(_FM8)
if((addr < 0x40) && (addr >= 0x38)) {
addr = (addr - 0x38) + FM7_SUBMEM_OFFSET_DPALETTE;
- return (uint32) display->read_data8(addr);
+ return (uint32_t) display->read_data8(addr);
}
#endif
// Another:
return retval;
} else if(addr == FM7_MAINIO_CLOCKMODE) {
- return (uint32)get_clockmode();
+ return (uint32_t)get_clockmode();
}
#if defined(_FM77AV_VARIANTS)
else if(addr == FM7_MAINIO_SUBMONITOR_ROM) {
return 0xff;
}
-void FM7_MAINIO::write_dma_io8(uint32 addr, uint32 data)
+void FM7_MAINIO::write_dma_io8(uint32_t addr, uint32_t data)
{
this->write_data8(addr & 0xff, data);
}
-void FM7_MAINIO::write_dma_data8(uint32 addr, uint32 data)
+void FM7_MAINIO::write_dma_data8(uint32_t addr, uint32_t data)
{
this->write_data8(addr & 0xff, data);
}
-void FM7_MAINIO::write_data8(uint32 addr, uint32 data)
+void FM7_MAINIO::write_data8(uint32_t addr, uint32_t data)
{
bool flag;
- uint32 mmr_segment;
+ uint32_t mmr_segment;
if(addr < FM7_MAINIO_IS_BASICROM) {
addr = addr & 0xff;
io_w_latch[addr] = data;
#endif
switch(addr) {
case 0x00: // FD00
- set_port_fd00((uint8)data);
+ set_port_fd00((uint8_t)data);
return;
break;
case 0x01: // FD01
- switch(config.printer_device_type) {
+ lpt_outdata = (uint8_t)data;
+ switch(lpt_type) {
case 0: // Write to file
printer->write_signal(SIG_PRINTER_DATA, data, 0xff);
- set_irq_printer(lpt_strobe & lpt_slctin);
break;
case 1:
case 2:
joystick->write_data8(0x01, data);
- //set_irq_printer(lpt_strobe & lpt_slctin);
break;
}
break;
case 0x02: // FD02
- set_port_fd02((uint8)data);
+ set_port_fd02((uint8_t)data);
break;
case 0x03: // FD03
set_beep(data);
set_fd04(data);
break;
case 0x05: // FD05
- set_fd05((uint8)data);
+ set_fd05((uint8_t)data);
break;
case 0x06: // RS-232C
case 0x07:
case 0x0f: // FD0F
write_fd0f();
break;
+#if defined(_FM8)
+ case 0x10:
+ case 0x11:
+ case 0x12:
+ case 0x13:
+ case 0x14:
+ case 0x15:
+ case 0x16:
+ case 0x17:
+ bubble_casette[0]->write_data8(addr, data);
+ break;
+#else
#if defined(_FM77AV_VARIANTS)
case 0x10:
flag = ((data & 0x02) == 0) ? true : false;
break;
case 0x13:
sub_monitor_type = data & 0x07;
- display->write_signal(SIG_FM7_SUB_BANK, sub_monitor_type, 0x07);
+ display->write_signal(SIG_FM7_SUB_BANK, sub_monitor_type, 0x07);
break;
#endif
case 0x15: // OPN CMD
set_opn(0, data);
break;
case 0x17:
- set_ext_fd17((uint8)data);
+ set_ext_fd17((uint8_t)data);
break;
+#endif
case 0x18: // FDC: COMMAND
- set_fdc_cmd((uint8)data);
+ set_fdc_cmd((uint8_t)data);
//printf("FDC: WRITE CMD %02x\n", data);
break;
case 0x19: // FDC: Track
- set_fdc_track((uint8)data);
+ set_fdc_track((uint8_t)data);
//printf("FDC: WRITE TRACK REG %02x\n", data);
break;
case 0x1a: // FDC: Sector
- set_fdc_sector((uint8)data);
+ set_fdc_sector((uint8_t)data);
//printf("FDC: WRITE SECTOR REG %02x\n", data);
break;
case 0x1b: // FDC: Data
- set_fdc_data((uint8)data);
+ set_fdc_data((uint8_t)data);
break;
case 0x1c:
- set_fdc_fd1c((uint8)data);
+ set_fdc_fd1c((uint8_t)data);
//printf("FDC: WRITE HEAD REG %02x\n", data);
break;
case 0x1d:
- set_fdc_fd1d((uint8)data);
+ set_fdc_fd1d((uint8_t)data);
//printf("FDC: WRITE MOTOR REG %02x\n", data);
break;
case 0x1e:
- set_fdc_fd1e((uint8)data);
+ set_fdc_fd1e((uint8_t)data);
break;
case 0x1f: // ??
return;
break;
case 0x20: // Kanji ROM
- write_kanjiaddr_hi((uint8)data);
+ write_kanjiaddr_hi((uint8_t)data);
break;
case 0x2c: // Kanji ROM(DUP)
#if defined(CAPABLE_KANJI_CLASS2)
- write_kanjiaddr_hi_l2((uint8)data);
+ write_kanjiaddr_hi_l2((uint8_t)data);
#else
- //write_kanjiaddr_hi((uint8)data);
+ //write_kanjiaddr_hi((uint8_t)data);
#endif
break;
case 0x21: // Kanji ROM
- write_kanjiaddr_lo((uint8)data);
+ write_kanjiaddr_lo((uint8_t)data);
break;
case 0x2d: // Kanji ROM(DUP)
#if defined(CAPABLE_KANJI_CLASS2)
- write_kanjiaddr_lo_l2((uint8)data);
+ write_kanjiaddr_lo_l2((uint8_t)data);
#else
- //write_kanjiaddr_lo((uint8)data);
+ //write_kanjiaddr_lo((uint8_t)data);
#endif
break;
#if defined(CAPABLE_DICTROM)
// printf("MMR SEGMENT: %02x\n", data & 3);
mmr_segment = data & 3;
#endif
- mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, (uint32)mmr_segment);
+ mainmem->write_data8(FM7_MAINIO_MMR_SEGMENT, (uint32_t)mmr_segment);
break;
case 0x92:
- mainmem->write_data8(FM7_MAINIO_WINDOW_OFFSET, (uint32)(data & 0x00ff));
+ mainmem->write_data8(FM7_MAINIO_WINDOW_OFFSET, (uint32_t)(data & 0x00ff));
break;
case 0x93:
mainmem->write_signal(FM7_MAINIO_BOOTRAM_RW, data, 0x01);
#if !defined(_FM8)
if((addr < 0x40) && (addr >= 0x38)) {
addr = (addr - 0x38) | FM7_SUBMEM_OFFSET_DPALETTE;
- display->write_data8(addr, (uint8)data);
+ display->write_data8(addr, (uint8_t)data);
return;
}// Another:
#endif
return;
} else if(addr == FM7_MAINIO_CLOCKMODE) {
- set_clockmode((uint8)data);
+ set_clockmode((uint8_t)data);
return;
}
//if((addr >= 0x0006) && !(addr == 0x1f)) printf("MAINIO: WRITE: %08x DATA=%08x\n", addr, data);
set_fdc_motor(false);
event_fdc_motor = -1;
break;
+ case EVENT_PRINTER_RESET_COMPLETED:
+ this->write_signals(&printer_reset_bus, 0x00);
+ break;
default:
break;
}
clock_fast = false;
break;
}
- this->write_signal(FM7_MAINIO_CLOCKMODE, clock_fast ? 1 : 0, 1);
+ this->write_signals(&clock_status, clock_fast ? 0xffffffff : 0);
#if defined(_FM8)
// BASIC
if(config.boot_mode == 0) {
mainmem->write_signal(FM7_MAINIO_IS_BASICROM, 0, 0xffffffff);
}
mainmem->write_signal(FM7_MAINIO_PUSH_FD0F, (config.boot_mode == 0) ? 1 : 0, 0x01);
- mainmem->write_signal(FM7_MAINIO_BOOTMODE, config.boot_mode, 0xffffffff);
+ mainmem->write_signal(FM7_MAINIO_BOOTMODE, bootmode, 0xffffffff);
#endif
}
{
}
-#define STATE_VERSION 4
+#define STATE_VERSION 6
void FM7_MAINIO::save_state(FILEIO *state_fio)
{
int ch;
int addr;
state_fio->FputUint32_BE(STATE_VERSION);
state_fio->FputInt32_BE(this_device_id);
+ p_emu->out_debug_log("Save State: MAINIO: id=%d ver=%d\n", this_device_id, STATE_VERSION);
// Version 1
{
state_fio->FputBool(irqreq_syndet);
state_fio->FputBool(irqreq_rxrdy);
state_fio->FputBool(irqreq_txrdy);
- state_fio->FputBool(irqreq_fdc);
state_fio->FputBool(irqreq_printer);
state_fio->FputBool(irqreq_keyboard);
// FD03
state_fio->FputBool(intmode_fdc);
// FD05
state_fio->FputBool(extdet_neg);
- //state_fio->FputBool(sub_busy);
state_fio->FputBool(sub_halt);
- //state_fio->FputBool(sub_halt_bak);
state_fio->FputBool(sub_cancel);
- //state_fio->FputBool(sub_cancel_bak);
#if defined(WITH_Z80)
state_fio->FputBool(z80_sel);
#endif
int ch;
int addr;
//bool stat = false;
- uint32 version;
+ uint32_t version;
version = state_fio->FgetUint32_BE();
if(this_device_id != state_fio->FgetInt32_BE()) return false;
+ p_emu->out_debug_log("Load State: MAINIO: id=%d ver=%d\n", this_device_id, version);
if(version >= 1) {
for(addr = 0; addr < 0x100; addr++) io_w_latch[addr] = state_fio->FgetUint8();
irqreq_syndet = state_fio->FgetBool();
irqreq_rxrdy = state_fio->FgetBool();
irqreq_txrdy = state_fio->FgetBool();
- irqreq_fdc = state_fio->FgetBool();
irqreq_printer = state_fio->FgetBool();
irqreq_keyboard = state_fio->FgetBool();
// FD03
intmode_fdc = state_fio->FgetBool();
// FD05
extdet_neg = state_fio->FgetBool();
- //sub_busy = state_fio->FgetBool();
sub_halt = state_fio->FgetBool();
- //sub_halt_bak = state_fio->FgetBool();
sub_cancel = state_fio->FgetBool();
- //sub_cancel_bak = state_fio->FgetBool();
#if defined(WITH_Z80)
z80_sel = state_fio->FgetBool();
#endif
#endif
#if defined(HAS_DMA)
intstat_dma = state_fio->FgetBool();
- dma_addr = (uint32)(state_fio->FgetUint8() & 0x1f);
+ dma_addr = (uint32_t)(state_fio->FgetUint8() & 0x1f);
#endif
#if defined(_FM77AV_VARIANTS)
reg_fd12 = state_fio->FgetUint8();
#endif
- }
+ }
+ if(version != STATE_VERSION) return false;
return true;
}