src/emu/video/pc_vga.c
| r14165 | r14166 | |
| 185 | 185 | #define FONT1 ( ((vga.sequencer.data[3]&0x3) |((vga.sequencer.data[3]&0x10)<<2))*0x2000 ) |
| 186 | 186 | #define FONT2 ( (((vga.sequencer.data[3]&0xc)>>2)|((vga.sequencer.data[3]&0x20)<<3))*0x2000 ) |
| 187 | 187 | |
| 188 | | static int pc_current_height; |
| 189 | | static int pc_current_width; |
| 190 | 188 | |
| 191 | 189 | /*************************************************************************** |
| 192 | 190 | |
| r14165 | r14166 | |
| 207 | 205 | |
| 208 | 206 | void pc_video_start(running_machine &machine) |
| 209 | 207 | { |
| 210 | | // pc_choosevideomode = choosevideomode; |
| 211 | | pc_current_height = -1; |
| 212 | | pc_current_width = -1; |
| 208 | // ... |
| 213 | 209 | } |
| 214 | 210 | |
| 215 | 211 | static void vga_vh_text(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| r14165 | r14166 | |
| 403 | 399 | static void vga_vh_cga(running_machine &machine, bitmap_rgb32 &bitmap, const rectangle &cliprect) |
| 404 | 400 | { |
| 405 | 401 | 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; |
| 408 | 404 | UINT32 addr; |
| 409 | 405 | pen_t pen; |
| 406 | int width; |
| 410 | 407 | |
| 411 | 408 | addr = 0; |
| 409 | width = (vga.crtc.horz_disp_end + 1) * 8; |
| 412 | 410 | |
| 413 | | for(y=0;y<200;y++) |
| 411 | for(y=0;y<LINES;y++) |
| 414 | 412 | { |
| 415 | | //addr = (y) * test; |
| 413 | addr = ((y & 1) * 0x2000) + (((y & ~1) >> 1) * width/4); |
| 416 | 414 | |
| 417 | | for(x=0;x<640;x+=16) |
| 415 | for(x=0;x<width;x+=4) |
| 418 | 416 | { |
| 419 | | for(yi=0;yi<1;yi++) |
| 417 | for(yi=0;yi<height;yi++) |
| 420 | 418 | { |
| 421 | | bitmapline = &bitmap.pix32(y + yi); |
| 419 | bitmapline = &bitmap.pix32(y * height + yi); |
| 422 | 420 | |
| 423 | | /* TODO: debug dirty assignment */ |
| 421 | for(xi=0;xi<4;xi++) |
| 424 | 422 | { |
| 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; |
| 457 | 427 | } |
| 458 | 428 | } |
| 459 | 429 | |
| 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++; |
| 463 | 431 | } |
| 464 | 432 | } |
| 465 | 433 | } |
| r14165 | r14166 | |
| 557 | 525 | } |
| 558 | 526 | else if (vga.gc.data[5]&0x20) |
| 559 | 527 | { |
| 528 | // cga |
| 560 | 529 | return 3; |
| 561 | 530 | } |
| 562 | 531 | else if ((vga.gc.data[6]&0x0c) == 0x0c) |
| 563 | 532 | { |
| 533 | // mono |
| 564 | 534 | return 4; |
| 565 | 535 | } |
| 566 | 536 | else |
| r14165 | r14166 | |
| 610 | 580 | vga.memory[offset] = data; |
| 611 | 581 | } |
| 612 | 582 | |
| 583 | static READ8_HANDLER(vga_cga_r) |
| 584 | { |
| 585 | int data; |
| 586 | data=vga.memory[offset]; |
| 587 | |
| 588 | return data; |
| 589 | } |
| 590 | |
| 591 | static WRITE8_HANDLER(vga_cga_w) |
| 592 | { |
| 593 | vga.memory[offset] = data; |
| 594 | } |
| 595 | |
| 596 | |
| 597 | |
| 613 | 598 | static READ8_HANDLER(vga_text_r) |
| 614 | 599 | { |
| 615 | 600 | int data; |
| r14165 | r14166 | |
| 1288 | 1273 | { |
| 1289 | 1274 | read_handler = vga_ega_r; |
| 1290 | 1275 | } |
| 1276 | else if (vga.gc.data[5]&0x20) |
| 1277 | { |
| 1278 | read_handler = vga_cga_r; |
| 1279 | } |
| 1291 | 1280 | else |
| 1292 | 1281 | { |
| 1293 | 1282 | read_handler = vga_text_r; |
| r14165 | r14166 | |
| 1305 | 1294 | WRITE8_HANDLER(vga_mem_w) |
| 1306 | 1295 | { |
| 1307 | 1296 | write8_space_func write_handler; |
| 1297 | |
| 1308 | 1298 | if (vga.sequencer.data[4]&8) |
| 1309 | 1299 | { |
| 1310 | 1300 | write_handler = vga_vga_w; |
| r14165 | r14166 | |
| 1313 | 1303 | { |
| 1314 | 1304 | write_handler = vga_ega_w; |
| 1315 | 1305 | } |
| 1306 | else if (vga.gc.data[5]&0x20) |
| 1307 | { |
| 1308 | write_handler = vga_cga_w; |
| 1309 | } |
| 1316 | 1310 | else |
| 1317 | 1311 | { |
| 1318 | 1312 | write_handler = vga_text_w; |
| r14165 | r14166 | |
| 1413 | 1407 | { |
| 1414 | 1408 | int i; |
| 1415 | 1409 | 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); |
| 1417 | 1411 | pc_video_start(machine); |
| 1418 | 1412 | } |
| 1419 | 1413 | |