CGDoom/cgdoom/i_video.c

185 lines
5.6 KiB
C
Raw Normal View History

2015-04-15 02:16:51 +02:00
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
// $Id:$
//
// Copyright (C) 1993-1996 by id Software, Inc.
//
// This source is available for distribution and/or modification
// only under the terms of the DOOM Source Code License as
// published by id Software. All rights reserved.
//
// The source is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
// for more details.
//
// $Log:$
//
// DESCRIPTION:
// DOOM graphics stuff for Nspire
//
//-----------------------------------------------------------------------------
#include "os.h"
#include "doomstat.h"
#include "i_system.h"
#include "v_video.h"
#include "d_main.h"
#include "doomdef.h"
//Pallette data
//High byte: 4 MSBs declare B
//Low byte: 4 LSBs declare R
//Theoretically, we COULD have saved it in the WAD file somewhere, but fuck that
//Hardcoded = Awesome
//short = 2 bytes = 16 bits = palette word length
static const uint16_t gBasePalette[256] = {
0x0000, 0x18A1, 0x1060, 0x4A49, 0xFFFF, 0x18C3, 0x1082, 0x0841, 0x0020,
0x29A3, 0x2141, 0x10E0, 0x08A0, 0x49C5, 0x4184, 0x3943, 0xFDB6, 0xF555,
0xF514, 0xECB2, 0xE471, 0xDC30, 0xDBCF, 0xD38E, 0xCB4D, 0xC30C, 0xBACB,
0xBAAA, 0xB269, 0xAA28, 0xA1E7, 0xA1C7, 0x9986, 0x9165, 0x8945, 0x8904,
0x80E3, 0x78C3, 0x70A2, 0x7082, 0x6861, 0x6041, 0x5820, 0x5820, 0x5020,
0x4800, 0x4000, 0x4000, 0xFF5B, 0xFF1A, 0xFED8, 0xFE97, 0xFE76, 0xFE34,
0xFDF3, 0xFDD2, 0xFD90, 0xF54F, 0xED0E, 0xE4CD, 0xDC8C, 0xD44B, 0xCC0A,
0xCBE9, 0xBBC9, 0xB388, 0xAB68, 0xA347, 0x9B07, 0x8AE6, 0x82A6, 0x7A85,
0x7265, 0x6A24, 0x5A04, 0x51E3, 0x49A3, 0x3962, 0x3142, 0x2901, 0xEF7D,
0xE73C, 0xDEFB, 0xDEDB, 0xD69A, 0xCE59, 0xC638, 0xBDF7, 0xB5B6, 0xB596,
0xAD55, 0xA534, 0x9CF3, 0x94B2, 0x9492, 0x8C51, 0x8410, 0x7BEF, 0x73AE,
0x6B6D, 0x6B4D, 0x630C, 0x5ACB, 0x52AA, 0x4A69, 0x4228, 0x4208, 0x39C7,
0x31A6, 0x2965, 0x2124, 0x2104, 0x77ED, 0x6F6C, 0x66EB, 0x5E6A, 0x5DE9,
0x5568, 0x4CE7, 0x4486, 0x3C05, 0x3385, 0x2B04, 0x2283, 0x1A02, 0x1181,
0x1101, 0x08A0, 0xBD31, 0xB4F0, 0xACAF, 0xA46E, 0x9C2D, 0x9BED, 0x93CC,
0x8B8B, 0x834A, 0x7B09, 0x72E9, 0x6AA8, 0x6287, 0x5A46, 0x5206, 0x51E5,
0x9C0C, 0x8BAA, 0x8349, 0x72E7, 0x6286, 0x5A25, 0x49C4, 0x4183, 0x7BEC,
0x6B8A, 0x6349, 0x5B08, 0x52A7, 0x4266, 0x3A25, 0x31E4, 0xFFEE, 0xEECA,
0xD5C8, 0xC4C5, 0xABC3, 0x9AC2, 0x8200, 0x7140, 0xFFFF, 0xFEDB, 0xFDD7,
0xFCD3, 0xFBCF, 0xFAEB, 0xF9E7, 0xF8E3, 0xF800, 0xE800, 0xE000, 0xD000,
0xC800, 0xB800, 0xB000, 0xA000, 0x9800, 0x8800, 0x7800, 0x7000, 0x6000,
0x5800, 0x4800, 0x4000, 0xE73F, 0xC63F, 0xAD5F, 0x8C7F, 0x739F, 0x529F,
0x31BF, 0x18DF, 0x001F, 0x001C, 0x0019, 0x0016, 0x0013, 0x0010, 0x000D,
0x000A, 0xFFFF, 0xFF5B, 0xFEB7, 0xFE33, 0xFD8F, 0xFD0B, 0xFC67, 0xFBE3,
0xF382, 0xEB61, 0xDB21, 0xD2E1, 0xCAA0, 0xC260, 0xB220, 0xAA00, 0xFFFF,
0xFFFA, 0xFFF6, 0xFFF1, 0xFFED, 0xFFE8, 0xFFE4, 0xFFE0, 0xA1E0, 0x99A0,
0x9160, 0x8100, 0x49C4, 0x4163, 0x3102, 0x28C1, 0x000A, 0x0008, 0x0007,
0x0005, 0x0004, 0x0002, 0x0001, 0x0000, 0xFCE8, 0xFF29, 0xFBDF, 0xF81F,
0xC819, 0x9813, 0x680D, 0xA34D,
2015-04-15 02:16:51 +02:00
};
/* Current palette (accounting for gamma correction) */
static uint16_t gPalette[256];
/* Generate palette based on gamma correction level. */
void I_SetPalette(int gamma_correction)
{
const byte *gamma = gammatable[gamma_correction % 5];
2015-04-15 02:16:51 +02:00
for (int i = 0; i < 256; i++)
{
int rgb = gBasePalette[i];
int r = (rgb >> 8) & 0xf8;
int g = (rgb >> 3) & 0xfc;
int b = (rgb << 3) & 0xf8;
r = gamma[r] >> 3;
g = gamma[g] >> 2;
b = gamma[b] >> 3;
gPalette[i] = (r << 11) | (g << 5) | b;
}
}
#if !defined(CG_EMULATOR) && defined(CGDOOM_DIRECT_R61524)
#define SYNCO() __asm__ volatile("synco":::"memory");
#define PRDR *(volatile uint8_t *)0xA405013C
#define LCDC *(volatile uint16_t *)0xB4000000
2015-04-15 02:16:51 +02:00
#define LCD_GRAM_X 0x200
#define LCD_GRAM_Y 0x201
#define LCD_GRAM 0x202
#define LCD_WINDOW_LEFT 0x210
#define LCD_WINDOW_RIGHT 0x211
#define LCD_WINDOW_TOP 0x212
#define LCD_WINDOW_BOTTOM 0x213
static void SelectLCDReg(unsigned short reg)
{
PRDR &= ~0x10;
SYNCO();
LCDC = reg;
SYNCO();
PRDR |= 0x10;
SYNCO();
}
static void WriteLCDReg(unsigned short reg, unsigned short value)
{
SelectLCDReg(reg);
LCDC = value;
}
void I_Flip (void)
{
WriteLCDReg(LCD_GRAM_X, 0);
WriteLCDReg(LCD_GRAM_Y, 0);
SelectLCDReg(LCD_GRAM);
unsigned j=0, i=320*200;
2015-04-15 02:16:51 +02:00
while(i--)
{
LCDC = gPalette[screens[0][j]];
2015-04-15 02:16:51 +02:00
j++;
}
}
void I_InitGraphics(void)
{
usegamma = 0;
I_SetPalette(usegamma);
2015-04-15 02:16:51 +02:00
WriteLCDReg(LCD_WINDOW_LEFT, (396 - 320)/2);
WriteLCDReg(LCD_WINDOW_RIGHT, (396 - 320)/2 + 319);
WriteLCDReg(LCD_WINDOW_TOP, (224 - 200) / 2);
WriteLCDReg(LCD_WINDOW_BOTTOM, (224 - 200) / 2 + 199);
}
void I_ShutdownGraphics(void)
{
WriteLCDReg(LCD_WINDOW_LEFT, (396 - 384)/2);
WriteLCDReg(LCD_WINDOW_RIGHT, (396 - 384)/2 + 383);
WriteLCDReg(LCD_WINDOW_TOP, (224 - 216) / 2);
WriteLCDReg(LCD_WINDOW_BOTTOM, (224 - 216) / 2 + 215);
2015-04-15 02:16:51 +02:00
}
2015-04-15 02:16:51 +02:00
#else
void I_Flip (void)
{
int x,y;
for(y=0;y<SCREENHEIGHT;y++)
{
for(x=0;x<SCREENWIDTH;x++)
{
VRAM[(x+(WIDTH-SCREENWIDTH)/2)+(y+(HEIGHT-SCREENHEIGHT)/2)*WIDTH] = gPalette[screens[0][x+y*SCREENWIDTH]];
2015-04-15 02:16:51 +02:00
}
}
Bdisp_PutDisp_DD();
}
void I_InitGraphics(void)
{
usegamma = 0;
I_SetPalette(usegamma);
2015-04-15 02:16:51 +02:00
}
void I_ShutdownGraphics(void)
{
}
#endif