home *** CD-ROM | disk | FTP | other *** search
- /* > $.CLIB.C.vdu
- *
- * HASWIN Graphics Library
- * =========================
- *
- * Copyright (C) H.A.Shaw 1990.
- * Howard A. Shaw.
- * The Unit for Space Sciences,
- * Room 165,
- * Physics Building,
- * University of Kent at Canterbury.
- * Canterbury.
- * Kent. CT2 7NJ
- * You may use and distribute this code freely, however please leave
- * it alone. If you find bugs (and there will be many) please contact
- * me and the master source can be modified. If you keep me informed
- * of who you give copies of this to then I can get release upgrades
- * to them.
- *
- * Routines to handle VDU variables.
- */
- #include "includes.h"
- /*
- * this table contains the data for the VDU variables system
- * Each VDU variable has a record containing
- * vduconvert[VDUVAR_<name>][0]
- * - code to give "OS_ReadVduVariables" to get value.
- * vduconvert[VDUVAR_<name>][1]
- * - flags -
- * VDU_MODE - value set only on mode change.
- * if not present the variable can
- * change at any time, and must be
- * got from RISCOS when needed.
- * Note that some of the variables are HASWIN addins. ModeNumber
- * is not a true VDU variable but this seems like the right place
- * to keep it. There has to be special traps in the code to do
- * ModeNumber right but I think it's worth it. Especially since
- * The sprite stuff needs to create sprites from the screen and
- * needs the mode number.
- */
- #define VDU_MODE 0x01
-
- #define Vduvar_ModeFlags 0
- #define Vduvar_ScrRCol 1
- #define Vduvar_ScrBRow 2
- #define Vduvar_NColour 3
- #define Vduvar_XEigFactor 4
- #define Vduvar_YEigFactor 5
- #define Vduvar_LineLength 6
- #define Vduvar_ScreenSize 7
- #define Vduvar_YShftFactor 8
- #define Vduvar_Log2BPP 9
- #define Vduvar_Log2BPC 10
- #define Vduvar_XWindLimit 11
- #define Vduvar_YWindLimit 12
- #define Vduvar_GWLCol 128
- #define Vduvar_GWBRow 129
- #define Vduvar_GWRCol 130
- #define Vduvar_GWTRow 131
- #define Vduvar_TWLCol 132
- #define Vduvar_TWBRow 133
- #define Vduvar_TWRCol 134
- #define Vduvar_TWTRow 135
- #define Vduvar_OrgX 136
- #define Vduvar_OrgY 137
- #define Vduvar_GCsX 138
- #define Vduvar_GCsY 139
- #define Vduvar_OlderGCsX 140
- #define Vduvar_OlderGCsY 141
- #define Vduvar_OldGCsX 142
- #define Vduvar_OldGCsY 143
- #define Vduvar_GCsIX 144
- #define Vduvar_GCsIY 145
- #define Vduvar_NewPtX 146
- #define Vduvar_NewPtY 147
- #define Vduvar_ScreenStart 148
- #define Vduvar_DisplayStart 149
- #define Vduvar_TotalScreenSize 150
- #define Vduvar_GPLFMD 151
- #define Vduvar_GPLBMD 152
- #define Vduvar_GFCOL 153
- #define Vduvar_GBCOL 154
- #define Vduvar_TForeCol 155
- #define Vduvar_TBackCol 156
- #define Vduvar_GFTint 157
- #define Vduvar_GBTint 158
- #define Vduvar_TFTint 159
- #define Vduvar_TBTint 160
- #define Vduvar_MaxMode 161
- #define Vduvar_GCharSizeX 162
- #define Vduvar_GCharSizeY 163
- #define Vduvar_GCharSpaceX 164
- #define Vduvar_GCharSpaceY 165
- #define Vduvar_HLineAddr 166
- #define Vduvar_TCharSizeX 167
- #define Vduvar_TCharSizeY 168
- #define Vduvar_TCharSpaceX 169
- #define Vduvar_TCharSpaceY 170
- #define Vduvar_GcolOraEorAddr 171
- #define Vduvar_WindowWidth 256
- #define Vduvar_WindowHeight 257
-
- static int haswin_vduvarconv[VDUVAR_MAXVARS][2] = {
- {Vduvar_ModeFlags, VDU_MODE}, {Vduvar_ScrRCol, VDU_MODE},
- {Vduvar_ScrBRow, VDU_MODE}, {Vduvar_NColour, VDU_MODE},
- {Vduvar_XEigFactor, VDU_MODE}, {Vduvar_YEigFactor, VDU_MODE},
- {Vduvar_LineLength, VDU_MODE}, {Vduvar_ScreenSize, VDU_MODE},
- {Vduvar_YShftFactor, VDU_MODE}, {Vduvar_Log2BPP, VDU_MODE},
- {Vduvar_Log2BPC, VDU_MODE}, { Vduvar_XWindLimit, VDU_MODE},
- {Vduvar_YWindLimit, VDU_MODE}, { Vduvar_GWLCol, 0},
- {Vduvar_GWBRow, 0}, { Vduvar_GWRCol, 0},
- {Vduvar_GWTRow, 0}, { Vduvar_TWLCol, 0},
- {Vduvar_TWBRow, 0}, { Vduvar_TWRCol, 0},
- {Vduvar_TWTRow, 0}, { Vduvar_OrgX, 0},
- {Vduvar_OrgY, 0}, { Vduvar_GCsX, 0},
- {Vduvar_GCsY, 0}, { Vduvar_OlderGCsX, 0},
- {Vduvar_OlderGCsY, 0}, { Vduvar_OldGCsX, 0},
- {Vduvar_OldGCsY, 0}, { Vduvar_GCsIX, 0},
- {Vduvar_GCsIY, 0}, { Vduvar_NewPtX, 0},
- {Vduvar_NewPtY, 0}, { Vduvar_ScreenStart, 0},
- {Vduvar_DisplayStart, 0}, {Vduvar_TotalScreenSize, 0},
- {Vduvar_GPLFMD, 0}, { Vduvar_GPLBMD, 0},
- {Vduvar_GFCOL, 0}, { Vduvar_GBCOL, 0},
- {Vduvar_TForeCol, 0}, { Vduvar_TBackCol, 0},
- {Vduvar_GFTint, 0}, { Vduvar_GBTint, 0},
- {Vduvar_TFTint, 0}, { Vduvar_TBTint, 0},
- {Vduvar_MaxMode, VDU_MODE}, { Vduvar_GCharSizeX, VDU_MODE},
- {Vduvar_GCharSizeY, VDU_MODE}, { Vduvar_GCharSpaceX, VDU_MODE},
- {Vduvar_GCharSpaceY, VDU_MODE}, { Vduvar_HLineAddr, VDU_MODE},
- {Vduvar_TCharSizeX, VDU_MODE}, { Vduvar_TCharSizeY, VDU_MODE},
- {Vduvar_TCharSpaceX, VDU_MODE}, { Vduvar_TCharSpaceY, VDU_MODE},
- {Vduvar_GcolOraEorAddr, 0}, { Vduvar_WindowWidth, 0},
- {Vduvar_WindowHeight, 0}, { /* Modenumber */ 0, VDU_MODE},
- { /* CharXsize */ 0, VDU_MODE}, { /* CharYsize */ 0, VDU_MODE},
- { /* ScreenXsize */ 0, VDU_MODE}, { /* ScreenYsize */ 0, VDU_MODE}
- };
- static int haswin_vdustore[VDUVAR_MAXVARS+1];
-
- /*
- * this is a list of all the RISCOS codes for the VDU variables.
- * If stored in a buffer in this order then the HASWIN codes starting
- * "VDUVAR_" will access the right element of the buffer. It is used
- * as the buffer to give OS_ReadVduVariables for a full update.
- */
- static int haswin_vdulist[VDUVAR_MAXVARS+1] = {
- Vduvar_ModeFlags, Vduvar_ScrRCol, Vduvar_ScrBRow,
- Vduvar_NColour, Vduvar_XEigFactor, Vduvar_YEigFactor,
- Vduvar_LineLength, Vduvar_ScreenSize, Vduvar_YShftFactor,
- Vduvar_Log2BPP, Vduvar_Log2BPC, Vduvar_XWindLimit,
- Vduvar_YWindLimit, Vduvar_GWLCol, Vduvar_GWBRow,
- Vduvar_GWRCol, Vduvar_GWTRow, Vduvar_TWLCol,
- Vduvar_TWBRow, Vduvar_TWRCol, Vduvar_TWTRow,
- Vduvar_OrgX, Vduvar_OrgY, Vduvar_GCsX,
- Vduvar_GCsY, Vduvar_OlderGCsX, Vduvar_OlderGCsY,
- Vduvar_OldGCsX, Vduvar_OldGCsY, Vduvar_GCsIX,
- Vduvar_GCsIY, Vduvar_NewPtX, Vduvar_NewPtY,
- Vduvar_ScreenStart, Vduvar_DisplayStart, Vduvar_TotalScreenSize,
- Vduvar_GPLFMD, Vduvar_GPLBMD, Vduvar_GFCOL,
- Vduvar_GBCOL, Vduvar_TForeCol, Vduvar_TBackCol,
- Vduvar_GFTint, Vduvar_GBTint, Vduvar_TFTint,
- Vduvar_TBTint, Vduvar_MaxMode, Vduvar_GCharSizeX,
- Vduvar_GCharSizeY, Vduvar_GCharSpaceX, Vduvar_GCharSpaceY,
- Vduvar_HLineAddr, Vduvar_TCharSizeX, Vduvar_TCharSizeY,
- Vduvar_TCharSpaceX, Vduvar_TCharSpaceY, Vduvar_GcolOraEorAddr,
- Vduvar_WindowWidth, Vduvar_WindowHeight, -1
- };
-
- int haswin_updatevduvariable(int code) {
-
- int inbuff[2], outbuff[1];
- _kernel_swi_regs regs;
-
- if ((code < 0) || (code > VDUVAR_MAXVARS))
- return(HASWIN_FALSE);
- if (haswin_vduvarconv[code][1] & VDU_MODE)
- return(HASWIN_TRUE);
- switch (code) {
- case VDUVAR_ModeNumber:
- case VDUVAR_CharXsize:
- case VDUVAR_CharYsize:
- case VDUVAR_ScreenXsize:
- case VDUVAR_ScreenYsize:
- return(HASWIN_TRUE);
- default:
- inbuff[0] = haswin_vduvarconv[code][0];
- inbuff[1] = -1;
- regs.r[0] = (int)&inbuff;
- regs.r[1] = (int)&outbuff;
- haswin_swi(OS_ReadVduVariables, ®s);
- haswin_vdustore[code] = outbuff[0];
- return(HASWIN_TRUE);
- }
- return(HASWIN_TRUE);
- }
-
- int haswin_readvduvariable(int code) {
-
- if ((code < 0) || (code > VDUVAR_MAXVARS))
- return(HASWIN_UNKNOWN);
- if (!(haswin_vduvarconv[code][1] & VDU_MODE))
- haswin_updatevduvariable(code);
- return(haswin_vdustore[code]);
- }
-
- /*
- * read all the vdu variables and place them in the buffer given. The
- * buffer must be at least VDUVAR_MAXVARS integers long, but this is
- * not checked for. If no buffer is given then use the system one.
- */
- int haswin_updateallvduvariables(int *buff) {
- _kernel_swi_regs regs;
- int res;
-
- if (!buff)
- buff = haswin_vdustore;
- regs.r[0] = (int)haswin_vdulist;
- regs.r[1] = (int)buff;
- res = haswin_swi(OS_ReadVduVariables, ®s);
- /*
- * now we have done the RISCOS VDU Variables we do the HASWIN
- * extensions.
- */
- regs.r[0] = 135;
- haswin_swi(OS_Byte, ®s);
- buff[VDUVAR_ModeNumber] = regs.r[2];
- buff[VDUVAR_CharXsize] =
- buff[VDUVAR_GCharSpaceX] << buff[VDUVAR_XEigFactor];
- buff[VDUVAR_CharYsize] =
- buff[VDUVAR_GCharSpaceY] << buff[VDUVAR_YEigFactor];
- buff[VDUVAR_ScreenXsize] =
- buff[VDUVAR_XWindLimit] << buff[VDUVAR_XEigFactor];
- buff[VDUVAR_ScreenYsize] =
- buff[VDUVAR_YWindLimit] << buff[VDUVAR_YEigFactor];
- return(res);
- }
-
-