Previous 199869 Revisions Next

r22524 Wednesday 24th April, 2013 at 09:50:14 UTC by Miodrag Milanović
modernized 2 drivers skipped in past (nw)
[src/mame/drivers]gammagic.c vlc.c

trunk/src/mame/drivers/gammagic.c
r22523r22524
7676public:
7777   gammagic_state(const machine_config &mconfig, device_type type, const char *tag)
7878      : driver_device(mconfig, type, tag),
79      m_pit8254(*this, "pit8254" ),
80      m_pic8259_1(*this, "pic8259_1" ),
81      m_pic8259_2(*this,  "pic8259_2" ),
82      m_dma8237_1(*this, "dma8237_1" ),
83      m_dma8237_2(*this, "dma8237_2" ),     
7984      m_maincpu(*this, "maincpu") { }
8085
8186   int m_dma_channel;
8287   UINT8 m_dma_offset[2][4];
8388   UINT8 m_at_pages[0x10];
8489
85   device_t    *m_pit8254;
86   device_t    *m_pic8259_1;
87   device_t    *m_pic8259_2;
88   i8237_device    *m_dma8237_1;
89   i8237_device    *m_dma8237_2;
90   required_device<device_t> m_pit8254;
91   required_device<device_t> m_pic8259_1;
92   required_device<device_t> m_pic8259_2;
93   required_device<i8237_device> m_dma8237_1;
94   required_device<i8237_device> m_dma8237_2;
9095
9196   emu_timer *m_atapi_timer;
9297   //SCSIInstance *m_inserted_cdrom;
r22523r22524
104109   DECLARE_DRIVER_INIT(gammagic);
105110   IRQ_CALLBACK_MEMBER(irq_callback);
106111   DECLARE_READ8_MEMBER(get_out2);
112   DECLARE_READ8_MEMBER(at_page8_r);
113   DECLARE_WRITE8_MEMBER(at_page8_w);
114   DECLARE_READ8_MEMBER(pc_dma_read_byte);
115   DECLARE_WRITE8_MEMBER(pc_dma_write_byte);
116   DECLARE_READ8_MEMBER(at_dma8237_2_r);
117   DECLARE_WRITE8_MEMBER(at_dma8237_2_w);
118   DECLARE_WRITE_LINE_MEMBER(pc_dma_hrq_changed);
119   void set_dma_channel(int channel, int state);
120   DECLARE_WRITE_LINE_MEMBER(pc_dack0_w);
121   DECLARE_WRITE_LINE_MEMBER(pc_dack1_w);
122   DECLARE_WRITE_LINE_MEMBER(pc_dack2_w);
123   DECLARE_WRITE_LINE_MEMBER(pc_dack3_w);   
124   DECLARE_WRITE_LINE_MEMBER(gammagic_pic8259_1_set_int_line);
125   DECLARE_READ8_MEMBER(get_slave_ack);
126   
127   virtual void machine_start();
128   virtual void machine_reset();
129   void atapi_init();
107130   required_device<cpu_device> m_maincpu;
108131};
109132
110//static void atapi_irq(running_machine &machine, int state);
111
112static READ8_DEVICE_HANDLER(at_dma8237_2_r)
133READ8_MEMBER(gammagic_state::at_dma8237_2_r)
113134{
114   gammagic_state *state = space.machine().driver_data<gammagic_state>();
115   return state->m_dma8237_2->i8237_r(space, offset / 2);
135   return m_dma8237_2->i8237_r(space, offset / 2);
116136}
117137
118static WRITE8_DEVICE_HANDLER(at_dma8237_2_w)
138WRITE8_MEMBER(gammagic_state::at_dma8237_2_w)
119139{
120   gammagic_state *state = space.machine().driver_data<gammagic_state>();
121   state->m_dma8237_2->i8237_w(space, offset / 2, data);
140   m_dma8237_2->i8237_w(space, offset / 2, data);
122141}
123142
124static READ8_HANDLER(at_page8_r)
143READ8_MEMBER(gammagic_state::at_page8_r)
125144{
126   gammagic_state *state = space.machine().driver_data<gammagic_state>();
127   UINT8 data = state->m_at_pages[offset % 0x10];
145   UINT8 data = m_at_pages[offset % 0x10];
128146
129147   switch(offset % 8) {
130148   case 1:
131      data = state->m_dma_offset[(offset / 8) & 1][2];
149      data = m_dma_offset[(offset / 8) & 1][2];
132150      break;
133151   case 2:
134      data = state->m_dma_offset[(offset / 8) & 1][3];
152      data = m_dma_offset[(offset / 8) & 1][3];
135153      break;
136154   case 3:
137      data = state->m_dma_offset[(offset / 8) & 1][1];
155      data = m_dma_offset[(offset / 8) & 1][1];
138156      break;
139157   case 7:
140      data = state->m_dma_offset[(offset / 8) & 1][0];
158      data = m_dma_offset[(offset / 8) & 1][0];
141159      break;
142160   }
143161   return data;
144162}
145163
146static WRITE8_HANDLER(at_page8_w)
164
165WRITE8_MEMBER(gammagic_state::at_page8_w)
147166{
148   gammagic_state *state = space.machine().driver_data<gammagic_state>();
149   state->m_at_pages[offset % 0x10] = data;
167   m_at_pages[offset % 0x10] = data;
150168
151169   switch(offset % 8) {
152170   case 1:
153      state->m_dma_offset[(offset / 8) & 1][2] = data;
171      m_dma_offset[(offset / 8) & 1][2] = data;
154172      break;
155173   case 2:
156      state->m_dma_offset[(offset / 8) & 1][3] = data;
174      m_dma_offset[(offset / 8) & 1][3] = data;
157175      break;
158176   case 3:
159      state->m_dma_offset[(offset / 8) & 1][1] = data;
177      m_dma_offset[(offset / 8) & 1][1] = data;
160178      break;
161179   case 7:
162      state->m_dma_offset[(offset / 8) & 1][0] = data;
180      m_dma_offset[(offset / 8) & 1][0] = data;
163181      break;
164182   }
165183}
166184
167static WRITE_LINE_DEVICE_HANDLER( pc_dma_hrq_changed )
185
186WRITE_LINE_MEMBER(gammagic_state::pc_dma_hrq_changed)
168187{
169   gammagic_state *drvstate = device->machine().driver_data<gammagic_state>();
170   drvstate->m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
188   m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE);
171189
172190   /* Assert HLDA */
173   drvstate->m_dma8237_1->i8237_hlda_w( state );
191   m_dma8237_1->i8237_hlda_w(state);
174192}
175193
176static READ8_HANDLER( pc_dma_read_byte )
194
195READ8_MEMBER(gammagic_state::pc_dma_read_byte)
177196{
178   gammagic_state *state = space.machine().driver_data<gammagic_state>();
179   offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16)
197   offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
180198      & 0xFF0000;
181199
182200   return space.read_byte(page_offset + offset);
183201}
184202
185static WRITE8_HANDLER( pc_dma_write_byte )
203
204WRITE8_MEMBER(gammagic_state::pc_dma_write_byte)
186205{
187   gammagic_state *state = space.machine().driver_data<gammagic_state>();
188   offs_t page_offset = (((offs_t) state->m_dma_offset[0][state->m_dma_channel]) << 16)
206   offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16)
189207      & 0xFF0000;
190208
191209   space.write_byte(page_offset + offset, data);
192210}
193211
194static void set_dma_channel(device_t *device, int channel, int state)
212void gammagic_state::set_dma_channel(int channel, int state)
195213{
196   gammagic_state *drvstate = device->machine().driver_data<gammagic_state>();
197   if (!state) drvstate->m_dma_channel = channel;
214   if (!state) m_dma_channel = channel;
198215}
199216
200static WRITE_LINE_DEVICE_HANDLER( pc_dack0_w ) { set_dma_channel(device, 0, state); }
201static WRITE_LINE_DEVICE_HANDLER( pc_dack1_w ) { set_dma_channel(device, 1, state); }
202static WRITE_LINE_DEVICE_HANDLER( pc_dack2_w ) { set_dma_channel(device, 2, state); }
203static WRITE_LINE_DEVICE_HANDLER( pc_dack3_w ) { set_dma_channel(device, 3, state); }
217WRITE_LINE_MEMBER(gammagic_state::pc_dack0_w){ set_dma_channel(0, state); }
218WRITE_LINE_MEMBER(gammagic_state::pc_dack1_w){ set_dma_channel(1, state); }
219WRITE_LINE_MEMBER(gammagic_state::pc_dack2_w){ set_dma_channel(2, state); }
220WRITE_LINE_MEMBER(gammagic_state::pc_dack3_w){ set_dma_channel(3, state); }
204221
205222static I8237_INTERFACE( dma8237_1_config )
206223{
207   DEVCB_LINE(pc_dma_hrq_changed),
224   DEVCB_DRIVER_LINE_MEMBER(gammagic_state,pc_dma_hrq_changed),
208225   DEVCB_NULL,
209   DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_read_byte),
210   DEVCB_MEMORY_HANDLER("maincpu", PROGRAM, pc_dma_write_byte),
226   DEVCB_DRIVER_MEMBER(gammagic_state, pc_dma_read_byte),
227   DEVCB_DRIVER_MEMBER(gammagic_state, pc_dma_write_byte),
211228   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL },
212229   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL },
213   { DEVCB_LINE(pc_dack0_w), DEVCB_LINE(pc_dack1_w), DEVCB_LINE(pc_dack2_w), DEVCB_LINE(pc_dack3_w) }
230   { DEVCB_DRIVER_LINE_MEMBER(gammagic_state,pc_dack0_w), DEVCB_DRIVER_LINE_MEMBER(gammagic_state,pc_dack1_w), DEVCB_DRIVER_LINE_MEMBER(gammagic_state,pc_dack2_w), DEVCB_DRIVER_LINE_MEMBER(gammagic_state,pc_dack3_w) }
214231};
215232
216233static I8237_INTERFACE( dma8237_2_config )
r22523r22524
224241   { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }
225242};
226243/*
227static READ32_HANDLER( atapi_r )
244READ32_MEMBER( gammagic_state::atapi_r )
228245{
229    gammagic_state *state = space.machine().driver_data<gammagic_state>();
230    UINT8 *atapi_regs = state->m_atapi_regs;
246    UINT8 *atapi_regs = m_atapi_regs;
231247    //running_machine &machine = space.machine();
232248    int reg, data;
233249
234250    if (mem_mask == 0x0000ffff) // word-wide command read
235251    {
236      logerror("ATAPI: packet read = %04x\n", state->m_atapi_data[state->m_atapi_data_ptr]);
252      logerror("ATAPI: packet read = %04x\n", m_atapi_data[m_atapi_data_ptr]);
237253
238254        // assert IRQ and drop DRQ
239        if (state->m_atapi_data_ptr == 0 && state->m_atapi_data_len == 0)
255        if (m_atapi_data_ptr == 0 && m_atapi_data_len == 0)
240256        {
241257            // get the data from the device
242            if( state->m_atapi_xferlen > 0 )
258            if( m_atapi_xferlen > 0 )
243259            {
244                SCSIReadData( state->m_inserted_cdrom, state->m_atapi_data, state->m_atapi_xferlen );
245                state->m_atapi_data_len = state->m_atapi_xferlen;
260                SCSIReadData( m_inserted_cdrom, m_atapi_data, m_atapi_xferlen );
261                m_atapi_data_len = m_atapi_xferlen;
246262            }
247263
248            if (state->m_atapi_xfermod > MAX_TRANSFER_SIZE)
264            if (m_atapi_xfermod > MAX_TRANSFER_SIZE)
249265            {
250                state->m_atapi_xferlen = MAX_TRANSFER_SIZE;
251                state->m_atapi_xfermod = state->m_atapi_xfermod - MAX_TRANSFER_SIZE;
266                m_atapi_xferlen = MAX_TRANSFER_SIZE;
267                m_atapi_xfermod = m_atapi_xfermod - MAX_TRANSFER_SIZE;
252268            }
253269            else
254270            {
255                state->m_atapi_xferlen = state->m_atapi_xfermod;
256                state->m_atapi_xfermod = 0;
271                m_atapi_xferlen = m_atapi_xfermod;
272                m_atapi_xfermod = 0;
257273            }
258274
259            //verboselog\\( machine, 2, "atapi_r: atapi_xferlen=%d\n", state->m_atapi_xferlen );
260            if( state->m_atapi_xferlen != 0 )
275            //verboselog\\( machine, 2, "atapi_r: atapi_xferlen=%d\n", m_atapi_xferlen );
276            if( m_atapi_xferlen != 0 )
261277            {
262278                atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ | ATAPI_STAT_SERVDSC;
263279                atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
r22523r22524
269285                atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
270286            }
271287
272            atapi_regs[ATAPI_REG_COUNTLOW] = state->m_atapi_xferlen & 0xff;
273            atapi_regs[ATAPI_REG_COUNTHIGH] = (state->m_atapi_xferlen>>8)&0xff;
288            atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff;
289            atapi_regs[ATAPI_REG_COUNTHIGH] = (m_atapi_xferlen>>8)&0xff;
274290
275291            atapi_irq(space.machine(), ASSERT_LINE);
276292        }
277293
278        if( state->m_atapi_data_ptr < state->m_atapi_data_len )
294        if( m_atapi_data_ptr < m_atapi_data_len )
279295        {
280            data = state->m_atapi_data[state->m_atapi_data_ptr++];
281            data |= ( state->m_atapi_data[state->m_atapi_data_ptr++] << 8 );
282            if( state->m_atapi_data_ptr >= state->m_atapi_data_len )
296            data = m_atapi_data[m_atapi_data_ptr++];
297            data |= ( m_atapi_data[m_atapi_data_ptr++] << 8 );
298            if( m_atapi_data_ptr >= m_atapi_data_len )
283299            {
284300
285                state->m_atapi_data_ptr = 0;
286                state->m_atapi_data_len = 0;
301                m_atapi_data_ptr = 0;
302                m_atapi_data_len = 0;
287303
288                if( state->m_atapi_xferlen == 0 )
304                if( m_atapi_xferlen == 0 )
289305                {
290306                    atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
291307                    atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_IO;
r22523r22524
330346    return data;
331347}
332348
333static WRITE32_HANDLER( atapi_w )
349WRITE32_MEMBER( gammagic_state::atapi_w )
334350{
335    gammagic_state *state = space.machine().driver_data<gammagic_state>();
336    UINT8 *atapi_regs = state->m_atapi_regs;
337    UINT8 *atapi_data = state->m_atapi_data;
351    UINT8 *atapi_regs = m_atapi_regs;
352    UINT8 *atapi_data = m_atapi_data;
338353    int reg;
339354    if (mem_mask == 0x0000ffff) // word-wide command write
340355    {
341        atapi_data[state->m_atapi_data_ptr++] = data & 0xff;
342        atapi_data[state->m_atapi_data_ptr++] = data >> 8;
356        atapi_data[m_atapi_data_ptr++] = data & 0xff;
357        atapi_data[m_atapi_data_ptr++] = data >> 8;
343358
344        if (state->m_atapi_cdata_wait)
359        if (m_atapi_cdata_wait)
345360        {
346            logerror("ATAPI: waiting, ptr %d wait %d\n", state->m_atapi_data_ptr, state->m_atapi_cdata_wait);
347            if (state->m_atapi_data_ptr == state->m_atapi_cdata_wait)
361            logerror("ATAPI: waiting, ptr %d wait %d\n", m_atapi_data_ptr, m_atapi_cdata_wait);
362            if (m_atapi_data_ptr == m_atapi_cdata_wait)
348363            {
349364                // send it to the device
350                SCSIWriteData( state->m_inserted_cdrom, atapi_data, state->m_atapi_cdata_wait );
365                SCSIWriteData( m_inserted_cdrom, atapi_data, m_atapi_cdata_wait );
351366
352367                // assert IRQ
353368                atapi_irq(space.machine(), ASSERT_LINE);
r22523r22524
357372            }
358373        }
359374
360        else if ( state->m_atapi_data_ptr == 12 )
375        else if ( m_atapi_data_ptr == 12 )
361376        {
362377            int phase;
363378            // reset data pointer for reading SCSI results
364            state->m_atapi_data_ptr = 0;
365            state->m_atapi_data_len = 0;
379            m_atapi_data_ptr = 0;
380            m_atapi_data_len = 0;
366381
367382            // send it to the SCSI device
368            SCSISetCommand( state->m_inserted_cdrom, state->m_atapi_data, 12 );
369            SCSIExecCommand( state->m_inserted_cdrom, &state->m_atapi_xferlen );
370            SCSIGetPhase( state->m_inserted_cdrom, &phase );
383            SCSISetCommand( m_inserted_cdrom, m_atapi_data, 12 );
384            SCSIExecCommand( m_inserted_cdrom, &m_atapi_xferlen );
385            SCSIGetPhase( m_inserted_cdrom, &phase );
371386
372            if (state->m_atapi_xferlen != -1)
387            if (m_atapi_xferlen != -1)
373388            {
374                        logerror("ATAPI: SCSI command %02x returned %d bytes from the device\n", atapi_data[0]&0xff, state->m_atapi_xferlen);
389                        logerror("ATAPI: SCSI command %02x returned %d bytes from the device\n", atapi_data[0]&0xff, m_atapi_xferlen);
375390
376391                // store the returned command length in the ATAPI regs, splitting into
377392                // multiple transfers if necessary
378                state->m_atapi_xfermod = 0;
379                if (state->m_atapi_xferlen > MAX_TRANSFER_SIZE)
393                m_atapi_xfermod = 0;
394                if (m_atapi_xferlen > MAX_TRANSFER_SIZE)
380395                {
381                    state->m_atapi_xfermod = state->m_atapi_xferlen - MAX_TRANSFER_SIZE;
382                    state->m_atapi_xferlen = MAX_TRANSFER_SIZE;
396                    m_atapi_xfermod = m_atapi_xferlen - MAX_TRANSFER_SIZE;
397                    m_atapi_xferlen = MAX_TRANSFER_SIZE;
383398                }
384399
385                atapi_regs[ATAPI_REG_COUNTLOW] = state->m_atapi_xferlen & 0xff;
386                atapi_regs[ATAPI_REG_COUNTHIGH] = (state->m_atapi_xferlen>>8)&0xff;
400                atapi_regs[ATAPI_REG_COUNTLOW] = m_atapi_xferlen & 0xff;
401                atapi_regs[ATAPI_REG_COUNTHIGH] = (m_atapi_xferlen>>8)&0xff;
387402
388                if (state->m_atapi_xferlen == 0)
403                if (m_atapi_xferlen == 0)
389404                {
390405                    // if no data to return, set the registers properly
391406                    atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRDY;
r22523r22524
401416                switch( phase )
402417                {
403418                case SCSI_PHASE_DATAOUT:
404                    state->m_atapi_cdata_wait = state->m_atapi_xferlen;
419                    m_atapi_cdata_wait = m_atapi_xferlen;
405420                    break;
406421                }
407422
r22523r22524
415430
416431                    case 0x45: // PLAY
417432                        atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_BSY;
418                        state->m_atapi_timer->adjust( downcast<cpu_device *>(&space->device())->cycles_to_attotime( ATAPI_CYCLES_PER_SECTOR ) );
433                        m_atapi_timer->adjust( downcast<cpu_device *>(&space->device())->cycles_to_attotime( ATAPI_CYCLES_PER_SECTOR ) );
419434                        break;
420435                }
421436
r22523r22524
466481                    atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ;
467482                    atapi_regs[ATAPI_REG_INTREASON] = ATAPI_INTREASON_COMMAND;
468483
469                    state->m_atapi_data_ptr = 0;
470                    state->m_atapi_data_len = 0;
484                    m_atapi_data_ptr = 0;
485                    m_atapi_data_len = 0;
471486
472487                    // we have no data
473                    state->m_atapi_xferlen = 0;
474                    state->m_atapi_xfermod = 0;
488                    m_atapi_xferlen = 0;
489                    m_atapi_xfermod = 0;
475490
476                    state->m_atapi_cdata_wait = 0;
491                    m_atapi_cdata_wait = 0;
477492                    break;
478493
479494                case 0xa1:  // IDENTIFY PACKET DEVICE
480495                    atapi_regs[ATAPI_REG_CMDSTATUS] = ATAPI_STAT_DRQ;
481496
482                    state->m_atapi_data_ptr = 0;
483                    state->m_atapi_data_len = 512;
497                    m_atapi_data_ptr = 0;
498                    m_atapi_data_len = 512;
484499
485500                    // we have no data
486                    state->m_atapi_xferlen = 0;
487                    state->m_atapi_xfermod = 0;
501                    m_atapi_xferlen = 0;
502                    m_atapi_xfermod = 0;
488503
489                    memset( atapi_data, 0, state->m_atapi_data_len );
504                    memset( atapi_data, 0, m_atapi_data_len );
490505
491506                    atapi_data[ 0 ^ 1 ] = 0x85; // ATAPI device, cmd set 5 compliant, DRQ within 3 ms of PACKET command
492507                    atapi_data[ 1 ^ 1 ] = 0x80; // ATAPI device, removable media
r22523r22524
532547                case 0xef:  // SET FEATURES
533548                    atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
534549
535                    state->m_atapi_data_ptr = 0;
536                    state->m_atapi_data_len = 0;
550                    m_atapi_data_ptr = 0;
551                    m_atapi_data_len = 0;
537552
538553                    atapi_irq(space.machine(), ASSERT_LINE);
539554                    break;
r22523r22524
561576   AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, 0xffffffff)
562577   AM_RANGE(0x0060, 0x006f) AM_DEVREADWRITE8("kbdc", kbdc8042_device, data_r, data_w, 0xffffffff)
563578   AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("rtc", mc146818_device, read, write, 0xffffffff)
564   AM_RANGE(0x0080, 0x009f) AM_READWRITE8_LEGACY(at_page8_r, at_page8_w, 0xffffffff)
579   AM_RANGE(0x0080, 0x009f) AM_READWRITE8(at_page8_r, at_page8_w, 0xffffffff)
565580   AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8_LEGACY("pic8259_2", pic8259_r, pic8259_w, 0xffffffff)
566   AM_RANGE(0x00c0, 0x00df) AM_DEVREADWRITE8_LEGACY("dma8237_2", at_dma8237_2_r, at_dma8237_2_w, 0xffffffff)
581   AM_RANGE(0x00c0, 0x00df) AM_READWRITE8(at_dma8237_2_r, at_dma8237_2_w, 0xffffffff)
567582   AM_RANGE(0x00e8, 0x00ef) AM_NOP
568583   AM_RANGE(0x00f0, 0x01ef) AM_NOP
569584   //AM_RANGE(0x01f0, 0x01f7) AM_READWRITE(atapi_r, atapi_w)
r22523r22524
632647   return pic8259_acknowledge(m_pic8259_1);
633648}
634649
635static MACHINE_START(gammagic)
650void gammagic_state::machine_start()
636651{
637   gammagic_state *state = machine.driver_data<gammagic_state>();
638   state->m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(gammagic_state::irq_callback),state));
639
640   state->m_pit8254 = machine.device( "pit8254" );
641   state->m_pic8259_1 = machine.device( "pic8259_1" );
642   state->m_pic8259_2 = machine.device( "pic8259_2" );
643   state->m_dma8237_1 = machine.device<i8237_device>( "dma8237_1" );
644   state->m_dma8237_2 = machine.device<i8237_device>( "dma8237_2" );
652   m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(gammagic_state::irq_callback),this));
645653}
646654
647static MACHINE_RESET( gammagic )
655void gammagic_state::machine_reset()
648656{
649   //gammagic_state *state = machine.driver_data<gammagic_state>();
650
651657   //void *cd;
652   //SCSIGetDevice( state->m_inserted_cdrom, &cd );
658   //SCSIGetDevice( m_inserted_cdrom, &cd );
653659
654660}
655661
656662
657/*static void atapi_irq(running_machine &machine, int state)
663/*void gammagic_state::atapi_irq(int state)
658664{
659    gammagic_state *drvstate = machine.driver_data<gammagic_state>();
660    pic8259_ir6_w(drvstate->m_pic8259_2, state);
665    pic8259_ir6_w(m_pic8259_2, state);
661666}
662667
663static void atapi_exit(running_machine& machine)
668void gammagic_state::atapi_exit(running_machine& machine)
664669{
665    gammagic_state *state = machine.driver_data<gammagic_state>();
666    SCSIDeleteInstance(state->m_inserted_cdrom);
670    SCSIDeleteInstance(m_inserted_cdrom);
667671
668672}
669673*/
670674
671static void atapi_init(running_machine &machine)
675void gammagic_state::atapi_init()
672676{
673   gammagic_state *state = machine.driver_data<gammagic_state>();
677   m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
678   m_atapi_regs[ATAPI_REG_ERRFEAT] = 1;
679   m_atapi_regs[ATAPI_REG_COUNTLOW] = 0x14;
680   m_atapi_regs[ATAPI_REG_COUNTHIGH] = 0xeb;
681   m_atapi_data_ptr = 0;
682   m_atapi_data_len = 0;
683   m_atapi_cdata_wait = 0;
674684
675   state->m_atapi_regs[ATAPI_REG_CMDSTATUS] = 0;
676   state->m_atapi_regs[ATAPI_REG_ERRFEAT] = 1;
677   state->m_atapi_regs[ATAPI_REG_COUNTLOW] = 0x14;
678   state->m_atapi_regs[ATAPI_REG_COUNTHIGH] = 0xeb;
679   state->m_atapi_data_ptr = 0;
680   state->m_atapi_data_len = 0;
681   state->m_atapi_cdata_wait = 0;
685   //SCSIAllocInstance( machine, &SCSIClassCr589, &m_inserted_cdrom, ":cdrom" );
682686
683   //SCSIAllocInstance( machine, &SCSIClassCr589, &state->m_inserted_cdrom, ":cdrom" );
687   //machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(atapi_exit), &machine));
684688
685   //machine.add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(atapi_exit), &machine));
686
687689}
688690
689691
r22523r22524
693695 *
694696 *************************************************************/
695697
696static WRITE_LINE_DEVICE_HANDLER( gammagic_pic8259_1_set_int_line )
698WRITE_LINE_MEMBER(gammagic_state::gammagic_pic8259_1_set_int_line)
697699{
698   gammagic_state *drvstate = device->machine().driver_data<gammagic_state>();
699   drvstate->m_maincpu->set_input_line( 0, state ? HOLD_LINE : CLEAR_LINE);
700   m_maincpu->set_input_line(0, state ? HOLD_LINE : CLEAR_LINE);
700701}
701702
702static READ8_DEVICE_HANDLER( get_slave_ack )
703READ8_MEMBER(gammagic_state::get_slave_ack)
703704{
704   gammagic_state *state = device->machine().driver_data<gammagic_state>();
705705   if (offset==2) {
706      return pic8259_acknowledge(state->m_pic8259_2);
706      return pic8259_acknowledge(m_pic8259_2);
707707   }
708708   return 0x00;
709709}
710710
711711static const struct pic8259_interface gammagic_pic8259_1_config =
712712{
713   DEVCB_LINE(gammagic_pic8259_1_set_int_line),
713   DEVCB_DRIVER_LINE_MEMBER(gammagic_state,gammagic_pic8259_1_set_int_line),
714714   DEVCB_LINE_VCC,
715   DEVCB_HANDLER(get_slave_ack)
715   DEVCB_DRIVER_MEMBER(gammagic_state,get_slave_ack)
716716};
717717
718718static const struct pic8259_interface gammagic_pic8259_2_config =
r22523r22524
768768   MCFG_CPU_ADD("maincpu", PENTIUM, 133000000) // Intel Pentium 133
769769   MCFG_CPU_PROGRAM_MAP(gammagic_map)
770770   MCFG_CPU_IO_MAP(gammagic_io)
771   MCFG_MACHINE_START(gammagic)
772   MCFG_MACHINE_RESET( gammagic )
773771   MCFG_PIT8254_ADD( "pit8254", gammagic_pit8254_config )
774772   MCFG_I8237_ADD( "dma8237_1", XTAL_14_31818MHz/3, dma8237_1_config )
775773   MCFG_I8237_ADD( "dma8237_2", XTAL_14_31818MHz/3, dma8237_2_config )
r22523r22524
791789
792790DRIVER_INIT_MEMBER(gammagic_state,gammagic)
793791{
794   atapi_init(machine());
792   atapi_init();
795793}
796794
797795ROM_START( gammagic )
trunk/src/mame/drivers/vlc.c
r22523r22524
174174
175175   UINT16* m_videoram;
176176   tilemap_t *m_bg_tilemap;
177   virtual void video_start();
178   UINT32 screen_update_nevada(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
179   virtual void palette_init();
177180
181   DECLARE_WRITE_LINE_MEMBER(nevada_rtc_irq);
182   DECLARE_READ16_MEMBER(io_board_r);
183   DECLARE_WRITE16_MEMBER(io_board_w);
184   DECLARE_WRITE16_MEMBER (io_board_x);
185   DECLARE_READ16_MEMBER( nevada_sec_r );
186   DECLARE_WRITE16_MEMBER( nevada_sec_w );
187   virtual void machine_reset();
178188
179189   DECLARE_DRIVER_INIT(nevada);
180190};
r22523r22524
245255
246256/***************************************************************************/
247257/*
248static WRITE16_HANDLER( nevada_videoram_w )
258WRITE16_MEMBER( nevada_state:nevada_videoram_w )
249259{
250260// Todo, Just for sample
251261
252    nevada_state *state = space->machine().driver_data<nevada_state>();
253    state->m_videoram[offset] = data;
254    state->m_bg_tilemap->mark_tile_dirty(offset);
262    m_videoram[offset] = data;
263    m_bg_tilemap->mark_tile_dirty(offset);
255264
256265}
257266*/
r22523r22524
263272
264273/***************************************************************************/
265274/*
266static TILE_GET_INFO( get_bg_tile_info )
275static TILE_GET_INFO_MEMBER( nevada_state::get_bg_tile_info )
267276{
268277// Todo, Just for sample
269    nevada_state *state = machine.driver_data<nevada_state>();
270
271    int attr = state->m_colorram[tile_index];
272    int code = ((attr & 1) << 8) | state->m_videoram[tile_index];
278    int attr = m_colorram[tile_index];
279    int code = ((attr & 1) << 8) | m_videoram[tile_index];
273280    int bank = (attr & 0x02) >> 1;
274281    int color = (attr & 0x3c) >> 2;
275282
276    SET_TILE_INFO(bank, code, color, 0);
283    SET_TILE_INFO_MEMBER(bank, code, color, 0);
277284
278285}
279286*/
280287
281288/***************************************************************************/
282static VIDEO_START( nevada )
289void nevada_state::video_start()
283290{
284291// todo
285292/*
286    nevada_state *state = machine.driver_data<nevada_state>();
287    state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
293    m_bg_tilemap = tilemap_create(machine(), get_bg_tile_info, tilemap_scan_rows, 8, 8, 32, 32);
288294*/
289295}
290296
291297/***************************************************************************/
292static SCREEN_UPDATE_IND16( nevada )
298UINT32 nevada_state::screen_update_nevada(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
293299{
294300   // Todo
295301/*
296    nevada_state *state = screen.machine().driver_data<nevada_state>();
297    state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0);
302    m_bg_tilemap->draw(bitmap, cliprect, 0, 0);
298303*/
299304   return 0;
300305}
301306
302307/***************************************************************************/
303static PALETTE_INIT( nevada )
308void nevada_state::palette_init()
304309{
305310   // Palette init
306311}
r22523r22524
449454/***************************************************************************/
450455/*********************    RTC SECTION       ********************************/
451456/***************************************************************************/
452static WRITE_LINE_DEVICE_HANDLER(nevada_rtc_irq)
457WRITE_LINE_MEMBER(nevada_state::nevada_rtc_irq)
453458{
454   nevada_state *drvstate = device->machine().driver_data<nevada_state>();
455   drvstate->m_maincpu->set_input_line(INPUT_LINE_IRQ1, HOLD_LINE);  // rtc interrupt on INT1
459   m_maincpu->set_input_line(INPUT_LINE_IRQ1, HOLD_LINE);  // rtc interrupt on INT1
456460}
457461
458462/***************************************************************************/
459463static MSM6242_INTERFACE( nevada_rtc_intf )
460464{
461   DEVCB_LINE(nevada_rtc_irq)
465   DEVCB_DRIVER_LINE_MEMBER(nevada_state,nevada_rtc_irq)
462466};
463467
464468/***************************************************************************/
r22523r22524
477481};
478482
479483/***************************************************************************/
480static READ16_HANDLER(io_board_r)
484READ16_MEMBER(nevada_state::io_board_r)
481485{
482486   // IO board Serial communication 0xA00000
483487   return 1;
484488}
485489/***************************************************************************/
486static WRITE16_HANDLER(io_board_w)
490WRITE16_MEMBER(nevada_state::io_board_w)
487491{
488492   // IO board Serial communication 0xA00000 on bit0
489493}
490494/***************************************************************************/
491static WRITE16_HANDLER (io_board_x)
495WRITE16_MEMBER(nevada_state::io_board_x)
492496{
493497   // IO board Serial communication 0xA80000  on bit15
494498}
495499
496500/***************************************************************************/
497static READ16_HANDLER( nevada_sec_r )
501READ16_MEMBER(nevada_state::nevada_sec_r )
498502{
499   nevada_state *state = space.machine().driver_data<nevada_state>();
500503//  D3..D0 = DOOR OPEN or Track STATE of PAL35
501504   UINT16 res;
502505      /* UPPER byte is use for input in PAL35 */
503506         // 74LS173 $bits Register used LOWER bits D3..D0 for PAL35 state and DOOR LOGIC SWITCH
504         res = pal35[state->m_datA40000 >> 8];
507         res = pal35[m_datA40000 >> 8];
505508         res = res << 8;
506         res = res | (state->m_datA40000 & 0x00FF);
509         res = res | (m_datA40000 & 0x00FF);
507510
508511   return res;
509512}
510513/***************************************************************************/
511static WRITE16_HANDLER( nevada_sec_w )
514WRITE16_MEMBER(nevada_state::nevada_sec_w )
512515{
513   nevada_state *state = space.machine().driver_data<nevada_state>();
514516   // 74LS173 $bits Register used LOWER bits D3..D0 for DOOR LOGIC SWITCH
515   state->m_datA40000 = data | 0x00f0;     // since D7..D4 are not used and are connected to PULLUP
517   m_datA40000 = data | 0x00f0;     // since D7..D4 are not used and are connected to PULLUP
516518//  popmessage("WRITE %04x %04x  ",datA40000,data);
517519}
518520
r22523r22524
602604   AM_RANGE(0x00010000, 0x00021fff) AM_RAM AM_SHARE("backup")
603605   AM_RANGE(0x00900000, 0x00900001) AM_DEVWRITE8("crtc",mc6845_device, address_w,0x00ff )
604606   AM_RANGE(0x00908000, 0x00908001) AM_DEVWRITE8("crtc",mc6845_device,register_w,0x00ff )
605   AM_RANGE(0x00a00000, 0x00a00001) AM_READWRITE_LEGACY (io_board_r,io_board_w)
606   AM_RANGE(0x00a08000, 0x00a08001) AM_WRITE_LEGACY(io_board_x)
607   AM_RANGE(0x00a00000, 0x00a00001) AM_READWRITE(io_board_r,io_board_w)
608   AM_RANGE(0x00a08000, 0x00a08001) AM_WRITE(io_board_x)
607609   AM_RANGE(0x00a10000, 0x00a10001) AM_WRITE(watchdog_reset16_w )
608610   AM_RANGE(0x00a20000, 0x00a20001) AM_DEVWRITE8_LEGACY("aysnd", ay8910_address_w,0x00ff )
609611   AM_RANGE(0x00a28000, 0x00a28001) AM_DEVWRITE8_LEGACY("aysnd", ay8910_data_w   ,0x00ff )
610612   AM_RANGE(0x00a30000, 0x00A300ff) AM_DEVREADWRITE8("rtc",msm6242_device, read, write, 0x00ff)
611   AM_RANGE(0x00a40000, 0x00A40001) AM_READWRITE_LEGACY( nevada_sec_r, nevada_sec_w)
613   AM_RANGE(0x00a40000, 0x00A40001) AM_READWRITE( nevada_sec_r, nevada_sec_w)
612614      //AM_RANGE(0x00b00000, 0x00b01fff) AM_RAM_WRITE(nevada_videoram_w) AM_BASE_MEMBER(nevada_state, m_videoram)
613615         AM_RANGE(0x00b00000, 0x00b01fff) AM_RAM // Video
614616   AM_RANGE(0x00b10000, 0x00b100ff) AM_DEVREADWRITE8_LEGACY( "duart40_68681", duart68681_r, duart68681_w, 0x00ff ) // Lower byte
r22523r22524
694696*     Machine Reset      *
695697*************************/
696698
697static MACHINE_RESET( nevada )
699 void nevada_state::machine_reset()
698700{
699   nevada_state *state = machine.driver_data<nevada_state>();
700
701   state->m_duart18_68681 = machine.device( "duart18_68681" );
702   state->m_duart39_68681 = machine.device( "duart39_68681" );
703   state->m_duart40_68681 = machine.device( "duart40_68681" );
701   m_duart18_68681 = machine().device( "duart18_68681" );
702   m_duart39_68681 = machine().device( "duart39_68681" );
703   m_duart40_68681 = machine().device( "duart40_68681" );
704704}
705705/***************************************************************************/
706706
r22523r22524
714714   MCFG_CPU_PROGRAM_MAP(nevada_map)
715715   MCFG_CPU_IO_MAP(nevada_iomap)  //0x10000 0x20000
716716
717   MCFG_MACHINE_RESET(nevada)
718         MCFG_WATCHDOG_TIME_INIT(attotime::from_msec(150))   /* 150ms Ds1232 TD to Ground */
717   MCFG_WATCHDOG_TIME_INIT(attotime::from_msec(150))   /* 150ms Ds1232 TD to Ground */
719718
720719
721720   MCFG_NVRAM_HANDLER(nevada)
r22523r22524
726725   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
727726   MCFG_SCREEN_SIZE((42+1)*8, (32+1)*8)                  /* From MC6845 init, registers 00 & 04 (programmed with value-1). */
728727   MCFG_SCREEN_VISIBLE_AREA(0*8, 31*8-1, 0*8, 31*8-1)    /* From MC6845 init, registers 01 & 06. */
729   MCFG_SCREEN_UPDATE_STATIC(nevada)
728   MCFG_SCREEN_UPDATE_DRIVER(nevada_state, screen_update_nevada)
730729
731730   MCFG_GFXDECODE(nevada)
732         MCFG_PALETTE_LENGTH(256)
733   MCFG_PALETTE_INIT(nevada)
734   MCFG_VIDEO_START(nevada)
731   MCFG_PALETTE_LENGTH(256)
735732
736733   MCFG_MC6845_ADD("crtc", MC6845, MC6845_CLOCK, mc6845_intf)
737734

Previous 199869 Revisions Next


© 1997-2024 The MAME Team