(MESS) spc1000 : added commented-out code for floppy-disk (thx to Anna Wu for finding it)

This commit is contained in:
Robbbert 2014-09-13 06:03:17 +00:00
parent 0833a1a306
commit 7bdc9ee91c

View File

@ -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<mc6847_base_device> m_vdg;
required_device<cpu_device> m_maincpu;
required_device<ram_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 */