Previous 199869 Revisions Next

r34934 Monday 9th February, 2015 at 03:08:26 UTC by Carl
(mess) pcd: doesn't display anything yet but almost completes post (nw)
[src/emu/cpu/i86]i186.c
[src/emu/machine]mc2661.c
[src/mess]mess.mak
[src/mess/drivers]pcd.c

trunk/src/emu/cpu/i86/i186.c
r243445r243446
10351035            count = count ? count : 0x10000;
10361036            if(!(t->control & 4))
10371037               t->int_timer->adjust((attotime::from_hz(clock()/8) * count), which);
1038            t->count = 0;
10391038            if (LOG_TIMER) logerror("  Repriming interrupt\n");
10401039         }
10411040         else
1041         {
10421042            t->int_timer->adjust(attotime::never, which);
1043            t->control &= ~0x8000;
1044         }
1045         t->count = 0;
10431046         break;
10441047      }
10451048
r243445r243446
12451248   // Do the transfer, 80188 is incapable of word transfers
12461249   if ((dma->control & BYTE_WORD) && (m_program->data_width() == 16))
12471250   {
1248      dma_word = src_space->read_word(dma->source);
1249      dest_space->write_word(dma->dest, dma_word);
1251      dma_word = src_space->read_word_unaligned(dma->source);
1252      dest_space->write_word_unaligned(dma->dest, dma_word);
12501253      incdec_size = 2;
12511254   }
12521255   else
r243445r243446
16751678         if (LOG_PORTS) logerror("%05X:80186 DMA%d control = %04X\n", pc(), (offset - 0x65) / 8, data);
16761679         which = (offset - 0x65) / 8;
16771680         update_dma_control(which, data);
1681         if((m_dma[which].control & (SYNC_MASK | ST_STOP | TIMER_DRQ)) == ST_STOP)
1682         {
1683            // TODO: don't do this
1684            while(m_dma[which].control & ST_STOP)
1685               drq_callback(which);
1686         }
16781687         break;
16791688
16801689      case 0x7f:
trunk/src/emu/machine/mc2661.c
r243445r243446
278278         m_write_txrdy(CLEAR_LINE);
279279      }
280280      if(COMMAND_MODE == 0x02)  // loopback - the Wicat will set this after enabling the transmitter
281      {
281282         m_rhr = data;
283         m_sr |= STATUS_RXRDY; // pcd expects this
284         m_write_rxrdy(ASSERT_LINE);
285      }
282286      break;
283287
284288   case REGISTER_SYNC:
trunk/src/mess/drivers/pcd.c
r243445r243446
1919#include "machine/wd_fdc.h"
2020#include "machine/mc146818.h"
2121#include "sound/speaker.h"
22#include "video/scn2674.h"
2223
23
2424//**************************************************************************
2525//  TYPE DEFINITIONS
2626//**************************************************************************
r243445r243446
3636   m_speaker(*this, "speaker"),
3737   m_sasi(*this, "sasi"),
3838   m_fdc(*this, "fdc"),
39   m_rtc(*this, "rtc")
39   m_rtc(*this, "rtc"),
40   m_crtc(*this, "crtc"),
41   m_vram(*this, "vram"),
42   m_charram(8*1024)
4043   { }
4144
42   DECLARE_WRITE_LINE_MEMBER( pic1_irq );
43   DECLARE_READ8_MEMBER( pic1_slave_ack_r );
45   DECLARE_READ8_MEMBER( irq_callback );
4446   TIMER_DEVICE_CALLBACK_MEMBER( timer0_tick );
4547   DECLARE_WRITE_LINE_MEMBER( i186_timer1_w );
4648
47   DECLARE_READ8_MEMBER( crt_data_r );
48   DECLARE_WRITE8_MEMBER( crt_data_w );
49   DECLARE_READ8_MEMBER( crt_status_r );
49   DECLARE_READ8_MEMBER( charram_r );
50   DECLARE_WRITE8_MEMBER( charram_w );
51   DECLARE_READ16_MEMBER( nmi_io_r );
52   DECLARE_WRITE16_MEMBER( nmi_io_w );
53   DECLARE_READ16_MEMBER( unk_r );
54   DECLARE_WRITE16_MEMBER( unk_w );
55   DECLARE_READ8_MEMBER( stat_r );
56   DECLARE_WRITE8_MEMBER( stat_w );
57   DECLARE_READ8_MEMBER( led_r );
58   DECLARE_WRITE8_MEMBER( led_w );
59   UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
5060
5161protected:
5262   // driver_device overrides
5363   virtual void machine_start();
64   virtual void machine_reset();
5465
5566private:
5667   required_device<i80186_cpu_device> m_maincpu;
r243445r243446
6071   required_device<omti5100_device> m_sasi;
6172   required_device<wd2793_t> m_fdc;
6273   required_device<mc146818_device> m_rtc;
74   required_device<scn2674_device> m_crtc;
75   required_shared_ptr<UINT16> m_vram;
76   dynamic_buffer m_charram;
77   UINT8 m_stat, m_led;
6378};
6479
6580
r243445r243446
6782//  MACHINE EMULATION
6883//**************************************************************************
6984
85static const gfx_layout pcd_charlayout =
86{
87   8, 14,                   /* 8 x 14 characters */
88   512,                    /* 512 characters */
89   1,                  /* 1 bits per pixel */
90   { 0 },                  /* no bitplanes */
91   /* x offsets */
92   { 0, 1, 2, 3, 4, 5, 6, 7 },
93   /* y offsets */
94   { 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8 },
95   8*16
96};
7097void pcd_state::machine_start()
7198{
99   machine().device<gfxdecode_device>("gfxdecode")->set_gfx(0, global_alloc(gfx_element(machine().device<palette_device>("palette"), pcd_charlayout, m_charram, 0, 2, 0)));
72100}
73101
74WRITE_LINE_MEMBER( pcd_state::pic1_irq )
102void pcd_state::machine_reset()
75103{
76   logerror("pic1 irq: %d\n", state);
77   m_maincpu->int0_w(state); // ?
104   m_stat = 0;
105   m_led = 0;
78106}
79107
80READ8_MEMBER( pcd_state::pic1_slave_ack_r )
108READ8_MEMBER( pcd_state::irq_callback )
81109{
82   if (offset == 0) // irq 0
83      return m_pic2->acknowledge();
84
85   return 0x00;
110   return (offset ? m_pic2 : m_pic1)->acknowledge();
86111}
87112
88113TIMER_DEVICE_CALLBACK_MEMBER( pcd_state::timer0_tick )
r243445r243446
96121   m_speaker->level_w(state);
97122}
98123
99READ8_MEMBER( pcd_state::crt_data_r )
124READ8_MEMBER( pcd_state::charram_r )
100125{
101   logerror("crt_data_r @ %02x\n", offset);
102   return 0xff;
126   return m_charram[offset >> 1];
103127}
104128
105WRITE8_MEMBER( pcd_state::crt_data_w )
129WRITE8_MEMBER( pcd_state::charram_w )
106130{
107   logerror("crt_data_w %02x @ %02x\n", data, offset);
131   m_charram[offset >> 1] = data;
108132}
109133
110READ8_MEMBER( pcd_state::crt_status_r )
134READ16_MEMBER( pcd_state::nmi_io_r )
111135{
112   logerror("crt_status_r @ %02x\n", offset);
113   return 0xff;
136   if(space.debugger_access())
137      return 0;
138   logerror("%s: unmapped %s %04x\n", machine().describe_context(), space.name(), offset << 1);
139   m_stat |= 8;
140   m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
141   return 0;
114142}
115143
144WRITE16_MEMBER( pcd_state::nmi_io_w )
145{
146   if(space.debugger_access())
147      return;
148   logerror("%s: unmapped %s %04x\n", machine().describe_context(), space.name(), offset << 1);
149   m_stat |= 8;
150   m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
151}
116152
153READ16_MEMBER( pcd_state::unk_r )
154{
155   return 0;
156}
157
158WRITE16_MEMBER( pcd_state::unk_w )
159{
160}
161
162READ8_MEMBER( pcd_state::stat_r )
163{
164   return m_stat;
165}
166
167WRITE8_MEMBER( pcd_state::stat_w )
168{
169   m_stat = data;
170}
171
172READ8_MEMBER( pcd_state::led_r )
173{
174   return m_led;
175}
176
177WRITE8_MEMBER( pcd_state::led_w )
178{
179   for(int i = 0; i < 6; i++)
180      logerror("%c", (data & (1 << i)) ? '-' : '*');
181   logerror("\n");
182   m_led = data;
183}
184
185UINT32 pcd_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
186{
187   //bitmap.fill(0, cliprect);
188   m_crtc->scn2574_draw(machine(), bitmap, cliprect, m_vram);
189   return 0;
190}
191
117192//**************************************************************************
118193//  ADDRESS MAPS
119194//**************************************************************************
120195
121196static ADDRESS_MAP_START( pcd_map, AS_PROGRAM, 16, pcd_state )
122197   AM_RANGE(0x00000, 0x3ffff) AM_RAM // fixed 256k for now
198   AM_RANGE(0xf0000, 0xf7fff) AM_RAM AM_SHARE("vram")
199   //AM_RANGE(0xf7000, 0xfbfff) AM_READWRITE8(charram_r, charram_w, 0xffff)
123200   AM_RANGE(0xfc000, 0xfffff) AM_ROM AM_REGION("bios", 0)
201   AM_RANGE(0x00000, 0xfffff) AM_READWRITE(nmi_io_r, nmi_io_w)
124202ADDRESS_MAP_END
125203
126204static ADDRESS_MAP_START( pcd_io, AS_IO, 16, pcd_state )
127205   ADDRESS_MAP_UNMAP_HIGH
128206   AM_RANGE(0xf000, 0xf7ff) AM_RAM AM_SHARE("nvram")
129   AM_RANGE(0xf840, 0xf841) AM_DEVREADWRITE8("pic1", pic8259_device, read, write, 0xff00)
130   AM_RANGE(0xf900, 0xf907) AM_DEVREADWRITE8("fdc", wd2793_t, read, write, 0x00ff)
131//  AM_RANGE(0xf940, 0xf941) // sasi controller here?
132   AM_RANGE(0xf980, 0xf981) AM_READWRITE8(crt_data_r, crt_data_w, 0x00ff) AM_READ8(crt_status_r, 0xff00)
133//  AM_RANGE(0xfa00, 0xfa7f) // pcs4-n (peripheral chip select)
207   AM_RANGE(0xf800, 0xf801) AM_DEVREADWRITE8("pic1", pic8259_device, read, write, 0xffff)
208   AM_RANGE(0xf820, 0xf821) AM_DEVREADWRITE8("pic2", pic8259_device, read, write, 0xffff)
209   AM_RANGE(0xf840, 0xf841) AM_READWRITE8(stat_r, stat_w, 0x00ff)
210   AM_RANGE(0xf840, 0xf841) AM_READWRITE8(led_r, led_w, 0xff00)
211   AM_RANGE(0xf880, 0xf88f) AM_READWRITE(unk_r, unk_w) // mmu?
212   AM_RANGE(0xf900, 0xf907) AM_DEVREADWRITE8("fdc", wd2793_t, read, write, 0xffff)
213   //AM_RANGE(0xf940, 0xf943) scsi
214   AM_RANGE(0xf9c0, 0xf9c3) AM_DEVREADWRITE8("usart1",mc2661_device,read,write,0xffff)  // UARTs
215   AM_RANGE(0xf9d0, 0xf9d3) AM_DEVREADWRITE8("usart2",mc2661_device,read,write,0xffff)
216   AM_RANGE(0xf9e0, 0xf9e3) AM_DEVREADWRITE8("usart3",mc2661_device,read,write,0xffff)
217   AM_RANGE(0xf980, 0xf987) AM_DEVWRITE8("crtc", scn2674_device, mpu4_vid_scn2674_w, 0x00ff)
218   AM_RANGE(0xf980, 0xf987) AM_DEVREAD8("crtc", scn2674_device, mpu4_vid_scn2674_r, 0xff00)
219//   AM_RANGE(0xfa00, 0xfa7f) // pcs4-n (peripheral chip select)
220   AM_RANGE(0x0000, 0xffff) AM_READWRITE(nmi_io_r, nmi_io_w)
134221ADDRESS_MAP_END
135222
136223
r243445r243446
144231SLOT_INTERFACE_END
145232
146233static MACHINE_CONFIG_START( pcd, pcd_state )
147   MCFG_CPU_ADD("maincpu", I80186, XTAL_16MHz / 2)
234   MCFG_CPU_ADD("maincpu", I80186, XTAL_16MHz)
148235   MCFG_CPU_PROGRAM_MAP(pcd_map)
149236   MCFG_CPU_IO_MAP(pcd_io)
150237   MCFG_80186_TMROUT1_HANDLER(WRITELINE(pcd_state, i186_timer1_w))
238   MCFG_80186_IRQ_SLAVE_ACK(READ8(pcd_state, irq_callback))
151239
152   MCFG_TIMER_DRIVER_ADD_PERIODIC("timer0_tick", pcd_state, timer0_tick, attotime::from_hz(XTAL_16MHz / 2 / 16))
240   MCFG_TIMER_DRIVER_ADD_PERIODIC("timer0_tick", pcd_state, timer0_tick, attotime::from_hz(XTAL_16MHz / 24)) // adjusted to pass post
153241
154   MCFG_PIC8259_ADD("pic1", WRITELINE(pcd_state, pic1_irq), VCC, READ8(pcd_state, pic1_slave_ack_r))
155   MCFG_PIC8259_ADD("pic2", DEVWRITELINE("pic1", pic8259_device, ir0_w), GND, NULL)
242   MCFG_PIC8259_ADD("pic1", DEVWRITELINE("maincpu", i80186_cpu_device, int0_w), VCC, NULL)
243   MCFG_PIC8259_ADD("pic2", DEVWRITELINE("maincpu", i80186_cpu_device, int1_w), VCC, NULL)
156244
157245#if 0
158246   MCFG_RAM_ADD(RAM_TAG)
r243445r243446
167255   MCFG_OMTI5100_ADD("sasi")
168256
169257   // floppy disk controller
170   MCFG_WD2793x_ADD("fdc", XTAL_16MHz/2/8)
258   MCFG_WD2793x_ADD("fdc", XTAL_16MHz/8)
171259   MCFG_WD_FDC_INTRQ_CALLBACK(DEVWRITELINE("pic1", pic8259_device, ir6_w))
172260   MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("maincpu", i80186_cpu_device, drq1_w))
173261
r243445r243446
188276   MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
189277   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
190278
279   // video hardware
280   MCFG_SCREEN_ADD("screen", RASTER)
281   MCFG_SCREEN_SIZE(640, 350)
282   MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 349)
283   MCFG_SCREEN_REFRESH_RATE(50)
284   MCFG_SCREEN_UPDATE_DRIVER(pcd_state, screen_update)
285
286   MCFG_GFXDECODE_ADD("gfxdecode", "palette", empty)
287   MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
288
289   MCFG_SCN2674_VIDEO_ADD("crtc", 0, NULL);
290   MCFG_SCN2674_GFXDECODE("gfxdecode")
291   MCFG_SCN2674_PALETTE("palette")
292
191293   // rtc
192294   MCFG_MC146818_ADD("rtc", XTAL_32_768kHz)
193295   MCFG_MC146818_IRQ_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir7_w))
r243445r243446
202304   ROM_REGION(0x4000, "bios", 0)
203305   ROM_LOAD16_BYTE("s26361-d359.d42", 0x0001, 0x2000, CRC(e20244dd) SHA1(0ebc5ddb93baacd9106f1917380de58aac64fe73))
204306   ROM_LOAD16_BYTE("s26361-d359.d43", 0x0000, 0x2000, CRC(e03db2ec) SHA1(fcae8b0c9e7543706817b0a53872826633361fda))
307   ROM_FILL(0xb64, 1, 0xe2)  // post expects 0xd0 fdc command to be instant, give it a delay
308   ROM_FILL(0xb65, 1, 0xfe)
309   ROM_FILL(0x3ffe, 1, 0xb4)  // fix csum
310   ROM_FILL(0x3fff, 1, 0x22)
205311
206312   // gfx card (scn2674 with 8741), to be moved
207313   ROM_REGION(0x400, "graphics", 0)
trunk/src/mess/mess.mak
r243445r243446
940940   $(MAME_VIDEO)/vectrex.o     \
941941   $(MAME_DRIVERS)/cps1.o      \
942942   $(MAME_VIDEO)/cps1.o        \
943   $(MAME_VIDEO)/scn2674.o     \
943944
944945
945946#-------------------------------------------------


Previous 199869 Revisions Next


© 1997-2024 The MAME Team