register_event(this, EVENT_FM7SUB_VSTART, 1.0 * 1000.0, false, &vstart_event_id);
register_event(this, EVENT_FM7SUB_DISPLAY_NMI, 20000.0, true, &nmi_event_id); // NEXT CYCLE_
sub_busy = true;
+ mainio->write_signal(FM7_MAINIO_SUB_BUSY, 0x01, 0x01);
// subcpu->reset();
}
void DISPLAY::halt_subcpu(void)
{
- bool flag = !(sub_run);
- if(flag) {
- sub_busy = true;
- mainio->write_signal(FM7_MAINIO_SUB_BUSY, 0x01, 0x01);
- subcpu->write_signal(SIG_CPU_BUSREQ, 0x01, 0x01);
- }
+ //sub_busy = true;
+ //mainio->write_signal(FM7_MAINIO_SUB_BUSY, 0x01, 0x01);
+ subcpu->write_signal(SIG_CPU_BUSREQ, 0x01, 0x01);
}
void DISPLAY::go_subcpu(void)
{
- bool flag = sub_run;
- if(flag) {
- subcpu->write_signal(SIG_CPU_BUSREQ, 0x00, 0x01);
- }
-
+ //sub_busy = true;
+ //mainio->write_signal(FM7_MAINIO_SUB_BUSY, 0x01, 0x01);
+ subcpu->write_signal(SIG_CPU_BUSREQ, 0x00, 0x01);
}
void DISPLAY::enter_display(void)
//SUB:D402:R
uint8 DISPLAY::acknowledge_irq(void)
{
- //if(cancel_request) this->do_irq(false);
+ if(cancel_request) this->do_irq(false);
cancel_request = false;
- do_irq(false);
return 0xff;
}
switch(id) {
case SIG_FM7_SUB_HALT:
case SIG_DISPLAY_HALT:
- return (halt_flag) ? 0 : 0xffffffff;
+ return (halt_flag) ? 0xffffffff : 0;
break;
case SIG_DISPLAY_BUSY:
return (sub_busy) ? 0x80 : 0;
int y;
switch(id) {
case SIG_FM7_SUB_HALT:
- if(cancel_request && flag) {
- sub_run = true;
- restart_subsystem();
- //subcpu->write_signal(SIG_CPU_BUSREQ, 0, 1);
- //printf("SUB: HALT : CANCEL\n");
- sub_busy = true;
- return;
- }
- halt_flag = flag;
if(flag) {
sub_busy = true;
+ mainio->write_signal(FM7_MAINIO_SUB_BUSY, 0x01, 0x01);
}
+ //if(cancel_request && flag && (flag != halt_flag)) {
+ // restart_subsystem();
+ //halt_flag = false;
+ //printf("SUB: HALT : CANCEL\n");
+ // return;
+ //}
+ halt_flag = flag;
//printf("SUB: HALT : DID STAT=%d\n", flag);
break;
case SIG_DISPLAY_HALT:
subcpu->reset();
#endif
subcpu_resetreq = false;
- restart_subsystem();
} else {
- restart_subsystem();
}
-#else
- restart_subsystem();
#endif
+ restart_subsystem();
}
- //halt_flag = flag;
break;
case SIG_FM7_SUB_CANCEL:
//if(flag) {
- cancel_request = flag;
//printf("MAIN: CANCEL REQUEST TO SUB\n");
- do_irq(flag);
- // }
+ if(flag) {
+ cancel_request = true;
+ do_irq(true);
+ }
break;
case SIG_DISPLAY_CLOCK:
if(clock_fast != flag) {
reset_vramaccess();
break;
case 0x0a:
- if(clr_count <= 0) {
+ //if(clr_count <= 0) {
set_subbusy();
- } else { // Read once when using clr_foo() to set busy flag.
- double usec = (1000.0 * 1000.0) / 999000.0;
- if(mainio->read_data8(FM7_MAINIO_CLOCKMODE) != FM7_MAINCLOCK_SLOW) usec = (1000.0 * 1000.0) / 2000000.0;
- if(!is_cyclesteal) usec = usec * 3.0;
- usec = (double)clr_count * usec;
- register_event(this, EVENT_FM7SUB_CLR, usec, false, NULL); // NEXT CYCLE_
- reset_subbusy();
- clr_count = 0;
- }
+ //} else { // Read once when using clr_foo() to set busy flag.
+ // double usec = (1000.0 * 1000.0) / 999000.0;
+ // if(mainio->read_data8(FM7_MAINIO_CLOCKMODE) != FM7_MAINCLOCK_SLOW) usec = (1000.0 * 1000.0) / 2000000.0;
+ // if(!is_cyclesteal) usec = usec * 3.0;
+ // usec = (double)clr_count * usec;
+ // register_event(this, EVENT_FM7SUB_CLR, usec, false, NULL); // NEXT CYCLE_
+ // reset_subbusy();
+ // clr_count = 0;
+ //}
break;
case 0x0d:
keyboard->write_signal(SIG_FM7KEY_SET_INSLED, 0x00, 0x01);
#endif
tmp_offset_point.d = 0;
offset_point = 0;
+ halt_flag = false;
}
void DISPLAY::release()
irqreg_fdc &= 0xbf; //0b10111111;
irqstat_fdc = false;
}
- if(backup != irqreg_fdc) do_irq(irqstat_fdc);
+ if(backup != irqreg_fdc) do_irq();
return;
}
#define USE_SOUND_DEVICE_TYPE 8
#define USE_SCANLINE
#define USE_DIPSWITCH
-#define USE_BOOT_MODE 4
#define USE_CPU_TYPE
#define USE_SPECIAL_RESET
//#undef HAS_YM2608
#endif
#if defined(_FM77_VARIANTS)
-#define USE_BOOT_MODE 3
+#define USE_BOOT_MODE 4
#elif defined(_FM8)
+#define USE_BOOT_MODE 4
+#elif defined(_FM7) || defined(_FMNEW7)
#define USE_BOOT_MODE 3
#else
#define USE_BOOT_MODE 2
display->write_signal(SIG_FM7_SUB_KEY_FIRQ, flag ? 1 : 0, 1);
//printf("KEYBOARD: Interrupted %d\n", flag);
irqmask_keyboard = flag;
- do_irq(flag);
+ do_irq();
}
return;
if(flag && !(irqmask_timer)) {
irqstat_reg0 &= ~0x04;
irqstat_timer = true;
- if(backup != irqstat_reg0) do_irq(true);
+ if(backup != irqstat_reg0) do_irq();
} else {
irqstat_reg0 |= 0x04;
irqstat_timer = false;
- if(backup != irqstat_reg0) do_irq(false);
+ if(backup != irqstat_reg0) do_irq();
}
//printf("IRQ TIMER: %02x MASK=%d\n", irqstat_reg0, irqmask_timer);
}
if(flag && !(irqmask_printer)) {
irqstat_reg0 &= ~0x02;
irqstat_printer = true;
- if(backup != irqstat_reg0) do_irq(true);
+ if(backup != irqstat_reg0) do_irq();
} else {
irqstat_reg0 |= 0x02;
irqstat_printer = false;
- if(backup != irqstat_reg0) do_irq(false);
+ if(backup != irqstat_reg0) do_irq();
}
-// if(!irqmask_printer || !flag) do_irq(flag);
+// if(!irqmask_printer || !flag) do_irq();
}
void FM7_MAINIO::set_irq_keyboard(bool flag)
if(flag) {
irqstat_reg0 &= ~0x01;
irqstat_keyboard = true;
- if(backup != irqstat_reg0) do_irq(true);
+ if(backup != irqstat_reg0) do_irq();
} else {
//irqstat_reg0 &= 0b11111110;
irqstat_reg0 |= 0x01;
irqstat_keyboard = false;
- if(backup != irqstat_reg0) do_irq(false);
+ if(backup != irqstat_reg0) do_irq();
}
//printf("MAIN: KEYBOARD: IRQ=%d\n", flag && !(irqmask_keyboard));
}
}
-void FM7_MAINIO::do_irq(bool flag)
+void FM7_MAINIO::do_irq(void)
{
bool intstat;
intstat = irqstat_timer | irqstat_keyboard | irqstat_printer;
irqstat_bak = intstat;
}
-void FM7_MAINIO::do_firq(bool flag)
+void FM7_MAINIO::do_firq(void)
{
bool firq_stat;
- firq_stat = firq_break_key || firq_sub_attention;
+ firq_stat = firq_break_key | firq_sub_attention;
//printf("%08d : FIRQ: break=%d attn=%d stat = %d\n", SDL_GetTicks(), firq_break_key, firq_sub_attention, firq_stat);
- //if(firqstat_bak == firq_stat) return;
+ if(firqstat_bak == firq_stat) return;
if(firq_stat) {
maincpu->write_signal(SIG_CPU_FIRQ, 1, 1);
} else {
void FM7_MAINIO::set_break_key(bool pressed)
{
firq_break_key = pressed;
- do_firq(pressed);
+ do_firq();
}
void FM7_MAINIO::set_sub_attention(bool flag)
{
firq_sub_attention = flag;
- do_firq(flag);
+ do_firq();
}
uint8 FM7_MAINIO::get_fd04(void)
{
- //uint8 val = display->read_signal(SIG_DISPLAY_BUSY) | ~0x83;
- uint8 val = ~0x83;
- if(sub_busy) val |= 0x80;
+ uint8 val = 0x7c;
+ if(display->read_signal(SIG_DISPLAY_BUSY) != 0) val |= 0x80;
if(!firq_break_key) val |= 0x02;
if(!firq_sub_attention) {
val |= 0x01;
// FD05
uint8 FM7_MAINIO::get_fd05(void)
{
- // uint8 val = (display->read_signal(SIG_DISPLAY_BUSY) == 0) ? 0x00 : 0x80;
uint8 val;
- val = (sub_busy) ? 0x80 : 0x00;
+ val = (display->read_signal(SIG_DISPLAY_BUSY) != 0) ? 0xfe : 0x7e;
if(!extdet_neg) val |= 0x01;
return val;
}
set_break_key(val_b);
break;
case FM7_MAINIO_SUB_ATTENTION:
- set_sub_attention(val_b);
+ if(val_b) set_sub_attention(true);
break;
// FD05
case FM7_MAINIO_SUB_BUSY:
case FM7_MAINIO_OPN_IRQ:
if(!connect_opn) break;
intstat_opn = val_b;
- do_irq(val_b);
+ do_irq();
break;
case FM7_MAINIO_WHG_IRQ:
if(!connect_whg) break;
intstat_whg = val_b;
- do_irq(val_b);
+ do_irq();
break;
case FM7_MAINIO_THG_IRQ:
if(!connect_thg) break;
intstat_thg = val_b;
- do_irq(val_b);
+ do_irq();
break;
case FM7_MAINIO_FDC_DRQ:
set_drq_mfd(val_b);
void reset_fdc(void);
void set_fdc_motor(bool flag);
- void do_irq(bool flag);
+ void do_irq(void);
void set_irq_timer(bool flag);
void set_irq_printer(bool flag);
void set_irq_keyboard(bool flag);
void set_keyboard(uint32 data);
// FD04
- void do_firq(bool flag);
+ void do_firq(void);
void do_nmi(bool flag);
void set_break_key(bool pressed);
}
#if defined(_FM77AV_VARIANTS)
else if(bank == FM7_MAINMEM_AV_DIRECTACCESS) {
- if(display->read_signal(SIG_DISPLAY_HALT) != 0) return 0xff; // Not halt
+ if(!sub_halted) return 0xff; // Not halt
+ //if(display->read_signal(SIG_DISPLAY_HALT) != 0) return 0xff; // Not halt
//printf("READ MMR : %04x to %05x\n", addr, realaddr);
return display->read_data8(realaddr); // Okay?
}
}
#if defined(_FM77AV_VARIANTS)
else if(bank == FM7_MAINMEM_AV_DIRECTACCESS) {
- if(display->read_signal(SIG_DISPLAY_HALT) != 0) return; // Not halt
+ if(!sub_halted) return; // Not halt
+ //if(display->read_signal(SIG_DISPLAY_HALT) != 0) return; // Not halt
//printf("WRITE MMR : %04x to %05x\n", addr, realaddr);
display->write_data8(realaddr, data); // Okay?
return;