src/mess/drivers/ql.c
| r3230 | r3231 | |
| 10 | 10 | |
| 11 | 11 | TODO: |
| 12 | 12 | |
| 13 | - several disk interfaces (720K/1.44MB/3.2MB) |
| 14 | - Trump Card missing extra 256K RAM |
| 15 | - Gold Card (68000 @ 16MHz, 2MB RAM) |
| 16 | - Super Gold Card (68020 @ 24MHz, 4MB RAM) |
| 17 | - QLToolkit II ROM |
| 18 | - GST 68kOS ROM |
| 13 | 19 | - natural keyboard SHIFT does not work, it causes characters to be skipped altogether |
| 14 | 20 | - get modified Danish version to boot (e.g. MD_DESEL was patched to jump to 0x1cd5e) |
| 21 | - ICL One Per Desk / British Telecom Merlin Tonto / Telecom Australia Computerphone / Mega OPD (US) |
| 22 | - Sandy Q-XT 640 (original motherboard, Super QBoard 512KB, Centronics, Super Toolkit II, FDC, 1 or 2 3.5" 1MB drives, 3 expansion slots) |
| 23 | - CST Thor PC 1F (720K 3.5") |
| 24 | - CST Thor PC 2F (2x 720k 3.5") |
| 25 | - CST Thor PC 2FW (20MB Winchester + 720K 3.5") |
| 26 | - CST Thor 20 (68020) |
| 27 | - CST Thor 21 (68020+68881) |
| 28 | - CST Thor XVI CF (Workstation, 68000 @ 8 MHz, M6802, 68682 DUART) |
| 29 | - CST Thor XVI IF (Single Floppy) |
| 30 | - CST Thor XVI FF (Dual Floppy) |
| 31 | - CST Thor XVI W20F (20MB Winchester, 1 Floppy) |
| 32 | - CST Thor XVI W20FF (20MB Winchester, 2 Floppies) |
| 33 | - CST Thor XVI W40F (40MB Winchester, 1 Floppy) |
| 34 | - CST Thor XVI W40FF (40MB Winchester, 2 Floppies) |
| 15 | 35 | |
| 16 | 36 | */ |
| 17 | 37 | |
| 18 | 38 | #include "driver.h" |
| 19 | 39 | #include "cpu/mcs48/mcs48.h" |
| 20 | 40 | #include "cpu/m68000/m68000.h" |
| 41 | #include "devices/basicdsk.h" |
| 21 | 42 | #include "devices/cartslot.h" |
| 22 | 43 | #include "devices/microdrv.h" |
| 44 | #include "devices/snapquik.h" |
| 23 | 45 | #include "includes/serial.h" |
| 24 | 46 | #include "sound/speaker.h" |
| 25 | 47 | #include "video/zx8301.h" |
| r3230 | r3231 | |
| 36 | 58 | #define X3 XTAL_4_436MHz |
| 37 | 59 | #define X4 XTAL_11MHz |
| 38 | 60 | |
| 61 | static QUICKLOAD_LOAD( ql ); |
| 62 | |
| 39 | 63 | /* Intelligent Peripheral Controller (IPC) */ |
| 40 | 64 | |
| 41 | 65 | static struct IPC |
| r3230 | r3231 | |
| 205 | 229 | /* Memory Maps */ |
| 206 | 230 | |
| 207 | 231 | static ADDRESS_MAP_START( ql_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| 208 | | AM_RANGE(0x000000, 0x00bfff) AM_ROM // System ROM |
| 209 | | AM_RANGE(0x00c000, 0x00ffff) AM_ROM // Cartridge ROM |
| 210 | | AM_RANGE(0x010000, 0x017fff) AM_NOP // expansion I/O |
| 232 | AM_RANGE(0x000000, 0x00bfff) AM_ROM // 48K System ROM |
| 233 | AM_RANGE(0x00c000, 0x00ffff) AM_ROM // 16K Cartridge ROM |
| 234 | AM_RANGE(0x010000, 0x017fff) AM_NOP // 32K Expansion I/O |
| 211 | 235 | AM_RANGE(0x018000, 0x018003) AM_DEVREAD(ZX8302, ZX8302_TAG, zx8302_rtc_r) |
| 212 | 236 | AM_RANGE(0x018000, 0x018001) AM_DEVWRITE(ZX8302, ZX8302_TAG, zx8302_rtc_w) |
| 213 | 237 | AM_RANGE(0x018002, 0x018002) AM_DEVWRITE(ZX8302, ZX8302_TAG, zx8302_control_w) |
| r3230 | r3231 | |
| 217 | 241 | AM_RANGE(0x018022, 0x018022) AM_DEVREADWRITE(ZX8302, ZX8302_TAG, zx8302_mdv_track_r, zx8302_data_w) |
| 218 | 242 | AM_RANGE(0x018023, 0x018023) AM_DEVREAD(ZX8302, ZX8302_TAG, zx8302_mdv_track_r) AM_WRITENOP |
| 219 | 243 | AM_RANGE(0x018063, 0x018063) AM_DEVWRITE(ZX8301, ZX8301_TAG, zx8301_control_w) |
| 220 | | AM_RANGE(0x01c000, 0x01ffff) AM_ROM // expansion I/O |
| 244 | AM_RANGE(0x01c000, 0x01ffff) AM_ROM // 16K Expansion I/O |
| 221 | 245 | AM_RANGE(0x020000, 0x03ffff) AM_DEVREADWRITE(ZX8301, ZX8301_TAG, zx8301_ram_r, zx8301_ram_w) |
| 222 | | AM_RANGE(0x040000, 0x0bffff) AM_RAMBANK(1) // 512KB expansion RAM |
| 246 | AM_RANGE(0x040000, 0x0bffff) AM_RAMBANK(1) // 512KB Expansion RAM |
| 223 | 247 | AM_RANGE(0x0c0000, 0x0dffff) AM_NOP // 8x16KB device slots |
| 224 | | AM_RANGE(0x0e0000, 0x0fffff) AM_NOP // expansion I/O |
| 248 | AM_RANGE(0x0e0000, 0x0fffff) AM_NOP // 128K Expansion I/O |
| 225 | 249 | ADDRESS_MAP_END |
| 226 | 250 | |
| 227 | 251 | static ADDRESS_MAP_START( ipc_map, ADDRESS_SPACE_PROGRAM, 8 ) |
| r3230 | r3231 | |
| 540 | 564 | memory_install_readwrite8_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x040000, 0x0bffff, 0, 0, SMH_UNMAP, SMH_UNMAP); |
| 541 | 565 | break; |
| 542 | 566 | |
| 567 | case 192*1024: |
| 568 | memory_install_readwrite8_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x040000, 0x04ffff, 0, 0, SMH_BANK1, SMH_BANK1); |
| 569 | memory_install_readwrite8_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x050000, 0x0bffff, 0, 0, SMH_UNMAP, SMH_UNMAP); |
| 570 | memory_configure_bank(1, 0, 1, mess_ram + (128 * 1024), 0); |
| 571 | memory_set_bank(1, 0); |
| 572 | break; |
| 573 | |
| 574 | case 256*1024: |
| 575 | memory_install_readwrite8_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x040000, 0x05ffff, 0, 0, SMH_BANK1, SMH_BANK1); |
| 576 | memory_install_readwrite8_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x060000, 0x0bffff, 0, 0, SMH_UNMAP, SMH_UNMAP); |
| 577 | memory_configure_bank(1, 0, 1, mess_ram + (128 * 1024), 0); |
| 578 | memory_set_bank(1, 0); |
| 579 | break; |
| 580 | |
| 581 | case 384*1024: |
| 582 | memory_install_readwrite8_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x040000, 0x07ffff, 0, 0, SMH_BANK1, SMH_BANK1); |
| 583 | memory_install_readwrite8_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x080000, 0x0bffff, 0, 0, SMH_UNMAP, SMH_UNMAP); |
| 584 | memory_configure_bank(1, 0, 1, mess_ram + (128 * 1024), 0); |
| 585 | memory_set_bank(1, 0); |
| 586 | break; |
| 587 | |
| 543 | 588 | case 640*1024: |
| 544 | 589 | memory_install_readwrite8_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x040000, 0x0bffff, 0, 0, SMH_BANK1, SMH_BANK1); |
| 545 | 590 | memory_configure_bank(1, 0, 1, mess_ram + (128 * 1024), 0); |
| 546 | 591 | memory_set_bank(1, 0); |
| 547 | 592 | break; |
| 593 | |
| 594 | case 896*1024: |
| 595 | memory_install_readwrite8_handler(machine, 0, ADDRESS_SPACE_PROGRAM, 0x040000, 0x0bffff, 0, 0, SMH_BANK1, SMH_BANK1); |
| 596 | memory_configure_bank(1, 0, 1, mess_ram + (128 * 1024), 0); |
| 597 | memory_set_bank(1, 0); |
| 598 | break; |
| 548 | 599 | } |
| 549 | 600 | |
| 550 | 601 | // IPC |
| r3230 | r3231 | |
| 599 | 650 | MDRV_SPEAKER_STANDARD_MONO("mono") |
| 600 | 651 | MDRV_SOUND_ADD("speaker", SPEAKER, 0) |
| 601 | 652 | MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 653 | |
| 654 | /* quickload */ |
| 655 | MDRV_QUICKLOAD_ADD(ql, "bas", 0) |
| 602 | 656 | MACHINE_DRIVER_END |
| 603 | 657 | |
| 604 | 658 | static MACHINE_DRIVER_START( ql_ntsc ) |
| r3230 | r3231 | |
| 639 | 693 | ROMX_LOAD( "fb.ic34", 0x008000, 0x004000, NO_DUMP, ROM_BIOS(6) ) |
| 640 | 694 | |
| 641 | 695 | ROM_SYSTEM_BIOS( 6, "tyche", "v2.05 (Tyche)" ) |
| 642 | | ROMX_LOAD( "tyche.rom", 0x000000, 0x010000, BAD_DUMP CRC(8724b495) SHA1(5f33a1bc3f23fd09c31844b65bc3aca7616f180a), ROM_BIOS(7) ) |
| 696 | ROMX_LOAD( "tyche.rom", 0x000000, 0x010000, CRC(8724b495) SHA1(5f33a1bc3f23fd09c31844b65bc3aca7616f180a), ROM_BIOS(7) ) |
| 643 | 697 | |
| 644 | 698 | ROM_SYSTEM_BIOS( 7, "min189", "Minerva v1.89" ) |
| 645 | | ROMX_LOAD( "minerva.rom", 0x000000, 0x00c000, CRC(930befe3) SHA1(84a99c4df13b97f90baf1ec8cb6c2e52e3e1bb4d), ROM_BIOS(8) ) |
| 699 | ROMX_LOAD( "minerva.rom", 0x000000, 0x00c000, BAD_DUMP CRC(930befe3) SHA1(84a99c4df13b97f90baf1ec8cb6c2e52e3e1bb4d), ROM_BIOS(8) ) |
| 646 | 700 | |
| 647 | 701 | ROM_REGION( 0x800, "ipc", 0 ) |
| 648 | 702 | ROM_LOAD( "ipc8049.ic24", 0x0000, 0x0800, CRC(6a0d1f20) SHA1(fcb1c97ee7c66e5b6d8fbb57c06fd2f6509f2e1b) ) |
| r3230 | r3231 | |
| 735 | 789 | |
| 736 | 790 | /* System Configuration */ |
| 737 | 791 | |
| 792 | static QUICKLOAD_LOAD( ql ) |
| 793 | { |
| 794 | image_fread(image, mess_ram, 128*1024); |
| 795 | |
| 796 | return INIT_PASS; |
| 797 | } |
| 798 | |
| 738 | 799 | static DEVICE_IMAGE_LOAD( ql_serial ) |
| 739 | 800 | { |
| 740 | 801 | /* filename specified */ |
| r3230 | r3231 | |
| 808 | 869 | } |
| 809 | 870 | } |
| 810 | 871 | |
| 872 | static DEVICE_IMAGE_LOAD( ql_floppy ) |
| 873 | { |
| 874 | if (image_has_been_created(image)) |
| 875 | return INIT_FAIL; |
| 876 | |
| 877 | switch (image_length(image)) |
| 878 | { |
| 879 | case 40*1*9*512: // 184320 (SSSD) |
| 880 | basicdsk_set_geometry(image, 40, 1, 9, 512, 1, 0, FALSE); |
| 881 | return INIT_PASS; |
| 882 | |
| 883 | case 40*2*9*512: // 368640 (DSSD) |
| 884 | basicdsk_set_geometry(image, 40, 2, 9, 512, 1, 0, FALSE); |
| 885 | return INIT_PASS; |
| 886 | |
| 887 | case 80*2*9*512: // 737280 (DSDD) |
| 888 | basicdsk_set_geometry(image, 80, 2, 9, 512, 1, 0, FALSE); |
| 889 | return INIT_PASS; |
| 890 | |
| 891 | case 80*2*18*512: // 1474560 (HD) |
| 892 | basicdsk_set_geometry(image, 80, 2, 18, 512, 1, 0, FALSE); |
| 893 | return INIT_PASS; |
| 894 | |
| 895 | case 80*2*40*512: // 3276800 (ED) |
| 896 | basicdsk_set_geometry(image, 80, 2, 40, 512, 1, 0, FALSE); |
| 897 | return INIT_PASS; |
| 898 | } |
| 899 | |
| 900 | return INIT_FAIL; |
| 901 | } |
| 902 | |
| 903 | static void ql_floppy_getinfo(const mess_device_class *devclass, UINT32 state, union devinfo *info) |
| 904 | { |
| 905 | /* floppy */ |
| 906 | switch(state) |
| 907 | { |
| 908 | /* --- the following bits of info are returned as 64-bit signed integers --- */ |
| 909 | case MESS_DEVINFO_INT_COUNT: info->i = 2; break; |
| 910 | |
| 911 | /* --- the following bits of info are returned as pointers to data or functions --- */ |
| 912 | case MESS_DEVINFO_PTR_LOAD: info->load = DEVICE_IMAGE_LOAD_NAME(ql_floppy); break; |
| 913 | |
| 914 | /* --- the following bits of info are returned as NULL-terminated strings --- */ |
| 915 | case MESS_DEVINFO_STR_FILE_EXTENSIONS: strcpy(info->s = device_temp_str(), "dsk"); break; |
| 916 | |
| 917 | default: legacybasicdsk_device_getinfo(devclass, state, info); break; |
| 918 | } |
| 919 | } |
| 920 | |
| 811 | 921 | static SYSTEM_CONFIG_START( ql ) |
| 812 | 922 | CONFIG_RAM_DEFAULT (128 * 1024) |
| 813 | | CONFIG_RAM (640 * 1024) |
| 923 | CONFIG_RAM (192 * 1024) // 64K expansion |
| 924 | CONFIG_RAM (256 * 1024) // 128K expansion |
| 925 | CONFIG_RAM (384 * 1024) // 256K expansion |
| 926 | CONFIG_RAM (640 * 1024) // 512K expansion |
| 927 | CONFIG_RAM (896 * 1024) // Trump Card |
| 814 | 928 | CONFIG_DEVICE(ql_serial_getinfo) |
| 815 | 929 | CONFIG_DEVICE(ql_cartslot_getinfo) |
| 930 | CONFIG_DEVICE(ql_floppy_getinfo) |
| 816 | 931 | SYSTEM_CONFIG_END |
| 817 | 932 | |
| 818 | 933 | /* Computer Drivers */ |