src/mess/drivers/trs80m2.c
| r7334 | r7335 | |
| 1 | 1 | /*
|
| 2 |
|
| 3 | Tandy Radio Shack TRS-80 Model II/12/16/16B/6000
|
| 2 | 4 | |
| 5 | http://home.iae.nl/users/pb0aia/cm/modelii.html
|
| 6 | |
| 7 | */
|
| 8 | |
| 9 | /*
|
| 10 | |
| 3 | 11 | TODO:
|
| 4 | 12 | |
| 5 | 13 | - BOOT ERROR DM 23 (dma controller)
|
| 6 | | - 40/80 char
|
| 7 | | - KBIRQ -> CTC TRG3
|
| 8 | | - main RAM banking
|
| 9 | 14 | - Z80 daisy chain
|
| 10 | | - RTC
|
| 11 | | - floppy DRQ
|
| 12 | 15 | - keyboard CPU ROM
|
| 13 | 16 | - keyboard layout
|
| 17 | - main RAM banking
|
| 18 | - graphics board
|
| 14 | 19 | |
| 15 | 20 | */
|
| 16 | 21 | |
| r7334 | r7335 | |
| 36 | 41 | {
|
| 37 | 42 | switch (offset)
|
| 38 | 43 | {
|
| 39 | | case 0:
|
| 40 | | return z80sio_d_r(device, 0);
|
| 41 | | case 1:
|
| 42 | | return z80sio_c_r(device, 0);
|
| 43 | | case 2:
|
| 44 | | return z80sio_d_r(device, 1);
|
| 45 | | case 3:
|
| 46 | | return z80sio_c_r(device, 1);
|
| 44 | case 0: return z80sio_d_r(device, 1);
|
| 45 | case 1: return z80sio_d_r(device, 0);
|
| 46 | case 2: return z80sio_c_r(device, 1);
|
| 47 | case 3: return z80sio_c_r(device, 0);
|
| 47 | 48 | }
|
| 48 | 49 | |
| 49 | 50 | return 0;
|
| r7334 | r7335 | |
| 53 | 54 | {
|
| 54 | 55 | switch (offset)
|
| 55 | 56 | {
|
| 56 | | case 0:
|
| 57 | | z80sio_d_w(device, 0, data);
|
| 58 | | break;
|
| 59 | | case 1:
|
| 60 | | z80sio_c_w(device, 0, data);
|
| 61 | | break;
|
| 62 | | case 2:
|
| 63 | | z80sio_d_w(device, 1, data);
|
| 64 | | break;
|
| 65 | | case 3:
|
| 66 | | z80sio_c_w(device, 1, data);
|
| 67 | | break;
|
| 57 | case 0: z80sio_d_w(device, 1, data); break;
|
| 58 | case 1: z80sio_d_w(device, 0, data); break;
|
| 59 | case 2: z80sio_c_w(device, 1, data); break;
|
| 60 | case 3: z80sio_c_w(device, 0, data); break;
|
| 68 | 61 | }
|
| 69 | 62 | }
|
| 70 | 63 | |
| r7334 | r7335 | |
| 122 | 115 | if (BIT(data, 0))
|
| 123 | 116 | {
|
| 124 | 117 | /* enable BOOT ROM */
|
| 125 | | memory_install_rom(program, 0x0000, 0x07ff, 0, 0, rom);
|
| 118 | memory_install_rom(program, 0x0000, 0x07ff, 0, 0x800, rom);
|
| 126 | 119 | }
|
| 127 | 120 | else
|
| 128 | 121 | {
|
| 129 | 122 | /* enable RAM */
|
| 130 | | memory_install_ram(program, 0x0000, 0x07ff, 0, 0, ram);
|
| 123 | memory_install_ram(program, 0x0000, 0x0fff, 0, 0, ram);
|
| 131 | 124 | }
|
| 132 | 125 | }
|
| 133 | 126 | |
| r7334 | r7335 | |
| 136 | 129 | trs80m2_state *state = (trs80m2_state *)space->machine->driver_data;
|
| 137 | 130 | |
| 138 | 131 | /* clear keyboard interrupt */
|
| 139 | | state->kbirq = 0;
|
| 132 | state->kbirq = 1;
|
| 133 | z80ctc_trg3_w(state->z80ctc, state->kbirq);
|
| 140 | 134 | |
| 135 | state->key_bit = 0;
|
| 136 | |
| 141 | 137 | return state->key_data;
|
| 142 | 138 | }
|
| 143 | 139 | |
| 144 | 140 | static READ8_HANDLER( rtc_r )
|
| 145 | 141 | {
|
| 146 | 142 | /* clear RTC interrupt */
|
| 143 | cputag_set_input_line(space->machine, Z80_TAG, INPUT_LINE_NMI, CLEAR_LINE);
|
| 147 | 144 | |
| 148 | 145 | return 0;
|
| 149 | 146 | }
|
| r7334 | r7335 | |
| 216 | 213 | /* RTC interrupt enable */
|
| 217 | 214 | state->enable_rtc_int = BIT(data, 5);
|
| 218 | 215 | |
| 216 | if ((state->rtc_int == 2) && state->enable_rtc_int)
|
| 217 | {
|
| 218 | /* trigger RTC interrupt */
|
| 219 | cputag_set_input_line(space->machine, Z80_TAG, INPUT_LINE_NMI, ASSERT_LINE);
|
| 220 | }
|
| 221 | |
| 219 | 222 | /* video display enable */
|
| 220 | 223 | state->blnkvid = BIT(data, 6);
|
| 221 | 224 | |
| r7334 | r7335 | |
| 231 | 234 | }
|
| 232 | 235 | }
|
| 233 | 236 | |
| 237 | static READ8_HANDLER( keyboard_busy_r )
|
| 238 | {
|
| 239 | trs80m2_state *state = (trs80m2_state *)space->machine->driver_data;
|
| 240 | |
| 241 | return state->kbirq;
|
| 242 | }
|
| 243 | |
| 234 | 244 | static READ8_HANDLER( keyboard_data_r )
|
| 235 | 245 | {
|
| 236 | 246 | trs80m2_state *state = (trs80m2_state *)space->machine->driver_data;
|
| r7334 | r7335 | |
| 258 | 268 | */
|
| 259 | 269 | |
| 260 | 270 | trs80m2_state *state = (trs80m2_state *)space->machine->driver_data;
|
| 271 |
|
| 272 | int kbdata = BIT(data, 0);
|
| 273 | int kbclk = BIT(data, 1);
|
| 261 | 274 | |
| 262 | | if (BIT(data, 1))
|
| 275 | if (state->key_bit == 8)
|
| 263 | 276 | {
|
| 264 | | state->key_data <<= 1;
|
| 265 | | state->key_data |= BIT(data, 0);
|
| 277 | if (!state->kbdata && kbdata)
|
| 278 | {
|
| 279 | /* trigger keyboard interrupt */
|
| 280 | state->kbirq = 0;
|
| 281 | z80ctc_trg3_w(state->z80ctc, state->kbirq);
|
| 282 | }
|
| 266 | 283 | }
|
| 284 | else
|
| 285 | {
|
| 286 | if (!state->kbclk && kbclk)
|
| 287 | {
|
| 288 | /* shift in keyboard data bit */
|
| 289 | state->key_data <<= 1;
|
| 290 | state->key_data |= kbdata;
|
| 291 | state->key_bit++;
|
| 292 | }
|
| 293 | }
|
| 294 | |
| 295 | state->kbdata = kbdata;
|
| 296 | state->kbclk = kbclk;
|
| 267 | 297 | }
|
| 268 | 298 | |
| 269 | 299 | static WRITE8_HANDLER( keyboard_latch_w )
|
| r7334 | r7335 | |
| 291 | 321 | /* Memory Maps */
|
| 292 | 322 | |
| 293 | 323 | static ADDRESS_MAP_START( z80_mem, ADDRESS_SPACE_PROGRAM, 8 )
|
| 294 | | AM_RANGE(0x0000, 0x07ff) AM_ROM
|
| 295 | | AM_RANGE(0x0800, 0xf7ff) AM_RAM
|
| 324 | AM_RANGE(0x0000, 0xf7ff) AM_RAM
|
| 296 | 325 | AM_RANGE(0xf800, 0xffff) AM_RAM AM_BASE_MEMBER(trs80m2_state, video_ram)
|
| 297 | 326 | ADDRESS_MAP_END
|
| 298 | 327 | |
| r7334 | r7335 | |
| 312 | 341 | ADDRESS_MAP_END
|
| 313 | 342 | |
| 314 | 343 | static ADDRESS_MAP_START( trs80m2_keyboard_io, ADDRESS_SPACE_IO, 8 )
|
| 344 | AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(keyboard_busy_r)
|
| 315 | 345 | AM_RANGE(MCS48_PORT_P0, MCS48_PORT_P0) AM_READ(keyboard_data_r)
|
| 316 | 346 | AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(keyboard_ctrl_w)
|
| 317 | 347 | AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(keyboard_latch_w)
|
| r7334 | r7335 | |
| 482 | 512 | |
| 483 | 513 | static WRITE_LINE_DEVICE_HANDLER( vsync_w )
|
| 484 | 514 | {
|
| 515 | trs80m2_state *driver_state = (trs80m2_state *)device->machine->driver_data;
|
| 516 | |
| 517 | if (state) driver_state->rtc_int++;
|
| 518 | |
| 519 | if (driver_state->rtc_int == 2)
|
| 520 | {
|
| 521 | driver_state->rtc_int = 0;
|
| 522 | |
| 523 | if (driver_state->enable_rtc_int)
|
| 524 | {
|
| 525 | /* trigger RTC interrupt */
|
| 526 | cputag_set_input_line(device->machine, Z80_TAG, INPUT_LINE_NMI, ASSERT_LINE);
|
| 527 | }
|
| 528 | }
|
| 485 | 529 | }
|
| 486 | 530 | |
| 487 | 531 | static const mc6845_interface mc6845_intf = |
| r7334 | r7335 | |
| 564 | 608 | /* floppy interrupt */
|
| 565 | 609 | data |= state->fdc_intrq;
|
| 566 | 610 | |
| 611 | /* 2-sided diskette */
|
| 612 | data |= 0x02;
|
| 613 | |
| 567 | 614 | /* disk change */
|
| 568 | 615 | data |= floppy_dskchg_r(state->floppy) << 2;
|
| 569 | 616 | |
| r7334 | r7335 | |
| 681 | 728 | driver_state->fdc_intrq = state;
|
| 682 | 729 | }
|
| 683 | 730 | |
| 684 | | static WRITE_LINE_DEVICE_HANDLER( fdc_drq_w )
|
| 685 | | {
|
| 686 | | }
|
| 687 | | |
| 688 | 731 | static const wd17xx_interface fd1791_intf =
|
| 689 | 732 | {
|
| 690 | 733 | DEVCB_NULL,
|
| 691 | 734 | DEVCB_LINE(fdc_intrq_w),
|
| 692 | | DEVCB_LINE(fdc_drq_w),
|
| 735 | DEVCB_DEVICE_LINE(Z80DMA_TAG, z80dma_rdy_w),
|
| 693 | 736 | { FLOPPY_0, NULL, NULL, NULL }
|
| 694 | 737 | };
|
| 695 | 738 | |
| r7334 | r7335 | |
| 712 | 755 | state->mc6845 = devtag_get_device(machine, MC6845_TAG);
|
| 713 | 756 | state->centronics = devtag_get_device(machine, CENTRONICS_TAG);
|
| 714 | 757 | |
| 715 | | /* setup memory banking */
|
| 716 | | |
| 717 | 758 | /* register for state saving */
|
| 718 | 759 | state_save_register_global(machine, state->key_latch);
|
| 719 | 760 | state_save_register_global(machine, state->key_data);
|
| 720 | 761 | }
|
| 721 | 762 | |
| 763 | static MACHINE_RESET( trs80m2 )
|
| 764 | {
|
| 765 | const address_space *program = cputag_get_address_space(machine, Z80_TAG, ADDRESS_SPACE_PROGRAM);
|
| 766 | |
| 767 | /* enable boot ROM */
|
| 768 | rom_enable_w(program, 0, 1);
|
| 769 | }
|
| 770 | |
| 722 | 771 | /* Machine Driver */
|
| 723 | 772 | |
| 724 | 773 | static MACHINE_DRIVER_START( trs80m2 )
|
| r7334 | r7335 | |
| 733 | 782 | // MDRV_CPU_IO_MAP(trs80m2_keyboard_io)
|
| 734 | 783 | |
| 735 | 784 | MDRV_MACHINE_START(trs80m2)
|
| 785 | MDRV_MACHINE_RESET(trs80m2)
|
| 736 | 786 | |
| 737 | 787 | /* video hardware */
|
| 738 | 788 | MDRV_SCREEN_ADD(SCREEN_TAG, RASTER)
|
| r7334 | r7335 | |
| 768 | 818 | static MACHINE_DRIVER_START( trs80m16 )
|
| 769 | 819 | MDRV_IMPORT_FROM(trs80m2)
|
| 770 | 820 | |
| 821 | /* basic machine hardware */
|
| 771 | 822 | MDRV_CPU_ADD(M68000_TAG, M68000, 6000000)
|
| 772 | 823 | MDRV_CPU_PROGRAM_MAP(m68000_mem)
|
| 824 | |
| 825 | /* video hardware */
|
| 826 | MDRV_PALETTE_INIT(monochrome_green)
|
| 827 | |
| 828 | /* internal RAM */
|
| 829 | MDRV_RAM_MODIFY("messram")
|
| 830 | MDRV_RAM_DEFAULT_SIZE("256K")
|
| 831 | MDRV_RAM_EXTRA_OPTIONS("512K,768K,1M")
|
| 773 | 832 | MACHINE_DRIVER_END
|
| 774 | 833 | |
| 775 | 834 | /* ROMs */
|
| 776 | 835 | |
| 777 | | ROM_START(trs80m2)
|
| 836 | ROM_START( trs80m2 )
|
| 778 | 837 | ROM_REGION( 0x800, Z80_TAG, 0 )
|
| 779 | 838 | ROM_LOAD( "8043216.u11", 0x0000, 0x0800, CRC(7017a373) SHA1(1c7127fcc99fc351a40d3a3199ba478e783c452e) )
|
| 780 | 839 | |