(nw) fp1100 : added notes

This commit is contained in:
Robbbert 2017-10-21 04:15:11 +11:00
parent 48487f9972
commit 034cf8659c

View File

@ -23,7 +23,7 @@
The keyboard is a separate unit. It contains a beeper.
TODO:
- irq sources and communications;
- irq sources and communications; subcpu never enables its interrupts.
- unimplemented instruction PER triggered (can be ignored)
- Most of this code is guesswork, because although schematics exist,
they are too blurry to read.
@ -35,21 +35,6 @@
- FDC not done.
To get it to boot while in debugger:
- focus 1
- g
- after a second it will get stuck in a loop at fc2-fc4
- press enter until it is at fc4
- pc++
- g
Now it will start. You will most likely get an error message, although
sometimes you'll get the Casio Basic title. Cursor will be flashing.
- The message will most likely be blue, but it should be white.
- Sometimes it will be in inverse video, and sometimes not.
- Sometimes it will beep, and sometimes not.
- The interrupt timing is quite critical.
****************************************************************************/
#include "emu.h"
@ -100,10 +85,10 @@ public:
DECLARE_WRITE8_MEMBER(portc_w);
DECLARE_WRITE_LINE_MEMBER(centronics_busy_w);
DECLARE_WRITE_LINE_MEMBER(cass_w);
INTERRUPT_GEN_MEMBER(fp1100_vblank_irq);
INTERRUPT_GEN_MEMBER(vblank_irq);
DECLARE_DRIVER_INIT(fp1100);
DECLARE_MACHINE_RESET(fp1100);
MC6845_UPDATE_ROW(fp1100_update_row);
MC6845_UPDATE_ROW(crtc_update_row);
TIMER_DEVICE_CALLBACK_MEMBER(timer_c);
required_device<palette_device> m_palette;
private:
@ -139,7 +124,7 @@ private:
required_device<cassette_image_device> m_cass;
};
MC6845_UPDATE_ROW( fp1100_state::fp1100_update_row )
MC6845_UPDATE_ROW( fp1100_state::crtc_update_row )
{
const rgb_t *palette = m_palette->palette()->entry_list_raw();
uint8_t r,g,b,col,i;
@ -193,22 +178,21 @@ WRITE8_MEMBER( fp1100_state::irq_mask_w )
{
machine().scheduler().synchronize(); // force resync
m_irq_mask = data;
m_subcpu->set_input_line(UPD7810_INTF2, BIT(data, 7) ? HOLD_LINE : CLEAR_LINE);
if (BIT(data, 7))
m_subcpu->set_input_line(UPD7810_INTF2, ASSERT_LINE);
LOG("%s: IRQmask=%X\n",machine().describe_context(),data);
}
WRITE8_MEMBER( fp1100_state::main_to_sub_w )
{
// machine().scheduler().synchronize(); // force resync
// m_subcpu->set_input_line(UPD7810_INTF2, ASSERT_LINE);
m_sub_latch = data;
LOG("%s: From main:%X\n",machine().describe_context(),data);
// m_subcpu->set_input_line(UPD7810_INTF2, ASSERT_LINE);
}
READ8_MEMBER( fp1100_state::sub_to_main_r )
{
// machine().scheduler().synchronize(); // force resync
// m_maincpu->set_input_line(0, CLEAR_LINE);
m_maincpu->set_input_line(0, CLEAR_LINE);
LOG("%s: To main:%X\n",machine().describe_context(),m_main_latch);
return m_main_latch;
}
@ -224,13 +208,13 @@ READ8_MEMBER( fp1100_state::slot_id_r )
return m_slot[m_slot_num & 7].id;
}
static ADDRESS_MAP_START(fp1100_map, AS_PROGRAM, 8, fp1100_state )
static ADDRESS_MAP_START(main_map, AS_PROGRAM, 8, fp1100_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x0000, 0x8fff) AM_READ_BANK("bankr0") AM_WRITE_BANK("bankw0")
AM_RANGE(0x9000, 0xffff) AM_RAM AM_REGION("wram", 0x9000)
ADDRESS_MAP_END
static ADDRESS_MAP_START(fp1100_io, AS_IO, 8, fp1100_state )
static ADDRESS_MAP_START(io_map, AS_IO, 8, fp1100_state )
ADDRESS_MAP_UNMAP_HIGH
//AM_RANGE(0x0000, 0xfeff) slot memory area
AM_RANGE(0xff00, 0xff7f) AM_READWRITE(slot_id_r,slot_bank_w)
@ -242,18 +226,16 @@ ADDRESS_MAP_END
READ8_MEMBER( fp1100_state::main_to_sub_r )
{
// machine().scheduler().synchronize(); // force resync
// m_subcpu->set_input_line(UPD7810_INTF2, CLEAR_LINE);
m_subcpu->set_input_line(UPD7810_INTF2, CLEAR_LINE);
LOG("%s: To sub:%X\n",machine().describe_context(),m_sub_latch);
return m_sub_latch;
}
WRITE8_MEMBER( fp1100_state::sub_to_main_w )
{
// machine().scheduler().synchronize(); // force resync
// m_maincpu->set_input_line_and_vector(0, ASSERT_LINE, 0xf0);
m_main_latch = data;
LOG("%s: From sub:%X\n",machine().describe_context(),data);
//m_maincpu->set_input_line_and_vector(0, ASSERT_LINE, 0xf0);
}
/*
@ -289,14 +271,14 @@ WRITE8_MEMBER( fp1100_state::kbd_row_w )
m_beep->set_state(BIT(data, 4));
}
static ADDRESS_MAP_START(fp1100_slave_map, AS_PROGRAM, 8, fp1100_state )
static ADDRESS_MAP_START(sub_map, AS_PROGRAM, 8, fp1100_state )
AM_RANGE(0x0000, 0x1fff) AM_ROM AM_REGION("sub_ipl",0x0000)
AM_RANGE(0x2000, 0xdfff) AM_RAM AM_SHARE("videoram") //vram B/R/G
AM_RANGE(0xe000, 0xe000) AM_MIRROR(0x3fe) AM_DEVREADWRITE("crtc", mc6845_device, status_r,address_w)
AM_RANGE(0xe001, 0xe001) AM_MIRROR(0x3fe) AM_DEVREADWRITE("crtc", mc6845_device, register_r,register_w)
AM_RANGE(0xe400, 0xe7ff) AM_READ_PORT("DSW") AM_WRITE(kbd_row_w)
AM_RANGE(0xe800, 0xebff) AM_READWRITE(main_to_sub_r,sub_to_main_w)
//AM_RANGE(0xec00, 0xefff) "Acknowledge of INT0" doesn't seem to be used
//AM_RANGE(0xec00, 0xefff) "Acknowledge of INT0" is coded in but isn't currently executed
AM_RANGE(0xf000, 0xf3ff) AM_WRITE(colour_control_w)
AM_RANGE(0xf400, 0xff7f) AM_ROM AM_REGION("sub_ipl",0x2400)
ADDRESS_MAP_END
@ -344,12 +326,19 @@ d6 - Centronics strobe
*/
WRITE8_MEMBER( fp1100_state::portc_w )
{
u8 bits = data ^ m_upd7801.portc;
if (BIT(bits, 3))
if (BIT(m_irq_mask, 4))
m_maincpu->set_input_line_and_vector(0, BIT(data, 3) ? CLEAR_LINE : HOLD_LINE, 0xf0);
if (!BIT(data, 3))
{
m_maincpu->set_input_line_and_vector(0, ASSERT_LINE, 0xf0);
LOG("%s: PortC:%X\n",machine().describe_context(),data);
m_upd7801.portc = data;
}
if (BIT(bits, 5))
m_cass->change_state(BIT(data, 5) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
if (BIT(bits, 6))
m_centronics->write_strobe(BIT(data, 6));
m_upd7801.portc = data;
}
@ -550,7 +539,7 @@ static INPUT_PORTS_START( fp1100 )
INPUT_PORTS_END
static const gfx_layout fp1100_chars_8x8 =
static const gfx_layout chars_8x8 =
{
8,8,
256,
@ -562,7 +551,7 @@ static const gfx_layout fp1100_chars_8x8 =
};
static GFXDECODE_START( fp1100 )
GFXDECODE_ENTRY( "sub_ipl", 0x2400, fp1100_chars_8x8, 0, 1 )
GFXDECODE_ENTRY( "sub_ipl", 0x2400, chars_8x8, 0, 1 )
GFXDECODE_END
WRITE_LINE_MEMBER( fp1100_state::centronics_busy_w )
@ -591,7 +580,7 @@ TIMER_DEVICE_CALLBACK_MEMBER( fp1100_state::timer_c )
m_cass->output(BIT(m_cass_data[3], 1) ? -1.0 : +1.0); // 1200Hz
}
INTERRUPT_GEN_MEMBER(fp1100_state::fp1100_vblank_irq)
INTERRUPT_GEN_MEMBER( fp1100_state::vblank_irq )
{
// if (BIT(m_irq_mask, 4))
// m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0xf8);
@ -639,12 +628,12 @@ DRIVER_INIT_MEMBER( fp1100_state, fp1100 )
static MACHINE_CONFIG_START( fp1100 )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, MAIN_CLOCK/4)
MCFG_CPU_PROGRAM_MAP(fp1100_map)
MCFG_CPU_IO_MAP(fp1100_io)
MCFG_CPU_VBLANK_INT_DRIVER("screen", fp1100_state, fp1100_vblank_irq)
MCFG_CPU_PROGRAM_MAP(main_map)
MCFG_CPU_IO_MAP(io_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", fp1100_state, vblank_irq)
MCFG_CPU_ADD( "sub", UPD7801, MAIN_CLOCK/4 )
MCFG_CPU_PROGRAM_MAP( fp1100_slave_map )
MCFG_CPU_PROGRAM_MAP(sub_map)
MCFG_UPD7810_PORTA_WRITE_CB(WRITE8(fp1100_state, porta_w))
MCFG_UPD7810_PORTB_READ_CB(READ8(fp1100_state, portb_r))
MCFG_UPD7810_PORTB_WRITE_CB(DEVWRITE8("cent_data_out", output_latch_device, write))
@ -673,7 +662,7 @@ static MACHINE_CONFIG_START( fp1100 )
MCFG_MC6845_ADD("crtc", H46505, "screen", MAIN_CLOCK/8) /* hand tuned to get ~60 fps */
MCFG_MC6845_SHOW_BORDER_AREA(false)
MCFG_MC6845_CHAR_WIDTH(8)
MCFG_MC6845_UPDATE_ROW_CB(fp1100_state, fp1100_update_row)
MCFG_MC6845_UPDATE_ROW_CB(fp1100_state, crtc_update_row)
/* Printer */
MCFG_CENTRONICS_ADD("centronics", centronics_devices, "printer")