X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=src%2Fdos%2Fvga.c;h=376e72b22a5c7c0a49438d5445cfc8babc3f259d;hp=c82968488f6164c223e42252f02a8d0279a65a9b;hb=eac1e3782f789d71fe6e232065bf363def77ddf1;hpb=41ed01ac9da8048d41bb030e75e93a4358963f59 diff --git a/src/dos/vga.c b/src/dos/vga.c index c829684..376e72b 100644 --- a/src/dos/vga.c +++ b/src/dos/vga.c @@ -1,5 +1,10 @@ #include "vga.h" +#include "vgaregs.h" #include "cdpmi.h" +#include "dosutil.h" + +static void crtc_write(int reg, unsigned char val); +static unsigned char crtc_read(int reg); int vga_setmode(int mode) { @@ -9,3 +14,57 @@ int vga_setmode(int mode) dpmi_int(0x10, ®s); return 0; } + +static unsigned short crtc_modex_regs[] = { + 0x0d06, /* vertical total */ + 0x3e07, /* vcount overflow bit */ + 0x4109, /* double-scan */ + 0xea10, /* vsync start */ + 0xac11, /* vsync end & protect */ + 0xdf12, /* vertical visible */ + 0x0014, /* no dword mode */ + 0xe715, /* vblank start */ + 0x0616, /* vblank end */ + 0xe317, /* byte mode */ + 0 +}; + +int vga_setmodex(void) +{ + int i; + unsigned char val; + + vga_setmode(0x13); + + /* disable chain-4 (C4=0, O/E=1 (sequential), EM=1 (extmem), A/G=0 (gfx) */ + outpw(VGA_SC_ADDR_PORT, VGA_SC_MEMMODE_REG | 0x0600); + /* pull reset low */ + outpw(VGA_SC_ADDR_PORT, VGA_SC_RESET_REG | 0x0100); + /* 25mhz dot clock, 60hz scan */ + outp(VGA_MISC_PORT, VGA_MISC_480 | VGA_MISC_PG1 | VGA_MISC_CLK25 | + VGA_MISC_CPUEN | VGA_MISC_COLOR); + /* return reset high */ + outpw(VGA_SC_ADDR_PORT, VGA_SC_RESET_REG | 0x0300); + + /* disable CRTC write-protect */ + crtc_write(CRTC_VRETEND_REG, crtc_read(CRTC_VRETEND_REG) & ~CRTC_VRETEND_PR); + /* change CRTC registers */ + for(i=0; crtc_modex_regs[i]; i++) { + outpw(VGA_CRTC_PORT, crtc_modex_regs[i]); + } + + vga_planemask(0xf); + memset(VGA_FBADDR, 3, 320 * 240 / 4); + return 0; +} + +static void crtc_write(int reg, unsigned char val) +{ + outpw(VGA_CRTC_ADDR_PORT, reg | ((unsigned int)val << 8)); +} + +static unsigned char crtc_read(int reg) +{ + outp(VGA_CRTC_ADDR_PORT, reg); + return inp(VGA_CRTC_DATA_PORT); +}