Previous 199869 Revisions Next

r20868 Saturday 9th February, 2013 at 14:22:52 UTC by Wilbert Pol
(MESS) pk8000.c: Reduce tagmap lookups (nw)
[src/mess/drivers]pk8000.c

trunk/src/mess/drivers/pk8000.c
r20867r20868
2222{
2323public:
2424   pk8000_state(const machine_config &mconfig, device_type type, const char *tag)
25      : driver_device(mconfig, type, tag) { }
25      : driver_device(mconfig, type, tag)
26      , m_maincpu(*this, "maincpu")
27      , m_cassette(*this, CASSETTE_TAG)
28      , m_ram(*this, RAM_TAG)
29      , m_speaker(*this, SPEAKER_TAG)
30      , m_region_maincpu(*this, "maincpu")
31      , m_bank1(*this, "bank1")
32      , m_bank2(*this, "bank2")
33      , m_bank3(*this, "bank3")
34      , m_bank4(*this, "bank4")
35      , m_bank5(*this, "bank5")
36      , m_bank6(*this, "bank6")
37      , m_bank7(*this, "bank7")
38      , m_bank8(*this, "bank8")
39   { }
2640
2741   UINT8 m_keyboard_line;
2842   DECLARE_READ8_MEMBER(pk8000_joy_1_r);
2943   DECLARE_READ8_MEMBER(pk8000_joy_2_r);
44   virtual void machine_start();
3045   virtual void machine_reset();
3146   virtual void video_start();
3247   UINT32 screen_update_pk8000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
r20867r20868
3853   DECLARE_WRITE8_MEMBER(pk8000_84_porta_w);
3954   DECLARE_WRITE8_MEMBER(pk8000_84_portc_w);
4055   IRQ_CALLBACK_MEMBER(pk8000_irq_callback);
56
57protected:
58   required_device<cpu_device> m_maincpu;
59   required_device<cassette_image_device> m_cassette;
60   required_device<ram_device> m_ram;
61   required_device<device_t> m_speaker;
62   required_memory_region m_region_maincpu;
63   required_memory_bank m_bank1;
64   required_memory_bank m_bank2;
65   required_memory_bank m_bank3;
66   required_memory_bank m_bank4;
67   required_memory_bank m_bank5;
68   required_memory_bank m_bank6;
69   required_memory_bank m_bank7;
70   required_memory_bank m_bank8;
71   ioport_port *m_io_port[10];
72
73   void pk8000_set_bank(UINT8 data);
4174};
4275
4376
4477
45static cassette_image_device *cassette_device_image(running_machine &machine)
78void pk8000_state::pk8000_set_bank(UINT8 data)
4679{
47   return machine.device<cassette_image_device>(CASSETTE_TAG);
48}
49
50static void pk8000_set_bank(running_machine &machine,UINT8 data)
51{
52   pk8000_state *state = machine.driver_data<pk8000_state>();
53   UINT8 *rom = machine.root_device().memregion("maincpu")->base();
54   UINT8 *ram = machine.device<ram_device>(RAM_TAG)->pointer();
80   UINT8 *rom = m_region_maincpu->base();
81   UINT8 *ram = m_ram->pointer();
5582   UINT8 block1 = data & 3;
5683   UINT8 block2 = (data >> 2) & 3;
5784   UINT8 block3 = (data >> 4) & 3;
r20867r20868
5986
6087   switch(block1) {
6188      case 0:
62            state->membank("bank1")->set_base(rom + 0x10000);
63            state->membank("bank5")->set_base(ram);
89            m_bank1->set_base(rom + 0x10000);
90            m_bank5->set_base(ram);
6491            break;
6592      case 1: break;
6693      case 2: break;
6794      case 3:
68            state->membank("bank1")->set_base(ram);
69            state->membank("bank5")->set_base(ram);
95            m_bank1->set_base(ram);
96            m_bank5->set_base(ram);
7097            break;
7198   }
7299
73100   switch(block2) {
74101      case 0:
75            state->membank("bank2")->set_base(rom + 0x14000);
76            state->membank("bank6")->set_base(ram + 0x4000);
102            m_bank2->set_base(rom + 0x14000);
103            m_bank6->set_base(ram + 0x4000);
77104            break;
78105      case 1: break;
79106      case 2: break;
80107      case 3:
81            state->membank("bank2")->set_base(ram + 0x4000);
82            state->membank("bank6")->set_base(ram + 0x4000);
108            m_bank2->set_base(ram + 0x4000);
109            m_bank6->set_base(ram + 0x4000);
83110            break;
84111   }
85112   switch(block3) {
86113      case 0:
87            state->membank("bank3")->set_base(rom + 0x18000);
88            state->membank("bank7")->set_base(ram + 0x8000);
114            m_bank3->set_base(rom + 0x18000);
115            m_bank7->set_base(ram + 0x8000);
89116            break;
90117      case 1: break;
91118      case 2: break;
92119      case 3:
93            state->membank("bank3")->set_base(ram + 0x8000);
94            state->membank("bank7")->set_base(ram + 0x8000);
120            m_bank3->set_base(ram + 0x8000);
121            m_bank7->set_base(ram + 0x8000);
95122            break;
96123   }
97124   switch(block4) {
98125      case 0:
99            state->membank("bank4")->set_base(rom + 0x1c000);
100            state->membank("bank8")->set_base(ram + 0xc000);
126            m_bank4->set_base(rom + 0x1c000);
127            m_bank8->set_base(ram + 0xc000);
101128            break;
102129      case 1: break;
103130      case 2: break;
104131      case 3:
105            state->membank("bank4")->set_base(ram + 0xc000);
106            state->membank("bank8")->set_base(ram + 0xc000);
132            m_bank4->set_base(ram + 0xc000);
133            m_bank8->set_base(ram + 0xc000);
107134            break;
108135   }
109136}
110137WRITE8_MEMBER(pk8000_state::pk8000_80_porta_w)
111138{
112   pk8000_set_bank(machine(),data);
139   pk8000_set_bank(data);
113140}
114141
115142READ8_MEMBER(pk8000_state::pk8000_80_portb_r)
116143{
117   static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" };
118144   if(m_keyboard_line>9) {
119145      return 0xff;
120146   }
121   return machine().root_device().ioport(keynames[m_keyboard_line])->read();
147   return m_io_port[m_keyboard_line]->read();
122148}
123149
124150WRITE8_MEMBER(pk8000_state::pk8000_80_portc_w)
125151{
126152   m_keyboard_line = data & 0x0f;
127153
128   speaker_level_w(machine().device(SPEAKER_TAG), BIT(data,7));
154   speaker_level_w(m_speaker, BIT(data,7));
129155
130   cassette_device_image(machine())->change_state(
131                  (BIT(data,4)) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED,
132                  CASSETTE_MASK_MOTOR);
133   cassette_device_image(machine())->output((BIT(data,6)) ? +1.0 : 0.0);
156   m_cassette->change_state( (BIT(data,4)) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
157   m_cassette->output((BIT(data,6)) ? +1.0 : 0.0);
134158}
135159
136160static I8255_INTERFACE( pk8000_ppi8255_interface_1 )
r20867r20868
169193
170194READ8_MEMBER(pk8000_state::pk8000_joy_1_r)
171195{
172   UINT8 retVal = (cassette_device_image(machine())->input() > 0.0038 ? 0x80 : 0);
196   UINT8 retVal = (m_cassette->input() > 0.0038 ? 0x80 : 0);
173197   retVal |= ioport("JOY1")->read() & 0x7f;
174198   return retVal;
175199}
176200READ8_MEMBER(pk8000_state::pk8000_joy_2_r)
177201{
178   UINT8 retVal = (cassette_device_image(machine())->input() > 0.0038 ? 0x80 : 0);
202   UINT8 retVal = (m_cassette->input() > 0.0038 ? 0x80 : 0);
179203   retVal |= ioport("JOY2")->read() & 0x7f;
180204   return retVal;
181205}
r20867r20868
325349}
326350
327351
352void pk8000_state::machine_start()
353{
354   static const char *const keynames[] = { "LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7", "LINE8", "LINE9" };
355
356   for ( int i = 0; i < 10; i++ )
357   {
358      m_io_port[i] = ioport(keynames[i]);
359   }
360}
361
328362void pk8000_state::machine_reset()
329363{
330   pk8000_set_bank(machine(),0);
331   machine().device("maincpu")->execute().set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pk8000_state::pk8000_irq_callback),this));
364   pk8000_set_bank(0);
365   m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pk8000_state::pk8000_irq_callback),this));
332366}
333367
334368void pk8000_state::video_start()
r20867r20868
337371
338372UINT32 pk8000_state::screen_update_pk8000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
339373{
340   return pk8000_video_update(screen, bitmap, cliprect, machine().device<ram_device>(RAM_TAG)->pointer());
374   return pk8000_video_update(screen, bitmap, cliprect, m_ram->pointer());
341375}
342376
343377/* Machine driver */

Previous 199869 Revisions Next


© 1997-2024 The MAME Team