Annotation of hatari/src/vdi.c, revision 1.1.1.9

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.