Previous 15994 Revisions Next

r14166 Tuesday 24th January, 2012 at 21:50:06 UTC by Angelo Salese
Improved CGA emulation in VGA (and at least nailed a bug with read/write handlers)
[src/emu/video]pc_vga.c

src/emu/video/pc_vga.c
r14165r14166
185185#define FONT1 (  ((vga.sequencer.data[3]&0x3)    |((vga.sequencer.data[3]&0x10)<<2))*0x2000 )
186186#define FONT2 ( (((vga.sequencer.data[3]&0xc)>>2)|((vga.sequencer.data[3]&0x20)<<3))*0x2000 )
187187
188static int pc_current_height;
189static int pc_current_width;
190188
191189/***************************************************************************
192190
r14165r14166
207205
208206void pc_video_start(running_machine &machine)
209207{
210//  pc_choosevideomode = choosevideomode;
211   pc_current_height = -1;
212   pc_current_width = -1;
208   // ...
213209}
214210
215211static void vga_vh_text(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect)
r14165r14166
403399static void vga_vh_cga(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect)
404400{
405401   UINT32 *bitmapline;
406   //int height = vga.crtc.maximum_scan_line * (vga.crtc.scan_doubling + 1);
407   int x,y,yi;
402   int height = (vga.crtc.scan_doubling + 1);
403   int x,xi,y,yi;
408404   UINT32 addr;
409405   pen_t pen;
406   int width;
410407
411408   addr = 0;
409   width = (vga.crtc.horz_disp_end + 1) * 8;
412410
413   for(y=0;y<200;y++)
411   for(y=0;y<LINES;y++)
414412   {
415      //addr = (y) * test;
413      addr = ((y & 1) * 0x2000) + (((y & ~1) >> 1) * width/4);
416414
417      for(x=0;x<640;x+=16)
415      for(x=0;x<width;x+=4)
418416      {
419         for(yi=0;yi<1;yi++)
417         for(yi=0;yi<height;yi++)
420418         {
421            bitmapline = &bitmap.pix32(y + yi);
419            bitmapline = &bitmap.pix32(y * height + yi);
422420
423            /* TODO: debug dirty assignment */
421            for(xi=0;xi<4;xi++)
424422            {
425               pen = vga.pens[(vga.memory[addr] >> (6)) & 3];
426               bitmapline[x+0] = pen;
427               pen = vga.pens[(vga.memory[addr] >> (4)) & 3];
428               bitmapline[x+1] = pen;
429               pen = vga.pens[(vga.memory[addr] >> (2)) & 3];
430               bitmapline[x+2] = pen;
431               pen = vga.pens[(vga.memory[addr] >> (0)) & 3];
432               bitmapline[x+3] = pen;
433               pen = vga.pens[(vga.memory[addr+0x4000] >> (6)) & 3];
434               bitmapline[x+4] = pen;
435               pen = vga.pens[(vga.memory[addr+0x4000] >> (4)) & 3];
436               bitmapline[x+5] = pen;
437               pen = vga.pens[(vga.memory[addr+0x4000] >> (2)) & 3];
438               bitmapline[x+6] = pen;
439               pen = vga.pens[(vga.memory[addr+0x4000] >> (0)) & 3];
440               bitmapline[x+7] = pen;
441               pen = vga.pens[(vga.memory[addr+1] >> (6)) & 3];
442               bitmapline[x+8] = pen;
443               pen = vga.pens[(vga.memory[addr+1] >> (4)) & 3];
444               bitmapline[x+9] = pen;
445               pen = vga.pens[(vga.memory[addr+1] >> (2)) & 3];
446               bitmapline[x+10] = pen;
447               pen = vga.pens[(vga.memory[addr+1] >> (0)) & 3];
448               bitmapline[x+11] = pen;
449               pen = vga.pens[(vga.memory[addr+1+0x4000] >> (6)) & 3];
450               bitmapline[x+12] = pen;
451               pen = vga.pens[(vga.memory[addr+1+0x4000] >> (4)) & 3];
452               bitmapline[x+13] = pen;
453               pen = vga.pens[(vga.memory[addr+1+0x4000] >> (2)) & 3];
454               bitmapline[x+14] = pen;
455               pen = vga.pens[(vga.memory[addr+1+0x4000] >> (0)) & 3];
456               bitmapline[x+15] = pen;
423               pen = vga.pens[(vga.memory[addr] >> (6-xi*2)) & 3];
424               if(!machine.primary_screen->visible_area().contains(x+xi, y * height + yi))
425                  continue;
426               bitmapline[x+xi] = pen;
457427            }
458428         }
459429
460         //popmessage("%02x %02x %02x %02x %02x %02x %02x %02x",vga.memory[0],vga.memory[1],vga.memory[2],vga.memory[3],vga.memory[4],vga.memory[5],vga.memory[6],vga.memory[7]);
461
462         addr+=2;
430         addr++;
463431      }
464432   }
465433}
r14165r14166
557525      }
558526      else if (vga.gc.data[5]&0x20)
559527      {
528         // cga
560529         return 3;
561530      }
562531      else if ((vga.gc.data[6]&0x0c) == 0x0c)
563532      {
533         // mono
564534         return 4;
565535      }
566536      else
r14165r14166
610580   vga.memory[offset] = data;
611581}
612582
583static READ8_HANDLER(vga_cga_r)
584{
585   int data;
586   data=vga.memory[offset];
587
588   return data;
589}
590
591static WRITE8_HANDLER(vga_cga_w)
592{
593   vga.memory[offset] = data;
594}
595
596
597
613598static READ8_HANDLER(vga_text_r)
614599{
615600   int data;
r14165r14166
12881273   {
12891274      read_handler = vga_ega_r;
12901275   }
1276   else if (vga.gc.data[5]&0x20)
1277   {
1278      read_handler = vga_cga_r;
1279   }
12911280   else
12921281   {
12931282      read_handler = vga_text_r;
r14165r14166
13051294WRITE8_HANDLER(vga_mem_w)
13061295{
13071296   write8_space_func write_handler;
1297
13081298   if (vga.sequencer.data[4]&8)
13091299   {
13101300      write_handler = vga_vga_w;
r14165r14166
13131303   {
13141304      write_handler = vga_ega_w;
13151305   }
1306   else if (vga.gc.data[5]&0x20)
1307   {
1308      write_handler = vga_cga_w;
1309   }
13161310   else
13171311   {
13181312      write_handler = vga_text_w;
r14165r14166
14131407{
14141408   int i;
14151409   for (i = 0; i < 0x100; i++)
1416      palette_set_color_rgb(machine, i, 0, 0, 0);   
1410      palette_set_color_rgb(machine, i, 0, 0, 0);
14171411   pc_video_start(machine);
14181412}
14191413

Previous 15994 Revisions Next


© 1998-2018 The MESS Team