Previous 199869 Revisions Next

r19135 Sunday 25th November, 2012 at 04:17:35 UTC by R. Belmont
esq5505: Correct floppy hookup for VFX-SD and later, better documentation from schematics. (nw)
[src/mess/drivers]esq5505.c

trunk/src/mess/drivers/esq5505.c
r19134r19135
2929
3030    68681 GPIO lines (from VFX schematics):
3131    I0: CARTIN (if cartridge is present)
32
32
3333    O0: "AN0"
3434    O1: "AN1"
3535    O2: "AN2" (disk side select on EPS/EPS-16)
3636    O6: To ESPHALT pin on ES5510
3737    O7: "SACK"
3838 
39    VFX-SD / SD-1 / SD-1 32 panel button codes:
39    VFX / VFX-SD / SD-1 / SD-1 32 panel button codes:
4040   2 = PROG-CNTL
4141   3 = WRITE EDIT PROGRAM
4242   4 = WAVE
r19134r19135
5151   14 = ENV2
5252   15 = FILTER
5353   16 = ENV3
54   17 = OUTPUT
55   20 = MASTER
54    17 = OUTPUT
55    18 = ERROR 20 (VFX) / SEQUENCER MUST BE LOADED (VFX-SD/SD-1)
56    19 = ?
57    20 = MASTER
58    21 = STORAGE
59    22 = ?
60    23 = ?
5661   24 = MIDI
5762   25 = INT9
5863   26 = PSEL
r19134r19135
6065   28 = EFFECT
6166   29 = INT9
6267   30 = TRAX
63   31 = TRAX (page 2)
68    31 = TRAX (page 2)
69    32 = ERROR 20 (VFX) / CLICK-REC
70    33 = ERROR 20 (VFX) / LOCATE
6471   34 = INT8
6572   35 = INT7
6673   36 = VOL
r19134r19135
6875   38 = TIMB
6976   39 = ZONE
7077   40 = XPOS
71   41 = RELS
78    41 = RELS
79    42 = SOFT TOP CENTER
80    43 = SOFT TOP RIGHT
81    44 = SOFT BOTTOM CENTER
82    45 = SOFT BOTTOM RIGHT
83    46 = INT3
84    47 = INT4
85    48 = INT5
86    49 = INT6
87    50 = SOFT BOTTOM LEFT
88    51 = ERROR 20 (VFX) / SEQ0 $SONG-00
89    52 = BANK? (toggles INTx, RM0x, RM1x)
90    53 = INT0
91    54 = PSET
92    55 = RM10
93    56 = RM11
94    57 = RM12
95    58 = SOFT TOP LEFT
96    59 = ERROR 20 (VFX) / EDIT SEQUENCE
97    60 = ERROR 20 (VFX) / SONG NOT SELECTED
98    61 = ERROR 20 (VFX) / EDIT TRACK
99    62 = DATA INCREMENT
100    63 = DATA DECREMENT
72101 
73102***************************************************************************/
74103
r19134r19135
90119#define SQ1     (2)
91120
92121#define KEYBOARD_HACK (1)   // turn on to play the SQ-1, SD-1, and SD-1 32-voice: Z and X are program up/down, A/S/D/F/G/H/J/K/L and Q/W/E/R/T/Y/U play notes
122#define HACK_VIA_MIDI   (1)
93123
94124#if KEYBOARD_HACK
125#if HACK_VIA_MIDI
95126static int program = 0;
96127#endif
128#endif
97129
98130class esq5505_state : public driver_device
99131{
r19134r19135
274306   AM_RANGE(0x260000, 0x2601ff) AM_READWRITE(es5510_dsp_r, es5510_dsp_w)
275307    AM_RANGE(0x280000, 0x28001f) AM_DEVREADWRITE8_LEGACY("duart", duart68681_r, duart68681_w, 0x00ff)
276308    AM_RANGE(0x2c0000, 0x2c0007) AM_DEVREADWRITE8("wd1772", wd1772_t, read, write, 0x00ff)
277    AM_RANGE(0x340000, 0x3bffff) AM_RAM // sequencer memory?
309    AM_RANGE(0x330000, 0x3bffff) AM_RAM // sequencer memory?
278310    AM_RANGE(0xc00000, 0xc3ffff) AM_ROM AM_REGION("osrom", 0)
279311    AM_RANGE(0xff0000, 0xffffff) AM_RAM AM_SHARE("osram")
280312ADDRESS_MAP_END
r19134r19135
290322    AM_RANGE(0xff0000, 0xffffff) AM_RAM AM_SHARE("osram")
291323ADDRESS_MAP_END
292324
325static void esq5505_otis_irq(device_t *device, int state)
326{
327   #if 0   // 5505/06 IRQ generation needs (more) work
328    esq5505_state *esq5505 = device->machine().driver_data<esq5505_state>();
329    esq5505->m_maincpu->set_input_line(1, state);
330   #endif
331}
332
293333static UINT16 esq5505_read_adc(device_t *device)
294334{
295335    esq5505_state *state = device->machine().driver_data<esq5505_state>();
296336
297337    // bit 0 controls reading the battery; other bits likely
298338    // control other analog sources
339   // VFX & SD-1 32 voice schematics agree:
340   // bit 0: reference
341   // bit 1: battery
342   // bit 2: vol
343   // bit 3: pedal
344   // bit 4: val
345   // bit 5: mod wheel
346   // bit 6: psel
347   // bit 7: pitch wheel
348   switch ((state->m_duart_io & 7) ^ 7)
349   {
350      case 0:      // vRef to check battery
351         return 0x5b00;
352
353      case 1:    // battery voltage
354         return 0x7f00;
355
356         return 0x7f00;
357
358      case 3: // pedal
359      case 5: // mod wheel
360         return 0;
361
362      case 7: // pitch wheel
363         return 0x3f00;
364
365      case 2:   // volume control
366      case 4: // val (?)
367      case 6: // psel
368         return 0x7f00;
369   }
370
299371    if (state->m_duart_io & 1)
300372    {
301373        return 0x5b00;              // vRef
r19134r19135
313385//    printf("\nDUART IRQ: state %d vector %d\n", state, vector);
314386    if (state == ASSERT_LINE)
315387    {
316        esq5505->m_maincpu->set_input_line_vector(1, vector);
317        esq5505->m_maincpu->set_input_line(1, ASSERT_LINE);
388        esq5505->m_maincpu->set_input_line_vector(2, vector);
389        esq5505->m_maincpu->set_input_line(2, ASSERT_LINE);
318390    }
319391    else
320392    {
321        esq5505->m_maincpu->set_input_line(1, CLEAR_LINE);
393        esq5505->m_maincpu->set_input_line(2, CLEAR_LINE);
322394    }
323395};
324396
r19134r19135
332404static void duart_output(device_t *device, UINT8 data)
333405{
334406    esq5505_state *state = device->machine().driver_data<esq5505_state>();
335   floppy_connector *con = device->machine().device<floppy_connector>("fd0");
407   floppy_connector *con = device->machine().device<floppy_connector>("wd1772:0");
336408   floppy_image_device *floppy = con ? con->get_device() : 0;
337409
338410    state->m_duart_io = data;
339411
412   /*
413      ESP:
414   
415       VFX:
416       bits 0/1/2 = analog sel
417       bit 6 = ESPHALT
418       bit 7 = SACK (?)
419   
420       SD-1 32:
421       bits 0/1/2 = analog sel
422       bit 3 = SSEL (disk side)
423       bit 4 = DSEL (drive select?)
424       bit 6 = ESPHALT
425       bit 7 = SACK (?)
426   */
427
340428    if (floppy)
341429    {
342        floppy->ss_w((data & 2)>>1);
430      if (state->m_system_type == EPS)
431      {
432         floppy->ss_w((data & 2)>>1);
433      }
434      else
435      {
436         floppy->ss_w(((data & 8)>>3)^1);
437      }
343438    }
344439
345440//    printf("DUART output: %02x (PC=%x)\n", data, state->m_maincpu->pc());
r19134r19135
439534#if KEYBOARD_HACK
440535INPUT_CHANGED_MEMBER(esq5505_state::key_stroke)
441536{
442    #if 1   // MIDI
537    #if HACK_VIA_MIDI
443538    // send a MIDI Note On
444539    if (oldval == 0 && newval == 1)
445540    {
r19134r19135
487582    }
488583    #else
489584   int val = (UINT8)(FPTR)param;
490   val += 50;
491    if (oldval == 0 && newval == 1)
585   val += 32;
586   if (oldval == 0 && newval == 1)
492587    {
493        printf("key on %d\n", val&0x7f);
588        printf("key pressed %d\n", val&0x7f);
494589        duart68681_rx_data(m_duart, 1, val);
495590        duart68681_rx_data(m_duart, 1, 0x00);
496591    }
r19134r19135
519614{
520615   "waverom",   /* Bank 0 */
521616   "waverom2",   /* Bank 1 */
522   NULL,      /* irq */
617   esq5505_otis_irq, /* irq */
523618    esq5505_read_adc
524619};
525620
r19134r19135
585680
586681static INPUT_PORTS_START( vfx )
587682#if KEYBOARD_HACK
683#if HACK_VIA_MIDI
588684    PORT_START("KEY0")
589685    PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x40)
590686    PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x41)
r19134r19135
606702    PORT_START("KEY1")
607703    PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x0)
608704    PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x1)
705#else
706    PORT_START("KEY0")
707    PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x80)
708    PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x81)
709    PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x82)
710    PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x83)
711    PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x84)
712    PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x85)
713    PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x86)
714    PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x87)
715    PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x88)
716    PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x89)
717    PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x8a)
718    PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x8b)
719    PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x8c)
720    PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x8d)
721    PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x8e)
722    PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x8f)
723
724    PORT_START("KEY1")
725    PORT_BIT(0x0001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x90)
726    PORT_BIT(0x0002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x91)
727    PORT_BIT(0x0004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x92)
728    PORT_BIT(0x0008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x93)
729    PORT_BIT(0x0010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x94)
730    PORT_BIT(0x0020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x95)
731    PORT_BIT(0x0040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x96)
732    PORT_BIT(0x0080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x97)
733    PORT_BIT(0x0100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x98)
734    PORT_BIT(0x0200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x99)
735    PORT_BIT(0x0400, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x9a)
736    PORT_BIT(0x0800, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x9b)
737    PORT_BIT(0x1000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x9c)
738    PORT_BIT(0x2000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x9d)
739    PORT_BIT(0x4000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x9e)
740    PORT_BIT(0x8000, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHANGED_MEMBER(DEVICE_SELF, esq5505_state, key_stroke, 0x9f)
609741#endif
742#endif
610743INPUT_PORTS_END
611744
612745ROM_START( vfx )
r19134r19135
687820
688821    ROM_REGION(0x200000, "waverom", ROMREGION_ERASE00)  // EPS-16 has no ROM sounds
689822
690    ROM_REGION(0x80000, "nibbles", ROMREGION_ERASE00)
823    ROM_REGION(0x200000, "waverom2", ROMREGION_ERASE00)
691824ROM_END
692825
693826DRIVER_INIT_MEMBER(esq5505_state,common)
694827{
695
696828    m_system_type = GENERIC;
697829    m_duart_io = 0;
698830

Previous 199869 Revisions Next


© 1997-2024 The MAME Team