PCem
view src/vid_vga.c @ 131:f22b6152c221
Fixed memory mapping on ISA video cards - should now work on Award 430VX PCI.
| author | TomW |
|---|---|
| date | Wed Jul 16 20:00:34 2014 +0100 |
| parents | 036dc3a418ac |
| children | 24b744b9a632 |
line source
1 /*IBM VGA emulation*/
2 #include <stdlib.h>
3 #include "ibm.h"
4 #include "device.h"
5 #include "io.h"
6 #include "mem.h"
7 #include "rom.h"
8 #include "video.h"
9 #include "vid_svga.h"
10 #include "vid_vga.h"
12 typedef struct vga_t
13 {
14 svga_t svga;
16 rom_t bios_rom;
17 } vga_t;
19 void vga_out(uint16_t addr, uint8_t val, void *p)
20 {
21 vga_t *vga = (vga_t *)p;
22 svga_t *svga = &vga->svga;
23 uint8_t old;
25 // pclog("vga_out : %04X %02X %04X:%04X %02X %i\n", addr, val, CS,pc, ram[0x489], ins);
27 if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1))
28 addr ^= 0x60;
30 switch (addr)
31 {
32 case 0x3D4:
33 svga->crtcreg = val & 0x1f;
34 return;
35 case 0x3D5:
36 if (svga->crtcreg <= 7 && svga->crtc[0x11] & 0x80) return;
37 old = svga->crtc[svga->crtcreg];
38 svga->crtc[svga->crtcreg] = val;
39 if (old != val)
40 {
41 if (svga->crtcreg < 0xe || svga->crtcreg > 0x10)
42 {
43 svga->fullchange = changeframecount;
44 svga_recalctimings(svga);
45 }
46 }
47 break;
48 }
49 svga_out(addr, val, svga);
50 }
52 uint8_t vga_in(uint16_t addr, void *p)
53 {
54 vga_t *vga = (vga_t *)p;
55 svga_t *svga = &vga->svga;
56 uint8_t temp;
58 // if (addr != 0x3da) pclog("vga_in : %04X ", addr);
60 if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1))
61 addr ^= 0x60;
63 switch (addr)
64 {
65 case 0x3D4:
66 temp = svga->crtcreg;
67 break;
68 case 0x3D5:
69 temp = svga->crtc[svga->crtcreg];
70 break;
71 default:
72 temp = svga_in(addr, svga);
73 break;
74 }
75 // if (addr != 0x3da) pclog("%02X %04X:%04X\n", temp, CS,pc);
76 return temp;
77 }
79 void *vga_init()
80 {
81 vga_t *vga = malloc(sizeof(vga_t));
82 memset(vga, 0, sizeof(vga_t));
84 rom_init(&vga->bios_rom, "roms/ibm_vga.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL);
86 svga_init(&vga->svga, vga, 1 << 18, /*256kb*/
87 NULL,
88 vga_in, vga_out,
89 NULL,
90 NULL);
92 io_sethandler(0x03c0, 0x0020, vga_in, NULL, NULL, vga_out, NULL, NULL, vga);
94 vga->svga.bpp = 8;
95 vga->svga.miscout = 1;
97 return vga;
98 }
100 static int vga_available()
101 {
102 return rom_present("roms/ibm_vga.bin");
103 }
105 void vga_close(void *p)
106 {
107 vga_t *vga = (vga_t *)p;
109 svga_close(&vga->svga);
111 free(vga);
112 }
114 void vga_speed_changed(void *p)
115 {
116 vga_t *vga = (vga_t *)p;
118 svga_recalctimings(&vga->svga);
119 }
121 void vga_force_redraw(void *p)
122 {
123 vga_t *vga = (vga_t *)p;
125 vga->svga.fullchange = changeframecount;
126 }
128 int vga_add_status_info(char *s, int max_len, void *p)
129 {
130 vga_t *vga = (vga_t *)p;
132 return svga_add_status_info(s, max_len, &vga->svga);
133 }
135 device_t vga_device =
136 {
137 "VGA",
138 DEVICE_NOT_WORKING,
139 vga_init,
140 vga_close,
141 vga_available,
142 vga_speed_changed,
143 vga_force_redraw,
144 vga_add_status_info
145 };
