Add cga_mono machine
Emulates the user using a CGA card with a monochrome monitor. Monochrome monitor options are: green, amber, white or paperwhite. The color can be changed at runtime with F11. Include paperwhite color by Basic <basic@vogons.org> https://www.vogons.org/viewtopic.php?p=587382#p587382 Vogons thread: https://www.vogons.org/viewtopic.php?f=41&t=29101 Signed-off-by: Michael Zijlstra <mzijlstra@gmail.com> Signed-off-by: Patryk Obara <dreamer.tan@gmail.com> Imported-from: https://www.vogons.org/viewtopic.php?p=238045#p238045
This commit is contained in:
parent
46e5fdee69
commit
ffe3c5ab7f
6 changed files with 93 additions and 10 deletions
|
@ -62,6 +62,7 @@ enum SVGACards {
|
|||
extern SVGACards svgaCard;
|
||||
extern MachineType machine;
|
||||
extern bool SDLNetInited;
|
||||
extern bool mono_cga;
|
||||
|
||||
#define IS_TANDY_ARCH ((machine==MCH_TANDY) || (machine==MCH_PCJR))
|
||||
#define IS_EGAVGA_ARCH ((machine==MCH_EGA) || (machine==MCH_VGA))
|
||||
|
|
|
@ -413,6 +413,9 @@ typedef struct {
|
|||
/* Hercules Palette function */
|
||||
void Herc_Palette(void);
|
||||
|
||||
/* CGA Mono Palette function */
|
||||
void Mono_CGA_Palette(void);
|
||||
|
||||
/* Functions for different resolutions */
|
||||
void VGA_SetMode(VGAModes mode);
|
||||
void VGA_DetermineMode(void);
|
||||
|
|
|
@ -130,6 +130,8 @@ Bit32u ticksScheduled;
|
|||
bool ticksLocked;
|
||||
void increaseticks();
|
||||
|
||||
bool mono_cga=false;
|
||||
|
||||
static Bitu Normal_Loop(void) {
|
||||
Bits ret;
|
||||
while (1) {
|
||||
|
@ -364,7 +366,8 @@ static void DOSBOX_RealInit(Section * sec) {
|
|||
machine = MCH_VGA;
|
||||
int10.vesa_nolfb = false;
|
||||
int10.vesa_oldvbe = false;
|
||||
if (mtype == "cga") { machine = MCH_CGA; }
|
||||
if (mtype == "cga") { machine = MCH_CGA; mono_cga = false; }
|
||||
else if (mtype == "cga_mono") { machine = MCH_CGA; mono_cga = true; }
|
||||
else if (mtype == "tandy") { machine = MCH_TANDY; }
|
||||
else if (mtype == "pcjr") { machine = MCH_PCJR; }
|
||||
else if (mtype == "hercules") { machine = MCH_HERC; }
|
||||
|
@ -403,7 +406,7 @@ void DOSBOX_Init(void) {
|
|||
|
||||
/* Setup all the different modules making up DOSBox */
|
||||
const char* machines[] = {
|
||||
"hercules", "cga", "tandy", "pcjr", "ega",
|
||||
"hercules", "cga", "cga_mono", "tandy", "pcjr", "ega",
|
||||
"vgaonly", "svga_s3", "svga_et3000", "svga_et4000",
|
||||
"svga_paradise", "vesa_nolfb", "vesa_oldvbe", 0 };
|
||||
secprop=control->AddSection_prop("dosbox",&DOSBOX_RealInit);
|
||||
|
|
|
@ -182,6 +182,43 @@ static bool new_cga = 0;
|
|||
static Bit8u cga16_val = 0;
|
||||
static void update_cga16_color(void);
|
||||
static Bit8u herc_pal = 0;
|
||||
static Bit8u mono_cga_pal = 0;
|
||||
static Bit8u mono_cga_bright = 0;
|
||||
static Bit8u mono_cga_palettes[8][16][3] =
|
||||
{
|
||||
{ // 0 - green, 4-color-optimized contrast
|
||||
{0x00,0x00,0x00},{0x00,0x0d,0x03},{0x01,0x17,0x05},{0x01,0x1a,0x06},{0x02,0x28,0x09},{0x02,0x2c,0x0a},{0x03,0x39,0x0d},{0x03,0x3c,0x0e},
|
||||
{0x00,0x07,0x01},{0x01,0x13,0x04},{0x01,0x1f,0x07},{0x01,0x23,0x08},{0x02,0x31,0x0b},{0x02,0x35,0x0c},{0x05,0x3f,0x11},{0x0d,0x3f,0x17},
|
||||
},
|
||||
{ // 1 - green, 16-color-optimized contrast
|
||||
{0x00,0x00,0x00},{0x00,0x0d,0x03},{0x01,0x15,0x05},{0x01,0x17,0x05},{0x01,0x21,0x08},{0x01,0x24,0x08},{0x02,0x2e,0x0b},{0x02,0x31,0x0b},
|
||||
{0x01,0x22,0x08},{0x02,0x28,0x09},{0x02,0x30,0x0b},{0x02,0x32,0x0c},{0x03,0x39,0x0d},{0x03,0x3b,0x0e},{0x09,0x3f,0x14},{0x0d,0x3f,0x17},
|
||||
},
|
||||
{ // 2 - amber, 4-color-optimized contrast
|
||||
{0x00,0x00,0x00},{0x15,0x05,0x00},{0x20,0x0b,0x00},{0x24,0x0d,0x00},{0x33,0x18,0x00},{0x37,0x1b,0x00},{0x3f,0x26,0x01},{0x3f,0x2b,0x06},
|
||||
{0x0b,0x02,0x00},{0x1b,0x08,0x00},{0x29,0x11,0x00},{0x2e,0x14,0x00},{0x3b,0x1e,0x00},{0x3e,0x21,0x00},{0x3f,0x32,0x0a},{0x3f,0x38,0x0d},
|
||||
},
|
||||
{ // 3 - amber, 16-color-optimized contrast
|
||||
{0x00,0x00,0x00},{0x15,0x05,0x00},{0x1e,0x09,0x00},{0x21,0x0b,0x00},{0x2b,0x12,0x00},{0x2f,0x15,0x00},{0x38,0x1c,0x00},{0x3b,0x1e,0x00},
|
||||
{0x2c,0x13,0x00},{0x32,0x17,0x00},{0x3a,0x1e,0x00},{0x3c,0x1f,0x00},{0x3f,0x27,0x01},{0x3f,0x2a,0x04},{0x3f,0x36,0x0c},{0x3f,0x38,0x0d},
|
||||
},
|
||||
{ // 4 - grey, 4-color-optimized contrast
|
||||
{0x00,0x00,0x00},{0x0d,0x0d,0x0d},{0x15,0x15,0x15},{0x18,0x18,0x18},{0x24,0x24,0x24},{0x27,0x27,0x27},{0x33,0x33,0x33},{0x37,0x37,0x37},
|
||||
{0x08,0x08,0x08},{0x10,0x10,0x10},{0x1c,0x1c,0x1c},{0x20,0x20,0x20},{0x2c,0x2c,0x2c},{0x2f,0x2f,0x2f},{0x3b,0x3b,0x3b},{0x3f,0x3f,0x3f},
|
||||
},
|
||||
{ // 5 - grey, 16-color-optimized contrast
|
||||
{0x00,0x00,0x00},{0x0d,0x0d,0x0d},{0x12,0x12,0x12},{0x15,0x15,0x15},{0x1e,0x1e,0x1e},{0x20,0x20,0x20},{0x29,0x29,0x29},{0x2c,0x2c,0x2c},
|
||||
{0x1f,0x1f,0x1f},{0x23,0x23,0x23},{0x2b,0x2b,0x2b},{0x2d,0x2d,0x2d},{0x34,0x34,0x34},{0x36,0x36,0x36},{0x3d,0x3d,0x3d},{0x3f,0x3f,0x3f},
|
||||
},
|
||||
{ // 6 - paper-white, 4-color-optimized contrast
|
||||
{0x00,0x00,0x00},{0x0e,0x0f,0x10},{0x15,0x17,0x18},{0x18,0x1a,0x1b},{0x24,0x25,0x25},{0x27,0x28,0x28},{0x33,0x34,0x32},{0x37,0x38,0x35},
|
||||
{0x09,0x0a,0x0b},{0x11,0x12,0x13},{0x1c,0x1e,0x1e},{0x20,0x22,0x22},{0x2c,0x2d,0x2c},{0x2f,0x30,0x2f},{0x3c,0x3c,0x38},{0x3f,0x3f,0x3b},
|
||||
},
|
||||
{ // 7 - paper-white, 16-color-optimized contrast
|
||||
{0x00,0x00,0x00},{0x0e,0x0f,0x10},{0x13,0x14,0x15},{0x15,0x17,0x18},{0x1e,0x20,0x20},{0x20,0x22,0x22},{0x29,0x2a,0x2a},{0x2c,0x2d,0x2c},
|
||||
{0x1f,0x21,0x21},{0x23,0x25,0x25},{0x2b,0x2c,0x2b},{0x2d,0x2e,0x2d},{0x34,0x35,0x33},{0x37,0x37,0x34},{0x3e,0x3e,0x3a},{0x3f,0x3f,0x3b},
|
||||
},
|
||||
};
|
||||
|
||||
static void cga16_color_select(Bit8u val) {
|
||||
cga16_val = val;
|
||||
|
@ -393,7 +430,7 @@ static void write_cga(Bitu port,Bitu val,Bitu /*iolen*/) {
|
|||
vga.attr.disabled = (val&0x8)? 0: 1;
|
||||
if (vga.tandy.mode_control & 0x2) { // graphics mode
|
||||
if (vga.tandy.mode_control & 0x10) {// highres mode
|
||||
if (cga_comp==1 || (cga_comp==0 && !(val&0x4))) { // composite display
|
||||
if (cga_comp==1 || ((cga_comp==0 && !(val&0x4)) && !mono_cga)) { // composite display
|
||||
VGA_SetMode(M_CGA16); // composite ntsc 640x200 16 color mode
|
||||
} else {
|
||||
VGA_SetMode(M_TANDY2);
|
||||
|
@ -686,9 +723,32 @@ static void write_pcjr(Bitu port,Bitu val,Bitu /*iolen*/) {
|
|||
}
|
||||
}
|
||||
|
||||
static void CycleMonoCGAPal(bool pressed) {
|
||||
if (!pressed) return;
|
||||
if (++mono_cga_pal>3) mono_cga_pal=0;
|
||||
Mono_CGA_Palette();
|
||||
}
|
||||
|
||||
static void CycleMonoCGABright(bool pressed) {
|
||||
if (!pressed) return;
|
||||
if (++mono_cga_bright>1) mono_cga_bright=0;
|
||||
Mono_CGA_Palette();
|
||||
}
|
||||
|
||||
void Mono_CGA_Palette(void) {
|
||||
for (Bit8u ct=0;ct<16;ct++) {
|
||||
VGA_DAC_SetEntry(ct,
|
||||
mono_cga_palettes[2*mono_cga_pal+mono_cga_bright][ct][0],
|
||||
mono_cga_palettes[2*mono_cga_pal+mono_cga_bright][ct][1],
|
||||
mono_cga_palettes[2*mono_cga_pal+mono_cga_bright][ct][2]
|
||||
);
|
||||
VGA_DAC_CombineColor(ct,ct);
|
||||
}
|
||||
}
|
||||
|
||||
static void CycleHercPal(bool pressed) {
|
||||
if (!pressed) return;
|
||||
if (++herc_pal>2) herc_pal=0;
|
||||
if (++herc_pal>3) herc_pal=0;
|
||||
Herc_Palette();
|
||||
VGA_DAC_CombineColor(1,7);
|
||||
}
|
||||
|
@ -703,7 +763,11 @@ void Herc_Palette(void) {
|
|||
VGA_DAC_SetEntry(0x7,0x34,0x20,0x00);
|
||||
VGA_DAC_SetEntry(0xf,0x3f,0x34,0x00);
|
||||
break;
|
||||
case 2: // Green
|
||||
case 2: // Paper-white
|
||||
VGA_DAC_SetEntry(0x7,0x2c,0x2d,0x2c);
|
||||
VGA_DAC_SetEntry(0xf,0x3f,0x3f,0x3b);
|
||||
break;
|
||||
case 3: // Green
|
||||
VGA_DAC_SetEntry(0x7,0x00,0x26,0x00);
|
||||
VGA_DAC_SetEntry(0xf,0x00,0x3f,0x00);
|
||||
break;
|
||||
|
@ -819,10 +883,15 @@ void VGA_SetupOther(void) {
|
|||
if (machine==MCH_CGA) {
|
||||
IO_RegisterWriteHandler(0x3d8,write_cga,IO_MB);
|
||||
IO_RegisterWriteHandler(0x3d9,write_cga,IO_MB);
|
||||
MAPPER_AddHandler(IncreaseHue,MK_f11,MMOD2,"inchue","Inc Hue");
|
||||
MAPPER_AddHandler(DecreaseHue,MK_f11,0,"dechue","Dec Hue");
|
||||
MAPPER_AddHandler(CGAModel,MK_f11,MMOD1|MMOD2,"cgamodel","CGA Model");
|
||||
MAPPER_AddHandler(Composite,MK_f12,0,"cgacomp","CGA Comp");
|
||||
if(!mono_cga) {
|
||||
MAPPER_AddHandler(IncreaseHue,MK_f11,MMOD2,"inchue","Inc Hue");
|
||||
MAPPER_AddHandler(DecreaseHue,MK_f11,0,"dechue","Dec Hue");
|
||||
MAPPER_AddHandler(CGAModel,MK_f11,MMOD1|MMOD2,"cgamodel","CGA Model");
|
||||
MAPPER_AddHandler(Composite,MK_f12,0,"cgacomp","CGA Comp");
|
||||
} else {
|
||||
MAPPER_AddHandler(CycleMonoCGAPal,MK_f11,0,"monocgapal","Mono CGA Pal");
|
||||
MAPPER_AddHandler(CycleMonoCGABright,MK_f11,MMOD2,"monocgabright","Mono CGA Bright");
|
||||
}
|
||||
}
|
||||
if (machine==MCH_TANDY) {
|
||||
write_tandy( 0x3df, 0x0, 0 );
|
||||
|
|
|
@ -620,6 +620,7 @@ static bool INT10_SetVideoMode_OTHER(Bit16u mode, bool clearmem)
|
|||
IO_WriteB(0x3d9,color_select);
|
||||
real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_MSR,mode_control);
|
||||
real_writeb(BIOSMEM_SEG,BIOSMEM_CURRENT_PAL,color_select);
|
||||
if (mono_cga) Mono_CGA_Palette();
|
||||
break;
|
||||
case MCH_TANDY:
|
||||
/* Init some registers */
|
||||
|
|
|
@ -344,7 +344,10 @@ void DOS_Shell::Run(void) {
|
|||
#if C_DEBUG
|
||||
WriteOut(MSG_Get("SHELL_STARTUP_DEBUG"));
|
||||
#endif
|
||||
if (machine == MCH_CGA) WriteOut(MSG_Get("SHELL_STARTUP_CGA"));
|
||||
if (machine == MCH_CGA) {
|
||||
if (mono_cga) WriteOut(MSG_Get("SHELL_STARTUP_CGA_MONO"));
|
||||
else WriteOut(MSG_Get("SHELL_STARTUP_CGA"));
|
||||
}
|
||||
if (machine == MCH_HERC) WriteOut(MSG_Get("SHELL_STARTUP_HERC"));
|
||||
WriteOut(MSG_Get("SHELL_STARTUP_END"));
|
||||
|
||||
|
@ -630,6 +633,9 @@ void SHELL_Init() {
|
|||
"\xBA \033[31m(Alt-)F11\033[37m changes hue; \033[31mctrl-alt-F11\033[37m selects early/late CGA model. \xBA\n"
|
||||
"\xBA \xBA\n"
|
||||
);
|
||||
MSG_Add("SHELL_STARTUP_CGA_MONO","\xBA Use \033[31mF11\033[37m to cycle through green, amber, white and paper-white mode, \xBA\n"
|
||||
"\xBA and \033[31mAlt-F11\033[37m to change contrast/brightness settings. \xBA\n"
|
||||
);
|
||||
MSG_Add("SHELL_STARTUP_HERC","\xBA Use \033[31mF11\033[37m to cycle through white, amber, and green monochrome color. \xBA\n"
|
||||
"\xBA \xBA\n"
|
||||
);
|
||||
|
|
Loading…
Add table
Reference in a new issue