|
|
1.1 root 1: /*
1.1.1.5 root 2: Hatari - vdi.c
3:
4: This file is distributed under the GNU Public License, version 2 or at
5: your option any later version. Read the file gpl.txt for details.
1.1 root 6:
7: VDI (Virtual Device Interface) (Trap #2)
8:
1.1.1.5 root 9: To get higher resolutions on the Desktop, we intercept the VDI/Line-A calls
10: and set elements in their structures to the higher width/height/cel/planes.
11: We need to intercept the initial Line-A call (which we force into the TOS on
12: boot-up) and also the init calls to the VDI.
1.1 root 13: */
1.1.1.9 ! root 14: const char VDI_rcsid[] = "Hatari $Id: vdi.c,v 1.29 2007/12/20 00:37:47 thothy Exp $";
1.1 root 15:
16: #include "main.h"
17: #include "file.h"
18: #include "gemdos.h"
19: #include "m68000.h"
20: #include "screen.h"
21: #include "stMemory.h"
22: #include "vdi.h"
23: #include "video.h"
1.1.1.9 ! root 24: #include "configuration.h"
1.1 root 25:
26:
1.1.1.7 root 27: Uint32 VDI_OldPC; /* When call Trap#2, store off PC */
1.1.1.2 root 28:
1.1.1.9 ! root 29: BOOL bUseVDIRes = FALSE; /* Set to TRUE (if want VDI), or FALSE (ie for games) */
! 30: /* defaults */
! 31: int VDIRes = 0; /* 0,1 or 2 (low, medium, high) */
! 32: int VDIWidth = 640; /* 640x480, 800x600 or 1024x768 */
! 33: int VDIHeight = 480;
! 34: int VDIPlanes = 4;
! 35: static int VDIColors = 16;
! 36: static int VDICharHeight = 8;
! 37:
! 38: static Uint32 LineABase; /* Line-A structure */
! 39: static Uint32 FontBase; /* Font base, used for 16-pixel high font */
1.1 root 40:
1.1.1.8 root 41: static Uint32 Control;
42: static Uint32 Intin;
43: static Uint32 Ptsin;
44: static Uint32 Intout;
45: static Uint32 Ptsout;
1.1 root 46:
1.1.1.2 root 47:
48: /*-----------------------------------------------------------------------*/
49: /* Desktop TOS 1.04 and TOS 2.06 desktop configuration files */
1.1.1.8 root 50: static const Uint8 DesktopScript[504] =
1.1.1.3 root 51: {
1.1.1.9 ! root 52: 0x23,0x61,0x30,0x30,0x30,0x30,0x30,0x30,0x0D,0x0A,0x23,0x62,0x30,0x30,0x30,0x30,
! 53: 0x30,0x30,0x0D,0x0A,0x23,0x63,0x37,0x37,0x37,0x30,0x30,0x30,0x37,0x30,0x30,0x30,
! 54: 0x36,0x30,0x30,0x30,0x37,0x30,0x30,0x35,0x35,0x32,0x30,0x30,0x35,0x30,0x35,0x35,
! 55: 0x35,0x32,0x32,0x32,0x30,0x37,0x37,0x30,0x35,0x35,0x37,0x30,0x37,0x35,0x30,0x35,
! 56: 0x35,0x35,0x30,0x37,0x37,0x30,0x33,0x31,0x31,0x31,0x31,0x30,0x33,0x0D,0x0A,0x23,
! 57: 0x64,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
! 58: 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
! 59: 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0D,0x0A,
! 60: 0x23,0x45,0x20,0x31,0x38,0x20,0x31,0x31,0x20,0x0D,0x0A,0x23,0x57,0x20,0x30,0x30,
! 61: 0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x37,0x20,0x32,0x36,0x20,0x30,0x43,0x20,
! 62: 0x30,0x30,0x20,0x40,0x0D,0x0A,0x23,0x57,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,
! 63: 0x32,0x20,0x30,0x42,0x20,0x32,0x36,0x20,0x30,0x39,0x20,0x30,0x30,0x20,0x40,0x0D,
! 64: 0x0A,0x23,0x57,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x41,0x20,0x30,0x46,0x20,
! 65: 0x31,0x41,0x20,0x30,0x39,0x20,0x30,0x30,0x20,0x40,0x0D,0x0A,0x23,0x57,0x20,0x30,
! 66: 0x30,0x20,0x30,0x30,0x20,0x30,0x45,0x20,0x30,0x31,0x20,0x31,0x41,0x20,0x30,0x39,
! 67: 0x20,0x30,0x30,0x20,0x40,0x0D,0x0A,0x23,0x4D,0x20,0x30,0x31,0x20,0x30,0x30,0x20,
! 68: 0x30,0x30,0x20,0x46,0x46,0x20,0x43,0x20,0x48,0x41,0x52,0x44,0x20,0x44,0x49,0x53,
! 69: 0x4B,0x40,0x20,0x40,0x20,0x0D,0x0A,0x23,0x4D,0x20,0x30,0x30,0x20,0x30,0x30,0x20,
! 70: 0x30,0x30,0x20,0x46,0x46,0x20,0x41,0x20,0x46,0x4C,0x4F,0x50,0x50,0x59,0x20,0x44,
! 71: 0x49,0x53,0x4B,0x40,0x20,0x40,0x20,0x0D,0x0A,0x23,0x4D,0x20,0x30,0x30,0x20,0x30,
! 72: 0x31,0x20,0x30,0x30,0x20,0x46,0x46,0x20,0x42,0x20,0x46,0x4C,0x4F,0x50,0x50,0x59,
! 73: 0x20,0x44,0x49,0x53,0x4B,0x40,0x20,0x40,0x20,0x0D,0x0A,0x23,0x54,0x20,0x30,0x30,
! 74: 0x20,0x30,0x33,0x20,0x30,0x32,0x20,0x46,0x46,0x20,0x20,0x20,0x54,0x52,0x41,0x53,
! 75: 0x48,0x40,0x20,0x40,0x20,0x0D,0x0A,0x23,0x46,0x20,0x46,0x46,0x20,0x30,0x34,0x20,
! 76: 0x20,0x20,0x40,0x20,0x2A,0x2E,0x2A,0x40,0x20,0x0D,0x0A,0x23,0x44,0x20,0x46,0x46,
! 77: 0x20,0x30,0x31,0x20,0x20,0x20,0x40,0x20,0x2A,0x2E,0x2A,0x40,0x20,0x0D,0x0A,0x23,
! 78: 0x47,0x20,0x30,0x33,0x20,0x46,0x46,0x20,0x20,0x20,0x2A,0x2E,0x41,0x50,0x50,0x40,
! 79: 0x20,0x40,0x20,0x0D,0x0A,0x23,0x47,0x20,0x30,0x33,0x20,0x46,0x46,0x20,0x20,0x20,
! 80: 0x2A,0x2E,0x50,0x52,0x47,0x40,0x20,0x40,0x20,0x0D,0x0A,0x23,0x50,0x20,0x30,0x33,
! 81: 0x20,0x46,0x46,0x20,0x20,0x20,0x2A,0x2E,0x54,0x54,0x50,0x40,0x20,0x40,0x20,0x0D,
! 82: 0x0A,0x23,0x46,0x20,0x30,0x33,0x20,0x30,0x34,0x20,0x20,0x20,0x2A,0x2E,0x54,0x4F,
! 83: 0x53,0x40,0x20,0x40,0x20,0x0D,0x0A,0x1A
1.1 root 84: };
85:
1.1.1.8 root 86: static const Uint8 NewDeskScript[786] =
1.1.1.3 root 87: {
1.1.1.9 ! root 88: 0x23,0x61,0x30,0x30,0x30,0x30,0x30,0x30,0x0D,0x0A,0x23,0x62,0x30,0x30,0x30,0x30,
! 89: 0x30,0x30,0x0D,0x0A,0x23,0x63,0x37,0x37,0x37,0x30,0x30,0x30,0x37,0x30,0x30,0x30,
! 90: 0x36,0x30,0x30,0x30,0x37,0x30,0x30,0x35,0x35,0x32,0x30,0x30,0x35,0x30,0x35,0x35,
! 91: 0x35,0x32,0x32,0x32,0x30,0x37,0x37,0x30,0x35,0x35,0x37,0x30,0x37,0x35,0x30,0x35,
! 92: 0x35,0x35,0x30,0x37,0x37,0x30,0x33,0x31,0x31,0x31,0x31,0x30,0x33,0x0D,0x0A,0x23,
! 93: 0x64,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
! 94: 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
! 95: 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0D,0x0A,
! 96: 0x23,0x4B,0x20,0x34,0x46,0x20,0x35,0x33,0x20,0x34,0x43,0x20,0x30,0x30,0x20,0x34,
! 97: 0x36,0x20,0x34,0x32,0x20,0x34,0x33,0x20,0x35,0x37,0x20,0x34,0x35,0x20,0x35,0x38,
! 98: 0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x30,0x20,
! 99: 0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,
! 100: 0x30,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x35,0x32,0x20,0x30,0x30,0x20,0x30,0x30,
! 101: 0x20,0x34,0x44,0x20,0x35,0x36,0x20,0x35,0x30,0x20,0x30,0x30,0x20,0x40,0x0D,0x0A,
! 102: 0x23,0x45,0x20,0x31,0x38,0x20,0x30,0x31,0x20,0x30,0x30,0x20,0x30,0x36,0x20,0x0D,
! 103: 0x0A,0x23,0x51,0x20,0x34,0x31,0x20,0x34,0x30,0x20,0x34,0x33,0x20,0x34,0x30,0x20,
! 104: 0x34,0x33,0x20,0x34,0x30,0x20,0x0D,0x0A,0x23,0x57,0x20,0x30,0x30,0x20,0x30,0x30,
! 105: 0x20,0x30,0x30,0x20,0x30,0x37,0x20,0x32,0x36,0x20,0x30,0x43,0x20,0x30,0x30,0x20,
! 106: 0x40,0x0D,0x0A,0x23,0x57,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x32,0x20,0x30,
! 107: 0x42,0x20,0x32,0x36,0x20,0x30,0x39,0x20,0x30,0x30,0x20,0x40,0x0D,0x0A,0x23,0x57,
! 108: 0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x41,0x20,0x30,0x46,0x20,0x31,0x41,0x20,
! 109: 0x30,0x39,0x20,0x30,0x30,0x20,0x40,0x0D,0x0A,0x23,0x57,0x20,0x30,0x30,0x20,0x30,
! 110: 0x30,0x20,0x30,0x45,0x20,0x30,0x31,0x20,0x31,0x41,0x20,0x30,0x39,0x20,0x30,0x30,
! 111: 0x20,0x40,0x0D,0x0A,0x23,0x57,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x34,0x20,
! 112: 0x30,0x37,0x20,0x32,0x36,0x20,0x30,0x43,0x20,0x30,0x30,0x20,0x40,0x0D,0x0A,0x23,
! 113: 0x57,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x43,0x20,0x30,0x42,0x20,0x32,0x36,
! 114: 0x20,0x30,0x39,0x20,0x30,0x30,0x20,0x40,0x0D,0x0A,0x23,0x57,0x20,0x30,0x30,0x20,
! 115: 0x30,0x30,0x20,0x30,0x38,0x20,0x30,0x46,0x20,0x31,0x41,0x20,0x30,0x39,0x20,0x30,
! 116: 0x30,0x20,0x40,0x0D,0x0A,0x23,0x57,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x36,
! 117: 0x20,0x30,0x31,0x20,0x31,0x41,0x20,0x30,0x39,0x20,0x30,0x30,0x20,0x40,0x0D,0x0A,
! 118: 0x23,0x4E,0x20,0x46,0x46,0x20,0x30,0x34,0x20,0x30,0x30,0x30,0x20,0x40,0x20,0x2A,
! 119: 0x2E,0x2A,0x40,0x20,0x40,0x20,0x0D,0x0A,0x23,0x44,0x20,0x46,0x46,0x20,0x30,0x31,
! 120: 0x20,0x30,0x30,0x30,0x20,0x40,0x20,0x2A,0x2E,0x2A,0x40,0x20,0x40,0x20,0x0D,0x0A,
! 121: 0x23,0x47,0x20,0x30,0x33,0x20,0x46,0x46,0x20,0x30,0x30,0x30,0x20,0x2A,0x2E,0x41,
! 122: 0x50,0x50,0x40,0x20,0x40,0x20,0x40,0x20,0x0D,0x0A,0x23,0x47,0x20,0x30,0x33,0x20,
! 123: 0x46,0x46,0x20,0x30,0x30,0x30,0x20,0x2A,0x2E,0x50,0x52,0x47,0x40,0x20,0x40,0x20,
! 124: 0x40,0x20,0x0D,0x0A,0x23,0x59,0x20,0x30,0x33,0x20,0x46,0x46,0x20,0x30,0x30,0x30,
! 125: 0x20,0x2A,0x2E,0x47,0x54,0x50,0x40,0x20,0x40,0x20,0x40,0x20,0x0D,0x0A,0x23,0x50,
! 126: 0x20,0x30,0x33,0x20,0x46,0x46,0x20,0x30,0x30,0x30,0x20,0x2A,0x2E,0x54,0x54,0x50,
! 127: 0x40,0x20,0x40,0x20,0x40,0x20,0x0D,0x0A,0x23,0x46,0x20,0x30,0x33,0x20,0x30,0x34,
! 128: 0x20,0x30,0x30,0x30,0x20,0x2A,0x2E,0x54,0x4F,0x53,0x40,0x20,0x40,0x20,0x40,0x20,
! 129: 0x0D,0x0A,0x23,0x4D,0x20,0x30,0x30,0x20,0x30,0x31,0x20,0x30,0x30,0x20,0x46,0x46,
! 130: 0x20,0x43,0x20,0x48,0x41,0x52,0x44,0x20,0x44,0x49,0x53,0x4B,0x40,0x20,0x40,0x20,
! 131: 0x0D,0x0A,0x23,0x4D,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x30,0x30,0x20,0x46,0x46,
! 132: 0x20,0x41,0x20,0x46,0x4C,0x4F,0x50,0x50,0x59,0x20,0x44,0x49,0x53,0x4B,0x40,0x20,
! 133: 0x40,0x20,0x0D,0x0A,0x23,0x4D,0x20,0x30,0x31,0x20,0x30,0x30,0x20,0x30,0x30,0x20,
! 134: 0x46,0x46,0x20,0x42,0x20,0x46,0x4C,0x4F,0x50,0x50,0x59,0x20,0x44,0x49,0x53,0x4B,
! 135: 0x40,0x20,0x40,0x20,0x0D,0x0A,0x23,0x54,0x20,0x30,0x30,0x20,0x30,0x33,0x20,0x30,
! 136: 0x32,0x20,0x46,0x46,0x20,0x20,0x20,0x54,0x52,0x41,0x53,0x48,0x40,0x20,0x40,0x20,
! 137: 0x0D,0x0A
1.1 root 138: };
139:
1.1.1.2 root 140:
141: /*-----------------------------------------------------------------------*/
1.1.1.9 ! root 142: /**
! 143: * Returns given value after constraining it within "min" and "max" values
! 144: * and making it evenly divisable by "align"
! 145: */
! 146: int VDI_Limit(int value, int align, int min, int max)
1.1 root 147: {
1.1.1.9 ! root 148: value = (value/align)*align;
! 149: if (value > max)
! 150: {
! 151: /* align down */
! 152: return (max/align)*align;
! 153: }
! 154: if (value < min)
! 155: {
! 156: /* align up */
! 157: min += align-1;
! 158: return (min/align)*align;
! 159: }
! 160: return value;
1.1 root 161: }
162:
1.1.1.2 root 163:
164: /*-----------------------------------------------------------------------*/
1.1.1.9 ! root 165: /**
! 166: * Set Width/Height/BitDepth according to passed GEMRES_640x480,
! 167: * GEMRES_800x600, GEMRES_OTHER. Align size when necessary.
! 168: */
! 169: void VDI_SetResolution(int GEMColor, int WidthRequest, int HeightRequest)
! 170: {
! 171: /* Color depth */
! 172: switch (GEMColor)
! 173: {
! 174: case GEMCOLOR_2:
! 175: VDIRes = 2;
! 176: VDIPlanes = 1;
! 177: VDIColors = 2;
! 178: VDICharHeight = 16;
! 179: break;
! 180: case GEMCOLOR_4:
! 181: VDIRes = 1;
! 182: VDIPlanes = 2;
! 183: VDIColors = 4;
! 184: VDICharHeight = 8;
! 185: break;
! 186: case GEMCOLOR_16:
! 187: VDIRes = 0;
! 188: VDIPlanes = 4;
! 189: VDIColors = 16;
! 190: VDICharHeight = 8;
! 191: break;
! 192: }
! 193:
! 194: /* width needs to be aligned to 16 bytes */
! 195: VDIWidth = VDI_Limit(WidthRequest, 128/VDIPlanes, MIN_VDI_WIDTH, MAX_VDI_WIDTH);
! 196: /* height needs to be multiple of cell height */
! 197: VDIHeight = VDI_Limit(HeightRequest, VDICharHeight, MIN_VDI_HEIGHT, MAX_VDI_HEIGHT);
! 198: printf("VDI screen: request = %dx%d@%d, aligned result = %dx%d@%d\n",
! 199: WidthRequest, HeightRequest, VDIPlanes, VDIWidth, VDIHeight, VDIPlanes);
! 200:
! 201: /* Write resolution to re-boot takes effect with correct bit-depth */
! 202: VDI_FixDesktopInf();
! 203: }
! 204:
1.1 root 205:
1.1.1.9 ! root 206: /*-----------------------------------------------------------------------*/
! 207: /**
! 208: * Check VDI call and see if we need to re-direct to our own routines
! 209: * Return TRUE if we've handled the exception, else return FALSE
! 210: *
! 211: * We enter here with Trap #2, so D1 is pointer to VDI vectors, ie Control, Intin, Ptsin etc...
! 212: */
1.1 root 213: BOOL VDI(void)
214: {
1.1.1.9 ! root 215: Uint32 TablePtr = Regs[REG_D1];
! 216: /*unsigned short int OpCode;*/
1.1 root 217:
1.1.1.9 ! root 218: /* Read off table pointers */
! 219: Control = STMemory_ReadLong(TablePtr);
! 220: Intin = STMemory_ReadLong(TablePtr+4);
! 221: Ptsin = STMemory_ReadLong(TablePtr+8);
! 222: Intout = STMemory_ReadLong(TablePtr+12);
! 223: Ptsout = STMemory_ReadLong(TablePtr+16);
! 224:
! 225: /*
! 226: OpCode = STMemory_ReadWord(Control);
! 227: // Check OpCode
! 228: // 8 - Text Font
! 229: if (OpCode==9)
! 230: {
! 231: return TRUE;
! 232: }
! 233: */
1.1 root 234:
1.1.1.9 ! root 235: /* Call as normal! */
! 236: return FALSE;
1.1 root 237: }
238:
1.1.1.2 root 239:
240: /*-----------------------------------------------------------------------*/
1.1.1.9 ! root 241: /**
! 242: * Modify Line-A structure for our VDI resolutions
! 243: */
! 244: void VDI_LineA(Uint32 linea, Uint32 fontbase)
1.1 root 245: {
1.1.1.9 ! root 246: if (bUseVDIRes)
! 247: {
! 248: STMemory_WriteWord(linea-46, VDICharHeight); /* v_cel_ht */
! 249: STMemory_WriteWord(linea-44, (VDIWidth/8)-1); /* v_cel_mx (cols-1) */
! 250: STMemory_WriteWord(linea-42, (VDIHeight/VDICharHeight)-1); /* v_cel_my (rows-1) */
! 251: STMemory_WriteWord(linea-40, VDICharHeight*((VDIWidth*VDIPlanes)/8)); /* v_cel_wr */
! 252:
! 253: STMemory_WriteWord(linea-12, VDIWidth); /* v_rez_hz */
! 254: STMemory_WriteWord(linea-4, VDIHeight); /* v_rez_vt */
! 255: STMemory_WriteWord(linea-2, (VDIWidth*VDIPlanes)/8); /* bytes_lin */
! 256: STMemory_WriteWord(linea+0, VDIPlanes); /* planes */
! 257: STMemory_WriteWord(linea+2, (VDIWidth*VDIPlanes)/8); /* width */
! 258: }
! 259: LineABase = linea;
! 260: FontBase = fontbase;
1.1 root 261: }
262:
1.1.1.2 root 263:
264: /*-----------------------------------------------------------------------*/
1.1.1.9 ! root 265: /**
! 266: * This is called on completion of a VDI Trap, used to modify return structure for
! 267: */
1.1 root 268: void VDI_Complete(void)
269: {
1.1.1.9 ! root 270: unsigned short int OpCode;
1.1 root 271:
1.1.1.9 ! root 272: OpCode = STMemory_ReadWord(Control);
! 273: /* Is 'Open Workstation', or 'Open Virtual Screen Workstation'? */
! 274: if ( (OpCode==1) || (OpCode==100) )
! 275: {
! 276: STMemory_WriteWord(Intout, VDIWidth-1); /* IntOut[0] Width-1 */
! 277: STMemory_WriteWord(Intout+1*2, VDIHeight-1); /* IntOut[1] Height-1 */
! 278: STMemory_WriteWord(Intout+13*2, VDIColors); /* IntOut[13] #colors */
! 279: STMemory_WriteWord(Intout+39*2, 512); /* IntOut[39] #available colors */
1.1 root 280:
1.1.1.9 ! root 281: STMemory_WriteWord(LineABase-0x15a*2, VDIWidth-1); /* WKXRez */
! 282: STMemory_WriteWord(LineABase-0x159*2, VDIHeight-1); /* WKYRez */
1.1 root 283:
1.1.1.9 ! root 284: VDI_LineA(LineABase, FontBase); /* And modify Line-A structure accordingly */
! 285: }
1.1 root 286: }
287:
1.1.1.2 root 288:
289: /*-----------------------------------------------------------------------*/
1.1.1.9 ! root 290: /**
! 291: * Save desktop configuration file for VDI, eg desktop.inf(TOS 1.04) or newdesk.inf(TOS 2.06)
! 292: */
1.1.1.8 root 293: static void VDI_SaveDesktopInf(char *pszFileName, const Uint8 *Script, long ScriptSize)
1.1 root 294: {
1.1.1.9 ! root 295: /* Just save file */
! 296: File_Save(pszFileName, Script, ScriptSize, FALSE);
1.1 root 297: }
298:
1.1.1.2 root 299:
300: /*-----------------------------------------------------------------------*/
1.1.1.9 ! root 301: /**
! 302: * Modify exisiting ST desktop configuration files to set resolution(keep user settings)
! 303: */
1.1.1.5 root 304: static void VDI_ModifyDesktopInf(char *pszFileName)
1.1 root 305: {
1.1.1.9 ! root 306: long InfSize;
! 307: Uint8 *pInfData;
! 308: int i;
! 309:
! 310: /* Load our '.inf' file */
! 311: pInfData = File_Read(pszFileName, &InfSize, NULL);
! 312: if (pInfData)
! 313: {
! 314: /* Scan file for '#E' */
! 315: i = 0;
! 316: while (i < (InfSize-8))
! 317: {
! 318: if ((pInfData[i]=='#') && (pInfData[i+1]=='E'))
! 319: {
! 320: /* Modify resolution */
! 321: pInfData[i+7] = '1'+VDIRes;
! 322: break;
! 323: }
! 324:
! 325: i++;
! 326: }
! 327:
! 328: /* And save */
! 329: File_Save(pszFileName, pInfData, InfSize, FALSE);
! 330: /* Free */
! 331: free(pInfData);
! 332: }
1.1 root 333: }
334:
1.1.1.2 root 335:
336: /*-----------------------------------------------------------------------*/
1.1.1.9 ! root 337: /**
! 338: * Modify (or create) ST desktop configuration files so VDI boots up in
! 339: * correct color depth
! 340: */
1.1 root 341: void VDI_FixDesktopInf(void)
342: {
1.1.1.9 ! root 343: char *szDesktopFileName, *szNewDeskFileName;
1.1 root 344:
1.1.1.9 ! root 345: if (!GEMDOS_EMU_ON)
! 346: {
! 347: /* Can't modify DESKTOP.INF when not using GEMDOS hard disk emulation */
! 348: return;
! 349: }
! 350:
! 351: szDesktopFileName = malloc(2 * FILENAME_MAX);
! 352: if (!szDesktopFileName)
! 353: {
! 354: perror("VDI_FixDesktopInf");
! 355: return;
! 356: }
! 357: szNewDeskFileName = szDesktopFileName + FILENAME_MAX;
! 358:
! 359: /* Create filenames for hard-drive */
! 360: GemDOS_CreateHardDriveFileName(2, "\\DESKTOP.INF", szDesktopFileName, FILENAME_MAX);
! 361: GemDOS_CreateHardDriveFileName(2, "\\NEWDESK.INF", szNewDeskFileName, FILENAME_MAX);
! 362:
! 363: /* First, check if files exist(ie modify or replace) */
! 364: if (!File_Exists(szDesktopFileName))
! 365: VDI_SaveDesktopInf(szDesktopFileName,DesktopScript,sizeof(DesktopScript));
! 366: VDI_ModifyDesktopInf(szDesktopFileName);
! 367:
! 368: if (!File_Exists(szNewDeskFileName))
! 369: VDI_SaveDesktopInf(szNewDeskFileName,NewDeskScript,sizeof(NewDeskScript));
! 370: VDI_ModifyDesktopInf(szNewDeskFileName);
1.1.1.5 root 371:
1.1.1.9 ! root 372: free(szDesktopFileName);
1.1 root 373: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.