Previous 199869 Revisions Next

r20864 Saturday 9th February, 2013 at 13:37:18 UTC by Wilbert Pol
(MESS) pmd85.c: Reduce tagmap lookups (nw)
[src/mess/includes]pmd85.h
[src/mess/machine]pmd85.c
[src/mess/video]pmd85.c

trunk/src/mess/machine/pmd85.c
r20863r20864
1010***************************************************************************/
1111
1212#include "emu.h"
13#include "imagedev/cassette.h"
1413#include "cpu/i8085/i8085.h"
15#include "machine/i8255.h"
1614#include "includes/pmd85.h"
17#include "machine/i8251.h"
1815#include "machine/pit8253.h"
19#include "machine/ram.h"
2016
2117
22
2318enum {PMD85_LED_1, PMD85_LED_2, PMD85_LED_3};
2419enum {PMD85_1, PMD85_2, PMD85_2A, PMD85_2B, PMD85_3, ALFA, MATO, C2717};
2520
2621
2722
28static void pmd851_update_memory(running_machine &machine)
23void pmd85_state::pmd851_update_memory()
2924{
30   pmd85_state *state = machine.driver_data<pmd85_state>();
31   address_space& space = machine.device("maincpu")->memory().space(AS_PROGRAM);
32   UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer();
25   address_space& space = m_maincpu->space(AS_PROGRAM);
26   UINT8 *ram = m_ram->pointer();
3327
34   if (state->m_startup_mem_map)
28   if (m_startup_mem_map)
3529   {
36      UINT8 *mem = state->memregion("maincpu")->base();
30      UINT8 *mem = m_region_maincpu->base();
3731
3832      space.unmap_write(0x0000, 0x0fff);
3933      space.nop_write(0x1000, 0x1fff);
r20863r20864
4337      space.nop_read(0x1000, 0x1fff);
4438      space.nop_read(0x3000, 0x3fff);
4539
46      state->membank("bank1")->set_base(mem + 0x010000);
47      state->membank("bank3")->set_base(mem + 0x010000);
48      state->membank("bank5")->set_base(ram + 0xc000);
40      m_bank1->set_base(mem + 0x010000);
41      m_bank3->set_base(mem + 0x010000);
42      m_bank5->set_base(ram + 0xc000);
4943
50      state->membank("bank6")->set_base(mem + 0x010000);
51      state->membank("bank7")->set_base(mem + 0x010000);
52      state->membank("bank8")->set_base(ram + 0xc000);
44      m_bank6->set_base(mem + 0x010000);
45      m_bank7->set_base(mem + 0x010000);
46      m_bank8->set_base(ram + 0xc000);
5347   }
5448   else
5549   {
r20863r20864
6256      space.install_read_bank(0x1000, 0x1fff, "bank2");
6357      space.install_read_bank(0x3000, 0x3fff, "bank4");
6458
65      state->membank("bank1")->set_base(ram);
66      state->membank("bank2")->set_base(ram + 0x1000);
67      state->membank("bank3")->set_base(ram + 0x2000);
68      state->membank("bank4")->set_base(ram + 0x3000);
69      state->membank("bank5")->set_base(ram + 0x4000);
59      m_bank1->set_base(ram);
60      m_bank2->set_base(ram + 0x1000);
61      m_bank3->set_base(ram + 0x2000);
62      m_bank4->set_base(ram + 0x3000);
63      m_bank5->set_base(ram + 0x4000);
7064   }
7165}
7266
73static void pmd852a_update_memory(running_machine &machine)
67void pmd85_state::pmd852a_update_memory()
7468{
75   pmd85_state *state = machine.driver_data<pmd85_state>();
76   address_space& space = machine.device("maincpu")->memory().space(AS_PROGRAM);
77   UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer();
69   address_space& space = m_maincpu->space(AS_PROGRAM);
70   UINT8 *ram = m_ram->pointer();
7871
79   if (state->m_startup_mem_map)
72   if (m_startup_mem_map)
8073   {
81      UINT8 *mem = state->memregion("maincpu")->base();
74      UINT8 *mem = m_region_maincpu->base();
8275
8376      space.unmap_write(0x0000, 0x0fff);
8477      space.unmap_write(0x2000, 0x2fff);
8578
86      state->membank("bank1")->set_base(mem + 0x010000);
87      state->membank("bank2")->set_base(ram + 0x9000);
88      state->membank("bank3")->set_base(mem + 0x010000);
89      state->membank("bank4")->set_base(ram + 0xb000);
90      state->membank("bank5")->set_base(ram + 0xc000);
91      state->membank("bank6")->set_base(mem + 0x010000);
92      state->membank("bank7")->set_base(ram + 0x9000);
93      state->membank("bank8")->set_base(mem + 0x010000);
94      state->membank("bank9")->set_base(ram + 0xb000);
95      state->membank("bank10")->set_base(ram + 0xc000);
79      m_bank1->set_base(mem + 0x010000);
80      m_bank2->set_base(ram + 0x9000);
81      m_bank3->set_base(mem + 0x010000);
82      m_bank4->set_base(ram + 0xb000);
83      m_bank5->set_base(ram + 0xc000);
84      m_bank6->set_base(mem + 0x010000);
85      m_bank7->set_base(ram + 0x9000);
86      m_bank8->set_base(mem + 0x010000);
87      m_bank9->set_base(ram + 0xb000);
88      m_bank10->set_base(ram + 0xc000);
9689
9790   }
9891   else
r20863r20864
10093      space.install_write_bank(0x0000, 0x0fff, "bank1");
10194      space.install_write_bank(0x2000, 0x2fff, "bank3");
10295
103      state->membank("bank1")->set_base(ram);
104      state->membank("bank2")->set_base(ram + 0x1000);
105      state->membank("bank3")->set_base(ram + 0x2000);
106      state->membank("bank4")->set_base(ram + 0x5000);
107      state->membank("bank5")->set_base(ram + 0x4000);
96      m_bank1->set_base(ram);
97      m_bank2->set_base(ram + 0x1000);
98      m_bank3->set_base(ram + 0x2000);
99      m_bank4->set_base(ram + 0x5000);
100      m_bank5->set_base(ram + 0x4000);
108101   }
109102}
110103
111static void pmd853_update_memory(running_machine &machine)
104void pmd85_state::pmd853_update_memory()
112105{
113   pmd85_state *state = machine.driver_data<pmd85_state>();
114   UINT8 *mem = state->memregion("maincpu")->base();
115   UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer();
106   UINT8 *mem = m_region_maincpu->base();
107   UINT8 *ram = m_ram->pointer();
116108
117   if (state->m_startup_mem_map)
109   if (m_startup_mem_map)
118110   {
119      state->membank("bank1")->set_base(mem + 0x010000);
120      state->membank("bank2")->set_base(mem + 0x010000);
121      state->membank("bank3")->set_base(mem + 0x010000);
122      state->membank("bank4")->set_base(mem + 0x010000);
123      state->membank("bank5")->set_base(mem + 0x010000);
124      state->membank("bank6")->set_base(mem + 0x010000);
125      state->membank("bank7")->set_base(mem + 0x010000);
126      state->membank("bank8")->set_base(mem + 0x010000);
127      state->membank("bank9")->set_base(ram);
128      state->membank("bank10")->set_base(ram + 0x2000);
129      state->membank("bank11")->set_base(ram + 0x4000);
130      state->membank("bank12")->set_base(ram + 0x6000);
131      state->membank("bank13")->set_base(ram + 0x8000);
132      state->membank("bank14")->set_base(ram + 0xa000);
133      state->membank("bank15")->set_base(ram + 0xc000);
134      state->membank("bank16")->set_base(ram + 0xe000);
111      m_bank1->set_base(mem + 0x010000);
112      m_bank2->set_base(mem + 0x010000);
113      m_bank3->set_base(mem + 0x010000);
114      m_bank4->set_base(mem + 0x010000);
115      m_bank5->set_base(mem + 0x010000);
116      m_bank6->set_base(mem + 0x010000);
117      m_bank7->set_base(mem + 0x010000);
118      m_bank8->set_base(mem + 0x010000);
119      m_bank9->set_base(ram);
120      m_bank10->set_base(ram + 0x2000);
121      m_bank11->set_base(ram + 0x4000);
122      m_bank12->set_base(ram + 0x6000);
123      m_bank13->set_base(ram + 0x8000);
124      m_bank14->set_base(ram + 0xa000);
125      m_bank15->set_base(ram + 0xc000);
126      m_bank16->set_base(ram + 0xe000);
135127   }
136128   else
137129   {
138      state->membank("bank1")->set_base(ram);
139      state->membank("bank2")->set_base(ram + 0x2000);
140      state->membank("bank3")->set_base(ram + 0x4000);
141      state->membank("bank4")->set_base(ram + 0x6000);
142      state->membank("bank5")->set_base(ram + 0x8000);
143      state->membank("bank6")->set_base(ram + 0xa000);
144      state->membank("bank7")->set_base(ram + 0xc000);
145      state->membank("bank8")->set_base(state->m_pmd853_memory_mapping ? mem + 0x010000 : ram + 0xe000);
130      m_bank1->set_base(ram);
131      m_bank2->set_base(ram + 0x2000);
132      m_bank3->set_base(ram + 0x4000);
133      m_bank4->set_base(ram + 0x6000);
134      m_bank5->set_base(ram + 0x8000);
135      m_bank6->set_base(ram + 0xa000);
136      m_bank7->set_base(ram + 0xc000);
137      m_bank8->set_base(m_pmd853_memory_mapping ? mem + 0x010000 : ram + 0xe000);
146138   }
147139}
148140
149static void alfa_update_memory(running_machine &machine)
141void pmd85_state::alfa_update_memory()
150142{
151   pmd85_state *state = machine.driver_data<pmd85_state>();
152   address_space& space = machine.device("maincpu")->memory().space(AS_PROGRAM);
153   UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer();
143   address_space& space = m_maincpu->space(AS_PROGRAM);
144   UINT8 *ram = m_ram->pointer();
154145
155   if (state->m_startup_mem_map)
146   if (m_startup_mem_map)
156147   {
157      UINT8 *mem = state->memregion("maincpu")->base();
148      UINT8 *mem = m_region_maincpu->base();
158149
159150      space.unmap_write(0x0000, 0x0fff);
160151      space.unmap_write(0x1000, 0x33ff);
161152      space.nop_write(0x3400, 0x3fff);
162153
163      state->membank("bank1")->set_base(mem + 0x010000);
164      state->membank("bank2")->set_base(mem + 0x011000);
165      state->membank("bank4")->set_base(ram + 0xc000);
166      state->membank("bank5")->set_base(mem + 0x010000);
167      state->membank("bank6")->set_base(mem + 0x011000);
168      state->membank("bank7")->set_base(ram + 0xc000);
154      m_bank1->set_base(mem + 0x010000);
155      m_bank2->set_base(mem + 0x011000);
156      m_bank4->set_base(ram + 0xc000);
157      m_bank5->set_base(mem + 0x010000);
158      m_bank6->set_base(mem + 0x011000);
159      m_bank7->set_base(ram + 0xc000);
169160   }
170161   else
171162   {
r20863r20864
173164      space.install_write_bank(0x1000, 0x33ff, "bank2");
174165      space.install_write_bank(0x3400, 0x3fff, "bank3");
175166
176      state->membank("bank1")->set_base(ram);
177      state->membank("bank2")->set_base(ram + 0x1000);
178      state->membank("bank3")->set_base(ram + 0x3400);
179      state->membank("bank4")->set_base(ram + 0x4000);
167      m_bank1->set_base(ram);
168      m_bank2->set_base(ram + 0x1000);
169      m_bank3->set_base(ram + 0x3400);
170      m_bank4->set_base(ram + 0x4000);
180171   }
181172}
182173
183static void mato_update_memory(running_machine &machine)
174void pmd85_state::mato_update_memory()
184175{
185   pmd85_state *state = machine.driver_data<pmd85_state>();
186   address_space& space = machine.device("maincpu")->memory().space(AS_PROGRAM);
187   UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer();
176   address_space& space = m_maincpu->space(AS_PROGRAM);
177   UINT8 *ram = m_ram->pointer();
188178
189   if (state->m_startup_mem_map)
179   if (m_startup_mem_map)
190180   {
191      UINT8 *mem = state->memregion("maincpu")->base();
181      UINT8 *mem = m_region_maincpu->base();
192182
193183      space.unmap_write(0x0000, 0x3fff);
194184
195      state->membank("bank1")->set_base(mem + 0x010000);
196      state->membank("bank2")->set_base(ram + 0xc000);
197      state->membank("bank3")->set_base(mem + 0x010000);
198      state->membank("bank4")->set_base(ram + 0xc000);
185      m_bank1->set_base(mem + 0x010000);
186      m_bank2->set_base(ram + 0xc000);
187      m_bank3->set_base(mem + 0x010000);
188      m_bank4->set_base(ram + 0xc000);
199189   }
200190   else
201191   {
202192      space.install_write_bank(0x0000, 0x3fff, "bank1");
203193
204      state->membank("bank1")->set_base(ram);
205      state->membank("bank2")->set_base(ram + 0x4000);
194      m_bank1->set_base(ram);
195      m_bank2->set_base(ram + 0x4000);
206196   }
207197}
208198
209static void c2717_update_memory(running_machine &machine)
199void pmd85_state::c2717_update_memory()
210200{
211   pmd85_state *state = machine.driver_data<pmd85_state>();
212   address_space& space = machine.device("maincpu")->memory().space(AS_PROGRAM);
213   UINT8 *mem = state->memregion("maincpu")->base();
214   UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer();
201   address_space& space = m_maincpu->space(AS_PROGRAM);
202   UINT8 *mem = m_region_maincpu->base();
203   UINT8 *ram = m_ram->pointer();
215204
216   if (state->m_startup_mem_map)
205   if (m_startup_mem_map)
217206   {
218207      space.unmap_write(0x0000, 0x3fff);
219208
220      state->membank("bank1")->set_base(mem + 0x010000);
221      state->membank("bank2")->set_base(ram + 0x4000);
222      state->membank("bank3")->set_base(mem + 0x010000);
223      state->membank("bank4")->set_base(ram + 0xc000);
209      m_bank1->set_base(mem + 0x010000);
210      m_bank2->set_base(ram + 0x4000);
211      m_bank3->set_base(mem + 0x010000);
212      m_bank4->set_base(ram + 0xc000);
224213   }
225214   else
226215   {
227216      space.install_write_bank(0x0000, 0x3fff, "bank1");
228      state->membank("bank1")->set_base(ram);
229      state->membank("bank2")->set_base(ram + 0x4000);
217      m_bank1->set_base(ram);
218      m_bank2->set_base(ram + 0x4000);
230219   }
231220}
232221
r20863r20864
245234
246235READ8_MEMBER(pmd85_state::pmd85_ppi_0_portb_r)
247236{
248   static const char *const keynames[] = {
249      "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7",
250      "KEY8", "KEY9", "KEY10", "KEY11", "KEY12", "KEY13", "KEY14", "KEY15"
251   };
252
253   return machine().root_device().ioport(keynames[(m_ppi_port_outputs[0][0] & 0x0f)])->read() & machine().root_device().ioport("KEY15")->read();
237   return m_io_port[(m_ppi_port_outputs[0][0] & 0x0f)]->read() & m_io_port[15]->read();
254238}
255239
256240READ8_MEMBER(pmd85_state::pmd85_ppi_0_portc_r)
r20863r20864
287271{
288272   int i;
289273   UINT8 data = 0xff;
290   static const char *const keynames[] = { "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7" };
291274
292275   for (i = 0; i < 8; i++)
293276   {
294277      if (!BIT(m_ppi_port_outputs[0][0], i))
295         data &= machine().root_device().ioport(keynames[i])->read();
278         data &= m_io_port[i]->read();
296279   }
297280   return data;
298281}
299282
300283READ8_MEMBER(pmd85_state::mato_ppi_0_portc_r)
301284{
302   return machine().root_device().ioport("KEY8")->read() | 0x8f;
285   return m_io_port[8]->read() | 0x8f;
303286}
304287
305288WRITE8_MEMBER(pmd85_state::mato_ppi_0_portc_w)
r20863r20864
502485
503486READ8_MEMBER(pmd85_state::pmd85_io_r)
504487{
505   i8251_device *uart = machine().device<i8251_device>("uart");
506488   if (m_startup_mem_map)
507489   {
508490      return 0xff;
r20863r20864
514496            switch (offset & 0x80)
515497            {
516498               case 0x80:  /* Motherboard 8255 */
517                     return machine().device<i8255_device>("ppi8255_0")->read(space, offset & 0x03);
499                     return m_ppi8255_0->read(space, offset & 0x03);
518500            }
519501            break;
520502      case 0x08:  /* ROM module connector */
r20863r20864
530512                     switch (offset & 0x80)
531513                     {
532514                        case 0x80:  /* ROM module 8255 */
533                           return machine().device<i8255_device>("ppi8255_3")->read(space, offset & 0x03);
515                           return m_ppi8255_3->read(space, offset & 0x03);
534516                     }
535517                  }
536518                  break;
r20863r20864
545527                        case 0x10:  /* 8251 (casette recorder, V24) */
546528                              switch (offset & 0x01)
547529                              {
548                                 case 0x00: return uart->data_r(space, offset & 0x01);
549                                 case 0x01: return uart->status_r(space, offset & 0x01);
530                                 case 0x00: return m_uart->data_r(space, offset & 0x01);
531                                 case 0x01: return m_uart->status_r(space, offset & 0x01);
550532                              }
551533                              break;
552534                        case 0x40:      /* 8255 (GPIO/0, GPIO/1) */
553                              return machine().device<i8255_device>("ppi8255_1")->read(space, offset & 0x03);
535                              return m_ppi8255_1->read(space, offset & 0x03);
554536                        case 0x50:  /* 8253 */
555                              return pit8253_r( machine().device("pit8253"), space, offset & 0x03);
537                              return pit8253_r( m_pit8253, space, offset & 0x03);
556538                        case 0x70:  /* 8255 (IMS-2) */
557                              return machine().device<i8255_device>("ppi8255_2")->read(space, offset & 0x03);
539                              return m_ppi8255_2->read(space, offset & 0x03);
558540                     }
559541                     break;
560542               case 0x80:  /* external interfaces */
r20863r20864
569551
570552WRITE8_MEMBER(pmd85_state::pmd85_io_w)
571553{
572   i8251_device *uart = machine().device<i8251_device>("uart");
573554   if (m_startup_mem_map)
574555   {
575556      m_startup_mem_map = 0;
576      (*update_memory)(machine());
557      (this->*update_memory)();
577558   }
578559
579560   switch (offset & 0x0c)
r20863r20864
582563            switch (offset & 0x80)
583564            {
584565               case 0x80:  /* Motherboard 8255 */
585                     machine().device<i8255_device>("ppi8255_0")->write(space, offset & 0x03, data);
566                     m_ppi8255_0->write(space, offset & 0x03, data);
586567                     /* PMD-85.3 memory banking */
587568                     if ((offset & 0x03) == 0x03)
588569                     {
589570                        m_pmd853_memory_mapping = data & 0x01;
590                        (*update_memory)(machine());
571                        (this->*update_memory)();
591572                     }
592573                     break;
593574            }
r20863r20864
605586                     switch (offset & 0x80)
606587                     {
607588                        case 0x80:  /* ROM module 8255 */
608                              machine().device<i8255_device>("ppi8255_3")->write(space, offset & 0x03, data);
589                              m_ppi8255_3->write(space, offset & 0x03, data);
609590                              break;
610591                     }
611592                  }
r20863r20864
621602                        case 0x10:  /* 8251 (casette recorder, V24) */
622603                              switch (offset & 0x01)
623604                              {
624                                 case 0x00: uart->data_w(space, offset & 0x01, data); break;
625                                 case 0x01: uart->control_w(space, offset & 0x01, data); break;
605                                 case 0x00: m_uart->data_w(space, offset & 0x01, data); break;
606                                 case 0x01: m_uart->control_w(space, offset & 0x01, data); break;
626607                              }
627608                              break;
628609                        case 0x40:      /* 8255 (GPIO/0, GPIO/0) */
629                              machine().device<i8255_device>("ppi8255_1")->write(space, offset & 0x03, data);
610                              m_ppi8255_1->write(space, offset & 0x03, data);
630611                              break;
631612                        case 0x50:  /* 8253 */
632                              pit8253_w(machine().device("pit8253"), space, offset & 0x03, data);
613                              pit8253_w(m_pit8253, space, offset & 0x03, data);
633614                              logerror ("8253 writing. Address: %02x, Data: %02x\n", offset, data);
634615                              break;
635616                        case 0x70:  /* 8255 (IMS-2) */
636                              machine().device<i8255_device>("ppi8255_2")->write(space, offset & 0x03, data);
617                              m_ppi8255_2->write(space, offset & 0x03, data);
637618                              break;
638619                     }
639620                     break;
r20863r20864
667648            switch (offset & 0x80)
668649            {
669650               case 0x80:  /* Motherboard 8255 */
670                     return machine().device<i8255_device>("ppi8255_0")->read(space, offset & 0x03);
651                     return m_ppi8255_0->read(space, offset & 0x03);
671652            }
672653            break;
673654   }
r20863r20864
681662   if (m_startup_mem_map)
682663   {
683664      m_startup_mem_map = 0;
684      (*update_memory)(machine());
665      (this->*update_memory)();
685666   }
686667
687668   switch (offset & 0x0c)
r20863r20864
690671            switch (offset & 0x80)
691672            {
692673               case 0x80:  /* Motherboard 8255 */
693                     return machine().device<i8255_device>("ppi8255_0")->write(space, offset & 0x03, data);
674                     return m_ppi8255_0->write(space, offset & 0x03, data);
694675            }
695676            break;
696677   }
r20863r20864
773754
774755TIMER_CALLBACK_MEMBER(pmd85_state::pmd85_cassette_timer_callback)
775756{
776   i8251_device *uart = machine().device<i8251_device>("uart");
777   serial_source_device *ser = machine().device<serial_source_device>("sercas");
778757   int data;
779758   int current_level;
780759
781   if (!(machine().root_device().ioport("DSW0")->read() & 0x02))   /* V.24 / Tape Switch */
760   if (!(m_io_dsw0->read() & 0x02))   /* V.24 / Tape Switch */
782761   {
783762      /* tape reading */
784      if (machine().device<cassette_image_device>(CASSETTE_TAG)->get_state()&CASSETTE_PLAY)
763      if (m_cassette->get_state()&CASSETTE_PLAY)
785764      {
786765         switch (m_model)
787766         {
788767            case PMD85_1:
789768               if (m_clk_level_tape)
790769               {
791                  m_previous_level = ((machine().device<cassette_image_device>(CASSETTE_TAG))->input() > 0.038) ? 1 : 0;
770                  m_previous_level = (m_cassette->input() > 0.038) ? 1 : 0;
792771                  m_clk_level_tape = 0;
793772               }
794773               else
795774               {
796                  current_level = ((machine().device<cassette_image_device>(CASSETTE_TAG))->input() > 0.038) ? 1 : 0;
775                  current_level = (m_cassette->input() > 0.038) ? 1 : 0;
797776
798777                  if (m_previous_level!=current_level)
799778                  {
800779                     data = (!m_previous_level && current_level) ? 1 : 0;
801780
802                     ser->send_bit(data);
803                     uart->receive_clock();
781                     m_sercas->send_bit(data);
782                     m_uart->receive_clock();
804783
805784                     m_clk_level_tape = 1;
806785                  }
r20863r20864
817796      }
818797
819798      /* tape writing */
820      if (machine().device<cassette_image_device>(CASSETTE_TAG)->get_state()&CASSETTE_RECORD)
799      if (m_cassette->get_state()&CASSETTE_RECORD)
821800      {
822         data = ser->get_in_data_bit();
801         data = m_sercas->get_in_data_bit();
823802         data ^= m_clk_level_tape;
824         machine().device<cassette_image_device>(CASSETTE_TAG)->output(data&0x01 ? 1 : -1);
803         m_cassette->output(data&0x01 ? 1 : -1);
825804
826805         if (!m_clk_level_tape)
827            uart->transmit_clock();
806            m_uart->transmit_clock();
828807
829808         m_clk_level_tape = m_clk_level_tape ? 0 : 1;
830809
r20863r20864
834813      m_clk_level_tape = 1;
835814
836815      if (!m_clk_level)
837         uart->transmit_clock();
816         m_uart->transmit_clock();
838817      m_clk_level = m_clk_level ? 0 : 1;
839818   }
840819}
r20863r20864
846825
847826DIRECT_UPDATE_MEMBER(pmd85_state::pmd85_opbaseoverride)
848827{
849   if (ioport("RESET")->read() & 0x01)
828   if (m_io_reset->read() & 0x01)
850829      machine().scheduler().timer_set(attotime::from_usec(10), timer_expired_delegate(FUNC(pmd85_state::pmd_reset),this));
851830   return address;
852831}
853832
854static void pmd85_common_driver_init (running_machine &machine)
833void pmd85_state::pmd85_common_driver_init()
855834{
856   pmd85_state *state = machine.driver_data<pmd85_state>();
857   state->m_previous_level = 0;
858   state->m_clk_level = state->m_clk_level_tape = 1;
859   state->m_cassette_timer = machine.scheduler().timer_alloc(timer_expired_delegate(FUNC(pmd85_state::pmd85_cassette_timer_callback),state));
860   state->m_cassette_timer->adjust(attotime::zero, 0, attotime::from_hz(2400));
835   static const char *const keynames[] = {
836      "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7",
837      "KEY8", "KEY9", "KEY10", "KEY11", "KEY12", "KEY13", "KEY14", "KEY15"
838   };
839
840   for ( int i = 0; i < 16; i++ )
841   {
842      m_io_port[i] = ioport( keynames[i] );
843   }
844
845   m_previous_level = 0;
846   m_clk_level = m_clk_level_tape = 1;
847   m_cassette_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pmd85_state::pmd85_cassette_timer_callback),this));
848   m_cassette_timer->adjust(attotime::zero, 0, attotime::from_hz(2400));
861849}
862850
863851DRIVER_INIT_MEMBER(pmd85_state,pmd851)
864852{
865853   m_model = PMD85_1;
866   update_memory = pmd851_update_memory;
867   pmd85_common_driver_init(machine());
854   update_memory = &pmd85_state::pmd851_update_memory;
855   pmd85_common_driver_init();
868856}
869857
870858DRIVER_INIT_MEMBER(pmd85_state,pmd852a)
871859{
872860   m_model = PMD85_2A;
873   update_memory = pmd852a_update_memory;
874   pmd85_common_driver_init(machine());
861   update_memory = &pmd85_state::pmd852a_update_memory;
862   pmd85_common_driver_init();
875863}
876864
877865DRIVER_INIT_MEMBER(pmd85_state,pmd853)
878866{
879867   m_model = PMD85_3;
880   update_memory = pmd853_update_memory;
881   pmd85_common_driver_init(machine());
868   update_memory = &pmd85_state::pmd853_update_memory;
869   pmd85_common_driver_init();
882870}
883871
884872DRIVER_INIT_MEMBER(pmd85_state,alfa)
885873{
886874   m_model = ALFA;
887   update_memory = alfa_update_memory;
888   pmd85_common_driver_init(machine());
875   update_memory = &pmd85_state::alfa_update_memory;
876   pmd85_common_driver_init();
889877}
890878
891879DRIVER_INIT_MEMBER(pmd85_state,mato)
892880{
893881   m_model = MATO;
894   update_memory = mato_update_memory;
882   update_memory = &pmd85_state::mato_update_memory;
883
884   static const char *const keynames[] = {
885      "KEY0", "KEY1", "KEY2", "KEY3", "KEY4", "KEY5", "KEY6", "KEY7", "KEY8"
886   };
887
888   for ( int i = 0; i < 9; i++ )
889   {
890      m_io_port[i] = ioport( keynames[i] );
891   }
892   for ( int i = 9; i < 16; i++ )
893   {
894      m_io_port[i] = NULL;
895   }
895896}
896897
897898DRIVER_INIT_MEMBER(pmd85_state,c2717)
898899{
899900   m_model = C2717;
900   update_memory = c2717_update_memory;
901   pmd85_common_driver_init(machine());
901   update_memory = &pmd85_state::c2717_update_memory;
902   pmd85_common_driver_init();
902903}
903904
904905TIMER_CALLBACK_MEMBER(pmd85_state::setup_machine_state)
905906{
906907   if (m_model != MATO)
907908   {
908      i8251_device *uart = machine().device<i8251_device>("uart");
909      serial_source_device *ser = machine().device<serial_source_device>("sercas");
910      uart->connect(ser);
909      m_uart->connect(m_sercas);
911910   }
912911}
913912
r20863r20864
923922      case PMD85_2A:
924923      case PMD85_3:
925924      case C2717:
926         m_rom_module_present = (machine().root_device().ioport("DSW0")->read() & 0x01) ? 1 : 0;
925         m_rom_module_present = (m_io_dsw0->read() & 0x01) ? 1 : 0;
927926         break;
928927      case ALFA:
929928      case MATO:
r20863r20864
935934         m_ppi_port_outputs[i][j] = 0;
936935
937936   /* memory initialization */
938   memset(machine().device<ram_device>(RAM_TAG)->pointer(), 0, sizeof(unsigned char)*0x10000);
937   memset(m_ram->pointer(), 0, sizeof(unsigned char)*0x10000);
939938   m_pmd853_memory_mapping = 1;
940939   m_startup_mem_map = 1;
941   update_memory(machine());
940   (this->*update_memory)();
942941
943942   machine().scheduler().timer_set(attotime::zero, timer_expired_delegate(FUNC(pmd85_state::setup_machine_state),this));
944943
945   machine().device("maincpu")->memory().space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(pmd85_state::pmd85_opbaseoverride), this));
944   m_maincpu->space(AS_PROGRAM).set_direct_update_handler(direct_update_delegate(FUNC(pmd85_state::pmd85_opbaseoverride), this));
946945}
trunk/src/mess/includes/pmd85.h
r20863r20864
77#ifndef PMD85_H_
88#define PMD85_H_
99
10#include "machine/i8251.h"
1011#include "machine/i8255.h"
12#include "imagedev/cassette.h"
13#include "machine/ram.h"
1114
15
1216class pmd85_state : public driver_device
1317{
1418public:
1519   pmd85_state(const machine_config &mconfig, device_type type, const char *tag)
16      : driver_device(mconfig, type, tag) { }
20      : driver_device(mconfig, type, tag)
21      , m_maincpu(*this, "maincpu")
22      , m_ram(*this, RAM_TAG)
23      , m_cassette(*this, CASSETTE_TAG)
24      , m_sercas(*this, "sercas")
25      , m_pit8253(*this, "pit8253")
26      , m_uart(*this, "uart")
27      , m_ppi8255_0(*this, "ppi8255_0")
28      , m_ppi8255_1(*this, "ppi8255_1")
29      , m_ppi8255_2(*this, "ppi8255_2")
30      , m_ppi8255_3(*this, "ppi8255_3")
31      , m_region_maincpu(*this, "maincpu")
32      , m_bank1(*this, "bank1")
33      , m_bank2(*this, "bank2")
34      , m_bank3(*this, "bank3")
35      , m_bank4(*this, "bank4")
36      , m_bank5(*this, "bank5")
37      , m_bank6(*this, "bank6")
38      , m_bank7(*this, "bank7")
39      , m_bank8(*this, "bank8")
40      , m_bank9(*this, "bank9")
41      , m_bank10(*this, "bank10")
42      , m_bank11(*this, "bank11")
43      , m_bank12(*this, "bank12")
44      , m_bank13(*this, "bank13")
45      , m_bank14(*this, "bank14")
46      , m_bank15(*this, "bank15")
47      , m_bank16(*this, "bank16")
48      , m_io_reset(*this, "RESET")
49      , m_io_dsw0(*this, "DSW0")
50   { }
1751
1852   UINT8 m_rom_module_present;
1953   UINT8 m_ppi_port_outputs[4][3];
r20863r20864
2458   int m_clk_level_tape;
2559   UINT8 m_model;
2660   emu_timer * m_cassette_timer;
27   void (*update_memory)(running_machine &);
61   void (pmd85_state::*update_memory)();
2862   DECLARE_READ8_MEMBER(pmd85_io_r);
2963   DECLARE_WRITE8_MEMBER(pmd85_io_w);
3064   DECLARE_READ8_MEMBER(mato_io_r);
r20863r20864
70104   DECLARE_WRITE8_MEMBER(pmd85_ppi_3_porta_w);
71105   DECLARE_WRITE8_MEMBER(pmd85_ppi_3_portb_w);
72106   DECLARE_WRITE8_MEMBER(pmd85_ppi_3_portc_w);
107
108protected:
109   required_device<cpu_device> m_maincpu;
110   required_device<ram_device> m_ram;
111   required_device<cassette_image_device> m_cassette;
112   required_device<serial_source_device> m_sercas;
113   required_device<device_t> m_pit8253;
114   optional_device<i8251_device> m_uart;
115   optional_device<i8255_device> m_ppi8255_0;
116   optional_device<i8255_device> m_ppi8255_1;
117   optional_device<i8255_device> m_ppi8255_2;
118   optional_device<i8255_device> m_ppi8255_3;
119   required_memory_region m_region_maincpu;
120   required_memory_bank m_bank1;
121   required_memory_bank m_bank2;
122   required_memory_bank m_bank3;
123   required_memory_bank m_bank4;
124   optional_memory_bank m_bank5;
125   optional_memory_bank m_bank6;
126   optional_memory_bank m_bank7;
127   optional_memory_bank m_bank8;
128   optional_memory_bank m_bank9;
129   optional_memory_bank m_bank10;
130   optional_memory_bank m_bank11;
131   optional_memory_bank m_bank12;
132   optional_memory_bank m_bank13;
133   optional_memory_bank m_bank14;
134   optional_memory_bank m_bank15;
135   optional_memory_bank m_bank16;
136   required_ioport m_io_reset;
137   optional_ioport m_io_dsw0;
138   ioport_port *m_io_port[16];
139
140   void pmd851_update_memory();
141   void pmd852a_update_memory();
142   void pmd853_update_memory();
143   void alfa_update_memory();
144   void mato_update_memory();
145   void c2717_update_memory();
146   void pmd85_common_driver_init();
147   void pmd85_draw_scanline(bitmap_ind16 &bitmap, int pmd85_scanline);
73148};
74149
75150
trunk/src/mess/video/pmd85.c
r20863r20864
1010
1111#include "emu.h"
1212#include "includes/pmd85.h"
13#include "machine/ram.h"
1413
1514const unsigned char pmd85_palette[3*3] =
1615{
r20863r20864
3231{
3332}
3433
35static void pmd85_draw_scanline(running_machine &machine,bitmap_ind16 &bitmap, int pmd85_scanline)
34void pmd85_state::pmd85_draw_scanline(bitmap_ind16 &bitmap, int pmd85_scanline)
3635{
3736   int x, i;
3837   int pen0, pen1;
r20863r20864
4241   UINT16 *scanline = &bitmap.pix16(pmd85_scanline);
4342
4443   /* address of current line in PMD-85 video memory */
45   UINT8* pmd85_video_ram_line = machine.device<ram_device>(RAM_TAG)->pointer() + 0xc000 + 0x40*pmd85_scanline;
44   UINT8* pmd85_video_ram_line = m_ram->pointer() + 0xc000 + 0x40*pmd85_scanline;
4645
4746   for (x=0; x<288; x+=6)
4847   {
r20863r20864
6160   int pmd85_scanline;
6261
6362   for (pmd85_scanline=0; pmd85_scanline<256; pmd85_scanline++)
64      pmd85_draw_scanline (machine(),bitmap, pmd85_scanline);
63   {
64      pmd85_draw_scanline(bitmap, pmd85_scanline);
65   }
6566   return 0;
6667}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team