25 |
* SUCH DAMAGE. |
* SUCH DAMAGE. |
26 |
* |
* |
27 |
* |
* |
28 |
* $Id: dev_vga.c,v 1.86 2005/10/27 14:01:14 debug Exp $ |
* $Id: dev_vga.c,v 1.90 2005/11/13 00:14:10 debug Exp $ |
29 |
* |
* |
30 |
* VGA charcell and graphics device. |
* VGA charcell and graphics device. |
31 |
* |
* |
53 |
|
|
54 |
|
|
55 |
/* For videomem -> framebuffer updates: */ |
/* For videomem -> framebuffer updates: */ |
56 |
#define VGA_TICK_SHIFT 19 |
#define VGA_TICK_SHIFT 18 |
57 |
|
|
58 |
#define MAX_RETRACE_SCANLINES 420 |
#define MAX_RETRACE_SCANLINES 420 |
59 |
#define N_IS1_READ_THRESHOLD 50 |
#define N_IS1_READ_THRESHOLD 50 |
777 |
case 0x01: |
case 0x01: |
778 |
d->cur_mode = MODE_CHARCELL; |
d->cur_mode = MODE_CHARCELL; |
779 |
d->max_x = 40; d->max_y = 25; |
d->max_x = 40; d->max_y = 25; |
780 |
d->pixel_repx = 2; d->pixel_repy = 1; |
d->pixel_repx = machine->x11_scaleup * 2; |
781 |
|
d->pixel_repy = machine->x11_scaleup; |
782 |
d->font_width = 8; |
d->font_width = 8; |
783 |
d->font_height = 16; |
d->font_height = 16; |
784 |
d->font = font8x16; |
d->font = font8x16; |
788 |
case 0x03: |
case 0x03: |
789 |
d->cur_mode = MODE_CHARCELL; |
d->cur_mode = MODE_CHARCELL; |
790 |
d->max_x = 80; d->max_y = 25; |
d->max_x = 80; d->max_y = 25; |
791 |
d->pixel_repx = d->pixel_repy = 1; |
d->pixel_repx = d->pixel_repy = machine->x11_scaleup; |
792 |
d->font_width = 8; |
d->font_width = 8; |
793 |
d->font_height = 16; |
d->font_height = 16; |
794 |
d->font = font8x16; |
d->font = font8x16; |
798 |
d->max_x = 160; d->max_y = 200; |
d->max_x = 160; d->max_y = 200; |
799 |
d->graphics_mode = GRAPHICS_MODE_4BIT; |
d->graphics_mode = GRAPHICS_MODE_4BIT; |
800 |
d->bits_per_pixel = 4; |
d->bits_per_pixel = 4; |
801 |
d->pixel_repx = 4; |
d->pixel_repx = 4 * machine->x11_scaleup; |
802 |
d->pixel_repy = 2; |
d->pixel_repy = 2 * machine->x11_scaleup; |
803 |
break; |
break; |
804 |
case 0x09: |
case 0x09: |
805 |
case 0x0d: |
case 0x0d: |
807 |
d->max_x = 320; d->max_y = 200; |
d->max_x = 320; d->max_y = 200; |
808 |
d->graphics_mode = GRAPHICS_MODE_4BIT; |
d->graphics_mode = GRAPHICS_MODE_4BIT; |
809 |
d->bits_per_pixel = 4; |
d->bits_per_pixel = 4; |
810 |
d->pixel_repx = d->pixel_repy = 2; |
d->pixel_repx = d->pixel_repy = |
811 |
|
2 * machine->x11_scaleup; |
812 |
break; |
break; |
813 |
case 0x0e: |
case 0x0e: |
814 |
d->cur_mode = MODE_GRAPHICS; |
d->cur_mode = MODE_GRAPHICS; |
815 |
d->max_x = 640; d->max_y = 200; |
d->max_x = 640; d->max_y = 200; |
816 |
d->graphics_mode = GRAPHICS_MODE_4BIT; |
d->graphics_mode = GRAPHICS_MODE_4BIT; |
817 |
d->bits_per_pixel = 4; |
d->bits_per_pixel = 4; |
818 |
d->pixel_repx = 1; |
d->pixel_repx = machine->x11_scaleup; |
819 |
d->pixel_repy = 2; |
d->pixel_repy = machine->x11_scaleup * 2; |
820 |
break; |
break; |
821 |
case 0x10: |
case 0x10: |
822 |
d->cur_mode = MODE_GRAPHICS; |
d->cur_mode = MODE_GRAPHICS; |
823 |
d->max_x = 640; d->max_y = 350; |
d->max_x = 640; d->max_y = 350; |
824 |
d->graphics_mode = GRAPHICS_MODE_4BIT; |
d->graphics_mode = GRAPHICS_MODE_4BIT; |
825 |
d->bits_per_pixel = 4; |
d->bits_per_pixel = 4; |
826 |
d->pixel_repx = d->pixel_repy = 1; |
d->pixel_repx = d->pixel_repy = machine->x11_scaleup; |
827 |
break; |
break; |
828 |
case 0x12: |
case 0x12: |
829 |
d->cur_mode = MODE_GRAPHICS; |
d->cur_mode = MODE_GRAPHICS; |
830 |
d->max_x = 640; d->max_y = 480; |
d->max_x = 640; d->max_y = 480; |
831 |
d->graphics_mode = GRAPHICS_MODE_4BIT; |
d->graphics_mode = GRAPHICS_MODE_4BIT; |
832 |
d->bits_per_pixel = 4; |
d->bits_per_pixel = 4; |
833 |
d->pixel_repx = d->pixel_repy = 1; |
d->pixel_repx = d->pixel_repy = machine->x11_scaleup; |
834 |
break; |
break; |
835 |
case 0x13: |
case 0x13: |
836 |
d->cur_mode = MODE_GRAPHICS; |
d->cur_mode = MODE_GRAPHICS; |
837 |
d->max_x = 320; d->max_y = 200; |
d->max_x = 320; d->max_y = 200; |
838 |
d->graphics_mode = GRAPHICS_MODE_8BIT; |
d->graphics_mode = GRAPHICS_MODE_8BIT; |
839 |
d->bits_per_pixel = 8; |
d->bits_per_pixel = 8; |
840 |
d->pixel_repx = d->pixel_repy = 2; |
d->pixel_repx = d->pixel_repy = |
841 |
|
2 * machine->x11_scaleup; |
842 |
break; |
break; |
843 |
default: |
default: |
844 |
fatal("TODO! video mode change hack (mode 0x%02x)\n", |
fatal("TODO! video mode change hack (mode 0x%02x)\n", |
894 |
int regnr, int idata) |
int regnr, int idata) |
895 |
{ |
{ |
896 |
switch (regnr) { |
switch (regnr) { |
897 |
case VGA_SEQ_MAP_MASK: /* 0x02 */ |
case VGA_SEQ_RESET: |
898 |
|
case VGA_SEQ_MAP_MASK: |
899 |
|
case VGA_SEQ_SEQUENCER_MEMORY_MODE: |
900 |
|
debug("[ vga_sequencer_reg_write: select %i: TODO ]\n", regnr); |
901 |
break; |
break; |
902 |
default:fatal("[ vga_sequencer_reg_write: select %i ]\n", regnr); |
default:fatal("[ vga_sequencer_reg_write: select %i ]\n", regnr); |
903 |
/* cpu->running = 0; */ |
/* cpu->running = 0; */ |
914 |
struct vga_data *d, int regnr, int idata) |
struct vga_data *d, int regnr, int idata) |
915 |
{ |
{ |
916 |
switch (regnr) { |
switch (regnr) { |
917 |
case VGA_GRAPHCONTR_MASK: /* 0x08 */ |
case VGA_GRAPHCONTR_READMAPSELECT: |
918 |
|
case VGA_GRAPHCONTR_GRAPHICSMODE: |
919 |
|
case VGA_GRAPHCONTR_MISC: |
920 |
|
case VGA_GRAPHCONTR_MASK: |
921 |
|
debug("[ vga_graphcontr_reg_write: select %i: TODO ]\n", regnr); |
922 |
break; |
break; |
923 |
default:fatal("[ vga_graphcontr_reg_write: select %i ]\n", regnr); |
default:fatal("[ vga_graphcontr_reg_write: select %i ]\n", regnr); |
924 |
/* cpu->running = 0; */ |
/* cpu->running = 0; */ |
1199 |
d->control_base = control_base; |
d->control_base = control_base; |
1200 |
d->max_x = 80; |
d->max_x = 80; |
1201 |
d->max_y = 25; |
d->max_y = 25; |
|
d->pixel_repx = 1; |
|
|
d->pixel_repy = 1; |
|
1202 |
d->cur_mode = MODE_CHARCELL; |
d->cur_mode = MODE_CHARCELL; |
1203 |
d->crtc_reg[0xff] = 0x03; |
d->crtc_reg[0xff] = 0x03; |
1204 |
d->charcells_size = 0x8000; |
d->charcells_size = 0x8000; |
1205 |
d->gfx_mem_size = 1; /* Nothing, as we start in text mode */ |
d->gfx_mem_size = 1; /* Nothing, as we start in text mode */ |
1206 |
|
d->pixel_repx = d->pixel_repy = machine->x11_scaleup; |
1207 |
|
|
1208 |
/* Allocate in full pages, to make it possible to use bintrans: */ |
/* Allocate in full pages, to make it possible to use bintrans: */ |
1209 |
allocsize = ((d->charcells_size-1) | (machine->arch_pagesize-1)) + 1; |
allocsize = ((d->charcells_size-1) | (machine->arch_pagesize-1)) + 1; |
1241 |
} |
} |
1242 |
|
|
1243 |
memory_device_register(mem, "vga_charcells", videomem_base + 0x18000, |
memory_device_register(mem, "vga_charcells", videomem_base + 0x18000, |
1244 |
allocsize, dev_vga_access, d, MEM_DYNTRANS_OK | |
allocsize, dev_vga_access, d, DM_DYNTRANS_OK | |
1245 |
MEM_DYNTRANS_WRITE_OK | MEM_READING_HAS_NO_SIDE_EFFECTS, |
DM_DYNTRANS_WRITE_OK | DM_READS_HAVE_NO_SIDE_EFFECTS, |
1246 |
d->charcells); |
d->charcells); |
1247 |
memory_device_register(mem, "vga_gfx", videomem_base, GFX_ADDR_WINDOW, |
memory_device_register(mem, "vga_gfx", videomem_base, GFX_ADDR_WINDOW, |
1248 |
dev_vga_graphics_access, d, MEM_DEFAULT | |
dev_vga_graphics_access, d, DM_DEFAULT | |
1249 |
MEM_READING_HAS_NO_SIDE_EFFECTS, d->gfx_mem); |
DM_READS_HAVE_NO_SIDE_EFFECTS, d->gfx_mem); |
1250 |
memory_device_register(mem, "vga_ctrl", control_base, |
memory_device_register(mem, "vga_ctrl", control_base, |
1251 |
32, dev_vga_ctrl_access, d, MEM_DEFAULT, NULL); |
32, dev_vga_ctrl_access, d, DM_DEFAULT, NULL); |
1252 |
|
|
1253 |
d->fb = dev_fb_init(machine, mem, VGA_FB_ADDR, VFB_GENERIC, |
d->fb = dev_fb_init(machine, mem, VGA_FB_ADDR, VFB_GENERIC, |
1254 |
d->fb_max_x, d->fb_max_y, d->fb_max_x, d->fb_max_y, 24, "VGA"); |
d->fb_max_x, d->fb_max_y, d->fb_max_x, d->fb_max_y, 24, "VGA"); |