From 7bdc9ee91c5252edc995724a18e22c927d9c6bfe Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sat, 13 Sep 2014 06:03:17 +0000 Subject: [PATCH] (MESS) spc1000 : added commented-out code for floppy-disk (thx to Anna Wu for finding it) --- src/mess/drivers/spc1000.c | 307 ++++++++++++++++++++++++++++++++++++- 1 file changed, 306 insertions(+), 1 deletion(-) diff --git a/src/mess/drivers/spc1000.c b/src/mess/drivers/spc1000.c index 006a3343b7e..d6c421d60d9 100644 --- a/src/mess/drivers/spc1000.c +++ b/src/mess/drivers/spc1000.c @@ -1,3 +1,5 @@ +// license:MAME +// copyright-holders:Miodrag Milanovic, Robbbert /*************************************************************************** Samsung SPC-1000 driver by Miodrag Milanovic @@ -11,6 +13,17 @@ ToDo: - Find out if any of the unconnected parts of 6000,4000,4001 are used +NOTE: 2014-09-13: added code from someone's modified MESS driver for floppy + disk. Since it is not to our coding standards, it is + commented out with #if 0/#endif and 3 slashes (///). + It is planned to be converted when time permits. The + author is unknown. + + Hardware details of the fdc: Intelligent device, Z80 CPU, + XTAL_8MHz, PPI 8255, FDC uPD765C, 2 RAM chips, 28 other + small ics. And of course, no schematic. + + ****************************************************************************/ @@ -44,6 +57,8 @@ public: DECLARE_READ8_MEMBER(porta_r); DECLARE_READ8_MEMBER(mc6847_videoram_r); DECLARE_WRITE8_MEMBER(cass_w); + ///DECLARE_WRITE8_MEMBER(spc1000_sd725_w); + ///DECLARE_READ8_MEMBER(spc1000_sd725_r); MC6847_GET_CHARROM_MEMBER(get_char_rom) { @@ -56,6 +71,8 @@ private: UINT8 m_GMODE; UINT16 m_page; virtual void machine_reset(); + ///FloppyDisk fdd; + ///void initDisk(void); required_device m_vdg; required_device m_maincpu; required_device m_ram; @@ -140,6 +157,7 @@ static ADDRESS_MAP_START( spc1000_io , AS_IO, 8, spc1000_state ) AM_RANGE(0x8008, 0x8008) AM_READ_PORT("LINE8") AM_RANGE(0x8009, 0x8009) AM_READ_PORT("LINE9") AM_RANGE(0xA000, 0xA000) AM_READWRITE(spc1000_iplk_r, spc1000_iplk_w) + ///AM_RANGE(0xC000, 0xC002) AM_READWRITE(spc1000_sd725_r, spc1000_sd725_w) ADDRESS_MAP_END /* Input ports */ @@ -226,7 +244,7 @@ static INPUT_PORTS_START( spc1000 ) PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x09) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 (") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') PORT_START("LINE9") - PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) + PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) /// PORT_NAME("IPL") PORT_CODE(KEYCODE_F6) PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("- =") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') @@ -236,6 +254,283 @@ static INPUT_PORTS_START( spc1000 ) PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 )") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') INPUT_PORTS_END +#if 0 +typedef union PC +{ + struct { + unsigned char rDAV : 1; + unsigned char rRFD : 1; + unsigned char rDAC : 1; + unsigned char rNON : 1; + unsigned char wDAV : 1; + unsigned char wRFD : 1; + unsigned char wDAC : 1; + unsigned char wATN : 1; + } bits; + unsigned char b; +} pc_t; + +typedef char byte; + +typedef struct +{ + byte rdVal; + byte wrVal; + byte rSize; + UINT16 seq; + byte isCmd; + byte cmd; + UINT8 sdata[6]; + pc_t PC; + char diskfile[1024]; + char diskfile2[1024]; + UINT8 diskdata[80*16*256]; // 80 tracks 16 sectors 256 byte + UINT8 diskdata2[80*16*256]; + byte modified; + byte modified2; + byte write; + byte write2; + byte *buffer; + byte idx; + int datasize; + int dataidx; +} FloppyDisk; + +void spc1000_state::initDisk(void) +{ + FILE *f; + strcpy(fdd.diskfile, "system.dsk"); + strcpy(fdd.diskfile2, "disk.dsk"); + printf("ddd\n"); + if (strlen(fdd.diskfile) > 4) + { + f = fopen(fdd.diskfile, "rb"); + if (f > 0) { + fread(fdd.diskdata, 1, sizeof(fdd.diskdata), f); + fclose(f); + } + } + if (strlen(fdd.diskfile2) > 4) + { + f = fopen(fdd.diskfile2, "rb"); + if (f > 0) { + fread(fdd.diskdata2, 1, sizeof(fdd.diskdata2), f); + printf("disk.dsk\n"); + fclose(f); + } + } +} + +WRITE8_MEMBER(spc1000_state::spc1000_sd725_w) +{ + //printf("write 0x%04x=%d\n", (0xc000+offset), data); + if (offset == 0) { + fdd.wrVal = data; + } else if (offset == 2) { + if (data != 0) + { + fdd.PC.b = (data & 0xf0) | (fdd.PC.b & 0xf); + } + else + { + fdd.PC.b = fdd.PC.b & 0xf; + } + if (data & 0x10) // DAV=1 + { + //printf("FDD Data Valid (c000 bit4 on)\n"); + if (fdd.isCmd == 1) // command + { + fdd.isCmd = 0; + printf("FDD Command(Data) = 0h%02x\n", fdd.wrVal); + fdd.cmd = fdd.wrVal; + switch (fdd.wrVal) + { + case 0x00: // FDD Initialization + printf("*FDD Initialization\n"); + break; + case 0x01: // FDD Write + printf("*FDD Write\n"); + fdd.rSize = 4; + fdd.seq = 0; + break; + case 0x02: // FDD Read + printf("*FDD Read\n"); +// fdd.PC.bits.rRFD = 1; + fdd.rSize = 4; + fdd.seq = 0; + break; + case 0x03: // FDD Send Data + //printf("*FDD Send Data\n"); + if (fdd.seq == 4) + { + printf("seq=%d,(%d,%d,%d,%d)\n", fdd.seq, fdd.sdata[0], fdd.sdata[1], fdd.sdata[2], fdd.sdata[3]); + fdd.buffer = (byte*)(fdd.sdata[1] != 0 ? fdd.diskdata2 : fdd.diskdata); + fdd.buffer += (fdd.sdata[2] * 16 + fdd.sdata[3]-1) * 256; + fdd.datasize = fdd.sdata[0] * 256; + fdd.dataidx = 0; + + } + fdd.rdVal = 0; + break; + case 0x04: // FDD Copy + printf("*FDD Copy\n"); + fdd.rSize = 7; + fdd.seq = 0; + break; + case 0x05: // FDD Format + printf("*FDD Format\n"); + break; + case 0x06: // FDD Send Status + printf("*FDD Send Status\n"); +#define DATA_OK 0x40 + fdd.rdVal = 0x80 & DATA_OK; + break; + case 0x07: // FDD Send Drive State + printf("*FDD Send Drive State\n"); +#define DRIVE0 0x10 + fdd.rdVal = 0x0f | DRIVE0; + break; + case 0x08: // FDD RAM Test + printf("*FDD RAM Test\n"); + fdd.rSize = 4; + fdd.seq = 0; + break; + case 0x09: // FDD Transmit 2 + printf("*FDD Transmit 2\n"); + fdd.rSize = 4; + fdd.seq = 0; + break; + case 0x0A: // FDD Action + printf("*FDD No Action\n"); + break; + case 0x0B: // FDD Transmit 1 + printf("*FDD Transmit 1\n"); + fdd.rSize = 4; + fdd.seq = 0; + break; + case 0x0C: // FDD Receive + printf("*FDD Receive\n"); + fdd.rSize = 4; + fdd.seq = 0; + break; + case 0x0D: // FDD Go + printf("*FDD Go\n"); + fdd.rSize = 2; + fdd.seq = 0; + break; + case 0x0E: // FDD Load + printf("*FDD Load\n"); + fdd.rSize = 6; + fdd.seq = 0; + break; + case 0x0F: // FDD Save + printf("FDD Save\n"); + fdd.rSize = 6; + fdd.seq = 0; + break; + case 0x10: // FDD Load and Go + printf("*FDD Load and Go\n"); + break; + + } + } + else + { + if (fdd.rSize-- > 0) + { + fdd.sdata[fdd.seq++] = (char) fdd.wrVal; + printf("seq=%d, data = 0x%02x\n", fdd.seq-1, fdd.sdata[fdd.seq-1]); + // printf("cmd=%d\n", fdd.cmd); + if (fdd.rSize == 0) + { + printf("Fdd Command(%d) Fired\n", fdd.cmd); + if (fdd.cmd == 0x0e) + { + int offset = (int)((int)fdd.sdata[2] * 16 + (int)fdd.sdata[3]-1) * 256; + int size = fdd.sdata[0] * 256; + printf("load(%d,%d,%d,%d),offset=%d, size=%d\n", fdd.sdata[0], fdd.sdata[1], fdd.sdata[2], fdd.sdata[3], offset, size); + fdd.buffer = (byte*)(fdd.sdata[1] != 0 ? fdd.diskdata2 : fdd.diskdata); + //fdd.buffer += offset; + fdd.datasize = size; + unsigned short addr = ((unsigned short)fdd.sdata[4]) * 0x100 + (unsigned short)fdd.sdata[5]; + printf("target addr=%04x, %02x, %02x, size=%d\n", addr, fdd.sdata[4], fdd.sdata[5], fdd.datasize); + UINT8 *mem = m_ram->pointer(); + memcpy(&mem[addr], &fdd.buffer[offset], fdd.datasize); + } + else if (fdd.cmd == 0x0f) + { + int offset = (int)((int)fdd.sdata[2] * 16 + (int)fdd.sdata[3]-1) * 256; + int size = fdd.sdata[0] * 256; + printf("save(%d,%d,%d,%d),offset=%d, size=%d\n", fdd.sdata[0], fdd.sdata[1], fdd.sdata[2], fdd.sdata[3], offset, size); + fdd.buffer = (byte*)(fdd.sdata[1] != 0 ? fdd.diskdata2 : fdd.diskdata); + fdd.buffer += offset; + fdd.datasize = size; + unsigned short addr = ((unsigned short)fdd.sdata[4]) * 0x100 + (unsigned short)fdd.sdata[5]; + printf("target addr=%04x, %02x, %02x, size=%d\n", addr, fdd.sdata[4], fdd.sdata[5], fdd.datasize); + UINT8 *mem = m_ram->pointer(); + memcpy(fdd.buffer, &mem[addr], fdd.datasize); + } + } + } + } + fdd.PC.bits.rDAC = 1; + + } + else if (fdd.PC.bits.rDAC == 1) // DAV=0 + { + //printf("FDD Ouput Data Cleared (c000 bit4 off)\n"); + fdd.wrVal = 0; +// printf("FDD_Read = 0h%02x (cleared)\n", fdd.wrVal); + fdd.PC.bits.rDAC = 0; + } + if (data & 0x20) // RFD=1 + { +// printf("FDD Ready for Data Read (c000 bit5 on)\n"); + fdd.PC.bits.rDAV = 1; + } + else if (fdd.PC.bits.rDAV == 1) // RFD=0 + { + //fdd.rdVal = 0; + //printf("FDD Input Data = 0h%02x\n", fdd.rdVal); + fdd.PC.bits.rDAV = 0; + } + if (data & 0x40) // DAC=1 + { +// printf("FDD Data accepted (c000 bit6 on)\n"); + } + if (data & 0x80) // ATN=1 + { +// printf("FDD Attention (c000 bit7 on)\n"); + //printf("Command = 0x%02x\n", fdd.rdVal); + //printf("FDD Ready for Data\n", fdd.rdVal); + fdd.PC.bits.rRFD = 1; + fdd.isCmd = 1; + } + } + return; +} + +READ8_MEMBER(spc1000_state::spc1000_sd725_r) +{ + //printf("read %04x\n", (0xc000+offset)); + if (offset == 1) + { + if (fdd.cmd == 3) + { + fdd.rdVal = *(fdd.buffer + fdd.dataidx++); + } + //printf("FDD_Data > 0h%02x\n", spcsys.fdd.rdVal); + return fdd.rdVal; + } + else if (offset == 2) + { + //printf("FDD_PC > 0h%02x\n", spcsys.fdd.PC.b); + return fdd.PC.b; + } + return 0; +} +#endif + void spc1000_state::machine_reset() { @@ -253,6 +548,7 @@ void spc1000_state::machine_reset() membank("bank2")->set_base(ram); membank("bank3")->set_base(mem); membank("bank4")->set_base(ram + 0x8000); + ///initDisk(); m_IPLK = 1; } @@ -331,6 +627,15 @@ ROM_START( spc1000 ) ROM_LOAD( "spcall.rom", 0x0000, 0x8000, CRC(19638fc9) SHA1(489f1baa7aebf3c8c660325fb1fd790d84203284)) ROM_END +#if 0 +ROM_START( spc1000 ) + ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) + ROM_LOAD( "spcall.rom", 0x0000, 0x8000, CRC(2FBB6ECA) SHA1(cc9a076b0f00d54b2aec31f1f558b10f43ef61c8)) + /// more roms to come... +ROM_END +#endif + + /* Driver */ /* YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS */