(nw) cortex: added dips, fixed scrolling, added rombanking, added sound

This commit is contained in:
Robbbert 2017-12-11 09:06:12 +11:00
parent cc88c0cae5
commit 76dcc98b53

View File

@ -16,21 +16,24 @@ of another TI or the Geneve.
Chips: Chips:
TMS9995 - CPU TMS9995 - CPU
TMS9929 - Video TMS9929 - Video
TMS9911 - DMA to floppy (not emulated) TMS9911 - DMA to floppy (unemulated device)
TMS9909 - Floppy Disk Controller (not emulated) TMS9909 - Floppy Disk Controller (unemulated device)
TMS9902 - UART (x2) (not usable with rs232.h) TMS9902 - UART (x2) (device not usable with rs232.h)
AY-5-2376 - Keyboard controller AY-5-2376 - Keyboard controller
All input to be in uppercase. Note that "lowercase" is just smaller uppercase, All input to be in uppercase. Note that "lowercase" is just smaller uppercase,
and is not acceptable as input. and is not acceptable as input.
There's no option in BASIC to produce sound. It will beep if an invalid key
(usually a control key) is pressed.
To clear the screen press Ctrl L.
ToDo: ToDo:
- Screen corrupts when scrolling
- Unemulated devices - Unemulated devices
- Cassette
- Keyboard to use AY device - Keyboard to use AY device
- Banking - Memory mapping unit (74LS610)
- Memory manager device
- Various CRU I/O - Various CRU I/O
Note that the MAME implementation of CRU addresses is not the same as real Note that the MAME implementation of CRU addresses is not the same as real
@ -48,6 +51,8 @@ packed into a single address-byte (CRU 0 = bit 0, etc). So the address is
#include "video/tms9928a.h" #include "video/tms9928a.h"
//#include "machine/tms9902.h" //#include "machine/tms9902.h"
#include "machine/keyboard.h" #include "machine/keyboard.h"
#include "sound/beep.h"
#include "speaker.h"
class cortex_state : public driver_device class cortex_state : public driver_device
{ {
@ -55,27 +60,34 @@ public:
cortex_state(const machine_config &mconfig, device_type type, const char *tag) cortex_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag) : driver_device(mconfig, type, tag)
, m_maincpu(*this, "maincpu") , m_maincpu(*this, "maincpu")
, m_p_ram(*this, "ram") , m_beep(*this, "beeper")
, m_io_dsw(*this, "DSW")
{ } { }
void kbd_put(u8 data); void kbd_put(u8 data);
DECLARE_WRITE_LINE_MEMBER(keyboard_ack_w); DECLARE_WRITE_LINE_MEMBER(keyboard_ack_w);
DECLARE_WRITE_LINE_MEMBER(romsw_w);
DECLARE_WRITE_LINE_MEMBER(vdp_int_w);
DECLARE_READ8_MEMBER(pio_r); DECLARE_READ8_MEMBER(pio_r);
DECLARE_READ8_MEMBER(keyboard_r); DECLARE_READ8_MEMBER(keyboard_r);
DECLARE_DRIVER_INIT(init);
private: private:
bool m_cru0005; bool m_kbd_ack;
bool m_vdp_int;
uint8_t m_term_data; uint8_t m_term_data;
virtual void machine_reset() override; virtual void machine_reset() override;
required_device<tms9995_device> m_maincpu; required_device<tms9995_device> m_maincpu;
required_shared_ptr<uint8_t> m_p_ram; required_device<beep_device> m_beep;
required_ioport m_io_dsw;
}; };
static ADDRESS_MAP_START( mem_map, AS_PROGRAM, 8, cortex_state ) static ADDRESS_MAP_START( mem_map, AS_PROGRAM, 8, cortex_state )
AM_RANGE(0x0000, 0xefff) AM_RAM AM_SHARE("ram") AM_RANGE(0x0000, 0x7fff) AM_READ_BANK("bankr0") AM_WRITE_BANK("bankw0")
AM_RANGE(0x8000, 0xefff) AM_RAM
AM_RANGE(0xf100, 0xf11f) AM_RAM // memory mapping unit AM_RANGE(0xf100, 0xf11f) AM_RAM // memory mapping unit
AM_RANGE(0xf120, 0xf120) AM_DEVREADWRITE("tms9928a", tms9928a_device, vram_read, vram_write) AM_RANGE(0xf120, 0xf120) AM_DEVREADWRITE("crtc", tms9928a_device, vram_read, vram_write)
AM_RANGE(0xf121, 0xf121) AM_DEVREADWRITE("tms9928a", tms9928a_device, register_read, register_write) AM_RANGE(0xf121, 0xf121) AM_DEVREADWRITE("crtc", tms9928a_device, register_read, register_write)
//AM_RANGE(0xf140, 0xf147) // fdc tms9909 //AM_RANGE(0xf140, 0xf147) // fdc tms9909
ADDRESS_MAP_END ADDRESS_MAP_END
@ -84,24 +96,31 @@ static ADDRESS_MAP_START( io_map, AS_IO, 8, cortex_state )
AM_RANGE(0x0000, 0x0007) AM_MIRROR(0x18) AM_DEVWRITE("control", ls259_device, write_d0) AM_RANGE(0x0000, 0x0007) AM_MIRROR(0x18) AM_DEVWRITE("control", ls259_device, write_d0)
AM_RANGE(0x0000, 0x0000) AM_READ(pio_r) AM_RANGE(0x0000, 0x0000) AM_READ(pio_r)
AM_RANGE(0x0001, 0x0001) AM_READ(keyboard_r) AM_RANGE(0x0001, 0x0001) AM_READ(keyboard_r)
// read ranges are incorrect - should be 1/8th of current values. //AM_RANGE(0x0040, 0x005f) AM_DEVWRITE("uart1", tms9902_device, cruwrite) // RS232 (r12 = 80-bf)
//AM_RANGE(0x0080, 0x00bf) AM_DEVREADWRITE("uart1", tms9902_device, cruread, cruwrite) // RS232 //AM_RANGE(0x0008, 0x000b) AM_DEVREAD("uart1", tms9902_device, cruread) // RS232
//AM_RANGE(0x0180, 0x01bf) AM_DEVREADWRITE("uart2", tms9902_device, cruread, cruwrite) // Cassette //AM_RANGE(0x00c0, 0x00df) AM_DEVWRITE("uart2", tms9902_device, cruwrite) // Cassette (r12 = 180-1bf)
//AM_RANGE(0x01c0, 0x01ff) // DMA controller - TMS9911 //AM_RANGE(0x0018, 0x001b) AM_DEVREAD("uart2", tms9902_device, cruread) // Cassette
//AM_RANGE(0x0800, 0x080f) AM_WRITE(cent_data_w) //AM_RANGE(0x00e0, 0x00ff) AM_WRITE("dma", tms9911_device, write) // r12 = 1c0-1fe
//AM_RANGE(0x0810, 0x0811) AM_WRITE(cent_strobe_w) //AM_RANGE(0x001c, 0x001f) AM_READ("dma", tms9911_device, read) // if reading is needed
//AM_RANGE(0x0812, 0x0813) AM_READ(cent_stat_r) //AM_RANGE(0x0400, 0x0407) AM_WRITE(cent_data_w) // r12 = 800-80e
//AM_RANGE(0x1ee0, 0x1eef) AM_READWRITE(cpu_int_r,cpu_int_w) //AM_RANGE(0x0408, 0x0408) AM_WRITE(cent_strobe_w) // r12 = 810
//AM_RANGE(0x1fda, 0x1fdb) AM_READWRITE(cpu_int1_r,cpu_int1_w) //AM_RANGE(0x0081, 0x0081) AM_READ(cent_stat_r) // CRU 409 (r12 = 812)
ADDRESS_MAP_END ADDRESS_MAP_END
/* Input ports */ /* Input ports */
static INPUT_PORTS_START( cortex ) static INPUT_PORTS_START( cortex )
PORT_START("DSW")
PORT_DIPNAME( 0x04, 0x00, "DISK SIZE")
PORT_DIPSETTING( 0x04, "20cm")
PORT_DIPSETTING( 0x00, "13cm")
PORT_DIPNAME( 0x08, 0x08, "DISK DENSITY")
PORT_DIPSETTING( 0x08, "Double")
PORT_DIPSETTING( 0x00, "Single")
INPUT_PORTS_END INPUT_PORTS_END
READ8_MEMBER( cortex_state::pio_r ) READ8_MEMBER( cortex_state::pio_r )
{ {
return (m_cru0005 ? 0x20 : 0) | 0xdf; return (m_kbd_ack ? 0x20 : 0) | (m_vdp_int ? 0x40 : 0) | m_io_dsw->read() | 0x93;
} }
READ8_MEMBER( cortex_state::keyboard_r ) READ8_MEMBER( cortex_state::keyboard_r )
@ -114,25 +133,46 @@ WRITE_LINE_MEMBER( cortex_state::keyboard_ack_w )
if (!state) if (!state)
{ {
m_maincpu->set_input_line(INT_9995_INT4, CLEAR_LINE); m_maincpu->set_input_line(INT_9995_INT4, CLEAR_LINE);
m_cru0005 = 1; m_kbd_ack = 1;
} }
} }
WRITE_LINE_MEMBER( cortex_state::romsw_w )
{
membank("bankr0")->set_entry(state ? 0 : 1);
}
WRITE_LINE_MEMBER( cortex_state::vdp_int_w )
{
m_vdp_int = state ? 0 : 1; // change polarity to match mame
}
void cortex_state::kbd_put(u8 data) void cortex_state::kbd_put(u8 data)
{ {
m_term_data = data; m_term_data = data;
m_cru0005 = 0; m_kbd_ack = 0;
m_maincpu->set_input_line(INT_9995_INT4, ASSERT_LINE); m_maincpu->set_input_line(INT_9995_INT4, ASSERT_LINE);
} }
void cortex_state::machine_reset() void cortex_state::machine_reset()
{ {
m_cru0005 = 1; m_kbd_ack = 1;
uint8_t* ROM = memregion("maincpu")->base(); m_vdp_int = 0;
memcpy(m_p_ram, ROM, 0x6000); m_beep->set_state(0);
membank("bankr0")->set_entry(1); // point at rom
membank("bankw0")->set_entry(0); // always write to ram
m_maincpu->ready_line(ASSERT_LINE); m_maincpu->ready_line(ASSERT_LINE);
} }
DRIVER_INIT_MEMBER( cortex_state, init )
{
uint8_t *main = memregion("maincpu")->base();
membank("bankr0")->configure_entry(1, &main[0x10000]);
membank("bankr0")->configure_entry(0, &main[0x00000]);
membank("bankw0")->configure_entry(0, &main[0x00000]);
}
static MACHINE_CONFIG_START( cortex ) static MACHINE_CONFIG_START( cortex )
/* basic machine hardware */ /* basic machine hardware */
/* TMS9995 CPU @ 12.0 MHz */ /* TMS9995 CPU @ 12.0 MHz */
@ -146,35 +186,42 @@ static MACHINE_CONFIG_START( cortex )
//MCFG_ADDRESSABLE_LATCH_Q2_OUT_CB(WRITELINE(cortex_state, ebus_int_ack_w)) //MCFG_ADDRESSABLE_LATCH_Q2_OUT_CB(WRITELINE(cortex_state, ebus_int_ack_w))
//MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(WRITELINE(cortex_state, ebus_to_en_w)) //MCFG_ADDRESSABLE_LATCH_Q3_OUT_CB(WRITELINE(cortex_state, ebus_to_en_w))
//MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(cortex_state, disk_size_w)) //MCFG_ADDRESSABLE_LATCH_Q4_OUT_CB(WRITELINE(cortex_state, disk_size_w))
//MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(cortex_state, eprom_on_off_w)) MCFG_ADDRESSABLE_LATCH_Q5_OUT_CB(WRITELINE(cortex_state, romsw_w))
//MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(WRITELINE(cortex_state, bell_en_w)) MCFG_ADDRESSABLE_LATCH_Q6_OUT_CB(DEVWRITELINE("beeper", beep_device, set_state))
/* video hardware */ /* video hardware */
MCFG_DEVICE_ADD( "tms9928a", TMS9929A, XTAL_10_738635MHz / 2 ) MCFG_DEVICE_ADD( "crtc", TMS9929A, XTAL_10_738635MHz / 2 )
MCFG_TMS9928A_OUT_INT_LINE_CB(INPUTLINE("maincpu", INT_9995_INT1))
MCFG_DEVCB_CHAIN_OUTPUT(WRITELINE(cortex_state, vdp_int_w))
MCFG_TMS9928A_VRAM_SIZE(0x4000) MCFG_TMS9928A_VRAM_SIZE(0x4000)
MCFG_TMS9928A_SCREEN_ADD_PAL( "screen" ) MCFG_TMS9928A_SCREEN_ADD_PAL( "screen" )
MCFG_SCREEN_UPDATE_DEVICE( "tms9928a", tms9928a_device, screen_update ) MCFG_SCREEN_UPDATE_DEVICE( "crtc", tms9928a_device, screen_update )
MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0) MCFG_DEVICE_ADD("keyboard", GENERIC_KEYBOARD, 0)
MCFG_GENERIC_KEYBOARD_CB(PUT(cortex_state, kbd_put)) MCFG_GENERIC_KEYBOARD_CB(PUT(cortex_state, kbd_put))
//MCFG_DEVICE_ADD("uart1", TMS9902, XTAL_12MHz / 4) //MCFG_DEVICE_ADD("uart1", TMS9902, XTAL_12MHz / 4)
//MCFG_DEVICE_ADD("uart2", TMS9902, XTAL_12MHz / 4) //MCFG_DEVICE_ADD("uart2", TMS9902, XTAL_12MHz / 4)
/* Sound */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("beeper", BEEP, 950) // guess
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.05)
MACHINE_CONFIG_END MACHINE_CONFIG_END
/* ROM definition */ /* ROM definition */
ROM_START( cortex ) ROM_START( cortex )
ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) ROM_REGION( 0x18000, "maincpu", ROMREGION_ERASEFF )
ROM_SYSTEM_BIOS(0, "basic", "Cortex Bios") ROM_SYSTEM_BIOS(0, "basic", "Cortex Bios")
ROMX_LOAD( "cortex.ic47", 0x0000, 0x2000, CRC(bdb8c7bd) SHA1(340829dcb7a65f2e830fd5aff82a312e3ed7918f), ROM_BIOS(1)) ROMX_LOAD( "cortex.ic47", 0x10000, 0x2000, CRC(bdb8c7bd) SHA1(340829dcb7a65f2e830fd5aff82a312e3ed7918f), ROM_BIOS(1))
ROMX_LOAD( "cortex.ic46", 0x2000, 0x2000, CRC(4de459ea) SHA1(00a42fe556d4ffe1f85b2ce369f544b07fbd06d9), ROM_BIOS(1)) ROMX_LOAD( "cortex.ic46", 0x12000, 0x2000, CRC(4de459ea) SHA1(00a42fe556d4ffe1f85b2ce369f544b07fbd06d9), ROM_BIOS(1))
ROMX_LOAD( "cortex.ic45", 0x4000, 0x2000, CRC(b0c9b6e8) SHA1(4e20c3f0b7546b803da4805cd3b8616f96c3d923), ROM_BIOS(1)) ROMX_LOAD( "cortex.ic45", 0x14000, 0x2000, CRC(b0c9b6e8) SHA1(4e20c3f0b7546b803da4805cd3b8616f96c3d923), ROM_BIOS(1))
ROM_SYSTEM_BIOS(1, "forth", "FIG-Forth") ROM_SYSTEM_BIOS(1, "forth", "FIG-Forth")
ROMX_LOAD( "forth.ic47", 0x0000, 0x2000, CRC(999034be) SHA1(0dcc7404c38aa0ae913101eb0aa98da82104b5d4), ROM_BIOS(2)) ROMX_LOAD( "forth.ic47", 0x10000, 0x2000, CRC(999034be) SHA1(0dcc7404c38aa0ae913101eb0aa98da82104b5d4), ROM_BIOS(2))
ROMX_LOAD( "forth.ic46", 0x2000, 0x2000, CRC(8eca54cc) SHA1(0f1680e941ef60bb9bde9a4b843b78f30dff3202), ROM_BIOS(2)) ROMX_LOAD( "forth.ic46", 0x12000, 0x2000, CRC(8eca54cc) SHA1(0f1680e941ef60bb9bde9a4b843b78f30dff3202), ROM_BIOS(2))
ROM_END ROM_END
/* Driver */ /* Driver */
// YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS // YEAR NAME PARENT COMPAT MACHINE INPUT STATE INIT COMPANY FULLNAME FLAGS
COMP( 1982, cortex, 0, 0, cortex, cortex, cortex_state, 0, "Powertran Cybernetics", "Cortex", MACHINE_NOT_WORKING | MACHINE_NO_SOUND) COMP( 1982, cortex, 0, 0, cortex, cortex, cortex_state, init, "Powertran Cybernetics", "Cortex", MACHINE_NOT_WORKING )