Previous 199869 Revisions Next

r32637 Saturday 11th October, 2014 at 00:49:55 UTC by Robbbert
(MESS) spc1000: added fdd code [Meeso Kim]

Note: I was unable to get the system to boot the floppy.
[src/mess/drivers]spc1000.c

trunk/src/mess/drivers/spc1000.c
r32636r32637
3535#include "imagedev/cassette.h"
3636#include "machine/ram.h"
3737#include "formats/spc1000_cas.h"
38#include "machine/i8255.h"
39#include "machine/upd765.h"
3840
3941
4042class spc1000_state : public driver_device
r32636r32637
4547      , m_p_videoram(*this, "videoram")
4648      , m_vdg(*this, "mc6847")
4749      , m_maincpu(*this, "maincpu")
50      , m_fdccpu(*this, "fdccpu")
51      , m_fdc(*this, "upd765")
52      , m_pio(*this, "d8255_master")
4853      , m_ram(*this, RAM_TAG)
4954      , m_cass(*this, "cassette")
5055   {}
r32636r32637
5762   DECLARE_READ8_MEMBER(porta_r);
5863   DECLARE_READ8_MEMBER(mc6847_videoram_r);
5964   DECLARE_WRITE8_MEMBER(cass_w);
60   ///DECLARE_WRITE8_MEMBER(spc1000_sd725_w);
61   ///DECLARE_READ8_MEMBER(spc1000_sd725_r);
62
65   DECLARE_WRITE8_MEMBER(spc1000_sd725_w);
66   DECLARE_READ8_MEMBER(spc1000_sd725_r);
67   DECLARE_WRITE8_MEMBER(fdc_8255_b_w);
68   DECLARE_READ8_MEMBER(fdc_8255_c_r);
69   DECLARE_WRITE8_MEMBER(fdc_8255_c_w);
70   DECLARE_READ8_MEMBER( upd765_tc_r );
71   DECLARE_WRITE8_MEMBER( fdc_control_w );   
6372   MC6847_GET_CHARROM_MEMBER(get_char_rom)
6473   {
6574      return m_p_videoram[0x1000 + (ch & 0x7f) * 16 + line];
r32636r32637
7079   UINT8 m_IPLK;
7180   UINT8 m_GMODE;
7281   UINT16 m_page;
82   UINT8 *m_work_ram;
7383   virtual void machine_reset();
74   ///FloppyDisk fdd;
75   ///void initDisk(void);
7684   required_device<mc6847_base_device> m_vdg;
7785   required_device<cpu_device> m_maincpu;
86   required_device<cpu_device> m_fdccpu;   
87   required_device<upd765a_device> m_fdc;   
88   required_device<i8255_device> m_pio;
7889   required_device<ram_device> m_ram;
7990   required_device<cassette_image_device> m_cass;
91
92   floppy_image_device *m_fd0;
93   floppy_image_device *m_fd1;
94   
95   emu_timer *m_timer_tc;   
96   
97   UINT8 m_i8255_0_pc;
98   UINT8 m_i8255_1_pc;
99   UINT8 m_i8255_portb;
100   
101   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
80102};
81103
104void spc1000_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
105{
106   m_fdc->tc_w(false);   
107}
82108
83
84109static ADDRESS_MAP_START(spc1000_mem, AS_PROGRAM, 8, spc1000_state )
85110   ADDRESS_MAP_UNMAP_HIGH
86111   AM_RANGE( 0x0000, 0x7fff ) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2")
r32636r32637
139164   return m_GMODE;
140165}
141166
167READ8_MEMBER(spc1000_state::spc1000_sd725_r)
168{
169   UINT8 data = 0;
170   switch (offset)
171   {
172      case 1:
173         data = m_i8255_portb;
174         break;
175      case 2:
176         data = m_i8255_1_pc >> 4;
177         break;
178   }
179   return data;
180}
181
182WRITE8_MEMBER(spc1000_state::spc1000_sd725_w)
183{
184   switch (offset)
185   {
186      case 0:
187         m_pio->write(space, offset+1, data);
188         break;
189      case 2:
190         m_i8255_0_pc = data;
191         break;
192   }
193}
194
195READ8_MEMBER(spc1000_state::fdc_8255_c_r)
196{
197   return m_i8255_0_pc >> 4;
198}
199
200WRITE8_MEMBER(spc1000_state::fdc_8255_b_w)
201{
202   m_i8255_portb = data;
203}
204
205WRITE8_MEMBER(spc1000_state::fdc_8255_c_w)
206{
207   m_i8255_1_pc = data;
208}
209
210//-------------------------------------------------
211//  fdc interrupt
212//-------------------------------------------------
213
214READ8_MEMBER( spc1000_state::upd765_tc_r )
215{
216   logerror("%s: upd765_tc_r\n", space.machine().describe_context());
217
218   // toggle tc on read
219   m_fdc->tc_w(true);
220   m_timer_tc->adjust(attotime::zero);
221
222   return 0xff;
223}
224
225WRITE8_MEMBER( spc1000_state::fdc_control_w )
226{
227   logerror("%s: sd725_fdc_control_w(%02x)\n", space.machine().describe_context(), data);
228
229   // bit 0, motor on signal
230   if (m_fd0)
231      m_fd0->mon_w(!BIT(data, 0));
232   if (m_fd1)
233      m_fd1->mon_w(!BIT(data, 0));
234}
235
236
142237static ADDRESS_MAP_START( spc1000_io , AS_IO, 8, spc1000_state )
143238   ADDRESS_MAP_UNMAP_HIGH
144239   AM_RANGE(0x0000, 0x1fff) AM_RAM AM_SHARE("videoram")
r32636r32637
157252   AM_RANGE(0x8008, 0x8008) AM_READ_PORT("LINE8")
158253   AM_RANGE(0x8009, 0x8009) AM_READ_PORT("LINE9")
159254   AM_RANGE(0xA000, 0xA000) AM_READWRITE(spc1000_iplk_r, spc1000_iplk_w)
160   ///AM_RANGE(0xC000, 0xC002) AM_READWRITE(spc1000_sd725_r, spc1000_sd725_w)
255   AM_RANGE(0xC000, 0xC002) AM_READWRITE(spc1000_sd725_r, spc1000_sd725_w)
256//   AM_RANGE(0xC000, 0xC003) AM_DEVREADWRITE("d8255_master", i8255_device, read, write)
161257ADDRESS_MAP_END
162258
163259/* Input ports */
r32636r32637
244340      PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x09)
245341      PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 (") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
246342   PORT_START("LINE9")
247      PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_UNUSED) ///   PORT_NAME("IPL") PORT_CODE(KEYCODE_F6)
343      PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_START)   PORT_NAME("IPL") PORT_CODE(KEYCODE_END)
248344      PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5)
249345      PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("- =") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=')
250346      PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0')
r32636r32637
254350      PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 )") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
255351INPUT_PORTS_END
256352
257#if 0
258typedef union PC
259{
260    struct {
261        unsigned char rDAV : 1;
262        unsigned char rRFD : 1;
263        unsigned char rDAC : 1;
264        unsigned char rNON : 1;
265        unsigned char wDAV : 1;
266        unsigned char wRFD : 1;
267        unsigned char wDAC : 1;
268        unsigned char wATN : 1;
269    } bits;
270    unsigned char b;
271} pc_t;
272353
273typedef char byte;
274
275typedef struct
276{
277    byte rdVal;
278    byte wrVal;
279    byte rSize;
280    UINT16 seq;
281    byte isCmd;
282    byte cmd;
283    UINT8 sdata[6];
284    pc_t PC;
285    char diskfile[1024];
286    char diskfile2[1024];
287    UINT8 diskdata[80*16*256]; // 80 tracks 16 sectors 256 byte
288    UINT8 diskdata2[80*16*256];
289    byte modified;
290    byte modified2;
291    byte write;
292    byte write2;
293    byte *buffer;
294    byte idx;
295    int datasize;
296    int dataidx;
297} FloppyDisk;
298
299void spc1000_state::initDisk(void)
300{
301    FILE *f;
302   strcpy(fdd.diskfile, "system.dsk");
303   strcpy(fdd.diskfile2, "disk.dsk");
304   printf("ddd\n");
305    if (strlen(fdd.diskfile) > 4)
306    {
307        f = fopen(fdd.diskfile, "rb");
308      if (f > 0) {
309           fread(fdd.diskdata, 1, sizeof(fdd.diskdata), f);
310           fclose(f);
311      }
312    }
313    if (strlen(fdd.diskfile2) > 4)
314    {
315        f = fopen(fdd.diskfile2, "rb");
316      if (f > 0) {
317           fread(fdd.diskdata2, 1, sizeof(fdd.diskdata2), f);
318         printf("disk.dsk\n");
319           fclose(f);
320      }
321    }
322}
323
324WRITE8_MEMBER(spc1000_state::spc1000_sd725_w)
325{
326   //printf("write 0x%04x=%d\n", (0xc000+offset), data);
327   if (offset == 0) {
328      fdd.wrVal = data;
329   } else if (offset == 2) {
330      if (data != 0)
331      {
332         fdd.PC.b = (data & 0xf0) | (fdd.PC.b & 0xf);
333      }
334      else
335      {
336         fdd.PC.b = fdd.PC.b & 0xf;
337      }
338      if (data & 0x10) // DAV=1
339      {
340         //printf("FDD Data Valid (c000 bit4 on)\n");
341         if (fdd.isCmd == 1) // command
342         {
343            fdd.isCmd = 0;
344            printf("FDD Command(Data) = 0h%02x\n", fdd.wrVal);
345            fdd.cmd = fdd.wrVal;
346            switch (fdd.wrVal)
347            {
348               case 0x00: // FDD Initialization
349                  printf("*FDD Initialization\n");
350                  break;
351               case 0x01: // FDD Write
352                  printf("*FDD Write\n");
353                  fdd.rSize = 4;
354                  fdd.seq = 0;
355                  break;
356               case 0x02: // FDD Read
357                  printf("*FDD Read\n");
358//                            fdd.PC.bits.rRFD = 1;
359                  fdd.rSize = 4;
360                  fdd.seq = 0;
361                  break;
362               case 0x03: // FDD Send Data
363                  //printf("*FDD Send Data\n");
364                  if (fdd.seq == 4)
365                  {
366                     printf("seq=%d,(%d,%d,%d,%d)\n", fdd.seq, fdd.sdata[0], fdd.sdata[1], fdd.sdata[2], fdd.sdata[3]);
367                     fdd.buffer = (byte*)(fdd.sdata[1] != 0 ? fdd.diskdata2 : fdd.diskdata);
368                     fdd.buffer += (fdd.sdata[2] * 16 + fdd.sdata[3]-1) * 256;
369                     fdd.datasize = fdd.sdata[0] * 256;
370                     fdd.dataidx = 0;
371
372                  }
373                  fdd.rdVal = 0;
374                  break;
375               case 0x04: // FDD Copy
376                  printf("*FDD Copy\n");
377                  fdd.rSize = 7;
378                  fdd.seq = 0;
379                  break;
380               case 0x05: // FDD Format
381                  printf("*FDD Format\n");
382                  break;
383               case 0x06: // FDD Send Status
384                  printf("*FDD Send Status\n");
385#define DATA_OK 0x40
386                  fdd.rdVal = 0x80 & DATA_OK;
387                  break;
388               case 0x07: // FDD Send Drive State
389                  printf("*FDD Send Drive State\n");
390#define DRIVE0 0x10
391                  fdd.rdVal = 0x0f | DRIVE0;
392                  break;
393               case 0x08: // FDD RAM Test
394                  printf("*FDD RAM Test\n");
395                  fdd.rSize = 4;
396                  fdd.seq = 0;
397                  break;
398               case 0x09: // FDD Transmit 2
399                  printf("*FDD Transmit 2\n");
400                  fdd.rSize = 4;
401                  fdd.seq = 0;
402                  break;
403               case 0x0A: // FDD Action
404                  printf("*FDD No Action\n");
405                  break;
406               case 0x0B: // FDD Transmit 1
407                  printf("*FDD Transmit 1\n");
408                  fdd.rSize = 4;
409                  fdd.seq = 0;
410                  break;
411               case 0x0C: // FDD Receive
412                  printf("*FDD Receive\n");
413                  fdd.rSize = 4;
414                  fdd.seq = 0;
415                  break;
416               case 0x0D: // FDD Go
417                  printf("*FDD Go\n");
418                  fdd.rSize = 2;
419                  fdd.seq = 0;
420                  break;
421               case 0x0E: // FDD Load
422                  printf("*FDD Load\n");
423                  fdd.rSize = 6;
424                  fdd.seq = 0;
425                  break;
426               case 0x0F: // FDD Save
427                  printf("FDD Save\n");
428                  fdd.rSize = 6;
429                  fdd.seq = 0;
430                  break;
431               case 0x10: // FDD Load and Go
432                  printf("*FDD Load and Go\n");
433                  break;
434
435            }
436         }
437         else
438         {
439            if (fdd.rSize-- > 0)
440            {
441               fdd.sdata[fdd.seq++] = (char) fdd.wrVal;
442               printf("seq=%d, data = 0x%02x\n", fdd.seq-1, fdd.sdata[fdd.seq-1]);
443               // printf("cmd=%d\n", fdd.cmd);
444               if (fdd.rSize == 0)
445               {
446                  printf("Fdd Command(%d) Fired\n", fdd.cmd);
447                  if (fdd.cmd == 0x0e)
448                  {
449                     int offset = (int)((int)fdd.sdata[2] * 16 + (int)fdd.sdata[3]-1) * 256;
450                     int size = fdd.sdata[0] * 256;
451                     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);
452                     fdd.buffer = (byte*)(fdd.sdata[1] != 0 ? fdd.diskdata2 : fdd.diskdata);
453                     //fdd.buffer += offset;
454                     fdd.datasize = size;
455                     unsigned short addr = ((unsigned short)fdd.sdata[4]) * 0x100 + (unsigned short)fdd.sdata[5];
456                     printf("target addr=%04x, %02x, %02x, size=%d\n", addr, fdd.sdata[4], fdd.sdata[5], fdd.datasize);
457                     UINT8 *mem = m_ram->pointer();
458                     memcpy(&mem[addr], &fdd.buffer[offset], fdd.datasize);
459                  }
460                  else if (fdd.cmd == 0x0f)
461                  {
462                     int offset = (int)((int)fdd.sdata[2] * 16 + (int)fdd.sdata[3]-1) * 256;
463                     int size = fdd.sdata[0] * 256;
464                     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);
465                     fdd.buffer = (byte*)(fdd.sdata[1] != 0 ? fdd.diskdata2 : fdd.diskdata);
466                     fdd.buffer += offset;
467                     fdd.datasize = size;
468                     unsigned short addr = ((unsigned short)fdd.sdata[4]) * 0x100 + (unsigned short)fdd.sdata[5];
469                     printf("target addr=%04x, %02x, %02x, size=%d\n", addr, fdd.sdata[4], fdd.sdata[5], fdd.datasize);
470                     UINT8 *mem = m_ram->pointer();
471                     memcpy(fdd.buffer, &mem[addr], fdd.datasize);
472                  }
473               }
474            }
475         }
476         fdd.PC.bits.rDAC = 1;
477
478      }
479      else if (fdd.PC.bits.rDAC == 1) // DAV=0
480      {
481         //printf("FDD Ouput Data Cleared (c000 bit4 off)\n");
482         fdd.wrVal = 0;
483//              printf("FDD_Read = 0h%02x (cleared)\n", fdd.wrVal);
484         fdd.PC.bits.rDAC = 0;
485      }
486      if (data & 0x20) // RFD=1
487      {
488//                printf("FDD Ready for Data Read (c000 bit5 on)\n");
489         fdd.PC.bits.rDAV = 1;
490      }
491      else if (fdd.PC.bits.rDAV == 1) // RFD=0
492      {
493         //fdd.rdVal = 0;
494         //printf("FDD Input Data = 0h%02x\n", fdd.rdVal);
495         fdd.PC.bits.rDAV = 0;
496      }
497      if (data & 0x40) // DAC=1
498      {
499//                printf("FDD Data accepted (c000 bit6 on)\n");
500      }
501      if (data & 0x80) // ATN=1
502      {
503//              printf("FDD Attention (c000 bit7 on)\n");
504         //printf("Command = 0x%02x\n", fdd.rdVal);
505         //printf("FDD Ready for Data\n", fdd.rdVal);
506         fdd.PC.bits.rRFD = 1;
507         fdd.isCmd = 1;
508      }     
509   }
510   return;
511}
512
513READ8_MEMBER(spc1000_state::spc1000_sd725_r)
514{
515   //printf("read %04x\n", (0xc000+offset));
516   if (offset == 1)
517   {
518      if (fdd.cmd == 3)
519      {
520         fdd.rdVal = *(fdd.buffer + fdd.dataidx++);
521      }
522      //printf("FDD_Data > 0h%02x\n", spcsys.fdd.rdVal);
523      return fdd.rdVal;
524   }
525   else if (offset == 2)
526   {
527      //printf("FDD_PC > 0h%02x\n", spcsys.fdd.PC.b);
528      return fdd.PC.b;
529   }
530   return 0;
531}
532#endif
533
534
535354void spc1000_state::machine_reset()
536355{
537356   address_space &space = m_maincpu->space(AS_PROGRAM);
r32636r32637
548367   membank("bank2")->set_base(ram);
549368   membank("bank3")->set_base(mem);
550369   membank("bank4")->set_base(ram + 0x8000);
551   ///initDisk();
370   
371   m_work_ram = auto_alloc_array_clear(machine(), UINT8, 0x10000);
372   m_fdccpu->set_input_line_vector(0, 0);
373   
374   m_fd0 = machine().device<floppy_connector>("upd765:0")->get_device();
375   m_fd1 = machine().device<floppy_connector>("upd765:1")->get_device();
552376
553   m_IPLK = 1;
377   m_timer_tc = timer_alloc(1, NULL);   
378   m_timer_tc->adjust(attotime::never);
379
380   // enable rom
381   m_fdccpu->space(AS_PROGRAM).install_rom(0x0000, 0xfff, 0, 0x2000, memregion("rom")->base());   
382   
383   m_IPLK = 1;
554384}
555385
556386READ8_MEMBER(spc1000_state::mc6847_videoram_r)
r32636r32637
588418   m_maincpu->set_input_line(0, state ? CLEAR_LINE : HOLD_LINE);
589419}
590420
421static SLOT_INTERFACE_START( sd725_floppies )
422   SLOT_INTERFACE( "sd320", EPSON_SD_320 )
423SLOT_INTERFACE_END
424
425//-------------------------------------------------
426//  address maps
427//-------------------------------------------------
428
429static ADDRESS_MAP_START( sd725_mem, AS_PROGRAM, 8, spc1000_state )
430   ADDRESS_MAP_UNMAP_HIGH
431   AM_RANGE(0x0000, 0x1fff) AM_ROM
432   AM_RANGE(0x2000, 0xffff) AM_RAM
433ADDRESS_MAP_END
434
435static ADDRESS_MAP_START( sd725_io, AS_IO, 8, spc1000_state )
436   ADDRESS_MAP_UNMAP_HIGH
437   ADDRESS_MAP_GLOBAL_MASK(0xff)
438   AM_RANGE(0xf8, 0xf8) AM_READWRITE(upd765_tc_r,fdc_control_w) // (R) Terminal Count Port (W) Motor Control Port
439   AM_RANGE(0xfa, 0xfb) AM_DEVICE("upd765", upd765a_device, map )
440   AM_RANGE(0xfc, 0xff) AM_DEVREADWRITE("d8255_master", i8255_device, read, write)
441ADDRESS_MAP_END
442
591443static MACHINE_CONFIG_START( spc1000, spc1000_state )
592444   /* basic machine hardware */
593445   MCFG_CPU_ADD("maincpu",Z80, XTAL_4MHz)
594446   MCFG_CPU_PROGRAM_MAP(spc1000_mem)
595447   MCFG_CPU_IO_MAP(spc1000_io)
596448
449   /* sub CPU(5 inch floppy drive) */
450   MCFG_CPU_ADD("fdccpu", Z80, XTAL_4MHz)       /* 4 MHz */
451   MCFG_CPU_PROGRAM_MAP(sd725_mem)
452   MCFG_CPU_IO_MAP(sd725_io)
453   
454   MCFG_DEVICE_ADD("d8255_master", I8255, 0)
455   MCFG_I8255_IN_PORTA_CB(DEVREAD8("d8255_master", i8255_device, pb_r))
456   MCFG_I8255_IN_PORTB_CB(DEVREAD8("d8255_master", i8255_device, pa_r))
457   MCFG_I8255_OUT_PORTB_CB(WRITE8(spc1000_state, fdc_8255_b_w))   
458   MCFG_I8255_IN_PORTC_CB(READ8(spc1000_state, fdc_8255_c_r))
459   MCFG_I8255_OUT_PORTC_CB(WRITE8(spc1000_state, fdc_8255_c_w))   
460
461   // floppy disk controller
462   MCFG_UPD765A_ADD("upd765", true, true)
463   MCFG_UPD765_INTRQ_CALLBACK(INPUTLINE("fdccpu", INPUT_LINE_IRQ0))   
464
465   // floppy drives
466   MCFG_FLOPPY_DRIVE_ADD("upd765:0", sd725_floppies, "sd320", floppy_image_device::default_floppy_formats)
467   MCFG_FLOPPY_DRIVE_ADD("upd765:1", sd725_floppies, "sd320", floppy_image_device::default_floppy_formats)   
468   //CFG_SOFTWARE_LIST_ADD("disk_list","spc1000_flop")
469   
597470   /* video hardware */
598471   MCFG_SCREEN_MC6847_NTSC_ADD("screen", "mc6847")
599472
r32636r32637
625498ROM_START( spc1000 )
626499   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
627500   ROM_LOAD( "spcall.rom", 0x0000, 0x8000, CRC(19638fc9) SHA1(489f1baa7aebf3c8c660325fb1fd790d84203284))
501
502    ROM_REGION( 0x10000, "fdccpu", 0)
503    ROM_LOAD("sd725a.bin", 0x0000, 0x1000, CRC(96ac2eb8) SHA1(8e9d8f63a7fb87af417e95603e71cf537a6e83f1))
628504ROM_END
629505
630506#if 0

Previous 199869 Revisions Next


© 1997-2024 The MAME Team