Previous 199869 Revisions Next

r17629 Tuesday 4th September, 2012 at 06:31:18 UTC by Miodrag Milanović
Added Sound Blaster 16, and proper 16 bit ISA DMA handling [Carl]
Added IBM VGA card [Carl]
[src/mess]mess.mak
[src/mess/drivers]at.c
[src/mess/includes]at.h
[src/mess/machine]at.c isa.c isa.h isa_sblaster.c isa_sblaster.h
[src/mess/video]isa_vga.c* isa_vga.h*

trunk/src/mess/machine/at.c
r17628r17629
182182READ8_MEMBER(at_state::pc_dma_read_word)
183183{
184184   UINT16 result;
185   offs_t page_offset = (((offs_t) m_dma_offset[1][m_dma_channel & 3]) << 16) & 0xFF0000;
185   offs_t page_offset = (((offs_t) m_dma_offset[1][m_dma_channel & 3]) << 16) & 0xFE0000;
186186
187187   result = space.read_word(page_offset + ( offset << 1 ) );
188188   m_dma_high_byte = result & 0xFF00;
r17628r17629
193193
194194WRITE8_MEMBER(at_state::pc_dma_write_word)
195195{
196   offs_t page_offset = (((offs_t) m_dma_offset[1][m_dma_channel & 3]) << 16) & 0xFF0000;
196   offs_t page_offset = (((offs_t) m_dma_offset[1][m_dma_channel & 3]) << 16) & 0xFE0000;
197197
198198   space.write_word(page_offset + ( offset << 1 ), m_dma_high_byte | data);
199199}
200200
201
202201READ8_MEMBER( at_state::pc_dma8237_0_dack_r ) { return m_isabus->dack_r(0); }
203202READ8_MEMBER( at_state::pc_dma8237_1_dack_r ) { return m_isabus->dack_r(1); }
204203READ8_MEMBER( at_state::pc_dma8237_2_dack_r ) { return m_isabus->dack_r(2); }
205204READ8_MEMBER( at_state::pc_dma8237_3_dack_r ) { return m_isabus->dack_r(3); }
206READ8_MEMBER( at_state::pc_dma8237_5_dack_r ) { return m_isabus->dack_r(5); }
207READ8_MEMBER( at_state::pc_dma8237_6_dack_r ) { return m_isabus->dack_r(6); }
208READ8_MEMBER( at_state::pc_dma8237_7_dack_r ) { return m_isabus->dack_r(7); }
205READ8_MEMBER( at_state::pc_dma8237_5_dack_r ) { UINT16 ret = m_isabus->dack16_r(5); m_dma_high_byte = ret & 0xff00; return ret; }
206READ8_MEMBER( at_state::pc_dma8237_6_dack_r ) { UINT16 ret = m_isabus->dack16_r(6); m_dma_high_byte = ret & 0xff00; return ret; }
207READ8_MEMBER( at_state::pc_dma8237_7_dack_r ) { UINT16 ret = m_isabus->dack16_r(7); m_dma_high_byte = ret & 0xff00; return ret; }
209208
210209
211210WRITE8_MEMBER( at_state::pc_dma8237_0_dack_w ){ m_isabus->dack_w(0, data); }
212211WRITE8_MEMBER( at_state::pc_dma8237_1_dack_w ){ m_isabus->dack_w(1, data); }
213212WRITE8_MEMBER( at_state::pc_dma8237_2_dack_w ){ m_isabus->dack_w(2, data); }
214213WRITE8_MEMBER( at_state::pc_dma8237_3_dack_w ){ m_isabus->dack_w(3, data); }
215WRITE8_MEMBER( at_state::pc_dma8237_5_dack_w ){ m_isabus->dack_w(5, data); }
216WRITE8_MEMBER( at_state::pc_dma8237_6_dack_w ){ m_isabus->dack_w(6, data); }
217WRITE8_MEMBER( at_state::pc_dma8237_7_dack_w ){ m_isabus->dack_w(7, data); }
214WRITE8_MEMBER( at_state::pc_dma8237_5_dack_w ){ m_isabus->dack16_w(5, m_dma_high_byte | data); }
215WRITE8_MEMBER( at_state::pc_dma8237_6_dack_w ){ m_isabus->dack16_w(6, m_dma_high_byte | data); }
216WRITE8_MEMBER( at_state::pc_dma8237_7_dack_w ){ m_isabus->dack16_w(7, m_dma_high_byte | data); }
218217
219218WRITE_LINE_MEMBER( at_state::at_dma8237_out_eop ) { m_isabus->eop_w(state == ASSERT_LINE ? 0 : 1 ); }
220219
trunk/src/mess/machine/isa_sblaster.c
r17628r17629
11/***************************************************************************
22
3  ISA 8 bit Creative Labs Sound Blaster Sound Card
3  ISA 8/16 bit Creative Labs Sound Blaster Sound Card
44
55  TODO:
66  - implement DAC
r17628r17629
1313#include "isa_sblaster.h"
1414#include "sound/speaker.h"
1515#include "sound/3812intf.h"
16#include "sound/262intf.h"
1617#include "sound/saa1099.h"
1718#include "sound/dac.h"
1819#include "machine/pic8259.h"
r17628r17629
3536  jumperable? normally 0x220
3637*/
3738#define ym3812_StdClock XTAL_3_579545MHz
39#define ymf262_StdClock XTAL_14_31818MHz
3840
3941static INPUT_PORTS_START( sblaster )
4042   PORT_START("pc_joy")
r17628r17629
5153   PORT_BIT(0xff,0x80,IPT_AD_STICK_Y) PORT_SENSITIVITY(100) PORT_KEYDELTA(1) PORT_MINMAX(1,0xff) PORT_CODE_DEC(KEYCODE_UP) PORT_CODE_INC(KEYCODE_DOWN) PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH) PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
5254INPUT_PORTS_END
5355
54ioport_constructor sb8_device::device_input_ports() const
56ioport_constructor sb_device::device_input_ports() const
5557{
5658   return INPUT_PORTS_NAME( sblaster );
5759}
r17628r17629
5961static const int m_cmd_fifo_length[256] =
6062{
6163/*   0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F        */
62   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* 0x */
64   -1, -1, -1, -1, 1, 3, -1, -1, -1, -1, -1,   -1, -1, -1, 2, 1, /* 0x */
6365    2, -1, -1, -1,  3, -1, -1, -1, -1, -1, -1,   -1,  1, -1, -1, -1, /* 1x */
6466   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* 2x */
6567   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* 3x */
66    2, -1, -1, -1, -1, -1, -1, -1,  3, -1, -1,   -1, -1, -1, -1, -1, /* 4x */
68    2, 3, 3, -1, -1, -1, -1, -1,  3, -1, -1,   -1, -1, -1, -1, -1, /* 4x */
6769   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* 5x */
6870   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* 6x */
6971   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* 7x */
7072   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* 8x */
7173   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* 9x */
7274   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* Ax */
73   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* Bx */
74   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,   -1, -1, -1, -1, -1, /* Cx */
75    1,  1, -1,  1, -1, -1, -1, -1,  1, -1, -1,   -1, -1, -1, -1, -1, /* Dx */
76    2,  1,  2, -1,  2, -1, -1, -1,  1, -1, -1,   -1, -1, -1, -1, -1, /* Ex */
77   -1, -1,  1, -1, -1, -1, -1, -1,  1, -1, -1,   -1, -1, -1, -1, -1  /* Fx */
75    4, -1, -1, -1, -1, -1,  4, -1,  4, -1, -1,   -1, -1, -1,  4, -1, /* Bx */
76    4, -1, -1, -1, -1, -1,  4, -1,  4, -1, -1,   -1, -1, -1,  4, -1, /* Cx */
77    1,  1, -1,  1, -1,  1,  1, -1,  1,  1,  1,   -1, -1, -1, -1, -1, /* Dx */
78    2,  1,  2,  1,  2, -1, -1, -1,  1, -1, -1,   -1, -1, -1, -1, -1, /* Ex */
79   -1, -1,  1, -1, -1, -1, -1, -1,  1, -1, -1,   -1,  1, -1, -1, -1  /* Fx */
7880};
7981
8082static const int protection_magic[4][9] =
r17628r17629
9092   NULL
9193};
9294
95static const ymf262_interface pc_ymf262_interface =
96{
97   NULL
98};
99
93100static MACHINE_CONFIG_FRAGMENT( sblaster1_0_config )
94   MCFG_SPEAKER_STANDARD_MONO("mono")
101   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
95102   MCFG_SOUND_ADD("ym3812", YM3812, ym3812_StdClock)
96103   MCFG_SOUND_CONFIG(pc_ym3812_interface)
97   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 3.00)
104   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 3.00)
105   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 3.00)
98106   MCFG_SOUND_ADD("saa1099.1", SAA1099, 4772720)
99   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
107   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
108   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
100109   MCFG_SOUND_ADD("saa1099.2", SAA1099, 4772720)
101   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
110   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 0.50)
111   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 0.50)
102112
103    MCFG_SOUND_ADD("sbdac", DAC, 0)
104    MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
113   MCFG_SOUND_ADD("sbdacl", DAC, 0)
114    MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
115   MCFG_SOUND_ADD("sbdacr", DAC, 0)
116    MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
105117MACHINE_CONFIG_END
106118
107119static MACHINE_CONFIG_FRAGMENT( sblaster1_5_config )
108   MCFG_SPEAKER_STANDARD_MONO("mono")
120   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
109121   MCFG_SOUND_ADD("ym3812", YM3812, ym3812_StdClock)
110122   MCFG_SOUND_CONFIG(pc_ym3812_interface)
111   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
123   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
124   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
112125   /* no CM/S support (empty sockets) */
113126
114    MCFG_SOUND_ADD("sbdac", DAC, 0)
115    MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
127   MCFG_SOUND_ADD("sbdacl", DAC, 0)
128    MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
129   MCFG_SOUND_ADD("sbdacr", DAC, 0)
130    MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
116131MACHINE_CONFIG_END
117132
133static MACHINE_CONFIG_FRAGMENT( sblaster_16_config )
134   MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
135   MCFG_SOUND_ADD("ymf262", YMF262, ymf262_StdClock)
136   MCFG_SOUND_CONFIG(pc_ymf262_interface)
137   MCFG_SOUND_ROUTE(0, "lspeaker", 1.00)
138   MCFG_SOUND_ROUTE(1, "rspeaker", 1.00)
139   MCFG_SOUND_ROUTE(2, "lspeaker", 1.00)
140   MCFG_SOUND_ROUTE(3, "rspeaker", 1.00)
141   MCFG_SOUND_ADD("sbdacl", DAC, 0)
142    MCFG_SOUND_ROUTE(ALL_OUTPUTS, "lspeaker", 1.00)
143   MCFG_SOUND_ADD("sbdacr", DAC, 0)
144    MCFG_SOUND_ROUTE(ALL_OUTPUTS, "rspeaker", 1.00)
145MACHINE_CONFIG_END
118146
119147static READ8_DEVICE_HANDLER( ym3812_16_r )
120148{
r17628r17629
149177   }
150178}
151179
152void sb8_device::queue(UINT8 data)
180void sb_device::queue(UINT8 data)
153181{
154182   if (m_dsp.fifo_ptr < 15)
155183   {
r17628r17629
164192   }
165193}
166194
167void sb8_device::queue_r(UINT8 data)
195void sb_device::queue_r(UINT8 data)
168196{
169197   m_dsp.rbuf_status |= 0x80;
170198
171   if (m_dsp.fifo_r_ptr < 15)
199   if (m_dsp.fifo_r_ptr < 52)
172200   {
173201      m_dsp.fifo_r[m_dsp.fifo_r_ptr] = data;
174202
r17628r17629
181209   }
182210}
183211
184UINT8 sb8_device::dequeue_r()
212UINT8 sb_device::dequeue_r()
185213{
186214   UINT8 data = m_dsp.fifo_r[0];
187215
188216   if (m_dsp.fifo_r_ptr > 0)
189217   {
190      for (int i = 0; i < 15; i++)
218      for (int i = 0; i < 51; i++)
191219         m_dsp.fifo_r[i] = m_dsp.fifo_r[i + 1];
192220
193      m_dsp.fifo_r[15] = 0;
221      m_dsp.fifo_r[51] = 0;
194222
195223      m_dsp.fifo_r_ptr--;
196224   }
r17628r17629
202230}
203231
204232
205READ8_MEMBER( sb8_device::dsp_reset_r )
233READ8_MEMBER( sb_device::dsp_reset_r )
206234{
207235//    printf("read DSP reset @ %x\n", offset);
208236   if(offset)
r17628r17629
211239   return 0xff;
212240}
213241
214WRITE8_MEMBER( sb8_device::dsp_reset_w )
242WRITE8_MEMBER( sb_device::dsp_reset_w )
215243{
216244//    printf("%02x to DSP reset @ %x\n", data, offset);
217245   if(offset)
r17628r17629
231259   }
232260
233261   m_dsp.reset_latch = data;
234   m_isa->drq1_w(0);
262   drq_w(0);
235263   m_dsp.dma_autoinit = 0;
236   m_isa->irq5_w(0);
264   irq_w(0, IRQ_ALL);
237265   m_timer->adjust(attotime::never, 0);
238266    m_dsp.d_rptr = 0;
239267    m_dsp.d_wptr = 0;
r17628r17629
243271   //printf("%02x\n",data);
244272}
245273
246READ8_MEMBER( sb8_device::dsp_data_r )
274READ8_MEMBER( sb_device::dsp_data_r )
247275{
248276//    printf("read DSP data @ %x\n", offset);
249277   if(offset)
r17628r17629
252280   return dequeue_r();
253281}
254282
255WRITE8_MEMBER( sb8_device::dsp_data_w )
283WRITE8_MEMBER( sb_device::dsp_data_w )
256284{
257285//    printf("%02x to DSP data @ %x\n", data, offset);
258286   if(offset)
r17628r17629
260288   logerror("Soundblaster DSP data port undocumented write\n");
261289}
262290
263READ8_MEMBER(sb8_device::dsp_rbuf_status_r)
291READ8_MEMBER(sb_device::dsp_rbuf_status_r)
264292{
265293//    printf("read Rbufstat @ %x\n", offset);
266294
267295    if(offset)
296   {
297      if(m_dsp.version > 0x0400)
298         irq_w(0, IRQ_DMA16);
268299      return 0xff;
300   }
269301
270302//    printf("Clear IRQ5\n");
271    m_isa->irq5_w(0);   // reading this port ACKs the card's IRQ
303    irq_w(0, IRQ_DMA8);   // reading this port ACKs the card's IRQ, 8-bit dma only?
272304
273305   return m_dsp.rbuf_status;
274306}
275307
276READ8_MEMBER(sb8_device::dsp_wbuf_status_r)
308READ8_MEMBER(sb_device::dsp_wbuf_status_r)
277309{
278310//    printf("read Wbufstat @ %x\n", offset);
279311   if(offset)
r17628r17629
282314   return m_dsp.wbuf_status;
283315}
284316
285WRITE8_MEMBER(sb8_device::dsp_rbuf_status_w)
317WRITE8_MEMBER(sb_device::dsp_rbuf_status_w)
286318{
287319//    printf("%02x to Rbufstat @ %x\n", data, offset);
288320   if(offset)
r17628r17629
291323   logerror("Soundblaster DSP Read Buffer status undocumented write\n");
292324}
293325
294void sb8_device::process_fifo(UINT8 cmd)
326void sb_device::process_fifo(UINT8 cmd)
295327{
296328   if (m_cmd_fifo_length[cmd] == -1)
297329   {
298      printf("unemulated or undefined fifo command %02x\n",cmd);
330      logerror("SB: unemulated or undefined fifo command %02x\n",cmd);
331      m_dsp.fifo_ptr = 0;
299332   }
300333   else if(m_dsp.fifo_ptr == m_cmd_fifo_length[cmd])
301334   {
r17628r17629
313346                m_dsp.dma_autoinit = 0;
314347                m_dsp.dma_timer_started = false;
315348                m_dsp.dma_throttled = false;
316                m_isa->drq1_w(1);
349                drq_w(1);
350            m_dsp.flags = 0;
317351                break;
318352
319353            case 0x1c:  // 8-bit DMA with autoinit
r17628r17629
322356                m_dsp.dma_autoinit = 1;
323357                m_dsp.dma_timer_started = false;
324358                m_dsp.dma_throttled = false;
325                m_isa->drq1_w(1);
359                drq_w(1);
360            m_dsp.flags = 0;
326361               break;
327362
328363            case 0x40:  // set time constant
r17628r17629
336371
337372            case 0xd0:  // halt 8-bit DMA
338373                m_timer->adjust(attotime::never, 0);
339                m_isa->drq1_w(0);   // drop DRQ
374                drq_w(0);   // drop DRQ
340375                m_dsp.dma_throttled = false;
341376                m_dsp.dma_timer_started = false;
342377                break;
r17628r17629
377412                m_dsp.prot_count++;
378413
379414                m_dack_out = (UINT8)(m_dsp.prot_value & 0xff);
380                m_isa->drq1_w(1);
415                drq_w(1);
381416                break;
382417
383418         case 0xe4: // write test register
r17628r17629
389424            break;
390425
391426         case 0xf2: // send PIC irq
392            m_isa->irq5_w(1);
427            irq_w(1, IRQ_DMA8);
393428            break;
394429
395430         case 0xf8: // ???
396            logerror("SB: Unknown command write 0xf8");
431            logerror("SB: Unknown command write 0xf8\n");
397432            queue_r(0);
398433            break;
434         default:
435            if(m_dsp.version >= 0x0201) // SB 2.0
436            {
437               switch(cmd)
438               {
439                  case 0xda: // stop 8-bit autoinit
440                     m_dsp.dma_autoinit = 0;
441                     break;
442               }
443            }
444            if(m_dsp.version >= 0x0301) // SB Pro 2
445            {
446               switch(cmd)
447               {
448                  case 0xe3: // copyright notice, check if in pro 2
449                     const char* copyright = "NOT COPYRIGHT (C) CREATIVE TECHNOLOGY LTD, 1992.";
450                     int j = strlen(copyright);
451                     for(int k = 4; k <= j; k++)
452                        queue_r(copyright[k]);
453                     break;
454               }
455            }
456            if(m_dsp.version >= 0x0400) // SB16
457            {
458               int mode;
459               switch(cmd)
460               {
461                  case 0x0f:  // read asp reg
462                     queue_r(0);
463                  case 0x0e:  // write asp reg
464                  case 0x02:  // get asp version
465                  case 0x04:  // set asp mode register
466                  case 0x05:  // set asp codec param
467                     logerror("SB16: unimplemented ASP command\n");
468                     break;
469                  case 0x41: // set output sample rate
470                     m_dsp.frequency = m_dsp.fifo[2] + (m_dsp.fifo[1] << 8);
471                     break;
472                  case 0x42: // set input sample rate
473                     m_dsp.adc_freq = m_dsp.fifo[2] + (m_dsp.fifo[1] << 8);
474                     break;
475                  case 0xd5: // pause 16-bit dma
476                     m_timer->adjust(attotime::never, 0);
477                     drq16_w(0);   // drop DRQ
478                     m_dsp.dma_throttled = false;
479                     m_dsp.dma_timer_started = false;
480                     break;
481                  case 0xd6: // resume 16-bit dma
482                     logerror("SB: 16-bit dma resume\n");
483                     break;
484                  case 0xd9: // stop 16-bit autoinit
485                     m_dsp.dma_autoinit = 0;
486                     break;
487                  case 0xb0:
488                  case 0xb6:
489                  case 0xc0:
490                  case 0xc6:
491                     mode = m_dsp.fifo[1];
492                     m_dsp.flags = 0;
493                     m_dsp.dma_length = (m_dsp.fifo[2] + (m_dsp.fifo[3]<<8)) + 1;
494                     if((cmd & 0xf0) == 0xb0)
495                     {
496                        m_dsp.flags |= SIXTEENBIT;
497                        m_dsp.dma_length <<= 1;
498                        drq16_w(1);
499                     }
500                     else
501                        drq_w(1);
502                     if(cmd & 0x04)
503                        m_dsp.dma_autoinit = 1;
504                     if(mode & 0x10)
505                        m_dsp.flags |= SIGNED;
506                     if(mode & 0x20)
507                     {
508                        m_dsp.flags |= STEREO;
509                        m_dsp.dma_length <<= 1;
510                     }
511                     m_dsp.dma_transferred = 0;
512                     m_dsp.dma_timer_started = false;
513                     m_dsp.dma_throttled = false;
514                     break;
515                  case 0xb8:
516                  case 0xbe:
517                  case 0xc8:
518                  case 0xce:
519                     mode = m_dsp.fifo[1];
520                     m_dsp.adc_length = (m_dsp.fifo[2] + (m_dsp.fifo[3]<<8)) + 1;
521                     m_dsp.adc_transferred = 0;
522                     if(cmd & 0x04)
523                        m_dsp.dma_autoinit = 1;
524                     if(mode & 0x20)
525                        m_dsp.adc_length <<= 1;
526                     if((cmd & 0xf0) == 0xb0)
527                     {
528                        m_dsp.adc_length <<= 1;
529                        drq16_w(1);
530                     }
531                     else
532                        drq_w(1);
533                     logerror("SB: ADC capture unimplemented\n");
534                     break;
535                  case 0xf3: // send PIC irq
536                     irq_w(1, IRQ_DMA16);
537                     break;
538                  case 0xfc:
539                     queue_r((((m_dsp.flags & SIXTEENBIT) && m_dsp.dma_autoinit) << 4) | ((!(m_dsp.flags & SIXTEENBIT) && m_dsp.dma_autoinit) << 2));
540                     break;
541               }
542            }
399543      }
400
401544      m_dsp.fifo_ptr = 0;
402545   }
403546}
404547
405WRITE8_MEMBER(sb8_device::dsp_cmd_w)
548WRITE8_MEMBER(sb_device::dsp_cmd_w)
406549{
407550//  printf("%02x to DSP command @ %x\n", data, offset);
408551
r17628r17629
415558}
416559
417560
418READ8_MEMBER ( sb8_device::joy_port_r )
561READ8_MEMBER ( sb_device::joy_port_r )
419562{
420563   UINT8 data = 0;
421564   int delta;
r17628r17629
435578   return data;
436579}
437580
581WRITE8_MEMBER ( sb_device::joy_port_w )
582{
583   m_joy_time = machine().time();
584}
438585
586READ8_MEMBER( sb16_device::mpu401_r )
587{
588   UINT8 res;
439589
440WRITE8_MEMBER ( sb8_device::joy_port_w )
590   irq_w(0, IRQ_MPU);
591   if(offset == 0) // data
592   {
593      if(m_head != m_tail)
594      {
595         res = m_mpu_queue[m_tail++];
596         m_tail %= 16;
597      }
598      else
599         res = 0xff;
600   }
601   else // status
602   {
603      res = ((m_head != m_tail)?0:0x80) | 0x3f; // bit 7 queue empty (DSR), bit 6 DRR (Data Receive Ready?)
604   }
605
606   return res;
607}
608
609WRITE8_MEMBER( sb16_device::mpu401_w )
441610{
442   m_joy_time = machine().time();
611   if(offset == 0) // data
612   {
613      logerror("SB MPU401:%02x %02x\n",offset,data);
614   }
615   else // command
616   {
617      logerror("SB MPU401:%02x %02x\n",offset,data);
618
619      switch(data)
620      {
621         case 0xff: // reset
622            irq_w(1, IRQ_MPU);
623            m_head = m_tail = 0;
624            m_mpu_queue[m_head++] = 0xfe;
625            break;
626      }
627   }
628
443629}
444630
631READ8_MEMBER( sb_device::mixer_r )
632{
633   if(offset == 0)
634      return m_mixer_index;
635   switch(m_mixer_index)
636   {
637      case 0: // reset
638         return 0;
639      default:
640         if(m_dsp.version >= 0x0400)
641         {
642            switch(m_mixer_index)
643            {
644               case 0x82: // irqs
645                  return m_dsp.irq_active;
646            }
647         }
648   }
649   logerror("SB: Unimplemented read mixer command %02x\n", m_mixer_index);
650   return 0;
651}
445652
653WRITE8_MEMBER( sb_device::mixer_w )
654{
655   if(offset == 0)
656   {
657      m_mixer_index = data;
658      return;
659   }
660   switch(m_mixer_index)
661   {
662      case 0: // reset
663         return;
664   }
665   logerror("SB: Unimplemented write mixer command %02x\n", m_mixer_index);
666   return;
667}
668
446669//**************************************************************************
447670//  GLOBAL VARIABLES
448671//**************************************************************************
449672
450673const device_type ISA8_SOUND_BLASTER_1_0 = &device_creator<isa8_sblaster1_0_device>;
451674const device_type ISA8_SOUND_BLASTER_1_5 = &device_creator<isa8_sblaster1_5_device>;
675const device_type ISA16_SOUND_BLASTER_16 = &device_creator<isa16_sblaster16_device>;
452676
453677//-------------------------------------------------
454678//  machine_config_additions - device-specific
r17628r17629
465689   return MACHINE_CONFIG_NAME( sblaster1_5_config );
466690}
467691
692machine_config_constructor isa16_sblaster16_device::device_mconfig_additions() const
693{
694   return MACHINE_CONFIG_NAME( sblaster_16_config );
695}
696
468697//**************************************************************************
469698//  LIVE DEVICE
470699//**************************************************************************
471700
472sb8_device::sb8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, const char *name) :
701sb_device::sb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, const char *name) :
473702    device_t(mconfig, type, name, tag, owner, clock),
474    device_isa8_card_interface(mconfig, *this),
475    m_dac(*this, "sbdac")
703    m_dacl(*this, "sbdacl"),
704    m_dacr(*this, "sbdacr")
476705{
477706}
478707
708sb8_device::sb8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, const char *name) :
709   sb_device(mconfig, type, tag, owner, clock, name),
710    device_isa8_card_interface(mconfig, *this)
711{
712}
479713
714sb16_device::sb16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, const char *name) :
715   sb_device(mconfig, type, tag, owner, clock, name),
716   device_isa16_card_interface(mconfig, *this)
717{
718}
719
480720//-------------------------------------------------
481721//  isa8_sblaster_device - constructor
482722//-------------------------------------------------
r17628r17629
491731{
492732}
493733
734isa16_sblaster16_device::isa16_sblaster16_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
735    sb16_device(mconfig, ISA16_SOUND_BLASTER_16, tag, owner, clock, "Sound Blaster 16")
736{
737}
738
494739//-------------------------------------------------
495740//  device_start - device-specific startup
496741//-------------------------------------------------
497742
498743void sb8_device::device_start()
499744{
500   m_isa->install_device(                   0x0200, 0x0207, 0, 0, read8_delegate(FUNC(sb8_device::joy_port_r), this), write8_delegate(FUNC(sb8_device::joy_port_w), this));
501   m_isa->install_device(                   0x0226, 0x0227, 0, 0, read8_delegate(FUNC(sb8_device::dsp_reset_r), this), write8_delegate(FUNC(sb8_device::dsp_reset_w), this));
502   m_isa->install_device(subdevice("ym3812"),    0x0228, 0x0229, 0, 0, FUNC(ym3812_16_r), FUNC(ym3812_16_w) );
503   m_isa->install_device(                   0x022a, 0x022b, 0, 0, read8_delegate(FUNC(sb8_device::dsp_data_r), this), write8_delegate(FUNC(sb8_device::dsp_data_w), this) );
504   m_isa->install_device(                   0x022c, 0x022d, 0, 0, read8_delegate(FUNC(sb8_device::dsp_wbuf_status_r), this), write8_delegate(FUNC(sb8_device::dsp_cmd_w), this) );
505   m_isa->install_device(                   0x022e, 0x022f, 0, 0, read8_delegate(FUNC(sb8_device::dsp_rbuf_status_r), this), write8_delegate(FUNC(sb8_device::dsp_rbuf_status_w), this) );
506   m_isa->install_device(subdevice("ym3812"),    0x0388, 0x0389, 0, 0, FUNC(ym3812_16_r), FUNC(ym3812_16_w) );
745   m_isa->install_device(                   0x0200, 0x0207, 0, 0, read8_delegate(FUNC(sb_device::joy_port_r), this), write8_delegate(FUNC(sb_device::joy_port_w), this));
746   m_isa->install_device(                   0x0226, 0x0227, 0, 0, read8_delegate(FUNC(sb_device::dsp_reset_r), this), write8_delegate(FUNC(sb_device::dsp_reset_w), this));
747   m_isa->install_device(                   0x022a, 0x022b, 0, 0, read8_delegate(FUNC(sb_device::dsp_data_r), this), write8_delegate(FUNC(sb_device::dsp_data_w), this) );
748   m_isa->install_device(                   0x022c, 0x022d, 0, 0, read8_delegate(FUNC(sb_device::dsp_wbuf_status_r), this), write8_delegate(FUNC(sb_device::dsp_cmd_w), this) );
749   m_isa->install_device(                   0x022e, 0x022f, 0, 0, read8_delegate(FUNC(sb_device::dsp_rbuf_status_r), this), write8_delegate(FUNC(sb_device::dsp_rbuf_status_w), this) );
750   if(m_dsp.version >= 0x0301)
751   {
752      m_isa->install_device(0x0224, 0x0225, 0, 0, read8_delegate(FUNC(sb_device::mixer_r), this), write8_delegate(FUNC(sb_device::mixer_w), this));
753      m_isa->install_device(subdevice("ymf262"),    0x0388, 0x038b, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) );
754      m_isa->install_device(subdevice("ymf262"),    0x0220, 0x0223, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) );
755      m_isa->install_device(subdevice("ymf262"),    0x0228, 0x0229, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) );
756   }
757   else
758   {
759      m_isa->install_device(subdevice("ym3812"),    0x0388, 0x0389, 0, 0, FUNC(ym3812_16_r), FUNC(ym3812_16_w) );
760      m_isa->install_device(subdevice("ym3812"),    0x0228, 0x0229, 0, 0, FUNC(ym3812_16_r), FUNC(ym3812_16_w) );
761   }
507762
508763    m_timer = timer_alloc(0, NULL);
509764}
r17628r17629
528783    sb8_device::device_start();
529784}
530785
786void sb16_device::device_start()
787{
788   m_isa->install_device(                   0x0200, 0x0207, 0, 0, read8_delegate(FUNC(sb_device::joy_port_r), this), write8_delegate(FUNC(sb_device::joy_port_w), this));
789   m_isa->install_device(                   0x0224, 0x0225, 0, 0, read8_delegate(FUNC(sb_device::mixer_r), this), write8_delegate(FUNC(sb_device::mixer_w), this));
790   m_isa->install_device(                   0x0226, 0x0227, 0, 0, read8_delegate(FUNC(sb_device::dsp_reset_r), this), write8_delegate(FUNC(sb_device::dsp_reset_w), this));
791   m_isa->install_device(                   0x022a, 0x022b, 0, 0, read8_delegate(FUNC(sb_device::dsp_data_r), this), write8_delegate(FUNC(sb_device::dsp_data_w), this) );
792   m_isa->install_device(                   0x022c, 0x022d, 0, 0, read8_delegate(FUNC(sb_device::dsp_wbuf_status_r), this), write8_delegate(FUNC(sb_device::dsp_cmd_w), this) );
793   m_isa->install_device(                   0x022e, 0x022f, 0, 0, read8_delegate(FUNC(sb_device::dsp_rbuf_status_r), this), write8_delegate(FUNC(sb_device::dsp_rbuf_status_w), this) );
794   m_isa->install_device(                   0x0330, 0x0331, 0, 0, read8_delegate(FUNC(sb16_device::mpu401_r), this), write8_delegate(FUNC(sb16_device::mpu401_w), this));
795   m_isa->install_device(subdevice("ymf262"),    0x0388, 0x038b, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) );
796   m_isa->install_device(subdevice("ymf262"),    0x0220, 0x0223, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) );
797   m_isa->install_device(subdevice("ymf262"),    0x0228, 0x0229, 0, 0, FUNC(ymf262_r), FUNC(ymf262_w) );
798
799   m_head = 0;
800   m_tail = 0;
801   m_timer = timer_alloc(0, NULL);
802}
803
804void isa16_sblaster16_device::device_start()
805{
806   set_isa_device();
807   m_isa->set_dma_channel(1, this, FALSE);
808   m_isa->set_dma_channel(5, this, FALSE);
809   m_dsp.version = 0x0405; // diagnose.exe rejects anything lower than 0x0402
810    sb16_device::device_start();
811}
812
531813//-------------------------------------------------
532814//  device_reset - device-specific reset
533815//-------------------------------------------------
534816
535void sb8_device::device_reset()
817void sb_device::device_reset()
536818{
537819    m_dsp.prot_value = 0xaa;
538820    m_dsp.prot_count = 0;
r17628r17629
541823    m_dsp.fifo_r_ptr = 0;
542824    m_dsp.wbuf_status = 0;
543825    m_dsp.rbuf_status = 0;
826   m_dsp.frequency = 22050; //?
827   m_dsp.irq_active = 0;
828   m_mixer_index = 0;
544829}
545830
546UINT8 sb8_device::dack_r(int line)
831UINT8 sb_device::dack_r(int line)
547832{
548//    printf("dack_r: line %x out = %02x\n", line, m_dack_out);
549   m_isa->drq1_w(0);   // drop DRQ?
833      m_dsp.adc_transferred++;
834   if(m_dsp.adc_transferred >= m_dsp.adc_length)
835   {
836      drq_w(0);
837
838      if (m_dsp.dma_autoinit)
839      {
840         m_dsp.adc_transferred = 0;
841            drq_w(1);
842      }
843      irq_w(1, IRQ_DMA8);
844   }
845   else
846      drq_w(1);
550847    return m_dack_out;
551848}
552849
850UINT16 sb16_device::dack16_r(int line)
851{
852   m_dsp.adc_transferred += 2;
853   if (m_dsp.adc_transferred >= m_dsp.adc_length)
854    {
855        drq16_w(0);
856
857        if (m_dsp.dma_autoinit)
858        {
859            m_dsp.adc_transferred = 0;
860         drq16_w(1);
861        }
862        irq_w(1, IRQ_DMA16);
863   }
864   else
865      drq16_w(1);
866   return m_dack_out;
867}
868
869void sb16_device::dack16_w(int line, UINT16 data)
870{
871    // set the transfer timer on the 1st byte
872    if (!m_dsp.dma_timer_started)
873    {
874        m_timer->adjust(attotime::from_hz((double)m_dsp.frequency), 0, attotime::from_hz((double)m_dsp.frequency));
875        m_dsp.d_rptr = m_dsp.d_wptr = 0;
876        m_dsp.dma_timer_started = true;
877    }
878
879    m_dsp.data[m_dsp.d_wptr++] = data & 0xff;
880    m_dsp.data[m_dsp.d_wptr++] = data >> 8;
881    m_dsp.d_wptr %= 128;
882
883    if (m_dsp.d_wptr == m_dsp.d_rptr)
884    {
885//        printf("throttling DRQ\n");
886        drq16_w(0);   // drop DRQ here
887        m_dsp.dma_throttled = true;
888    }
889
890    m_dsp.dma_transferred += 2;
891    if (m_dsp.dma_transferred >= m_dsp.dma_length)
892    {
893//        printf("DMA fill completed (%d out of %d)\n", m_dsp.dma_transferred, m_dsp.dma_length);
894
895        drq16_w(0);   // drop DRQ here
896
897        if (m_dsp.dma_autoinit)
898        {
899//            printf("autoinit reset\n");
900            m_dsp.dma_transferred = 0;
901            if (!m_dsp.dma_throttled)   // if we're not throttled, re-raise DRQ right now
902            {
903                drq16_w(1);   // raise DRQ again (page 3-15 of the Creative manual indicates auto-init will keep going until you stop it)
904            }
905        }
906
907        irq_w(1, IRQ_DMA16);   // raise IRQ as per the Creative manual
908    }
909}
910
553911/* TODO: this mustn't be instant! */
554void sb8_device::dack_w(int line, UINT8 data)
912void sb_device::dack_w(int line, UINT8 data)
555913{
556914//    printf("dack_w: line %x data %02x\n", line, data);
557915//  if(data != 0x80)
r17628r17629
571929    if (m_dsp.d_wptr == m_dsp.d_rptr)
572930    {
573931//        printf("throttling DRQ\n");
574        m_isa->drq1_w(0);   // drop DRQ here
932        drq_w(0);   // drop DRQ here
575933        m_dsp.dma_throttled = true;
576934    }
577935
r17628r17629
580938    {
581939//        printf("DMA fill completed (%d out of %d)\n", m_dsp.dma_transferred, m_dsp.dma_length);
582940
583        m_isa->drq1_w(0);   // drop DRQ here
941        drq_w(0);   // drop DRQ here
584942
585943        if (m_dsp.dma_autoinit)
586944        {
r17628r17629
588946            m_dsp.dma_transferred = 0;
589947            if (!m_dsp.dma_throttled)   // if we're not throttled, re-raise DRQ right now
590948            {
591                m_isa->drq1_w(1);   // raise DRQ again (page 3-15 of the Creative manual indicates auto-init will keep going until you stop it)
949                drq_w(1);   // raise DRQ again (page 3-15 of the Creative manual indicates auto-init will keep going until you stop it)
592950            }
593951        }
594952
595        m_isa->irq5_w(1);   // raise IRQ as per the Creative manual
953        irq_w(1, IRQ_DMA8);   // raise IRQ as per the Creative manual
596954    }
597955}
598956
599void sb8_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
957void sb_device::device_timer(emu_timer &timer, device_timer_id tid, int param, void *ptr)
600958{
601959//    printf("DMA timer expire\n");
602960
603    m_dac->write_unsigned8(m_dsp.data[m_dsp.d_rptr]);
604    m_dsp.data[m_dsp.d_rptr++] = 0x80;
961   UINT16 lsample, rsample;
962   switch (m_dsp.flags) {
963      case 0: // 8-bit unsigned mono
964         m_dacl->write_unsigned8(m_dsp.data[m_dsp.d_rptr]);
965         m_dacr->write_unsigned8(m_dsp.data[m_dsp.d_rptr]);
966            m_dsp.data[m_dsp.d_rptr++] = 0x80;
967         break;
968      case SIGNED: // 8-bit signed mono
969         m_dacl->write_unsigned8(m_dsp.data[m_dsp.d_rptr] + 128);
970         m_dacr->write_unsigned8(m_dsp.data[m_dsp.d_rptr] + 128);
971            m_dsp.data[m_dsp.d_rptr++] = 0x00;
972         break;
973      case STEREO: // 8-bit unsigned stereo
974         m_dacl->write_unsigned8(m_dsp.data[m_dsp.d_rptr]);
975          m_dsp.data[m_dsp.d_rptr++] = 0x80;
976         m_dacr->write_unsigned8(m_dsp.data[m_dsp.d_rptr]);
977          m_dsp.data[m_dsp.d_rptr++] = 0x80;
978         break;
979      case SIGNED | STEREO: // 8-bit signed stereo
980         m_dacl->write_unsigned8(m_dsp.data[m_dsp.d_rptr] + 128);
981          m_dsp.data[m_dsp.d_rptr++] = 0x00;
982         m_dacr->write_unsigned8(m_dsp.data[m_dsp.d_rptr] + 128);
983          m_dsp.data[m_dsp.d_rptr++] = 0x00;
984         break;
985      case SIXTEENBIT: // 16-bit unsigned mono
986         lsample = m_dsp.data[m_dsp.d_rptr] | (m_dsp.data[m_dsp.d_rptr+1] << 8);
987            m_dsp.data[m_dsp.d_rptr++] = 0x00;
988            m_dsp.data[m_dsp.d_rptr++] = 0x80;
989         m_dacl->write_unsigned16(lsample);
990         m_dacr->write_unsigned16(lsample);
991         break;
992      case SIXTEENBIT | SIGNED: // 16-bit signed mono
993         lsample = m_dsp.data[m_dsp.d_rptr] | (m_dsp.data[m_dsp.d_rptr+1] << 8);
994            m_dsp.data[m_dsp.d_rptr++] = 0x00;
995            m_dsp.data[m_dsp.d_rptr++] = 0x00;
996         m_dacl->write_unsigned16(lsample + 32768);
997         m_dacr->write_unsigned16(lsample + 32768);
998         break;
999      case SIXTEENBIT | STEREO: // 16-bit unsigned stereo
1000         lsample = m_dsp.data[m_dsp.d_rptr] | (m_dsp.data[m_dsp.d_rptr+1] << 8);
1001          m_dsp.data[m_dsp.d_rptr++] = 0x00;
1002            m_dsp.data[m_dsp.d_rptr++] = 0x80;
1003         m_dsp.d_rptr %= 128;
1004         rsample = m_dsp.data[m_dsp.d_rptr] | (m_dsp.data[m_dsp.d_rptr+1] << 8);
1005            m_dsp.data[m_dsp.d_rptr++] = 0x00;
1006            m_dsp.data[m_dsp.d_rptr++] = 0x80;
1007         m_dacl->write_unsigned16(lsample);
1008         m_dacr->write_unsigned16(rsample);
1009         break;
1010      case SIXTEENBIT | SIGNED | STEREO: // 16-bit signed stereo
1011         lsample = m_dsp.data[m_dsp.d_rptr] | (m_dsp.data[m_dsp.d_rptr+1] << 8);
1012          m_dsp.data[m_dsp.d_rptr++] = 0x00;
1013            m_dsp.data[m_dsp.d_rptr++] = 0x00;
1014          m_dsp.d_rptr %= 128;
1015         rsample = m_dsp.data[m_dsp.d_rptr] | (m_dsp.data[m_dsp.d_rptr+1] << 8);
1016            m_dsp.data[m_dsp.d_rptr++] = 0x00;
1017            m_dsp.data[m_dsp.d_rptr++] = 0x00;
1018         m_dacl->write_unsigned16(lsample + 32768);
1019         m_dacr->write_unsigned16(rsample + 32768);
1020         break;
1021      default: // ADPCM, ...?
1022         logerror("SB: unimplemented sample type %x", m_dsp.flags);
1023   }
6051024    m_dsp.d_rptr %= 128;
6061025
6071026    if (m_dsp.dma_throttled)
r17628r17629
6091028        if (m_dsp.d_rptr == m_dsp.d_wptr)
6101029        {
6111030//            printf("unthrottling DRQ\n");
612            m_isa->drq1_w(1);   // raise DRQ
1031            if(m_dsp.flags & SIXTEENBIT) // 16-bit audio through 8-bit dma?
1032            drq16_w(1);
1033         else
1034            drq_w(1);   // raise DRQ
6131035            m_dsp.dma_throttled = false;
6141036        }
6151037    }
trunk/src/mess/machine/isa_sblaster.h
r17628r17629
77#include "machine/isa.h"
88#include "sound/dac.h"
99
10#define SIXTEENBIT   0x01
11#define STEREO      0x02
12#define ADPCM      0x04
13#define SIGNED      0x08
14
15#define IRQ_DMA8   0x01
16#define IRQ_DMA16   0x02
17#define IRQ_MPU      0x04
18#define IRQ_ALL      0xff
19
1020//**************************************************************************
1121//  TYPE DEFINITIONS
1222//**************************************************************************
r17628r17629
1727    UINT8 rbuf_status;
1828    UINT8 wbuf_status;
1929    UINT8 fifo[16],fifo_ptr;
20    UINT8 fifo_r[16],fifo_r_ptr;
30    UINT8 fifo_r[52],fifo_r_ptr;
2131    UINT16 version;
2232    UINT8 test_reg;
2333    UINT8 speaker_on;
2434    UINT32 prot_count;
2535    INT32 prot_value;
2636    UINT32 frequency;
37   UINT32 adc_freq;
2738    UINT32 dma_length, dma_transferred;
39   UINT32 adc_length, adc_transferred;
2840    UINT8 dma_autoinit;
2941    UINT8 data[128], d_wptr, d_rptr;
3042    bool dma_timer_started;
3143    bool dma_throttled;
44   UINT8 flags;
45   UINT8 irq_active;
3246};
3347
3448// ======================> sb8_device (parent)
3549
36class sb8_device :
37      public device_t,
38      public device_isa8_card_interface
50class sb_device :
51      public device_t
3952{
4053public:
4154        // construction/destruction
42        sb8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, const char *name);
55        sb_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, const char *name);
4356
44        required_device<dac_device> m_dac;
57        required_device<dac_device> m_dacl;
58        required_device<dac_device> m_dacr;
4559
4660        void process_fifo(UINT8 cmd);
4761        void queue(UINT8 data);
r17628r17629
5872        DECLARE_WRITE8_MEMBER(dsp_cmd_w);
5973        DECLARE_READ8_MEMBER(joy_port_r);
6074        DECLARE_WRITE8_MEMBER(joy_port_w);
75      DECLARE_READ8_MEMBER(mixer_r);
76      DECLARE_WRITE8_MEMBER(mixer_w);
6177      virtual ioport_constructor device_input_ports() const;
6278
6379protected:
6480        // device-level overrides
65        virtual void device_start();
6681        virtual void device_reset();
67        virtual UINT8 dack_r(int line);
68        virtual void dack_w(int line, UINT8 data);
82        UINT8 dack_r(int line);
83        void dack_w(int line, UINT8 data);
6984        virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
85      virtual void drq16_w(int state) { }
86      virtual void drq_w(int state) { }
87      virtual void irq_w(int state, int source) { }
7088
7189        struct sb8_dsp_state m_dsp;
7290        UINT8 m_dack_out;
7391        attotime m_joy_time;
92      UINT8 m_mixer_index;
7493
75private:
7694        emu_timer *m_timer;
7795};
7896
97class sb8_device : public sb_device,
98                public device_isa8_card_interface
99{
100public:
101        // construction/destruction
102        sb8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, const char *name);
103protected:
104        virtual void device_start();
105      virtual void drq_w(int state) { m_isa->drq1_w(state); }
106      virtual void irq_w(int state, int source) { m_isa->irq5_w(state); }
107        virtual UINT8 dack_r(int line) { return sb_device::dack_r(line); }
108        virtual void dack_w(int line, UINT8 data) { sb_device::dack_w(line, data); }
109};
110
79111class isa8_sblaster1_0_device : public sb8_device
80112{
81113public:
r17628r17629
108140        // internal state
109141};
110142
143class sb16_device : public sb_device,
144                public device_isa16_card_interface
145{
146public:
147        // construction/destruction
148        sb16_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, const char *name);
149        DECLARE_READ8_MEMBER(mpu401_r);
150        DECLARE_WRITE8_MEMBER(mpu401_w);
151protected:
152        virtual void device_start();
153      virtual UINT16 dack16_r(int line);
154        virtual UINT8 dack_r(int line) { return sb_device::dack_r(line); }
155        virtual void dack_w(int line, UINT8 data) { sb_device::dack_w(line, data); }
156      virtual void dack16_w(int line, UINT16 data);
157      virtual void drq16_w(int state) { m_isa->drq5_w(state); }
158      virtual void drq_w(int state) { m_isa->drq1_w(state); }
159      virtual void irq_w(int state, int source) { (state?m_dsp.irq_active|=source:m_dsp.irq_active&=~source); m_isa->irq5_w(m_dsp.irq_active&&1);  }
160private:
161      UINT8 m_mpu_queue[16];
162      UINT8 m_tail;
163      UINT8 m_head;
164};
165
166class isa16_sblaster16_device : public sb16_device
167{
168public:
169      // construction/destruction
170        isa16_sblaster16_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
171
172      // optional information overrides
173      virtual machine_config_constructor device_mconfig_additions() const;
174protected:
175        // device-level overrides
176        virtual void device_start();
177      virtual void device_config_complete() { m_shortname = "isa_sblaster_16"; }
178private:
179        // internal state
180};
181
111182// device type definition
112183extern const device_type ISA8_SOUND_BLASTER_1_0;
113184extern const device_type ISA8_SOUND_BLASTER_1_5;
185extern const device_type ISA16_SOUND_BLASTER_16;
114186
115187#endif  /* __ISA_SOUND_BLASTER_H__ */
trunk/src/mess/machine/isa.c
r17628r17629
640640WRITE_LINE_MEMBER( isa16_device::drq6_w ) { m_out_drq6_func(state); }
641641WRITE_LINE_MEMBER( isa16_device::drq7_w ) { m_out_drq7_func(state); }
642642
643UINT16 isa16_device::dack16_r(int line)
644{
645   if (m_dma_device[line])
646      return dynamic_cast<device_isa16_card_interface *>(m_dma_device[line])->dack16_r(line);
647   return 0xffff;
648}
649
650void isa16_device::dack16_w(int line,UINT16 data)
651{
652   if (m_dma_device[line])
653      return dynamic_cast<device_isa16_card_interface *>(m_dma_device[line])->dack16_w(line,data);
654}
655
643656//-------------------------------------------------
644657//  device_isa16_card_interface - constructor
645658//-------------------------------------------------
r17628r17629
662675{
663676   m_isa = dynamic_cast<isa16_device *>(m_isa_dev);
664677}
678
679UINT16 device_isa16_card_interface::dack16_r(int line)
680{
681   return 0;
682}
683
684void device_isa16_card_interface::dack16_w(int line,UINT16 data)
685{
686}
trunk/src/mess/machine/isa.h
r17628r17629
178178   void nmi();
179179   void set_nmi_state(bool enabled) { m_nmi_enabled = enabled; }
180180
181   void set_dma_channel(UINT8 channel, device_isa8_card_interface *dev, bool do_eop);
181   virtual void set_dma_channel(UINT8 channel, device_isa8_card_interface *dev, bool do_eop);
182182protected:
183183   void install_space(address_spacenum spacenum, device_t *dev, offs_t start, offs_t end, offs_t mask, offs_t mirror, read8_device_func rhandler, const char* rhandler_name, write8_device_func whandler, const char *whandler_name);
184184   void install_space(address_spacenum spacenum, offs_t start, offs_t end, offs_t mask, offs_t mirror, read8_space_func rhandler, const char* rhandler_name, write8_space_func whandler, const char *whandler_name);
r17628r17629
307307   DECLARE_WRITE_LINE_MEMBER( drq6_w );
308308   DECLARE_WRITE_LINE_MEMBER( drq7_w );
309309
310   UINT16 dack16_r(int line);
311   void dack16_w(int line,UINT16 data);
312
310313protected:
311314   // device-level overrides
312315   virtual void device_start();
r17628r17629
340343   // construction/destruction
341344   device_isa16_card_interface(const machine_config &mconfig, device_t &device);
342345   virtual ~device_isa16_card_interface();
346   virtual UINT16 dack16_r(int line);
347   virtual void dack16_w(int line,UINT16 data);
343348
344349   void set_isa_device();
345350   isa16_device  *m_isa;
trunk/src/mess/includes/at.h
r17628r17629
2626#include "video/pc_cga.h"
2727#include "video/isa_cga.h"
2828#include "video/isa_ega.h"
29#include "video/isa_vga.h"
2930#include "video/isa_svga_cirrus.h"
3031#include "video/isa_svga_s3.h"
3132#include "video/isa_svga_tseng.h"
trunk/src/mess/video/isa_vga.c
r0r17629
1/***************************************************************************
2
3  ISA VGA wrapper
4
5***************************************************************************/
6
7#include "emu.h"
8#include "isa_vga.h"
9#include "video/pc_vga.h"
10
11ROM_START( ibm_vga )
12   ROM_REGION(0x8000,"ibm_vga", 0)
13   ROM_LOAD("ibm-vga.bin", 0x00000, 0x8000, BAD_DUMP CRC(74e3fadb) SHA1(dce6491424f1726203776dfae9a967a98a4ba7b5) )
14ROM_END
15
16//**************************************************************************
17//  GLOBAL VARIABLES
18//**************************************************************************
19
20const device_type ISA8_VGA = &device_creator<isa8_vga_device>;
21
22
23//-------------------------------------------------
24//  machine_config_additions - device-specific
25//  machine configurations
26//-------------------------------------------------
27
28machine_config_constructor isa8_vga_device::device_mconfig_additions() const
29{
30   return MACHINE_CONFIG_NAME( pcvideo_vga_isa );
31}
32
33//-------------------------------------------------
34//  rom_region - device-specific ROM region
35//-------------------------------------------------
36
37const rom_entry *isa8_vga_device::device_rom_region() const
38{
39   return ROM_NAME( ibm_vga );
40}
41
42//**************************************************************************
43//  LIVE DEVICE
44//**************************************************************************
45
46//-------------------------------------------------
47//  isa8_vga_device - constructor
48//-------------------------------------------------
49
50isa8_vga_device::isa8_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
51        device_t(mconfig, ISA8_VGA, "IBM VGA Graphics Card", tag, owner, clock),
52      device_isa8_card_interface(mconfig, *this)
53{
54   m_shortname = "ibm_vga";
55}
56
57//-------------------------------------------------
58//  device_start - device-specific startup
59//-------------------------------------------------
60static READ8_HANDLER( input_port_0_r ) { return 0xff; } //return space->machine().root_device().ioport("IN0")->read(); }
61
62void isa8_vga_device::device_start()
63{
64   set_isa_device();
65
66   video_start_vga( machine() );
67
68   pc_vga_init(machine(), input_port_0_r, NULL);
69
70   int i;
71   for (i = 0; i < 0x100; i++)
72      palette_set_color_rgb(machine(), i, 0, 0, 0);
73   pc_video_start(machine());
74
75   m_isa->install_rom(this, 0xc0000, 0xc7fff, 0, 0, "ibm_vga", "ibm_vga");
76
77   m_isa->install_device(0x3b0, 0x3bf, 0, 0, FUNC(vga_port_03b0_r), FUNC(vga_port_03b0_w));
78   m_isa->install_device(0x3c0, 0x3cf, 0, 0, FUNC(vga_port_03c0_r), FUNC(vga_port_03c0_w));
79   m_isa->install_device(0x3d0, 0x3df, 0, 0, FUNC(vga_port_03d0_r), FUNC(vga_port_03d0_w));
80
81   m_isa->install_memory(0xa0000, 0xbffff, 0, 0, FUNC(vga_mem_r), FUNC(vga_mem_w));
82}
83
84//-------------------------------------------------
85//  device_reset - device-specific reset
86//-------------------------------------------------
87
88void isa8_vga_device::device_reset()
89{
90   pc_vga_reset(machine());
91}
trunk/src/mess/video/isa_vga.h
r0r17629
1#pragma once
2
3#ifndef __ISA_VGA_H__
4#define __ISA_VGA_H__
5
6#include "emu.h"
7#include "machine/isa.h"
8
9//**************************************************************************
10//  TYPE DEFINITIONS
11//**************************************************************************
12
13// ======================> isa8_vga_device
14
15class isa8_vga_device :
16      public device_t,
17      public device_isa8_card_interface
18{
19public:
20        // construction/destruction
21        isa8_vga_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
22
23      // optional information overrides
24      virtual machine_config_constructor device_mconfig_additions() const;
25      virtual const rom_entry *device_rom_region() const;
26protected:
27        // device-level overrides
28        virtual void device_start();
29        virtual void device_reset();
30};
31
32
33// device type definition
34extern const device_type ISA8_VGA;
35
36#endif  /* __ISA_VGA_H__ */
trunk/src/mess/drivers/at.c
r17628r17629
350350   SLOT_INTERFACE("mda", ISA8_MDA)
351351   SLOT_INTERFACE("cga", ISA8_CGA)
352352   SLOT_INTERFACE("ega", ISA8_EGA)
353   SLOT_INTERFACE("vga", ISA8_VGA)
353354   SLOT_INTERFACE("svga_et4k", ISA8_SVGA_ET4K)
354355   SLOT_INTERFACE("svga_dm",ISA8_SVGA_CIRRUS)
355356   SLOT_INTERFACE("com", ISA8_COM)
r17628r17629
373374   SLOT_INTERFACE("ne2000", NE2000)
374375   SLOT_INTERFACE("aha1542", AHA1542)
375376   SLOT_INTERFACE("gus",ISA16_GUS)
377   SLOT_INTERFACE("sblaster_16", ISA16_SOUND_BLASTER_16)
376378   SLOT_INTERFACE("svga_s3",ISA16_SVGA_S3)
377379SLOT_INTERFACE_END
378380
r17628r17629
906908*/
907909ROM_START( i8555081 )
908910   ROM_REGION(0x1000000,"maincpu", 0)
909   ROM_LOAD16_BYTE("33f8145.zm40", 0xe0000, 0x10000, CRC(0895894c) SHA1(7cee77828867ad1bdbe0ac223bc25d23c65b28a0))
911   ROM_LOAD16_BYTE("33f8145.zm40", 0xe0001, 0x10000, CRC(0895894c) SHA1(7cee77828867ad1bdbe0ac223bc25d23c65b28a0))
912   ROM_RELOAD(0xfe0001, 0x10000)
913   ROM_LOAD16_BYTE("33f8146.zm41", 0xe0000, 0x10000, CRC(c6020680) SHA1(b25a64e4b2dca07c567648401100e04e89bbcddb))
910914   ROM_RELOAD(0xfe0000, 0x10000)
911   ROM_LOAD16_BYTE("33f8146.zm41", 0xe0001, 0x10000, CRC(c6020680) SHA1(b25a64e4b2dca07c567648401100e04e89bbcddb))
912   ROM_RELOAD(0xfe0001, 0x10000)
913915ROM_END
914916
915917/*
trunk/src/mess/mess.mak
r17628r17629
137137SOUNDS += YM3812
138138SOUNDS += YM3526
139139#SOUNDS += Y8950
140#SOUNDS += YMF262
140SOUNDS += YMF262
141141#SOUNDS += YMF271
142142#SOUNDS += YMF278B
143143#SOUNDS += YMZ280B
r17628r17629
14491449   $(MESS_VIDEO)/isa_mda.o      \
14501450   $(MESS_VIDEO)/crtc_ega.o   \
14511451   $(MESS_VIDEO)/isa_ega.o      \
1452   $(MESS_VIDEO)/isa_vga.o      \
14521453   $(MESS_VIDEO)/isa_svga_tseng.o      \
14531454   $(MESS_VIDEO)/isa_svga_s3.o   \
14541455   $(MESS_VIDEO)/isa_svga_cirrus.o   \

Previous 199869 Revisions Next


© 1997-2024 The MAME Team