Previous 199869 Revisions Next

r22829 Wednesday 15th May, 2013 at 12:28:57 UTC by Miodrag Milanović
(MESS) a7800 - [huygens]
* Changed default difficulty switch setting to 'A' so Tower Toppler loads the first level.
* Added 7 cpu cycle delay between hsync and Maria DMA (based on atari docs).
* Rewrite of video code to emulate Maria line ram buffers.
[src/mess/drivers]a7800.c
[src/mess/includes]a7800.h
[src/mess/video]a7800.c

trunk/src/mess/drivers/a7800.c
r22828r22829
122122   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_OTHER)  PORT_NAME(DEF_STR(Pause))  PORT_CODE(KEYCODE_O)
123123   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
124124   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
125   PORT_DIPNAME(0x40, 0x00, "Left Difficulty Switch")
125   PORT_DIPNAME(0x40, 0x40, "Left Difficulty Switch")
126126   PORT_DIPSETTING(0x40, "A" )
127127   PORT_DIPSETTING(0x00, "B" )
128   PORT_DIPNAME(0x80, 0x00, "Right Difficulty Switch")
128   PORT_DIPNAME(0x80, 0x80, "Right Difficulty Switch")
129129   PORT_DIPSETTING(0x80, "A" )
130130   PORT_DIPSETTING(0x00, "B" )
131131INPUT_PORTS_END
trunk/src/mess/includes/a7800.h
r22828r22829
4949   UINT32 m_cart_size;
5050   unsigned char m_stick_type;
5151   UINT8 *m_ROM;
52   int m_maria_palette[8][4];
52   int m_maria_palette[32];
53   int m_line_ram[2][160];
54   int m_active_buffer;
5355   int m_maria_write_mode;
5456   unsigned int m_maria_dll;
5557   unsigned int m_maria_dl;
r22828r22829
5860   int m_maria_vblank;
5961   int m_maria_dli;
6062   int m_maria_dmaon;
61   int m_maria_dodma;
63   int m_maria_dpp;
6264   int m_maria_wsync;
6365   int m_maria_backcolor;
6466   int m_maria_color_kill;
r22828r22829
8688   DECLARE_PALETTE_INIT(a7800p);
8789   UINT32 screen_update_a7800(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
8890   TIMER_DEVICE_CALLBACK_MEMBER(a7800_interrupt);
91   TIMER_CALLBACK_MEMBER(a7800_maria_startdma);
8992   DECLARE_READ8_MEMBER(riot_joystick_r);
9093   DECLARE_READ8_MEMBER(riot_console_button_r);
9194   DECLARE_WRITE8_MEMBER(riot_button_pullup_w);
r22828r22829
113116   memory_bank *m_bank11;
114117
115118   void maria_draw_scanline();
119   int is_holey(unsigned int addr);
120   int write_line_ram(int addr, UINT8 offset, int pal);
116121   int a7800_verify_cart(char header[128]);
117122   UINT16 a7800_get_pcb_id(const char *pcb);
118123};
trunk/src/mess/video/a7800.c
r22828r22829
77  TODO:
88    precise DMA cycle stealing
99
10   2013-05-08 huygens rewrite to emulate line ram buffers (mostly fixes Kung-Fu Master
11                     Started DMA cycle stealing implementation
12
1013    2003-06-23 ericball Kangaroo mode & 320 mode & other stuff
1114
1215    2002-05-14 kubecj vblank dma stop fix
r22828r22829
3437
3538#define DPPH 0x2c
3639#define DPPL 0x30
37#define CTRL 0x3c
3840
39
40
41
42// 20030621 ericball define using logical operations
43#define inc_hpos() { hpos = (hpos + 1) & 0x1FF; }
44#define inc_hpos_by_2() { hpos = (hpos + 2) & 0x1FF; }
45
4641/***************************************************************************
4742
4843  Start the video hardware emulation.
r22828r22829
5045***************************************************************************/
5146void a7800_state::video_start()
5247{
53   int i;
54
55   for(i=0; i<8; i++)
48   int i,j;
49   for(i=0; i<32; i++)
5650   {
57      m_maria_palette[i][0]=0;
58      m_maria_palette[i][1]=0;
59      m_maria_palette[i][2]=0;
60      m_maria_palette[i][3]=0;
51      m_maria_palette[i]=0;
6152   }
53   
54   for(i=0; i<2; i++)
55   {
56      for(j=0; j<160; j++)
57         m_line_ram[i][j] = 0;
58   }
59   
60   m_active_buffer = 0;
6261
6362   m_maria_write_mode=0;
6463   m_maria_dmaon=0;
6564   m_maria_vblank=0x80;
6665   m_maria_dll=0;
67   m_maria_dodma=0;
6866   m_maria_wsync=0;
6967
7068   m_maria_color_kill = 0;
r22828r22829
8280
8381***************************************************************************/
8482
83int a7800_state::is_holey(unsigned int addr)
84{
85   if (((m_maria_holey & 0x02) && ((addr & 0x9000) == 0x9000)) || ( (m_maria_holey & 0x01) && ((addr & 0x8800) == 0x8800)))
86      return 1;
87   else
88      return 0;
89}
90
91int a7800_state::write_line_ram(int addr, UINT8 offset, int pal)
92{
93   address_space& space = m_maincpu->space(AS_PROGRAM);
94   int data, c;
95
96   data = READ_MEM(addr);
97   pal = pal << 2;
98
99   if (m_maria_write_mode)
100   {
101      c = (pal & 0x10) | (data & 0x0C) | (data >> 6); // P2 D3 D2 D7 D6
102      if (((c & 3) || m_maria_kangaroo) && (offset < 160))
103         m_line_ram[m_active_buffer][offset] = c;
104      offset++;
105      c = (pal & 0x10) | ((data & 0x03) << 2) | ((data & 0x30) >> 4); // P2 D1 D0 D5 D4
106      if (((c & 3) || m_maria_kangaroo) && (offset < 160))
107         m_line_ram[m_active_buffer][offset] = c;
108   }
109   else
110   {
111      for (int i=0; i<4; i++, offset++)
112      {
113         c = pal | ((data >> (6 - 2*i)) & 0x03);
114         if (((c & 3) || m_maria_kangaroo) && (offset < 160))
115            m_line_ram[m_active_buffer][offset] = c;
116      }
117   }
118   return m_maria_write_mode ? 2 : 4;
119}
120
121
85122void a7800_state::maria_draw_scanline()
86123{
87124   address_space& space = m_maincpu->space(AS_PROGRAM);
88125   unsigned int graph_adr,data_addr;
89   int width,hpos,pal,mode,ind;
126   int width,pal,ind;
127   UINT8 hpos;
128   int xpos;
90129   unsigned int dl;
91   int x, d, c, i;
92   int ind_bytes;
93   UINT16 *scanline;
130   int x, d, c, i, j, pixel_cell, cells;
131   int maria_cycles;
94132
95   /* set up scanline */
96   scanline = &m_bitmap.pix16(m_screen->vpos());
97   for (i = 0; i < 320; i++)
98      scanline[i] = m_maria_backcolor;
133   maria_cycles = 0;
134   cells = 0;
99135
136   /* clear active line ram buffer */
137   for (i = 0; i < 160; i++)
138      m_line_ram[m_active_buffer][i] = 0;
139
100140   /* Process this DLL entry */
101141   dl = m_maria_dl;
102142
143   /* DMA */
103144   /* Step through DL's */
104145   while ((READ_MEM(dl + 1) & 0x5F) != 0)
105146   {
r22828r22829
108149      {
109150         graph_adr = (READ_MEM(dl+2) << 8) | READ_MEM(dl);
110151         width = ((READ_MEM(dl+3) ^ 0xff) & 0x1F) + 1;
111         hpos = READ_MEM(dl+4)*2;
152         hpos = READ_MEM(dl+4);
112153         pal = READ_MEM(dl+3) >> 5;
113154         m_maria_write_mode = (READ_MEM(dl+1) & 0x80) >> 5;
114155         ind = READ_MEM(dl+1) & 0x20;
115156         dl+=5;
157         maria_cycles += 10;
116158      }
117159      /* Normal header */
118160      else
119161      {
120162         graph_adr = (READ_MEM(dl+2) << 8) | READ_MEM(dl);
121163         width = ((READ_MEM(dl+1) ^ 0xff) & 0x1F) + 1;
122         hpos = READ_MEM(dl+3)*2;
164         hpos = READ_MEM(dl+3);
123165         pal = READ_MEM(dl+1) >> 5;
124166         ind = 0x00;
125167         dl+=4;
168         maria_cycles += 8;
126169      }
127170
128      mode = m_maria_rm | m_maria_write_mode;
129
130171      /*logerror("%x DL: ADR=%x  width=%x  hpos=%x  pal=%x  mode=%x  ind=%x\n",m_screen->vpos(),graph_adr,width,hpos,pal,mode,ind );*/
131172
132      for (x=0; x<width; x++) // 20030621 ericball get graphic data first, then switch (mode)
173      for (x=0; x<width; x++)
133174      {
134         ind_bytes = 1;
135
136175         /* Do indirect mode */
137176         if (ind)
138177         {
139178            c = READ_MEM(graph_adr + x) & 0xFF;
140            data_addr= (m_maria_charbase | c) + (m_maria_offset << 8);
141            if( m_maria_cwidth )
142               ind_bytes = 2;
179            maria_cycles += 3; // 3 Maria cycles
180            data_addr = (m_maria_charbase | c) + (m_maria_offset << 8);
181            if (is_holey(data_addr))
182               continue;
183            if( m_maria_cwidth ) // two data bytes per map byte
184            {
185               cells = write_line_ram(data_addr, hpos, pal);
186               hpos += cells;
187               cells = write_line_ram(data_addr+1, hpos, pal);
188               hpos += cells;
189            }
190            else
191            {
192               cells = write_line_ram(data_addr, hpos, pal);
193               hpos += cells;
194            }
143195         }
144         else
196         else // direct mode
145197         {
146198            data_addr = graph_adr + x + (m_maria_offset  << 8);
199            if (is_holey(data_addr))
200               continue;
201            cells = write_line_ram(data_addr, hpos, pal);
202            hpos += cells;
147203         }
204      }
205   }
148206
149         if ( (m_maria_holey & 0x02) && ((data_addr & 0x9000) == 0x9000))
150            continue;
151         if ( (m_maria_holey & 0x01) && ((data_addr & 0x8800) == 0x8800))
152            continue;
207   /* render scanline */
208   m_active_buffer = !m_active_buffer; // switch buffers
209   UINT16 *scanline;
210   scanline = &m_bitmap.pix16(m_screen->vpos());
211   for (i = 0; i < 320; i++)
212      scanline[i] = m_maria_palette[0];
153213
154         while (ind_bytes > 0)
155         {
156            ind_bytes--;
157            d = READ_MEM(data_addr++);
214   xpos = 0;
215   i=0;
158216
159            switch (mode)
217   while ( i<160 )
218
219      switch (m_maria_rm | m_maria_write_mode)
220      {
221         case 0x00:  /* 160A (160x2) */
222         case 0x01:  /* 160A (160x2) */
223            for (j = 0; j<4; j++, xpos+=2)
160224            {
161               case 0x00:  /* 160A (160x2) */
162               case 0x01:  /* 160A (160x2) */
163                  c = (d & 0xC0) >> 6;
164                  if (c || m_maria_kangaroo)
165                  {
166                     scanline[hpos + 0] = m_maria_palette[pal][c];
167                     scanline[hpos + 1] = m_maria_palette[pal][c];
168                  }
169                  inc_hpos_by_2();
225               pixel_cell =  m_line_ram[m_active_buffer][i+j];
226               scanline[xpos] = m_maria_palette[pixel_cell];
227               scanline[xpos+1] = m_maria_palette[pixel_cell];
228            }
229            i += 4;
230            break;
170231
171                  c = (d & 0x30) >> 4;
172                  if (c || m_maria_kangaroo)
173                  {
174                     scanline[hpos + 0] = m_maria_palette[pal][c];
175                     scanline[hpos + 1] = m_maria_palette[pal][c];
176                  }
177                  inc_hpos_by_2();
232         case 0x02: /* 320D used by Jinks! */
233            for (j = 0; j<4; j++, xpos+=2)
234            {
235               pixel_cell = m_line_ram[m_active_buffer][i+j];
236               d = (pixel_cell & 0x10) | (pixel_cell & 0x02) | ((pixel_cell >> 3) & 1);
237               scanline[xpos] = m_maria_palette[d];
178238
179                  c = (d & 0x0C) >> 2;
180                  if (c || m_maria_kangaroo)
181                  {
182                     scanline[hpos + 0] = m_maria_palette[pal][c];
183                     scanline[hpos + 1] = m_maria_palette[pal][c];
184                  }
185                  inc_hpos_by_2();
239               d = (pixel_cell & 0x10) | ((pixel_cell << 1) & 0x02) | ((pixel_cell >> 2) & 1);
240               scanline[xpos+1] = m_maria_palette[d];
241            }
242            i += 4;
243            break;
186244
187                  c = (d & 0x03);
188                  if (c || m_maria_kangaroo)
189                  {
190                     scanline[hpos + 0] = m_maria_palette[pal][c];
191                     scanline[hpos + 1] = m_maria_palette[pal][c];
192                  }
193                  inc_hpos_by_2();
194                  break;
245         case 0x03:  /* MODE 320A */
246            for (j = 0; j<4; j++, xpos+=2)
247            {
248               pixel_cell = m_line_ram[m_active_buffer][i+j];
249               d = (pixel_cell & 0x1C) | (pixel_cell & 0x02);
250               scanline[xpos] = m_maria_palette[d];
195251
196               case 0x02: /* 320D used by Jinks! */
197                  c = pal & 0x04;
198                  if ( d & 0xC0 || pal & 0x03 || m_maria_kangaroo )
199                  {
200                     scanline[hpos + 0] = m_maria_palette[c][((d & 0x80) >> 6) | ((pal & 2) >> 1)];
201                     scanline[hpos + 1] = m_maria_palette[c][((d & 0x40) >> 5) | ((pal & 1) >> 0)];
202                  }
203                  inc_hpos_by_2();
252               d = (pixel_cell & 0x1C) | ((pixel_cell << 1) & 0x02);
253               scanline[xpos+1] = m_maria_palette[d];
254            }
255            i += 4;
256            break;
204257
205                  if ( d & 0x30 || pal & 0x03 || m_maria_kangaroo )
206                  {
207                     scanline[hpos + 0] = m_maria_palette[c][((d & 0x20) >> 4) | ((pal & 2) >> 1)];
208                     scanline[hpos + 1] = m_maria_palette[c][((d & 0x10) >> 3) | ((pal & 1) >> 0)];
209                  }
210                  inc_hpos_by_2();
258         case 0x04:  /* 160B (160x4) */
259         case 0x05:  /* 160B (160x4) */
260            for (j = 0; j<2; j++, xpos+=2)
261            {
262               d = m_line_ram[m_active_buffer][i+j];
263               scanline[xpos] = m_maria_palette[d];
264               scanline[xpos+1] = m_maria_palette[d];
265            }
266            i += 2;
267            break;
211268
212                  if ( d & 0x0C || pal & 0x03 || m_maria_kangaroo )
213                  {
214                     scanline[hpos + 0] = m_maria_palette[c][((d & 0x08) >> 2) | ((pal & 2) >> 1)];
215                     scanline[hpos + 1] = m_maria_palette[c][((d & 0x04) >> 1) | ((pal & 1) >> 0)];
216                  }
217                  inc_hpos_by_2();
269         case 0x06:  /* MODE 320B */
270            for (j = 0; j<2; j++, xpos+=2)
271            {
272               pixel_cell = m_line_ram[m_active_buffer][i+j];
218273
219                  if ( d & 0x03 || pal & 0x03 || m_maria_kangaroo )
220                  {
221                     scanline[hpos + 0] = m_maria_palette[c][((d & 0x02) << 0) | ((pal & 2) >> 1)];
222                     scanline[hpos + 1] = m_maria_palette[c][((d & 0x01) << 1) | ((pal & 1) >> 0)];
223                  }
224                  inc_hpos_by_2();
274               d = (pixel_cell & 0x10) | (pixel_cell & 0x02) | ((pixel_cell >> 3) & 1);
275               scanline[xpos] = m_maria_palette[d];
225276
226                  break;
277               d = (pixel_cell & 0x10) | ((pixel_cell << 1) & 0x02) | ((pixel_cell >> 2) & 1);
278               scanline[xpos+1] = m_maria_palette[d];
279            }
280            i += 2;
281            break;
227282
228               case 0x03:  /* MODE 320A */
229                  if (d & 0xC0 || m_maria_kangaroo)
230                  {
231                     scanline[hpos + 0] = m_maria_palette[pal][(d & 0x80) >> 6];
232                     scanline[hpos + 1] = m_maria_palette[pal][(d & 0x40) >> 5];
233                  }
234                  inc_hpos_by_2();
283         case 0x07:  /* MODE 320C */
284            for (j = 0; j<2; j++, xpos+=2)
285            {
286               pixel_cell = m_line_ram[m_active_buffer][i+j];
235287
236                  if ( d & 0x30 || m_maria_kangaroo)
237                  {
238                     scanline[hpos + 0] = m_maria_palette[pal][(d & 0x20) >> 4];
239                     scanline[hpos + 1] = m_maria_palette[pal][(d & 0x10) >> 3];
240                  }
241                  inc_hpos_by_2();
288               d = pixel_cell & 0x1E;
289               scanline[xpos] = m_maria_palette[d];
242290
243                  if (d & 0x0C || m_maria_kangaroo)
244                  {
245                     scanline[hpos + 0] = m_maria_palette[pal][(d & 0x08) >> 2];
246                     scanline[hpos + 1] = m_maria_palette[pal][(d & 0x04) >> 1];
247                  }
248                  inc_hpos_by_2();
291               d = (pixel_cell & 0x1C) | ((pixel_cell & 0x01) << 1);
292               scanline[xpos+1] = m_maria_palette[d];
293            }
294            i += 2;
295            break;
249296
250                  if (d & 0x03 || m_maria_kangaroo)
251                  {
252                     scanline[hpos + 0] = m_maria_palette[pal][(d & 0x02)];
253                     scanline[hpos + 1] = m_maria_palette[pal][(d & 0x01) << 1];
254                  }
255                  inc_hpos_by_2();
256                  break;
297      }   /* endswitch (mode) */
257298
258               case 0x04:  /* 160B (160x4) */
259               case 0x05:  /* 160B (160x4) */
260                  c = (d & 0xC0) >> 6;
261                  if (c || m_maria_kangaroo)
262                  {
263                     scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][c];
264                     scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][c];
265                  }
266                  inc_hpos_by_2();
267
268                  c = (d & 0x30) >> 4;
269                  if (c || m_maria_kangaroo)
270                  {
271                     scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | (d & 0x03)][c];
272                     scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | (d & 0x03)][c];
273                  }
274                  inc_hpos_by_2();
275                  break;
276
277               case 0x06:  /* MODE 320B */
278                  if (d & 0xCC || m_maria_kangaroo)
279                  {
280                     scanline[hpos + 0] = m_maria_palette[pal][((d & 0x80) >> 6) | ((d & 0x08) >> 3)];
281                     scanline[hpos + 1] = m_maria_palette[pal][((d & 0x40) >> 5) | ((d & 0x04) >> 2)];
282                  }
283                  inc_hpos_by_2();
284
285                  if ( d & 0x33 || m_maria_kangaroo)
286                  {
287                     scanline[hpos + 0] = m_maria_palette[pal][((d & 0x20) >> 4) | ((d & 0x02) >> 1)];
288                     scanline[hpos + 1] = m_maria_palette[pal][((d & 0x10) >> 3) | (d & 0x01)];
289                  }
290                  inc_hpos_by_2();
291                  break;
292
293               case 0x07: /* (320C mode) */
294                  if (d & 0xC0 || m_maria_kangaroo)
295                  {
296                     scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][(d & 0x80) >> 6];
297                     scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | ((d & 0x0C) >> 2)][(d & 0x40) >> 5];
298                  }
299                  inc_hpos_by_2();
300
301                  if ( d & 0x30 || m_maria_kangaroo)
302                  {
303                     scanline[hpos + 0] = m_maria_palette[(pal & 0x04) | (d & 0x03)][(d & 0x20) >> 4];
304                     scanline[hpos + 1] = m_maria_palette[(pal & 0x04) | (d & 0x03)][(d & 0x10) >> 3];
305                  }
306                  inc_hpos_by_2();
307                  break;
308
309            }   /* endswitch (mode) */
310         }   /* endwhile (ind_bytes > 0)*/
311      }   /* endfor (x=0; x<width; x++) */
312   }   /* endwhile (READ_MEM(dl + 1) != 0) */
299      m_maincpu->adjust_icount(-maria_cycles/4); // Maria clock rate is 4 times that of CPU
313300}
314301
315302
303
316304TIMER_DEVICE_CALLBACK_MEMBER(a7800_state::a7800_interrupt)
317305{
318   int frame_scanline;
319   UINT8 *ROM = m_region_maincpu->base();
320   address_space& space = m_maincpu->space(AS_PROGRAM);
321   int maria_scanline = m_screen->vpos();
322
323   /* why + 1? */
324   frame_scanline = maria_scanline % ( m_lines + 1 );
325
326   if( frame_scanline == 1 )
327   {
328      /*logerror( "frame beg\n" );*/
329   }
330
306   machine().scheduler().timer_set(m_maincpu->cycles_to_attotime(7), timer_expired_delegate(FUNC(a7800_state::a7800_maria_startdma),this));
331307   if( m_maria_wsync )
332308   {
333309      machine().scheduler().trigger( TRIGGER_HSYNC );
334310      m_maria_wsync = 0;
335311   }
312   
313   int frame_scanline = m_screen->vpos() % ( m_lines + 1 );
314   if (frame_scanline == 16)
315      m_maria_vblank = 0x00;
336316
337   if( frame_scanline == 16 )
317   if ( frame_scanline == ( m_lines - 4 ) )
338318   {
339      /* end of vblank */
319      m_maria_vblank = 0x80;
320   }
321}
340322
341      m_maria_vblank=0;
342      if( m_maria_dmaon || m_maria_dodma )
343      {
344         m_maria_dodma = 1;  /* if dma allowed, start it */
345323
346         m_maria_dll = (ROM[DPPH] << 8) | ROM[DPPL];
347         m_maria_dl = (READ_MEM(m_maria_dll+1) << 8) | READ_MEM(m_maria_dll+2);
348         m_maria_offset = READ_MEM(m_maria_dll) & 0x0f;
349         m_maria_holey = (READ_MEM(m_maria_dll) & 0x60) >> 5;
350         m_maria_dli = READ_MEM(m_maria_dll) & 0x80;
351         /*  logerror("DLL=%x\n",m_maria_dll); */
352         /*  logerror("DLL: DL = %x  dllctrl = %x\n",m_maria_dl,ROM[m_maria_dll]); */
353      }
324TIMER_CALLBACK_MEMBER(a7800_state::a7800_maria_startdma)
325{
326   int frame_scanline;
327   address_space& space = m_maincpu->space(AS_PROGRAM);
328   int maria_scanline = m_screen->vpos();
354329
355      /*logerror( "vblank end on line %d\n", frame_scanline );*/
356   }
330   frame_scanline = maria_scanline % ( m_lines + 1 );
357331
358   /*  moved start of vblank up (to prevent dma/dli happen on line -4)
359       this fix made PR Baseball happy
360       Kung-Fu Master looks worse
361       don't know about others yet */
362   if( frame_scanline == ( m_lines - 4 ) )
332   if( (frame_scanline == 16) && m_maria_dmaon )
363333   {
364      /* vblank starts 4 scanlines before end of screen */
334      /* end of vblank */
365335
366      m_maria_vblank = 0x80;
367
368      /* fixed 2002/05/14 kubecj
369              when going vblank, dma must be stopped
370              otherwise system tries to read past end of dll
371              causing false dlis to occur, mainly causing wild
372              screen flickering
373
374              games fixed:
375              Ace of Aces
376              Mean 18
377              Ninja Golf (end of levels)
378              Choplifter
379              Impossible Mission
380              Jinks
381      */
382
383      m_maria_dodma = 0;
384      /*logerror( "vblank on line %d\n\n", frame_scanline );*/
336      m_maria_dll = m_maria_dpp; // currently only handle changes to dll during vblank
337      m_maria_dl = (READ_MEM(m_maria_dll+1) << 8) | READ_MEM(m_maria_dll+2);
338      m_maria_offset = READ_MEM(m_maria_dll) & 0x0f;
339      m_maria_holey = (READ_MEM(m_maria_dll) & 0x60) >> 5;
340      logerror("holey %d", m_maria_holey);
341      if ( READ_MEM(m_maria_dll) & 0x80 )
342         m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
343      m_maincpu->adjust_icount(-6); // 24 Maria cycles minimum (DMA startup + shutdown list-list fetch)
344      /*  logerror("DLL=%x\n",m_maria_dll); */
345      /*  logerror("DLL: DL = %x  dllctrl = %x\n",m_maria_dl,ROM[m_maria_dll]); */
385346   }
386347
387348
388   if( ( frame_scanline > 15 ) && m_maria_dodma )
349   if( ( frame_scanline > 15 ) && (frame_scanline < (m_lines - 4)) && m_maria_dmaon )
389350   {
390      if (maria_scanline < ( m_lines - 4 ) )
391         maria_draw_scanline();
351      maria_draw_scanline();
392352
393353      if( m_maria_offset == 0 )
394354      {
r22828r22829
396356         m_maria_dl = (READ_MEM(m_maria_dll+1) << 8) | READ_MEM(m_maria_dll+2);
397357         m_maria_offset = READ_MEM(m_maria_dll) & 0x0f;
398358         m_maria_holey = (READ_MEM(m_maria_dll) & 0x60) >> 5;
399         m_maria_dli = READ_MEM(m_maria_dll) & 0x80;
359         logerror("holey %d", m_maria_holey);
360         if ( READ_MEM(m_maria_dll) & 0x80 )
361            m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
362         m_maincpu->adjust_icount(-5); // 20 Maria cycles (DMA startup + shutdown)
400363      }
401364      else
402365      {
403366         m_maria_offset--;
404367      }
405368   }
406
407   if( m_maria_dli )
408   {
409      /*logerror( "dli on line %d [%02X] [%02X] [%02X]\n", frame_scanline, ROM[0x7E], ROM[0x7C], ROM[0x7D] );*/
410   }
411
412   if( m_maria_dli )
413   {
414      m_maria_dli = 0;
415      m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
416   }
417
418369}
419370
420371/***************************************************************************
r22828r22829
434385
435386READ8_MEMBER(a7800_state::a7800_MARIA_r)
436387{
437   UINT8 *ROM = m_region_maincpu->base();
438388   switch (offset)
439389   {
440390      case 0x08:
r22828r22829
442392
443393      default:
444394         logerror("undefined MARIA read %x\n",offset);
445         return ROM[0x20 + offset];
395         return 0x00; // don't know if this should be 0x00 or 0xff
446396   }
447397}
448398
449399WRITE8_MEMBER(a7800_state::a7800_MARIA_w)
450400{
451   UINT8 *ROM = m_region_maincpu->base();
401   int i;
402   
403   if ((offset & 3) != 0)
404      m_maria_palette[offset] = data;
405
452406   switch (offset)
453407   {
454408      case 0x00:
455         m_maria_backcolor = data;
456         // 20030621 ericball added m_maria_palette[pal][0] to make kanagroo mode easier
457         m_maria_palette[0][0]=m_maria_backcolor;
458         m_maria_palette[1][0]=m_maria_backcolor;
459         m_maria_palette[2][0]=m_maria_backcolor;
460         m_maria_palette[3][0]=m_maria_backcolor;
461         m_maria_palette[4][0]=m_maria_backcolor;
462         m_maria_palette[5][0]=m_maria_backcolor;
463         m_maria_palette[6][0]=m_maria_backcolor;
464         m_maria_palette[7][0]=m_maria_backcolor;
409         // 0x04 etc. necessary for 320 modes (pixels with color of 00 should display as background color)
410         for (i = 0; i<8; i++)
411            m_maria_palette[4*i] = data;
465412         break;
466      case 0x01:
467         m_maria_palette[0][1] = data;
468         break;
469      case 0x02:
470         m_maria_palette[0][2] = data;
471         break;
472      case 0x03:
473         m_maria_palette[0][3] = data;
474         break;
475413      case 0x04:
476414         m_maincpu->spin_until_trigger(TRIGGER_HSYNC);
477415         m_maria_wsync=1;
478416         break;
479
480      case 0x05:
481         m_maria_palette[1][1] = data;
417      case 0x0C: // DPPH
418         m_maria_dpp = (m_maria_dpp & 0x00ff) | (data << 8);
482419         break;
483      case 0x06:
484         m_maria_palette[1][2] = data;
420      case 0x10: // DPPL
421         m_maria_dpp = (m_maria_dpp & 0xff00) | data;
485422         break;
486      case 0x07:
487         m_maria_palette[1][3] = data;
488         break;
489
490      case 0x09:
491         m_maria_palette[2][1] = data;
492         break;
493      case 0x0A:
494         m_maria_palette[2][2] = data;
495         break;
496      case 0x0B:
497         m_maria_palette[2][3] = data;
498         break;
499
500      case 0x0D:
501         m_maria_palette[3][1] = data;
502         break;
503      case 0x0E:
504         m_maria_palette[3][2] = data;
505         break;
506      case 0x0F:
507         m_maria_palette[3][3] = data;
508         break;
509
510      case 0x11:
511         m_maria_palette[4][1] = data;
512         break;
513      case 0x12:
514         m_maria_palette[4][2] = data;
515         break;
516      case 0x13:
517         m_maria_palette[4][3] = data;
518         break;
519423      case 0x14:
520424         m_maria_charbase = (data << 8);
521425         break;
522      case 0x15:
523         m_maria_palette[5][1] = data;
524         break;
525      case 0x16:
526         m_maria_palette[5][2] = data;
527         break;
528      case 0x17:
529         m_maria_palette[5][3] = data;
530         break;
531
532      case 0x19:
533         m_maria_palette[6][1] = data;
534         break;
535      case 0x1A:
536         m_maria_palette[6][2] = data;
537         break;
538      case 0x1B:
539         m_maria_palette[6][3] = data;
540         break;
541
542426      case 0x1C:
543427         /*logerror("MARIA CTRL=%x\n",data);*/
544428         m_maria_color_kill = data & 0x80;
545         if ((data & 0x60) == 0x40)
429         switch ((data >> 5) & 3)
430         {
431            case 0x00: case 01:
432            logerror("dma test mode, do not use.\n");
433            break;
434            case 0x02:
546435            m_maria_dmaon = 1;
547         else
548            m_maria_dmaon = m_maria_dodma = 0;
549
436            break;
437            case 0x03:
438            m_maria_dmaon = 0;
439            break;
440         }
550441         m_maria_cwidth = data & 0x10;
551         m_maria_bcntl = data & 0x08;
442         m_maria_bcntl = data & 0x08; // Currently unimplemented as we don't display the border
552443         m_maria_kangaroo = data & 0x04;
553444         m_maria_rm = data & 0x03;
554445
r22828r22829
561452                 m_maria_rm );*/
562453
563454         break;
564      case 0x1D:
565         m_maria_palette[7][1] = data;
566         break;
567      case 0x1E:
568         m_maria_palette[7][2] = data;
569         break;
570      case 0x1F:
571         m_maria_palette[7][3] = data;
572         break;
573455   }
574   ROM[ 0x20 + offset ] = data;
575456}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team