Previous 199869 Revisions Next

r20450 Thursday 24th January, 2013 at 20:26:09 UTC by Wilbert Pol
(MESS) svision.c: Cleanups (nw)
[src/mess/audio]svision.c
[src/mess/drivers]svision.c
[src/mess/includes]svision.h

trunk/src/mess/audio/svision.c
r20449r20450
275275         state->dma.pos += state->dma.step;
276276         if (state->dma.pos >= state->dma.size)
277277         {
278            svision_state *sv_state = device->machine().driver_data<svision_state>();
278279            state->dma.finished = TRUE;
279280            state->dma.on = FALSE;
280            svision_irq(device->machine());
281            sv_state->svision_irq();
281282         }
282283      }
283284   }
trunk/src/mess/includes/svision.h
r20449r20450
3232{
3333public:
3434   svision_state(const machine_config &mconfig, device_type type, const char *tag)
35      : driver_device(mconfig, type, tag) ,
36      m_reg(*this, "reg"),
37      m_videoram(*this, "videoram"){ }
35      : driver_device(mconfig, type, tag)
36      , m_maincpu(*this, "maincpu")
37      , m_reg(*this, "reg")
38      , m_videoram(*this, "videoram")
39      , m_joy(*this, "JOY")
40      , m_joy2(*this, "JOY2")
41   { }
3842
39   required_shared_ptr<UINT8> m_reg;
40   required_shared_ptr<UINT8> m_videoram;
4143   device_t *m_sound;
4244   int *m_dma_finished;
4345   svision_t m_svision;
4446   svision_pet_t m_pet;
4547   tvlink_t m_tvlink;
48
4649   DECLARE_READ8_MEMBER(svision_r);
4750   DECLARE_WRITE8_MEMBER(svision_w);
4851   DECLARE_READ8_MEMBER(tvlink_r);
r20449r20450
6063   TIMER_CALLBACK_MEMBER(svision_pet_timer);
6164   TIMER_CALLBACK_MEMBER(svision_timer);
6265   TIMER_DEVICE_CALLBACK_MEMBER(svision_pet_timer_dev);
66   void svision_irq();
67
68protected:
69   required_device<cpu_device> m_maincpu;
70   required_shared_ptr<UINT8> m_reg;
71   required_shared_ptr<UINT8> m_videoram;
72   required_ioport m_joy;
73   optional_ioport m_joy2;
74
75   memory_region *m_user1;
76   memory_bank *m_bank1;
77   memory_bank *m_bank2;
6378};
6479
6580
trunk/src/mess/drivers/svision.c
r20449r20450
1919
2020
2121// in pixel
22#define XSIZE (state->m_reg[0]&~3)
23#define XPOS state->m_reg[2]
24#define YPOS state->m_reg[3]
22#define XSIZE (m_reg[0]&~3)
23#define XPOS m_reg[2]
24#define YPOS m_reg[3]
2525#define BANK m_reg[0x26]
2626
2727TIMER_CALLBACK_MEMBER(svision_state::svision_pet_timer)
r20449r20450
2929   switch (m_pet.state)
3030   {
3131      case 0:
32         m_pet.input = machine().root_device().ioport("JOY2")->read();
32         if ( m_joy2 )
33         {
34            m_pet.input = m_joy2->read();
35         }
3336         /* fall through */
3437
3538      case 2: case 4: case 6: case 8:
3639      case 10: case 12: case 14:
37         m_pet.clock=m_pet.state&2;
38         m_pet.data=m_pet.input&1;
39         m_pet.input>>=1;
40         m_pet.clock = m_pet.state & 2;
41         m_pet.data = m_pet.input & 1;
42         m_pet.input >>= 1;
4043         m_pet.state++;
4144         break;
4245
r20449r20450
5558   svision_pet_timer(ptr,param);
5659}
5760
58void svision_irq(running_machine &machine)
61void svision_state::svision_irq()
5962{
60   svision_state *state = machine.driver_data<svision_state>();
61   int irq = state->m_svision.timer_shot && (state->BANK & 2);
62   irq = irq || (*state->m_dma_finished && (state->BANK & 4));
63   int irq = m_svision.timer_shot && (BANK & 2);
64   irq = irq || (*m_dma_finished && (BANK & 4));
6365
64   machine.device("maincpu")->execute().set_input_line(M65C02_IRQ_LINE, irq ? ASSERT_LINE : CLEAR_LINE);
66   m_maincpu->set_input_line(M65C02_IRQ_LINE, irq ? ASSERT_LINE : CLEAR_LINE);
6567}
6668
6769TIMER_CALLBACK_MEMBER(svision_state::svision_timer)
6870{
6971   m_svision.timer_shot = TRUE;
7072   m_svision.timer1->enable(FALSE);
71   svision_irq( machine() );
73   svision_irq();
7274}
7375
7476READ8_MEMBER(svision_state::svision_r)
r20449r20450
7779   switch (offset)
7880   {
7981      case 0x20:
80         data = ioport("JOY")->read();
82         data = m_joy->read();
8183         break;
84
8285      case 0x21:
8386         data &= ~0xf;
8487         data |= m_reg[0x22] & 0xf;
8588         if (m_pet.on)
8689         {
8790            if (!m_pet.clock)
91            {
8892               data &= ~4;
93            }
8994            if (!m_pet.data)
95            {
9096               data &= ~8;
97            }
9198         }
9299         break;
100
93101      case 0x27:
94102         data &= ~3;
95103         if (m_svision.timer_shot)
104         {
96105            data|=1;
106         }
97107         if (*m_dma_finished)
108         {
98109            data|=2;
110         }
99111         break;
112
100113      case 0x24:
101114         m_svision.timer_shot = FALSE;
102         svision_irq(machine());
115         svision_irq();
103116         break;
117
104118      case 0x25:
105119         *m_dma_finished = FALSE;
106         svision_irq(machine());
120         svision_irq();
107121         break;
122
108123      default:
109124         logerror("%.6f svision read %04x %02x\n", machine().time().as_double(),offset,data);
110125         break;
r20449r20450
125140      case 2:
126141      case 3:
127142         break;
143
128144      case 0x26: /* bits 5,6 memory management for a000? */
129145         logerror("%.6f svision write %04x %02x\n", machine().time().as_double(),offset,data);
130         membank("bank1")->set_base(machine().root_device().memregion("user1")->base() + ((m_reg[0x26] & 0xe0) << 9));
131         svision_irq(machine());
146         m_bank1->set_base(m_user1->base() + ((m_reg[0x26] & 0xe0) << 9));
147         svision_irq();
132148         break;
149
133150      case 0x23: /* delta hero irq routine write */
134151         value = data;
135152         if (!data)
153         {
136154            value = 0x100;
155         }
137156         if (BANK & 0x10)
157         {
138158            delay = 16384;
159         }
139160         else
161         {
140162            delay = 256;
163         }
141164         m_svision.timer1->enable(TRUE);
142         m_svision.timer1->reset(machine().device<cpu_device>("maincpu")->cycles_to_attotime(value * delay));
165         m_svision.timer1->reset(m_maincpu->cycles_to_attotime(value * delay));
143166         break;
167
144168      case 0x10: case 0x11: case 0x12: case 0x13:
145169         svision_soundport_w(m_sound, 0, offset & 3, data);
146170         break;
171
147172      case 0x14: case 0x15: case 0x16: case 0x17:
148173         svision_soundport_w(m_sound, 1, offset & 3, data);
149174         break;
175
150176      case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c:
151177         svision_sounddma_w(m_sound, space, offset - 0x18, data);
152178         break;
179
153180      case 0x28: case 0x29: case 0x2a:
154181         svision_noise_w(m_sound, space, offset - 0x28, data);
155182         break;
183
156184      default:
157185         logerror("%.6f svision write %04x %02x\n", machine().time().as_double(), offset, data);
158186         break;
r20449r20450
350378
351379UINT32 svision_state::screen_update_svision(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
352380{
353   svision_state *state = machine().driver_data<svision_state>();
354381   int x, y, i, j=XPOS/4+YPOS*0x30;
355382   UINT8 *videoram = m_videoram;
356383
r20449r20450
382409
383410UINT32 svision_state::screen_update_tvlink(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
384411{
385   svision_state *state = machine().driver_data<svision_state>();
386412   int x, y, i, j = XPOS/4+YPOS*0x30;
387413   UINT8 *videoram = m_videoram;
388414
r20449r20450
426452   m_sound = machine().device("custom");
427453   m_dma_finished = svision_dma_finished(m_sound);
428454   m_pet.on = FALSE;
429   membank("bank2")->set_base(memregion("user1")->base() + 0x1c000);
455   m_user1 = memregion("user1");
456   m_bank1 = membank("bank1");
457   m_bank2 = membank("bank2");
458   m_bank2->set_base(m_user1->base() + 0x1c000);
430459}
431460
432461DRIVER_INIT_MEMBER(svision_state,svisions)
r20449r20450
434463   m_svision.timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(svision_state::svision_timer),this));
435464   m_sound = machine().device("custom");
436465   m_dma_finished = svision_dma_finished(m_sound);
437   membank("bank2")->set_base(memregion("user1")->base() + 0x1c000);
438   m_svision.timer1 = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(svision_state::svision_timer),this));
466   m_user1 = memregion("user1");
467   m_bank1 = membank("bank1");
468   m_bank2 = membank("bank2");
469   m_bank2->set_base(m_user1->base() + 0x1c000);
439470   m_pet.on = TRUE;
440471   m_pet.timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(svision_state::svision_pet_timer),this));
441472}
r20449r20450
476507
477508   /* With the following, we mirror the cart in the whole "user1" memory region */
478509   for (i = 0; i < mirror; i++)
510   {
479511      memcpy(image.device().machine().root_device().memregion("user1")->base() + i * size, temp_copy, size);
512   }
480513
481514   auto_free(image.device().machine(), temp_copy);
482515
r20449r20450
487520{
488521   m_svision.timer_shot = FALSE;
489522   *m_dma_finished = FALSE;
490   membank("bank1")->set_base(memregion("user1")->base());
523   m_bank1->set_base(m_user1->base());
491524}
492525
493526
r20449r20450
495528{
496529   m_svision.timer_shot = FALSE;
497530   *m_dma_finished = FALSE;
498   membank("bank1")->set_base(memregion("user1")->base());
531   m_bank1->set_base(m_user1->base());
499532   m_tvlink.palette_on = FALSE;
500533
501534   memset(m_reg + 0x800, 0xff, 0x40); // normally done from m_tvlink microcontroller

Previous 199869 Revisions Next


© 1997-2024 The MAME Team