Previous 15994 Revisions Next

r10992 Wednesday 30th March, 2011 at 20:16:03 UTC by Curt Coder
[PC8500] Modernized driver.
[src/mess/drivers]pc8401a.c
[src/mess/includes]pc8401a.h
[src/mess/video]pc8401a.c

src/mess/video/pc8401a.c
r10991r10992
99   palette_set_color(machine, 1, MAKE_RGB(16, 37, 84));
1010}
1111
12static VIDEO_START( pc8401a )
12void pc8401a_state::video_start()
1313{
14   pc8401a_state *state = machine.driver_data<pc8401a_state>();
15
1614   /* allocate video memory */
17   state->video_ram = auto_alloc_array(machine, UINT8, PC8401A_LCD_VIDEORAM_SIZE);
15   m_video_ram = auto_alloc_array(m_machine, UINT8, PC8401A_LCD_VIDEORAM_SIZE);
1816
1917   /* register for state saving */
20   state->save_pointer(NAME(state->video_ram), PC8401A_LCD_VIDEORAM_SIZE);
18   save_pointer(NAME(m_video_ram), PC8401A_LCD_VIDEORAM_SIZE);
2119}
2220
23static SCREEN_UPDATE( pc8401a )
21bool pc8401a_state::screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect)
2422{
2523   return 0;
2624}
2725
2826/* PC-8500 */
2927
30static VIDEO_START( pc8500 )
28void pc8500_state::video_start()
3129{
32   pc8401a_state *state = machine.driver_data<pc8401a_state>();
33
3430   /* allocate video memory */
35   state->video_ram = auto_alloc_array(machine, UINT8, PC8500_LCD_VIDEORAM_SIZE);
31   m_video_ram = auto_alloc_array(m_machine, UINT8, PC8500_LCD_VIDEORAM_SIZE);
3632
3733   /* register for state saving */
38   state->save_pointer(NAME(state->video_ram), PC8500_LCD_VIDEORAM_SIZE);
34   save_pointer(NAME(m_video_ram), PC8500_LCD_VIDEORAM_SIZE);
3935}
4036
41static SCREEN_UPDATE( pc8500 )
37bool pc8500_state::screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect)
4238{
43   pc8401a_state *state = screen->machine().driver_data<pc8401a_state>();
39   sed1330_update(m_lcdc, &bitmap, &cliprect);
4440
45   if (screen == state->m_screen_lcd)
41   /*
42   if (strcmp(screen.tag(), SCREEN_TAG) == 0)
4643   {
47      sed1330_update(state->m_lcdc, bitmap, cliprect);
44      sed1330_update(m_lcdc, &bitmap, &cliprect);
4845   }
4946   else
5047   {
51      mc6845_update(state->m_crtc, bitmap, cliprect);
48      mc6845_update(m_crtc, &bitmap, &cliprect);
5249   }
50   */
5351
5452   return 0;
5553}
5654
5755/* SED1330 Interface */
5856
59static READ8_HANDLER( pc8500_sed1330_vd_r )
57READ8_MEMBER( pc8500_state::vd_r )
6058{
61   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
62
63   return state->video_ram[offset & PC8500_LCD_VIDEORAM_MASK];
59   return m_video_ram[offset & PC8500_LCD_VIDEORAM_MASK];
6460}
6561
66static WRITE8_HANDLER( pc8500_sed1330_vd_w )
62WRITE8_MEMBER( pc8500_state::vd_w )
6763{
68   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
69
70   state->video_ram[offset & PC8500_LCD_VIDEORAM_MASK] = data;
64   m_video_ram[offset & PC8500_LCD_VIDEORAM_MASK] = data;
7165}
7266
7367static SED1330_INTERFACE( pc8500_sed1330_config )
7468{
7569   SCREEN_TAG,
76   DEVCB_MEMORY_HANDLER(Z80_TAG, PROGRAM, pc8500_sed1330_vd_r),
77   DEVCB_MEMORY_HANDLER(Z80_TAG, PROGRAM, pc8500_sed1330_vd_w)
70   DEVCB_DRIVER_MEMBER(pc8500_state, vd_r),
71   DEVCB_DRIVER_MEMBER(pc8500_state, vd_w)
7872};
7973
8074/* MC6845 Interface */
r10991r10992
8377{
8478}
8579
86static const mc6845_interface pc8441a_mc6845_interface = {
80static const mc6845_interface pc8441a_mc6845_interface =
81{
8782   CRT_SCREEN_TAG,
8883   6,
8984   NULL,
r10991r10992
10499   MCFG_PALETTE_LENGTH(2)
105100   MCFG_PALETTE_INIT(pc8401a)
106101
107   MCFG_VIDEO_START(pc8401a)
108
109102   /* LCD */
110103   MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
111104   MCFG_SCREEN_REFRESH_RATE(44)
112105   MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
113106   MCFG_SCREEN_SIZE(480, 128)
114107   MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 128-1)
115   MCFG_SCREEN_UPDATE(pc8401a)
116108MACHINE_CONFIG_END
117109
118110MACHINE_CONFIG_FRAGMENT( pc8500_video )
r10991r10992
121113   MCFG_PALETTE_LENGTH(2+8)
122114   MCFG_PALETTE_INIT(pc8401a)
123115
124   MCFG_VIDEO_START(pc8500)
125
126116   /* LCD */
127117   MCFG_SCREEN_ADD(SCREEN_TAG, LCD)
128118   MCFG_SCREEN_REFRESH_RATE(44)
129119   MCFG_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
130120   MCFG_SCREEN_SIZE(480, 208)
131121   MCFG_SCREEN_VISIBLE_AREA(0, 480-1, 0, 200-1)
132   MCFG_SCREEN_UPDATE(pc8500)
133122   
134123   MCFG_SED1330_ADD(SED1330_TAG, 0, pc8500_sed1330_config)
135124
r10991r10992
140129   MCFG_SCREEN_VISIBLE_AREA(0, 80*8-1, 0, 24*8-1)
141130   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500))
142131   MCFG_SCREEN_REFRESH_RATE(50)
143   MCFG_SCREEN_UPDATE(pc8500)
144132   
145133   MCFG_MC6845_ADD(MC6845_TAG, MC6845, 400000, pc8441a_mc6845_interface)
146134MACHINE_CONFIG_END
src/mess/includes/pc8401a.h
r10991r10992
33#ifndef __PC8401A__
44#define __PC8401A__
55
6#define ADDRESS_MAP_MODERN
7
68#include "emu.h"
79#include "cpu/z80/z80.h"
810#include "imagedev/cartslot.h"
r10991r10992
1012#include "machine/msm8251.h"
1113#include "machine/ram.h"
1214#include "machine/upd1990a.h"
15#include "video/mc6845.h"
1316#include "video/sed1330.h"
14#include "video/mc6845.h"
1517
1618#define SCREEN_TAG      "screen"
1719#define CRT_SCREEN_TAG   "screen2"
r10991r10992
3941        m_rtc(*this, UPD1990A_TAG),
4042        m_lcdc(*this, SED1330_TAG),
4143        m_crtc(*this, MC6845_TAG),
42        m_screen_lcd(*this, SCREEN_TAG)
44        m_screen_lcd(*this, SCREEN_TAG),
45        m_ram(*this, RAM_TAG)
4346   { }
4447
4548   required_device<cpu_device> m_maincpu;
r10991r10992
4750   required_device<device_t> m_lcdc;
4851   required_device<device_t> m_crtc;
4952   required_device<device_t> m_screen_lcd;
53   required_device<device_t> m_ram;
5054
51   /* keyboard state */
52   int key_strobe;         /* key pressed */
55   virtual void machine_start();
5356
54   /* clock state */
55   int rtc_data;         /* RTC data output */
56   int rtc_tp;            /* RTC timing pulse output */
57   virtual void video_start();
58   virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect);
5759
58   /* memory state */
59   UINT8 mmr;            /* memory mapping register */
60   UINT32 io_addr;         /* I/O ROM address counter */
60   DECLARE_WRITE8_MEMBER( mmr_w );
61   DECLARE_READ8_MEMBER( mmr_r );
62   DECLARE_READ8_MEMBER( rtc_r );
63   DECLARE_WRITE8_MEMBER( rtc_cmd_w );
64   DECLARE_WRITE8_MEMBER( rtc_ctrl_w );
65   DECLARE_READ8_MEMBER( io_rom_data_r );
66   DECLARE_WRITE8_MEMBER( io_rom_addr_w );
67   DECLARE_READ8_MEMBER( port70_r );
68   DECLARE_READ8_MEMBER( port71_r );
69   DECLARE_WRITE8_MEMBER( port70_w );
70   DECLARE_WRITE8_MEMBER( port71_w );
71   DECLARE_READ8_MEMBER( ppi_pc_r );
72   DECLARE_WRITE8_MEMBER( ppi_pc_w );
73   
74   void bankswitch(UINT8 data);
6175
62   /* video state */
63   UINT8 *video_ram;      /* LCD video RAM */
64   UINT8 *crt_ram;         /* CRT video RAM */
76   // keyboard state
77   int m_key_strobe;         // key pressed
6578
66   UINT8 key_latch;
79   // memory state
80   UINT8 m_mmr;            // memory mapping register
81   UINT32 m_io_addr;         // I/O ROM address counter
82
83   // video state
84   UINT8 *m_video_ram;         // LCD video RAM
85   UINT8 *m_crt_ram;         // CRT video RAM
86
87   UINT8 m_key_latch;
6788};
6889
69/* ---------- defined in video/pc8401a.c ---------- */
90class pc8500_state : public pc8401a_state
91{
92public:
93   pc8500_state(running_machine &machine, const driver_device_config_base &config)
94      : pc8401a_state(machine, config)
95   { }
7096
97   virtual void video_start();
98   virtual bool screen_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect);
99
100   DECLARE_READ8_MEMBER( vd_r );
101   DECLARE_WRITE8_MEMBER( vd_w );
102};
103
104// ---------- defined in video/pc8401a.c ----------
105
71106MACHINE_CONFIG_EXTERN( pc8401a_video );
72107MACHINE_CONFIG_EXTERN( pc8500_video );
73108
src/mess/drivers/pc8401a.c
r10991r10992
1818    - 8255 ports
1919    - MC6845 palette
2020    - MC6845 chargen ROM
21   - MC6845 screen update
2122
2223    - peripherals
2324        * PC-8431A Dual Floppy Drive
r10991r10992
3233
3334/* Fake Keyboard */
3435
35
3636static void pc8401a_keyboard_scan(running_machine &machine)
3737{
3838   pc8401a_state *state = machine.driver_data<pc8401a_state>();
r10991r10992
4848      if (data != 0xff)
4949      {
5050         strobe = 1;
51         state->key_latch = data;
51         state->m_key_latch = data;
5252      }
5353   }
5454
55   if (!state->key_strobe && strobe)
55   if (!state->m_key_strobe && strobe)
5656   {
5757      /* trigger interrupt */
58      cputag_set_input_line_and_vector(machine, Z80_TAG, INPUT_LINE_IRQ0, ASSERT_LINE, 0x28);
58      state->m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, 0x28);
5959      logerror("INTERRUPT\n");
6060   }
6161
62   if (strobe)   state->key_strobe = strobe;
62   if (strobe)   state->m_key_strobe = strobe;
6363}
6464
6565static TIMER_DEVICE_CALLBACK( pc8401a_keyboard_tick )
r10991r10992
6969
7070/* Read/Write Handlers */
7171
72static void pc8401a_bankswitch(running_machine &machine, UINT8 data)
72void pc8401a_state::bankswitch(UINT8 data)
7373{
74   address_space *program = machine.device(Z80_TAG)->memory().space(AS_PROGRAM);
74   address_space *program = m_maincpu->memory().space(AS_PROGRAM);
7575
7676   int rombank = data & 0x03;
7777   int ram0000 = (data >> 2) & 0x03;
r10991r10992
8585         /* internal ROM */
8686         program->install_read_bank(0x0000, 0x7fff, "bank1");
8787         program->unmap_write(0x0000, 0x7fff);
88         memory_set_bank(machine, "bank1", rombank);
88         memory_set_bank(m_machine, "bank1", rombank);
8989      }
9090      else
9191      {
r10991r10992
9797
9898   case 1: /* RAM 0000H to 7FFFH */
9999      program->install_readwrite_bank(0x0000, 0x7fff, "bank1");
100      memory_set_bank(machine, "bank1", 4);
100      memory_set_bank(m_machine, "bank1", 4);
101101      //logerror("0x0000-0x7fff = RAM 0-7fff\n");
102102      break;
103103
104104   case 2:   /* RAM 8000H to FFFFH */
105105      program->install_readwrite_bank(0x0000, 0x7fff, "bank1");
106      memory_set_bank(machine, "bank1", 5);
106      memory_set_bank(m_machine, "bank1", 5);
107107      //logerror("0x0000-0x7fff = RAM 8000-ffff\n");
108108      break;
109109
r10991r10992
116116   {
117117   case 0: /* cell addresses 0000H to 3FFFH */
118118      program->install_readwrite_bank(0x8000, 0xbfff, "bank3");
119      memory_set_bank(machine, "bank3", 0);
119      memory_set_bank(m_machine, "bank3", 0);
120120      //logerror("0x8000-0xbfff = RAM 0-3fff\n");
121121      break;
122122
123123   case 1: /* cell addresses 4000H to 7FFFH */
124124      program->install_readwrite_bank(0x8000, 0xbfff, "bank3");
125      memory_set_bank(machine, "bank3", 1);
125      memory_set_bank(m_machine, "bank3", 1);
126126      //logerror("0x8000-0xbfff = RAM 4000-7fff\n");
127127      break;
128128
129129   case 2: /* cell addresses 8000H to BFFFH */
130130      program->install_readwrite_bank(0x8000, 0xbfff, "bank3");
131      memory_set_bank(machine, "bank3", 2);
131      memory_set_bank(m_machine, "bank3", 2);
132132      //logerror("0x8000-0xbfff = RAM 8000-bfff\n");
133133      break;
134134
135135   case 3: /* RAM cartridge */
136      if (ram_get_size(machine.device(RAM_TAG)) > 64)
136      if (ram_get_size(m_ram) > 64)
137137      {
138138         program->install_readwrite_bank(0x8000, 0xbfff, "bank3");
139         memory_set_bank(machine, "bank3", 3); // TODO or 4
139         memory_set_bank(m_machine, "bank3", 3); // TODO or 4
140140      }
141141      else
142142      {
r10991r10992
151151      /* CRT video RAM */
152152      program->install_readwrite_bank(0xc000, 0xdfff, "bank4");
153153      program->unmap_readwrite(0xe000, 0xe7ff);
154      memory_set_bank(machine, "bank4", 1);
154      memory_set_bank(m_machine, "bank4", 1);
155155      //logerror("0xc000-0xdfff = video RAM\n");
156156   }
157157   else
158158   {
159159      /* RAM */
160160      program->install_readwrite_bank(0xc000, 0xe7ff, "bank4");
161      memory_set_bank(machine, "bank4", 0);
161      memory_set_bank(m_machine, "bank4", 0);
162162      //logerror("0xc000-0e7fff = RAM c000-e7fff\n");
163163   }
164164}
165165
166static WRITE8_HANDLER( mmr_w )
166WRITE8_MEMBER( pc8401a_state::mmr_w )
167167{
168168   /*
169169
r10991r10992
180180
181181    */
182182
183   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
184
185   if (data != state->mmr)
183   if (data != m_mmr)
186184   {
187      pc8401a_bankswitch(space->machine(), data);
185      bankswitch(data);
188186   }
189187
190   state->mmr = data;
188   m_mmr = data;
191189}
192190
193static READ8_HANDLER( mmr_r )
191READ8_MEMBER( pc8401a_state::mmr_r )
194192{
195   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
196
197   return state->mmr;
193   return m_mmr;
198194}
199195
200static READ8_HANDLER( rtc_r )
196READ8_MEMBER( pc8401a_state::rtc_r )
201197{
202198   /*
203199
r10991r10992
214210
215211    */
216212
217   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
218
219   return (state->rtc_data << 1) | (state->rtc_tp << 2);
213   return (m_rtc->data_out_r() << 1) | (m_rtc->tp_r() << 2);
220214}
221215
222static WRITE8_HANDLER( rtc_cmd_w )
216WRITE8_MEMBER( pc8401a_state::rtc_cmd_w )
223217{
224218   /*
225219
r10991r10992
236230
237231    */
238232
239   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
240
241   state->m_rtc->c0_w(BIT(data, 0));
242   state->m_rtc->c1_w(BIT(data, 1));
243   state->m_rtc->c2_w(BIT(data, 2));
244   state->m_rtc->data_in_w(BIT(data, 3));
233   m_rtc->c0_w(BIT(data, 0));
234   m_rtc->c1_w(BIT(data, 1));
235   m_rtc->c2_w(BIT(data, 2));
236   m_rtc->data_in_w(BIT(data, 3));
245237}
246238
247static WRITE8_HANDLER( rtc_ctrl_w )
239WRITE8_MEMBER( pc8401a_state::rtc_ctrl_w )
248240{
249241   /*
250242
r10991r10992
261253
262254    */
263255
264   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
265
266   state->m_rtc->oe_w(BIT(data, 0));
267   state->m_rtc->stb_w(BIT(data, 1));
268   state->m_rtc->clk_w(BIT(data, 2));
256   m_rtc->oe_w(BIT(data, 0));
257   m_rtc->stb_w(BIT(data, 1));
258   m_rtc->clk_w(BIT(data, 2));
269259}
270260
271static READ8_HANDLER( io_rom_data_r )
261READ8_MEMBER( pc8401a_state::io_rom_data_r )
272262{
273   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
263   UINT8 *iorom = m_machine.region("iorom")->base();
274264
275   UINT8 *iorom = space->machine().region("iorom")->base();
265   //logerror("I/O ROM read from %05x\n", m_io_addr);
276266
277   //logerror("I/O ROM read from %05x\n", state->io_addr);
278
279   return iorom[state->io_addr];
267   return iorom[m_io_addr];
280268}
281269
282static WRITE8_HANDLER( io_rom_addr_w )
270WRITE8_MEMBER( pc8401a_state::io_rom_addr_w )
283271{
284   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
285
286272   switch (offset)
287273   {
288274   case 0: /* A17..A16 */
289      state->io_addr = ((data & 0x03) << 16) | (state->io_addr & 0xffff);
275      m_io_addr = ((data & 0x03) << 16) | (m_io_addr & 0xffff);
290276      break;
291277
292278   case 1: /* A15..A8 */
293      state->io_addr = (state->io_addr & 0x300ff) | (data << 8);
279      m_io_addr = (m_io_addr & 0x300ff) | (data << 8);
294280      break;
295281
296282   case 2: /* A7..A0 */
297      state->io_addr = (state->io_addr & 0x3ff00) | data;
283      m_io_addr = (m_io_addr & 0x3ff00) | data;
298284      break;
299285
300286   case 3:
r10991r10992
303289   }
304290}
305291
306static READ8_HANDLER( port70_r )
292READ8_MEMBER( pc8401a_state::port70_r )
307293{
308294   /*
309295
r10991r10992
320306
321307    */
322308
323   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
324
325   return 0x10 | state->key_strobe;
309   return 0x10 | m_key_strobe;
326310}
327311
328static READ8_HANDLER( port71_r )
312READ8_MEMBER( pc8401a_state::port71_r )
329313{
330   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
331   return state->key_latch;
314   return m_key_latch;
332315}
333316
334static WRITE8_HANDLER( port70_w )
317WRITE8_MEMBER( pc8401a_state::port70_w )
335318{
336   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
337
338   state->key_strobe = 0;
319   m_key_strobe = 0;
339320}
340321
341static WRITE8_HANDLER( port71_w )
322WRITE8_MEMBER( pc8401a_state::port71_w )
342323{
343   pc8401a_state *state = space->machine().driver_data<pc8401a_state>();
344   cputag_set_input_line(space->machine(), Z80_TAG, INPUT_LINE_IRQ0, CLEAR_LINE);
345   state->key_latch = data;
324   m_maincpu->set_input_line(INPUT_LINE_IRQ0, CLEAR_LINE);
325
326   m_key_latch = data;
346327}
347328
348329/* Memory Maps */
349330
350static ADDRESS_MAP_START( pc8401a_mem, AS_PROGRAM, 8 )
331static ADDRESS_MAP_START( pc8401a_mem, AS_PROGRAM, 8, pc8401a_state )
351332   ADDRESS_MAP_UNMAP_HIGH
352333   AM_RANGE(0x0000, 0x7fff) AM_RAMBANK("bank1")
353334   AM_RANGE(0x8000, 0xbfff) AM_RAMBANK("bank3")
r10991r10992
355336   AM_RANGE(0xe800, 0xffff) AM_RAMBANK("bank5")
356337ADDRESS_MAP_END
357338
358static ADDRESS_MAP_START( pc8401a_io, AS_IO, 8 )
339static ADDRESS_MAP_START( pc8401a_io, AS_IO, 8, pc8401a_state )
359340   ADDRESS_MAP_UNMAP_HIGH
360341   ADDRESS_MAP_GLOBAL_MASK(0xff)
361342ADDRESS_MAP_END
362343
363static ADDRESS_MAP_START( pc8500_io, AS_IO, 8 )
344static ADDRESS_MAP_START( pc8500_io, AS_IO, 8, pc8401a_state )
364345   ADDRESS_MAP_UNMAP_HIGH
365346   ADDRESS_MAP_GLOBAL_MASK(0xff)
366347   AM_RANGE(0x00, 0x00) AM_READ_PORT("KEY0")
r10991r10992
374355   AM_RANGE(0x08, 0x08) AM_READ_PORT("KEY8")
375356   AM_RANGE(0x09, 0x09) AM_READ_PORT("KEY9")
376357   AM_RANGE(0x10, 0x10) AM_WRITE(rtc_cmd_w)
377   AM_RANGE(0x20, 0x20) AM_DEVREADWRITE(MSM8251_TAG, msm8251_data_r, msm8251_data_w)
378   AM_RANGE(0x21, 0x21) AM_DEVREADWRITE(MSM8251_TAG, msm8251_status_r, msm8251_control_w)
358   AM_RANGE(0x20, 0x20) AM_DEVREADWRITE_LEGACY(MSM8251_TAG, msm8251_data_r, msm8251_data_w)
359   AM_RANGE(0x21, 0x21) AM_DEVREADWRITE_LEGACY(MSM8251_TAG, msm8251_status_r, msm8251_control_w)
379360   AM_RANGE(0x30, 0x30) AM_READWRITE(mmr_r, mmr_w)
380361//  AM_RANGE(0x31, 0x31)
381362   AM_RANGE(0x40, 0x40) AM_READWRITE(rtc_r, rtc_ctrl_w)
382363//  AM_RANGE(0x41, 0x41)
383364//  AM_RANGE(0x50, 0x51)
384   AM_RANGE(0x60, 0x60) AM_DEVREADWRITE(SED1330_TAG, sed1330_status_r, sed1330_data_w)
385   AM_RANGE(0x61, 0x61) AM_DEVREADWRITE(SED1330_TAG, sed1330_data_r, sed1330_command_w)
365   AM_RANGE(0x60, 0x60) AM_DEVREADWRITE_LEGACY(SED1330_TAG, sed1330_status_r, sed1330_data_w)
366   AM_RANGE(0x61, 0x61) AM_DEVREADWRITE_LEGACY(SED1330_TAG, sed1330_data_r, sed1330_command_w)
386367   AM_RANGE(0x70, 0x70) AM_READWRITE(port70_r, port70_w)
387368   AM_RANGE(0x71, 0x71) AM_READWRITE(port71_r, port71_w)
388369//  AM_RANGE(0x80, 0x80) modem status, set to 0xff to boot
389370//  AM_RANGE(0x8b, 0x8b)
390371//  AM_RANGE(0x90, 0x93)
391372//  AM_RANGE(0xa0, 0xa1)
392   AM_RANGE(0x98, 0x98) AM_DEVWRITE(MC6845_TAG, mc6845_address_w)
393   AM_RANGE(0x99, 0x99) AM_DEVREADWRITE(MC6845_TAG, mc6845_register_r, mc6845_register_w)
373   AM_RANGE(0x98, 0x98) AM_DEVWRITE_LEGACY(MC6845_TAG, mc6845_address_w)
374   AM_RANGE(0x99, 0x99) AM_DEVREADWRITE_LEGACY(MC6845_TAG, mc6845_register_r, mc6845_register_w)
394375   AM_RANGE(0xb0, 0xb3) AM_WRITE(io_rom_addr_w)
395376   AM_RANGE(0xb3, 0xb3) AM_READ(io_rom_data_r)
396377//  AM_RANGE(0xc8, 0xc8)
397   AM_RANGE(0xfc, 0xff) AM_DEVREADWRITE(I8255A_TAG, i8255a_r, i8255a_w)
378   AM_RANGE(0xfc, 0xff) AM_DEVREADWRITE_LEGACY(I8255A_TAG, i8255a_r, i8255a_w)
398379ADDRESS_MAP_END
399380
400381/* Input Ports */
r10991r10992
503484
504485/* Machine Initialization */
505486
506static MACHINE_START( pc8401a )
487void pc8401a_state::machine_start()
507488{
508   pc8401a_state *state = machine.driver_data<pc8401a_state>();
509
510489   /* initialize RTC */
511   state->m_rtc->cs_w(1);
490   m_rtc->cs_w(1);
512491
513492   /* allocate CRT video RAM */
514   state->crt_ram = auto_alloc_array(machine, UINT8, PC8401A_CRT_VIDEORAM_SIZE);
493   m_crt_ram = auto_alloc_array(m_machine, UINT8, PC8401A_CRT_VIDEORAM_SIZE);
515494
495   UINT8 *ram = ram_get_ptr(m_ram);
496
516497   /* set up A0/A1 memory banking */
517   memory_configure_bank(machine, "bank1", 0, 4, machine.region(Z80_TAG)->base(), 0x8000);
518   memory_configure_bank(machine, "bank1", 4, 2, ram_get_ptr(machine.device(RAM_TAG)), 0x8000);
519   memory_set_bank(machine, "bank1", 0);
498   memory_configure_bank(m_machine, "bank1", 0, 4, m_machine.region(Z80_TAG)->base(), 0x8000);
499   memory_configure_bank(m_machine, "bank1", 4, 2, ram, 0x8000);
500   memory_set_bank(m_machine, "bank1", 0);
520501
521502   /* set up A2 memory banking */
522   memory_configure_bank(machine, "bank3", 0, 5, ram_get_ptr(machine.device(RAM_TAG)), 0x4000);
523   memory_set_bank(machine, "bank3", 0);
503   memory_configure_bank(m_machine, "bank3", 0, 5, ram, 0x4000);
504   memory_set_bank(m_machine, "bank3", 0);
524505
525506   /* set up A3 memory banking */
526   memory_configure_bank(machine, "bank4", 0, 1, ram_get_ptr(machine.device(RAM_TAG)) + 0xc000, 0);
527   memory_configure_bank(machine, "bank4", 1, 1, state->crt_ram, 0);
528   memory_set_bank(machine, "bank4", 0);
507   memory_configure_bank(m_machine, "bank4", 0, 1, ram + 0xc000, 0);
508   memory_configure_bank(m_machine, "bank4", 1, 1, m_crt_ram, 0);
509   memory_set_bank(m_machine, "bank4", 0);
529510
530511   /* set up A4 memory banking */
531   memory_configure_bank(machine, "bank5", 0, 1, ram_get_ptr(machine.device(RAM_TAG)) + 0xe800, 0);
532   memory_set_bank(machine, "bank5", 0);
512   memory_configure_bank(m_machine, "bank5", 0, 1, ram + 0xe800, 0);
513   memory_set_bank(m_machine, "bank5", 0);
533514
534515   /* bank switch */
535   pc8401a_bankswitch(machine, 0);
516   bankswitch(0);
536517
537518   /* register for state saving */
538   state->save_pointer(NAME(state->crt_ram), PC8401A_CRT_VIDEORAM_SIZE);
539   state->save_item(NAME(state->rtc_data));
540   state->save_item(NAME(state->rtc_tp));
541   state->save_item(NAME(state->mmr));
542   state->save_item(NAME(state->io_addr));
519   save_pointer(NAME(m_crt_ram), PC8401A_CRT_VIDEORAM_SIZE);
520   save_item(NAME(m_mmr));
521   save_item(NAME(m_io_addr));
543522}
544523
545static READ8_DEVICE_HANDLER( pc8401a_8255_c_r )
524READ8_MEMBER( pc8401a_state::ppi_pc_r )
546525{
547526   /*
548527
r10991r10992
562541   return 0;
563542}
564543
565static WRITE8_DEVICE_HANDLER( pc8401a_8255_c_w )
544WRITE8_MEMBER( pc8401a_state::ppi_pc_w )
566545{
567546   /*
568547
r10991r10992
580559    */
581560}
582561
583static I8255A_INTERFACE( pc8401a_8255_interface )
562static I8255A_INTERFACE( ppi_intf )
584563{
585564   DEVCB_NULL,
586565   DEVCB_NULL,
587   DEVCB_HANDLER(pc8401a_8255_c_r),
566   DEVCB_DRIVER_MEMBER(pc8401a_state, ppi_pc_r),
588567   DEVCB_NULL,
589568   DEVCB_NULL,
590   DEVCB_HANDLER(pc8401a_8255_c_w),
569   DEVCB_DRIVER_MEMBER(pc8401a_state, ppi_pc_w),
591570};
592571
593572/* uPD1990A Interface */
594573
595static WRITE_LINE_DEVICE_HANDLER( pc8401a_upd1990a_data_w )
574static UPD1990A_INTERFACE( rtc_intf )
596575{
597   pc8401a_state *driver_state = device->machine().driver_data<pc8401a_state>();
598
599   driver_state->rtc_data = state;
600}
601
602static WRITE_LINE_DEVICE_HANDLER( pc8401a_upd1990a_tp_w )
603{
604   pc8401a_state *driver_state = device->machine().driver_data<pc8401a_state>();
605
606   driver_state->rtc_tp = state;
607}
608
609static UPD1990A_INTERFACE( pc8401a_upd1990a_intf )
610{
611   DEVCB_LINE(pc8401a_upd1990a_data_w),
612   DEVCB_LINE(pc8401a_upd1990a_tp_w)
576   DEVCB_NULL,
577   DEVCB_NULL
613578};
614579
615580/* MSM8251 Interface */
616581
617static const msm8251_interface pc8401a_msm8251_interface =
582static const msm8251_interface uart_intf =
618583{
619584   DEVCB_NULL,
620585   DEVCB_NULL,
r10991r10992
629594
630595/* Machine Drivers */
631596
632static MACHINE_CONFIG_START( common, pc8401a_state )
633
597static MACHINE_CONFIG_START( pc8401a, pc8401a_state )
634598   /* basic machine hardware */
635599   MCFG_CPU_ADD(Z80_TAG, Z80, 4000000) // NEC uPD70008C
636600   MCFG_CPU_PROGRAM_MAP(pc8401a_mem)
637601   MCFG_CPU_IO_MAP(pc8401a_io)
638602
639   MCFG_MACHINE_START(pc8401a)
640
641603   /* fake keyboard */
642604   MCFG_TIMER_ADD_PERIODIC("keyboard", pc8401a_keyboard_tick, attotime::from_hz(64))
643605
644606   /* devices */
645   MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, pc8401a_upd1990a_intf)
646   MCFG_I8255A_ADD(I8255A_TAG, pc8401a_8255_interface)
647   MCFG_MSM8251_ADD(MSM8251_TAG, pc8401a_msm8251_interface)
607   MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, rtc_intf)
608   MCFG_I8255A_ADD(I8255A_TAG, ppi_intf)
609   MCFG_MSM8251_ADD(MSM8251_TAG, uart_intf)
648610
611   /* video hardware */
612   MCFG_FRAGMENT_ADD(pc8401a_video)
613
649614   /* option ROM cartridge */
650615   MCFG_CARTSLOT_ADD("cart")
651616   MCFG_CARTSLOT_EXTENSION_LIST("rom,bin")
r10991r10992
662627   MCFG_RAM_EXTRA_OPTIONS("96K")
663628MACHINE_CONFIG_END
664629
665static MACHINE_CONFIG_DERIVED( pc8401a, common )
666
667   /* video hardware */
668   MCFG_FRAGMENT_ADD(pc8401a_video)
669MACHINE_CONFIG_END
670
671static MACHINE_CONFIG_DERIVED( pc8500, common )
672
630static MACHINE_CONFIG_START( pc8500, pc8500_state )
673631   /* basic machine hardware */
674   MCFG_CPU_MODIFY(Z80_TAG)
632   MCFG_CPU_ADD(Z80_TAG, Z80, 4000000) // NEC uPD70008C
633   MCFG_CPU_PROGRAM_MAP(pc8401a_mem)
675634   MCFG_CPU_IO_MAP(pc8500_io)
676635
636   /* fake keyboard */
637   MCFG_TIMER_ADD_PERIODIC("keyboard", pc8401a_keyboard_tick, attotime::from_hz(64))
638
639   /* devices */
640   MCFG_UPD1990A_ADD(UPD1990A_TAG, XTAL_32_768kHz, rtc_intf)
641   MCFG_I8255A_ADD(I8255A_TAG, ppi_intf)
642   MCFG_MSM8251_ADD(MSM8251_TAG, uart_intf)
643
677644   /* video hardware */
678645   MCFG_FRAGMENT_ADD(pc8500_video)
646   
647   /* option ROM cartridge */
648   MCFG_CARTSLOT_ADD("cart")
649   MCFG_CARTSLOT_EXTENSION_LIST("rom,bin")
650   MCFG_CARTSLOT_NOT_MANDATORY
679651
652   /* I/O ROM cartridge */
653   MCFG_CARTSLOT_ADD("iocart")
654   MCFG_CARTSLOT_EXTENSION_LIST("rom,bin")
655   MCFG_CARTSLOT_NOT_MANDATORY
656
680657   /* internal ram */
681   MCFG_RAM_MODIFY(RAM_TAG)
658   MCFG_RAM_ADD(RAM_TAG)
682659   MCFG_RAM_DEFAULT_SIZE("64K")
660   MCFG_RAM_EXTRA_OPTIONS("96K")
683661MACHINE_CONFIG_END
684662
685663/* ROMs */

Previous 15994 Revisions Next


© 1998-2018 The MESS Team