From 74ac11a27f783823d82136fb87b860951e1492c9 Mon Sep 17 00:00:00 2001 From: Daveo Date: Tue, 29 Aug 2000 19:54:22 +0000 Subject: [PATCH] --- source/PsxBoot/PSXBOOT.H | 38 +++ source/PsxBoot/psxboot.cpp | 263 +++++++++++++++ source/game/game.cpp | 51 +++ source/game/game.h | 40 +++ source/gfx/fdata.cpp | 104 ++++++ source/gfx/fdata.h | 71 ++++ source/gfx/font.cpp | 367 ++++++++++++++++++++ source/gfx/font.h | 101 ++++++ source/gfx/prim.cpp | 159 +++++++++ source/gfx/prim.h | 256 ++++++++++++++ source/gfx/sprbank.cpp | 415 +++++++++++++++++++++++ source/gfx/sprbank.h | 117 +++++++ source/gfx/tpage.cpp | 283 ++++++++++++++++ source/gfx/tpage.h | 63 ++++ source/locale/textdbase.cpp | 228 +++++++++++++ source/locale/textdbase.h | 82 +++++ source/mem/memory.cpp | 636 +++++++++++++++++++++++++++++++++++ source/mem/memory.h | 75 +++++ source/pad/pads.cpp | 411 +++++++++++++++++++++++ source/pad/pads.h | 149 +++++++++ source/sound/cdxa.cpp | 338 +++++++++++++++++++ source/sound/cdxa.h | 113 +++++++ source/system/global.h | 76 +++++ source/system/gp.h | 18 + source/system/gstate.cpp | 97 ++++++ source/system/gstate.h | 69 ++++ source/system/gte.h | 47 +++ source/system/info.h | 61 ++++ source/system/lnkopt.h | 37 ++ source/system/main.cpp | 229 +++++++++++++ source/system/vid.cpp | 445 ++++++++++++++++++++++++ source/system/vid.h | 56 ++++ source/utils/cmxmacro.h | 84 +++++ source/utils/fixed.h | 30 ++ source/utils/mathmip.h | 11 + source/utils/mathtab.H | 95 ++++++ source/utils/replace.h | 8 + source/utils/sincos.cpp | 403 ++++++++++++++++++++++ source/utils/utils.cpp | 52 +++ source/utils/utils.h | 651 ++++++++++++++++++++++++++++++++++++ 40 files changed, 6829 insertions(+) create mode 100644 source/PsxBoot/PSXBOOT.H create mode 100644 source/PsxBoot/psxboot.cpp create mode 100644 source/game/game.cpp create mode 100644 source/game/game.h create mode 100644 source/gfx/fdata.cpp create mode 100644 source/gfx/fdata.h create mode 100644 source/gfx/font.cpp create mode 100644 source/gfx/font.h create mode 100644 source/gfx/prim.cpp create mode 100644 source/gfx/prim.h create mode 100644 source/gfx/sprbank.cpp create mode 100644 source/gfx/sprbank.h create mode 100644 source/gfx/tpage.cpp create mode 100644 source/gfx/tpage.h create mode 100644 source/locale/textdbase.cpp create mode 100644 source/locale/textdbase.h create mode 100644 source/mem/memory.cpp create mode 100644 source/mem/memory.h create mode 100644 source/pad/pads.cpp create mode 100644 source/pad/pads.h create mode 100644 source/sound/cdxa.cpp create mode 100644 source/sound/cdxa.h create mode 100644 source/system/global.h create mode 100644 source/system/gp.h create mode 100644 source/system/gstate.cpp create mode 100644 source/system/gstate.h create mode 100644 source/system/gte.h create mode 100644 source/system/info.h create mode 100644 source/system/lnkopt.h create mode 100644 source/system/main.cpp create mode 100644 source/system/vid.cpp create mode 100644 source/system/vid.h create mode 100644 source/utils/cmxmacro.h create mode 100644 source/utils/fixed.h create mode 100644 source/utils/mathmip.h create mode 100644 source/utils/mathtab.H create mode 100644 source/utils/replace.h create mode 100644 source/utils/sincos.cpp create mode 100644 source/utils/utils.cpp create mode 100644 source/utils/utils.h diff --git a/source/PsxBoot/PSXBOOT.H b/source/PsxBoot/PSXBOOT.H new file mode 100644 index 000000000..9124bcffe --- /dev/null +++ b/source/PsxBoot/PSXBOOT.H @@ -0,0 +1,38 @@ +/*********************/ +/*** PSX Bootstrap ***/ +/*** Dave 190697 ***/ +/*********************/ + +#ifndef PSXBootHeader +#define PSXBootHeader + +/*****************************************************************************/ +typedef unsigned char byte; +typedef unsigned int word; + +/*****************************************************************************/ +// Screen position and dimensions. +#define FRAME_X 512 + +#ifdef __TERRITORY_USA__ +#define FRAME_Y 240 +#define SCREEN_X 0 //-24 +#define SCREEN_Y -8 +#else +#define FRAME_Y 256 +#define SCREEN_X 0 //-8 +#define SCREEN_Y 8 +#endif // NTSC + +/*---------------------------------------------------------------------------------------------------------*/ +#define LoadBuffer 0x80010000 // psx boot +#define BinLoadAddr 0x80010000 // psx boot + +/*****************************************************************************/ +typedef struct +{ + DRAWENV draw; + DISPENV disp; +} DB; + +#endif diff --git a/source/PsxBoot/psxboot.cpp b/source/PsxBoot/psxboot.cpp new file mode 100644 index 000000000..4e4a62dc9 --- /dev/null +++ b/source/PsxBoot/psxboot.cpp @@ -0,0 +1,263 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "psxboot\PsxBoot.H" +#include "fileio\filetab.h" +#include "fileio\filetab.cpp" + +#define PiracyFilename "\\PIRACY.GFX;1" +#define LegalFilename "\\LEGAL.GFX;1" +#define ScreenDelay 50*(5-2) +#define ExeFilename "\\PRLSR.BIN;1" + +#define CHUNKSIZE 2048 + +#define PrgAddr 0x80010000 +#define SCRATCH_RAM 0x1f800000 + +//#define DBGMsg printf +#define DBGMsg + +/*******************************************************************************/ +DB *CurDBuf,DBuf[2]; + +/*****************************************************************************/ +static volatile int cdread_status=0; +static u_char current_cd_mode; +static int cd_speed=-1;//,buf_sec=-1; +static void cdread_callback(u_char intr, u_char *result) +{ + if (intr==CdlComplete) + { + cdread_status=0; + } + else + if (intr==CdlDiskError) + { + cdread_status=-1; + } + else + { + cdread_status=-2; + } +} + +/*****************************************************************************/ +static void set_cd_speed(int speed) +{ + if (speed!=cd_speed) + { + current_cd_mode=speed?CdlModeSpeed:0; + + do { // Yuk! + while (CdControl(CdlSetmode,¤t_cd_mode,0)==0); + } while (CdSync(0,NULL)!=CdlComplete); + + VSync(5); + + cd_speed=speed; + } +} + +/*******************************************************************************/ +void LoadFile(char *Filename,char *Dst,long Length) +{ + CdlFILE RetFile; + int Len; + + DBGMsg("Load %s\n",Filename); + + while ( !CdSearchFile(&RetFile,(char *)Filename) ) DBGMsg("Not Found\n"); + + if(!Length) + Len=(RetFile.size); + else + Len=Length; + +unsigned char mode=CdlModeSpeed; + + DBGMsg("Found\n"); + + while (1) + { + set_cd_speed(1); + CdReadCallback(cdread_callback); + + while ( (CdControlB(CdlSetloc,(u_char *)&RetFile.pos,NULL)==0) ); + + const unsigned long NumSectors=(unsigned long) (Len / CHUNKSIZE)+1; + + cdread_status=1; + int OK=CdRead(NumSectors,(u_long *)Dst,current_cd_mode); + + if (OK) + { + int C=0; + while(cdread_status>0) + { + C++; + } + + if (cdread_status==0) break; + } + + } + + DrawSync(0); + + CdReadCallback(0); + +} + +/*****************************************************************************/ +/*** System Stuff ************************************************************/ +/*****************************************************************************/ +void InitSys(void) + { +int Count; + ResetCallback(); + ResetGraph(0); + SetGraphDebug(0); + while (!CdInit()); +// InitGeom(); + CdSetDebug(0); +// SpuInit(); + SsInit(); + +#if defined(__TERRITORY_USA__) + SetVideoMode(MODE_NTSC); +#else + SetVideoMode(MODE_PAL); +#endif + + SetDefDrawEnv(&DBuf[0].draw, 0,0, FRAME_X, FRAME_Y); + SetDefDispEnv(&DBuf[0].disp, 0,0, FRAME_X, FRAME_Y); + SetDefDrawEnv(&DBuf[1].draw, 0,0, FRAME_X, FRAME_Y); + SetDefDispEnv(&DBuf[1].disp, 0,0, FRAME_X, FRAME_Y); + + setRECT(&DBuf[0].disp.screen, SCREEN_X, SCREEN_Y, 0, FRAME_Y); + setRECT(&DBuf[1].disp.screen, SCREEN_X, SCREEN_Y, 0, FRAME_Y); + DBuf[0].disp.isrgb24=DBuf[1].disp.isrgb24=0; + DBuf[0].draw.isbg = DBuf[1].draw.isbg = 1; + CurDBuf=DBuf; + +#if !defined(__TERRITORY_USA__) + DBuf[0].disp.screen.y=24; + DBuf[1].disp.screen.y=24; +#endif + +// Stop flicker!! + Count=2; + while(Count--) + { + PutDrawEnv(&CurDBuf->draw); + PutDispEnv(&CurDBuf->disp); + DrawSync(0); + } + DBuf[0].draw.isbg = DBuf[1].draw.isbg = 0; + + SetDispMask(1); + + } + +/*****************************************************************************/ + +void ShowScreen(char *Filename,int Delay,int FadeOutOnly) +{ +u_long Count; +char Fade; +RECT PicRect; +POLY_FT4 fp,*Poly=&fp; +int *Ptr; +// Set up shade polys +// SetPolyFT4(Poly); +// setXYWH(Poly,0,0,SCR_WIDTH,SCR_HEIGHT); +// Poly->tpage=GetTPage(2,0,512,0); + +// if (!FadeOutOnly) + { + setRECT(&PicRect,0,0,1024,512); + ClearImage(&PicRect,0,0,0); + + +// load Screen + LoadFile(Filename,(char*)LoadBuffer,FRAME_X * FRAME_Y*2); + setRECT(&PicRect,0,0,FRAME_X,FRAME_Y); + LoadImage(&PicRect,(u_long*)LoadBuffer); + +// Fade in + Fade=0; +// while(Fade<128) +// { +// setRGB0(Poly,Fade,Fade,Fade); +// Fade+=2; +// DrawPrim(Poly); +// DrawSync(0); +// VSync(0); +// } + +// Wait a while +// if (Delay<0) return; +// Count=Delay; +// while(Count--) +// { +// DrawSync(0); +// } + } +// Fade Out + +// Fade=128; +// while(Fade>0) +// { +// setRGB0(&Poly[0],Fade,Fade,Fade); +// Fade-=2; +// DrawPrim(&Poly[0]); +// DrawPrim(&Poly[1]); +// DrawSync(0); +// } +// + DrawSync(0); +} + +/*****************************************************************************/ +void (*Func)()=(void (*)())0x80010000; +int main() +{ + InitSys(); + + ShowScreen(LegalFilename,-1,0); + CalcFilePos((int*)SCRATCH_RAM); +int *Ptr=(int*)SCRATCH_RAM; +// for (int Loop=0;Loopinitialise( &standardFont ); + s_genericFont->setColour( 128, 80, 100 ); +} + +/*****************************************************************************/ + +void CGameScene::Shutdown() +{ +} + +/*****************************************************************************/ +void CGameScene::Render() +{ +} + +/*****************************************************************************/ +bool CGameScene::Control() +{ + return 1; +} + +/*****************************************************************************/ diff --git a/source/game/game.h b/source/game/game.h new file mode 100644 index 000000000..34bf5c40f --- /dev/null +++ b/source/game/game.h @@ -0,0 +1,40 @@ +/**********************/ +/*** Main Game File ***/ +/**********************/ + +#ifndef __GAME_GAME_H__ +#define __GAME_GAME_H__ + +#include "system\gstate.h" + + +/*****************************************************************************/ +class FontBank; + +class CGameScene : public CScene +{ +public: + CGameScene() {}; + virtual ~CGameScene() {}; + + + void Init(); + void Shutdown(); + void Render(); + bool Control(); + char *GetSceneName() {return "Game";} + + +private: + + static FontBank *s_genericFont; +}; + + + +/*****************************************************************************/ +extern CGameScene GameScene; + +/*****************************************************************************/ + +#endif \ No newline at end of file diff --git a/source/gfx/fdata.cpp b/source/gfx/fdata.cpp new file mode 100644 index 000000000..a4fe65eec --- /dev/null +++ b/source/gfx/fdata.cpp @@ -0,0 +1,104 @@ +/*========================================================================= + + fdata.cpp + + Author: PKG + Created: + Project: PRLSR + Purpose: + + Copyright (c) 2000 Climax Development Ltd + +===========================================================================*/ + + +/*---------------------------------------------------------------------- + Includes + -------- */ + +#include "gfx\fdata.h" + +#include "biglump.h" + +#include + + +/* Std Lib + ------- */ + +/*---------------------------------------------------------------------- + Tyepdefs && Defines + ------------------- */ + +/*---------------------------------------------------------------------- + Structure defintions + -------------------- */ + +/*---------------------------------------------------------------------- + Positional Vars + --------------- */ + +/*---------------------------------------------------------------------- + Function Prototypes + ------------------- */ + +/*---------------------------------------------------------------------- + Vars + ---- */ + +s16 standardFontTab[]= +{ + -1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1, + -1,-1,-1,-1,-1,-1,-1,-1, + /* ! " # $ % & ' */ -1,FRM_PR_FONTINGAME_0037,FRM_PR_FONTINGAME_0038,-1,FRM_PR_FONTINGAME_0052,FRM_PR_FONTINGAME_0039,FRM_PR_FONTINGAME_0040,FRM_PR_FONTINGAME_0036, + /* ( ) * + , - . / */ FRM_PR_FONTINGAME_0042,FRM_PR_FONTINGAME_0043,FRM_PR_FONTINGAME_0041,-1,FRM_PR_FONTINGAME_0047,FRM_PR_FONTINGAME_0044,FRM_PR_FONTINGAME_0053,FRM_PR_FONTINGAME_0050, + /* 0 1 2 3 4 5 6 7 */ FRM_PR_FONTINGAME_0026,FRM_PR_FONTINGAME_0027,FRM_PR_FONTINGAME_0028,FRM_PR_FONTINGAME_0029,FRM_PR_FONTINGAME_0030,FRM_PR_FONTINGAME_0031,FRM_PR_FONTINGAME_0032,FRM_PR_FONTINGAME_0033, + /* 8 9 : ; < = > ? */ FRM_PR_FONTINGAME_0034,FRM_PR_FONTINGAME_0035,FRM_PR_FONTINGAME_0045,FRM_PR_FONTINGAME_0046,FRM_PR_FONTINGAME_0149,-1,FRM_PR_FONTINGAME_0150,FRM_PR_FONTINGAME_0048, + /* @ A B C D E F G */ -1,FRM_PR_FONTINGAME_0000,FRM_PR_FONTINGAME_0001,FRM_PR_FONTINGAME_0002,FRM_PR_FONTINGAME_0003,FRM_PR_FONTINGAME_0004,FRM_PR_FONTINGAME_0005,FRM_PR_FONTINGAME_0006, + /* H I J K L M N O */ FRM_PR_FONTINGAME_0007,FRM_PR_FONTINGAME_0008,FRM_PR_FONTINGAME_0009,FRM_PR_FONTINGAME_0010,FRM_PR_FONTINGAME_0011,FRM_PR_FONTINGAME_0012,FRM_PR_FONTINGAME_0013,FRM_PR_FONTINGAME_0014, + /* P Q R S T U V W */ FRM_PR_FONTINGAME_0015,FRM_PR_FONTINGAME_0016,FRM_PR_FONTINGAME_0017,FRM_PR_FONTINGAME_0018,FRM_PR_FONTINGAME_0019,FRM_PR_FONTINGAME_0020,FRM_PR_FONTINGAME_0021,FRM_PR_FONTINGAME_0022, + /* X Y Z [ \ ] ^ _ */ FRM_PR_FONTINGAME_0023,FRM_PR_FONTINGAME_0024,FRM_PR_FONTINGAME_0025,FRM_PR_FONTINGAME_0054,FRM_PR_FONTINGAME_0049,FRM_PR_FONTINGAME_0055,-1,FRM_PR_FONTINGAME_0151, + /* ` a b c d e f g */ -1,FRM_PR_FONTINGAME_0056,FRM_PR_FONTINGAME_0057,FRM_PR_FONTINGAME_0058,FRM_PR_FONTINGAME_0059,FRM_PR_FONTINGAME_0060,FRM_PR_FONTINGAME_0061,FRM_PR_FONTINGAME_0062, + /* h i j k l m n o */ FRM_PR_FONTINGAME_0063,FRM_PR_FONTINGAME_0064,FRM_PR_FONTINGAME_0065,FRM_PR_FONTINGAME_0066,FRM_PR_FONTINGAME_0067,FRM_PR_FONTINGAME_0068,FRM_PR_FONTINGAME_0069,FRM_PR_FONTINGAME_0070, + /* p q r s t u v w */ FRM_PR_FONTINGAME_0071,FRM_PR_FONTINGAME_0072,FRM_PR_FONTINGAME_0073,FRM_PR_FONTINGAME_0074,FRM_PR_FONTINGAME_0075,FRM_PR_FONTINGAME_0076,FRM_PR_FONTINGAME_0077,FRM_PR_FONTINGAME_0078, + /* x y z { | } ~ . */ FRM_PR_FONTINGAME_0079,FRM_PR_FONTINGAME_0080,FRM_PR_FONTINGAME_0081,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, + /* */ -1,-1,-1,-1,-1,-1,-1,-1, +}; +FontData standardFont( UI_UIGFX_SPR, standardFontTab, 9, 1,1, 4 ); + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +FontData::FontData( FileEquate _fontFileId, s16 *_fontTab, s16 _charHeight, s16 _charGapX, s16 _charGapY, s16 _spaceWidth ) +{ + fontFileId=_fontFileId; + fontTab=_fontTab; + charHeight=_charHeight; + charGapX=_charGapX; + charGapY=_charGapY; + spaceWidth=_spaceWidth; +} + + +/*=========================================================================== + end */ \ No newline at end of file diff --git a/source/gfx/fdata.h b/source/gfx/fdata.h new file mode 100644 index 000000000..e7e278de3 --- /dev/null +++ b/source/gfx/fdata.h @@ -0,0 +1,71 @@ +/*========================================================================= + + fdata.h + + Author: PKG + Created: + Project: PRLSR + Purpose: + + Copyright (c) 2000 Climax Development Ltd + +===========================================================================*/ + +#ifndef __GFX_FDATA_H__ +#define __GFX_FDATA_H__ + +/*---------------------------------------------------------------------- + Includes + -------- */ + +#ifndef _GLOBAL_HEADER_ +#include "system\global.h" +#endif + +#include +/* Std Lib + ------- */ + +/*---------------------------------------------------------------------- + Tyepdefs && Defines + ------------------- */ + +/*---------------------------------------------------------------------- + Structure defintions + -------------------- */ + +class FontData +{ +public: + FontData( FileEquate _fontFileId, s16 *_fontTab, s16 _charHeight, s16 _charGapX, s16 _charGapY, s16 _spaceWidth ); + + FileEquate fontFileId; + s16 *fontTab; + s16 charHeight; + s16 charGapX; + s16 charGapY; + s16 spaceWidth; +}; + +/*---------------------------------------------------------------------- + Globals + ------- */ + +/* Vars + ---- */ + +// Available fonts +extern FontData standardFont; + +/* Data + ---- */ + +/* Functions + --------- */ + +/*---------------------------------------------------------------------- */ + +#endif /* __GFX_FDATA_H__ */ + +/*=========================================================================== + end */ diff --git a/source/gfx/font.cpp b/source/gfx/font.cpp new file mode 100644 index 000000000..5b5306418 --- /dev/null +++ b/source/gfx/font.cpp @@ -0,0 +1,367 @@ +/*========================================================================= + + font.cpp + + Author: PKG + Created: + Project: + Purpose: + + Copyright (c) 2000 + +===========================================================================*/ + +/*---------------------------------------------------------------------- + Includes + -------- */ + +#ifndef __GFX_FONT_H__ +#include "font.h" +#endif + +#ifndef __VID_HEADER_ +#include "system\vid.h" +#endif + +#ifndef __PRIM_HEADER__ +#include "gfx\prim.h" +#endif + +#ifndef __MATHTABLE_HEADER__ +#include "utils\mathtab.h" +#endif + +#ifndef __LOCALE_TEXTDBASE_H__ +#include "locale\textdbase.h" +#endif + + +/* Std Lib + ------- */ + +/* Local + ----- */ + +/*---------------------------------------------------------------------- + Tyepdefs && Defines + ------------------- */ + +/*---------------------------------------------------------------------- + Structure defintions + -------------------- */ + +/*---------------------------------------------------------------------- + Function Prototypes + ------------------- */ + + +/*---------------------------------------------------------------------- + Vars + ---- */ + +/*---------------------------------------------------------------------- + Data + ---- */ + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void FontBank::initialise( FontData *_fontData ) +{ + ASSERT( !m_initialised ); + + m_fontData=_fontData; + + m_spriteBank.load( m_fontData->fontFileId ); + + setOt( DEFAULT_OT ); + setColour( DEFAULT_R, DEFAULT_G, DEFAULT_B ); + setJustification( (Justification)DEFAULT_JUSTIFICATION ); + setPrintArea( 0,0, VidGetScrW(),VidGetScrH() ); + + setTrans( 0 ); + setSMode( 0 ); + + m_initialised=true; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void FontBank::dump() +{ + m_spriteBank.dump(); + + m_initialised=false; +} + + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void FontBank::print( int _x, int _y, s32 _textId ) +{ + print(_x,_y,(u8*)TranslationDatabase::getString(_textId)); +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void FontBank::print( int _x, int _y, u8 *_text ) +{ + ASSERT( m_initialised ); + + int Size; + int StartX; + int Length=0; + int RectWidth; + + switch(m_justification) + { + case JUST_CENTRE: + RectWidth=m_printArea.w; + break; + default: + RectWidth=m_printArea.w-_x; + break; + } + _x+=m_printArea.x; + _y+=m_printArea.y; + _y+=m_fontData->charHeight; // origin at top left please... + StartX=_x; + + while (*_text) + { + Length=getStrWrapLen(_text,RectWidth); + switch (m_justification) + { + case JUST_LEFT: + _x=StartX; + break; + case JUST_RIGHT: + _x=StartX/*+RectWidth*/-Length; + break; + case JUST_CENTRE: + _x=StartX-(Length/2); + break; + } + + while(*_text && Length>0) + { + Size=printChar(*_text++,_x,_y)+m_fontData->charGapX; + _x+=Size; + Length-=Size; + } + _y+=(m_fontData->charHeight+m_fontData->charGapY); + if(*_text=='\n') _text++; // kill newline if there is one ( preserve multiple \n ) + while (*_text==' ') _text++; // kill trailing spaces + } +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void FontBank::setColour( u8 _r, u8 _g, u8 _b ) +{ + m_r = _r; + m_g = _g; + m_b = _b; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void FontBank::setJustification( Justification _justification ) +{ + m_justification = _justification; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void FontBank::setOt( u16 _ot ) +{ + m_ot = _ot; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void FontBank::setPrintArea( int _x, int _y, int _w, int _h ) +{ + m_printArea.x=_x; + m_printArea.y=_y; + m_printArea.w=_w; + m_printArea.h=_h; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void FontBank::setTrans( int _trans ) +{ + m_trans=_trans; +} +void FontBank::setSMode( int _sMode ) +{ + m_sMode=_sMode; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int FontBank::getCharWidth( u8 _char ) +{ + int size; + + if( _char!=' ' ) + { + if( m_fontData->fontTab[_char]==-1 ) _char='X'; + size=m_spriteBank.getFrameWidth( m_fontData->fontTab[_char] ); + } + else + { + size=m_fontData->spaceWidth; + } + + return size; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int FontBank::getCharHeight() +{ + return m_fontData->charHeight+m_fontData->charGapY; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: return height of a string when wrapped to print area + Params: + Returns: + ---------------------------------------------------------------------- */ +int FontBank::getStringHeight( u8 *_text ) +{ + int length=0; + int height=0; + + while (*_text) + { + length=getStrWrapLen(_text,m_printArea.w); + while(*_text && length>0) + { + length-=getCharWidth(*_text++)+m_fontData->charGapX; + } + height+=(m_fontData->charHeight+m_fontData->charGapY); + if(*_text=='\n') _text++; // kill newline if there is one ( preserve multiple \n ) + while (*_text==' ') _text++; // kill trailing spaces + } + + return height; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int FontBank::printChar( u8 _char,int _x,int _y ) +{ + if (_char!=' ') + { + if( m_fontData->fontTab[_char]==-1 ) _char='X'; + POLY_FT4 *Ft4=m_spriteBank.printFT4(m_fontData->fontTab[_char],_x,_y,0,0,m_ot); + setRGB0(Ft4,m_r,m_g,m_b); + setShadeTex(Ft4,0); + + Ft4->tpage |= ( m_sMode << 5 ); + setSemiTrans( Ft4,m_trans ); + setShadeTex( Ft4,0 ); + } + + return getCharWidth(_char); +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int FontBank::getStringWidth( char * text ) +{ + return getStrWrapLen( (u8 *)text, VidGetScrW() ); +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int FontBank::getStrWrapLen( u8 *_text,int _maxWidth ) +{ + int length=0,spaceW; + u8 C; + + spaceW=length+1; // +1 to prevent infinite loop + while (*_text && length<=_maxWidth) + { + C=*_text++; + if (C=='\n') break; + if (C==' ') spaceW=length; + length+=getCharWidth(C)+m_fontData->charGapX; + } + if (length>_maxWidth) length=spaceW; + + return length; +} + + +/*=========================================================================== + end */ diff --git a/source/gfx/font.h b/source/gfx/font.h new file mode 100644 index 000000000..ae0808610 --- /dev/null +++ b/source/gfx/font.h @@ -0,0 +1,101 @@ +/*========================================================================= + + font.h + + Author: PKG + Created: + Project: + Purpose: + + Copyright (c) 2000 + +===========================================================================*/ + +#ifndef __GFX_FONT_H__ +#define __GFX_FONT_H__ + +/*---------------------------------------------------------------------- + Includes + -------- */ + +#ifndef __GFX_FDATA_H__ +#include "gfx\fdata.h" +#endif + +#ifndef __GFX_SPRBANK_H__ +#include "gfx\sprbank.h" +#endif + + +/*---------------------------------------------------------------------- + Tyepdefs && Defines + ------------------- */ + +/*---------------------------------------------------------------------- + Structure defintions + -------------------- */ + +class FontBank +{ +public: + enum Justification + { + JUST_LEFT, + JUST_RIGHT, + JUST_CENTRE + }; + + FontBank() { m_initialised=false; }; + virtual ~FontBank() { ASSERT( !m_initialised ); } + + virtual void initialise( FontData *_fontData ); + void dump(); + int isInitialised() { return m_initialised; } + virtual void print( int _x, int _y, u8 *_text ); + void print( int _x, int _y, s32 _textId ); + void setColour( u8 _r, u8 _g, u8 _b ); + void setJustification( Justification _justification ); + void setOt( u16 _ot ); + void setPrintArea( int _x, int _y, int _w, int _h ); + void setTrans( int _trans ); + void setSMode( int _sMode ); + + int getCharWidth( u8 _char ); + int getCharHeight(); + int getStringWidth( char * text ); + int getStringHeight( u8 *_text ); + + int getStrWrapLen( u8 *_text,int _maxWidth ); + +private: + virtual int printChar( u8 _char,int _x,int _y ); + + + enum { + DEFAULT_R=128, + DEFAULT_G=128, + DEFAULT_B=128, + DEFAULT_JUSTIFICATION=JUST_LEFT, + DEFAULT_OT=1, + }; + +protected: + FontData *m_fontData; + u8 m_r, m_g, m_b; // Font colour + Justification m_justification; + u16 m_ot; // Depth + RECT m_printArea; + SpriteBank m_spriteBank; + int m_initialised; + + int m_trans, m_sMode; + +}; + + +/*---------------------------------------------------------------------- */ + +#endif /* __GFX_FONT_H__ */ + +/*=========================================================================== + end */ diff --git a/source/gfx/prim.cpp b/source/gfx/prim.cpp new file mode 100644 index 000000000..542dc7bc1 --- /dev/null +++ b/source/gfx/prim.cpp @@ -0,0 +1,159 @@ +///**********************/ +/*** Psx Prim Stuff ***/ +/**********************/ + +#include "system\global.h" +#include "gfx\TPage.h" +#include "gfx\AnimTex.h" +#include "gfx\Prim.h" +#include "system\vid.h" + +/*****************************************************************************/ +sOT *OtList[2],*OtPtr; +u32 DmaStart[2]; +u8 *PrimBuffer[2],*PrimListStart,*PrimListEnd; +u8 *CurrPrim,*EndPrim; +int PrimFlipFlag; + +/*****************************************************************************/ +void PrimInit() +{ +// Alloc Lists + OtList[0]=(sOT*)MemAlloc(MAX_OT*2*sizeof(sOT), "-Ot-"); + OtList[1]=OtList[0]+MAX_OT; + PrimBuffer[0]=(u8*)MemAlloc(PRIMPOOL_SIZE*2, "Prim"); + PrimBuffer[1]=PrimBuffer[0]+(PRIMPOOL_SIZE); + + PrimFlipFlag=0; + OtPtr=(sOT*)OtList[PrimFlipFlag]; + CurrPrim=(u8*)PrimBuffer[PrimFlipFlag]; + EndPrim=CurrPrim+(PRIMPOOL_SIZE); + + PrimListStart=PrimBuffer[0]; + PrimListEnd=PrimListStart+(PRIMPOOL_SIZE*2); + + InitOTagR(OtList[0],MAX_OT); + InitOTagR(OtList[1],MAX_OT); +} + + +/*****************************************************************************/ +void PrimDisplay() +{ + CAnimTex::AnimateTex(); + UnlinkOTagR(OtPtr, MAX_OT, &DmaStart[PrimFlipFlag]); + +#ifdef USE_NTAGS + DrawOTag((u32*)&DmaStart[PrimFlipFlag]); +#else + DrawOTag(OtPtr+(MAX_OT-1)); +#endif + + PrimFlipFlag^=1; + OtPtr=(sOT*)OtList[PrimFlipFlag]; + CurrPrim=(u8*)PrimBuffer[PrimFlipFlag]; + EndPrim=CurrPrim+(PRIMPOOL_SIZE); + + ResetOTagR(OtPtr,MAX_OT); + +} + + +/*** Clipping ****************************************************************/ +extern int FrameFlipFlag; +void PrimClip(RECT *R, u32 Depth) +{ +DR_AREA *CPtr=(DR_AREA*)CurrPrim; +RECT Real; +sVidScreen *Scr=VidGetDrawScreen(); + + Real=*R; + CurrPrim+=sizeof(DR_AREA); + Real.x+=Scr->Draw.clip.x; + Real.y+=Scr->Draw.clip.y; + + int xLimit=512; + int yLimit=((FrameFlipFlag^1)+1)*256; + if(Real.x+Real.w>xLimit)Real.w=xLimit-Real.x; + if(Real.y+Real.h>yLimit)Real.h=yLimit-Real.y; + + SetDrawArea(CPtr,&Real); + AddPrimToList(CPtr,Depth); +}; + +/*---------------------------------------------------------------------------*/ +void PrimFullScreen(int Depth) +{ +RECT FullScreenRect={0,0,VidGetScrW(),VidGetScrH()}; + PrimClip(&FullScreenRect,Depth); +} + +/*****************************************************************************/ +/*** NTag Functions **********************************************************/ +/*****************************************************************************/ +#ifdef USE_NTAGS +void ClearNTag(sOT *Ptr, long Count) +{ + for (; Count; Ptr++,Count--) Ptr->FirstPrim = NULL; +} + +/*****************************************************************************/ +void UnlinkNTag(sOT *Ptr, long Count, u32 *StartOt) +{ +u32 *Tag; + for (; Count; Ptr++,Count--) + { + if ((Tag = Ptr->FirstPrim) == NULL) continue; + setaddr(StartOt, Tag); + StartOt = Ptr->LastPrim; + Ptr->FirstPrim = NULL; // Reset while Im at it! + } + termPrim(StartOt); +} + +/*****************************************************************************/ +void UnlinkNTagR(sOT *Ptr, long Count, u32 *StartOt) +{ +u32 *Tag; + Ptr+=Count-1; + for (; Count; Ptr--,Count--) + { + if ((Tag = Ptr->FirstPrim) == NULL) continue; + setaddr(StartOt, Tag); + StartOt = Ptr->LastPrim; + Ptr->FirstPrim = NULL; // Reset while Im at it! + } + termPrim(StartOt); +} + + +/*****************************************************************************/ +LINE_F2 *DrawLine(int _x0,int _y0,int _x1,int _y1,int _r,int _g,int _b,int _ot) +{ + LINE_F2 *lf2=GetPrimLF2(); + lf2->x0=_x0; + lf2->y0=_y0; + lf2->x1=_x1; + lf2->y1=_y1; + setRGB0(lf2,_r,_g,_b); + AddPrimToList(lf2,_ot); + return lf2; +} + +/*****************************************************************************/ +LINE_G2 *DrawGLine(int _x0,int _y0,int _x1,int _y1,int _r1,int _g1,int _b1,int _r2,int _g2,int _b2,int _ot) +{ + LINE_G2 *lg2=GetPrimLG2(); + lg2->x0=_x0; + lg2->y0=_y0; + lg2->x1=_x1; + lg2->y1=_y1; + setRGB0(lg2,_r1,_g1,_b1); + setRGB1(lg2,_r2,_g2,_b2); + AddPrimToList(lg2,_ot); + return lg2; +} + + + +#endif \ No newline at end of file diff --git a/source/gfx/prim.h b/source/gfx/prim.h new file mode 100644 index 000000000..528522105 --- /dev/null +++ b/source/gfx/prim.h @@ -0,0 +1,256 @@ +/******************/ +/*** Prim Stuff ***/ +/******************/ + +#ifndef __PRIM_HEADER__ +#define __PRIM_HEADER__ + +#ifndef _GLOBAL_HEADER_ +#include "system\global.h" +#endif +#include "gfx\gpugte.h" +#include "gfx\tpage.h" + +#define MAX_OT (2048) +#define MAX_PRIMS (2048+512) + +#define USE_NTAGS 1 + +/*** Fast Replacements *********************************************************************************/ +#undef setaddr +#undef getaddr +#define set3(r0,r1) ({ __asm__ ( "swl %1, 2( %0 )" : : "r"( r0 ), "r"( r1 ) : "memory" ); }) +#define get3(r0) ({ unsigned long t; __asm__ ( "lwl %0, 2( %1 )" : "=r"(t) : "r"( r0) : "memory" ); t; }) +#define setaddr(_p0,_p1) set3((_p0), ((u32) (_p1)) << 8) +#define getaddr(_p) (get3(_p) >> 8) + +#undef catPrim +#define CatPrim catPrim +#define catPrim( r0, r1 ) __asm__ volatile ( \ + "sll $12, %1, 8;" \ + "swl $12, 2( %0 )" \ + : \ + : "r"( r0 ), "r"( r1 ) \ + : "$12", "memory" ) + + +#ifdef USE_NTAGS +/*** NTag Stuff **************************************************************************************/ +struct sOT +{ + u32 *FirstPrim,*LastPrim; +}; + +#undef addPrim +#define AddPrim addPrim +#define addPrim(OT,Prim) \ +{ \ + if ((OT)->FirstPrim) \ + setaddr(((u32*)Prim), (OT)->FirstPrim); \ + else \ + (OT)->LastPrim = (u32*)(Prim); \ + (OT)->FirstPrim = (u32*)(Prim); \ +} + +#define NTAG_addPrims(_nt,_ps,_pe) \ + { \ + if ((_nt)->FirstPrim) \ + setaddr((_pe), (_nt)->FirstPrim); \ + else \ + (_nt)->LastPrim = (_pe); \ + (_nt)->FirstPrim = (_ps); \ + } + + +void ClearNTag(sOT *Ptr, long Count); +void UnlinkNTag(sOT *Ptr, long Count, u32 *FirstNT); +void UnlinkNTagR(sOT *Ptr, long Count, u32 *FirstNT); + +inline void UnlinkNTagtoNTag(sOT *to, sOT *from, long count) +{ + sOT *ptr = from; + for (; count; ptr++,count--) // for all NTAGs... + { + u_long *tag = ptr->FirstPrim; + + if (tag == NULL) // if it's blank... + continue; // ...skip past it... + + NTAG_addPrims(to, ptr->FirstPrim, ptr->LastPrim); + + ptr->FirstPrim = NULL; + } +} + + +#define InitOTag(Ot, Count) ClearNTag(Ot,Count); +#define InitOTagR(Ot, Count) ClearNTag(Ot,Count); +#define ResetOTag(Ot, Count) ; +#define ResetOTagR(Ot, Count) ; +#define UnlinkOTag(Ot, Count, Dma) UnlinkNTag(Ot, Count, Dma); +#define UnlinkOTagR(Ot, Count, Dma) UnlinkNTagR(Ot, Count, Dma); + + +#else +/*** OTag Stuff **************************************************************************************/ +typedef u32 sOT; + +#undef addPrim +#define AddPrim addPrim +#define addPrim( r0, r1 ) __asm__ ( \ + "lwl $12, 2( %0 );" \ + "sll $13, %1, 8;" \ + "swl $13, 2( %0 );" \ + "swl $12, 2( %1 )" \ + : \ + : "r"( r0 ), "r"( r1 ) \ + : "$12", "$13", "memory" ) + +#undef addPrims +#define AddPrims addPrims +#define addPrims( r0, r1, r2 ) __asm__ ( \ + "lwl $12, 2( %0 );" \ + "sll $13, %1, 8;" \ + "swl $13, 2( %0 );" \ + "swl $12, 2( %2 )" \ + : \ + : "r"( r0 ), "r"( r1 ), "r"( r2 ) \ + : "$12", "$13", "memory" ) + +#define InitOTag(Ot, Count) ClearOTag(Ot,Count); +#define InitOTagR(Ot, Count) ClearOTagR(Ot,Count); +#define ResetOTag(Ot, Count) InitOTag(Ot,Count); +#define ResetOTagR(Ot, Count) InitOTagR(Ot,Count); +#define UnlinkOTag(OtPtr, MAX_OT, Dma) ; +#define UnlinkOTagR(OtPtr, MAX_OT, Dma) ; + + +#endif +/*** Main Prim Stuff **********************************************************************************/ +#define GetPrim(Ptype) GetPrimSpace(Ptype,CurrPrim); + +#define GetPrimF3() GetPrim(POLY_F3);\ + setPolyF3(CurrPrim-sizeof(POLY_F3)) + +#define GetPrimF4() GetPrim(POLY_F4);\ + setPolyF4(CurrPrim-sizeof(POLY_F4)) + +#define GetPrimFT3() GetPrim(POLY_FT3);\ + setPolyFT3(CurrPrim-sizeof(POLY_FT3)) + +#define GetPrimFT4() GetPrim(POLY_FT4);\ + setPolyFT4(CurrPrim-sizeof(POLY_FT4)) + +#define GetPrimG3() GetPrim(POLY_G3);\ + setPolyG3(CurrPrim-sizeof(POLY_G3)) + +#define GetPrimG4() GetPrim(POLY_G4);\ + setPolyG4(CurrPrim-sizeof(POLY_G4)) + +#define GetPrimGT3() GetPrim(POLY_GT3);\ + setPolyGT3(CurrPrim-sizeof(POLY_GT3)) + +#define GetPrimGT4() GetPrim(POLY_GT4);\ + setPolyGT4(CurrPrim-sizeof(POLY_GT4)) + +#define GetPrimLF2() GetPrim(LINE_F2); \ + setLineF2(CurrPrim-sizeof(LINE_F2)) + +#define GetPrimLF3() GetPrim(LINE_F3);\ + setLineF3(CurrPrim-sizeof(LINE_F3)) + +#define GetPrimLF4() GetPrim(LINE_F4);\ + setLineF4((LINE_F4*)CurrPrim-1) + +#define GetPrimLG2() GetPrim(LINE_G2);\ + setLineG2(CurrPrim-sizeof(LINE_G2)) + +#define GetPrimLG3() GetPrim(LINE_G3);\ + setLineG3(CurrPrim-sizeof(LINE_G3)) + +#define GetPrimLG4() GetPrim(LINE_G4);\ + setLineG4(CurrPrim-sizeof(LINE_G4)) + +/********************************************************************************************************/ +#define OtInRange (MAX_OT-1) +#define OtOutRange (0xffffffff-OtInRange) +#define OTCheck(x) (x&OtOutRange) +#define IsInOTRange(x) (!OTCheck(x)) + +/********************************************************************************************************/ +#define MAX_PRIM_SIZE (sizeof(POLY_FT4)) +#define PRIMPOOL_SIZE (MAX_PRIMS*MAX_PRIM_SIZE) +#define OTLIST_SIZE (MAX_OT*sizeof(sOT)) + +/********************************************************************************************************/ +extern sOT *OtPtr; +extern u8 *CurrPrim,*EndPrim; +extern u8 *PrimListStart,*PrimListEnd; +extern int PrimFlipFlag; + +/********************************************************************************************************/ +const u32 PrimSXY_ClipCode = (256 << 16) | 512; + +/********************************************************************************************************/ +void PrimInit(); + +void PrimDisplay(); +void PrimClip(RECT *r, u32 Depth); +void PrimFullScreen(int Depth); +inline u8 *GetPrimPtr() {return(CurrPrim);} +inline void SetPrimPtr(u8 *Ptr) {CurrPrim=Ptr;} + +void SetPrimCheck(); + +LINE_F2 *DrawLine(int _x0,int _y0,int _x1,int _y1,int _r,int _g,int _b,int _ot); +LINE_G2 *DrawGLine(int _x0,int _y0,int _x1,int _y1,int _r1,int _g1,int _b1,int _r2,int _g2,int _b2,int _ot); + +/********************************************************************************************************/ +/*** Inlines ********************************************************************************************/ +/********************************************************************************************************/ +inline void AddPrimToList(void *Prim,u32 Depth) +{ + ASSERT(DepthU; + *V=Fr->V; +} + +/*-----------------------------------------------------------------------------------------------------*/ +inline void GetFrameUVWH(sFrameHdr *Fr,u8 *U,u8 *V,u8 *W,u8 *H) +{ + *U=Fr->U; + *V=Fr->V; + *W=Fr->W; + *H=Fr->H; +} + +/*-----------------------------------------------------------------------------------------------------*/ +inline void GetFrameWH(sFrameHdr *Fr,u8 *W,u8 *H) +{ + *W=Fr->W; + *H=Fr->H; +} + +/*-----------------------------------------------------------------------------------------------------*/ +inline int GetFrameClut(sFrameHdr *Fr) +{ + return(Fr->Clut); +} + + +/*-----------------------------------------------------------------------------------------------------*/ +inline int GetFrameTPage(sFrameHdr *Fr) +{ + return(Fr->TPage); +} + +#endif + + + diff --git a/source/gfx/sprbank.cpp b/source/gfx/sprbank.cpp new file mode 100644 index 000000000..c8b2dc0c0 --- /dev/null +++ b/source/gfx/sprbank.cpp @@ -0,0 +1,415 @@ +/*========================================================================= + + sprbank.cpp + + Author: PKG + Created: + Project: PRLSR + Purpose: + + Copyright (c) 2000 Climax Development Ltd + +===========================================================================*/ + + +/*---------------------------------------------------------------------- + Includes + -------- */ + +#ifndef __GFX_SPRBANK_H__ +#include "gfx\sprbank.h" +#endif + +#ifndef _FILEIO_HEADER_ +#include "FileIO/FileIO.h" +#endif + +#ifndef __MEMORY_HEADER__ +#include "Mem\Memory.h" +#endif + +#ifndef __PRIM_HEADER__ +#include "gfx\prim.h" +#endif + + +/* Std Lib + ------- */ + +/*---------------------------------------------------------------------- + Tyepdefs && Defines + ------------------- */ + +/*---------------------------------------------------------------------- + Structure defintions + -------------------- */ + + +/*---------------------------------------------------------------------- + Positional Vars + --------------- */ + +/*---------------------------------------------------------------------- + Function Prototypes + ------------------- */ + +/*---------------------------------------------------------------------- + Vars + ---- */ + +// Linked list of loaded instances +static SpriteBankInstance *s_bankList = NULL; + + +//#define SPRITE_BANK_DEBUG + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +SpriteBankInstance::SpriteBankInstance( SpriteBankInstance *_next ) +{ +#ifdef SPRITE_BANK_DEBUG +printf("SpriteBankInstance()\n"); +#endif + m_frameHdr=NULL; + m_file=FileEquate( -1 ); + m_refCount=0; + m_next=_next; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +SpriteBankInstance::~SpriteBankInstance() +{ +#ifdef SPRITE_BANK_DEBUG +printf("~SpriteBankInstance() file=%d\n",m_file); +#endif + ASSERT( !m_frameHdr ); +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +int loadcount=0; +void SpriteBankInstance::load( FileEquate _file ) +{ +#ifdef SPRITE_BANK_DEBUG +printf("SpriteBankInstance::load() file=%d\n",_file); +#endif + if( m_refCount ) + { + ASSERT( _file == m_file ); + m_refCount++; +#ifdef SPRITE_BANK_DEBUG +printf(" loaded reference" ); +#endif + } + else + { + m_tpageDesc=TPLoadTexWithHeaders(_file,&m_frameHdr); + + m_file=_file; + m_refCount=1; +#ifdef SPRITE_BANK_DEBUG +printf(" loaded physical %d",m_file ); +#endif + } +#ifdef SPRITE_BANK_DEBUG +printf(" - refcount=%d\n",m_refCount); +#endif + +loadcount++; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: true if there are no more references to this bank + ---------------------------------------------------------------------- */ +int SpriteBankInstance::dump() +{ +#ifdef SPRITE_BANK_DEBUG +printf("SpriteBankInstance::dump() file=%d\n",m_file); +#endif + int ret=false; + ASSERT(m_frameHdr); + + m_refCount--; +#ifdef SPRITE_BANK_DEBUG +printf(" refcount now %d",m_refCount); +#endif + if( m_refCount == 0 ) + { +#ifdef SPRITE_BANK_DEBUG +printf(" ..freeing\n"); +#endif + TPFree(m_tpageDesc); + MemFree(m_frameHdr); + m_frameHdr=NULL; + ret=true; + } +#ifdef SPRITE_BANK_DEBUG +printf("\n"); +#endif +loadcount--; + return ret; +} + + + + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +SpriteBank::SpriteBank() +{ + m_SpriteBankInstance = NULL; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +SpriteBank::~SpriteBank() +{ + ASSERT(!m_SpriteBankInstance); +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: also creates the instance if required + Returns: + ---------------------------------------------------------------------- */ +void SpriteBank::load( FileEquate _file ) +{ + ASSERT(!m_SpriteBankInstance); + + if( !s_bankList ) + { + // first sprite bank load + s_bankList=new ("SpriteBank::load") SpriteBankInstance( NULL ); + s_bankList->load( _file ); + m_SpriteBankInstance=s_bankList; + } + else + { + SpriteBankInstance *sbiPtr=s_bankList; + do + { + if( sbiPtr->getFile() == _file ) + { + // file already loaded - reference it + sbiPtr->load( _file ); + m_SpriteBankInstance=sbiPtr; + return; + } + sbiPtr=sbiPtr->getNext(); + } + while( sbiPtr ); + + // file not loaded - create new instance + sbiPtr=s_bankList; + s_bankList=new ("SpriteBank::load") SpriteBankInstance( sbiPtr ); + s_bankList->load( _file ); + m_SpriteBankInstance=s_bankList; + } +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: also deletes the instance if required + Returns: + ---------------------------------------------------------------------- */ + +void SpriteBank::dump() +{ + ASSERT( m_SpriteBankInstance ); + if( m_SpriteBankInstance->dump() ) + { + // just removed last last reference - delete instance + if( m_SpriteBankInstance==s_bankList) + { + // first entry in bank list + s_bankList=m_SpriteBankInstance->getNext(); + } + else + { + SpriteBankInstance *sbiPtr=s_bankList; + while( sbiPtr->getNext() != m_SpriteBankInstance ) + { + sbiPtr=sbiPtr->getNext(); + }; + sbiPtr->setNext( sbiPtr->getNext()->getNext() ); + } + + delete m_SpriteBankInstance; + } + m_SpriteBankInstance=NULL; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void SpriteBank::prepareFT4(POLY_FT4 *_ft4,sFrameHdr *_fh,int _x,int _y,bool _xFlip,bool _yFlip) +{ + int W=_fh->W,H=_fh->H; + + setShadeTexPolyFT4(_ft4); + setShadeTex(_ft4,0); + setRGB0(_ft4,128,128,128); + if (_xFlip) + { + _x-=_fh->XOfs; + _x-=W; + } + else + _x+=_fh->XOfs; + + if (_yFlip) + { + _y-=_fh->YOfs; + _y-=H; + } + else + _y+=_fh->YOfs; + + setXYWH(_ft4,_x,_y,W,H); + setUVTp(_fh,_ft4,_xFlip,_yFlip); +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: Pass Z scale as 8 bit fraction, 256 = 1:1, 512 = enlarge X2, etc. + Params: + Returns: + ---------------------------------------------------------------------- */ +void SpriteBank::prepareFT4Scaled(POLY_FT4 *_ft4,sFrameHdr *_fh,int _x,int _y,bool _xFlip,bool _yFlip,long _z) +{ + int W=_fh->W,H=_fh->H; + + W *= _z; + H *= _z; + W>>=8; + H>>=8; + + setShadeTexPolyFT4(_ft4); + if (_xFlip) + { + _x-=_fh->XOfs; + _x-=W; + } + else + _z+=_fh->XOfs; + + _y+=_fh->YOfs; + + setXYWH(_ft4,_x,_y,W,H); + setUVTp(_fh,_ft4,_xFlip,_yFlip); +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void SpriteBank::setUVTp(sFrameHdr *_fh,POLY_FT4 *_ft4,int _xFlip,int _yFlip) +{ + int U=_fh->U; + int V=_fh->V; + int W=_fh->W; + int H=_fh->H; + + if (!_fh->Rotated) + { + if (_xFlip) + { + _ft4->u0=U+W-1; + _ft4->u1=U-1; + _ft4->u2=U+W-1; + _ft4->u3=U-1; + } + else + { + _ft4->u0=U; + _ft4->u1=U+W; + _ft4->u2=U; + _ft4->u3=U+W; + } + if (_yFlip) + { + _ft4->v0=V+H-1; + _ft4->v1=V+H-1; + _ft4->v2=V-1; + _ft4->v3=V-1; + } + else + { + _ft4->v0=V; + _ft4->v1=V; + _ft4->v2=V+H; + _ft4->v3=V+H; + } + } + else + { + if (_xFlip) + { + _ft4->v0=V; + _ft4->v2=V; + _ft4->v1=V+W; + _ft4->v3=V+W; + } + else + { + _ft4->v0=V+W-1; + _ft4->v2=V+W-1; + _ft4->v1=V-1; + _ft4->v3=V-1; + } + if (_yFlip) + { + _ft4->u0=U+H-1; + _ft4->u1=U+H-1; + _ft4->u2=U-1; + _ft4->u3=U-1; + } + else + { + _ft4->u0=U; + _ft4->u1=U; + _ft4->u2=U+H; + _ft4->u3=U+H; + } + } + _ft4->tpage=_fh->TPage; + _ft4->clut=_fh->Clut; +} + + + + diff --git a/source/gfx/sprbank.h b/source/gfx/sprbank.h new file mode 100644 index 000000000..9413ac00a --- /dev/null +++ b/source/gfx/sprbank.h @@ -0,0 +1,117 @@ +/*========================================================================= + + sprbank.h + + Author: PKG + Created: + Project: PRLSR + Purpose: + + Copyright (c) 2000 Climax Development Ltd + +===========================================================================*/ + +#ifndef __GFX_SPRBANK_H__ +#define __GFX_SPRBANK_H__ + +/*---------------------------------------------------------------------- + Includes + -------- */ + +#ifndef _GLOBAL_HEADER_ +#include "system\global.h" +#endif + +#ifndef __VRAM_H__ +#include "gfx\tpage.h" +#endif + +#ifndef __PRIM_HEADER__ +#include "gfx\prim.h" +#endif + + +/* Std Lib + ------- */ + +/*---------------------------------------------------------------------- + Tyepdefs && Defines + ------------------- */ + +/*---------------------------------------------------------------------- + Structure defintions + -------------------- */ +// Single instance of a sprite bank +class SpriteBankInstance +{ +public: + SpriteBankInstance( SpriteBankInstance *_next ); + ~SpriteBankInstance(); + + sFrameHdr *getFrameHeaders() {return m_frameHdr;} + + void load( FileEquate _file ); + int dump(); + + SpriteBankInstance *getNext() { return m_next; } + void setNext( SpriteBankInstance *_next) { m_next = _next; } + FileEquate getFile() { return m_file; } + +//private: + sFrameHdr *m_frameHdr; + TPAGE_DESC m_tpageDesc; + + FileEquate m_file; + int m_refCount; + + SpriteBankInstance *m_next; +}; + +// Class for a bank of sprites ( actually a reference to a SpriteBankInstance ) +class SpriteBank +{ +public: + SpriteBank(); + ~SpriteBank(); + + void load( FileEquate _file ); + void dump(); + + sFrameHdr * getHeaders() {return (m_SpriteBankInstance->getFrameHeaders());} + sFrameHdr * getFrameHeader( int _frame ) {return (&m_SpriteBankInstance->getFrameHeaders()[ _frame ]);} + s32 getFrameWidth( int _frame ) {return (m_SpriteBankInstance->getFrameHeaders()[ _frame ].W);} + s32 getFrameHeight( int _frame ) {return (m_SpriteBankInstance->getFrameHeaders()[ _frame ].H);} + +inline POLY_FT4 *printFT4(int _frame,int _x,int _y,int _xFlip,int _yFlip,int _ot) {return printFT4(&m_SpriteBankInstance->getFrameHeaders()[ _frame ],_x,_y,_xFlip,_yFlip,_ot);} +inline POLY_FT4 *printFT4(sFrameHdr *_fh,int _x,int _y,int _xFlip,int _yFlip,int _ot) +{ + POLY_FT4 *ft4=GetPrimFT4(); + + prepareFT4(ft4,_fh,_x,_y,_xFlip,_yFlip); + AddPrimToList(ft4,_ot); + return(ft4); +} +inline POLY_FT4 *printFT4Scaled(int _frame,int _x,int _y,int _xFlip,int _yFlip,int _ot,long _z) {return printFT4Scaled(&m_SpriteBankInstance->getFrameHeaders()[ _frame ],_x,_y,_xFlip,_yFlip,_ot,_z);} +inline POLY_FT4 *printFT4Scaled(sFrameHdr *_fh,int _x,int _y,int _xFlip,int _yFlip,int _ot, long _z) +{ + POLY_FT4 *ft4=GetPrimFT4(); + + prepareFT4Scaled(ft4,_fh,_x,_y,_xFlip,_yFlip,_z ); + AddPrimToList(ft4,_ot); + return(ft4); +} + + +private: + void prepareFT4(POLY_FT4 *_ft4,sFrameHdr *_fh,int _x,int _y,bool _xFlip,bool _yFlip); + void prepareFT4Scaled(POLY_FT4 *_ft4,sFrameHdr *_fh,int _x,int _y,bool _xFlip,bool _yFlip,long _z); + void setUVTp(sFrameHdr *_fh,POLY_FT4 *_ft4,int _xFlip,int _yYFlip); + + class SpriteBankInstance *m_SpriteBankInstance; + +}; + +#endif /* __GFX_SPRBANK_H__ */ + +/*=========================================================================== + end */ diff --git a/source/gfx/tpage.cpp b/source/gfx/tpage.cpp new file mode 100644 index 000000000..661611bb0 --- /dev/null +++ b/source/gfx/tpage.cpp @@ -0,0 +1,283 @@ +/**********************/ +/*** PSX Vram Stuff ***/ +/**********************/ + +#include "System\global.h" +#include "Gfx\TPage.h" +#include "Gfx\AnimTex.h" +#include "Gfx\Prim.h" +#include "System\vid.h" +#include "FileIO/FileIO.h" +#include "Mem\Memory.h" +#include "utils\utils.h" + +enum TPAGE_ENUMS +{ +TPAGE_HALF0 = 0, +TPAGE_HALF1 = 1, +TPAGE_FULL = 0, +TPAGE_DYN_START = (24), +TPAGE_DYN_END = (26), +MAX_TPAGES = 32, +}; + +//#define INVALIDATE_CACHE 1 + +const int TPRawW=64; +const int TPRawH=256; + +static sTPageCache s_TPCache[MAX_TPAGES]; + +// Theory!! +// Filenames stored so IF tpage is set to load, AND is found within table (free or not) then use that +// Will only work if people are good with the tpage allocation (due to no checks on width) +// Will write a InvalidDate routine + +/*****************************************************************************/ +void TPInit() +{ +// Likes to be a multiple of 65536, dunno why, Im shit like that + + for (int i=0; i15)*TPRawH,64,128); + Invalidate=1; +#endif + s_TPCache[desc.tpage].Info[desc.Half].RefCount--; + if (!s_TPCache[desc.tpage].Info[desc.Half].RefCount) + { + if (Invalidate) s_TPCache[desc.tpage].Info[desc.Half].TPageName=(FileEquate)0; + if (desc.Half==0 && s_TPCache[desc.tpage].Info[1].RefCount==-1) // Check for full tpage + { + s_TPCache[desc.tpage].Info[1].RefCount=0; +#if defined(INVALIDATE_CACHE) + R.h=256; +#endif + } + CAnimTex::DumpThisTPage(s_TPCache[desc.tpage].Info[desc.Half].TPageName); +#if defined(INVALIDATE_CACHE) + R.y+=desc.Half*128; + ClearImage(&R,0,255,0); +#endif + } +} + +/*****************************************************************************/ +void IsTPageInCache(FileEquate Filename,int &TPage,int &Half) +{ + TPage=0; + for (int Loop=0; LoopTPageStart; + Half=0; + if (TPage>=TPAGE_DYN_START && TPage<=TPAGE_DYN_END) // Its a dynamic TPage! + { +// Find spare VRam + if (TPHdr->TPageHeightInPixels <= 128) // Half TPage + { + // Find spare half + while(s_TPCache[TPage].Info[0].RefCount && s_TPCache[TPage].Info[1].RefCount) + { + TPage++; + ASSERT(TPage <= TPAGE_DYN_END);// ASSERT(!"VRAM FULL"); + } + + if (!s_TPCache[TPage].Info[0].RefCount) + Half = TPAGE_HALF0; + else + Half=TPAGE_HALF1; + } + else + { // Full TPage + while(s_TPCache[TPage].Info[0].RefCount || s_TPCache[TPage].Info[1].RefCount) + { + TPage++; + if (TPage >= MAX_TPAGES) ASSERT(!"VRAM FULL"); + } + Half = TPAGE_FULL; + s_TPCache[TPage].Info[1].TPageName=(FileEquate)0; + s_TPCache[TPage].Info[1].RefCount=-1; // lock 2nd half + } + } + +sTPageInfo *Cache=&s_TPCache[TPage].Info[Half]; + Cache->RefCount++; + Cache->TPageName=Filename; + Cache->XOfs=TPage-TPHdr->TPageStart; + Cache->YOfs=Half*128; + Cache->AnimTexCount=0; + return(Cache); +} + +/*****************************************************************************/ +void TPLoadVRam(sTPageHdr *TPHdr, int TPage, int Half, u32 *VRamData) +{ +RECT Rect; + +// Read and DMA TP to VRam + Rect.x=(TPage%16)*TPRawW; + Rect.y=((TPage>>4)*TPRawH)+(Half*128); + Rect.w=TPHdr->TPageWidth*TPRawW; + Rect.h=TPHdr->TPageHeightInPixels; + + DrawSync( 0 ); + LoadImage( &Rect, VRamData); +} + +/*****************************************************************************/ +void AddAnimTexToList(sTPageInfo *Cache,sFrameHdr *FramePtr,int TPage,int Half) +{ +sFrameHdr *AT=&Cache->AnimTexFrame[Cache->AnimTexCount]; + + MCmemcpy(AT,FramePtr,sizeof(sFrameHdr)); + Cache->AnimTexCount++; +} + +/*****************************************************************************/ +TPAGE_DESC TPLoadTex(FileEquate Filename) +{ +TPAGE_DESC Desc; +sTPageHdr *TPHdr; +sFrameHdr *FramePtr; +u32 *VRAMData; +int TPage,Half; +sTPageInfo *Cache; + +// Is it already loaded in TCache? + IsTPageInCache(Filename,TPage,Half); + + if (TPage) // Is in cache, no need to load it again :o) + { + DBG_MSG2("TPLoadTex Cached (%i,%i)",TPage,Half); + s_TPCache[TPage].Info[Half].RefCount++; + Cache=&s_TPCache[TPage].Info[Half]; + FramePtr=&Cache->AnimTexFrame[0]; + } + else + { // Better load it then + DBG_MSG0("TPLoadTex"); + TPHdr=(sTPageHdr*)CFileIO::loadFile(Filename,"TPLoadTEX"); + ASSERT(!TPHdr->NumOfSpareBoxes); + FramePtr=(sFrameHdr*) MakePtr(TPHdr,sizeof(sTPageHdr)); + VRAMData=(u32*) MakePtr(FramePtr,TPHdr->NoOfFrames*sizeof(sFrameHdr)); + Cache=FindSpareTPage(Filename,TPage,Half,TPHdr); + for (int Frm=0;FrmNoOfFrames; Frm++) // Add Animated Texture references + { + if (FramePtr->Cycle) AddAnimTexToList(Cache,FramePtr++,TPage,Half); + } + TPLoadVRam(TPHdr, TPage,Half,VRAMData); + MemFree(TPHdr); + } +// If first instance, add animated textures + if (Cache->RefCount==1) + { + FramePtr=Cache->AnimTexFrame; + for (int Frm=0; FrmAnimTexCount; Frm++) CAnimTex::AddAnimTex(FramePtr++,Filename); + } + + Desc.Half= Half; + Desc.tpage = TPage; + Desc.xoffset = Cache->XOfs; + Desc.yoffset = Cache->YOfs; + + return (Desc); +} + + +/*****************************************************************************/ +// These are NEVER dynamic, but need to store the frame headers +// Plus, this should only happen at system startup now :o) +TPAGE_DESC TPLoadTexWithHeaders(FileEquate Filename, sFrameHdr **hdrs ) +{ +TPAGE_DESC Desc; +sTPageHdr TPHdr; +sFrameHdr *FramePtr; +u32 *VRAMData; +int TPage,Half=0; +sTPageInfo *Cache; +int ReadLeft; + +// Is it already loaded in TCache? + IsTPageInCache(Filename,TPage,Half); + + if (TPage) // Found one!! + { + DBG_MSG2("TPLoadTexWithHeaders Cached (%i,%i)",TPage,Half); + s_TPCache[TPage].Info[Half].RefCount++; + Cache=&s_TPCache[TPage].Info[Half]; + } + else + { + DBG_MSG0("TPLoadTexWithHeaders"); + CFileIO::OpenFile(Filename); +// Load Main Header + CFileIO::ReadFile((void*)&TPHdr,sizeof(sTPageHdr)); + ASSERT(!TPHdr.NumOfSpareBoxes); + TPage=TPHdr.TPageStart; +// Load Rest + *hdrs=(sFrameHdr*)MemAlloc(sizeof(sFrameHdr)*TPHdr.NoOfFrames,"TpFh"); + ReadLeft=CFileIO::GetReadLeft(); + FramePtr=(sFrameHdr*)MemAlloc(ReadLeft,"TPLoadTemp"); + CFileIO::ReadFile(FramePtr,ReadLeft); + CFileIO::CloseFile(); + VRAMData=(u32*) MakePtr(FramePtr,TPHdr.NoOfFrames*sizeof(sFrameHdr)); + MCmemcpy(*hdrs,FramePtr,TPHdr.NoOfFrames*sizeof(sFrameHdr)); + TPLoadVRam(&TPHdr, TPage,Half,VRAMData); + Cache=&s_TPCache[TPage].Info[Half]; + MemFree(FramePtr); + FramePtr=*hdrs; + for (int Frm=0;FrmCycle) AddAnimTexToList(Cache,FramePtr++,TPage,Half); + } + + Cache->RefCount=1; + Cache->TPageName=Filename; + Cache->XOfs=0; + Cache->YOfs=0; + s_TPCache[TPage].Info[1].RefCount=-1; + } + +// If first instance, add animated textures + if (Cache->RefCount==1) + { + FramePtr=Cache->AnimTexFrame; + for (int Frm=0; FrmAnimTexCount; Frm++) CAnimTex::AddAnimTex(FramePtr++,Filename); + } + + Desc.Half= Half; + Desc.tpage = TPage; + Desc.xoffset = Cache->XOfs; + Desc.yoffset = Cache->YOfs; + + return (Desc); +} + diff --git a/source/gfx/tpage.h b/source/gfx/tpage.h new file mode 100644 index 000000000..f5aa852c1 --- /dev/null +++ b/source/gfx/tpage.h @@ -0,0 +1,63 @@ +/**********************/ +/*** PSX Vram Stuff ***/ +/**********************/ + +#ifndef __VRAM_H__ +#define __VRAM_H__ + +#include + +/*************************************************************************************************/ +#define TPAGE_MAX_ANIM_TEX 8 + +typedef struct + { + u16 NoOfFrames,NoOfTPages; + u16 TPageStart; + u16 TPageWidth,TPageHeightInPixels; + u16 NumOfSpareBoxes; + u16 Compress,Pad; + } sTPageHdr; + +typedef struct + { + u16 TPage; + u16 Clut; + s8 XOfs,YOfs; + + u8 W,H; + u8 U,V; + u8 Rotated; + u8 Cycle; + } sFrameHdr; + +struct TPAGE_DESC +{ + u8 Half; + u8 tpage; + u8 xoffset; + u8 yoffset; +}; + +struct sTPageInfo +{ + s16 RefCount; + FileEquate TPageName; + s16 XOfs,YOfs; + u16 AnimTexCount; + sFrameHdr AnimTexFrame[TPAGE_MAX_ANIM_TEX]; +}; + +struct sTPageCache +{ + sTPageInfo Info[2]; +}; + +/********************************************************************************************************/ + +void TPInit(); +TPAGE_DESC TPLoadTex(FileEquate Filename); +TPAGE_DESC TPLoadTexWithHeaders( FileEquate Filename, sFrameHdr **hdrs ); +void TPFree( const TPAGE_DESC & desc ,int blah=0); + +#endif \ No newline at end of file diff --git a/source/locale/textdbase.cpp b/source/locale/textdbase.cpp new file mode 100644 index 000000000..7fd4b52ed --- /dev/null +++ b/source/locale/textdbase.cpp @@ -0,0 +1,228 @@ +/*========================================================================= + + textdbase.cpp + + Author: G R Liddon @ Fareham + Created: Monday 23rd August 1999 + Project: TPW PSX + Purpose: Language Database Handling Code + + Copyright (c) 1998 / 1999 Climax Development Ltd + +===========================================================================*/ + +/*---------------------------------------------------------------------- + Includes + -------- */ + +/* Module Header File + ------------------ */ +#include "textdbase.h" + +/* Std Lib + ------- */ + +/* Glib + ---- */ + +/* Local + ----- */ + +#ifndef __MEMORY_HEADER__ +#include "mem\memory.h" +#endif + +#ifndef __BigLump_H__ +#include +#endif + +#ifndef _FILEIO_HEADER_ +#include "fileio\fileio.h" +#endif + + +/* Graphics + -------- */ + +/*---------------------------------------------------------------------- + Tyepdefs && Defines + ------------------- */ + +/*---------------------------------------------------------------------- + Structure defintions + -------------------- */ +struct TransHeader +{ + u32 m_numOfStrings; + char * m_stringPtrs[1]; + + void relocate(void) + { + for (unsigned int f=0;f m_numOfStrings) + { + DBG_MSG2("stringNum %d > m_numOfStrings %d", stringNum, m_numOfStrings); + ASSERT(0); + } +#endif + return(m_stringPtrs[stringNum]); + + } +}; + +/*---------------------------------------------------------------------- + Function Prototypes + ------------------- */ +static void loadDatabase(FileEquate f); +static void dumpDatabase(void); + +/*---------------------------------------------------------------------- + Vars + ---- */ +static TransHeader * s_database; +static bool s_loaded; +static TransHeader * s_idDatabase; +static bool s_idShow; +/*---------------------------------------------------------------------- + Data + ---- */ +static FileEquate const s_languageFileEquates[NUM_OF_LANGUAGES]= +{ + TRANSLATIONS_ENG_DAT, + TRANSLATIONS_SWE_DAT, + TRANSLATIONS_DUT_DAT, + TRANSLATIONS_ITA_DAT, + TRANSLATIONS_GER_DAT, +}; + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void TranslationDatabase::initialise(bool includeIds) +{ + int largestSize; + + + largestSize=0; + + /* first find which language is the largest */ + + for (int f=0;f largestSize) + largestSize = thisFileSize; + } + + /* now Allocate some mem for it */ + + DBG_MSG1("Translation Database allocating %d bytes string space",largestSize); + + s_database=(TransHeader*)MemAlloc(largestSize,"TextDB"); + s_loaded=false; + + if (includeIds) + { + int len=CFileIO::getFileSize(TRANSLATIONS_ID_DAT); + s_idDatabase=(TransHeader*)MemAlloc(len,"TextID"); + CFileIO::OpenFile(TRANSLATIONS_ID_DAT); + CFileIO::ReadFile(s_idDatabase,len); + CFileIO::CloseFile(); + + s_idDatabase->relocate(); + } + else + s_idDatabase=NULL; + +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void TranslationDatabase::setShowIds(bool idShowVal) +{ + if (s_idDatabase) + s_idShow=idShowVal; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +void TranslationDatabase::loadLanguage(unsigned int langType) +{ + ASSERT(langType < NUM_OF_LANGUAGES); + + if (s_loaded) + dumpDatabase(); + + loadDatabase(FileEquate(s_languageFileEquates[langType])); + + s_loaded=true; +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +char const * TranslationDatabase::getString(unsigned int strNum) +{ + ASSERT(s_loaded); + if (s_idShow) + return(s_idDatabase->getString(strNum)); + else + return(s_database->getString(strNum)); + +} + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +static void loadDatabase(FileEquate f) +{ + ASSERT(!s_loaded); + + CFileIO::OpenFile(f); + CFileIO::ReadFile(s_database,CFileIO::getFileSize(f)); + CFileIO::CloseFile(); + + s_database->relocate(); + s_loaded=true; +} + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +static void dumpDatabase(void) +{ + ASSERT(s_loaded); + + s_loaded=false; +} + +/*=========================================================================== + end */ diff --git a/source/locale/textdbase.h b/source/locale/textdbase.h new file mode 100644 index 000000000..23579e9ff --- /dev/null +++ b/source/locale/textdbase.h @@ -0,0 +1,82 @@ +/*========================================================================= + + textdbase.cpp + + Author: G R Liddon @ Fareham + Created: Monday 23rd August 1999 + Project: TPW PSX + Purpose: Language Database Handling Code + + Copyright (c) 1998 / 1999 Climax Development Ltd + +===========================================================================*/ + +#ifndef __LOCALE_TEXTDBASE_H__ +#define __LOCALE_TEXTDBASE_H__ + +/*---------------------------------------------------------------------- + Includes + -------- */ + +// May as well include the string IDs in here.. +#ifndef __STRING_ENUMS__ +#include +#endif + + +/* Std Lib + ------- */ + +/* Glib + ---- */ + +/* Local + ----- */ + +/*---------------------------------------------------------------------- + Tyepdefs && Defines + ------------------- */ +enum + { + ENGLISH, + SWEDISH, + DUTCH, + ITALIAN, + GERMAN, + NUM_OF_LANGUAGES, + }; + +/*---------------------------------------------------------------------- + Structure defintions + -------------------- */ +class TranslationDatabase +{ +private: +public: + static void initialise(bool includeIds); + static void loadLanguage(unsigned int langType); + static char const * getString(unsigned int strNum); + static void setShowIds(bool idShowVal); +}; + +/*---------------------------------------------------------------------- + Globals + ------- */ + +/* Vars + ---- */ + +/* Data + ---- */ + +/* Functions + --------- */ + + + +/*---------------------------------------------------------------------- */ + +#endif /* __LOCALE_TEXTDBASE_H__ */ + +/*=========================================================================== + end */ diff --git a/source/mem/memory.cpp b/source/mem/memory.cpp new file mode 100644 index 000000000..2667f9cac --- /dev/null +++ b/source/mem/memory.cpp @@ -0,0 +1,636 @@ +/**************************/ +/*** Memory Alloc Stuff ***/ +/**************************/ + +#include "system\global.h" +#include "mem\memory.h" +#include "fileio/fileio.h" // Poo, need this for Databank stuff + +#if defined(__USER_daveo__) +#define MemPrint +#endif + +/*****************************************************************************/ +void MemAddNode(sLList *LList,u_long Len,char *Addr); +void MemRemoveNode(sLList *LList,u_short Node); + +/*****************************************************************************/ +sLList MainRam; +int MemNodeCount=0; + +/*****************************************************************************/ + +#ifdef __DEBUG_MEM__ + +#ifndef __PRIM_HEADER__ +#include "gfx/prim.h" +#endif + +#ifndef __PADS_H__ +#include "pad/pads.h" +#endif + +#ifndef __VID_HEADER_ +#include "system/vid.h" +#endif + +#ifndef __SYSTEM_GSTATE_H__ +#include "system/gstate.h" +#endif + +#ifndef __GFX_FONT_H__ +#include "gfx/font.h" +#endif + + +#define MAX_MEM_DUMP 1024 + +enum MEM_ID +{ + MEM_BACKEND, + MEM_FRONTEND, + MEM_GAME, + MEM_GAMEOPTIONS, + MEM_SYSTEM, + + MEM_ID_MAX +}; + + +struct MEM_PART +{ + void * addr; + MEM_ID id; + const char * name; + const char * file; + int line; + u32 frameTime; +}; + + +static MEM_PART memDump[ MAX_MEM_DUMP ]; + +static bool s_dumpMem = false; + +static const int s_dumpX = 16; +static const int s_dumpY = 190; +static const int s_dumpWidth = 400; +static const int s_dumpHeight = 32; +static const int s_dumpScale = ONE; + +static const int s_dumpTextX = 32; +static const int s_dumpTextY = 120; + +static const int s_dumpShift = 20; + +static const int s_shadeX = 16; +static const int s_shadeY = 110; +static const int s_shadeW = 400; +static const int s_shadeH = 80; +static const CVECTOR s_shadeCol = { 0, 0, 0 }; + + +static int s_currentMemPart = 0; + +static const CVECTOR s_colors[ MEM_ID_MAX ] = +{ + { 255, 0, 0 }, // MEM_BACKEND + { 0, 255, 0 }, // MEM_FRONTEND + { 0, 0, 255 }, // MEM_GAME + { 255, 0, 255 }, // MEM_GAMEOPTIONS + { 255, 255, 255 }, // MEM_SYSTEM +}; + +static const char * s_sceneNames[] = +{ + "BackEnd", + "FrontEnd", + "Game", + "GameOptions", + "System", +}; + +static const int s_nbSceneNames = sizeof(s_sceneNames) / sizeof(char *); + +static FontBank s_debugFont; + + + + +void dumpDebugMem() +{ + if (s_dumpMem) + { + int x, y; + u16 padh, padd; + u32 freeMem; + u32 memBase; + u32 byteWidth; + MEM_PART * mem; + CVECTOR black = {0, 0, 0}; + + padd = PadGetDown( 1 ); + padh = PadGetHeld( 1 ); + +// if (padh & PAD_SQUARE) + { + int dir; + + dir = 0; + if (padd & PAD_LEFT) + { + dir = -1; + s_currentMemPart--; + } + if (padd & PAD_RIGHT) + { + dir = +1; + s_currentMemPart++; + } + + if (s_currentMemPart < 0) s_currentMemPart = MAX_MEM_DUMP - 1; + if (s_currentMemPart >= MAX_MEM_DUMP-1) s_currentMemPart = 0; + + while( !memDump[s_currentMemPart].addr ) + { + s_currentMemPart += dir; + if (s_currentMemPart < 0) s_currentMemPart = MAX_MEM_DUMP - 1; + if (s_currentMemPart >= MAX_MEM_DUMP-1) s_currentMemPart = 0; + } + } +/* else + { + if (padh & PAD_UP) s_dumpScale += 64; + if (padh & PAD_DOWN) s_dumpScale -= 64; + + if (padh & PAD_LEFT) s_dumpX -= (2 * s_dumpScale) >> 12; + if (padh & PAD_RIGHT) s_dumpX += (2 * s_dumpScale) >> 12; + } +*/ + memBase = (u32)OPT_LinkerOpts.FreeMemAddress; + freeMem = OPT_LinkerOpts.FreeMemSize - 4; + if (freeMem > 6*1024*1024) freeMem -= 6*1024*1024; + byteWidth = ((s_dumpWidth << s_dumpShift) / freeMem); + + x = s_dumpX; + y = s_dumpY; + + mem = memDump; + +/* + for (int i=0;iaddr) + { + u32 len; + u32 * addr; + POLY_F4 * F4; + CVECTOR * col; + + addr = (u32 *)mem->addr; + + x = (((u32)addr) - ((u32)memBase)); + x *= s_dumpScale; + x >>= 12; + x *= byteWidth; + x >>= s_dumpShift; + x += s_dumpX; + + len = *(addr - 1); + len *= s_dumpScale; + len >>= 12; + len *= byteWidth; + len >>= s_dumpShift; + + col = &s_colors[ mem->id ]; + + if (i == s_currentMemPart) + { + col = &black; + } + + F4 = GetPrimF4(); + setPolyF4( F4 ); + setXY4( F4, x, y, + x + len, y, + x, y + s_dumpHeight, + x + len, y + s_dumpHeight ); + setSemiTrans( F4, 0 ); + setShadeTex( F4, 0 ); + setRGB0( F4, col->r, col->g, col->b ); + AddPrimToList( F4, 0 ); + } + + mem++; + } +*/ int len; + char Text[ 2048 ]; + char * name; + char * file; + POLY_F4 * F4; + + F4 = GetPrimF4(); + setPolyF4( F4 ); + setXYWH( F4, s_shadeX, s_shadeY, s_shadeW, s_shadeH ); + setSemiTrans( F4, 1 ); + setShadeTex( F4, 0 ); + setRGB0( F4, s_shadeCol.r, s_shadeCol.g, s_shadeCol.b ); + AddPrimToList( F4, 1 ); + + mem = &memDump[ s_currentMemPart ]; + if (mem->addr) len = *(((u32 *)mem->addr) - 1); + else len = 0; + + sprintf( Text, "%d\n", s_currentMemPart ); + if (mem->addr) + { + sprintf( Text, "%sAddr - %X Len - %d\n", Text, (int)mem->addr, len ); + sprintf( Text, "%sAddrEnd - %X\n\n", Text, (int)mem->addr+len ); + + if (mem->name) sprintf( Text, "%sName - %s\n", Text, mem->name ); + else sprintf( Text, "%sName - Undefined", Text ); + + sprintf( Text, "%sFile - %s, Line - %d\n", Text, mem->file, mem->line ); + sprintf( Text, "%sScene - %s\n", Text, s_sceneNames[ mem->id ] ); +// sprintf( Text, "%sTime - %lu", Text, mem->frameTime ); + } + else + { + sprintf( Text, "%sAddr - NULL\nLen - 0\nName - Undefined\nFile - Undefined, Line - 0", Text ); + } + + s_debugFont.print( s_dumpTextX, s_dumpTextY, (u8*)Text ); + } +} + + +void resetDebugMem() +{ + for (int i=0;iGetSceneName(); + + id = -1; + for (int i=0;iSP = stack; + mem->Head = 0xffff; + mem->Tail = 0xffff; + + for (int i=0;iStack[ i ] = stack--; + } + + MemAddNode( mem, len, addr ); + + mem->RamUsed = 0; + mem->TotalRam = len; + +#ifdef __DEBUG_MEM__ + resetDebugMem(); +#endif +} + + +// hmm.. have to alloc this memory before the first scene, but have to wait until all the +// systems are active so can't do it in the standard MemInit() thing +void DebugMemFontInit() +{ +#ifdef __DEBUG_MEM__ + s_debugFont.initialise( &standardFont ); + s_debugFont.setOt( 0 ); +#endif +} + +/*****************************************************************************/ +// 030700 Dave - Implemented smart allocation +// It now looks thru the whole node list, and takes from the smallest VALID node +// I now understand how this memory stuff works, it aint all bad! + +char * MemAllocate( u32 TLen, char const *Name, char const * File, int LineNumber ) +{ +sLList *mem = &MainRam; +u16 Head = mem->Head; +char *Addr = (char*)-1; +u32 Len = ((TLen + 3) & 0xfffffffc); +int BestNode,FirstNode; + + Len += 4; //add on 4 to store Addr ! + +// Find First (and possably only) + while (Head != 0xffff && mem->Nodes[ Head ].LenNodes[ Head ].Next; + ASSERT(Head != 0xffff); + + BestNode=FirstNode=Head; + +// Check rest of list + while (Head != 0xffff) + { + if (mem->Nodes[Head].Len>=Len) + { + if (mem->Nodes[Head].LenNodes[BestNode].Len) BestNode=Head; + } + Head = mem->Nodes[ Head ].Next; + } +//-------------------- +#ifdef MemPrintx + if (Len>300000) + { + Head=mem->Head; + while (Head != 0xffff) + { + printf("%i %i\n",Head,(int)mem->Nodes[Head].Len); + Head = mem->Nodes[ Head ].Next; + } + } + if (FirstNode!=BestNode) + printf("Need %i, %i (%i) \t%i (%i) \n",(int)Len,FirstNode,(int)mem->Nodes[FirstNode].Len, BestNode,(int)mem->Nodes[BestNode].Len); +#endif + +//-------------------- +// Alloc it + if (mem->Nodes[BestNode].Len >= Len) + { + Addr = mem->Nodes[BestNode].Addr; + mem->Nodes[BestNode].Len -= Len; + mem->Nodes[BestNode].Addr += Len; + if (mem->Nodes[BestNode].Len == 0) MemRemoveNode( mem, BestNode); + *(u32*)Addr = Len; + Addr += 4; + mem->RamUsed += Len; + } + +#ifdef __DEBUG_MEM__ + addDebugMem( Addr, Name, File, LineNumber ); +#endif + + ASSERT( (Addr != (char*)-1) ); + return Addr; +} + +/*****************************************************************************/ +void MemFree( void * Address ) +{ +u32 Len; +sLLNode *node; +sLList *mem = &MainRam; +u16 Head = mem->Head; +char *Addr = (char*)Address; + +// If file from Databank, dont try and clear it (simple!!) + if (CFileIO::IsFromDataBank(Address)) return; + Addr -= 4; + + Len = *(u32*)Addr; + + mem->RamUsed -= Len; + + node = &mem->Nodes[ Head ]; + while (Head != 0xffff) + { + if (mem->Nodes[ Head ].Addr == Addr + Len) + { + Len += mem->Nodes[ Head ].Len; + node = &mem->Nodes[ Head ]; + MemRemoveNode( mem, Head ); + Head = mem->Head; + } + else + { + if (mem->Nodes[ Head ].Addr + mem->Nodes[ Head ].Len == Addr) + { + node = &mem->Nodes[ Head ]; + Addr = mem->Nodes[ Head ].Addr; + Len += mem->Nodes[ Head ].Len; + MemRemoveNode( mem, Head ); + Head = mem->Head; + } + else + { + Head = mem->Nodes[ Head ].Next; + } + } + } + + MemAddNode( mem, Len, Addr ); + +#ifdef __DEBUG_MEM__ + freeDebugMem( Address ); +#endif +} +/* +void MemFree( void * Address ) +{ + u32 Len; + sLLNode * node; + sLList * mem = &MainRam; + u16 Head = mem->Head; + char * Addr = (char*)Address; + + Addr -= 4; + + Len = *(u32*)Addr; + + mem->RamUsed -= Len; + + node = &mem->Nodes[ Head ]; + while (Head != 0xffff) + { + if (mem->Nodes[ Head ].Addr == Addr + Len) + { + Len += mem->Nodes[ Head ].Len; + node = &mem->Nodes[ Head ]; + MemRemoveNode( mem, Head ); + Head = mem->Head; + } + else + { + if (mem->Nodes[ Head ].Addr + mem->Nodes[ Head ].Len == Addr) + { + node = &mem->Nodes[ Head ]; + Addr = mem->Nodes[ Head ].Addr; + Len += mem->Nodes[ Head ].Len; + MemRemoveNode( mem, Head ); + Head = mem->Head; + } + else + { + Head = mem->Nodes[ Head ].Next; + } + } + } + + MemAddNode( mem, Len, Addr ); + +#ifdef __DEBUG_MEM__ + + freeDebugMem( Address ); + +#endif +} + +*/ +/*****************************************************************************/ +void MemAddNode( sLList * LList, u32 Len, char * Addr ) +{ +u16 Head = LList->Head; +u16 Tail = LList->Tail; +u16 Node = LList->Stack[ LList->SP-- ]; + + MemNodeCount++; + + if (Head == 0xffff && Tail == 0xffff) + { + LList->Head = Node; + LList->Tail = Node; + LList->Nodes[ Node ].Len = Len; + LList->Nodes[ Node ].Addr = Addr; + LList->Nodes[ Node ].Prev = 0xffff; + LList->Nodes[ Node ].Next = 0xffff; + } + else + { + LList->Head = Node; + LList->Nodes[ Node ].Len = Len; + LList->Nodes[ Node ].Addr = Addr; + LList->Nodes[ Head ].Prev = Node; + LList->Nodes[ Node ].Prev = 0xffff; + LList->Nodes[ Node ].Next = Head; + } +} + + +/*****************************************************************************/ +void MemRemoveNode ( sLList * LList, u16 Node ) +{ +u16 Head = LList->Head; +u16 Tail = LList->Tail; +u16 Prev = LList->Nodes[ Node ].Prev; +u16 Next = LList->Nodes[ Node ].Next; + + MemNodeCount--; + + if (Head == Tail) + { + LList->Head = 0xffff; + LList->Tail = 0xffff; + } + else + { + if (Node == Head) + { + LList->Head = Next; + LList->Nodes[ Next ].Prev = 0xffff; + } + else if (Node == Tail) + { + LList->Tail = Prev; + LList->Nodes[ Prev ].Next = 0xffff; + } + else + { + LList->Nodes[ Next ].Prev = Prev; + LList->Nodes[ Prev ].Next = Next; + } + } + LList->Nodes[Node].Len=0; + LList->SP++; + LList->Stack[ LList->SP ] = Node; +} + + +/*****************************************************************************/ +void *operator new(size_t Size, const char * name ) +{ + return MemAlloc( Size, name ); +} + +/*****************************************************************************/ +void *operator new[](size_t Size, const char * name) +{ + return MemAlloc( Size, name ); +} + +/*****************************************************************************/ +void operator delete(void *Ptr) +{ + MemFree((char*)Ptr); +} +/*****************************************************************************/ +void operator delete[](void *Ptr) +{ + MemFree((char*)Ptr); +} + +/*****************************************************************************/ + diff --git a/source/mem/memory.h b/source/mem/memory.h new file mode 100644 index 000000000..fd45c06cd --- /dev/null +++ b/source/mem/memory.h @@ -0,0 +1,75 @@ +/**************************/ +/*** Memory Alloc Stuff ***/ +/**************************/ + +#ifndef __MEMORY_HEADER__ +#define __MEMORY_HEADER__ + + +#ifndef _GLOBAL_HEADER_ +#include "system\global.h" +#endif + + +// #define __DEBUG_MEM__ // Define if you want to debug memory - TS + + +/*****************************************************************************/ +#define LListLen 50 + +/*****************************************************************************/ +typedef struct + { + char *Addr; + u32 Len; + u16 Prev; + u16 Next; + }sLLNode; + +typedef struct + { + u32 TotalRam; + u32 RamUsed; + + u16 Head; + u16 Tail; + u16 SP; + + u16 Stack[LListLen]; + + sLLNode Nodes[LListLen]; + } sLList; + +/*****************************************************************************/ + +char * MemAllocate( u32 Size, char const *Name, char const * File, int LineNumber); + +void MemInit(); +void DebugMemFontInit(); +void MemFree(void *Addr); + +void * operator new(size_t Size, const char * name = NULL); +void * operator new[](size_t Size, const char * name = NULL); +void operator delete(void *Ptr); +void operator delete[](void *Ptr); + + +#ifdef __VERSION_DEBUG__ + +void dumpDebugMem(); + +#define MemAlloc( Size, Name ) MemAllocate( (Size), (Name), __FILE__, __LINE__ ) + +#else + +#define MemAlloc(Size,Name) MemAllocate( (Size), NULL, NULL, 0 ) + +#endif + + +/*****************************************************************************/ +extern sLList MainRam; // Ah well! + +/*****************************************************************************/ + +#endif \ No newline at end of file diff --git a/source/pad/pads.cpp b/source/pad/pads.cpp new file mode 100644 index 000000000..4cbdf77f4 --- /dev/null +++ b/source/pad/pads.cpp @@ -0,0 +1,411 @@ +/*****************/ +/*** Pad Stuff ***/ +/*****************/ + +#include +#include "system/global.h" +#include "pad/pads.H" + +#ifndef __SYSTEM_GSTATE_H__ +#include "system\gstate.h" +#endif + + + +/*****************************************************************************/ +static sPadConfigTable PadConfigDefault= +{ + { + 0, // PAD_CFG_NONE + PAD_LEFT, // PAD_CFG_LEFT + PAD_RIGHT, // PAD_CFG_RIGHT + PAD_UP, // PAD_CFG_UP + PAD_DOWN, // PAD_CFG_DOWN + + PAD_START, // PAD_CFG_START + PAD_SELECT, // PAD_CFG_SELECT + + PAD_CIRCLE, // PAD_CFG_KICK + PAD_CROSS, // PAD_CFG_PUNCH + PAD_SQUARE, // PAD_CFG_JUMP + PAD_TRIANGLE, // PAD_CFG_BLOCK + PAD_L2, // PAD_CFG_RUN + PAD_R2, // PAD_CFG_SPECIAL + PAD_L1, // PAD_CFG_STEPLEFT + PAD_R1 // PAD_CFG_STEPRIGHT + } +}; + +static sPadConfigTable BloodyOddPadConfigDefault= +{ + { + 0, // PAD_CFG_NONE + PAD_LEFT, // PAD_CFG_LEFT + PAD_RIGHT, // PAD_CFG_RIGHT + PAD_UP, // PAD_CFG_UP + PAD_DOWN, // PAD_CFG_DOWN + + PAD_START, // PAD_CFG_START + PAD_SELECT, // PAD_CFG_SELECT + + PAD_R2, // PAD_CFG_KICK + PAD_R1, // PAD_CFG_PUNCH + PAD_CROSS, // PAD_CFG_JUMP + PAD_L1, // PAD_CFG_BLOCK + PAD_SQUARE, // PAD_CFG_RUN + PAD_L2, // PAD_CFG_SPECIAL + PAD_TRIANGLE, // PAD_CFG_STEPLEFT + PAD_CIRCLE // PAD_CFG_STEPRIGHT + } +}; + + + + +/*****************************************************************************/ +sPadData PadData[2]; +u8 PadBuffer[2][34]; +u8 PadAlign[6]={0,1,0xFF,0xFF,0xFF,0xFF}; +u8 PadMotor[2][2]; + +/*****************************************************************************/ +// 701 +// 6 2 +// 543 +u16 PADAngeDirTable[16]= +{ +0, // 0 +(ONE/8)*0, // 1 U +(ONE/8)*2, // 2 R +(ONE/8)*1, // 3 UR +(ONE/8)*4, // 4 D +0, // 5 UD !! +(ONE/8)*3, // 6 DR +0, // 7 DUR !! +(ONE/8)*6, // 8 L +(ONE/8)*7, // 9 UL +0, // 10 LR !! +0, // 11 LUR !! +(ONE/8)*5, // 12 DL +0, // 13 LUD +0, // 14 LDR +0, // 15 LDUR +}; + +/*****************************************************************************/ + +void PadInitShock(int Port) +{ +int offs,maxID,set; + + if(!PadData[Port].Active)return; + +// ReInit Dual Shock if required + VSync(20); + maxID = PadInfoMode(0x00,InfoModeIdTable,-1); + VSync(5); + for(offs=0;offsOld=Pad->Held; + Held=Pad->Held=Val; + Pad->Down=(Held^Old)&Held; + Pad->Up=(Held^0xffff)&Old; +} + + +/*****************************************************************************/ +const s16 AnalogThresh=64; +void Pad2Digital(sPadData *Pad) +{ +u16 Button; + +// Buttons + Button = ~((Pad->Button1<<8) | Pad->Button2); +// Motion + if (Pad->IsAnalogue) + { +s16 XOfs=Pad->Analog2-127; +s16 YOfs=Pad->Analog3-127; + + if (XOfs<-AnalogThresh) Button|=PAD_LEFT; + else + if (XOfs>+AnalogThresh) Button|=PAD_RIGHT; + if (YOfs<-AnalogThresh) Button|=PAD_UP; + else + if (YOfs>+AnalogThresh) Button|=PAD_DOWN; + } + PadSetVals(Pad,Button); +} + +/*****************************************************************************/ +int PadIsDualShock(int Port) +{ + return (PadData[Port].IsAnalogue==2); +} + +/*****************************************************************************/ +void ReadController(int Port) +{ +u8 *PadBuf=&PadBuffer[Port][0]; +sPadData *Pad=&PadData[Port]; +int PortShift=Port<<4; + + Pad->IsAnalogue=0; + Pad->Status=PadGetState(PortShift); + + if ((Pad->Status==PadStateDiscon) || PadBuf[0]) + { + Pad->Active=0; + Pad->Type=0; + return; + } + Pad->Active=1; + Pad->Type = PadBuf[1]>>4; + Pad->Button1 = PadBuf[2]; + Pad->Button2 = PadBuf[3]; + Pad->Analog0 = PadBuf[4]; + Pad->Analog1 = PadBuf[5]; + Pad->Analog2 = PadBuf[6]; + Pad->Analog3 = PadBuf[7]; + + switch( Pad->Type ) + { + case PsxPadTypeNone: + break; + + case PsxPadTypeMouse: // Sony Mouse + Pad->Dx = Pad->Analog0; + Pad->Dy = Pad->Analog1; + if ( Pad->Dx & 0x80) Pad->Dx|= 0xffffff80; + if ( Pad->Dy & 0x80) Pad->Dy|= 0xffffff80; + break; + + case PsxPadTypeNegiCon: // Namco negCon + // Steering wheel + // Sankyo Pachinko controler + break; + + case PsxPadTypeKonamiGun: // Light Gun + break; + + case PsxPadTypeStandard: // Standard Sony PAD controller +// Pad->Motor0=PadMotor[Port][0]; +// Pad->Motor1=PadMotor[Port][1]; + Pad2Digital(Pad); + break; + + case PsxPadTypeAnalogStick: + case PsxPadTypeAnalogController:// Analog 2-stick + + if (PadInfoMode(0,InfoModeCurExID,0)==7) + Pad->IsAnalogue=2; + else + Pad->IsAnalogue=1; + + // Set vibration values ( motor 0 is 0..1, motor 1 is 0..255 ) +// Pad->Motor0 = s_vibData[ Port ].CurrentIntensityValue & 1; +// Pad->Motor1 = (s_vibData[ Port ].CurrentIntensityValue >> 1) & 0xff; + + Pad2Digital(Pad); + break; + + case PsxPadTypeNamcoGun: + break; + + default: + break; + } + + if (Pad->Status == PadStateFindPad) + { + Pad->Send = 0; + } + if ( Pad->Send==0 ) + { +printf("%d,%d\n",Pad->Motor0,Pad->Motor1); + + PadSetAct(PortShift,&(Pad->Motor0),2); + + if (Pad->Status == PadStateFindCTP1) + { + Pad->Send = 1; + } + if (Pad->Status == PadStateStable) + { + if (PadSetActAlign(PortShift,PadAlign)) Pad->Send = 1; + } + } + +} + +/*****************************************************************************/ +u16 PadGetUp(int Port) +{ + return(PadData[Port].Up); +} + +/*****************************************************************************/ +u16 PadGetDown(int Port) +{ + return(PadData[Port].Down); +} + +/*****************************************************************************/ +u16 PadGetHeld(int Port) +{ + return(PadData[Port].Held); +} + +/*****************************************************************************/ +void PadClear(int Port) +{ + PadData[Port].Up=PadData[Port].Down=PadData[Port].Held=PadData[Port].Old=0; + PadData[Port].Dx=PadData[Port].Dy=0; +} + + +/*****************************************************************************/ + +void PadUpdate() +{ + PadData[0].Dx= PadData[1].Dx=0; + PadData[0].Dy= PadData[1].Dy=0; + PadData[0].Dx1=PadData[1].Dx1=0; + PadData[0].Dy1=PadData[1].Dy1=0; + + ReadController(0); + ReadController(1); + +} + + +/*****************************************************************************/ +u16 PadGetPadAngle(u16 Pad, s16 angleAdjust) +{ + return((PADAngeDirTable[Pad>>PAD_DIR_SHIFT]+((ONE/4)*2)+angleAdjust)&(ONE-1)); +} + + +/*****************************************************************************/ +bool PadIsConnected(int port) +{ + sPadData *pad=&PadData[port]; + + return pad->Status!=PadStateDiscon&&pad->Type; +} + + + +/*---------------------------------------------------------------------- + Function: + Purpose: + Params: + Returns: + ---------------------------------------------------------------------- */ +sPadConfigTable *getPadConfigTable(int _padConfig) +{ + if(_padConfig==0)return &PadConfigDefault; + if(_padConfig==1)return &BloodyOddPadConfigDefault; + ASSERT(0); + return &PadConfigDefault; +} + + +/*****************************************************************************/ + + +CPadConfig::CPadConfig() +{ + Cfg=&PadConfigDefault; +} + +void CPadConfig::SetConfig(sPadConfigTable *NewCfg) +{ + Cfg=NewCfg; +} + +int CPadConfig::GetButton(PAD_CFG But) +{ + return(Cfg->Buttons[But]); +} diff --git a/source/pad/pads.h b/source/pad/pads.h new file mode 100644 index 000000000..0434b6618 --- /dev/null +++ b/source/pad/pads.h @@ -0,0 +1,149 @@ +/*****************/ +/*** Pad Stuff ***/ +/*****************/ + +#ifndef __PADS_H__ +#define __PADS_H__ + +/*****************************************************************************/ +#define DUALSHOCKMODE ((u_long *)0x80010000) + +/*****************************************************************************/ +#define PsxPadTypeNone 0 +#define PsxPadTypeMouse 1 +#define PsxPadTypeNegiCon 2 +#define PsxPadTypeKonamiGun 3 +#define PsxPadTypeStandard 4 +#define PsxPadTypeAnalogStick 5 +#define PsxPadTypeNamcoGun 6 +#define PsxPadTypeAnalogController 7 + +#define PAD_UP PADLup +#define PAD_DOWN PADLdown +#define PAD_LEFT PADLleft +#define PAD_RIGHT PADLright +#define PAD_SELECT PADselect +#define PAD_START PADstart +#define PAD_CROSS PADRdown +#define PAD_SQUARE PADRleft +#define PAD_CIRCLE PADRright +#define PAD_TRIANGLE PADRup +#define PAD_L1 PADL1 +#define PAD_L2 PADL2 +#define PAD_R1 PADR1 +#define PAD_R2 PADR2 + +#define PAD_BUTTONS (PAD_CROSS|PAD_SQUARE|PAD_CIRCLE|PAD_TRIANGLE|PAD_L1|PAD_L2|PAD_R1|PAD_R2) +#define PAD_ALL_DIRS (PAD_UP|PAD_DOWN|PAD_LEFT|PAD_RIGHT) +#define PAD_DIR_SHIFT 12 + +#define BUTTON_SELECT PAD_CROSS +#define BUTTON_BACK PAD_TRIANGLE + + +/*****************************************************************************/ +typedef struct + { + u16 Up,Held,Down,Old; + int XPos, YPos, XPos1, YPos1; // For analog + int Dx,Dy, Dx1,Dy1; + u8 Status; // These 8 values are obtained + u8 Type; // directly from the controller + u8 Button1; // buffer we installed with InitPAD. + u8 Button2; + u8 Analog0; + u8 Analog1; + u8 Analog2; + u8 Analog3; + u8 Motor0,Motor1; // Analog + u8 Send; + u8 IsAnalogue; + bool Active; +} sPadData; + +struct VIBE_DATA +{ + int frame; + int amplitude; +}; + +#define VIBE( a, b ) { a, b } + +/*****************************************************************************/ +void PadsInit(); +void PadClear(int Port); +void PadUpdate(); + +sPadData *PadGet(int Port); + +u16 PadGetUp(int Port); +u16 PadGetDown(int Port); +u16 PadGetHeld(int Port); +u16 PadGetTick(int Port); + +int PadIsDualShock(int Port); + +u16 PadGetPadAngle(u16 Pad, s16 angleAdjust); + +bool PadIsConnected(int port); + +bool PAD_IsRumbling( int port ); +void PAD_SetVibrationEnvelope( int Port, int count, const VIBE_DATA * data, int ferocity=255 ); + + +/*****************************************************************************/ +#define PAD_ACCEPT PAD_CROSS +#define PAD_CANCEL PAD_TRIANGLE +#define PAD_UI_LEFT PAD_LEFT +#define PAD_UI_RIGHT PAD_RIGHT +#define PAD_UI_UP PAD_UP +#define PAD_UI_DOWN PAD_DOWN + +enum PAD_CFG +{ + PAD_CFG_NONE=0, + + PAD_CFG_LEFT, + PAD_CFG_RIGHT, + PAD_CFG_UP, + PAD_CFG_DOWN, + + PAD_CFG_START, + PAD_CFG_SELECT, + + PAD_CFG_KICK, // CIRCLE + PAD_CFG_PUNCH, // CROSS + PAD_CFG_JUMP, // SQUARE + PAD_CFG_BLOCK, // TRIANGLE + PAD_CFG_RUN, // L2 + PAD_CFG_SPECIAL, // R2 + PAD_CFG_STEPLEFT, // L1 + PAD_CFG_STEPRIGHT, // R1 + + PAD_CFG_MAX +}; + +struct sPadConfigTable +{ + u16 Buttons[PAD_CFG_MAX]; +}; + +class CPadConfig +{ +public: + CPadConfig(); + void SetConfig(sPadConfigTable *NewCfg); + int GetButton(PAD_CFG But); + +private: + sPadConfigTable *Cfg; + +}; + +extern sPadConfigTable *getPadConfigTable(int _padConfig); + + + +/*****************************************************************************/ + +#endif \ No newline at end of file diff --git a/source/sound/cdxa.cpp b/source/sound/cdxa.cpp new file mode 100644 index 000000000..b3e2bed8d --- /dev/null +++ b/source/sound/cdxa.cpp @@ -0,0 +1,338 @@ +/*****************************/ +/*** PSX CDXA Player Stuff ***/ +/*** Another one by Dave ***/ +/*****************************/ + +// Note, need to add blanks in between tracks +#include "system\global.h" +#include "fileio/fileio.h" +#include "fileio/filetab.h" +#include "sound\cdxa.h" + +#include +#include + +#ifndef __SOUND_SNDBANK_H__ +#include "sound\sndbank.h" +#endif + + +// Add this to have CDXA on PC build!! +// You will need a CD with Track1 synced to something, oh, and a CD drive +#if defined(__USER_paul__)//|| defined(__USER_daveo__) +#define FORCE_XA 1 +#endif + +#if __FILE_SYSTEM__==CD | FORCE_XA +#define ENABLE_XA +#endif + +#if defined(__USER_CDBUILD__) +#undef FORCE_XA +#endif + +/*****************************************************************************/ +XA_MODE CXAStream::Mode=XA_MODE_NOTINIT; +int CXAStream::Status; +int CXAStream::StartSector; +sXAStream CXAStream::Stream[XA_STREAM_MAX]; +int CXAStream::CurrentStream; +int CXAStream::PauseFlag; + +// Speech +SpeechEquate CXAStream::Queue[XA_QUEUE_MAX]; +u16 CXAStream::QueueCount; + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +void XACDReadyCallback(int Intr, u8 *Result) +{ +static int ErrorRetry; +u32 XABuffer[8]; +u16 ID,Track; +sXAStream &ThisStream=CXAStream::Stream[CXAStream::CurrentStream]; + + CXAStream::Status=Intr; + if (CXAStream::Mode==XA_MODE_IDLE) return; + + switch (Intr) + { + case CdlNoIntr: + break; + case CdlDataReady: +// Check end of XA using video termination + ErrorRetry=0; + CdGetSector((u_long *)XABuffer,8); + ID = *(unsigned short *)(XABuffer+3); + Track = *((unsigned short *)(XABuffer+3)+1); + Track = (Track&31744)>>10; + if (Track==0) + { + ThisStream.Entry.CurrentSector++; // track position + } + else + { + if (ID==352) + { + if (Track==ThisStream.Entry.Channel) + { +// DbgMsg0("TrackEnd\n"); + CXAStream::SetVolumeOff(); + CdControlF(CdlPause,0); + CXAStream::Mode=XA_MODE_END; + } + } + } + break; + case CdlComplete: + break; + case CdlAcknowledge: + break; + case CdlDataEnd: + break; + case CdlDiskError: + if (!ErrorRetry) + { + ErrorRetry=25; +// CXAStream::Mode=XA_MODE_RESUME; + } + else + ErrorRetry--; + break; + default: + break; + } +} + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +void CXAStream::Init() +{ +#ifdef FORCE_XA + DbgMsg0("FORCE XA\n"); + while (!CdInit()); + CFileIO::FindAllFilePos(); + CXAStream::SetSector(CFileIO::GetFilePos(FILEPOS_TRACK1)); + +#endif + DBG_MSG0("XA INITIALISED"); + +// Set defaults + CurrentStream=XA_STREAM_MUSIC; + Stream[XA_STREAM_MUSIC].BaseChannel =XA_MUSIC_TRACK; + Stream[XA_STREAM_SPEECH].BaseChannel=XA_SPEECH_TRACK; + Reset(); +} + +/*****************************************************************************/ +void CXAStream::Start(int Str,u32 Sector,u32 Channel,s32 LVol,s32 RVol) +{ +#ifdef ENABLE_XA + if (Mode==XA_MODE_NOTINIT) Init(); + +sXAStream &ThisStream=Stream[Str]; + SetVolumeOff(); + CdControlF(CdlPause,0); + CurrentStream=Str; + ThisStream.Entry.StartSector=Sector; + ThisStream.Entry.CurrentSector=Sector; + ThisStream.Entry.Channel=Channel+ThisStream.BaseChannel; + ThisStream.Entry.LVol=LVol; + ThisStream.Entry.RVol=RVol; + Mode=XA_MODE_START; + CdReadyCallback((CdlCB)XACDReadyCallback); +#endif +} + +/*****************************************************************************/ +void CXAStream::Stop() +{ + Reset(); + Mode=XA_MODE_STOP; +} + +/*****************************************************************************/ +void CXAStream::PlayMusic(u32 TrackNo) +{ + Start(XA_STREAM_MUSIC,0,0,XA_DEFAULT_VOL,XA_DEFAULT_VOL); +} + +/*****************************************************************************/ + +void CXAStream::PlaySpeech(SpeechEquate SpeechNo,int ForcePlay) +{ +u32 Channel=SpeechNo>>XA_CHANNEL_SHIFT; +u32 Speech=SpeechNo & XA_SPEECH_MASK; +u32 Sector=Speech*XA_TRACK_MAX; + + if (CurrentStream==XA_STREAM_SPEECH && Mode==XA_MODE_PLAY && !ForcePlay) + { + // Check Current + if (Stream[CurrentStream].Entry.Channel==Channel && Stream[CurrentStream].Entry.StartSector==Sector) return; + // Check Queue + if (QueueCount>=(int)XA_QUEUE_MAX) return; + for (int Loop=0;Loop SpuL + CDVol.val1 = 127; // CdL -> SpuR + CDVol.val2 = 127; // CdR -> SpuR + CDVol.val3 = 127; // CdR -> SpuL + CdMix(&CDVol); + +} + +/*****************************************************************************/ +void CXAStream::SetVolumeOff() +{ +CdlATV CDVol; +SpuCommonAttr Attr; +// SsSetSerialVol(SS_SERIAL_A,0,0); + + + Attr.mask = (SPU_COMMON_CDVOLL|SPU_COMMON_CDVOLR|SPU_COMMON_CDMIX); + Attr.cd.volume.left =0; + Attr.cd.volume.right=0; + Attr.cd.mix=SPU_ON; + SpuSetCommonAttr(&Attr); + CDVol.val0 = 0; // CdL -> SpuL + CDVol.val1 = 0; // CdL -> SpuR + CDVol.val2 = 0; // CdR -> SpuR + CDVol.val3 = 0; // CdR -> SpuL + CdMix(&CDVol); + +} + + diff --git a/source/sound/cdxa.h b/source/sound/cdxa.h new file mode 100644 index 000000000..b81acdd88 --- /dev/null +++ b/source/sound/cdxa.h @@ -0,0 +1,113 @@ +/*****************************/ +/*** PSX CDXA Player Stuff ***/ +/*** Another one by Dave ***/ +/*****************************/ + +#ifndef __CDXAHeader__ +#define __CDXAHeader__ + +#include "sound/Speech.h" + +/*****************************************************************************/ +enum XA_ENUM +{ +XA_MUSIC_TRACK =1, +XA_SPEECH_TRACK =2, +XA_QUEUE_MAX =8, +XA_TRACK_MAX =32, +XA_DEFAULT_VOL =32000, +XA_CHANNEL_SHIFT =16, +XA_CHANNEL_MASK =(0xffffffff< +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "utils\replace.h" +#include + +/*****************************************************************************/ +typedef signed char s8; +typedef signed short s16; +typedef signed long s32; +typedef long long s64; + +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned long u32; +typedef unsigned long long u64; + +typedef s8 S8; +typedef s16 S16; +typedef s32 S32; +typedef s64 S64; + +typedef u8 U8; +typedef u16 U16; +typedef u32 U32; +typedef u64 U64; + +/*****************************************************************************/ +#define SCRATCH_RAM 0x1f800000 +#define FAST_STACK (SCRATCH_RAM+0x3f0) + +enum +{ + FRACTION_SHIFT = 8, +}; + +enum DRAW_TYPE +{ + DT_NORMAL, + DT_TRANSPARENT, + DT_SUBTRACT, + DT_ADDITION, + DT_MULTIPLY, +}; + + +/*****************************************************************************/ +#include "mem\memory.h" +#include "system\gte.h" +#include "utils\cmxmacro.h" +#include "utils\fixed.h" + +#include "system\debug.h" +#include "system\info.h" +#include "system\lnkopt.h" + +/*****************************************************************************/ + +#endif diff --git a/source/system/gp.h b/source/system/gp.h new file mode 100644 index 000000000..60e5ff6b5 --- /dev/null +++ b/source/system/gp.h @@ -0,0 +1,18 @@ +/****************/ +/*** GP Stuph ***/ +/****************/ + +#ifndef __GP_H__ +#define __GP_H__ + +/*****************************************************************************/ +extern "C" +{ + void SaveGP(void); + u32 ReloadGP(void); + void SetGP(u32 GpVal); +} + +/*****************************************************************************/ + +#endif diff --git a/source/system/gstate.cpp b/source/system/gstate.cpp new file mode 100644 index 000000000..3fc26175e --- /dev/null +++ b/source/system/gstate.cpp @@ -0,0 +1,97 @@ +/*========================================================================= + + gstate.cpp + + Author: PKG + Created: + Project: PRLSR + Purpose: + + Copyright (c) 2000 Climax Development Ltd + +===========================================================================*/ + + +#include "system\global.h" +#include "system\gstate.h" + + +/*****************************************************************************/ +static CScene *s_currentScene; +static CScene *s_pendingScene; + +int GameState::s_timeSinceLast; + + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +void GameState::initialise() +{ + s_currentScene=NULL; + s_pendingScene=NULL; +} + + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +void GameState::think() +{ + updateTimer(); + + if( s_pendingScene ) + { + if( !s_currentScene) + { + if( s_currentScene ) + { + s_currentScene->Shutdown(); + } + + s_currentScene=s_pendingScene; + s_pendingScene=NULL; + + s_currentScene->Init(); + } + } + ASSERT(s_currentScene); + s_currentScene->Control(); +} + + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +void GameState::render() +{ + ASSERT(s_currentScene); + s_currentScene->Render(); +} + + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +void GameState::setNextScene( CScene *_nextScene ) +{ + ASSERT(!s_pendingScene); + + s_pendingScene=_nextScene; +} + + +/*****************************************************************************/ +CScene * GameState::getCurrentScene() +{ + return s_currentScene; +} + +/*****************************************************************************/ +void GameState::updateTimer() +{ +} + + +/*=========================================================================== + end */ \ No newline at end of file diff --git a/source/system/gstate.h b/source/system/gstate.h new file mode 100644 index 000000000..9b14486e3 --- /dev/null +++ b/source/system/gstate.h @@ -0,0 +1,69 @@ +/*========================================================================= + + gstate.h + + Author: PKG + Created: + Project: PRLSR + Purpose: + + Copyright (c) 2000 Climax Development Ltd + +===========================================================================*/ + +#ifndef __SYSTEM_GSTATE_H__ +#define __SYSTEM_GSTATE_H__ + +class CScene +{ +public: + CScene() {} + virtual ~CScene() {} + + virtual void Init()=0; + virtual void Shutdown()=0; + virtual void Render()=0; + virtual bool Control()=0; + virtual char *GetSceneName()=0; + +protected: +}; + + +/*****************************************************************************/ +class GameState +{ +public: + static void initialise(); + static void think(); + static void render(); + + static void setNextScene( CScene *_nextScene ); + + inline static u32 getTimeSinceLast() {return s_timeSinceLast;} + inline static u32 getFramesSinceLast() {return (s_timeSinceLast>>12)+1;} + + static void setTimeSpeed( int speed ); + + static CScene * getCurrentScene(); + +#if defined(__TERRITORY_USA__) || defined(__TERRITORY_JAP__) + static int getOneSecondInFrames() {return 60;} +#else + static int getOneSecondInFrames() {return 50;} +#endif + +private: + // Try and instantiate a GameState and you will fail miserably :) + GameState(); + + static void updateTimer(); + static int s_timeSinceLast; + +}; + + +#endif /* __SYSTEM_GSTATE_H__ */ + +/*=========================================================================== + end */ diff --git a/source/system/gte.h b/source/system/gte.h new file mode 100644 index 000000000..5eca9cdcc --- /dev/null +++ b/source/system/gte.h @@ -0,0 +1,47 @@ +#ifndef _included_gte_ + #define _included_gte_ + + // + // Store individual components of sv + // + + #define gte_stsv_x( r0 ) __asm__ volatile ( \ + "mfc2 $12, $9;" \ + "sh $12, 0( %0 );" \ + : \ + : "r"( r0 ) \ + : "$12", "memory" ) + + #define gte_stsv_y( r0 ) __asm__ volatile ( \ + "mfc2 $12, $10;" \ + "sh $12, 0( %0 );" \ + : \ + : "r"( r0 ) \ + : "$12", "memory" ) + + #define gte_stsv_z( r0 ) __asm__ volatile ( \ + "mfc2 $12, $11;" \ + "sh $12, 0( %0 );" \ + : \ + : "r"( r0 ) \ + : "$12", "memory" ) + + #define gte_stlvl_x( r0 ) __asm__ volatile ( \ + "swc2 $9, 0( %0 );" \ + : \ + : "r"( r0 ) \ + : "memory" ) + + #define gte_stlvl_y( r0 ) __asm__ volatile ( \ + "swc2 $10, 0( %0 );" \ + : \ + : "r"( r0 ) \ + : "memory" ) + + #define gte_stlvl_z( r0 ) __asm__ volatile ( \ + "swc2 $11, 0( %0 );" \ + : \ + : "r"( r0 ) \ + : "memory" ) + +#endif diff --git a/source/system/info.h b/source/system/info.h new file mode 100644 index 000000000..6eb0d0db8 --- /dev/null +++ b/source/system/info.h @@ -0,0 +1,61 @@ +/*========================================================================= + + INFO.H + + Author: + Created: + Project: + Purpose: + + Copyright (c) 1998 Climax Development Ltd + +===========================================================================*/ + +#ifndef __SYSTEM_INFO_H__ +#define __SYSTEM_INFO_H__ + +/*---------------------------------------------------------------------- + Includes + -------- */ + +/* Std Lib + ------- */ + + +/* Glib + ---- */ + +/* Local + ----- */ + +/*---------------------------------------------------------------------- + Tyepdefs && Defines + ------------------- */ + +/*---------------------------------------------------------------------- + Structure defintions + -------------------- */ + +/*---------------------------------------------------------------------- + Globals + ------- */ + +/* Vars + ---- */ + +/* Data + ---- */ +extern char INF_Version[]; +extern char INF_Territory[]; +extern char INF_FileSystem[]; + + +/* Functions + --------- */ + +/*---------------------------------------------------------------------- */ + +#endif /* __SYSTEM_INFO_H__ */ + +/*=========================================================================== + end */ diff --git a/source/system/lnkopt.h b/source/system/lnkopt.h new file mode 100644 index 000000000..37a936acc --- /dev/null +++ b/source/system/lnkopt.h @@ -0,0 +1,37 @@ + +#ifndef __SYSTEM_LNKOPT_H__ +#define __SYSTEM_LNKOPT_H__ + +enum FILE_SYSTEM +{ + FS_PC =0, + FS_CD +}; + + +enum DEV_KIT +{ + DK_SONY_ISA =0, + DK_SONY_PCI, + DK_CLIMAX, + DK_TPWART, +}; + + +struct LNK_OPTS +{ + u32 RamSize; + u32 StackSize; + void * OrgAddress; + void * FreeMemAddress; + u32 FreeMemSize; + FILE_SYSTEM FileSystem; + DEV_KIT DevKit; + u32 extraCtorsSize; + void * extraCtorsAddress; +}; + + + +extern LNK_OPTS OPT_LinkerOpts; +#endif /* __SYSTEM_LNKOPT_H__ */ diff --git a/source/system/main.cpp b/source/system/main.cpp new file mode 100644 index 000000000..964b55e64 --- /dev/null +++ b/source/system/main.cpp @@ -0,0 +1,229 @@ +/****************/ +/*** PSX Main ***/ +/****************/ + +#include + +#include "system\global.h" +#include "fileio\fileio.h" +#include "pad\pads.h" +#include "system\vid.h" +#include "gfx\prim.h" +#include "gfx\tpage.h" +#include "utils\utils.h" + +#include "system\gp.h" + +// scenes +#include "game\game.h" + +#ifndef __SYSTEM_GSTATE_H__ +#include "system\gstate.h" +#endif + +#ifndef __LOCALE_TEXTDBASE_H__ +#include "locale\textdbase.h" +#endif + + +#define SCREEN_GRAB + +/*****************************************************************************/ + +void SaveScreen(RECT R); + +/*****************************************************************************/ + +void InitSystem() // reordered to reduce black screen (hope all is well +{ + ResetCallback(); + SaveGP(); + SetSp(GetSp()|0x807f0000); +// SetDispMask(0); + + MemInit(); +// MemCardInit( 1 ); +// MemCardStart(); + PadsInit(); +// MemCardStop(); + + CFileIO::Init(); + TranslationDatabase::initialise(false); + TranslationDatabase::loadLanguage(ENGLISH); + PrimInit(); + TPInit(); + VidInit(); + + setRndSeed( VidGetTickCount() ); + + SetDispMask(1); + + GameState::initialise(); + +} + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ + +static int s_time = 0; +void dumpDebugMem(); + +void MainLoop() +{ + while (1) + { + GameState::think(); + GameState::render(); + + while(DrawSync(1)); + + VSync(0); + + VidSwapDraw(); + PrimDisplay(); + PadUpdate(); + + DbgPollHost(); + +#if defined(__VERSION_DEBUG__) + + #if defined(__DEBUG_MEM__) + dumpDebugMem(); + #endif + + #if defined(SCREEN_GRAB) + if (PadGetHeld(0) & PAD_L2) + if (PadGetDown(0) & PAD_START) SaveScreen(VidGetScreen()->Draw.clip); + #endif + + // PKG - Moved vram viewer to SELECT on pad 2 for art dev machines + if (PadGetDown(0) & PAD_SELECT) VRamViewer(); +#endif + } +} + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +int main() +{ + CFileIO::GetAllFilePos(); + InitSystem(); + + GameState::setNextScene( &GameScene ); + +// CXAStream::Init(); // PKG - Stuck here so that it doesn't affect any startup stuff (7/8/00) + MainLoop(); + + return(0); + +} + +/*****************************************************************************/ +#if defined(SCREEN_GRAB) +#if defined(__VERSION_DEBUG__) +struct sTgaHdr +{ + char id; // 0 + char colmaptype; // 1 + char imagetype; // 2 + char fei[2]; // 3 + char cml[2]; // 5 + char cmes; // 7 + short xorig; // 8 + short yorig; // 10 + short width; // 12 + short height; // 14 + char depth; // 15 + char imagedesc; // 16 +}; + +bool FileExists(char const * Name) +{ + int FileHnd; + + FileHnd=PCopen((char *)Name,0,0); + + if (FileHnd!=-1) + { + PCclose(FileHnd); + return true; + } + else + return false; +} + +void SaveScreen(RECT SR) +{ +int FileHnd; +static int ScreenNo=0; +sTgaHdr FileHdr; +int W=SR.w; +int H=SR.h; +char Filename[32]; + + sprintf( Filename, "PRLSR%04d.tga", ScreenNo ); + while (FileExists( Filename ) ) + { + ScreenNo++; + sprintf( Filename, "PRLSR%04d.tga", ScreenNo ); + } + + FileHnd=PCcreat((char *)Filename,0); + ASSERT(FileHnd != -1); + +//--------------------------------------------------------------------------- +// Header + memset(&FileHdr,0 ,sizeof(sTgaHdr)); + + FileHdr.imagetype= 2; //imagetype + FileHdr.width = W; + FileHdr.height= H; + FileHdr.depth=24; +// FileHdr.imagedesc=24; + + PCwrite(FileHnd,(char *)&FileHdr,sizeof(sTgaHdr)); + +//--------------------------------------------------------------------------- +// Data +int x,y; +u16 InBuffer[1024]; +u8 OutBuffer[1024*3]; + + SR.y+=SR.h; + SR.h=1; + for (y=0; y>5)&0x1f; + B=(Col>>10)&0x1f; + + R=R*255/31; + G=G*255/31; + B=B*255/31; + + OutBuffer[(x*3)+0]=B; + OutBuffer[(x*3)+1]=G; + OutBuffer[(x*3)+2]=R; + } + PCwrite(FileHnd,(char *)OutBuffer,W*3); + } + +//--------------------------------------------------------------------------- + PCclose(FileHnd); + + +} +#endif +#endif + diff --git a/source/system/vid.cpp b/source/system/vid.cpp new file mode 100644 index 000000000..f41ca6a5b --- /dev/null +++ b/source/system/vid.cpp @@ -0,0 +1,445 @@ +/******************/ +/*** GFx System ***/ +/******************/ + +#include "system/global.h" +#include "system\vid.h" +#include "gfx\prim.h" +#include "fileio\fileio.h" + +#ifndef __SPR_UIGFX_H__ +#include +#endif + +/*****************************************************************************/ +#define MaxVBFuncs 4 + +/*****************************************************************************/ +static void (*VbFunc)(void); +static VbFuncType VbFuncList[MaxVBFuncs]; + +static u32 FrameCounter=0,TickCount=0,TickBuffer[2]; +static sVidScreen Screen[2]; +static int ScreenXOfs=0,ScreenYOfs=0; +static int ScreenW, ScreenH; +static RECT ScreenRect; +/*static*/ int FrameFlipFlag=0; +static int ClearScreen=0; +static u8 *ScreenImage=0; + +static const CVECTOR s_defClearCol = {0, 0, 0}; + +/*****************************************************************************/ +/*** Loading Icon Cack *******************************************************/ +/*****************************************************************************/ +POLY_FT4 LoadPoly[2]; +static int LoadX=430; +static int LoadY=161; +static int LoadHalfWidth; +static int LoadIconSide; +static int DrawLoadIcon=0; +static RECT LoadBackRect; +static int LoadBackY; +static int LoadTime=0; + + +/*****************************************************************************/ +// Altered to keep aspect ratio +s8 LoadTab[]= +{ + 21,21,21,21,20,20,20,20,19,19,19,18,18,17,17,16,15,14,13,12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,17,18,18,19,19,19,20,20,20,20,20,21 +}; +const int LoadTabSize=sizeof(LoadTab)/sizeof(s8); +/*****************************************************************************/ +void LoadingIcon() +{ +int Dst; +int rgb; +POLY_FT4 *PolyPtr=&LoadPoly[LoadIconSide]; + + Dst=LoadTab[LoadTime]; + + PolyPtr->x0=PolyPtr->x2=LoadX-Dst+LoadHalfWidth+2; + PolyPtr->x1=PolyPtr->x3=LoadX+Dst+LoadHalfWidth+2; + + rgb=128-(LoadTab[(LoadTime+LoadTabSize/2)%LoadTabSize]*3); + setRGB0(PolyPtr,rgb,rgb,rgb); + + MoveImage(&LoadBackRect,LoadX,LoadY+LoadBackY); + + PutDrawEnv(&Screen[FrameFlipFlag^1].Draw); + DrawPrim(PolyPtr); + + LoadTime++; + if (LoadTime>=LoadTabSize) LoadTime=0; + if(LoadTime==LoadTabSize/2) LoadIconSide^=1; +} + +/*****************************************************************************/ +void StartLoad(int _loadX,int _loadY) +{ +/* +sFrameHdr *fh; +SpriteBank *spr; + + spr=UIGetSharedSpriteBank(); + LoadX=_loadX; + LoadY=_loadY; + + setPolyFT4(&LoadPoly[0]); + fh=spr->getFrameHeader(FRM__CD); + setXYWH(&LoadPoly[0],LoadX,LoadY,fh->W,fh->H); + setUVWH(&LoadPoly[0],fh->U,fh->V,fh->W,fh->H); + LoadPoly[0].tpage=fh->TPage; + LoadPoly[0].clut=fh->Clut; + + setPolyFT4(&LoadPoly[1]); + fh=spr->getFrameHeader(FRM__CDFRONT); + setXYWH(&LoadPoly[1],LoadX,LoadY,fh->W,fh->H); + setUVWH(&LoadPoly[1],fh->U,fh->V,fh->W,fh->H); + LoadPoly[1].tpage=fh->TPage; + LoadPoly[1].clut=fh->Clut; + + LoadHalfWidth=fh->W/2; + + Screen[0].Draw.isbg=Screen[1].Draw.isbg=0; + + PutDrawEnv(&Screen[FrameFlipFlag^1].Draw); + PutDispEnv(&Screen[FrameFlipFlag].Disp); + + LoadBackY=Screen[FrameFlipFlag^1].Disp.disp.y; + setRECT(&LoadBackRect,LoadX,LoadY+(LoadBackY^256),fh->W+4,fh->H+4); + + LoadTime=0; + DrawLoadIcon=1; + LoadIconSide=0; +*/ +} + +/*****************************************************************************/ +void StopLoad() +{ + + while(LoadTime) + { + VSync(0); + } + + Screen[0].Draw.isbg=Screen[1].Draw.isbg=1; + + DrawLoadIcon=0; +} + +/*****************************************************************************/ +/*** VSync *******************************************************************/ +/*****************************************************************************/ +extern "C" +{ +static void VidVSyncCallback() +{ + int i; + FrameCounter++; + TickCount++; + if (DrawLoadIcon) LoadingIcon(); + if (VbFunc) + { + VbFunc(); + VbFunc = NULL; + } + for (i=0; i< MaxVBFuncs; i++) if (VbFuncList[i]) VbFuncList[i](); +} +} +/*****************************************************************************/ +void VidAddVSyncFunc(VbFuncType v) +{ + int i; + for (i=0; idisp.x=0; + Disp->disp.y=ScrH; + Disp->disp.w=512; + Disp->disp.h=256; + Disp->screen.x=ScreenXOfs; + Disp->screen.y=ScreenYOfs; + Disp->screen.w=256; + Disp->screen.h=256; + PutDispEnv(Disp); + PutDrawEnv(Draw); + +// If set, load background screen + if (ScreenImage) LoadImage2(&Screen[LastFrame].Disp.disp ,(u_long*)ScreenImage); + + +if(ScreenClipBox==1) +{ + DrawLine(15,25,512-15,25,255,0,0,0); + DrawLine(15,256-25,512-15,256-25,255,0,0,0); + DrawLine(15,25,15,256-25,255,0,0,0); + DrawLine(512-15,25,512-15,256-25,255,0,0,0); + + DrawLine(0,0,511,0,0,255,0,0); + DrawLine(0,255,511,255,0,255,0,0); + DrawLine(0,0,0,255,0,255,0,0); + DrawLine(511,0,511,255,0,255,0,0); +} +if(ScreenClipBox==2) +{ + POLY_F4 *f4; + f4=GetPrimF4(); + setXYWH(f4,0,0,512,20); + setRGB0(f4,50,50,50); + AddPrimToList(f4,0); + f4=GetPrimF4(); + setXYWH(f4,0,256-20,512,20); + setRGB0(f4,50,50,50); + AddPrimToList(f4,0); + f4=GetPrimF4(); + setXYWH(f4,512-10,20,10,256-40); + setRGB0(f4,50,50,50); + AddPrimToList(f4,0); + f4=GetPrimF4(); + setXYWH(f4,0,20,10,256-40); + setRGB0(f4,50,50,50); + AddPrimToList(f4,0); +} + +} + + +/*****************************************************************************/ +/*** VRAM VIEWER *************************************************************/ +/*****************************************************************************/ +#define UseVRamViewer + +#ifdef UseVRamViewer +#include "pad\pads.H" +void VRamViewer() +{ +bool Done=0; +sVidScreen *Scr=VidGetScreen(); +u16 Pad; +int OldX=Scr->Disp.disp.x,OldY=Scr->Disp.disp.y; + + while(!Done) + { + PadUpdate(); + DbgPollHost(); + +#ifdef __USER_ARTDEV__ + Pad=PadGetHeld(1); +#else + Pad=PadGetHeld(0); +#endif +#ifdef __USER_paul__ + // my finger was hurting.. + if((PadGetDown(0) & PAD_SELECT)) Done=1; +#else + if(!(Pad & PAD_SELECT)) Done=1; +#endif + + if(Pad&PAD_LEFT) if(Scr->Disp.disp.x) Scr->Disp.disp.x--; + if(Pad&PAD_RIGHT) if(Scr->Disp.disp.x<700) Scr->Disp.disp.x++; + if(Pad&PAD_UP) if(Scr->Disp.disp.y) Scr->Disp.disp.y--; + if(Pad&PAD_DOWN) if(Scr->Disp.disp.y<256) Scr->Disp.disp.y++; + PutDispEnv(&Scr->Disp); + PutDrawEnv(&Scr->Draw); + } + + Scr->Disp.disp.x=OldX; + Scr->Disp.disp.y=OldY; + +} +#endif \ No newline at end of file diff --git a/source/system/vid.h b/source/system/vid.h new file mode 100644 index 000000000..776814ccf --- /dev/null +++ b/source/system/vid.h @@ -0,0 +1,56 @@ +/******************/ +/*** GFx System ***/ +/******************/ + +#ifndef __VID_HEADER_ +#define __VID_HEADER_ + +#include "system\global.h" + +/*****************************************************************************/ +#define GEOM_SCREEN_H 350 + +/*****************************************************************************/ +typedef void (*VbFuncType)(void); + +/*****************************************************************************/ +struct sVidScreen +{ + DRAWENV Draw; + DISPENV Disp; +}; + +/*****************************************************************************/ +void VidInit(); + +void VidScrOn(); +void VidSetRes(int x, int y); +void VidSetClearScreen(int ); +void VidSetClearColor( const CVECTOR & col ); + +int VidGetXOfs(); +int VidGetYOfs(); +void VidSetXYOfs(int x,int y); +int VidGetScrW(); +int VidGetScrH(); +sVidScreen *VidGetScreen(); +sVidScreen *VidGetDispScreen(); +sVidScreen *VidGetDrawScreen(); +u32 VidGetFrameCount(); +u32 VidGetTickCount(); + +void VidSwapDraw(); + +void VidAddVSyncFunc(VbFuncType v); +void VidRemoveVSyncFunc(VbFuncType v); + +void VRamViewer(); + +void StartLoad(int _loadX=430,int _loadY=202); +void StopLoad(); + +void SetScreenImage(u8 *Ptr); +u8 *GetScreenImage(); +void ClearScreenImage(); + +#endif diff --git a/source/utils/cmxmacro.h b/source/utils/cmxmacro.h new file mode 100644 index 000000000..75775fd5c --- /dev/null +++ b/source/utils/cmxmacro.h @@ -0,0 +1,84 @@ +/*********************/ +/*** Climax Macros ***/ +/*********************/ + +#ifndef __CMX_MACROS_HEADER__ +#define __CMX_MACROS_HEADER__ + + +/*****************************************************************************/ +// Get the summed magnitude of the vector XYZ (after sqr) +#define CMX_StVecXYZMag(r0) __asm__ volatile ( \ + "mfc2 $12, $25;" \ + "mfc2 $13, $26;" \ + "mfc2 $14, $27;" \ + "add $12, $12, $13;" \ + "add $12, $12, $14;" \ + "sw $12, 0( %0 );" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "$14", "memory" ) + +/*---------------------------------------------------------------------------*/ +// Get the summed magnitude of the vector XZ (after sqr) +#define CMX_StVecXZMag(r0) __asm__ volatile ( \ + "mfc2 $12, $25;" \ + "mfc2 $13, $27;" \ + "add $12, $12, $13;" \ + "sw $12, 0( %0 );" \ + : \ + : "r"( r0 ) \ + : "$12", "$13", "memory" ) + +/*---------------------------------------------------------------------------*/ +// Load IR0,IR1,IR2 with values (for SQR) +#define CMX_ldXYZ(r0,r1,r2) __asm__ ( \ + "mtc2 %0,$9;" \ + "mtc2 %1,$10;" \ + "mtc2 %2,$11" \ + : \ + : "r"( r0 ),"r"( r1 ),"r"( r2 ) ) + +/*---------------------------------------------------------------------------*/ +// Load IR0,IR1,IR2 with values (for SQR) +#define CMX_ldXZ(r0,r1) __asm__ ( \ + "mtc2 %0,$9;" \ + "mtc2 %1,$11" \ + : \ + : "r"( r0 ),"r"( r1 )) + +/*****************************************************************************/ +/*** Smaller Translation Macros (no return flags) ****************************/ +/*****************************************************************************/ +#define CMX_RotTransPers(r1,r2) \ +{ gte_ldv0(r1); \ + gte_rtps(); \ + gte_stsxy(r2); \ +} + +/*---------------------------------------------------------------------------*/ +#define CMX_RotTransPers3(r1,r2,r3,r4,r5,r6) \ +{ gte_ldv3(r1,r2,r3); \ + gte_rtpt(); \ + gte_stsxy3(r4,r5,r6); \ +} + +/*---------------------------------------------------------------------------*/ +#define CMX_RotTransPers4(r1,r2,r3,r4,r5,r6,r7,r8) \ +{ gte_ldv0(r4); \ + gte_rtps(); \ + gte_ldv3(r1,r2,r3); \ + gte_stsxy(r8); \ + gte_rtpt(); \ + gte_stsxy3(r5,r6,r7); \ +} + +/*---------------------------------------------------------------------------*/ +#define CMX_RotTrans(r1,r2) \ +{ gte_ldv0(r1); \ + gte_rt(); \ + gte_stlvnl(r2); \ +} + +/*****************************************************************************/ +#endif \ No newline at end of file diff --git a/source/utils/fixed.h b/source/utils/fixed.h new file mode 100644 index 000000000..875929fee --- /dev/null +++ b/source/utils/fixed.h @@ -0,0 +1,30 @@ +/*******************/ +/*** Fixed Stupg ***/ +/*******************/ + +#ifndef __DAVES_FIXED__ +#define __DAVES_FIXED__ + +#include "system/global.h" + +/*****************************************************************************/ +typedef s32 Fixed; + +/*****************************************************************************/ +#define FixedShift 16 +#define FixedMultFactor (1<>FixedShift)) + +#define FixedMult(a,b) ((a*b)>>FixedShift) +#define FixedMult2(a,b) ((a>>(FixedShift/2))*(b>>(FixedShift/2))) + +/*****************************************************************************/ +#endif \ No newline at end of file diff --git a/source/utils/mathmip.h b/source/utils/mathmip.h new file mode 100644 index 000000000..08253bcb4 --- /dev/null +++ b/source/utils/mathmip.h @@ -0,0 +1,11 @@ +/*****************/ +/*** Math Mips ***/ +/*****************/ + +#ifndef __MISCMIP_HEADER__ +#define __MISCMIP_HEADER__ + +/*****************************************************************************/ +extern "C" s32 FixedMul(s32 a, s32 b); + +#endif diff --git a/source/utils/mathtab.H b/source/utils/mathtab.H new file mode 100644 index 000000000..01747e5ab --- /dev/null +++ b/source/utils/mathtab.H @@ -0,0 +1,95 @@ +/*************************/ +/*** Math Table Header ***/ +/*************************/ + +#ifndef __MATHTABLE_HEADER__ +#define __MATHTABLE_HEADER__ + +#ifndef _GLOBAL_HEADER_ +#include "system\global.h" +#endif + + +/*****************************************************************************/ +extern VECTOR upVec; + +extern const s16 ACosTable[4097]; +extern const s16 SinTable[1024]; +extern const s32 OneSinTable[1024]; + +/*****************************************************************************/ +inline s32 macos(const s32 &a) +{ + return(ACosTable[a>>1]); +} + +/*****************************************************************************/ + +inline s32 msin(const s32 &a) +{ + if (a>3071) + { + return(-SinTable[1023 - (a&1023)]); + } else + if (a>2047) + { + return(-SinTable[a&1023]); + } else + if (a>1023) + { + return(SinTable[1023 - (a&1023)]); + } else + { + return(SinTable[a]); + } +} + +/*****************************************************************************/ + +inline s32 mcos(const s32 &a) +{ + if (a>3071) + { + return(SinTable[(a&1023)]); + } else + if (a>2047) + { + return(-SinTable[1023 - (a&1023)]); + } else + if (a>1023) + { + return(-SinTable[a&1023]); + } else + { + return(SinTable[1023 - a]); + } +} + +/*****************************************************************************/ + +inline s32 monesin(const s32 &a) +{ + if (a>3071) + { + return(-OneSinTable[1024 - (a&1023)]); + } else + if (a>2047) + { + return(-OneSinTable[a&1023]); + } else + if (a>1023) + { + return(OneSinTable[1024 - (a&1023)]); + } else + { + return(OneSinTable[a]); + } +} + +/*****************************************************************************/ +/* +#define msin(x) rsin((x)) +#define mcos(x) rcos((x)) +#define monesin(x) (((s32)4096<<12)/rsin((x))) +*/ +#endif diff --git a/source/utils/replace.h b/source/utils/replace.h new file mode 100644 index 000000000..581c770a7 --- /dev/null +++ b/source/utils/replace.h @@ -0,0 +1,8 @@ +#ifndef __REPLACE_H__ +#define __REPLACE_H__ + + +extern "C" void MCmemcpy(void *Dst,void *Src,int Length); + + +#endif \ No newline at end of file diff --git a/source/utils/sincos.cpp b/source/utils/sincos.cpp new file mode 100644 index 000000000..ecf123864 --- /dev/null +++ b/source/utils/sincos.cpp @@ -0,0 +1,403 @@ +/********************/ +/*** SinCos Table ***/ +/********************/ + +#include "system\global.h" + +VECTOR upVec = { 0, ONE, 0, 0 }; + +/*****************************************************************************/ +s16 ACosTable[4097] = { +2047 ,2027 ,2019 ,2012 ,2007 ,2002 ,1998 ,1994 ,1990 ,1986 ,1983 ,1980 ,1977 ,1974 ,1971 ,1969 , +1966 ,1963 ,1961 ,1959 ,1956 ,1954 ,1952 ,1950 ,1948 ,1946 ,1944 ,1942 ,1940 ,1938 ,1936 ,1934 , +1932 ,1930 ,1929 ,1927 ,1925 ,1923 ,1922 ,1920 ,1918 ,1917 ,1915 ,1914 ,1912 ,1911 ,1909 ,1908 , +1906 ,1905 ,1903 ,1902 ,1900 ,1899 ,1897 ,1896 ,1895 ,1893 ,1892 ,1891 ,1889 ,1888 ,1887 ,1885 , +1884 ,1883 ,1882 ,1880 ,1879 ,1878 ,1877 ,1875 ,1874 ,1873 ,1872 ,1871 ,1869 ,1868 ,1867 ,1866 , +1865 ,1864 ,1862 ,1861 ,1860 ,1859 ,1858 ,1857 ,1856 ,1855 ,1854 ,1852 ,1851 ,1850 ,1849 ,1848 , +1847 ,1846 ,1845 ,1844 ,1843 ,1842 ,1841 ,1840 ,1839 ,1838 ,1837 ,1836 ,1835 ,1834 ,1833 ,1832 , +1831 ,1830 ,1829 ,1828 ,1827 ,1826 ,1825 ,1824 ,1823 ,1822 ,1821 ,1820 ,1819 ,1819 ,1818 ,1817 , +1816 ,1815 ,1814 ,1813 ,1812 ,1811 ,1810 ,1809 ,1809 ,1808 ,1807 ,1806 ,1805 ,1804 ,1803 ,1802 , +1802 ,1801 ,1800 ,1799 ,1798 ,1797 ,1796 ,1796 ,1795 ,1794 ,1793 ,1792 ,1791 ,1791 ,1790 ,1789 , +1788 ,1787 ,1786 ,1786 ,1785 ,1784 ,1783 ,1782 ,1782 ,1781 ,1780 ,1779 ,1778 ,1778 ,1777 ,1776 , +1775 ,1774 ,1774 ,1773 ,1772 ,1771 ,1771 ,1770 ,1769 ,1768 ,1768 ,1767 ,1766 ,1765 ,1764 ,1764 , +1763 ,1762 ,1761 ,1761 ,1760 ,1759 ,1758 ,1758 ,1757 ,1756 ,1756 ,1755 ,1754 ,1753 ,1753 ,1752 , +1751 ,1750 ,1750 ,1749 ,1748 ,1748 ,1747 ,1746 ,1745 ,1745 ,1744 ,1743 ,1743 ,1742 ,1741 ,1740 , +1740 ,1739 ,1738 ,1738 ,1737 ,1736 ,1736 ,1735 ,1734 ,1734 ,1733 ,1732 ,1731 ,1731 ,1730 ,1729 , +1729 ,1728 ,1727 ,1727 ,1726 ,1725 ,1725 ,1724 ,1723 ,1723 ,1722 ,1721 ,1721 ,1720 ,1719 ,1719 , +1718 ,1717 ,1717 ,1716 ,1715 ,1715 ,1714 ,1713 ,1713 ,1712 ,1712 ,1711 ,1710 ,1710 ,1709 ,1708 , +1708 ,1707 ,1706 ,1706 ,1705 ,1705 ,1704 ,1703 ,1703 ,1702 ,1701 ,1701 ,1700 ,1699 ,1699 ,1698 , +1698 ,1697 ,1696 ,1696 ,1695 ,1694 ,1694 ,1693 ,1693 ,1692 ,1691 ,1691 ,1690 ,1690 ,1689 ,1688 , +1688 ,1687 ,1687 ,1686 ,1685 ,1685 ,1684 ,1684 ,1683 ,1682 ,1682 ,1681 ,1681 ,1680 ,1679 ,1679 , +1678 ,1678 ,1677 ,1676 ,1676 ,1675 ,1675 ,1674 ,1673 ,1673 ,1672 ,1672 ,1671 ,1671 ,1670 ,1669 , +1669 ,1668 ,1668 ,1667 ,1666 ,1666 ,1665 ,1665 ,1664 ,1664 ,1663 ,1662 ,1662 ,1661 ,1661 ,1660 , +1660 ,1659 ,1658 ,1658 ,1657 ,1657 ,1656 ,1656 ,1655 ,1655 ,1654 ,1653 ,1653 ,1652 ,1652 ,1651 , +1651 ,1650 ,1649 ,1649 ,1648 ,1648 ,1647 ,1647 ,1646 ,1646 ,1645 ,1645 ,1644 ,1643 ,1643 ,1642 , +1642 ,1641 ,1641 ,1640 ,1640 ,1639 ,1639 ,1638 ,1637 ,1637 ,1636 ,1636 ,1635 ,1635 ,1634 ,1634 , +1633 ,1633 ,1632 ,1632 ,1631 ,1630 ,1630 ,1629 ,1629 ,1628 ,1628 ,1627 ,1627 ,1626 ,1626 ,1625 , +1625 ,1624 ,1624 ,1623 ,1623 ,1622 ,1621 ,1621 ,1620 ,1620 ,1619 ,1619 ,1618 ,1618 ,1617 ,1617 , +1616 ,1616 ,1615 ,1615 ,1614 ,1614 ,1613 ,1613 ,1612 ,1612 ,1611 ,1611 ,1610 ,1610 ,1609 ,1609 , +1608 ,1608 ,1607 ,1607 ,1606 ,1605 ,1605 ,1604 ,1604 ,1603 ,1603 ,1602 ,1602 ,1601 ,1601 ,1600 , +1600 ,1599 ,1599 ,1598 ,1598 ,1597 ,1597 ,1596 ,1596 ,1595 ,1595 ,1594 ,1594 ,1593 ,1593 ,1592 , +1592 ,1591 ,1591 ,1590 ,1590 ,1589 ,1589 ,1589 ,1588 ,1588 ,1587 ,1587 ,1586 ,1586 ,1585 ,1585 , +1584 ,1584 ,1583 ,1583 ,1582 ,1582 ,1581 ,1581 ,1580 ,1580 ,1579 ,1579 ,1578 ,1578 ,1577 ,1577 , +1576 ,1576 ,1575 ,1575 ,1574 ,1574 ,1573 ,1573 ,1573 ,1572 ,1572 ,1571 ,1571 ,1570 ,1570 ,1569 , +1569 ,1568 ,1568 ,1567 ,1567 ,1566 ,1566 ,1565 ,1565 ,1564 ,1564 ,1563 ,1563 ,1563 ,1562 ,1562 , +1561 ,1561 ,1560 ,1560 ,1559 ,1559 ,1558 ,1558 ,1557 ,1557 ,1556 ,1556 ,1556 ,1555 ,1555 ,1554 , +1554 ,1553 ,1553 ,1552 ,1552 ,1551 ,1551 ,1550 ,1550 ,1550 ,1549 ,1549 ,1548 ,1548 ,1547 ,1547 , +1546 ,1546 ,1545 ,1545 ,1544 ,1544 ,1544 ,1543 ,1543 ,1542 ,1542 ,1541 ,1541 ,1540 ,1540 ,1539 , +1539 ,1539 ,1538 ,1538 ,1537 ,1537 ,1536 ,1536 ,1535 ,1535 ,1535 ,1534 ,1534 ,1533 ,1533 ,1532 , +1532 ,1531 ,1531 ,1530 ,1530 ,1530 ,1529 ,1529 ,1528 ,1528 ,1527 ,1527 ,1526 ,1526 ,1526 ,1525 , +1525 ,1524 ,1524 ,1523 ,1523 ,1523 ,1522 ,1522 ,1521 ,1521 ,1520 ,1520 ,1519 ,1519 ,1519 ,1518 , +1518 ,1517 ,1517 ,1516 ,1516 ,1515 ,1515 ,1515 ,1514 ,1514 ,1513 ,1513 ,1512 ,1512 ,1512 ,1511 , +1511 ,1510 ,1510 ,1509 ,1509 ,1509 ,1508 ,1508 ,1507 ,1507 ,1506 ,1506 ,1505 ,1505 ,1505 ,1504 , +1504 ,1503 ,1503 ,1502 ,1502 ,1502 ,1501 ,1501 ,1500 ,1500 ,1499 ,1499 ,1499 ,1498 ,1498 ,1497 , +1497 ,1497 ,1496 ,1496 ,1495 ,1495 ,1494 ,1494 ,1494 ,1493 ,1493 ,1492 ,1492 ,1491 ,1491 ,1491 , +1490 ,1490 ,1489 ,1489 ,1488 ,1488 ,1488 ,1487 ,1487 ,1486 ,1486 ,1486 ,1485 ,1485 ,1484 ,1484 , +1483 ,1483 ,1483 ,1482 ,1482 ,1481 ,1481 ,1481 ,1480 ,1480 ,1479 ,1479 ,1478 ,1478 ,1478 ,1477 , +1477 ,1476 ,1476 ,1476 ,1475 ,1475 ,1474 ,1474 ,1473 ,1473 ,1473 ,1472 ,1472 ,1471 ,1471 ,1471 , +1470 ,1470 ,1469 ,1469 ,1469 ,1468 ,1468 ,1467 ,1467 ,1466 ,1466 ,1466 ,1465 ,1465 ,1464 ,1464 , +1464 ,1463 ,1463 ,1462 ,1462 ,1462 ,1461 ,1461 ,1460 ,1460 ,1460 ,1459 ,1459 ,1458 ,1458 ,1458 , +1457 ,1457 ,1456 ,1456 ,1456 ,1455 ,1455 ,1454 ,1454 ,1453 ,1453 ,1453 ,1452 ,1452 ,1451 ,1451 , +1451 ,1450 ,1450 ,1449 ,1449 ,1449 ,1448 ,1448 ,1447 ,1447 ,1447 ,1446 ,1446 ,1445 ,1445 ,1445 , +1444 ,1444 ,1443 ,1443 ,1443 ,1442 ,1442 ,1441 ,1441 ,1441 ,1440 ,1440 ,1440 ,1439 ,1439 ,1438 , +1438 ,1438 ,1437 ,1437 ,1436 ,1436 ,1436 ,1435 ,1435 ,1434 ,1434 ,1434 ,1433 ,1433 ,1432 ,1432 , +1432 ,1431 ,1431 ,1430 ,1430 ,1430 ,1429 ,1429 ,1428 ,1428 ,1428 ,1427 ,1427 ,1427 ,1426 ,1426 , +1425 ,1425 ,1425 ,1424 ,1424 ,1423 ,1423 ,1423 ,1422 ,1422 ,1421 ,1421 ,1421 ,1420 ,1420 ,1420 , +1419 ,1419 ,1418 ,1418 ,1418 ,1417 ,1417 ,1416 ,1416 ,1416 ,1415 ,1415 ,1414 ,1414 ,1414 ,1413 , +1413 ,1413 ,1412 ,1412 ,1411 ,1411 ,1411 ,1410 ,1410 ,1409 ,1409 ,1409 ,1408 ,1408 ,1408 ,1407 , +1407 ,1406 ,1406 ,1406 ,1405 ,1405 ,1405 ,1404 ,1404 ,1403 ,1403 ,1403 ,1402 ,1402 ,1401 ,1401 , +1401 ,1400 ,1400 ,1400 ,1399 ,1399 ,1398 ,1398 ,1398 ,1397 ,1397 ,1397 ,1396 ,1396 ,1395 ,1395 , +1395 ,1394 ,1394 ,1394 ,1393 ,1393 ,1392 ,1392 ,1392 ,1391 ,1391 ,1390 ,1390 ,1390 ,1389 ,1389 , +1389 ,1388 ,1388 ,1387 ,1387 ,1387 ,1386 ,1386 ,1386 ,1385 ,1385 ,1384 ,1384 ,1384 ,1383 ,1383 , +1383 ,1382 ,1382 ,1381 ,1381 ,1381 ,1380 ,1380 ,1380 ,1379 ,1379 ,1379 ,1378 ,1378 ,1377 ,1377 , +1377 ,1376 ,1376 ,1376 ,1375 ,1375 ,1374 ,1374 ,1374 ,1373 ,1373 ,1373 ,1372 ,1372 ,1371 ,1371 , +1371 ,1370 ,1370 ,1370 ,1369 ,1369 ,1369 ,1368 ,1368 ,1367 ,1367 ,1367 ,1366 ,1366 ,1366 ,1365 , +1365 ,1364 ,1364 ,1364 ,1363 ,1363 ,1363 ,1362 ,1362 ,1362 ,1361 ,1361 ,1360 ,1360 ,1360 ,1359 , +1359 ,1359 ,1358 ,1358 ,1358 ,1357 ,1357 ,1356 ,1356 ,1356 ,1355 ,1355 ,1355 ,1354 ,1354 ,1353 , +1353 ,1353 ,1352 ,1352 ,1352 ,1351 ,1351 ,1351 ,1350 ,1350 ,1349 ,1349 ,1349 ,1348 ,1348 ,1348 , +1347 ,1347 ,1347 ,1346 ,1346 ,1346 ,1345 ,1345 ,1344 ,1344 ,1344 ,1343 ,1343 ,1343 ,1342 ,1342 , +1342 ,1341 ,1341 ,1340 ,1340 ,1340 ,1339 ,1339 ,1339 ,1338 ,1338 ,1338 ,1337 ,1337 ,1337 ,1336 , +1336 ,1335 ,1335 ,1335 ,1334 ,1334 ,1334 ,1333 ,1333 ,1333 ,1332 ,1332 ,1331 ,1331 ,1331 ,1330 , +1330 ,1330 ,1329 ,1329 ,1329 ,1328 ,1328 ,1328 ,1327 ,1327 ,1327 ,1326 ,1326 ,1325 ,1325 ,1325 , +1324 ,1324 ,1324 ,1323 ,1323 ,1323 ,1322 ,1322 ,1322 ,1321 ,1321 ,1320 ,1320 ,1320 ,1319 ,1319 , +1319 ,1318 ,1318 ,1318 ,1317 ,1317 ,1317 ,1316 ,1316 ,1316 ,1315 ,1315 ,1314 ,1314 ,1314 ,1313 , +1313 ,1313 ,1312 ,1312 ,1312 ,1311 ,1311 ,1311 ,1310 ,1310 ,1310 ,1309 ,1309 ,1308 ,1308 ,1308 , +1307 ,1307 ,1307 ,1306 ,1306 ,1306 ,1305 ,1305 ,1305 ,1304 ,1304 ,1304 ,1303 ,1303 ,1303 ,1302 , +1302 ,1301 ,1301 ,1301 ,1300 ,1300 ,1300 ,1299 ,1299 ,1299 ,1298 ,1298 ,1298 ,1297 ,1297 ,1297 , +1296 ,1296 ,1296 ,1295 ,1295 ,1294 ,1294 ,1294 ,1293 ,1293 ,1293 ,1292 ,1292 ,1292 ,1291 ,1291 , +1291 ,1290 ,1290 ,1290 ,1289 ,1289 ,1289 ,1288 ,1288 ,1288 ,1287 ,1287 ,1286 ,1286 ,1286 ,1285 , +1285 ,1285 ,1284 ,1284 ,1284 ,1283 ,1283 ,1283 ,1282 ,1282 ,1282 ,1281 ,1281 ,1281 ,1280 ,1280 , +1280 ,1279 ,1279 ,1279 ,1278 ,1278 ,1278 ,1277 ,1277 ,1276 ,1276 ,1276 ,1275 ,1275 ,1275 ,1274 , +1274 ,1274 ,1273 ,1273 ,1273 ,1272 ,1272 ,1272 ,1271 ,1271 ,1271 ,1270 ,1270 ,1270 ,1269 ,1269 , +1269 ,1268 ,1268 ,1268 ,1267 ,1267 ,1267 ,1266 ,1266 ,1266 ,1265 ,1265 ,1265 ,1264 ,1264 ,1263 , +1263 ,1263 ,1262 ,1262 ,1262 ,1261 ,1261 ,1261 ,1260 ,1260 ,1260 ,1259 ,1259 ,1259 ,1258 ,1258 , +1258 ,1257 ,1257 ,1257 ,1256 ,1256 ,1256 ,1255 ,1255 ,1255 ,1254 ,1254 ,1254 ,1253 ,1253 ,1253 , +1252 ,1252 ,1252 ,1251 ,1251 ,1251 ,1250 ,1250 ,1250 ,1249 ,1249 ,1249 ,1248 ,1248 ,1248 ,1247 , +1247 ,1247 ,1246 ,1246 ,1245 ,1245 ,1245 ,1244 ,1244 ,1244 ,1243 ,1243 ,1243 ,1242 ,1242 ,1242 , +1241 ,1241 ,1241 ,1240 ,1240 ,1240 ,1239 ,1239 ,1239 ,1238 ,1238 ,1238 ,1237 ,1237 ,1237 ,1236 , +1236 ,1236 ,1235 ,1235 ,1235 ,1234 ,1234 ,1234 ,1233 ,1233 ,1233 ,1232 ,1232 ,1232 ,1231 ,1231 , +1231 ,1230 ,1230 ,1230 ,1229 ,1229 ,1229 ,1228 ,1228 ,1228 ,1227 ,1227 ,1227 ,1226 ,1226 ,1226 , +1225 ,1225 ,1225 ,1224 ,1224 ,1224 ,1223 ,1223 ,1223 ,1222 ,1222 ,1222 ,1221 ,1221 ,1221 ,1220 , +1220 ,1220 ,1219 ,1219 ,1219 ,1218 ,1218 ,1218 ,1217 ,1217 ,1217 ,1216 ,1216 ,1216 ,1215 ,1215 , +1215 ,1214 ,1214 ,1214 ,1213 ,1213 ,1213 ,1212 ,1212 ,1212 ,1211 ,1211 ,1211 ,1210 ,1210 ,1210 , +1209 ,1209 ,1209 ,1208 ,1208 ,1208 ,1207 ,1207 ,1207 ,1206 ,1206 ,1206 ,1205 ,1205 ,1205 ,1204 , +1204 ,1204 ,1203 ,1203 ,1203 ,1202 ,1202 ,1202 ,1201 ,1201 ,1201 ,1200 ,1200 ,1200 ,1199 ,1199 , +1199 ,1198 ,1198 ,1198 ,1197 ,1197 ,1197 ,1196 ,1196 ,1196 ,1195 ,1195 ,1195 ,1194 ,1194 ,1194 , +1193 ,1193 ,1193 ,1192 ,1192 ,1192 ,1192 ,1191 ,1191 ,1191 ,1190 ,1190 ,1190 ,1189 ,1189 ,1189 , +1188 ,1188 ,1188 ,1187 ,1187 ,1187 ,1186 ,1186 ,1186 ,1185 ,1185 ,1185 ,1184 ,1184 ,1184 ,1183 , +1183 ,1183 ,1182 ,1182 ,1182 ,1181 ,1181 ,1181 ,1180 ,1180 ,1180 ,1179 ,1179 ,1179 ,1178 ,1178 , +1178 ,1177 ,1177 ,1177 ,1176 ,1176 ,1176 ,1175 ,1175 ,1175 ,1174 ,1174 ,1174 ,1173 ,1173 ,1173 , +1172 ,1172 ,1172 ,1172 ,1171 ,1171 ,1171 ,1170 ,1170 ,1170 ,1169 ,1169 ,1169 ,1168 ,1168 ,1168 , +1167 ,1167 ,1167 ,1166 ,1166 ,1166 ,1165 ,1165 ,1165 ,1164 ,1164 ,1164 ,1163 ,1163 ,1163 ,1162 , +1162 ,1162 ,1161 ,1161 ,1161 ,1160 ,1160 ,1160 ,1159 ,1159 ,1159 ,1158 ,1158 ,1158 ,1157 ,1157 , +1157 ,1157 ,1156 ,1156 ,1156 ,1155 ,1155 ,1155 ,1154 ,1154 ,1154 ,1153 ,1153 ,1153 ,1152 ,1152 , +1152 ,1151 ,1151 ,1151 ,1150 ,1150 ,1150 ,1149 ,1149 ,1149 ,1148 ,1148 ,1148 ,1147 ,1147 ,1147 , +1146 ,1146 ,1146 ,1145 ,1145 ,1145 ,1145 ,1144 ,1144 ,1144 ,1143 ,1143 ,1143 ,1142 ,1142 ,1142 , +1141 ,1141 ,1141 ,1140 ,1140 ,1140 ,1139 ,1139 ,1139 ,1138 ,1138 ,1138 ,1137 ,1137 ,1137 ,1136 , +1136 ,1136 ,1135 ,1135 ,1135 ,1134 ,1134 ,1134 ,1134 ,1133 ,1133 ,1133 ,1132 ,1132 ,1132 ,1131 , +1131 ,1131 ,1130 ,1130 ,1130 ,1129 ,1129 ,1129 ,1128 ,1128 ,1128 ,1127 ,1127 ,1127 ,1126 ,1126 , +1126 ,1125 ,1125 ,1125 ,1124 ,1124 ,1124 ,1124 ,1123 ,1123 ,1123 ,1122 ,1122 ,1122 ,1121 ,1121 , +1121 ,1120 ,1120 ,1120 ,1119 ,1119 ,1119 ,1118 ,1118 ,1118 ,1117 ,1117 ,1117 ,1116 ,1116 ,1116 , +1115 ,1115 ,1115 ,1115 ,1114 ,1114 ,1114 ,1113 ,1113 ,1113 ,1112 ,1112 ,1112 ,1111 ,1111 ,1111 , +1110 ,1110 ,1110 ,1109 ,1109 ,1109 ,1108 ,1108 ,1108 ,1107 ,1107 ,1107 ,1106 ,1106 ,1106 ,1106 , +1105 ,1105 ,1105 ,1104 ,1104 ,1104 ,1103 ,1103 ,1103 ,1102 ,1102 ,1102 ,1101 ,1101 ,1101 ,1100 , +1100 ,1100 ,1099 ,1099 ,1099 ,1098 ,1098 ,1098 ,1098 ,1097 ,1097 ,1097 ,1096 ,1096 ,1096 ,1095 , +1095 ,1095 ,1094 ,1094 ,1094 ,1093 ,1093 ,1093 ,1092 ,1092 ,1092 ,1091 ,1091 ,1091 ,1090 ,1090 , +1090 ,1090 ,1089 ,1089 ,1089 ,1088 ,1088 ,1088 ,1087 ,1087 ,1087 ,1086 ,1086 ,1086 ,1085 ,1085 , +1085 ,1084 ,1084 ,1084 ,1083 ,1083 ,1083 ,1082 ,1082 ,1082 ,1082 ,1081 ,1081 ,1081 ,1080 ,1080 , +1080 ,1079 ,1079 ,1079 ,1078 ,1078 ,1078 ,1077 ,1077 ,1077 ,1076 ,1076 ,1076 ,1075 ,1075 ,1075 , +1074 ,1074 ,1074 ,1074 ,1073 ,1073 ,1073 ,1072 ,1072 ,1072 ,1071 ,1071 ,1071 ,1070 ,1070 ,1070 , +1069 ,1069 ,1069 ,1068 ,1068 ,1068 ,1067 ,1067 ,1067 ,1067 ,1066 ,1066 ,1066 ,1065 ,1065 ,1065 , +1064 ,1064 ,1064 ,1063 ,1063 ,1063 ,1062 ,1062 ,1062 ,1061 ,1061 ,1061 ,1060 ,1060 ,1060 ,1059 , +1059 ,1059 ,1059 ,1058 ,1058 ,1058 ,1057 ,1057 ,1057 ,1056 ,1056 ,1056 ,1055 ,1055 ,1055 ,1054 , +1054 ,1054 ,1053 ,1053 ,1053 ,1052 ,1052 ,1052 ,1052 ,1051 ,1051 ,1051 ,1050 ,1050 ,1050 ,1049 , +1049 ,1049 ,1048 ,1048 ,1048 ,1047 ,1047 ,1047 ,1046 ,1046 ,1046 ,1045 ,1045 ,1045 ,1045 ,1044 , +1044 ,1044 ,1043 ,1043 ,1043 ,1042 ,1042 ,1042 ,1041 ,1041 ,1041 ,1040 ,1040 ,1040 ,1039 ,1039 , +1039 ,1038 ,1038 ,1038 ,1038 ,1037 ,1037 ,1037 ,1036 ,1036 ,1036 ,1035 ,1035 ,1035 ,1034 ,1034 , +1034 ,1033 ,1033 ,1033 ,1032 ,1032 ,1032 ,1031 ,1031 ,1031 ,1031 ,1030 ,1030 ,1030 ,1029 ,1029 , +1029 ,1028 ,1028 ,1028 ,1027 ,1027 ,1027 ,1026 ,1026 ,1026 ,1025 ,1025 ,1025 ,1024 ,1024 ,1024 , +1023 ,1023 ,1023 ,1023 ,1022 ,1022 ,1022 ,1021 ,1021 ,1021 ,1020 ,1020 ,1020 ,1019 ,1019 ,1019 , +1018 ,1018 ,1018 ,1017 ,1017 ,1017 ,1016 ,1016 ,1016 ,1016 ,1015 ,1015 ,1015 ,1014 ,1014 ,1014 , +1013 ,1013 ,1013 ,1012 ,1012 ,1012 ,1011 ,1011 ,1011 ,1010 ,1010 ,1010 ,1009 ,1009 ,1009 ,1009 , +1008 ,1008 ,1008 ,1007 ,1007 ,1007 ,1006 ,1006 ,1006 ,1005 ,1005 ,1005 ,1004 ,1004 ,1004 ,1003 , +1003 ,1003 ,1002 ,1002 ,1002 ,1002 ,1001 ,1001 ,1001 ,1000 ,1000 ,1000 ,999 ,999 ,999 ,998 , +998 ,998 ,997 ,997 ,997 ,996 ,996 ,996 ,995 ,995 ,995 ,995 ,994 ,994 ,994 ,993 , +993 ,993 ,992 ,992 ,992 ,991 ,991 ,991 ,990 ,990 ,990 ,989 ,989 ,989 ,988 ,988 , +988 ,988 ,987 ,987 ,987 ,986 ,986 ,986 ,985 ,985 ,985 ,984 ,984 ,984 ,983 ,983 , +983 ,982 ,982 ,982 ,981 ,981 ,981 ,980 ,980 ,980 ,980 ,979 ,979 ,979 ,978 ,978 , +978 ,977 ,977 ,977 ,976 ,976 ,976 ,975 ,975 ,975 ,974 ,974 ,974 ,973 ,973 ,973 , +973 ,972 ,972 ,972 ,971 ,971 ,971 ,970 ,970 ,970 ,969 ,969 ,969 ,968 ,968 ,968 , +967 ,967 ,967 ,966 ,966 ,966 ,965 ,965 ,965 ,965 ,964 ,964 ,964 ,963 ,963 ,963 , +962 ,962 ,962 ,961 ,961 ,961 ,960 ,960 ,960 ,959 ,959 ,959 ,958 ,958 ,958 ,957 , +957 ,957 ,957 ,956 ,956 ,956 ,955 ,955 ,955 ,954 ,954 ,954 ,953 ,953 ,953 ,952 , +952 ,952 ,951 ,951 ,951 ,950 ,950 ,950 ,949 ,949 ,949 ,949 ,948 ,948 ,948 ,947 , +947 ,947 ,946 ,946 ,946 ,945 ,945 ,945 ,944 ,944 ,944 ,943 ,943 ,943 ,942 ,942 , +942 ,941 ,941 ,941 ,941 ,940 ,940 ,940 ,939 ,939 ,939 ,938 ,938 ,938 ,937 ,937 , +937 ,936 ,936 ,936 ,935 ,935 ,935 ,934 ,934 ,934 ,933 ,933 ,933 ,932 ,932 ,932 , +932 ,931 ,931 ,931 ,930 ,930 ,930 ,929 ,929 ,929 ,928 ,928 ,928 ,927 ,927 ,927 , +926 ,926 ,926 ,925 ,925 ,925 ,924 ,924 ,924 ,923 ,923 ,923 ,923 ,922 ,922 ,922 , +921 ,921 ,921 ,920 ,920 ,920 ,919 ,919 ,919 ,918 ,918 ,918 ,917 ,917 ,917 ,916 , +916 ,916 ,915 ,915 ,915 ,914 ,914 ,914 ,913 ,913 ,913 ,913 ,912 ,912 ,912 ,911 , +911 ,911 ,910 ,910 ,910 ,909 ,909 ,909 ,908 ,908 ,908 ,907 ,907 ,907 ,906 ,906 , +906 ,905 ,905 ,905 ,904 ,904 ,904 ,903 ,903 ,903 ,902 ,902 ,902 ,902 ,901 ,901 , +901 ,900 ,900 ,900 ,899 ,899 ,899 ,898 ,898 ,898 ,897 ,897 ,897 ,896 ,896 ,896 , +895 ,895 ,895 ,894 ,894 ,894 ,893 ,893 ,893 ,892 ,892 ,892 ,891 ,891 ,891 ,890 , +890 ,890 ,890 ,889 ,889 ,889 ,888 ,888 ,888 ,887 ,887 ,887 ,886 ,886 ,886 ,885 , +885 ,885 ,884 ,884 ,884 ,883 ,883 ,883 ,882 ,882 ,882 ,881 ,881 ,881 ,880 ,880 , +880 ,879 ,879 ,879 ,878 ,878 ,878 ,877 ,877 ,877 ,876 ,876 ,876 ,875 ,875 ,875 , +875 ,874 ,874 ,874 ,873 ,873 ,873 ,872 ,872 ,872 ,871 ,871 ,871 ,870 ,870 ,870 , +869 ,869 ,869 ,868 ,868 ,868 ,867 ,867 ,867 ,866 ,866 ,866 ,865 ,865 ,865 ,864 , +864 ,864 ,863 ,863 ,863 ,862 ,862 ,862 ,861 ,861 ,861 ,860 ,860 ,860 ,859 ,859 , +859 ,858 ,858 ,858 ,857 ,857 ,857 ,856 ,856 ,856 ,855 ,855 ,855 ,855 ,854 ,854 , +854 ,853 ,853 ,853 ,852 ,852 ,852 ,851 ,851 ,851 ,850 ,850 ,850 ,849 ,849 ,849 , +848 ,848 ,848 ,847 ,847 ,847 ,846 ,846 ,846 ,845 ,845 ,845 ,844 ,844 ,844 ,843 , +843 ,843 ,842 ,842 ,842 ,841 ,841 ,841 ,840 ,840 ,840 ,839 ,839 ,839 ,838 ,838 , +838 ,837 ,837 ,837 ,836 ,836 ,836 ,835 ,835 ,835 ,834 ,834 ,834 ,833 ,833 ,833 , +832 ,832 ,832 ,831 ,831 ,831 ,830 ,830 ,830 ,829 ,829 ,829 ,828 ,828 ,828 ,827 , +827 ,827 ,826 ,826 ,826 ,825 ,825 ,825 ,824 ,824 ,824 ,823 ,823 ,823 ,822 ,822 , +822 ,821 ,821 ,821 ,820 ,820 ,820 ,819 ,819 ,819 ,818 ,818 ,818 ,817 ,817 ,817 , +816 ,816 ,816 ,815 ,815 ,815 ,814 ,814 ,814 ,813 ,813 ,813 ,812 ,812 ,812 ,811 , +811 ,811 ,810 ,810 ,810 ,809 ,809 ,809 ,808 ,808 ,808 ,807 ,807 ,807 ,806 ,806 , +806 ,805 ,805 ,805 ,804 ,804 ,804 ,803 ,803 ,803 ,802 ,802 ,802 ,801 ,801 ,800 , +800 ,800 ,799 ,799 ,799 ,798 ,798 ,798 ,797 ,797 ,797 ,796 ,796 ,796 ,795 ,795 , +795 ,794 ,794 ,794 ,793 ,793 ,793 ,792 ,792 ,792 ,791 ,791 ,791 ,790 ,790 ,790 , +789 ,789 ,789 ,788 ,788 ,788 ,787 ,787 ,787 ,786 ,786 ,786 ,785 ,785 ,785 ,784 , +784 ,784 ,783 ,783 ,782 ,782 ,782 ,781 ,781 ,781 ,780 ,780 ,780 ,779 ,779 ,779 , +778 ,778 ,778 ,777 ,777 ,777 ,776 ,776 ,776 ,775 ,775 ,775 ,774 ,774 ,774 ,773 , +773 ,773 ,772 ,772 ,772 ,771 ,771 ,771 ,770 ,770 ,769 ,769 ,769 ,768 ,768 ,768 , +767 ,767 ,767 ,766 ,766 ,766 ,765 ,765 ,765 ,764 ,764 ,764 ,763 ,763 ,763 ,762 , +762 ,762 ,761 ,761 ,761 ,760 ,760 ,759 ,759 ,759 ,758 ,758 ,758 ,757 ,757 ,757 , +756 ,756 ,756 ,755 ,755 ,755 ,754 ,754 ,754 ,753 ,753 ,753 ,752 ,752 ,751 ,751 , +751 ,750 ,750 ,750 ,749 ,749 ,749 ,748 ,748 ,748 ,747 ,747 ,747 ,746 ,746 ,746 , +745 ,745 ,744 ,744 ,744 ,743 ,743 ,743 ,742 ,742 ,742 ,741 ,741 ,741 ,740 ,740 , +740 ,739 ,739 ,739 ,738 ,738 ,737 ,737 ,737 ,736 ,736 ,736 ,735 ,735 ,735 ,734 , +734 ,734 ,733 ,733 ,733 ,732 ,732 ,731 ,731 ,731 ,730 ,730 ,730 ,729 ,729 ,729 , +728 ,728 ,728 ,727 ,727 ,727 ,726 ,726 ,725 ,725 ,725 ,724 ,724 ,724 ,723 ,723 , +723 ,722 ,722 ,722 ,721 ,721 ,720 ,720 ,720 ,719 ,719 ,719 ,718 ,718 ,718 ,717 , +717 ,717 ,716 ,716 ,716 ,715 ,715 ,714 ,714 ,714 ,713 ,713 ,713 ,712 ,712 ,712 , +711 ,711 ,710 ,710 ,710 ,709 ,709 ,709 ,708 ,708 ,708 ,707 ,707 ,707 ,706 ,706 , +705 ,705 ,705 ,704 ,704 ,704 ,703 ,703 ,703 ,702 ,702 ,701 ,701 ,701 ,700 ,700 , +700 ,699 ,699 ,699 ,698 ,698 ,698 ,697 ,697 ,696 ,696 ,696 ,695 ,695 ,695 ,694 , +694 ,694 ,693 ,693 ,692 ,692 ,692 ,691 ,691 ,691 ,690 ,690 ,689 ,689 ,689 ,688 , +688 ,688 ,687 ,687 ,687 ,686 ,686 ,685 ,685 ,685 ,684 ,684 ,684 ,683 ,683 ,683 , +682 ,682 ,681 ,681 ,681 ,680 ,680 ,680 ,679 ,679 ,678 ,678 ,678 ,677 ,677 ,677 , +676 ,676 ,676 ,675 ,675 ,674 ,674 ,674 ,673 ,673 ,673 ,672 ,672 ,671 ,671 ,671 , +670 ,670 ,670 ,669 ,669 ,668 ,668 ,668 ,667 ,667 ,667 ,666 ,666 ,666 ,665 ,665 , +664 ,664 ,664 ,663 ,663 ,663 ,662 ,662 ,661 ,661 ,661 ,660 ,660 ,660 ,659 ,659 , +658 ,658 ,658 ,657 ,657 ,657 ,656 ,656 ,655 ,655 ,655 ,654 ,654 ,653 ,653 ,653 , +652 ,652 ,652 ,651 ,651 ,650 ,650 ,650 ,649 ,649 ,649 ,648 ,648 ,647 ,647 ,647 , +646 ,646 ,646 ,645 ,645 ,644 ,644 ,644 ,643 ,643 ,642 ,642 ,642 ,641 ,641 ,641 , +640 ,640 ,639 ,639 ,639 ,638 ,638 ,638 ,637 ,637 ,636 ,636 ,636 ,635 ,635 ,634 , +634 ,634 ,633 ,633 ,633 ,632 ,632 ,631 ,631 ,631 ,630 ,630 ,629 ,629 ,629 ,628 , +628 ,627 ,627 ,627 ,626 ,626 ,626 ,625 ,625 ,624 ,624 ,624 ,623 ,623 ,622 ,622 , +622 ,621 ,621 ,620 ,620 ,620 ,619 ,619 ,619 ,618 ,618 ,617 ,617 ,617 ,616 ,616 , +615 ,615 ,615 ,614 ,614 ,613 ,613 ,613 ,612 ,612 ,611 ,611 ,611 ,610 ,610 ,609 , +609 ,609 ,608 ,608 ,607 ,607 ,607 ,606 ,606 ,606 ,605 ,605 ,604 ,604 ,604 ,603 , +603 ,602 ,602 ,602 ,601 ,601 ,600 ,600 ,600 ,599 ,599 ,598 ,598 ,598 ,597 ,597 , +596 ,596 ,596 ,595 ,595 ,594 ,594 ,594 ,593 ,593 ,592 ,592 ,591 ,591 ,591 ,590 , +590 ,589 ,589 ,589 ,588 ,588 ,587 ,587 ,587 ,586 ,586 ,585 ,585 ,585 ,584 ,584 , +583 ,583 ,583 ,582 ,582 ,581 ,581 ,581 ,580 ,580 ,579 ,579 ,578 ,578 ,578 ,577 , +577 ,576 ,576 ,576 ,575 ,575 ,574 ,574 ,574 ,573 ,573 ,572 ,572 ,571 ,571 ,571 , +570 ,570 ,569 ,569 ,569 ,568 ,568 ,567 ,567 ,566 ,566 ,566 ,565 ,565 ,564 ,564 , +564 ,563 ,563 ,562 ,562 ,561 ,561 ,561 ,560 ,560 ,559 ,559 ,559 ,558 ,558 ,557 , +557 ,556 ,556 ,556 ,555 ,555 ,554 ,554 ,553 ,553 ,553 ,552 ,552 ,551 ,551 ,550 , +550 ,550 ,549 ,549 ,548 ,548 ,548 ,547 ,547 ,546 ,546 ,545 ,545 ,545 ,544 ,544 , +543 ,543 ,542 ,542 ,542 ,541 ,541 ,540 ,540 ,539 ,539 ,538 ,538 ,538 ,537 ,537 , +536 ,536 ,535 ,535 ,535 ,534 ,534 ,533 ,533 ,532 ,532 ,532 ,531 ,531 ,530 ,530 , +529 ,529 ,528 ,528 ,528 ,527 ,527 ,526 ,526 ,525 ,525 ,524 ,524 ,524 ,523 ,523 , +522 ,522 ,521 ,521 ,521 ,520 ,520 ,519 ,519 ,518 ,518 ,517 ,517 ,517 ,516 ,516 , +515 ,515 ,514 ,514 ,513 ,513 ,512 ,512 ,512 ,511 ,511 ,510 ,510 ,509 ,509 ,508 , +508 ,508 ,507 ,507 ,506 ,506 ,505 ,505 ,504 ,504 ,503 ,503 ,503 ,502 ,502 ,501 , +501 ,500 ,500 ,499 ,499 ,498 ,498 ,497 ,497 ,497 ,496 ,496 ,495 ,495 ,494 ,494 , +493 ,493 ,492 ,492 ,491 ,491 ,491 ,490 ,490 ,489 ,489 ,488 ,488 ,487 ,487 ,486 , +486 ,485 ,485 ,484 ,484 ,484 ,483 ,483 ,482 ,482 ,481 ,481 ,480 ,480 ,479 ,479 , +478 ,478 ,477 ,477 ,476 ,476 ,475 ,475 ,474 ,474 ,474 ,473 ,473 ,472 ,472 ,471 , +471 ,470 ,470 ,469 ,469 ,468 ,468 ,467 ,467 ,466 ,466 ,465 ,465 ,464 ,464 ,463 , +463 ,462 ,462 ,461 ,461 ,460 ,460 ,459 ,459 ,458 ,458 ,458 ,457 ,457 ,456 ,456 , +455 ,455 ,454 ,454 ,453 ,453 ,452 ,452 ,451 ,451 ,450 ,450 ,449 ,449 ,448 ,448 , +447 ,447 ,446 ,446 ,445 ,445 ,444 ,444 ,443 ,443 ,442 ,442 ,441 ,440 ,440 ,439 , +439 ,438 ,438 ,437 ,437 ,436 ,436 ,435 ,435 ,434 ,434 ,433 ,433 ,432 ,432 ,431 , +431 ,430 ,430 ,429 ,429 ,428 ,428 ,427 ,427 ,426 ,426 ,425 ,424 ,424 ,423 ,423 , +422 ,422 ,421 ,421 ,420 ,420 ,419 ,419 ,418 ,418 ,417 ,417 ,416 ,415 ,415 ,414 , +414 ,413 ,413 ,412 ,412 ,411 ,411 ,410 ,410 ,409 ,408 ,408 ,407 ,407 ,406 ,406 , +405 ,405 ,404 ,404 ,403 ,402 ,402 ,401 ,401 ,400 ,400 ,399 ,399 ,398 ,398 ,397 , +396 ,396 ,395 ,395 ,394 ,394 ,393 ,392 ,392 ,391 ,391 ,390 ,390 ,389 ,389 ,388 , +387 ,387 ,386 ,386 ,385 ,385 ,384 ,383 ,383 ,382 ,382 ,381 ,381 ,380 ,379 ,379 , +378 ,378 ,377 ,376 ,376 ,375 ,375 ,374 ,374 ,373 ,372 ,372 ,371 ,371 ,370 ,369 , +369 ,368 ,368 ,367 ,366 ,366 ,365 ,365 ,364 ,363 ,363 ,362 ,362 ,361 ,360 ,360 , +359 ,359 ,358 ,357 ,357 ,356 ,356 ,355 ,354 ,354 ,353 ,353 ,352 ,351 ,351 ,350 , +349 ,349 ,348 ,348 ,347 ,346 ,346 ,345 ,344 ,344 ,343 ,342 ,342 ,341 ,341 ,340 , +339 ,339 ,338 ,337 ,337 ,336 ,335 ,335 ,334 ,334 ,333 ,332 ,332 ,331 ,330 ,330 , +329 ,328 ,328 ,327 ,326 ,326 ,325 ,324 ,324 ,323 ,322 ,322 ,321 ,320 ,320 ,319 , +318 ,318 ,317 ,316 ,316 ,315 ,314 ,313 ,313 ,312 ,311 ,311 ,310 ,309 ,309 ,308 , +307 ,307 ,306 ,305 ,304 ,304 ,303 ,302 ,302 ,301 ,300 ,299 ,299 ,298 ,297 ,297 , +296 ,295 ,294 ,294 ,293 ,292 ,291 ,291 ,290 ,289 ,289 ,288 ,287 ,286 ,286 ,285 , +284 ,283 ,283 ,282 ,281 ,280 ,279 ,279 ,278 ,277 ,276 ,276 ,275 ,274 ,273 ,273 , +272 ,271 ,270 ,269 ,269 ,268 ,267 ,266 ,265 ,265 ,264 ,263 ,262 ,261 ,261 ,260 , +259 ,258 ,257 ,256 ,256 ,255 ,254 ,253 ,252 ,251 ,251 ,250 ,249 ,248 ,247 ,246 , +245 ,245 ,244 ,243 ,242 ,241 ,240 ,239 ,238 ,238 ,237 ,236 ,235 ,234 ,233 ,232 , +231 ,230 ,229 ,228 ,228 ,227 ,226 ,225 ,224 ,223 ,222 ,221 ,220 ,219 ,218 ,217 , +216 ,215 ,214 ,213 ,212 ,211 ,210 ,209 ,208 ,207 ,206 ,205 ,204 ,203 ,202 ,201 , +200 ,199 ,198 ,197 ,196 ,195 ,193 ,192 ,191 ,190 ,189 ,188 ,187 ,186 ,185 ,183 , +182 ,181 ,180 ,179 ,178 ,176 ,175 ,174 ,173 ,172 ,170 ,169 ,168 ,167 ,165 ,164 , +163 ,162 ,160 ,159 ,158 ,156 ,155 ,154 ,152 ,151 ,150 ,148 ,147 ,145 ,144 ,142 , +141 ,139 ,138 ,136 ,135 ,133 ,132 ,130 ,129 ,127 ,125 ,124 ,122 ,120 ,118 ,117 , +115 ,113 ,111 ,109 ,107 ,105 ,103 ,101 ,99 ,97 ,95 ,93 ,91 ,88 ,86 ,84 , +81 ,78 ,76 ,73 ,70 ,67 ,64 ,61 ,57 ,53 ,49 ,45 ,40 ,35 ,28 ,20 , +0 }; + + +s16 SinTable[1024] = { +0 ,6 ,12 ,18 ,25 ,31 ,37 ,43 ,50 ,56 ,62 ,69 ,75 ,81 ,87 ,94 , +100 ,106 ,113 ,119 ,125 ,131 ,138 ,144 ,150 ,157 ,163 ,169 ,175 ,182 ,188 ,194 , +200 ,207 ,213 ,219 ,226 ,232 ,238 ,244 ,251 ,257 ,263 ,269 ,276 ,282 ,288 ,295 , +301 ,307 ,313 ,320 ,326 ,332 ,338 ,345 ,351 ,357 ,363 ,370 ,376 ,382 ,388 ,395 , +401 ,407 ,413 ,420 ,426 ,432 ,438 ,445 ,451 ,457 ,463 ,470 ,476 ,482 ,488 ,495 , +501 ,507 ,513 ,520 ,526 ,532 ,538 ,545 ,551 ,557 ,563 ,569 ,576 ,582 ,588 ,594 , +601 ,607 ,613 ,619 ,625 ,632 ,638 ,644 ,650 ,656 ,663 ,669 ,675 ,681 ,687 ,694 , +700 ,706 ,712 ,718 ,725 ,731 ,737 ,743 ,749 ,755 ,762 ,768 ,774 ,780 ,786 ,792 , +799 ,805 ,811 ,817 ,823 ,829 ,836 ,842 ,848 ,854 ,860 ,866 ,872 ,879 ,885 ,891 , +897 ,903 ,909 ,915 ,921 ,928 ,934 ,940 ,946 ,952 ,958 ,964 ,970 ,976 ,983 ,989 , +995 ,1001 ,1007 ,1013 ,1019 ,1025 ,1031 ,1037 ,1043 ,1050 ,1056 ,1062 ,1068 ,1074 ,1080 ,1086 , +1092 ,1098 ,1104 ,1110 ,1116 ,1122 ,1128 ,1134 ,1140 ,1146 ,1152 ,1158 ,1164 ,1170 ,1176 ,1182 , +1189 ,1195 ,1201 ,1207 ,1213 ,1219 ,1225 ,1231 ,1237 ,1243 ,1248 ,1254 ,1260 ,1266 ,1272 ,1278 , +1284 ,1290 ,1296 ,1302 ,1308 ,1314 ,1320 ,1326 ,1332 ,1338 ,1344 ,1350 ,1356 ,1362 ,1368 ,1373 , +1379 ,1385 ,1391 ,1397 ,1403 ,1409 ,1415 ,1421 ,1427 ,1433 ,1438 ,1444 ,1450 ,1456 ,1462 ,1468 , +1474 ,1479 ,1485 ,1491 ,1497 ,1503 ,1509 ,1515 ,1520 ,1526 ,1532 ,1538 ,1544 ,1550 ,1555 ,1561 , +1567 ,1573 ,1579 ,1584 ,1590 ,1596 ,1602 ,1608 ,1613 ,1619 ,1625 ,1631 ,1636 ,1642 ,1648 ,1654 , +1659 ,1665 ,1671 ,1677 ,1682 ,1688 ,1694 ,1699 ,1705 ,1711 ,1717 ,1722 ,1728 ,1734 ,1739 ,1745 , +1751 ,1756 ,1762 ,1768 ,1773 ,1779 ,1785 ,1790 ,1796 ,1802 ,1807 ,1813 ,1819 ,1824 ,1830 ,1835 , +1841 ,1847 ,1852 ,1858 ,1864 ,1869 ,1875 ,1880 ,1886 ,1891 ,1897 ,1903 ,1908 ,1914 ,1919 ,1925 , +1930 ,1936 ,1941 ,1947 ,1952 ,1958 ,1964 ,1969 ,1975 ,1980 ,1986 ,1991 ,1997 ,2002 ,2007 ,2013 , +2018 ,2024 ,2029 ,2035 ,2040 ,2046 ,2051 ,2057 ,2062 ,2067 ,2073 ,2078 ,2084 ,2089 ,2094 ,2100 , +2105 ,2111 ,2116 ,2121 ,2127 ,2132 ,2138 ,2143 ,2148 ,2154 ,2159 ,2164 ,2170 ,2175 ,2180 ,2186 , +2191 ,2196 ,2201 ,2207 ,2212 ,2217 ,2223 ,2228 ,2233 ,2238 ,2244 ,2249 ,2254 ,2259 ,2265 ,2270 , +2275 ,2280 ,2286 ,2291 ,2296 ,2301 ,2306 ,2312 ,2317 ,2322 ,2327 ,2332 ,2337 ,2343 ,2348 ,2353 , +2358 ,2363 ,2368 ,2373 ,2379 ,2384 ,2389 ,2394 ,2399 ,2404 ,2409 ,2414 ,2419 ,2424 ,2429 ,2434 , +2439 ,2445 ,2450 ,2455 ,2460 ,2465 ,2470 ,2475 ,2480 ,2485 ,2490 ,2495 ,2500 ,2505 ,2510 ,2515 , +2519 ,2524 ,2529 ,2534 ,2539 ,2544 ,2549 ,2554 ,2559 ,2564 ,2569 ,2574 ,2578 ,2583 ,2588 ,2593 , +2598 ,2603 ,2608 ,2613 ,2617 ,2622 ,2627 ,2632 ,2637 ,2641 ,2646 ,2651 ,2656 ,2661 ,2665 ,2670 , +2675 ,2680 ,2684 ,2689 ,2694 ,2699 ,2703 ,2708 ,2713 ,2717 ,2722 ,2727 ,2732 ,2736 ,2741 ,2746 , +2750 ,2755 ,2760 ,2764 ,2769 ,2773 ,2778 ,2783 ,2787 ,2792 ,2796 ,2801 ,2806 ,2810 ,2815 ,2819 , +2824 ,2828 ,2833 ,2837 ,2842 ,2847 ,2851 ,2856 ,2860 ,2865 ,2869 ,2874 ,2878 ,2882 ,2887 ,2891 , +2896 ,2900 ,2905 ,2909 ,2914 ,2918 ,2922 ,2927 ,2931 ,2936 ,2940 ,2944 ,2949 ,2953 ,2957 ,2962 , +2966 ,2970 ,2975 ,2979 ,2983 ,2988 ,2992 ,2996 ,3000 ,3005 ,3009 ,3013 ,3018 ,3022 ,3026 ,3030 , +3034 ,3039 ,3043 ,3047 ,3051 ,3055 ,3060 ,3064 ,3068 ,3072 ,3076 ,3080 ,3085 ,3089 ,3093 ,3097 , +3101 ,3105 ,3109 ,3113 ,3117 ,3121 ,3126 ,3130 ,3134 ,3138 ,3142 ,3146 ,3150 ,3154 ,3158 ,3162 , +3166 ,3170 ,3174 ,3178 ,3182 ,3186 ,3190 ,3193 ,3197 ,3201 ,3205 ,3209 ,3213 ,3217 ,3221 ,3225 , +3229 ,3232 ,3236 ,3240 ,3244 ,3248 ,3252 ,3255 ,3259 ,3263 ,3267 ,3271 ,3274 ,3278 ,3282 ,3286 , +3289 ,3293 ,3297 ,3301 ,3304 ,3308 ,3312 ,3315 ,3319 ,3323 ,3326 ,3330 ,3334 ,3337 ,3341 ,3345 , +3348 ,3352 ,3356 ,3359 ,3363 ,3366 ,3370 ,3373 ,3377 ,3381 ,3384 ,3388 ,3391 ,3395 ,3398 ,3402 , +3405 ,3409 ,3412 ,3416 ,3419 ,3423 ,3426 ,3429 ,3433 ,3436 ,3440 ,3443 ,3447 ,3450 ,3453 ,3457 , +3460 ,3463 ,3467 ,3470 ,3473 ,3477 ,3480 ,3483 ,3487 ,3490 ,3493 ,3497 ,3500 ,3503 ,3506 ,3510 , +3513 ,3516 ,3519 ,3522 ,3526 ,3529 ,3532 ,3535 ,3538 ,3541 ,3545 ,3548 ,3551 ,3554 ,3557 ,3560 , +3563 ,3566 ,3570 ,3573 ,3576 ,3579 ,3582 ,3585 ,3588 ,3591 ,3594 ,3597 ,3600 ,3603 ,3606 ,3609 , +3612 ,3615 ,3618 ,3621 ,3624 ,3627 ,3629 ,3632 ,3635 ,3638 ,3641 ,3644 ,3647 ,3650 ,3652 ,3655 , +3658 ,3661 ,3664 ,3667 ,3669 ,3672 ,3675 ,3678 ,3680 ,3683 ,3686 ,3689 ,3691 ,3694 ,3697 ,3700 , +3702 ,3705 ,3708 ,3710 ,3713 ,3716 ,3718 ,3721 ,3723 ,3726 ,3729 ,3731 ,3734 ,3736 ,3739 ,3742 , +3744 ,3747 ,3749 ,3752 ,3754 ,3757 ,3759 ,3762 ,3764 ,3767 ,3769 ,3772 ,3774 ,3776 ,3779 ,3781 , +3784 ,3786 ,3789 ,3791 ,3793 ,3796 ,3798 ,3800 ,3803 ,3805 ,3807 ,3810 ,3812 ,3814 ,3816 ,3819 , +3821 ,3823 ,3826 ,3828 ,3830 ,3832 ,3834 ,3837 ,3839 ,3841 ,3843 ,3845 ,3848 ,3850 ,3852 ,3854 , +3856 ,3858 ,3860 ,3862 ,3864 ,3867 ,3869 ,3871 ,3873 ,3875 ,3877 ,3879 ,3881 ,3883 ,3885 ,3887 , +3889 ,3891 ,3893 ,3895 ,3897 ,3899 ,3900 ,3902 ,3904 ,3906 ,3908 ,3910 ,3912 ,3914 ,3915 ,3917 , +3919 ,3921 ,3923 ,3925 ,3926 ,3928 ,3930 ,3932 ,3933 ,3935 ,3937 ,3939 ,3940 ,3942 ,3944 ,3945 , +3947 ,3949 ,3950 ,3952 ,3954 ,3955 ,3957 ,3959 ,3960 ,3962 ,3963 ,3965 ,3967 ,3968 ,3970 ,3971 , +3973 ,3974 ,3976 ,3977 ,3979 ,3980 ,3982 ,3983 ,3985 ,3986 ,3988 ,3989 ,3990 ,3992 ,3993 ,3995 , +3996 ,3997 ,3999 ,4000 ,4001 ,4003 ,4004 ,4005 ,4007 ,4008 ,4009 ,4011 ,4012 ,4013 ,4014 ,4016 , +4017 ,4018 ,4019 ,4020 ,4022 ,4023 ,4024 ,4025 ,4026 ,4027 ,4029 ,4030 ,4031 ,4032 ,4033 ,4034 , +4035 ,4036 ,4037 ,4038 ,4039 ,4040 ,4041 ,4042 ,4043 ,4044 ,4045 ,4046 ,4047 ,4048 ,4049 ,4050 , +4051 ,4052 ,4053 ,4054 ,4055 ,4056 ,4057 ,4057 ,4058 ,4059 ,4060 ,4061 ,4062 ,4062 ,4063 ,4064 , +4065 ,4065 ,4066 ,4067 ,4068 ,4068 ,4069 ,4070 ,4071 ,4071 ,4072 ,4073 ,4073 ,4074 ,4075 ,4075 , +4076 ,4076 ,4077 ,4078 ,4078 ,4079 ,4079 ,4080 ,4080 ,4081 ,4081 ,4082 ,4082 ,4083 ,4083 ,4084 , +4084 ,4085 ,4085 ,4086 ,4086 ,4087 ,4087 ,4087 ,4088 ,4088 ,4089 ,4089 ,4089 ,4090 ,4090 ,4090 , +4091 ,4091 ,4091 ,4091 ,4092 ,4092 ,4092 ,4092 ,4093 ,4093 ,4093 ,4093 ,4094 ,4094 ,4094 ,4094 , +4094 ,4094 ,4095 ,4095 ,4095 ,4095 ,4095 ,4095 ,4095 ,4095 ,4095 ,4095 ,4095 ,4095 ,4095 ,4095 }; + + +s32 OneSinTable[1024] = { +0 ,2670177 ,1335090 ,890062 ,667548 ,534040 ,445035 ,381461 ,333780 ,296695 ,267028 ,242754 ,222527 ,205411 ,190741 ,178027 , +166902 ,157087 ,148362 ,140555 ,133529 ,127173 ,121394 ,116118 ,111282 ,106833 ,102726 ,98923 ,95392 ,92105 ,89037 ,86167 , +83476 ,80949 ,78570 ,76327 ,74209 ,72205 ,70307 ,68506 ,66796 ,65169 ,63619 ,62142 ,60731 ,59384 ,58095 ,56861 , +55678 ,54544 ,53455 ,52409 ,51404 ,50436 ,49504 ,48606 ,47740 ,46904 ,46098 ,45319 ,44565 ,43837 ,43132 ,42449 , +41788 ,41147 ,40526 ,39923 ,39338 ,38770 ,38218 ,37682 ,37161 ,36654 ,36161 ,35681 ,35213 ,34758 ,34314 ,33882 , +33461 ,33050 ,32649 ,32257 ,31875 ,31503 ,31138 ,30782 ,30435 ,30095 ,29763 ,29438 ,29120 ,28809 ,28504 ,28206 , +27915 ,27629 ,27349 ,27075 ,26806 ,26543 ,26285 ,26032 ,25784 ,25540 ,25301 ,25067 ,24837 ,24611 ,24389 ,24172 , +23958 ,23748 ,23542 ,23339 ,23140 ,22945 ,22752 ,22563 ,22377 ,22194 ,22014 ,21838 ,21664 ,21492 ,21324 ,21158 , +20995 ,20834 ,20676 ,20520 ,20367 ,20216 ,20067 ,19921 ,19776 ,19634 ,19494 ,19356 ,19220 ,19085 ,18953 ,18823 , +18694 ,18567 ,18442 ,18319 ,18197 ,18077 ,17959 ,17842 ,17727 ,17613 ,17501 ,17390 ,17280 ,17173 ,17066 ,16961 , +16857 ,16754 ,16653 ,16553 ,16454 ,16356 ,16260 ,16165 ,16071 ,15978 ,15886 ,15795 ,15705 ,15617 ,15529 ,15442 , +15357 ,15272 ,15189 ,15106 ,15024 ,14943 ,14863 ,14784 ,14706 ,14628 ,14552 ,14476 ,14401 ,14327 ,14254 ,14182 , +14110 ,14039 ,13969 ,13899 ,13830 ,13762 ,13695 ,13628 ,13562 ,13497 ,13432 ,13368 ,13305 ,13242 ,13180 ,13118 , +13057 ,12997 ,12937 ,12878 ,12819 ,12761 ,12704 ,12647 ,12591 ,12535 ,12479 ,12424 ,12370 ,12316 ,12263 ,12210 , +12158 ,12106 ,12054 ,12004 ,11953 ,11903 ,11853 ,11804 ,11755 ,11707 ,11659 ,11612 ,11565 ,11518 ,11472 ,11426 , +11381 ,11336 ,11291 ,11247 ,11203 ,11159 ,11116 ,11073 ,11030 ,10988 ,10947 ,10905 ,10864 ,10823 ,10783 ,10743 , +10703 ,10663 ,10624 ,10585 ,10547 ,10509 ,10471 ,10433 ,10396 ,10359 ,10322 ,10285 ,10249 ,10213 ,10178 ,10142 , +10107 ,10072 ,10038 ,10003 ,9969 ,9935 ,9902 ,9869 ,9835 ,9803 ,9770 ,9738 ,9706 ,9674 ,9642 ,9611 , +9580 ,9549 ,9518 ,9487 ,9457 ,9427 ,9397 ,9367 ,9338 ,9309 ,9280 ,9251 ,9222 ,9194 ,9166 ,9137 , +9110 ,9082 ,9054 ,9027 ,9000 ,8973 ,8946 ,8920 ,8893 ,8867 ,8841 ,8815 ,8790 ,8764 ,8739 ,8714 , +8689 ,8664 ,8639 ,8614 ,8590 ,8566 ,8542 ,8518 ,8494 ,8471 ,8447 ,8424 ,8401 ,8378 ,8355 ,8332 , +8310 ,8287 ,8265 ,8243 ,8221 ,8199 ,8177 ,8155 ,8134 ,8113 ,8091 ,8070 ,8049 ,8029 ,8008 ,7987 , +7967 ,7946 ,7926 ,7906 ,7886 ,7866 ,7847 ,7827 ,7808 ,7788 ,7769 ,7750 ,7731 ,7712 ,7693 ,7674 , +7656 ,7637 ,7619 ,7600 ,7582 ,7564 ,7546 ,7528 ,7511 ,7493 ,7475 ,7458 ,7441 ,7423 ,7406 ,7389 , +7372 ,7355 ,7338 ,7322 ,7305 ,7289 ,7272 ,7256 ,7240 ,7224 ,7207 ,7192 ,7176 ,7160 ,7144 ,7129 , +7113 ,7098 ,7082 ,7067 ,7052 ,7037 ,7022 ,7007 ,6992 ,6977 ,6962 ,6948 ,6933 ,6918 ,6904 ,6890 , +6875 ,6861 ,6847 ,6833 ,6819 ,6805 ,6791 ,6778 ,6764 ,6750 ,6737 ,6723 ,6710 ,6697 ,6683 ,6670 , +6657 ,6644 ,6631 ,6618 ,6605 ,6593 ,6580 ,6567 ,6555 ,6542 ,6530 ,6517 ,6505 ,6493 ,6480 ,6468 , +6456 ,6444 ,6432 ,6420 ,6408 ,6396 ,6385 ,6373 ,6361 ,6350 ,6338 ,6327 ,6315 ,6304 ,6293 ,6282 , +6270 ,6259 ,6248 ,6237 ,6226 ,6215 ,6204 ,6194 ,6183 ,6172 ,6162 ,6151 ,6140 ,6130 ,6119 ,6109 , +6099 ,6088 ,6078 ,6068 ,6058 ,6048 ,6038 ,6028 ,6018 ,6008 ,5998 ,5988 ,5978 ,5969 ,5959 ,5949 , +5940 ,5930 ,5921 ,5911 ,5902 ,5892 ,5883 ,5874 ,5865 ,5855 ,5846 ,5837 ,5828 ,5819 ,5810 ,5801 , +5792 ,5783 ,5774 ,5766 ,5757 ,5748 ,5740 ,5731 ,5722 ,5714 ,5705 ,5697 ,5688 ,5680 ,5672 ,5663 , +5655 ,5647 ,5639 ,5630 ,5622 ,5614 ,5606 ,5598 ,5590 ,5582 ,5574 ,5566 ,5559 ,5551 ,5543 ,5535 , +5528 ,5520 ,5512 ,5505 ,5497 ,5490 ,5482 ,5475 ,5467 ,5460 ,5452 ,5445 ,5438 ,5430 ,5423 ,5416 , +5409 ,5402 ,5395 ,5388 ,5380 ,5373 ,5366 ,5360 ,5353 ,5346 ,5339 ,5332 ,5325 ,5318 ,5312 ,5305 , +5298 ,5292 ,5285 ,5278 ,5272 ,5265 ,5259 ,5252 ,5246 ,5239 ,5233 ,5227 ,5220 ,5214 ,5208 ,5201 , +5195 ,5189 ,5183 ,5177 ,5171 ,5164 ,5158 ,5152 ,5146 ,5140 ,5134 ,5128 ,5122 ,5117 ,5111 ,5105 , +5099 ,5093 ,5088 ,5082 ,5076 ,5070 ,5065 ,5059 ,5053 ,5048 ,5042 ,5037 ,5031 ,5026 ,5020 ,5015 , +5009 ,5004 ,4999 ,4993 ,4988 ,4983 ,4977 ,4972 ,4967 ,4962 ,4956 ,4951 ,4946 ,4941 ,4936 ,4931 , +4926 ,4921 ,4916 ,4911 ,4906 ,4901 ,4896 ,4891 ,4886 ,4881 ,4876 ,4871 ,4867 ,4862 ,4857 ,4852 , +4848 ,4843 ,4838 ,4834 ,4829 ,4824 ,4820 ,4815 ,4811 ,4806 ,4802 ,4797 ,4793 ,4788 ,4784 ,4779 , +4775 ,4771 ,4766 ,4762 ,4757 ,4753 ,4749 ,4745 ,4740 ,4736 ,4732 ,4728 ,4724 ,4719 ,4715 ,4711 , +4707 ,4703 ,4699 ,4695 ,4691 ,4687 ,4683 ,4679 ,4675 ,4671 ,4667 ,4663 ,4659 ,4655 ,4652 ,4648 , +4644 ,4640 ,4636 ,4633 ,4629 ,4625 ,4621 ,4618 ,4614 ,4610 ,4607 ,4603 ,4599 ,4596 ,4592 ,4589 , +4585 ,4582 ,4578 ,4575 ,4571 ,4568 ,4564 ,4561 ,4557 ,4554 ,4551 ,4547 ,4544 ,4540 ,4537 ,4534 , +4531 ,4527 ,4524 ,4521 ,4518 ,4514 ,4511 ,4508 ,4505 ,4502 ,4498 ,4495 ,4492 ,4489 ,4486 ,4483 , +4480 ,4477 ,4474 ,4471 ,4468 ,4465 ,4462 ,4459 ,4456 ,4453 ,4450 ,4447 ,4444 ,4441 ,4439 ,4436 , +4433 ,4430 ,4427 ,4425 ,4422 ,4419 ,4416 ,4414 ,4411 ,4408 ,4406 ,4403 ,4400 ,4398 ,4395 ,4392 , +4390 ,4387 ,4385 ,4382 ,4379 ,4377 ,4374 ,4372 ,4369 ,4367 ,4364 ,4362 ,4359 ,4357 ,4355 ,4352 , +4350 ,4347 ,4345 ,4343 ,4340 ,4338 ,4336 ,4333 ,4331 ,4329 ,4327 ,4324 ,4322 ,4320 ,4318 ,4315 , +4313 ,4311 ,4309 ,4307 ,4305 ,4302 ,4300 ,4298 ,4296 ,4294 ,4292 ,4290 ,4288 ,4286 ,4284 ,4282 , +4280 ,4278 ,4276 ,4274 ,4272 ,4270 ,4268 ,4266 ,4264 ,4262 ,4260 ,4259 ,4257 ,4255 ,4253 ,4251 , +4249 ,4248 ,4246 ,4244 ,4242 ,4241 ,4239 ,4237 ,4235 ,4234 ,4232 ,4230 ,4229 ,4227 ,4225 ,4224 , +4222 ,4220 ,4219 ,4217 ,4216 ,4214 ,4213 ,4211 ,4209 ,4208 ,4206 ,4205 ,4203 ,4202 ,4200 ,4199 , +4198 ,4196 ,4195 ,4193 ,4192 ,4190 ,4189 ,4188 ,4186 ,4185 ,4184 ,4182 ,4181 ,4180 ,4178 ,4177 , +4176 ,4174 ,4173 ,4172 ,4171 ,4170 ,4168 ,4167 ,4166 ,4165 ,4164 ,4162 ,4161 ,4160 ,4159 ,4158 , +4157 ,4156 ,4155 ,4153 ,4152 ,4151 ,4150 ,4149 ,4148 ,4147 ,4146 ,4145 ,4144 ,4143 ,4142 ,4141 , +4140 ,4139 ,4138 ,4138 ,4137 ,4136 ,4135 ,4134 ,4133 ,4132 ,4131 ,4131 ,4130 ,4129 ,4128 ,4127 , +4127 ,4126 ,4125 ,4124 ,4123 ,4123 ,4122 ,4121 ,4121 ,4120 ,4119 ,4119 ,4118 ,4117 ,4117 ,4116 , +4115 ,4115 ,4114 ,4113 ,4113 ,4112 ,4112 ,4111 ,4111 ,4110 ,4110 ,4109 ,4109 ,4108 ,4108 ,4107 , +4107 ,4106 ,4106 ,4105 ,4105 ,4104 ,4104 ,4104 ,4103 ,4103 ,4102 ,4102 ,4102 ,4101 ,4101 ,4101 , +4100 ,4100 ,4100 ,4100 ,4099 ,4099 ,4099 ,4099 ,4098 ,4098 ,4098 ,4098 ,4097 ,4097 ,4097 ,4097 , +4097 ,4097 ,4096 ,4096 ,4096 ,4096 ,4096 ,4096 ,4096 ,4096 ,4096 ,4096 ,4096 ,4096 ,4096 ,4096 }; + + diff --git a/source/utils/utils.cpp b/source/utils/utils.cpp new file mode 100644 index 000000000..b2b8e9fa8 --- /dev/null +++ b/source/utils/utils.cpp @@ -0,0 +1,52 @@ +/******************/ +/*** Misc Utils ***/ +/******************/ + +#include "system\global.h" +#include "utils\utils.h" +#include "gfx\Prim.h" + +#ifndef __VID_HEADER_ +#include "system/vid.h" +#endif + +#ifndef __SYSTEM_GSTATE_H__ +#include "system\gstate.h" +#endif + +#ifndef __MATHTABLE_HEADER__ +#include "utils\mathtab.h" +#endif + + +/*****************************************************************************/ + +const s16 c_circle[ NO_SIN ] = +{ + 0,25,49,74,97,120,142,162,181,197,212,225,236,244,251,254, + 255,254,251,244,236,225,212,197,181,162,142,120,97,74,49,25, + 0,-25,-49,-74,-97,-120,-142,-162,-181,-197,-212,-225,-236,-244,-251,-254, + -255,-254,-251,-244,-236,-225,-212,-197,-181,-162,-142,-120,-97,-74,-49,-25 +}; + +/*****************************************************************************/ +const MATRIX IdentityMtx = +{ + {{ONE, 0, 0}, + { 0,ONE, 0}, + { 0, 0,ONE}}, + { 0, 0, 0}, +}; + +/*****************************************************************************/ + +const u32 NOTNEG = ((u32)1<<(u32)31) | ((u32)1<<(u32)15); +long s_randomSeed; + +/*****************************************************************************/ +u8 *MakePtr(void *BasePtr,int Offset) +{ +u8 *Ret; + Ret=(u8*)BasePtr+(Offset); + return(Ret); +} diff --git a/source/utils/utils.h b/source/utils/utils.h new file mode 100644 index 000000000..7047fa170 --- /dev/null +++ b/source/utils/utils.h @@ -0,0 +1,651 @@ +/******************/ +/*** Misc Utils ***/ +/******************/ + +#ifndef __UTILS_HEADER__ +#define __UTILS_HEADER__ + +#include "utils\mathmip.h" + +#ifndef __GLOBAL_STRUCTS_HEADER__ +#include "gstruct.h" +#endif +#ifndef __MATHTABLE_HEADER__ +#include "utils\mathtab.h" +#endif + +/*****************************************************************************/ +#define NO_SIN 64 +#define SINMASK (NO_SIN - 1) +#define COSPOS (NO_SIN / 4) + +extern const s16 c_circle[ NO_SIN ]; +extern const MATRIX IdentityMtx; + +/*****************************************************************************/ +u8 *MakePtr(void *BasePtr,int Offset); + +/*****************************************************************************/ +/*** Loads of inlines ********************************************************/ +/*****************************************************************************/ +inline void SetIdent(MATRIX *Mtx) +{ + Mtx->m[0][0]=ONE; Mtx->m[0][1]=0; Mtx->m[0][2]=0; + Mtx->m[1][0]=0; Mtx->m[1][1]=ONE; Mtx->m[1][2]=0; + Mtx->m[2][0]=0; Mtx->m[2][1]=0; Mtx->m[2][2]=ONE; + Mtx->t[0]=0; Mtx->t[1]=0; Mtx->t[2]=0; +} + +/*****************************************************************************/ +inline void SetIdentNoTrans(MATRIX *Mtx) +{ + Mtx->m[0][0]=ONE; Mtx->m[0][1]=0; Mtx->m[0][2]=0; + Mtx->m[1][0]=0; Mtx->m[1][1]=ONE; Mtx->m[1][2]=0; + Mtx->m[2][0]=0; Mtx->m[2][1]=0; Mtx->m[2][2]=ONE; +// Mtx->t[0]=0; Mtx->t[1]=0; Mtx->t[2]=0; +} + + +/*****************************************************************************/ +inline void SetIdentScale(MATRIX *Mtx,u32 Scale) +{ + Mtx->m[0][0]=Scale; Mtx->m[0][1]=0; Mtx->m[0][2]=0; + Mtx->m[1][0]=0; Mtx->m[1][1]=Scale; Mtx->m[1][2]=0; + Mtx->m[2][0]=0; Mtx->m[2][1]=0; Mtx->m[2][2]=Scale; + Mtx->t[0]=0; Mtx->t[1]=0; Mtx->t[2]=0; +} + +/*****************************************************************************/ +inline void SetIdentScaleNoTrans(MATRIX *Mtx,u32 Scale) +{ + Mtx->m[0][0]=Scale; Mtx->m[0][1]=0; Mtx->m[0][2]=0; + Mtx->m[1][0]=0; Mtx->m[1][1]=Scale; Mtx->m[1][2]=0; + Mtx->m[2][0]=0; Mtx->m[2][1]=0; Mtx->m[2][2]=Scale; +// Mtx->t[0]=0; Mtx->t[1]=0; Mtx->t[2]=0; +} + +/*****************************************************************************/ +inline void InverseMatrix(MATRIX *m, MATRIX &im) //assumes no scale, just transformation and rotation +{ + TransposeMatrix(m, &im); + ApplyMatrixLV(&im, (VECTOR*)&m->t[0], (VECTOR*)&im.t[0]); + im.t[0] = -im.t[0]; + im.t[1] = -im.t[1]; + im.t[2] = -im.t[2]; +} + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ +extern long s_randomSeed; +inline long getRndSeed() +{ + const u32 INCREMENT = 1; + const u32 MULTIPLIER = 0x015a4e35L; + s_randomSeed = MULTIPLIER * s_randomSeed + INCREMENT; + return abs(s_randomSeed); +} + +/*****************************************************************************/ +inline void setRndSeed( long seed ) +{ + s_randomSeed = seed; +} + +/*****************************************************************************/ +inline long getRnd() +{ + return getRndSeed(); +} + +/*****************************************************************************/ +inline long getRndRange( long v ) +{ + if (v <= 0) return 0; + + // high order bits are more "random" than low order bits + if (v < 0x0ffff) return (getRndSeed() >> 16) % v; + + return getRndSeed() % v; +} + +/*****************************************************************************/ +/*****************************************************************************/ +/*****************************************************************************/ + +// -- VECTOR Operator Arithmetic operation -- + +inline VECTOR operator - (const VECTOR& a) +{ + VECTOR ret; + ret.vx = -a.vx; + ret.vy = -a.vy; + ret.vz = -a.vz; + return ret; +} + +inline VECTOR operator + (const VECTOR& a, const VECTOR& b) +{ + VECTOR ret; + ret.vx = a.vx + b.vx; + ret.vy = a.vy + b.vy; + ret.vz = a.vz + b.vz; + return ret; +} + +inline VECTOR operator - (const VECTOR& a, const VECTOR& b) +{ + VECTOR ret; + ret.vx = a.vx - b.vx; + ret.vy = a.vy - b.vy; + ret.vz = a.vz - b.vz; + return ret; +} + +inline VECTOR operator *= (const VECTOR& a, const int & b) +{ + VECTOR ret; + ret.vx = a.vx * b; + ret.vy = a.vy * b; + ret.vz = a.vz * b; + return ret; +} + +inline VECTOR operator >>= (const VECTOR& a, const int & b) +{ + VECTOR ret; + ret.vx = a.vx >> b; + ret.vy = a.vy >> b; + ret.vz = a.vz >> b; + return ret; +} + +inline VECTOR operator += (const VECTOR& a, const VECTOR& b) +{ + VECTOR ret; + ret.vx = a.vx + b.vx; + ret.vy = a.vy + b.vy; + ret.vz = a.vz + b.vz; + return ret; +} + +inline int operator == (const VECTOR& a, const VECTOR& b) +{ + return (a.vx == b.vx) && (a.vy == b.vy) && (a.vz == b.vz); +} + +inline int operator != (const VECTOR& a, const VECTOR& b) +{ + return !(a == b); +} + + +// -- VECTOR to sVtx Operator Arithmetic operation -- + +inline VECTOR operator - (const sShortXYZ& a, const sVtx& b) +{ + VECTOR ret; + ret.vx = a.vx - b.vx; + ret.vy = a.vy - b.vy; + ret.vz = a.vz - b.vz; + return ret; +} + +inline VECTOR operator - (const sVtx& a, const sVtx& b) +{ + VECTOR ret; + ret.vx = a.vx - b.vx; + ret.vy = a.vy - b.vy; + ret.vz = a.vz - b.vz; + return ret; +} + +inline VECTOR operator *= (const sVtx& a, const int & b) +{ + VECTOR ret; + ret.vx = a.vx * b; + ret.vy = a.vy * b; + ret.vz = a.vz * b; + return ret; +} + +inline VECTOR operator >>= (const sVtx& a, const int & b) +{ + VECTOR ret; + ret.vx = a.vx >> b; + ret.vy = a.vy >> b; + ret.vz = a.vz >> b; + return ret; +} + +// -- sShortXYZ Operator Arithmetic operation -- + +inline sShortXYZ operator - (const sShortXYZ& a) +{ + sShortXYZ ret; + ret.vx = -a.vx; + ret.vy = -a.vy; + ret.vz = -a.vz; + return ret; +} + +inline sShortXYZ operator + (const sShortXYZ& a, const sShortXYZ& b) +{ + sShortXYZ ret; + ret.vx = a.vx + b.vx; + ret.vy = a.vy + b.vy; + ret.vz = a.vz + b.vz; + return ret; +} + +inline sShortXYZ operator >> (const VECTOR& a, const int& b) +{ + sShortXYZ ret; + ret.vx = a.vx >> b; + ret.vy = a.vy >> b; + ret.vz = a.vz >> b; + return ret; +} + +inline int operator * (const sShortXYZ& a, const sShortXYZ& b) // DOT PRODUCT +{ + return (a.vx * b.vx) + (a.vy * b.vy) + (a.vz * b.vz); +} + +inline int operator == (const sShortXYZ& a, const sShortXYZ& b) +{ + return (a.vx == b.vx) && (a.vy == b.vy) && (a.vz == b.vz); +} + +inline int operator != (const sShortXYZ& a, const sShortXYZ& b) +{ + return !(a == b); +} + +// -- sShortXYZ to VECTOR Operator Arithmetic operation -- + +inline VECTOR operator + (const VECTOR& a, const sShortXYZ& b) +{ + VECTOR ret; + ret.vx = a.vx + b.vx; + ret.vy = a.vy + b.vy; + ret.vz = a.vz + b.vz; + return ret; +} + +inline VECTOR operator - (const VECTOR& a, const sShortXYZ& b) +{ + VECTOR ret; + ret.vx = a.vx - b.vx; + ret.vy = a.vy - b.vy; + ret.vz = a.vz - b.vz; + return ret; +} + +inline VECTOR operator - (const sShortXYZ& a, const sShortXYZ& b) +{ + VECTOR ret; + ret.vx = a.vx - b.vx; + ret.vy = a.vy - b.vy; + ret.vz = a.vz - b.vz; + return ret; +} + +inline int operator * (const VECTOR& a, const sShortXYZ& b) // DOT PRODUCT +{ + return (a.vx * b.vx) + (a.vy * b.vy) + (a.vz * b.vz); +} + +inline int operator * (const sShortXYZ& a, const VECTOR& b) // DOT PRODUCT +{ + return (a.vx * b.vx) + (a.vy * b.vy) + (a.vz * b.vz); +} + +inline VECTOR operator ^ (const VECTOR& a, const sShortXYZ& b) // CROSS PRODUCT +{ + VECTOR ret; + ret.vx = (a.vy * b.vz) - (a.vz * b.vy); + ret.vy = (a.vz * b.vx) - (a.vx * b.vz); + ret.vz = (a.vx * b.vy) - (a.vy * b.vx); + return ret; +} + +inline VECTOR operator ^ (const sShortXYZ& a, const sShortXYZ& b) // CROSS PRODUCT +{ + VECTOR ret; + ret.vx = (a.vy * b.vz) - (a.vz * b.vy); + ret.vy = (a.vz * b.vx) - (a.vx * b.vz); + ret.vz = (a.vx * b.vy) - (a.vy * b.vx); + return ret; +} + + +/*****************************************************************************/ +/*** Inlines *****************************************************************/ +/*****************************************************************************/ +inline u32 isqrt2(u32 v) +{ +register u32 root = 0; +register u32 remhi = 0; +register u32 remlo = v; +register u32 count = 15; +register u32 testdiv; + + do + { + remhi = (remhi << 2) | (remlo >> 30); + remlo <<= 2; + root <<= 1; + testdiv = (root << 1) + 1; + if (remhi >= testdiv) + { + remhi -= testdiv; + root += 1; + } + } while (count -- != 0); + return(root); +} + + +/*****************************************************************************/ +inline u32 CalcLength(const SVECTOR *s) +{ +int Dt; + gte_ldsv(s); + gte_sqr0(); + CMX_StVecXYZMag(&Dt); + return(Dt); +} + +/*****************************************************************************/ +inline u32 CalcLengthSquared(const SVECTOR *s) +{ +u32 Dt; + gte_ldsv(s); + gte_sqr0(); + CMX_StVecXYZMag(&Dt); + return(Dt); +} + +/*****************************************************************************/ +inline u32 CalcLengthV(const VECTOR *s) +{ +u32 Dt; + gte_ldlvl(s); + gte_sqr0(); + CMX_StVecXYZMag(&Dt); + return(isqrt2(Dt)); +} + +/*****************************************************************************/ +inline u32 CalcLengthSquaredV(const VECTOR *s) +{ +u32 Dt; + gte_ldlvl(s); + gte_sqr0(); + CMX_StVecXYZMag(&Dt); + return(Dt); +} + +/*****************************************************************************/ +inline u32 CalcDist(const SVECTOR *s, const SVECTOR *e) +{ +s32 Dx = s->vx - e->vx; +s32 Dy = s->vy - e->vy; +s32 Dz = s->vz - e->vz; +u32 Dt; + + CMX_ldXYZ(Dx,Dy,Dz); + gte_sqr0(); + CMX_StVecXYZMag(&Dt); + return(isqrt2(Dt)); +} + +/*****************************************************************************/ +inline u32 CalcDistXZ(const SVECTOR *s, const SVECTOR *e) +{ +s32 Dx = s->vx - e->vx; +s32 Dz = s->vz - e->vz; +u32 Dt; + + CMX_ldXZ(Dx,Dz); + gte_sqr0(); + CMX_StVecXZMag(&Dt); + return(isqrt2(Dt)); +} + +/*****************************************************************************/ +inline u32 CalcDistV(const VECTOR *s, const VECTOR *e) +{ +s32 Dx = s->vx - e->vx; +s32 Dy = s->vy - e->vy; +s32 Dz = s->vz - e->vz; +u32 Dt; + + CMX_ldXYZ(Dx,Dy,Dz); + gte_sqr0(); + CMX_StVecXYZMag(&Dt); + return(isqrt2(Dt)); +} + +/*****************************************************************************/ +inline u32 CalcDistV(const VECTOR *s, const VECTOR *e, u16 shift) +{ +s32 Dx = (s->vx - e->vx) >> shift; +s32 Dz = (s->vz - e->vz) >> shift; +u32 Dt; + + CMX_ldXZ(Dx,Dz); + gte_sqr0(); + CMX_StVecXZMag(&Dt); + return(isqrt2(Dt) << shift); +} + +/*****************************************************************************/ +inline u32 CalcDistXZV(const VECTOR *s, const VECTOR *e) +{ +s32 Dx = s->vx - e->vx; +s32 Dz = s->vz - e->vz; +u32 Dt; + CMX_ldXZ(Dx,Dz); + gte_sqr0(); + CMX_StVecXZMag(&Dt); + return(isqrt2(Dt)); +} + +/*****************************************************************************/ +inline u32 CalcDistXZVSquared(const VECTOR *s, const VECTOR *e) +{ +s32 Dx = s->vx - e->vx; +s32 Dz = s->vz - e->vz; +u32 Dt; + + CMX_ldXZ(Dx,Dz); + gte_sqr0(); + CMX_StVecXZMag(&Dt); + return abs(Dt); +} + +/*****************************************************************************/ +inline u32 CalcDistXZV(const VECTOR *s, const VECTOR *e, u16 shift) +{ +s32 Dx = (s->vx - e->vx) >> shift; +s32 Dz = (s->vz - e->vz) >> shift; +u32 Dt; + + CMX_ldXZ(Dx,Dz); + gte_sqr0(); + CMX_StVecXZMag(&Dt); + return(isqrt2(Dt) << shift); +} + +/*****************************************************************************/ +inline long CalcDistXZVAccurate(const VECTOR *s, const VECTOR *e) +{ +long Dx = s->vx - e->vx; +long Dz = s->vz - e->vz; +long Dt = (Dx*Dx) + (Dz*Dz); +long len = SquareRoot0(Dt); + return(len); +} + +/*****************************************************************************/ +inline u32 CalcDist(const sShortXYZ *s, const sShortXYZ *e) +{ +s32 Dx = s->vx - e->vx; +s32 Dy = s->vy - e->vy; +s32 Dz = s->vz - e->vz; +u32 Dt; + + CMX_ldXYZ(Dx,Dy,Dz); + gte_sqr0(); + CMX_StVecXYZMag(&Dt); + return(isqrt2(Dt)); +} + +/*****************************************************************************/ +inline u32 CalcDistXZ(const sShortXYZ *s, const sShortXYZ *e) +{ +s32 Dx = s->vx - e->vx; +s32 Dz = s->vz - e->vz; +u32 Dt; + + CMX_ldXZ(Dx,Dz); + gte_sqr0(); + CMX_StVecXZMag(&Dt); + return(isqrt2(Dt)); +} + +/*****************************************************************************/ +inline u32 CalcDistXZSquared(const sShortXYZ *s, const sShortXYZ *e) +{ +s32 Dx = s->vx - e->vx; +s32 Dz = s->vz - e->vz; +u32 Dt; + + CMX_ldXZ(Dx,Dz); + gte_sqr0(); + CMX_StVecXZMag(&Dt); + return(Dt); +} +/*****************************************************************************/ +inline s32 DotProduct(const SVECTOR *V0, const SVECTOR *V1) +{ +s32 Dpx,Dpy,Dpz; + Dpx=V0->vx*V1->vx; + Dpy=V0->vy*V1->vy; + Dpz=V0->vz*V1->vz; + return(Dpx+Dpy+Dpz); +} + +/*****************************************************************************/ +inline s32 DotProductV( const VECTOR *V0, const VECTOR *V1 ) +{ +s32 ax, ay, az; +s32 bx, by, bz; +s32 Dpx, Dpy, Dpz; + + ax = V0->vx; + ay = V0->vy; + az = V0->vz; + + bx = V1->vx; + by = V1->vy; + bz = V1->vz; + + Dpx = ax * bx; + Dpy = ay * by; + Dpz = az * bz; + + return (Dpx + Dpy + Dpz); +} +/*****************************************************************************/ +inline s32 DotProductSV( const SVECTOR *V0, const VECTOR *V1 ) +{ +s32 ax, ay, az; +s32 bx, by, bz; +s32 Dpx, Dpy, Dpz; + + ax = V0->vx; + ay = V0->vy; + az = V0->vz; + + bx = V1->vx; + by = V1->vy; + bz = V1->vz; + + Dpx = ax * bx; + Dpy = ay * by; + Dpz = az * bz; + + return (Dpx + Dpy + Dpz); +} +/*****************************************************************************/ +inline void QuatSlerp(sQuat *s, sQuat *d, int t, sQuat *o) +{ +s32 xx, yy, zz, ww; +s32 cs; +s32 c0, c1; +sQuat to; + + xx = (s->vx * d->vx); + yy = (s->vy * d->vy); + zz = (s->vz * d->vz); + ww = (s->vw * d->vw); + + cs = xx + yy + zz + ww; + if (cs<0) + { + cs = -cs; + to.vx = -d->vx; + to.vy = -d->vy; + to.vz = -d->vz; + to.vw = -d->vw; + } + else + { + to.vx = d->vx; + to.vy = d->vy; + to.vz = d->vz; + to.vw = d->vw; + } + + cs >>= 12; + s32 omega; + if (cs < 3500) + { // standard case (slerp) + omega = macos(cs); + s32 sinom = monesin(omega); + c0 = (msin((((4096 - t) * omega) >> 12) & 4095) * sinom)>>12; + c1 = (msin(((t * omega) >> 12) & 4095) * sinom)>>12; + } + else + { + c0 = 4096 - t; + c1 = t; + } + + gte_LoadAverageShort12(s, &to, c0, c1, o); + o->vw = ((c0 * s->vw) + (c1 * to.vw)) >> 12; +} + +/*****************************************************************************/ +static const s32 DeltaErr = 1000; +inline void NormalizeQuaternion(sQuat *o) +{ +s32 t = (u32)((s32)o->vx*o->vx+(s32)o->vy*o->vy+(s32)o->vz*o->vz+(s32)o->vw*o->vw); + s32 diff = abs((1<<24) - t); + if (diff>DeltaErr) + { + s32 isqrs = isqrt2(t); + if (isqrs) + { + o->vx = (s16)(((s32)o->vx << 12) / (s32)isqrs); + o->vy = (s16)(((s32)o->vy << 12) / (s32)isqrs); + o->vz = (s16)(((s32)o->vz << 12) / (s32)isqrs); + o->vw = (s16)(((s32)o->vw << 12) / (s32)isqrs); + } + } +} + +#endif \ No newline at end of file