src/mess/drivers/a310.c
| r846 | r847 | |
| 80 | 80 | static INT16 a310_pages[(32*1024*1024)/(4096)]; // the logical RAM area is 32 megs, and the smallest page size is 4k |
| 81 | 81 | static UINT32 a310_vidregs[256]; |
| 82 | 82 | static UINT8 a310_iocregs[0x80/4]; |
| 83 | | static UINT32 a310_timercnt[4]; |
| 83 | static UINT32 a310_timercnt[4], a310_timerout[4]; |
| 84 | 84 | static UINT32 a310_sndstart, a310_sndend, a310_sndcur; |
| 85 | 85 | |
| 86 | 86 | static mame_timer *vbl_timer, *timer[4], *snd_timer; |
| r846 | r847 | |
| 367 | 367 | "(write) Timer 3 latch command" // 31 |
| 368 | 368 | }; |
| 369 | 369 | |
| 370 | | static void update_timer_cnt(int tmr) |
| 370 | static void latch_timer_cnt(int tmr) |
| 371 | 371 | { |
| 372 | 372 | double time; |
| 373 | | UINT32 cnt; |
| 374 | 373 | |
| 375 | 374 | time = mame_time_to_double(mame_timer_timeelapsed(timer[tmr])); |
| 376 | 375 | time *= 2000000.0; // find out how many 2 MHz ticks have gone by |
| 377 | | cnt = a310_timercnt[tmr] - (UINT32)time; |
| 378 | | a310_iocregs[16+(4*tmr)] = cnt&0xff; |
| 379 | | a310_iocregs[17+(4*tmr)] = (cnt>>8)&0xff; |
| 376 | a310_timerout[tmr] = a310_timercnt[tmr] - (UINT32)time; |
| 380 | 377 | } |
| 381 | 378 | |
| 382 | 379 | static READ32_HANDLER(ioc_r) |
| r846 | r847 | |
| 390 | 387 | break; |
| 391 | 388 | |
| 392 | 389 | case 16: // timer 0 read |
| 390 | return a310_timerout[0]&0xff; |
| 391 | break; |
| 393 | 392 | case 17: |
| 394 | | update_timer_cnt(0); |
| 393 | return (a310_timerout[0]>>8)&0xff; |
| 395 | 394 | break; |
| 396 | 395 | case 20: // timer 1 read |
| 396 | return a310_timerout[1]&0xff; |
| 397 | break; |
| 397 | 398 | case 21: |
| 398 | | update_timer_cnt(1); |
| 399 | return (a310_timerout[1]>>8)&0xff; |
| 399 | 400 | break; |
| 400 | 401 | case 24: // timer 2 read |
| 402 | return a310_timerout[2]&0xff; |
| 403 | break; |
| 401 | 404 | case 25: |
| 402 | | update_timer_cnt(2); |
| 405 | return (a310_timerout[2]>>8)&0xff; |
| 403 | 406 | break; |
| 404 | 407 | case 28: // timer 3 read |
| 408 | return a310_timerout[3]&0xff; |
| 409 | break; |
| 405 | 410 | case 29: |
| 406 | | update_timer_cnt(3); |
| 411 | return (a310_timerout[3]>>8)&0xff; |
| 407 | 412 | break; |
| 408 | 413 | } |
| 409 | 414 | |
| r846 | r847 | |
| 428 | 433 | { |
| 429 | 434 | if (offset >= 0x80000 && offset < 0xc0000) |
| 430 | 435 | { |
| 431 | | logerror("IOC: W %02x @ reg %s (PC=%x)\n", data&0xff, ioc_regnames[offset&0x1f], activecpu_get_pc()); |
| 436 | // logerror("IOC: W %02x @ reg %s (PC=%x)\n", data&0xff, ioc_regnames[offset&0x1f], activecpu_get_pc()); |
| 432 | 437 | |
| 433 | 438 | switch (offset&0x1f) |
| 434 | 439 | { |
| 440 | case 0: // control |
| 441 | logerror("IOC I2C: CLK %d DAT %d\n", (data>>1)&1, data&1); |
| 442 | break; |
| 443 | |
| 435 | 444 | case 5: // IRQ clear A |
| 436 | 445 | a310_iocregs[4] &= ~(data&0xff); |
| 437 | 446 | |
| r846 | r847 | |
| 445 | 454 | case 16: |
| 446 | 455 | case 17: |
| 447 | 456 | a310_iocregs[offset&0x1f] = data & 0xff; |
| 448 | | a310_timercnt[0] = a310_iocregs[17]<<8 | a310_iocregs[16]; |
| 449 | 457 | break; |
| 450 | 458 | |
| 451 | 459 | case 20: |
| 452 | 460 | case 21: |
| 453 | 461 | a310_iocregs[offset&0x1f] = data & 0xff; |
| 454 | | a310_timercnt[1] = a310_iocregs[21]<<8 | a310_iocregs[20]; |
| 455 | 462 | break; |
| 456 | 463 | |
| 457 | 464 | case 24: |
| 458 | 465 | case 25: |
| 459 | 466 | a310_iocregs[offset&0x1f] = data & 0xff; |
| 460 | | a310_timercnt[2] = a310_iocregs[25]<<8 | a310_iocregs[24]; |
| 461 | 467 | break; |
| 462 | 468 | |
| 463 | 469 | case 28: |
| 464 | 470 | case 29: |
| 465 | 471 | a310_iocregs[offset&0x1f] = data & 0xff; |
| 466 | | a310_timercnt[3] = a310_iocregs[29]<<8 | a310_iocregs[28]; |
| 467 | 472 | break; |
| 468 | 473 | |
| 469 | 474 | case 19: // Timer 0 latch |
| 470 | | a310_timercnt[0] = a310_iocregs[17]<<8 | a310_iocregs[16]; |
| 475 | latch_timer_cnt(0); |
| 471 | 476 | break; |
| 472 | 477 | |
| 473 | 478 | case 23: // Timer 1 latch |
| 474 | | a310_timercnt[1] = a310_iocregs[21]<<8 | a310_iocregs[20]; |
| 479 | latch_timer_cnt(1); |
| 475 | 480 | break; |
| 476 | 481 | |
| 477 | 482 | case 27: // Timer 2 latch |
| 478 | | a310_timercnt[2] = a310_iocregs[25]<<8 | a310_iocregs[24]; |
| 483 | latch_timer_cnt(2); |
| 479 | 484 | break; |
| 480 | 485 | |
| 481 | 486 | case 31: // Timer 3 latch |
| 482 | | a310_timercnt[3] = a310_iocregs[29]<<8 | a310_iocregs[28]; |
| 487 | latch_timer_cnt(3); |
| 483 | 488 | break; |
| 484 | 489 | |
| 485 | 490 | case 18: // Timer 0 start |
| 491 | a310_timercnt[0] = a310_iocregs[17]<<8 | a310_iocregs[16]; |
| 486 | 492 | a310_set_timer(0); |
| 487 | 493 | break; |
| 488 | 494 | |
| 489 | 495 | case 22: // Timer 1 start |
| 496 | a310_timercnt[1] = a310_iocregs[21]<<8 | a310_iocregs[20]; |
| 490 | 497 | a310_set_timer(1); |
| 491 | 498 | break; |
| 492 | 499 | |
| 493 | 500 | case 26: // Timer 2 start |
| 501 | a310_timercnt[2] = a310_iocregs[25]<<8 | a310_iocregs[24]; |
| 494 | 502 | a310_set_timer(2); |
| 495 | 503 | break; |
| 496 | 504 | |
| 497 | 505 | case 30: // Timer 3 start |
| 506 | a310_timercnt[3] = a310_iocregs[29]<<8 | a310_iocregs[28]; |
| 498 | 507 | a310_set_timer(3); |
| 499 | 508 | break; |
| 500 | 509 | |
| r846 | r847 | |
| 891 | 900 | ROM_LOAD("ic25.rom", 0x080000, 0x80000, CRC(15d89664) SHA1(78f5d0e6f1e8ee603317807f53ff8fe65a3b3518)) |
| 892 | 901 | ROM_LOAD("ic26.rom", 0x100000, 0x80000, CRC(a81ceb7c) SHA1(46b870876bc1f68f242726415f0c49fef7be0c72)) |
| 893 | 902 | ROM_LOAD("ic27.rom", 0x180000, 0x80000, CRC(707b0c6c) SHA1(345199a33fed23996374b9db8170a52ab63f0380)) |
| 894 | | |
| 895 | 903 | ROM_REGION(0x00800, REGION_GFX1, 0) |
| 896 | 904 | ROM_END |
| 897 | 905 | |
| 898 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT CONFIG COMPANY FULLNAME */ |
| 899 | | COMP( 1988, a310, 0, 0, a310, a310, a310, NULL, "Acorn", "Archimedes 310", GAME_NOT_WORKING) |
| 906 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT CONFIG COMPANY FULLNAME */ |
| 907 | COMP( 1988, a310, 0, 0, a310, a310, a310, NULL, "Acorn", "Archimedes 310 (Risc OS 3.11)", GAME_NOT_WORKING) |
| 908 | |