diff options
Diffstat (limited to 'src/mame/drivers/spc1500.cpp')
-rw-r--r-- | src/mame/drivers/spc1500.cpp | 960 |
1 files changed, 0 insertions, 960 deletions
diff --git a/src/mame/drivers/spc1500.cpp b/src/mame/drivers/spc1500.cpp deleted file mode 100644 index b1526bb4d51..00000000000 --- a/src/mame/drivers/spc1500.cpp +++ /dev/null @@ -1,960 +0,0 @@ -// license:BSD-3-Clause -// copyright-holders:Miso Kim -/*************************************************************************** - -Samsung SPC-1500 driver by Miso Kim - - 2015-12-16 preliminary driver initialized - 2015-12-18 cassette tape supported - 2015-12-26 80/40 column mode supported - 2015-12-28 double access mode supported for I/O - 2016-01-02 Korean character input method and display enabled - 2016-01-03 user defined char (PCG, Programmable Character Generator) support - 2016-01-05 detection of color palette initialization - 2016-01-06 80x16 mode graphic mode support - 2016-01-10 double character support - 2016-01-12 PCG adressing improved - 2016-01-13 Cassette tape motor improved - -TODO: - - Verify PCG ram read for Korean character (english character is fine) - - Support floppy disk drive with SD-1500A controller card - -****************************************************************************/ - -/* - * SAMSUNG SPC-1500 Series - * - * Brief history - * --------------------------------------------------------- - * First release on 02-26-1987 - * Press release on 03-14-1987 - * Market price 365,000 won ($430) on 04-01-1987 - - Hardware Specification - - 1) SPC-1500 - RAM 122KB - - Main Memory: 64KB - - Video RAM: 10KB (text 2KB, character attributes 2KB, custom letter: 6KB) - - Graphics RAM: 48KB (16KB on three sides by assigning each of RGB) - ROM 96KB - - BIOS: 32KB (including IPL and a part of BASIC) - - BASIC ROM: 32KB (Hangul Samsung BASIC - Korean character display) - - English font: 8KB (sizes 8x8 and 8x16 size of each character in ROM) - - Hangul fonts: 24KB (head 8KB, middle 8KB, last 8KB) - - Periperials - - Built-in cassette deck - - 1 composite video output to connect a monitor - - 1 TTL output for RGB monitor connection - - 1 RF output for TV connection - - 1 printer port - - 1 joystick port - - Expansion Slots - - Built-in 50-pin 3 slot - - One is using the memory expansion card by default - - Two external power connector for FDD connection - - DIP switch settings for the screen - - Volume control - - 2) SPC-1500A - July 1987 Release - RF modulator only remove the product from an existing model - - 3) SPC-1500V - This product can not confirm the release date because of PCB level modification. - It equiped SPC-1500V VLSI chip embedded products and removed a lot of TTLs and the memory expansion card. - - IOCS ROM Version: 1.6 - - Two internal 50-pin expension slots - - Firmware - - IOCS ROM - The various versions with 32KB of capacity existed to date has confirmed the final version number 1.8 - - Version 1.3: - - Version 1.4: - - Version 1.5: - - Version 1.6: - - Version 1.8: supports a variety of peripherals such as external hard disk, FM-Sound, RS-232C from Static soft (C) - various memu appears on the initial screen. - - BASIC ROM - Capacity and the final version number of the currently identified 32KB 1.3 - - English ROM - The final version of the verification of the capacity 8KB SS150-1222 - The character set of a 8x8 size, and are stored with the size 8x16 8x16 is a part of the size of the font data are written differently and 8x8. - - Hangul ROM - 8KB each is divided by a consonant and consonant and neutral. - - Initial (Choseong) SS151-1223: 8 types of intial character (actual 6 types) - - Middle (Jungseong) SS152-1224: 2 types of middle character - - Final (Jongseong) SS153-1225: 2 types of final character - - Periperials - Monitor - - , high-resolution monitor SM, color monitor model was to distinguish it from CD. - - 1) MD-1255H (Low resolution monitors MD) - - 12 inches Composite 15.734KHz / 60Hz - - N displayed after the model name in the model is non - CRT scanning products - - Stand adopted: if you put the rest on the bottom that can be placed slightly tilted back. - - 2) MD-9052H (Low resolution monitors MD) - - 9 inches Composite 15.734KHz / 60Hz - - N from model name means 'anti-glare' - - All parts except for the appearance and size is the same as the CRT 1255H. - - 3) MD-2563 (color monitor SM) - 4) SM-1439A (high-resolution monitor SM) - 5) SM-1422 (high-resolution monitor SM) - - RGB monitors - 6) SM-1231 (high-resolution monitor SM) - - High-resolution monochrome monitor - 7) SM-1231A (high-resolution monitor SM) - - The other part is other than the appearance of the stand is attached to the same as the model SM-1231 - - 8) CD-1451D (color monitor SM) - - Composite color monitors - 9) CD-1462X (color monitor SM) - 10)CD-1464W (color monitor SM) - 11)CW-4644 - - FDD (floppy disk drive) - - 1) SD-1500A - - 5.25 "floppy drive for 2D composed of external disk drives diskettes - 2) SD-1500B - - Dual external disk drives - - The two models are idential except the number of FDD. They need the expension controller card named by SFC-1500. - - IBM PC XT compatible FDD can be quipped. SFD-5x0 model is a genuine FDD from Samsung Electronics. - - HDD (Hard Disk Drive) - - 1) STH-20 - - External hard disk drive set having a capacity of 20MB SCSI controller and the way - - The controller had not solved alone but the controller can be used to mount another hard disk products. - - Release price: 450,000 won ($530). - - Joysticks - - Joystick was limited to 1 as possible (The PCB was designed by supporting two joysticks. - - 1) SJ-1500 - - Release price: 8,000 won ($9.4) - - SPC-1000A, MSX-compatible - - Printer - - 1) SP-510S - - Bitmap image output method Hangul support - - Recommanded 80 columns dot-matrix printer - 2) SP-570H - - Recommanded 132 columns dot-matrix printer - 3) SP-510L - 4) SP-510T - 5) SP-570B - - Expansion Cards - - 1) SFC-1500 - - External FDD capacity of the floppy disk controller 5.25 inches / 320KB can connect up to two. - - 2) Multi-controller - - Floppy disk controllers and hard disk controllers on the same PCB. - - 3) ST-PAC - - FM sound card can play with up to 9 simultaneous sound or 5 simultaneous sound and 5 drum tones at the same time (FM-PAC compatible MSX) - - Line output and speaker output volume, tone adjustment built-in volume - - it can be used as a synthesizer by connecting the ST-KEY2 product - - Release price: 60,000won ($71) - - SPC-1500 VDP card - - MSX game support - - Release price: 35,000won ($41) with composite output only - - Release price: 60,000won ($71) with composite and RGB outputs simultaneously - - VDP UNIT I - - Composite video output with built-in card expansion card using the same video chip and MSX (static soft) - - Release price: 40,000won ($47). - - VDP UNIT II - - Expansion using the same video chip and video card with built-in card MSX with an RGB output (static soft) - - Release price: 55,000won ($59). - - LAN card (SAMNET-K) - - It uses serial communication instead of an Ethernet network card has a way with two serial ports. - - There are two kinds of host card without a DIP switch and the DIP switch is in the client card. - - It was mainly supplied to the teacher / student in an educational institution. - - Super Pack Card - - Expansion cards that enable the external expansion slot, etc. - - RS-232C card - - At least 300bps, an external modem connected to the serial communication card that supports up to 19,200bps - additionally available communications services using the PSTN network (general switched telephone network) - and may also be connected to a 9-pin serial mouse. - - Support for common serial communications functions, - and if IOCS ROM version 1.8 or higher to connect an external modem to the PC communication card is available. - - When used in this communication program is super soft static net programs (XMODEM protocol, FS 220-6 compatible - and supporting Samsung/Sambo combination korean character code, and an 8-bit code completion support Hangul) is used. - - Release price: 60,000won ($71). - - SS-1 ROM pack unit - - The VDP unit containing 1 cartridge slot card and ROM pack - - ROM pack was not compatible with original MSX ROM pack - - Release price: 49,900won ($58) - - Super Pack - - External ROM cartrige from Static Soft (C) - - 1 cartridge slot and 3 expansion slots (up to five expansion slots available) - - It is available to use the MSX ROM packs without any modification with the static soft VDP card - - Release price: 60,000won ($71) - - ST-KEY2 - - For synthesizer external keyboard - - * Compatiblity with X1 series of Sharp Electronics - - Almost the key components is the same as X1 models of Sharp Electronics and except for the keyboard input. - - To port the X1 software to SPC-1500, Text attribute, keyboard input and DMA related code should be modified - -*/ - -#include "emu.h" - -#include "bus/centronics/ctronics.h" -#include "cpu/z80/z80.h" -#include "imagedev/cassette.h" -#include "machine/i8255.h" -#include "machine/ram.h" -#include "machine/timer.h" -#include "sound/ay8910.h" -#include "video/mc6845.h" - -#include "emupal.h" -#include "screen.h" -#include "softlist.h" -#include "speaker.h" - -#include "formats/spc1000_cas.h" - -#define VDP_CLOCK XTAL(42'954'545) - -class spc1500_state : public driver_device -{ -public: - spc1500_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag) - , m_maincpu(*this, "maincpu") - , m_vdg(*this, "mc6845") - , m_cass(*this, "cassette") - , m_ram(*this, RAM_TAG) - , m_p_videoram(*this, "videoram") - , m_pcgram(*this, "pcgram") - , m_io_kb(*this, "LINE.%u", 0) - , m_io_joy(*this, "JOY") - , m_dipsw(*this, "DIP_SWITCH") - , m_centronics(*this, "centronics") - , m_pio(*this, "ppi8255") - , m_sound(*this, "ay8910") - , m_palette(*this, "palette") - , m_timer(nullptr) - { } - - void spc1500(machine_config &config); - -private: - DECLARE_READ8_MEMBER(psga_r); - DECLARE_READ8_MEMBER(porta_r); - DECLARE_WRITE_LINE_MEMBER( centronics_busy_w ) { m_centronics_busy = state; } - DECLARE_READ8_MEMBER(mc6845_videoram_r); - DECLARE_READ8_MEMBER(keyboard_r); - DECLARE_WRITE8_MEMBER(palet_w); - DECLARE_WRITE8_MEMBER(priority_w); - DECLARE_WRITE8_MEMBER(pcg_w); - DECLARE_WRITE8_MEMBER(pcgg_w); - DECLARE_WRITE8_MEMBER(pcgb_w); - DECLARE_WRITE8_MEMBER(pcgr_w); - DECLARE_READ8_MEMBER(pcg_r); - DECLARE_READ8_MEMBER(pcgg_r); - DECLARE_READ8_MEMBER(pcgb_r); - DECLARE_READ8_MEMBER(pcgr_r); - DECLARE_WRITE8_MEMBER(crtc_w); - DECLARE_READ8_MEMBER(crtc_r); - DECLARE_WRITE8_MEMBER(romsel); - DECLARE_WRITE8_MEMBER(ramsel); - DECLARE_WRITE8_MEMBER(portb_w); - DECLARE_WRITE8_MEMBER(psgb_w); - DECLARE_WRITE8_MEMBER(portc_w); - DECLARE_READ8_MEMBER(portb_r); - DECLARE_WRITE8_MEMBER(double_w); - DECLARE_READ8_MEMBER(io_r); - void spc_palette(palette_device &palette) const; - DECLARE_VIDEO_START(spc); - MC6845_UPDATE_ROW(crtc_update_row); - MC6845_RECONFIGURE(crtc_reconfig); - TIMER_DEVICE_CALLBACK_MEMBER(timer); - - void spc1500_double_io(address_map &map); - void spc1500_mem(address_map &map); - - uint8_t *m_p_ram; - uint8_t m_ipl; - uint8_t m_palet[3]; - uint8_t m_paltbl[8]; - uint16_t m_page; - uint8_t m_pcg_char, m_pcg_attr, m_char_change, m_pcg_char0; - uint16_t m_pcg_offset[3]; - int m_char_count; - attotime m_time; - bool m_romsel; - bool m_double_mode; - bool m_p5bit; - bool m_motor; - bool m_motor_toggle; - uint8_t m_crtc_vreg[0x100]; - bool m_centronics_busy; - virtual void machine_start() override; - virtual void machine_reset() override; - required_device<z80_device> m_maincpu; - required_device<mc6845_device> m_vdg; - required_device<cassette_image_device> m_cass; - required_device<ram_device> m_ram; - required_shared_ptr<uint8_t> m_p_videoram; - required_shared_ptr<uint8_t> m_pcgram; - required_ioport_array<10> m_io_kb; - required_ioport m_io_joy; - required_ioport m_dipsw; - required_device<centronics_device> m_centronics; - required_device<i8255_device> m_pio; - required_device<ay8910_device> m_sound; - required_device<palette_device> m_palette; - uint8_t *m_font; - uint8_t m_priority; - emu_timer *m_timer; - void get_pcg_addr(); -}; - -READ8_MEMBER( spc1500_state::keyboard_r ) -{ - offset &= 0xf; - - if (offset <= 9) - return m_io_kb[offset]->read(); - else - return 0xff; -} - -WRITE8_MEMBER( spc1500_state::romsel) -{ - m_romsel = 1; - if (m_ipl) - membank("bank1")->set_entry(0); - else - membank("bank1")->set_entry(1); -} - -WRITE8_MEMBER( spc1500_state::ramsel) -{ - m_romsel = 0; - membank("bank1")->set_entry(2); -} - -WRITE8_MEMBER( spc1500_state::portb_w) -{ -// m_ipl = data & (1 << 1); -} - -WRITE8_MEMBER( spc1500_state::psgb_w) -{ - int elapsed_time = m_timer->elapsed().as_attoseconds()/ATTOSECONDS_PER_MICROSECOND; - if (m_ipl != ((data>>1)&1)) - { - m_ipl = ((data>>1)&1); - membank("bank1")->set_entry(m_ipl ? 0 : 1); - } - //m_cass->change_state(BIT(data, 6) ? CASSETTE_SPEAKER_ENABLED : CASSETTE_SPEAKER_MUTED, CASSETTE_MASK_SPEAKER); - if (m_motor && !BIT(data, 7) && (elapsed_time > 100)) - { - m_cass->change_state((m_cass->get_state() & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_DISABLED ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR); - m_timer->reset(); - } - m_motor = BIT(data, 7); -} - -WRITE8_MEMBER( spc1500_state::portc_w) -{ - m_cass->output(BIT(data, 0) ? -1.0 : 1.0); - m_centronics->write_strobe(BIT(data, 7)); - m_double_mode = (!m_p5bit && BIT(data, 5)); // double access I/O mode - m_p5bit = BIT(data, 5); - m_vdg->set_unscaled_clock(VDP_CLOCK/(BIT(data, 2) ? 48 : 24)); -} - -READ8_MEMBER( spc1500_state::portb_r) -{ - uint8_t data = 0; - data |= ((m_cass->get_state() & CASSETTE_MASK_UISTATE) == CASSETTE_STOPPED || ((m_cass->get_state() & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_DISABLED)); - data |= (m_dipsw->read() & 1) << 4; - data |= (m_cass->input() > 0.0038)<<1; - data |= m_vdg->vsync_r()<<7; - data &= ~((m_centronics_busy==0)<<3); - return data; -} - -WRITE8_MEMBER( spc1500_state::crtc_w) -{ - static int m_crtc_index; - if((offset & 1) == 0) - { - m_crtc_index = data & 0x1f; - m_vdg->address_w(data); - } - else - { - m_crtc_vreg[m_crtc_index] = data; - m_vdg->register_w(data); - } -} - -READ8_MEMBER( spc1500_state::crtc_r) -{ - if (offset & 1) - { - return m_vdg->register_r(); - } - return 0; -} - -TIMER_DEVICE_CALLBACK_MEMBER(spc1500_state::timer) -{ - if(m_motor_toggle == true) - { - m_cass->change_state((m_cass->get_state() & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_DISABLED ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR); - m_motor_toggle = false; - } -} - -void spc1500_state::get_pcg_addr() -{ - uint16_t vaddr = 0; - if(m_p_videoram[0x7ff] & 0x20) { - vaddr = 0x7ff; - } else if(m_p_videoram[0x3ff] & 0x20) { - vaddr = 0x3ff; - } else if(m_p_videoram[0x5ff] & 0x20) { - vaddr = 0x5ff; - } else if(m_p_videoram[0x1ff] & 0x20) { - vaddr = 0x1ff; - } else { - vaddr = 0x3ff; - } - m_pcg_char = m_p_videoram[0x1000 + vaddr]; - m_pcg_attr = m_p_videoram[vaddr]; - if (m_pcg_char != m_char_change) - { - m_char_change = m_pcg_char; - m_pcg_offset[0] = 0; - m_pcg_offset[1] = 0; - m_pcg_offset[2] = 0; - } -} - -WRITE8_MEMBER( spc1500_state::pcg_w) -{ - int reg = (offset>>8)-0x15; - get_pcg_addr(); - - m_pcgram[m_pcg_char * 8 + m_pcg_offset[reg] + (reg*0x800)] = data; - if (m_pcg_offset[reg] == 7) - m_pcg_offset[reg] = 0; - else - m_pcg_offset[reg]++; -} - -READ8_MEMBER( spc1500_state::pcg_r) -{ - int reg = (offset>>8)-0x15; - uint8_t data = 0; - get_pcg_addr(); - if (reg < 0) reg = 2; - if (BIT(m_pcg_attr,5)) // PCG font - { - data = m_pcgram[m_pcg_char * 8 + m_pcg_offset[reg]+(reg*0x800)]; - } - else // ROM font - { - data = m_font[(m_crtc_vreg[0x9]==15?0x1000:0)+(m_pcg_char * 16)+m_pcg_offset[reg]]; - } - if (m_pcg_offset[reg]++ > m_crtc_vreg[0x9]-1) - m_pcg_offset[reg] = 0; - return data; -} - -WRITE8_MEMBER( spc1500_state::priority_w) -{ - m_priority = data; -} - -WRITE8_MEMBER( spc1500_state::palet_w) -{ - m_palet[(offset>>8)&0x0f] = data; - for(int i=1, j=0; i < 0x100; i<<=1, j++) - { - m_paltbl[j] = (m_palet[0]&i?1:0)|(m_palet[1]&i?2:0)|(m_palet[2]&i?4:0); - } -} - -void spc1500_state::spc_palette(palette_device &palette) const -{ - palette.set_pen_color(0,rgb_t(0x00,0x00,0x00)); - palette.set_pen_color(1,rgb_t(0x00,0x00,0xff)); - palette.set_pen_color(2,rgb_t(0xff,0x00,0x00)); - palette.set_pen_color(3,rgb_t(0xff,0x00,0xff)); - palette.set_pen_color(4,rgb_t(0x00,0xff,0x00)); - palette.set_pen_color(5,rgb_t(0x00,0xff,0xff)); - palette.set_pen_color(6,rgb_t(0xff,0xff,0x00)); - palette.set_pen_color(7,rgb_t(0xff,0xff,0xff)); -} - -VIDEO_START_MEMBER(spc1500_state, spc) -{ -} - -MC6845_RECONFIGURE(spc1500_state::crtc_reconfig) -{ -// printf("reconfig. w:%d, h:%d, %f (%d,%d,%d,%d)\n", width, height, (float)frame_period, visarea.left(), visarea.top(), visarea.right(), visarea.bottom()); -// printf("register. m_vert_disp:%d, m_horiz_disp:%d, m_max_ras_addr:%d, m_vert_char_total:%d\n", m_crtc_vreg[6], m_crtc_vreg[1], m_crtc_vreg[9], m_crtc_vreg[0x4]); -} - -MC6845_UPDATE_ROW(spc1500_state::crtc_update_row) -{ - uint8_t han2; - uint8_t *pf; - uint16_t hfnt; - int i; - int j; - int h1, h2, h3; - uint32_t *p = &bitmap.pix32(y); - - unsigned char cho[] ={1,1,1,1,1,1,1,1,0,0,1,1,1,3,5,5,0,0,5,3,3,5,5,5,0,0,3,3,5,1}; - unsigned char jong[]={0,0,0,1,1,1,1,1,0,0,1,1,1,2,2,2,0,0,2,2,2,2,2,2,0,0,2,2,1,1}; - bool inv = false; - char hs = (m_crtc_vreg[0x9] < 15 ? 3 : 4); - int n = y & (m_crtc_vreg[0x9]); - bool ln400 = (hs == 4 && m_crtc_vreg[0x4] > 20); - uint8_t *vram = &m_p_videoram[0] + (m_crtc_vreg[12] << 8) + m_crtc_vreg[13]; - for (i = 0; i < x_count; i++) - { - uint8_t *pp = &vram[0x2000+((y>>hs)*x_count+(((y)&7)<<11))+i+(((hs==4)&&(y&8))?0x400:0)]; - uint8_t *pv = &vram[(y>>hs)*x_count + i]; - uint8_t ascii = *(pv+0x1000); - uint8_t attr = *pv; - inv = (attr & 0x8 ? true : false); - uint8_t color = attr & 0x7; - uint8_t pixelb = *(pp+0); - uint8_t pixelr = *(pp+0x4000); - uint8_t pixelg = *(pp+0x8000); - bool nopalet = ((m_palet[0] | m_palet[1] | m_palet[2])==0 || ln400); - uint8_t pen = (nopalet ? color : m_paltbl[color]); - uint8_t pixelpen = 0; - uint8_t pixel = 0; - if (hs == 4 && (ascii & 0x80)) - { - uint16_t wpixelb = (pixelb << 8) + (*(pp+1)); - uint16_t wpixelr = (pixelr << 8) + (*(pp+0x4001)); - uint16_t wpixelg = (pixelg << 8) + (*(pp+0x8001)); - if (ascii != 0xfa) - { - han2 = *(pv+0x1001); - h1 = (ascii>>2)&0x1f; - h2 = ((ascii<<3)|(han2>>5))&0x1f; - h3 = (han2)&0x1f; - pf = &m_font[0x2000+(h1 * 32) + (cho[h2] + (h3 != 0) -1) * 16 * 2 * 32 + n]; - hfnt = (*pf << 8) | (*(pf+16)); - pf = &m_font[0x4000+(h2 * 32) + (h3 == 0 ? 0 : 1) * 16 * 2 * 32 + n]; - hfnt = hfnt & ((*pf << 8) | (*(pf+16))); - pf = &m_font[0x6000+(h3 * 32) + (jong[h2]-1) * 16 * 2 * 32 + n]; - hfnt = hfnt & ((*pf << 8) | (*(pf+16))); - } - else - { - ascii = *(pv+0x1001); - pf = &m_font[0x6000+(ascii*32) + n]; - hfnt = (*pf << 8) | (*(pf+16)); - } - hfnt = (inv ? 0xffff - hfnt : hfnt); - for (j = 0x8000; j > 0; j>>=1) - { - pixel = ((wpixelg&j ? 4:0 )|(wpixelr&j? 2:0)|(wpixelb&j ? 1:0)); - pixelpen = (nopalet ? pixel : m_paltbl[pixel]); - *p++ = m_palette->pen(((hfnt & j) || (m_priority & (1<<pixel))) ? pixelpen : pen); - } - i++; - } - else if (attr & 0x20) - { - uint8_t *pa = &m_pcgram[(ascii*(m_crtc_vreg[0x9]+1))+n]; - uint8_t b = *pa; - uint8_t r = *(pa+0x800); - uint8_t g = *(pa+0x1000); - for (j = 0x80; j > 0; j>>=1) - { - pixel = ((g & j)?4:0)|((r & j)?2:0)|((b & j)?1:0); - pen = (pixel == 7 ? color : pixel); - pixel = (pixelg&j ? 4 : 0)|(pixelr&j ? 2:0)|(pixelb&j ? 1:0 ); - pixelpen = (nopalet ? pixel : m_paltbl[pixel]); - *p++ = m_palette->pen((m_priority & (1<<pixel)) ? pixelpen : pen); - } - } - else - { - uint8_t fnt = m_font[(hs == 4 ? 0x1000 : (attr & (1<<6) ? 0x80<<4 : 0)) + (ascii<<4) + n]; - if (ascii == 0 && (attr & 0x08) && inv) - { - fnt = 0xff; - } - fnt = (inv ? 0xff - fnt : fnt); - for (j = 0x80; j > 0; j>>=1) - { - pixel = ((pixelg&j) ? 4 : 0)|(pixelr&j ? 2:0)|(pixelb&j ? 1:0 ); - pixelpen = (nopalet ? pixel : m_paltbl[pixel]); - if (ascii == 0 && attr == 0 && !inv) - *p++ = m_palette->pen(pixelpen); - else - *p++ = m_palette->pen(((fnt & j) || (m_priority & (1<<pixel))) ? pixelpen : pen); - } - } - } -} - -WRITE8_MEMBER( spc1500_state::double_w) -{ - if (m_double_mode) - { - if (offset < 0x4000) { offset += 0x2000; m_p_videoram[offset] = m_p_videoram[offset + 0x4000] = m_p_videoram[offset + 0x8000] = data; } else - if (offset < 0x8000) { offset += 0x2000; m_p_videoram[offset + 0x8000] = m_p_videoram[offset + 0x4000] = data; } else - if (offset < 0xc000) { offset += 0x2000; m_p_videoram[offset] = m_p_videoram[offset + 0x8000] = data; } else - if (offset < 0x10000){ offset += 0x2000; m_p_videoram[offset] = m_p_videoram[offset - 0x4000] = data; } - } - else - { - if (offset < 0x1000) {} else - if (offset < 0x1300) { palet_w(space, offset, data); } else - if (offset < 0x1400) { priority_w(space, offset, data); } else - if (offset < 0x1800) { pcg_w(space, offset, data); } else - if (offset < 0x1900) { crtc_w(space, offset, data); } else - if (offset < 0x1a00) {} else - if (offset < 0x1b00) { m_pio->write(offset, data); } else - if (offset < 0x1c00) { m_sound->data_w(data);} else - if (offset < 0x1d00) { m_sound->address_w(data);} else - if (offset < 0x1e00) { romsel(space, offset, data);} else - if (offset < 0x1f00) { ramsel(space, offset, data);} else - if (offset < 0x2000) {} else - if (offset < 0x10000) - { - if (offset < 0x4000) - { - offset &= 0xf7ff; - m_p_videoram[offset-0x1800] = m_p_videoram[offset-0x2000] = data; - } - else - m_p_videoram[offset-0x2000] = data; - }; - } -} - -READ8_MEMBER( spc1500_state::io_r) -{ - m_double_mode = false; - if (offset < 0x1000) {} else - if (offset < 0x1400) {} else - if (offset < 0x1800) { return pcg_r(space, offset); } else - if (offset < 0x1900) { return crtc_r(space, offset); } else - if (offset < 0x1a00) { return keyboard_r(space, offset); } else - if (offset < 0x1b00) { return m_pio->read(offset); } else - if (offset < 0x1c00) { return m_sound->data_r(); } else - if (offset < 0x2000) {} else - if (offset < 0x10000){ - if (offset < 0x4000) - offset &= 0xf7ff; - return m_p_videoram[offset - 0x2000]; } - return 0xff; -} - -void spc1500_state::spc1500_double_io(address_map &map) -{ - map.unmap_value_high(); - map(0x2000, 0xffff).ram().share("videoram"); - map(0x0000, 0x17ff).ram().share("pcgram"); - map(0x0000, 0xffff).rw(FUNC(spc1500_state::io_r), FUNC(spc1500_state::double_w)); -} - -/* Input ports */ -static INPUT_PORTS_START( spc1500 ) - - PORT_START("DIP_SWITCH") - PORT_DIPNAME( 0x01, 0x00, "40/80" ) - PORT_DIPSETTING( 0x00, "40COL" ) - PORT_DIPSETTING( 0x01, "80COL" ) - PORT_DIPNAME( 0x02, 0x02, "Language" ) - PORT_DIPSETTING( 0x02, "Korean" ) - PORT_DIPSETTING( 0x00, "English" ) - PORT_DIPNAME( 0x04, 0x00, "V-Res" ) - PORT_DIPSETTING( 0x04, "400" ) - PORT_DIPSETTING( 0x00, "200" ) - PORT_DIPNAME( 0x08, 0x08, "X1" ) - PORT_DIPSETTING( 0x08, "Compatible Mode" ) - PORT_DIPSETTING( 0x00, "Non Compatible" ) - - PORT_START("LINE.0") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift") PORT_CODE(KEYCODE_RSHIFT) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Ctrl") PORT_CODE(KEYCODE_RCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Break") PORT_CODE(KEYCODE_PAUSE) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\\ |") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\') PORT_CHAR('|') PORT_CHAR(0x1c) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Graph") PORT_CODE(KEYCODE_LALT) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_UNUSED) - - PORT_START("LINE.1") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("= +") PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+') - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right") PORT_CODE(KEYCODE_RIGHT) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Space") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C") PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHAR(0x03) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A") PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHAR(0x01) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q") PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHAR(0x16) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("1 !") PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!') - - PORT_START("LINE.2") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Caps") PORT_CODE(KEYCODE_CAPSLOCK) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left") PORT_CODE(KEYCODE_LEFT) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z") PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHAR(0x1a) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("] }") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}') PORT_CHAR(0x1d) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V") PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHAR(0x16) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S") PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHAR(0x13) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W") PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHAR(0x17) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("2 @") PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@') - - PORT_START("LINE.3") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Backspace") PORT_CODE(KEYCODE_BACKSPACE) PORT_CODE(KEYCODE_INSERT) PORT_CHAR(UCHAR_MAMEKEY(INSERT)) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("ESC") PORT_CODE(KEYCODE_ESC) PORT_CHAR(0x1b) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("` ~") PORT_CODE(KEYCODE_TILDE) PORT_CHAR('`') PORT_CHAR('~') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B") PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHAR(0x02) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D") PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_CHAR(0x04) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E") PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_CHAR(0x05) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("3 #") PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') - - PORT_START("LINE.4") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Del Ins") PORT_CODE(KEYCODE_DEL_PAD) PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD)) PORT_CHAR(8) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Down") PORT_CODE(KEYCODE_DOWN) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab") PORT_CODE(KEYCODE_TAB) PORT_CHAR('\t') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Home") PORT_CODE(KEYCODE_HOME) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N") PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHAR(0x0e) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F") PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_CHAR(0x06) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R") PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("4 $") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') - - PORT_START("LINE.5") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F1") PORT_CODE(KEYCODE_F1) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M") PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHAR(0x0d) - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G") PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHAR(0x07) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T") PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHAR(0x14) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("5 %") PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') - - PORT_START("LINE.6") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F2") PORT_CODE(KEYCODE_F2) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("[ {") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{') PORT_CHAR(0x1b) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X") PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHAR(0x18) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(", <") PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H") PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_CHAR(0x08) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y") PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHAR(0x19) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("6 ^") PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^') - - PORT_START("LINE.7") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F3") PORT_CODE(KEYCODE_F3) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P") PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHAR(0x10) - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(". >") PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J") PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHAR(0x0a) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U") PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHAR(0x15) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("7 &") PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&') - - PORT_START("LINE.8") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F4") PORT_CODE(KEYCODE_F4) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_UNUSED) - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\' \"") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('\"') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("/ ?") PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K") PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_CHAR(0x0b) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x09) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("8 *") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*') - - PORT_START("LINE.9") - PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Hangul") PORT_CODE(KEYCODE_RALT) - PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) - PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("- _") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('_') - PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("0 )") PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')') - PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("; :") PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':') - PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L") PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_CHAR(0x0c) - PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O") PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHAR(0x0e) - PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("9 (") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(') - - PORT_START("JOY") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP ) PORT_8WAY PORT_PLAYER(1) - PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN ) PORT_8WAY PORT_PLAYER(1) - PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_8WAY PORT_PLAYER(1) - PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_8WAY PORT_PLAYER(1) - PORT_BIT(0x10, IP_ACTIVE_HIGH,IPT_UNUSED) // DIP SW2 for Korean/English - PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) - PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) - PORT_BIT(0x80, IP_ACTIVE_HIGH,IPT_UNUSED) // DIP SW3 for 200/400 line -INPUT_PORTS_END - -void spc1500_state::spc1500_mem(address_map &map) -{ - map.unmap_value_high(); - map(0x0000, 0x7fff).bankr("bank1").bankw("bank2"); - map(0x8000, 0xffff).bankrw("bank4"); -} - -void spc1500_state::machine_start() -{ - uint8_t *mem_basic = memregion("basic")->base(); - uint8_t *mem_ipl = memregion("ipl")->base(); - m_p_ram = m_ram->pointer(); - m_font = memregion("font1")->base(); - // configure and intialize banks 1 (read banks) - membank("bank1")->configure_entry(0, mem_ipl); - membank("bank1")->configure_entry(1, mem_basic); - membank("bank1")->configure_entry(2, m_p_ram); - membank("bank1")->set_entry(0); - m_romsel = 1; - // intialize banks 2, 3, 4 (write banks) - membank("bank2")->set_base(m_p_ram); - membank("bank4")->set_base(m_p_ram + 0x8000); - m_timer = timer_alloc(0); - m_timer->adjust(attotime::zero); -} - -void spc1500_state::machine_reset() -{ - m_motor = false; - m_time = machine().scheduler().time(); - m_double_mode = false; - memset(&m_paltbl[0], 1, 8); - m_char_count = 0; -} - -READ8_MEMBER(spc1500_state::mc6845_videoram_r) -{ - return m_p_videoram[offset]; -} - -READ8_MEMBER( spc1500_state::psga_r ) -{ - uint8_t data = 0; - data |= (BIT(m_dipsw->read(),1)<<4) | (BIT(m_dipsw->read(),2)<<7); - data |= (m_io_joy->read() & 0x6f); - return data; -} - -READ8_MEMBER( spc1500_state::porta_r ) -{ - uint8_t data = 0x3f; - data |= (m_cass->input() > 0.0038) ? 0x80 : 0; - data |= ((m_cass->get_state() & CASSETTE_MASK_UISTATE) != CASSETTE_STOPPED) && ((m_cass->get_state() & CASSETTE_MASK_MOTOR) == CASSETTE_MOTOR_ENABLED) ? 0x00 : 0x40; - data &= ~((m_centronics_busy == 0)<< 5); - return data; -} - -void spc1500_state::spc1500(machine_config &config) -{ - /* basic machine hardware */ - Z80(config, m_maincpu, XTAL(4'000'000)); - m_maincpu->set_addrmap(AS_PROGRAM, &spc1500_state::spc1500_mem); - //m_maincpu->set_addrmap(AS_IO, &spc1500_state::spc1500_io); - m_maincpu->set_addrmap(AS_IO, &spc1500_state::spc1500_double_io); - m_maincpu->set_periodic_int(FUNC(spc1500_state::irq0_line_hold), attotime::from_hz(60)); - - /* video hardware */ - - screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); - screen.set_refresh_hz(60); - screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */ - screen.set_size(640, 400); - screen.set_visarea(0,640-1,0,400-1); - screen.set_screen_update("mc6845", FUNC(mc6845_device::screen_update)); - - PALETTE(config, m_palette, FUNC(spc1500_state::spc_palette), 8); - - MC6845(config, m_vdg, (VDP_CLOCK/48)); //unknown divider - m_vdg->set_screen("screen"); - m_vdg->set_show_border_area(false); - m_vdg->set_char_width(8); - m_vdg->set_update_row_callback(FUNC(spc1500_state::crtc_update_row)); - m_vdg->set_reconfigure_callback(FUNC(spc1500_state::crtc_reconfig)); - - MCFG_VIDEO_START_OVERRIDE(spc1500_state, spc) - - I8255(config, m_pio); - m_pio->out_pa_callback().set("cent_data_out", FUNC(output_latch_device::bus_w)); - m_pio->in_pb_callback().set(FUNC(spc1500_state::portb_r)); - m_pio->out_pb_callback().set(FUNC(spc1500_state::portb_w)); - m_pio->out_pc_callback().set(FUNC(spc1500_state::portc_w)); - - TIMER(config, "1hz").configure_periodic(FUNC(spc1500_state::timer), attotime::from_hz(1)); - - /* sound hardware */ - SPEAKER(config, "mono").front_center(); - AY8910(config, m_sound, XTAL(4'000'000) / 2); - m_sound->port_a_read_callback().set(FUNC(spc1500_state::psga_r)); - m_sound->port_b_write_callback().set(FUNC(spc1500_state::psgb_w)); - m_sound->add_route(ALL_OUTPUTS, "mono", 1.00); - - CENTRONICS(config, m_centronics, centronics_devices, "printer"); - m_centronics->busy_handler().set(FUNC(spc1500_state::centronics_busy_w)); - - output_latch_device ¢_data_out(OUTPUT_LATCH(config, "cent_data_out")); - m_centronics->set_output_latch(cent_data_out); - - INPUT_BUFFER(config, "cent_status_in"); - - CASSETTE(config, m_cass); - m_cass->set_default_state(CASSETTE_STOPPED | CASSETTE_SPEAKER_ENABLED | CASSETTE_MOTOR_DISABLED); - m_cass->add_route(ALL_OUTPUTS, "mono", 0.05); - m_cass->set_formats(spc1000_cassette_formats); - m_cass->set_interface("spc1500_cass"); - - SOFTWARE_LIST(config, "cass_list").set_original("spc1500_cass"); - - /* internal ram */ - RAM(config, RAM_TAG).set_default_size("64K"); -} - -/* ROM definition */ -ROM_START( spc1500 ) - ROM_REGION(0x8000, "ipl", ROMREGION_ERASEFF) - ROM_LOAD("ipl.rom", 0x0000, 0x8000, CRC(80d0704a) SHA1(01e4cbe8baad72effbbe01addd477c5b0ec85c16)) - ROM_REGION(0x8000, "basic", ROMREGION_ERASEFF) - ROM_LOAD("basic.rom", 0x0000, 0x8000, CRC(f48328e1) SHA1(fb874ea7d20078726682f2d0e03ea0d1f8bdbb07)) - ROM_REGION(0x8000, "font1", 0) - ROM_LOAD( "ss150fnt.bin", 0x0000, 0x2000, CRC(affdc5c0) SHA1(2a93582fcccf9e40b99ae238ce585d189afe9a5a) ) - ROM_LOAD( "ss151fnt.bin", 0x2000, 0x2000, CRC(83c2eb8d) SHA1(2adf7816206dc74b9f0d32cb3b56cbab31fa6044) ) - ROM_LOAD( "ss152fnt.bin", 0x4000, 0x2000, CRC(f4a5a590) SHA1(c9a02756107083bf602ae7c90cfe29b8b964e0df) ) - ROM_LOAD( "ss153fnt.bin", 0x6000, 0x2000, CRC(8677d5fa) SHA1(34bfacc855c3846744cd586c150c72e5cbe948b0) ) -ROM_END - - -/* Driver */ - -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1987, spc1500, 0, 0, spc1500, spc1500, spc1500_state, empty_init, "Samsung", "SPC-1500", 0 ) |