Previous 15994 Revisions Next

r7335 Friday 12th February, 2010 at 13:52:15 UTC by Curt Coder
[TRS80M2] WIP
[src/mess/drivers]trs80m2.c
[src/mess/includes]trs80m2.h

src/mess/includes/trs80m2.h
r7334r7335
2525   /* keyboard state */
2626   UINT8 key_latch;
2727   UINT8 key_data;
28   int key_bit;
29   int kbclk;
30   int kbdata;
2831   int kbirq;
2932 
3033   /* video state */
src/mess/drivers/trs80m2.c
r7334r7335
11/*
2   
3   Tandy Radio Shack TRS-80 Model II/12/16/16B/6000
24 
5   http://home.iae.nl/users/pb0aia/cm/modelii.html
6 
7*/
8 
9/*
10 
311    TODO:
412 
513   - BOOT ERROR DM 23 (dma controller)
6   - 40/80 char
7   - KBIRQ -> CTC TRG3
8   - main RAM banking
914    - Z80 daisy chain
10   - RTC
11   - floppy DRQ
1215   - keyboard CPU ROM
1316   - keyboard layout
17   - main RAM banking
18   - graphics board
1419 
1520*/
1621 
r7334r7335
3641{
3742   switch (offset)
3843   {
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);
4748   }
4849 
4950   return 0;
r7334r7335
5354{
5455   switch (offset)
5556   {
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;
6861   }
6962}
7063 
r7334r7335
122115   if (BIT(data, 0))
123116   {
124117      /* enable BOOT ROM */
125      memory_install_rom(program, 0x0000, 0x07ff, 0, 0, rom);
118      memory_install_rom(program, 0x0000, 0x07ff, 0, 0x800, rom);
126119   }
127120   else
128121   {
129122      /* enable RAM */
130      memory_install_ram(program, 0x0000, 0x07ff, 0, 0, ram);
123      memory_install_ram(program, 0x0000, 0x0fff, 0, 0, ram);
131124   }
132125}
133126 
r7334r7335
136129   trs80m2_state *state = (trs80m2_state *)space->machine->driver_data;
137130 
138131   /* clear keyboard interrupt */
139   state->kbirq = 0;
132   state->kbirq = 1;
133   z80ctc_trg3_w(state->z80ctc, state->kbirq);
140134 
135   state->key_bit = 0;
136 
141137   return state->key_data;
142138}
143139 
144140static READ8_HANDLER( rtc_r )
145141{
146142   /* clear RTC interrupt */
143   cputag_set_input_line(space->machine, Z80_TAG, INPUT_LINE_NMI, CLEAR_LINE);
147144 
148145   return 0;
149146}
r7334r7335
216213   /* RTC interrupt enable */
217214   state->enable_rtc_int = BIT(data, 5);
218215 
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 
219222   /* video display enable */
220223   state->blnkvid = BIT(data, 6);
221224 
r7334r7335
231234   }
232235}
233236 
237static READ8_HANDLER( keyboard_busy_r )
238{
239   trs80m2_state *state = (trs80m2_state *)space->machine->driver_data;
240 
241   return state->kbirq;
242}
243 
234244static READ8_HANDLER( keyboard_data_r )
235245{
236246   trs80m2_state *state = (trs80m2_state *)space->machine->driver_data;
r7334r7335
258268    */
259269 
260270   trs80m2_state *state = (trs80m2_state *)space->machine->driver_data;
271   
272   int kbdata = BIT(data, 0);
273   int kbclk = BIT(data, 1);
261274 
262   if (BIT(data, 1))
275   if (state->key_bit == 8)
263276   {
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      }
266283   }
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;
267297}
268298 
269299static WRITE8_HANDLER( keyboard_latch_w )
r7334r7335
291321/* Memory Maps */
292322 
293323static 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
296325   AM_RANGE(0xf800, 0xffff) AM_RAM AM_BASE_MEMBER(trs80m2_state, video_ram)
297326ADDRESS_MAP_END
298327 
r7334r7335
312341ADDRESS_MAP_END
313342 
314343static ADDRESS_MAP_START( trs80m2_keyboard_io, ADDRESS_SPACE_IO, 8 )
344   AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ(keyboard_busy_r)
315345   AM_RANGE(MCS48_PORT_P0, MCS48_PORT_P0) AM_READ(keyboard_data_r)
316346   AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_WRITE(keyboard_ctrl_w)
317347   AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_WRITE(keyboard_latch_w)
r7334r7335
482512 
483513static WRITE_LINE_DEVICE_HANDLER( vsync_w )
484514{
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   }
485529}
486530 
487531static const mc6845_interface mc6845_intf = 
r7334r7335
564608   /* floppy interrupt */
565609   data |= state->fdc_intrq;
566610 
611   /* 2-sided diskette */
612   data |= 0x02;
613 
567614   /* disk change */
568615   data |= floppy_dskchg_r(state->floppy) << 2;
569616 
r7334r7335
681728   driver_state->fdc_intrq = state;
682729}
683730 
684static WRITE_LINE_DEVICE_HANDLER( fdc_drq_w )
685{
686}
687 
688731static const wd17xx_interface fd1791_intf =
689732{
690733   DEVCB_NULL,
691734   DEVCB_LINE(fdc_intrq_w),
692   DEVCB_LINE(fdc_drq_w),
735   DEVCB_DEVICE_LINE(Z80DMA_TAG, z80dma_rdy_w),
693736   { FLOPPY_0, NULL, NULL, NULL }
694737};
695738 
r7334r7335
712755   state->mc6845 = devtag_get_device(machine, MC6845_TAG);
713756   state->centronics = devtag_get_device(machine, CENTRONICS_TAG);
714757 
715   /* setup memory banking */
716 
717758   /* register for state saving */
718759   state_save_register_global(machine, state->key_latch);
719760   state_save_register_global(machine, state->key_data);
720761}
721762 
763static 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 
722771/* Machine Driver */
723772 
724773static MACHINE_DRIVER_START( trs80m2 )
r7334r7335
733782//   MDRV_CPU_IO_MAP(trs80m2_keyboard_io)
734783 
735784    MDRV_MACHINE_START(trs80m2)
785    MDRV_MACHINE_RESET(trs80m2)
736786 
737787   /* video hardware */
738788   MDRV_SCREEN_ADD(SCREEN_TAG, RASTER)
r7334r7335
768818static MACHINE_DRIVER_START( trs80m16 )
769819   MDRV_IMPORT_FROM(trs80m2)
770820 
821   /* basic machine hardware */
771822   MDRV_CPU_ADD(M68000_TAG, M68000, 6000000)
772823   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")
773832MACHINE_DRIVER_END
774833 
775834/* ROMs */
776835 
777ROM_START(trs80m2)
836ROM_START( trs80m2 )
778837   ROM_REGION( 0x800, Z80_TAG, 0 )
779838   ROM_LOAD( "8043216.u11", 0x0000, 0x0800, CRC(7017a373) SHA1(1c7127fcc99fc351a40d3a3199ba478e783c452e) )
780839 

Previous 15994 Revisions Next


© 1998-2018 The MESS Team