summaryrefslogtreecommitdiffstatshomepage
path: root/src/mess/drivers/c16.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mess/drivers/c16.c')
-rw-r--r--src/mess/drivers/c16.c668
1 files changed, 668 insertions, 0 deletions
diff --git a/src/mess/drivers/c16.c b/src/mess/drivers/c16.c
new file mode 100644
index 00000000000..c6e1cc169be
--- /dev/null
+++ b/src/mess/drivers/c16.c
@@ -0,0 +1,668 @@
+/***************************************************************************
+ commodore c16 home computer
+
+ PeT mess@utanet.at
+
+ documentation
+ www.funet.fi
+
+***************************************************************************/
+
+/*
+
+2008 - Driver Updates
+---------------------
+
+(most of the informations are taken from http://www.zimmers.net/cbmpics/ )
+
+
+[CBM systems which belong to this driver]
+
+* Commodore 116 (1984, Europe only)
+
+ Entry level computer of the Commodore 264 family, it was marketed only
+in Europe. It was impressive for the small size of its case, but it didn't
+meet commercial success
+
+CPU: MOS Technology 7501 (variable clock rate, with max 1.76 MHz)
+RAM: 16 kilobytes (expandable to 64k internally)
+ROM: 32 kilobytes
+Video: MOS Technology 7360 "TED" (5 Video modes; Max. Resolution 320x200;
+ 40 columns text; Palette of 16 colors in 8 shades, for 128 colors)
+Sound: MOS Technology 7360 "TED" (2 voice tone-generating sound capabilities)
+Ports: MOS 7360 (2 Joystick/Mouse ports; CBM Serial port; 'TED' port; "TV"
+ Port and switch; CBM Monitor port; Power and reset switches; Power
+ connector)
+Keyboard: QWERTY 62 key "membrane" (8 programmable function keys; 4 direction
+ cursor-pad)
+
+
+* Commodore 16 (1984)
+
+ Redesigned version of the C116, with a different case and a different
+keyboard.
+
+CPU: MOS Technology 7501 (variable clock rate, with max 1.76 MHz)
+RAM: 16 kilobytes (expandable to 64k internally)
+ROM: 32 kilobytes
+Video: MOS Technology 7360 "TED" (5 Video modes; Max. Resolution 320x200;
+ 40 columns text; Palette of 16 colors in 8 shades, for 128 colors)
+Sound: MOS Technology 7360 "TED" (2 voice tone-generating sound capabilities)
+Ports: MOS 7360 (2 Joystick/Mouse ports; CBM Serial port; 'TED' port; "TV"
+ Port and switch; CBM Monitor port; Power and reset switches; Power
+ connector)
+Keyboard: QWERTY 66 key typewriter style (8 programmable function keys;
+ 4 direction cursor-pad)
+
+
+* Commodore Plus/4 (1984)
+
+ This system became the middle tier of the Commodore 264 family, replacing
+the original Commodore 264. The Plus/4 is basically the same as the C264,
+but the name refers to the four built-in programs which came with the
+machine: Word Processing, Spreadsheet, Database software, Graphing package.
+
+CPU: MOS Technology 7501 (variable clock rate, with max 1.76 MHz)
+RAM: 64 kilobytes (expandable to 64k internally)
+ROM: 64 kilobytes
+Video: MOS Technology 7360 "TED" (5 Video modes; Max. Resolution 320x200;
+ 40 columns text; Palette of 16 colors in 8 shades, for 128 colors)
+Sound: MOS Technology 7360 "TED" (2 voice tone-generating sound capabilities)
+Ports: MOS 7360 (2 Joystick/Mouse ports; CBM Serial port; 'TED' port; "TV"
+ Port and switch; CBM Monitor port; Power and reset switches; Power
+ connector)
+Keyboard: Full-sized QWERTY 67 key (8 programmable function keys;
+ 4 direction cursor-pad)
+
+
+* Commodore 232 (1984, Prototype)
+
+ This system never reached the production and only few units exist. It is
+in between the C16 and the C264, with its 32 kilobytes of RAM.
+
+
+* Commodore 264 (1984, Prototype)
+
+ Basically the same of a Plus/4 but without the built-in programs.
+
+
+* Commodore V364 (1984, Prototype)
+
+ This system was supposed to become the high-end system of the family,
+featuring 64 kilobytes of RAM, the same technology of the Plus/4, a
+keyboard with numeric keypad and built in voice synthesis capabilities.
+
+[TO DO]
+
+* Supported Systems:
+
+- Once we can add / remove devices, we shall only support c16, c116 and plus/4,
+removing the separated drivers for different floppy drives
+
+* Other Peripherals:
+
+- Lightpen support is unfinished
+- Missing support for (it might or might not be added eventually):
+printers and other devices; most expansion modules; userport; rs232/v.24 interface.
+
+* System Specific
+
+- V364 lacks speech hardware emulation
+
+*/
+
+
+#include "emu.h"
+#include "audio/ted7360.h"
+#include "audio/t6721.h"
+#include "cpu/m6502/m6502.h"
+#include "machine/ram.h"
+#include "formats/cbm_snqk.h"
+#include "includes/cbm.h"
+#include "includes/c16.h"
+#include "machine/c1551.h"
+#include "machine/cbmiec.h"
+#include "machine/cbmipt.h"
+#include "sound/sid6581.h"
+#include "machine/plus4exp.h"
+#include "machine/plus4user.h"
+
+
+/*************************************
+ *
+ * Main CPU memory handlers
+ *
+ *************************************/
+
+
+/*
+ * commodore c16/c116/plus 4
+ * 16 KByte (C16/C116) or 32 KByte or 64 KByte (plus4) RAM
+ * 32 KByte Rom (C16/C116) 64 KByte Rom (plus4)
+ * availability to append additional 64 KByte Rom
+ *
+ * ports 0xfd00 till 0xff3f are always read/writeable for the cpu
+ * for the video interface chip it seams to read from
+ * ram or from rom in this area
+ *
+ * writes go always to ram
+ * only 16 KByte Ram mapped to 0x4000,0x8000,0xc000
+ * only 32 KByte Ram mapped to 0x8000
+ *
+ * rom bank at 0x8000: 16K Byte(low bank)
+ * first: basic
+ * second(plus 4 only): plus4 rom low
+ * third: expansion slot
+ * fourth: expansion slot
+ * rom bank at 0xc000: 16K Byte(high bank)
+ * first: kernal
+ * second(plus 4 only): plus4 rom high
+ * third: expansion slot
+ * fourth: expansion slot
+ * writes to 0xfddx select rom banks:
+ * address line 0 and 1: rom bank low
+ * address line 2 and 3: rom bank high
+ *
+ * writes to 0xff3e switches to roms (0x8000 till 0xfd00, 0xff40 till 0xffff)
+ * writes to 0xff3f switches to rams
+ *
+ * at 0xfc00 till 0xfcff is ram or rom kernal readable
+ */
+
+static ADDRESS_MAP_START(c16_map, AS_PROGRAM, 8, c16_state )
+ AM_RANGE(0x0000, 0x3fff) AM_RAMBANK("bank9")
+ AM_RANGE(0x4000, 0x7fff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank5") /* only ram memory configuration */
+ AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank2") AM_WRITE_BANK("bank6")
+ AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank3")
+ AM_RANGE(0xfc00, 0xfcff) AM_READ_BANK("bank4")
+ AM_RANGE(0xc000, 0xfcff) AM_WRITE_BANK("bank7")
+ AM_RANGE(0xfd10, 0xfd1f) AM_READ_LEGACY(c16_fd1x_r)
+ AM_RANGE(0xfd30, 0xfd3f) AM_READWRITE_LEGACY(c16_6529_port_r, c16_6529_port_w) /* 6529 keyboard matrix */
+ AM_RANGE(0xfdd0, 0xfddf) AM_WRITE_LEGACY(c16_select_roms) /* rom chips selection */
+ AM_RANGE(0xff00, 0xff1f) AM_DEVREADWRITE_LEGACY("ted7360", ted7360_port_r, ted7360_port_w)
+ AM_RANGE(0xff20, 0xffff) AM_READ_BANK("bank8")
+ AM_RANGE(0xff3e, 0xff3e) AM_WRITE_LEGACY(c16_switch_to_rom)
+ AM_RANGE(0xff3f, 0xff3f) AM_WRITE_LEGACY(c16_switch_to_ram)
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START(plus4_map, AS_PROGRAM, 8, c16_state )
+ AM_RANGE(0x0000, 0x7fff) AM_READ_BANK("bank9")
+ AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank2")
+ AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank3")
+ AM_RANGE(0xfc00, 0xfcff) AM_READ_BANK("bank4")
+ AM_RANGE(0x0000, 0xfcff) AM_WRITE_BANK("bank9")
+ AM_RANGE(0xfd00, 0xfd0f) AM_READWRITE_LEGACY(c16_6551_port_r, c16_6551_port_w)
+ AM_RANGE(0xfd10, 0xfd1f) AM_READWRITE_LEGACY(plus4_6529_port_r, plus4_6529_port_w)
+ AM_RANGE(0xfd30, 0xfd3f) AM_READWRITE_LEGACY(c16_6529_port_r, c16_6529_port_w) /* 6529 keyboard matrix */
+ AM_RANGE(0xfdd0, 0xfddf) AM_WRITE_LEGACY(c16_select_roms) /* rom chips selection */
+ AM_RANGE(0xff00, 0xff1f) AM_DEVREADWRITE_LEGACY("ted7360", ted7360_port_r, ted7360_port_w)
+ AM_RANGE(0xff20, 0xffff) AM_READ_BANK("bank8")
+ AM_RANGE(0xff20, 0xff3d) AM_WRITEONLY
+ AM_RANGE(0xff3e, 0xff3e) AM_WRITE_LEGACY(c16_switch_to_rom)
+ AM_RANGE(0xff3f, 0xff3f) AM_WRITE_LEGACY(c16_switch_to_ram)
+ AM_RANGE(0xff40, 0xffff) AM_WRITEONLY
+ADDRESS_MAP_END
+
+static ADDRESS_MAP_START(c364_map , AS_PROGRAM, 8, c16_state )
+ AM_RANGE(0x0000, 0x7fff) AM_READ_BANK("bank9")
+ AM_RANGE(0x8000, 0xbfff) AM_READ_BANK("bank2")
+ AM_RANGE(0xc000, 0xfbff) AM_READ_BANK("bank3")
+ AM_RANGE(0xfc00, 0xfcff) AM_READ_BANK("bank4")
+ AM_RANGE(0x0000, 0xfcff) AM_WRITE_BANK("bank9")
+ AM_RANGE(0xfd00, 0xfd0f) AM_READWRITE_LEGACY(c16_6551_port_r, c16_6551_port_w)
+ AM_RANGE(0xfd10, 0xfd1f) AM_READWRITE_LEGACY(plus4_6529_port_r, plus4_6529_port_w)
+ AM_RANGE(0xfd20, 0xfd2f) AM_DEVREADWRITE_LEGACY("t6721", t6721_speech_r, t6721_speech_w)
+ AM_RANGE(0xfd30, 0xfd3f) AM_READWRITE_LEGACY(c16_6529_port_r, c16_6529_port_w) /* 6529 keyboard matrix */
+ AM_RANGE(0xfdd0, 0xfddf) AM_WRITE_LEGACY(c16_select_roms) /* rom chips selection */
+ AM_RANGE(0xff00, 0xff1f) AM_DEVREADWRITE_LEGACY("ted7360", ted7360_port_r, ted7360_port_w)
+ AM_RANGE(0xff20, 0xffff) AM_READ_BANK("bank8")
+ AM_RANGE(0xff20, 0xff3d) AM_WRITEONLY
+ AM_RANGE(0xff3e, 0xff3e) AM_WRITE_LEGACY(c16_switch_to_rom)
+ AM_RANGE(0xff3f, 0xff3f) AM_WRITE_LEGACY(c16_switch_to_ram)
+ AM_RANGE(0xff40, 0xffff) AM_WRITEONLY
+ADDRESS_MAP_END
+
+
+/*************************************
+ *
+ * Input Ports
+ *
+ *************************************/
+
+static INPUT_PORTS_START( c16 )
+ PORT_INCLUDE( common_cbm_keyboard ) /* ROW0 -> ROW7 */
+
+ PORT_MODIFY("ROW0")
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("@") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@')
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F3) PORT_CHAR(UCHAR_MAMEKEY(F3)) PORT_CHAR(UCHAR_MAMEKEY(F6))
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CHAR(UCHAR_MAMEKEY(F5))
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHAR(UCHAR_MAMEKEY(F4))
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("HELP f7") PORT_CODE(KEYCODE_F4) PORT_CHAR(UCHAR_MAMEKEY(F8)) PORT_CHAR(UCHAR_MAMEKEY(F7))
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_INSERT) PORT_CHAR(0xA3)
+
+ PORT_MODIFY("ROW1")
+ /* Both Shift keys were mapped to the same bit */
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Shift (Left & Right)") PORT_CODE(KEYCODE_LSHIFT) PORT_CODE(KEYCODE_RSHIFT)
+
+ PORT_MODIFY("ROW4")
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("0 \xE2\x86\x91") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(0x2191)
+
+ PORT_MODIFY("ROW5")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("-") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-')
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR(UCHAR_MAMEKEY(UP))
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_PGUP) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
+
+ PORT_MODIFY("ROW6")
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('+')
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("= Pi \xE2\x86\x90") PORT_CODE(KEYCODE_PGDN) PORT_CHAR('=') PORT_CHAR(0x03C0) PORT_CHAR(0x2190)
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('*')
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
+
+ PORT_MODIFY("ROW7")
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Home Clear") PORT_CODE(KEYCODE_DEL) PORT_CHAR(UCHAR_MAMEKEY(HOME))
+
+ PORT_INCLUDE( c16_special ) /* SPECIAL */
+
+ PORT_INCLUDE( c16_controls ) /* CTRLSEL, JOY0, JOY1 */
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( plus4 )
+ PORT_INCLUDE( c16 )
+
+ PORT_MODIFY( "ROW0" )
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(0xA3)
+ PORT_MODIFY( "ROW5" )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-')
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
+ PORT_MODIFY( "ROW6" )
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('+')
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("= Pi \xE2\x86\x90") PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('=') PORT_CHAR(0x03C0) PORT_CHAR(0x2190)
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_INSERT) PORT_CHAR('*')
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
+INPUT_PORTS_END
+
+static INPUT_PORTS_START( c16sid )
+ PORT_INCLUDE( c16 )
+
+ PORT_START("SID")
+ PORT_CONFNAME( 0x01, 0x00, "SID Card Address")
+ PORT_CONFSETTING( 0x00, "0xfd40" )
+ PORT_CONFSETTING( 0x01, "0xfe80" )
+#if 0
+ PORT_CONFNAME( 0x02, 0x00, "Enable SID writes to 0xd400")
+ PORT_CONFSETTING( 0x00, DEF_STR( No ) )
+ PORT_CONFSETTING( 0x02, DEF_STR( Yes ) )
+#endif
+INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( plus4sid )
+ PORT_INCLUDE( plus4 )
+
+ PORT_START("SID")
+ PORT_CONFNAME( 0x01, 0x00, "SID Card Address")
+ PORT_CONFSETTING( 0x00, "0xfd40" )
+ PORT_CONFSETTING( 0x01, "0xfe80" )
+#if 0
+ PORT_CONFNAME( 0x02, 0x00, "Enable SID writes to 0xd400")
+ PORT_CONFSETTING( 0x00, DEF_STR( No ) )
+ PORT_CONFSETTING( 0x02, DEF_STR( Yes ) )
+#endif
+INPUT_PORTS_END
+
+
+/*************************************
+ *
+ * Graphics definitions
+ *
+ *************************************/
+
+static const unsigned char ted7360_palette[] =
+{
+/* black, white, red, cyan */
+/* purple, green, blue, yellow */
+/* orange, light orange, pink, light cyan, */
+/* light violett, light green, light blue, light yellow */
+/* these 16 colors are 8 times here in different luminance (dark..light) */
+/* taken from digitized tv screenshot */
+ 0x06, 0x01, 0x03, 0x2b, 0x2b, 0x2b, 0x67, 0x0e, 0x0f, 0x00, 0x3f, 0x42,
+ 0x57, 0x00, 0x6d, 0x00, 0x4e, 0x00, 0x19, 0x1c, 0x94, 0x38, 0x38, 0x00,
+ 0x56, 0x20, 0x00, 0x4b, 0x28, 0x00, 0x16, 0x48, 0x00, 0x69, 0x07, 0x2f,
+ 0x00, 0x46, 0x26, 0x06, 0x2a, 0x80, 0x2a, 0x14, 0x9b, 0x0b, 0x49, 0x00,
+
+ 0x00, 0x03, 0x02, 0x3d, 0x3d, 0x3d, 0x75, 0x1e, 0x20, 0x00, 0x50, 0x4f,
+ 0x6a, 0x10, 0x78, 0x04, 0x5c, 0x00, 0x2a, 0x2a, 0xa3, 0x4c, 0x47, 0x00,
+ 0x69, 0x2f, 0x00, 0x59, 0x38, 0x00, 0x26, 0x56, 0x00, 0x75, 0x15, 0x41,
+ 0x00, 0x58, 0x3d, 0x15, 0x3d, 0x8f, 0x39, 0x22, 0xae, 0x19, 0x59, 0x00,
+
+ 0x00, 0x03, 0x04, 0x42, 0x42, 0x42, 0x7b, 0x28, 0x20, 0x02, 0x56, 0x59,
+ 0x6f, 0x1a, 0x82, 0x0a, 0x65, 0x09, 0x30, 0x34, 0xa7, 0x50, 0x51, 0x00,
+ 0x6e, 0x36, 0x00, 0x65, 0x40, 0x00, 0x2c, 0x5c, 0x00, 0x7d, 0x1e, 0x45,
+ 0x01, 0x61, 0x45, 0x1c, 0x45, 0x99, 0x42, 0x2d, 0xad, 0x1d, 0x62, 0x00,
+
+ 0x05, 0x00, 0x02, 0x56, 0x55, 0x5a, 0x90, 0x3c, 0x3b, 0x17, 0x6d, 0x72,
+ 0x87, 0x2d, 0x99, 0x1f, 0x7b, 0x15, 0x46, 0x49, 0xc1, 0x66, 0x63, 0x00,
+ 0x84, 0x4c, 0x0d, 0x73, 0x55, 0x00, 0x40, 0x72, 0x00, 0x91, 0x33, 0x5e,
+ 0x19, 0x74, 0x5c, 0x32, 0x59, 0xae, 0x59, 0x3f, 0xc3, 0x32, 0x76, 0x00,
+
+ 0x02, 0x01, 0x06, 0x84, 0x7e, 0x85, 0xbb, 0x67, 0x68, 0x45, 0x96, 0x96,
+ 0xaf, 0x58, 0xc3, 0x4a, 0xa7, 0x3e, 0x73, 0x73, 0xec, 0x92, 0x8d, 0x11,
+ 0xaf, 0x78, 0x32, 0xa1, 0x80, 0x20, 0x6c, 0x9e, 0x12, 0xba, 0x5f, 0x89,
+ 0x46, 0x9f, 0x83, 0x61, 0x85, 0xdd, 0x84, 0x6c, 0xef, 0x5d, 0xa3, 0x29,
+
+ 0x02, 0x00, 0x0a, 0xb2, 0xac, 0xb3, 0xe9, 0x92, 0x92, 0x6c, 0xc3, 0xc1,
+ 0xd9, 0x86, 0xf0, 0x79, 0xd1, 0x76, 0x9d, 0xa1, 0xff, 0xbd, 0xbe, 0x40,
+ 0xdc, 0xa2, 0x61, 0xd1, 0xa9, 0x4c, 0x93, 0xc8, 0x3d, 0xe9, 0x8a, 0xb1,
+ 0x6f, 0xcd, 0xab, 0x8a, 0xb4, 0xff, 0xb2, 0x9a, 0xff, 0x88, 0xcb, 0x59,
+
+ 0x02, 0x00, 0x0a, 0xc7, 0xca, 0xc9, 0xff, 0xac, 0xac, 0x85, 0xd8, 0xe0,
+ 0xf3, 0x9c, 0xff, 0x92, 0xea, 0x8a, 0xb7, 0xba, 0xff, 0xd6, 0xd3, 0x5b,
+ 0xf3, 0xbe, 0x79, 0xe6, 0xc5, 0x65, 0xb0, 0xe0, 0x57, 0xff, 0xa4, 0xcf,
+ 0x89, 0xe5, 0xc8, 0xa4, 0xca, 0xff, 0xca, 0xb3, 0xff, 0xa2, 0xe5, 0x7a,
+
+ 0x01, 0x01, 0x01, 0xff, 0xff, 0xff, 0xff, 0xf6, 0xf2, 0xd1, 0xff, 0xff,
+ 0xff, 0xe9, 0xff, 0xdb, 0xff, 0xd3, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xa3,
+ 0xff, 0xff, 0xc1, 0xff, 0xff, 0xb2, 0xfc, 0xff, 0xa2, 0xff, 0xee, 0xff,
+ 0xd1, 0xff, 0xff, 0xeb, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xed, 0xff, 0xbc
+};
+
+static PALETTE_INIT( c16 )
+{
+ int i;
+
+ for (i = 0; i < sizeof(ted7360_palette) / 3; i++)
+ palette_set_color_rgb(machine, i, ted7360_palette[i * 3], ted7360_palette[i * 3 + 1], ted7360_palette[i * 3 + 2]);
+}
+
+/*************************************
+ *
+ * TED7360 interfaces
+ *
+ *************************************/
+
+static const ted7360_interface c16_ted7360_intf = {
+ "screen",
+ TED7360_PAL,
+ c16_dma_read,
+ c16_dma_read_rom,
+ c16_interrupt,
+ c16_read_keyboard
+};
+
+static const ted7360_interface plus4_ted7360_intf = {
+ "screen",
+ TED7360_NTSC,
+ c16_dma_read,
+ c16_dma_read_rom,
+ c16_interrupt,
+ c16_read_keyboard
+};
+
+
+/*************************************
+ *
+ * Machine driver
+ *
+ *************************************/
+
+static const m6502_interface c16_m7501_interface =
+{
+ NULL, /* read_indexed_func */
+ NULL, /* write_indexed_func */
+ DEVCB_HANDLER(c16_m7501_port_read), /* port_read_func */
+ DEVCB_HANDLER(c16_m7501_port_write) /* port_write_func */
+};
+
+static CBM_IEC_INTERFACE( cbm_iec_intf )
+{
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL
+};
+
+static PLUS4_EXPANSION_INTERFACE( expansion_intf )
+{
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL,
+ DEVCB_NULL
+};
+
+static PLUS4_USER_PORT_INTERFACE( user_intf )
+{
+ DEVCB_NULL
+};
+
+static SCREEN_UPDATE_IND16( c16 )
+{
+ c16_state *state = screen.machine().driver_data<c16_state>();
+ ted7360_video_update(state->m_ted7360, bitmap, cliprect);
+ return 0;
+}
+
+static INTERRUPT_GEN( c16_raster_interrupt )
+{
+ c16_state *state = device->machine().driver_data<c16_state>();
+ ted7360_raster_interrupt_gen(state->m_ted7360);
+}
+
+
+static MACHINE_START( c16 )
+{
+ c16_state *state = machine.driver_data<c16_state>();
+
+ state->m_maincpu = machine.device<legacy_cpu_device>("maincpu");
+ state->m_ted7360 = machine.device("ted7360");
+ state->m_cassette = machine.device<cassette_image_device>(CASSETTE_TAG);
+ state->m_messram = machine.device<ram_device>(RAM_TAG);
+ state->m_sid = machine.device("sid");
+
+ state->save_item(NAME(state->m_old_level));
+ state->save_item(NAME(state->m_lowrom));
+ state->save_item(NAME(state->m_highrom));
+ state->save_item(NAME(state->m_port6529));
+ state->save_item(NAME(state->m_keyline));
+}
+
+static MACHINE_CONFIG_START( c16, c16_state )
+ /* basic machine hardware */
+ MCFG_CPU_ADD("maincpu", M7501, XTAL_17_73447MHz/20)
+ MCFG_CPU_PROGRAM_MAP(c16_map)
+ MCFG_CPU_CONFIG( c16_m7501_interface )
+ MCFG_CPU_VBLANK_INT("screen", c16_frame_interrupt)
+ MCFG_CPU_PERIODIC_INT(c16_raster_interrupt, TED7360_HRETRACERATE)
+ MCFG_QUANTUM_TIME(attotime::from_hz(60))
+
+ MCFG_MACHINE_START( c16 )
+ MCFG_MACHINE_RESET( c16 )
+
+ /* video hardware */
+ MCFG_SCREEN_ADD("screen", RASTER)
+ MCFG_SCREEN_REFRESH_RATE(TED7360PAL_VRETRACERATE)
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_SCREEN_SIZE(336, 216)
+ MCFG_SCREEN_VISIBLE_AREA(0, 336 - 1, 0, 216 - 1)
+ MCFG_SCREEN_UPDATE_STATIC( c16 )
+
+ MCFG_PALETTE_LENGTH(ARRAY_LENGTH(ted7360_palette) / 3)
+ MCFG_PALETTE_INIT(c16)
+
+ /* sound hardware */
+ MCFG_SPEAKER_STANDARD_MONO("mono")
+ MCFG_TED7360_ADD("ted7360", c16_ted7360_intf)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ /* devices */
+ MCFG_QUICKLOAD_ADD("quickload", cbm_c16, "p00,prg", CBM_QUICKLOAD_DELAY_SECONDS)
+
+ /* cassette */
+ MCFG_CASSETTE_ADD( CASSETTE_TAG, cbm_cassette_interface )
+
+ MCFG_FRAGMENT_ADD(c16_cartslot)
+
+ MCFG_C1551_ADD(C1551_TAG, 8)
+ MCFG_SOFTWARE_LIST_ADD("disk_list", "plus4_flop")
+
+ /* IEC serial bus */
+ MCFG_CBM_IEC_ADD(cbm_iec_intf, NULL)
+
+ MCFG_PLUS4_EXPANSION_SLOT_ADD(PLUS4_EXPANSION_SLOT_TAG, XTAL_17_73447MHz/20, expansion_intf, plus4_expansion_cards, NULL, NULL)
+ MCFG_PLUS4_USER_PORT_ADD(PLUS4_USER_PORT_TAG, user_intf, plus4_user_port_cards, NULL, NULL)
+
+ /* internal ram */
+ MCFG_RAM_ADD(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("64K")
+ MCFG_RAM_EXTRA_OPTIONS("16K,32K")
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( plus4, c16 )
+ MCFG_CPU_MODIFY( "maincpu" )
+ MCFG_CPU_CLOCK( XTAL_14_31818MHz/16 )
+ MCFG_CPU_PROGRAM_MAP(plus4_map)
+ MCFG_CPU_CONFIG( c16_m7501_interface )
+
+ MCFG_SCREEN_MODIFY("screen")
+ MCFG_SCREEN_REFRESH_RATE(TED7360NTSC_VRETRACERATE)
+
+ MCFG_DEVICE_REMOVE("ted7360")
+ MCFG_TED7360_ADD("ted7360", plus4_ted7360_intf)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+
+ /* internal ram */
+ MCFG_RAM_MODIFY(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("64K")
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( c364, plus4 )
+ MCFG_SCREEN_MODIFY("screen")
+ MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
+ MCFG_CPU_MODIFY( "maincpu" )
+ MCFG_CPU_PROGRAM_MAP(c364_map)
+
+ MCFG_T6721_ADD("t6721")
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( c264, c16 )
+ /* internal ram */
+ MCFG_RAM_MODIFY(RAM_TAG)
+ MCFG_RAM_DEFAULT_SIZE("64K")
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( c16sid, c16 )
+
+ MCFG_SOUND_ADD("sid", SID8580, TED7360PAL_CLOCK/4)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+static MACHINE_CONFIG_DERIVED( plus4sid, plus4 )
+
+ MCFG_SOUND_ADD("sid", SID8580, TED7360NTSC_CLOCK/4)
+ MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
+MACHINE_CONFIG_END
+
+
+/*************************************
+ *
+ * ROM definition(s)
+ *
+ *************************************/
+ROM_START( c232 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_LOAD( "318006-01.bin", 0x10000, 0x4000, CRC(74eaae87) SHA1(161c96b4ad20f3a4f2321808e37a5ded26a135dd) )
+ ROM_LOAD( "318004-01.bin", 0x14000, 0x4000, CRC(dbdc3319) SHA1(3c77caf72914c1c0a0875b3a7f6935cd30c54201) )
+ROM_END
+
+ROM_START( c264 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_LOAD( "basic-264.bin", 0x10000, 0x4000, CRC(6a2fc8e3) SHA1(473fce23afa07000cdca899fbcffd6961b36a8a0) )
+ ROM_LOAD( "kernal-264.bin", 0x14000, 0x4000, CRC(8f32abe7) SHA1(d481faf5fcbb331878dc7851c642d04f26a32873) )
+ROM_END
+
+ROM_START( c364 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_LOAD( "318006.01", 0x10000, 0x4000, CRC(74eaae87) SHA1(161c96b4ad20f3a4f2321808e37a5ded26a135dd) )
+ ROM_LOAD( "kern364p.bin", 0x14000, 0x4000, CRC(84fd4f7a) SHA1(b9a5b5dacd57ca117ef0b3af29e91998bf4d7e5f) )
+ ROM_LOAD( "317053-01.bin", 0x18000, 0x4000, CRC(4fd1d8cb) SHA1(3b69f6e7cb4c18bb08e203fb18b7dabfa853390f) )
+ ROM_LOAD( "317054-01.bin", 0x1c000, 0x4000, CRC(109de2fc) SHA1(0ad7ac2db7da692d972e586ca0dfd747d82c7693) )
+ /* at address 0x20000 not so good */
+ ROM_LOAD( "spk3cc4.bin", 0x28000, 0x4000, CRC(5227c2ee) SHA1(59af401cbb2194f689898271c6e8aafa28a7af11) )
+ROM_END
+
+
+ROM_START( c16 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_DEFAULT_BIOS("r5")
+ ROM_LOAD( "318006-01.u3", 0x10000, 0x4000, CRC(74eaae87) SHA1(161c96b4ad20f3a4f2321808e37a5ded26a135dd) )
+
+ ROM_SYSTEM_BIOS( 0, "r3", "rev. 3" )
+ ROMX_LOAD( "318004-03.u4", 0x14000, 0x4000, CRC(77bab934) SHA1(97814dab9d757fe5a3a61d357a9a81da588a9783), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS( 1, "r4", "rev. 4" )
+ ROMX_LOAD( "318004-04.u4", 0x14000, 0x4000, CRC(be54ed79) SHA1(514ad3c29d01a2c0a3b143d9c1d4143b1912b793), ROM_BIOS(2) )
+ ROM_SYSTEM_BIOS( 2, "r5", "rev. 5" )
+ ROMX_LOAD( "318004-05.u4", 0x14000, 0x4000, CRC(71c07bd4) SHA1(7c7e07f016391174a557e790c4ef1cbe33512cdb), ROM_BIOS(3) )
+ROM_END
+
+#define rom_c16c rom_c16
+#define rom_c16v rom_c16
+
+#define rom_c116 rom_c16
+#define rom_c116c rom_c16c
+#define rom_c116v rom_c16v
+
+ROM_START( c16hun )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_LOAD( "318006-01.u3", 0x10000, 0x4000, CRC(74eaae87) SHA1(161c96b4ad20f3a4f2321808e37a5ded26a135dd) )
+ ROM_LOAD( "hungary.u4", 0x14000, 0x4000, CRC(775f60c5) SHA1(20cf3c4bf6c54ef09799af41887218933f2e27ee) )
+ROM_END
+
+ROM_START( plus4 )
+ ROM_REGION( 0x40000, "maincpu", 0 )
+ ROM_DEFAULT_BIOS("r5")
+ ROM_SYSTEM_BIOS( 0, "r4", "rev. 4" )
+ ROMX_LOAD( "318005-04.u24", 0x14000, 0x4000, CRC(799a633d) SHA1(5df52c693387c0e2b5d682613a3b5a65477311cf), ROM_BIOS(1) )
+ ROM_SYSTEM_BIOS( 1, "r5", "rev. 5" )
+ ROMX_LOAD( "318005-05.u24", 0x14000, 0x4000, CRC(70295038) SHA1(a3d9e5be091b98de39a046ab167fb7632d053682), ROM_BIOS(2) )
+ ROM_SYSTEM_BIOS( 2, "jiffydos", "JiffyDOS v6.01" )
+ ROMX_LOAD( "jiffydos plus4.u24", 0x10000, 0x8000, CRC(818d3f45) SHA1(9bc1b1c3da9ca642deae717905f990d8e36e6c3b), ROM_BIOS(3) )
+
+ ROM_LOAD( "318006-01.u23", 0x10000, 0x4000, CRC(74eaae87) SHA1(161c96b4ad20f3a4f2321808e37a5ded26a135dd) )
+
+ ROM_LOAD( "317053-01.u25", 0x18000, 0x4000, CRC(4fd1d8cb) SHA1(3b69f6e7cb4c18bb08e203fb18b7dabfa853390f) )
+ ROM_LOAD( "317054-01.26", 0x1c000, 0x4000, CRC(109de2fc) SHA1(0ad7ac2db7da692d972e586ca0dfd747d82c7693) )
+ROM_END
+
+#define rom_plus4c rom_plus4
+#define rom_plus4v rom_plus4
+
+#define rom_c16sid rom_c16
+#define rom_plus4sid rom_plus4
+
+/***************************************************************************
+
+ Game driver(s)
+
+***************************************************************************/
+
+/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */
+
+COMP( 1984, c16, 0, 0, c16, c16, c16_state, c16, "Commodore Business Machines", "Commodore 16 (PAL)", 0)
+COMP( 1984, c16hun, c16, 0, c16, c16, c16_state, c16, "Commodore Business Machines", "Commodore 16 Novotrade (PAL, Hungary)", 0)
+
+COMP( 1984, c116, c16, 0, c16, c16, c16_state, c16, "Commodore Business Machines", "Commodore 116 (PAL)", 0)
+
+COMP( 1984, plus4, c16, 0, plus4, plus4, c16_state, plus4, "Commodore Business Machines", "Commodore Plus/4 (NTSC)", 0)
+
+COMP( 1984, c232, c16, 0, c16, c16, c16_state, c16, "Commodore Business Machines", "Commodore 232 (Prototype)", 0)
+COMP( 1984, c264, c16, 0, c264, plus4, c16_state, plus4, "Commodore Business Machines", "Commodore 264 (Prototype)", 0)
+COMP( 1984, c364, c16, 0, c364, plus4, c16_state, plus4, "Commodore Business Machines", "Commodore V364 (Prototype)", GAME_IMPERFECT_SOUND)
+
+COMP( 1984, c16sid, c16, 0, c16sid, c16sid, c16_state, c16sid, "Commodore Business Machines", "Commodore 16 (PAL, SID Card)", GAME_UNOFFICIAL | GAME_IMPERFECT_SOUND)
+COMP( 1984, plus4sid, c16, 0, plus4sid, plus4sid, c16_state, plus4sid, "Commodore Business Machines", "Commodore Plus/4 (NTSC, SID Card)", GAME_UNOFFICIAL | GAME_IMPERFECT_SOUND)