trunk/src/mess/drivers/spc1000.c
r32636 | r32637 | |
35 | 35 | #include "imagedev/cassette.h" |
36 | 36 | #include "machine/ram.h" |
37 | 37 | #include "formats/spc1000_cas.h" |
| 38 | #include "machine/i8255.h" |
| 39 | #include "machine/upd765.h" |
38 | 40 | |
39 | 41 | |
40 | 42 | class spc1000_state : public driver_device |
r32636 | r32637 | |
45 | 47 | , m_p_videoram(*this, "videoram") |
46 | 48 | , m_vdg(*this, "mc6847") |
47 | 49 | , m_maincpu(*this, "maincpu") |
| 50 | , m_fdccpu(*this, "fdccpu") |
| 51 | , m_fdc(*this, "upd765") |
| 52 | , m_pio(*this, "d8255_master") |
48 | 53 | , m_ram(*this, RAM_TAG) |
49 | 54 | , m_cass(*this, "cassette") |
50 | 55 | {} |
r32636 | r32637 | |
57 | 62 | DECLARE_READ8_MEMBER(porta_r); |
58 | 63 | DECLARE_READ8_MEMBER(mc6847_videoram_r); |
59 | 64 | 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 ); |
63 | 72 | MC6847_GET_CHARROM_MEMBER(get_char_rom) |
64 | 73 | { |
65 | 74 | return m_p_videoram[0x1000 + (ch & 0x7f) * 16 + line]; |
r32636 | r32637 | |
70 | 79 | UINT8 m_IPLK; |
71 | 80 | UINT8 m_GMODE; |
72 | 81 | UINT16 m_page; |
| 82 | UINT8 *m_work_ram; |
73 | 83 | virtual void machine_reset(); |
74 | | ///FloppyDisk fdd; |
75 | | ///void initDisk(void); |
76 | 84 | required_device<mc6847_base_device> m_vdg; |
77 | 85 | 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; |
78 | 89 | required_device<ram_device> m_ram; |
79 | 90 | 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); |
80 | 102 | }; |
81 | 103 | |
| 104 | void spc1000_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) |
| 105 | { |
| 106 | m_fdc->tc_w(false); |
| 107 | } |
82 | 108 | |
83 | | |
84 | 109 | static ADDRESS_MAP_START(spc1000_mem, AS_PROGRAM, 8, spc1000_state ) |
85 | 110 | ADDRESS_MAP_UNMAP_HIGH |
86 | 111 | AM_RANGE( 0x0000, 0x7fff ) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2") |
r32636 | r32637 | |
139 | 164 | return m_GMODE; |
140 | 165 | } |
141 | 166 | |
| 167 | READ8_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 | |
| 182 | WRITE8_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 | |
| 195 | READ8_MEMBER(spc1000_state::fdc_8255_c_r) |
| 196 | { |
| 197 | return m_i8255_0_pc >> 4; |
| 198 | } |
| 199 | |
| 200 | WRITE8_MEMBER(spc1000_state::fdc_8255_b_w) |
| 201 | { |
| 202 | m_i8255_portb = data; |
| 203 | } |
| 204 | |
| 205 | WRITE8_MEMBER(spc1000_state::fdc_8255_c_w) |
| 206 | { |
| 207 | m_i8255_1_pc = data; |
| 208 | } |
| 209 | |
| 210 | //------------------------------------------------- |
| 211 | // fdc interrupt |
| 212 | //------------------------------------------------- |
| 213 | |
| 214 | READ8_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 | |
| 225 | WRITE8_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 | |
142 | 237 | static ADDRESS_MAP_START( spc1000_io , AS_IO, 8, spc1000_state ) |
143 | 238 | ADDRESS_MAP_UNMAP_HIGH |
144 | 239 | AM_RANGE(0x0000, 0x1fff) AM_RAM AM_SHARE("videoram") |
r32636 | r32637 | |
157 | 252 | AM_RANGE(0x8008, 0x8008) AM_READ_PORT("LINE8") |
158 | 253 | AM_RANGE(0x8009, 0x8009) AM_READ_PORT("LINE9") |
159 | 254 | 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) |
161 | 257 | ADDRESS_MAP_END |
162 | 258 | |
163 | 259 | /* Input ports */ |
r32636 | r32637 | |
244 | 340 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I") PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHAR(0x09) |
245 | 341 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("8 (") PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') |
246 | 342 | 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) |
248 | 344 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F5") PORT_CODE(KEYCODE_F5) |
249 | 345 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("- =") PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') |
250 | 346 | PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("0") PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
r32636 | r32637 | |
254 | 350 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("9 )") PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')') |
255 | 351 | INPUT_PORTS_END |
256 | 352 | |
257 | | #if 0 |
258 | | typedef 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; |
272 | 353 | |
273 | | typedef char byte; |
274 | | |
275 | | typedef 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 | | |
299 | | void 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 | | |
324 | | WRITE8_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 | | |
513 | | READ8_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 | | |
535 | 354 | void spc1000_state::machine_reset() |
536 | 355 | { |
537 | 356 | address_space &space = m_maincpu->space(AS_PROGRAM); |
r32636 | r32637 | |
548 | 367 | membank("bank2")->set_base(ram); |
549 | 368 | membank("bank3")->set_base(mem); |
550 | 369 | 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(); |
552 | 376 | |
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; |
554 | 384 | } |
555 | 385 | |
556 | 386 | READ8_MEMBER(spc1000_state::mc6847_videoram_r) |
r32636 | r32637 | |
588 | 418 | m_maincpu->set_input_line(0, state ? CLEAR_LINE : HOLD_LINE); |
589 | 419 | } |
590 | 420 | |
| 421 | static SLOT_INTERFACE_START( sd725_floppies ) |
| 422 | SLOT_INTERFACE( "sd320", EPSON_SD_320 ) |
| 423 | SLOT_INTERFACE_END |
| 424 | |
| 425 | //------------------------------------------------- |
| 426 | // address maps |
| 427 | //------------------------------------------------- |
| 428 | |
| 429 | static 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 |
| 433 | ADDRESS_MAP_END |
| 434 | |
| 435 | static 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) |
| 441 | ADDRESS_MAP_END |
| 442 | |
591 | 443 | static MACHINE_CONFIG_START( spc1000, spc1000_state ) |
592 | 444 | /* basic machine hardware */ |
593 | 445 | MCFG_CPU_ADD("maincpu",Z80, XTAL_4MHz) |
594 | 446 | MCFG_CPU_PROGRAM_MAP(spc1000_mem) |
595 | 447 | MCFG_CPU_IO_MAP(spc1000_io) |
596 | 448 | |
| 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 | |
597 | 470 | /* video hardware */ |
598 | 471 | MCFG_SCREEN_MC6847_NTSC_ADD("screen", "mc6847") |
599 | 472 | |
r32636 | r32637 | |
625 | 498 | ROM_START( spc1000 ) |
626 | 499 | ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF ) |
627 | 500 | 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)) |
628 | 504 | ROM_END |
629 | 505 | |
630 | 506 | #if 0 |