* Some improvements made to improve peformance and stability.

- Removed Pad module (useless).
* Some functions removed from System and Gfx.
This commit is contained in:
XaviDCR92 2017-07-24 22:39:16 +02:00
parent 41d8caba3b
commit f071adf8f5
10 changed files with 39 additions and 1101 deletions

View File

@ -104,21 +104,6 @@ void FontPrintText(TYPE_FONT * ptrFont, short x, short y, char* str, ...)
va_list ap;
if(ptrFont->flags & FONT_1HZ_FLASH)
{
if(Gfx1HzFlash() == false)
{
return;
}
}
else if(ptrFont->flags & FONT_2HZ_FLASH)
{
if(Gfx2HzFlash() == false)
{
return;
}
}
va_start(ap, str);
result = vsnprintf( _internal_text,

View File

@ -99,9 +99,6 @@ static uint8_t global_lum;
// information for development purposes.
static bool GfxDevMenuEnableFlag;
static bool five_hundred_ms_show;
static bool one_second_show;
void GfxSwapBuffers(void)
{
// Consistency check
@ -181,17 +178,7 @@ void GfxSetPrimitiveList(void)
}
void GfxDrawScene_Fast(void)
{
if(System1SecondTick() == true)
{
one_second_show = one_second_show? false:true;
}
if(System500msTick() == true)
{
five_hundred_ms_show = five_hundred_ms_show? false:true;
}
{
GfxSwapBuffers();
FontCyclic();
GsDrawList();
@ -227,8 +214,6 @@ void GfxSortSprite(GsSprite * spr)
unsigned char aux_tpage = spr->tpage;
short aux_w = spr->w;
short aux_x = spr->x;
bool has_1hz_flash = spr->attribute & GFX_1HZ_FLASH;
bool has_2hz_flash = spr->attribute & GFX_2HZ_FLASH;
if( (spr->w <= 0) || (spr->h <= 0) )
{
@ -240,14 +225,6 @@ void GfxSortSprite(GsSprite * spr)
{
return;
}
else if(has_2hz_flash && Gfx2HzFlash() == false)
{
return;
}
else if(has_1hz_flash && Gfx1HzFlash() == false)
{
return;
}
if(global_lum != NORMAL_LUMINANCE)
{
@ -278,12 +255,7 @@ void GfxSortSprite(GsSprite * spr)
spr->b -= NORMAL_LUMINANCE - global_lum;
}
}
if(has_1hz_flash == true)
{
spr->attribute &= ~(GFX_1HZ_FLASH);
}
if(spr->w > MAX_SIZE_FOR_GSSPRITE)
{
// GsSprites can't be bigger than 256x256, so since display
@ -307,11 +279,6 @@ void GfxSortSprite(GsSprite * spr)
GsSortSprite(spr);
}
if(has_1hz_flash == true)
{
spr->attribute |= GFX_1HZ_FLASH;
}
spr->r = aux_r;
spr->g = aux_g;
spr->b = aux_b;
@ -559,16 +526,6 @@ void GfxSaveDisplayData(GsSprite *spr)
while(GfxIsGPUBusy() == true);
}
bool Gfx1HzFlash(void)
{
return one_second_show;
}
bool Gfx2HzFlash(void)
{
return five_hundred_ms_show;
}
bool GfxTPageOffsetFromVRAMPosition(GsSprite * spr, short x, short y)
{
if( (x >= VRAM_W) || (x < 0) || (y >= VRAM_H) || (y < 0) )

View File

@ -8,7 +8,7 @@
#include "Global_Inc.h"
#include "System.h"
#include "Pad.h"
/* *************************************
* Defines
@ -96,12 +96,6 @@ void GfxSetSplitScreen(uint8_t playerIndex);
void GfxDisableSplitScreen(void);
// Switches between true and false every 1 exact second (used for flashing effects)
bool Gfx1HzFlash(void);
// Switches between true and false every 500 milliseconds (used for flashing effects)
bool Gfx2HzFlash(void);
void GfxDrawScene_NoSwap(void);
void GfxDevMenuEnable(void);

View File

@ -11,7 +11,7 @@ PROJECT_DIR = ~/OpenSend
INIT_ADDR=0x801A0000
ELF2EXE = elf2exe
ELF2EXE_FLAGS = -mark="A homebrew game created with PSXSDK" -init_addr=$(INIT_ADDR)
ELF2EXE_FLAGS = -mark="Open-source PSX-EXE loader created with PSXSDK" -init_addr=$(INIT_ADDR)
LICENSE_FILE = /usr/local/psxsdk/share/licenses/infoeur.dat
PSXSDK_DIR = /usr/local/psxsdk/bin
@ -36,7 +36,7 @@ rebuild: remove build
build: clean objects $(PROJECT).elf $(PROJECT).exe
objects: $(addprefix $(OBJ_DIR)/,main.o System.o Gfx.o Pad.o \
objects: $(addprefix $(OBJ_DIR)/,main.o System.o Gfx.o \
LoadMenu.o EndAnimation.o \
Font.o Serial.o)

View File

@ -1,530 +0,0 @@
/* *************************************
* Includes
* *************************************/
#include "Pad.h"
/* *************************************
* Defines
* *************************************/
#define PAD_ONE 0
#define PAD_TWO 1
#define PAD_CHEAT_TIMEOUT 20 // 2 units * 100 ms/unit = 2000 ms
#define PAD_MAX_CHEATS 16
/* **************************************
* Structs and enums *
* *************************************/
enum
{
PAD_CROSS_INDEX = 0,
PAD_SQUARE_INDEX,
PAD_TRIANGLE_INDEX,
PAD_CIRCLE_INDEX,
PAD_DOWN_INDEX,
PAD_LEFT_INDEX,
PAD_UP_INDEX,
PAD_RIGHT_INDEX,
PAD_L1_INDEX,
PAD_L2_INDEX,
PAD_R1_INDEX,
PAD_R2_INDEX,
NUMBER_OF_KEYS
};
/* *************************************
* Local Prototypes
* *************************************/
static void PadOneVibrationHandler(void);
static void PadTwoVibrationHandler(void);
static void PadCheatHandler(uint8_t n_pad);
static void PadOneCleanCheatArray(void);
static void PadTwoCleanCheatArray(void);
static psx_pad_state PadOneGetState(void);
uint8_t PadGetKeyIndex(unsigned short key);
/* *************************************
* Local Variables
* *************************************/
// Pad data
static unsigned short pad1;
static unsigned short pad2;
// Pad data from previous frame
static unsigned short previous_pad1;
static unsigned short previous_pad2;
// Vibration timers
static uint16_t pad1_vibration_timer;
static uint16_t pad2_vibration_timer;
// Vibration strenght data (big motor)
static uint8_t pad1_big_vibration_force;
static uint8_t pad2_big_vibration_force;
// Vibration strenght data (small motor)
static uint8_t pad1_small_vibration_force;
static uint8_t pad2_small_vibration_force;
// Timers for each key pressed (used for PadXXKeyRepeat() )
static uint8_t pad1_keys_repeat[NUMBER_OF_KEYS];
static uint8_t pad2_keys_repeat[NUMBER_OF_KEYS];
static unsigned short pad1_last_key_single_pressed;
static unsigned short pad2_last_key_single_pressed;
// These arrays include last 16 buttons pressed by user and keeps them
// for cheating purposes. They are cleaned if no keys are pressed during
// PAD_CHEAT_TIMEOUT milliseconds.
static unsigned short pad1_cheat_array[CHEAT_ARRAY_SIZE];
static unsigned short pad2_cheat_array[CHEAT_ARRAY_SIZE];
// Pointers to timers which clean padX_cheat_array.
static TYPE_TIMER* pad1_cheat_timer;
static TYPE_TIMER* pad2_cheat_timer;
static TYPE_CHEAT * cheatsArray[PAD_MAX_CHEATS];
psx_pad_state PadOneGetState(void)
{
psx_pad_state PadOne;
PSX_PollPad_Fast(PAD_ONE,&PadOne);
return PadOne;
}
bool PadOneConnected(void)
{
psx_pad_state PadOne = PadOneGetState();
if(PadOne.status != PAD_STATUS_OK)
{
return false;
}
return true;
}
bool PadOneAnyKeyPressed(void)
{
return (bool)pad1;
}
bool PadOneDirectionKeyPressed(void)
{
return ( (PadOneKeyPressed(PAD_UP) == true)
||
(PadOneKeyPressed(PAD_LEFT) == true)
||
(PadOneKeyPressed(PAD_RIGHT) == true)
||
(PadOneKeyPressed(PAD_DOWN) == true) );
}
bool PadOneDirectionKeyReleased(void)
{
return ( (PadOneKeyReleased(PAD_UP) == true)
||
(PadOneKeyReleased(PAD_LEFT) == true)
||
(PadOneKeyReleased(PAD_RIGHT) == true)
||
(PadOneKeyReleased(PAD_DOWN) == true) );
}
bool PadTwoDirectionKeyReleased(void)
{
return ( (PadTwoKeyReleased(PAD_UP) == true)
||
(PadTwoKeyReleased(PAD_LEFT) == true)
||
(PadTwoKeyReleased(PAD_RIGHT) == true)
||
(PadTwoKeyReleased(PAD_DOWN) == true) );
}
bool PadTwoDirectionKeyPressed(void)
{
return ( (PadTwoKeyPressed(PAD_UP) == true)
||
(PadTwoKeyPressed(PAD_LEFT) == true)
||
(PadTwoKeyPressed(PAD_RIGHT) == true)
||
(PadTwoKeyPressed(PAD_DOWN) == true) );
}
bool PadTwoAnyKeyPressed(void)
{
return (bool)pad2;
}
bool PadOneKeyPressed(unsigned short key)
{
return (bool)( pad1 & key );
}
bool PadTwoKeyPressed(unsigned short key)
{
return (bool)( pad2 & key );
}
bool PadOneKeySinglePress(unsigned short key)
{
return (bool)( !(previous_pad1 & key) && (pad1 & key) );
}
bool PadTwoKeySinglePress(unsigned short key)
{
return (bool)( !(previous_pad2 & key) && (pad2 & key) );
}
bool PadOneKeyRepeat(unsigned short key, uint8_t time)
{
uint8_t key_index = PadGetKeyIndex(key);
if(key_index == NUMBER_OF_KEYS)
{
return false;
}
pad1_keys_repeat[key_index]++;
if(pad1_keys_repeat[key_index] >= time)
{
pad1_keys_repeat[key_index] = 0;
return true;
}
return false;
}
bool PadTwoKeyRepeat(unsigned short key, uint8_t time)
{
uint8_t key_index = PadGetKeyIndex(key);
if(key_index == NUMBER_OF_KEYS)
{
return false;
}
pad2_keys_repeat[key_index]++;
if(pad2_keys_repeat[key_index] >= time)
{
pad2_keys_repeat[key_index] = 0;
return true;
}
return false;
}
void PadOneVibrationHandler(void)
{
if(PadOneIsVibrationEnabled() == true)
{
pad_enable_vibration(PAD_ONE);
pad_set_vibration(PAD_ONE,pad1_small_vibration_force,pad1_big_vibration_force);
pad1_vibration_timer--;
}
}
void PadTwoVibrationHandler(void)
{
if(PadTwoIsVibrationEnabled() == true)
{
pad_enable_vibration(PAD_TWO);
pad_set_vibration(PAD_TWO,pad2_small_vibration_force,pad2_big_vibration_force);
pad2_vibration_timer--;
}
}
bool PadOneIsVibrationEnabled(void)
{
return (pad1_vibration_timer & true);
}
bool PadTwoIsVibrationEnabled(void)
{
return (pad2_vibration_timer & true);
}
bool UpdatePads(void)
{
PadOneVibrationHandler();
PadTwoVibrationHandler();
PadCheatHandler(PAD_ONE);
PadCheatHandler(PAD_TWO);
// Get now-old pad data
previous_pad1 = pad1;
previous_pad2 = pad2;
PSX_ReadPad(&pad1,&pad2);
if(PadOneConnected() == false)
{
return false;
}
if(!(previous_pad1 & pad1) )
{
pad1_last_key_single_pressed = pad1;
}
else
{
pad1_last_key_single_pressed = 0;
}
if(!(previous_pad2 & pad2) )
{
pad2_last_key_single_pressed = pad2;
}
else
{
pad2_last_key_single_pressed = 0;
}
return true;
}
bool PadOneKeyReleased(unsigned short key)
{
return ( !(pad1 & key) && (previous_pad1 & key) );
}
bool PadTwoKeyReleased(unsigned short key)
{
return ( !(pad2 & key) && (previous_pad2 & key) );
}
uint8_t PadGetKeyIndex(unsigned short key)
{
switch(key)
{
case PAD_CROSS:
return PAD_CROSS_INDEX;
break;
case PAD_SQUARE:
return PAD_SQUARE_INDEX;
break;
case PAD_TRIANGLE:
return PAD_TRIANGLE_INDEX;
break;
case PAD_CIRCLE:
return PAD_CIRCLE_INDEX;
break;
case PAD_DOWN:
return PAD_DOWN_INDEX;
break;
case PAD_LEFT:
return PAD_LEFT_INDEX;
break;
case PAD_UP:
return PAD_UP_INDEX;
break;
case PAD_RIGHT:
return PAD_RIGHT_INDEX;
break;
case PAD_L1:
return PAD_L1_INDEX;
break;
case PAD_R1:
return PAD_R1_INDEX;
break;
case PAD_L2:
return PAD_L2_INDEX;
break;
case PAD_R2:
return PAD_R2_INDEX;
break;
default:
return NUMBER_OF_KEYS;
break;
}
}
unsigned short* PadOneGetAddress(void)
{
return &pad1;
}
void PadClearData(void)
{
pad1 = 0;
pad2 = 0;
previous_pad1 = 0;
previous_pad2 = 0;
}
void PadInit(void)
{
pad1_cheat_timer = SystemCreateTimer(PAD_CHEAT_TIMEOUT,true /* Repeat flag */,&PadOneCleanCheatArray);
pad2_cheat_timer = SystemCreateTimer(PAD_CHEAT_TIMEOUT,true /* Repeat flag */,&PadTwoCleanCheatArray);
memset(cheatsArray,0, sizeof(cheatsArray));
}
void PadCheatHandler(uint8_t n_pad)
{
unsigned short available_keys[12] = { PAD_LEFT, PAD_RIGHT, PAD_UP, PAD_DOWN,
PAD_L2, PAD_R2, PAD_L1, PAD_R1,
PAD_TRIANGLE, PAD_CIRCLE, PAD_CROSS, PAD_SQUARE };
uint8_t i;
uint8_t keys_released = 0;
unsigned short key;
uint8_t j;
bool (*pressed_callback)(unsigned short);
void (*clean_callback)(void);
bool success = false;
unsigned short* cheat_array;
TYPE_TIMER* timer;
switch(n_pad)
{
case PAD_ONE:
pressed_callback = &PadOneKeySinglePress;
cheat_array = pad1_cheat_array;
clean_callback = &PadOneCleanCheatArray;
timer = pad1_cheat_timer;
break;
case PAD_TWO:
pressed_callback = &PadTwoKeySinglePress;
cheat_array = pad2_cheat_array;
clean_callback = &PadTwoCleanCheatArray;
timer = pad2_cheat_timer;
break;
default:
dprintf("Invalid pad called for PadCheatHandler()!\n");
return;
}
for(i = 0; i < PAD_MAX_CHEATS; i++)
{
if(cheatsArray[i] != NULL)
{
if(SystemArrayCompare(cheat_array, cheatsArray[i]->Combination, CHEAT_ARRAY_SIZE) == true)
{
if(cheatsArray[i]->Callback != NULL)
{
if(clean_callback != NULL)
{
clean_callback();
}
cheatsArray[i]->Callback();
return;
}
}
}
}
for(i = 0; i < sizeof(available_keys) / sizeof(unsigned short); i++)
{
if(pressed_callback(available_keys[i]) == true)
{
SystemTimerRestart(timer);
key = available_keys[i];
keys_released++;
}
}
if(keys_released != 1)
{
return;
}
// Check for full array (return success = true if an empty array
// element was found.
for(j = 0; j < CHEAT_ARRAY_SIZE; j++)
{
if(cheat_array[j] == 0)
{
success = true;
break;
}
}
if(success == false)
{
if(clean_callback != NULL)
{
// Overrun
clean_callback();
}
}
cheat_array[j] = key;
}
bool PadAddCheat(TYPE_CHEAT * cheat)
{
static uint8_t idx = 0;
if(idx >= PAD_MAX_CHEATS)
{
dprintf("Maximum number of cheats exceeded!\n");
return false;
}
cheatsArray[idx++] = cheat;
return true;
}
void PadOneCleanCheatArray(void)
{
memset(pad1_cheat_array,0,sizeof(unsigned short) * CHEAT_ARRAY_SIZE);
}
void PadTwoCleanCheatArray(void)
{
memset(pad2_cheat_array,0,sizeof(unsigned short) * CHEAT_ARRAY_SIZE);
}
unsigned short* PadGetPlayerOneCheatArray(void)
{
return pad1_cheat_array;
}
unsigned short PadOneGetLastKeySinglePressed(void)
{
return pad1_last_key_single_pressed;
}
unsigned short PadTwoGetLastKeySinglePressed(void)
{
return pad2_last_key_single_pressed;
}

View File

@ -1,62 +0,0 @@
#ifndef __PAD_HEADER__
#define __PAD_HEADER__
/* *************************************
* Includes
* *************************************/
#include "Global_Inc.h"
#include "System.h"
#include "GameStructures.h"
/* *************************************
* Defines
* *************************************/
#define PAD_ALWAYS_REPEAT 1
/* *************************************
* Global prototypes
* *************************************/
void PadInit(void);
void PadClearData(void);
bool PadOneConnected(void);
bool PadOneAnyKeyPressed(void);
bool PadTwoAnyKeyPressed(void);
bool PadOneKeyPressed(unsigned short key);
bool PadTwoKeyPressed(unsigned short key);
bool PadOneKeyRepeat(unsigned short key, uint8_t time);
bool PadTwoKeyRepeat(unsigned short key, uint8_t time);
bool PadOneKeyReleased(unsigned short key);
bool PadTwoKeyReleased(unsigned short key);
bool PadOneKeySinglePress(unsigned short key);
bool PadTwoKeySinglePress(unsigned short key);
unsigned short PadOneGetLastKeySinglePressed(void);
unsigned short PadTwoGetLastKeySinglePressed(void);
bool PadOneDirectionKeyPressed(void);
bool PadTwoDirectionKeyPressed(void);
bool PadOneDirectionKeyReleased(void);
bool PadTwoDirectionKeyReleased(void);
bool UpdatePads(void);
bool PadOneIsVibrationEnabled(void);
bool PadTwoIsVibrationEnabled(void);
bool PadAddCheat(TYPE_CHEAT * cheat);
unsigned short* PadGetPlayerOneCheatArray(void);
// Experimental (to be removed)
unsigned short* PadOneGetAddress(void);
#endif //__PAD_HEADER__

View File

@ -80,16 +80,28 @@ void ISR_Serial(void)
SERIAL_STATE_TEXT_Y = Y_SCREEN_RESOLUTION >> 1,
};
if((GfxIsGPUBusy() == true) || (serial_busy == true) )
SystemIncreaseGlobalTimer();
if( (GfxIsGPUBusy() == true) || (SystemIsBusy() == true) )
{
return;
}
GsSortGPoly4(&SerialBg);
FontSetFlags(&SmallFont, FONT_BLEND_EFFECT | FONT_H_CENTERED);
GfxSetGlobalLuminance(0);
if(SerialState == SERIAL_STATE_READING_EXE_DATA)
{
if(System1SecondTick() == false)
{
return;
}
else
{
FontSetFlags(&SmallFont, FONT_H_CENTERED);
}
}
GsSortGPoly4(&SerialBg);
switch(SerialState)
{
@ -130,7 +142,7 @@ void ISR_Serial(void)
break;
}
FontSetFlags(&SmallFont, FONT_NOFLAGS);
FontSetFlags(&SmallFont, FONT_H_CENTERED);
if(RAMDest_Address != 0)
{
@ -174,12 +186,10 @@ void SerialInit(void)
{
uint8_t receivedBytes;
SerialState = SERIAL_STATE_INIT;
dprintf("SerialInit...\n");
SetVBlankHandler(&ISR_Serial);
SerialState = SERIAL_STATE_INIT;
SIOStart(SERIAL_BAUDRATE);
SerialState = SERIAL_STATE_STANDBY;
@ -195,7 +205,6 @@ void SerialInit(void)
if(receivedBytes != 99)
{
dprintf("Did not receive input magic number!\n");
SetVBlankHandler(&ISR_SystemDefaultVBlank);
return;
}
@ -217,11 +226,10 @@ bool SerialRead(uint8_t* ptrArray, size_t nBytes)
totalBytes = nBytes;
serial_busy = true;
SystemDisableVBlankInterrupt();
if(nBytes == 0)
{
dprintf("SerialRead: invalid size %d\n", nBytes);
SerialWrite("SerialRead: invalid size %d\n", strnlen("SerialRead: invalid size %d\n", 30));
return false;
}
@ -237,19 +245,18 @@ bool SerialRead(uint8_t* ptrArray, size_t nBytes)
serial_busy = false;
SystemEnableVBlankInterrupt();
return true;
}
bool SerialWrite(void* ptrArray, size_t nBytes)
{
serial_busy = true;
SystemDisableVBlankInterrupt();
if(nBytes == 0)
{
dprintf("SerialWrite: invalid size %d\n", nBytes);
SerialWrite("SerialRead: invalid size %d\n", strnlen("SerialRead: invalid size %d\n", 30));
return false;
}
@ -263,9 +270,9 @@ bool SerialWrite(void* ptrArray, size_t nBytes)
}while(--nBytes);
serial_busy = false;
SystemEnableVBlankInterrupt();
serial_busy = false;
return true;
}

View File

@ -13,13 +13,12 @@
#define END_STACK_PATTERN (uint32_t) 0x18022015
#define BEGIN_STACK_ADDRESS (uint32_t*) 0x801FFF00
#define STACK_SIZE 0x1000
#define I_MASK (*(unsigned int*)0x1F801074)
#define I_MASK (*(volatile unsigned int*)0x1F801074)
/* *************************************
* Local Prototypes
* *************************************/
static void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step);
static void SystemSetStackPattern(void);
/* *************************************
@ -36,14 +35,8 @@ static bool rand_seed;
static volatile bool refresh_needed;
//Timers
static bool one_second_timer;
static bool hundred_ms_timer;
static bool five_hundred_ms_timer;
//Emergency mode flag. Toggled on pad connected/disconnected
static bool emergency_mode;
//Critical section is entered (i.e.: when accessing fopen() or other BIOS functions
static volatile bool system_busy;
//Timer array.
static TYPE_TIMER timer_array[SYSTEM_MAX_TIMERS];
/* *******************************************************************
*
@ -77,10 +70,6 @@ void SystemInit(void)
#endif //_PAL_MODE_
//SPU init
SsInit();
//Reset all user-handled timers
SystemResetTimers();
//Pads init
PadInit();
//Set Drawing Environment
GfxInitDrawEnv();
//Set Display Environment
@ -251,92 +240,7 @@ void SystemDisableScreenRefresh(void)
bool System1SecondTick(void)
{
return one_second_timer;
}
/* *******************************************************************
*
* @name: bool System100msTick(void)
*
* @author: Xavier Del Campo
*
* @return: bool variable with a 1-cycle-length pulse that gets
* set every 100 milliseconds.
*
* *******************************************************************/
bool System100msTick(void)
{
return hundred_ms_timer;
}
/* *******************************************************************
*
* @name bool System500msTick(void)
*
* @author: Xavier Del Campo
*
* @return: bool variable with a 1-cycle-length pulse that gets
* set every 500 milliseconds.
*
* *******************************************************************/
bool System500msTick(void)
{
return five_hundred_ms_timer;
}
/* *******************************************************************
*
* @name void SystemRunTimers(void)
*
* @author: Xavier Del Campo
*
* @brief: general timer handler
*
* @remarks: 1 second, 500 ms and 100 ms ticks get updated here.
*
* *******************************************************************/
void SystemRunTimers(void)
{
static uint64_t last_one_second_tick;
static uint64_t last_100_ms_tick;
static uint64_t last_500_ms_tick;
SystemCheckTimer(&one_second_timer, &last_one_second_tick, REFRESH_FREQUENCY);
#ifdef _PAL_MODE_
SystemCheckTimer(&hundred_ms_timer, &last_100_ms_tick, 2 /* 2 * 50 ms = 100 ms */);
SystemCheckTimer(&five_hundred_ms_timer, &last_500_ms_tick, 10 /* 10 * 50 ms = 500 ms */);
#else // _PAL_MODE_
SystemCheckTimer(&hundred_ms_timer, &last_100_ms_tick, 3);
#endif // _PAL_MODE_
}
/* ********************************************************************************
*
* @name void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step)
*
* @author: Xavier Del Campo
*
* @brief: Checks if needed time step has been elapsed. If true, flag gets set.
*
* *******************************************************************************/
void SystemCheckTimer(bool* timer, uint64_t* last_timer, uint8_t step)
{
if(*timer == true)
{
*timer = false;
}
if(global_timer >= (*last_timer + step) )
{
*timer = true;
*last_timer = global_timer;
}
return !(global_timer % REFRESH_FREQUENCY);
}
/* ****************************************************************************************
@ -459,23 +363,6 @@ void SystemClearBuffer(void)
memset(file_buffer, 0, sizeof(file_buffer));
}
/* ******************************************************************
*
* @name void SystemWaitCycles(uint32_t cycles)
*
* @author: Xavier Del Campo
*
* @return: halts program execution for n-"cycles"
*
* *****************************************************************/
void SystemWaitCycles(uint32_t cycles)
{
uint64_t currentTime = global_timer;
while(global_timer < (currentTime + cycles) );
}
/* ******************************************************************
*
* @name uint32_t SystemRand(uint32_t min, uint32_t max)
@ -494,38 +381,6 @@ uint32_t SystemRand(uint32_t min, uint32_t max)
return rand() % (max - min + 1) + min;
}
/* ***********************************************************************
*
* @name void SystemSetEmergencyMode(bool value)
*
* @author: Xavier Del Campo
*
* @brief: Sets emergency mode flag.
*
* @remarks: emergency mode is set once that a controller is unplugged.
*
* ***********************************************************************/
void SystemSetEmergencyMode(bool value)
{
emergency_mode = value;
}
/* ***********************************************************************
*
* @name bool SystemGetEmergencyMode(void)
*
* @author: Xavier Del Campo
*
* @return: returns emergency mode flag.
*
* ***********************************************************************/
bool SystemGetEmergencyMode(void)
{
return emergency_mode;
}
/* ***********************************************************************
*
* @name volatile bool SystemIsBusy(void)
@ -541,211 +396,6 @@ volatile bool SystemIsBusy(void)
return system_busy;
}
/* ****************************************************************************
*
* @name bool SystemContains_u8(uint8_t value, uint8_t* buffer, size_t sz)
*
* @author: Xavier Del Campo
*
* @brief: checks if a certain value is contained in a buffer with size "sz".
*
* @return: true if value is contained inside buffer, false otherwise.
*
* ****************************************************************************/
bool SystemContains_u8(uint8_t value, uint8_t* buffer, size_t sz)
{
size_t i = 0;
for(i = 0; i < sz; i++)
{
if(buffer[i] == value)
{
return true;
}
}
return false;
}
/* ****************************************************************************
*
* @name bool SystemContains_u16(uint16_t value, uint16_t* buffer, size_t sz)
*
* @author: Xavier Del Campo
*
* @brief: checks if a certain value is contained in a buffer with size "sz".
* Variant for u16 variables.
*
* @return: true if value is contained inside buffer, false otherwise.
*
* ****************************************************************************/
bool SystemContains_u16(uint16_t value, uint16_t* buffer, size_t sz)
{
size_t i = 0;
for(i = 0; i < sz; i++)
{
if(buffer[i] == value)
{
return true;
}
}
return false;
}
/* ********************************************************************************************
*
* @name TYPE_TIMER* SystemCreateTimer(uint32_t t, bool rf, void (*timer_callback)(void) )
*
* @author: Xavier Del Campo
*
* @brief: fills a TYPE_TIMER structure with input parameters
*
* @param: uint32_t t:
* Timeout value (1 unit = 10 ms)
* bool rf:
* Repeat flag
* void (*timer_callback)(void)
* Function to be called on timeout
*
* @return: pointer to TYPE_TIMER structure if filled correctly, NULL pointer otherwise.
*
* ********************************************************************************************/
TYPE_TIMER* SystemCreateTimer(uint32_t t, bool rf, void (*timer_callback)(void) )
{
bool success = false;
uint8_t i;
if(t == 0)
{
dprintf("Cannot create timer with time == 0!\n");
return NULL;
}
for(i = 0; i < SYSTEM_MAX_TIMERS; i++)
{
if(timer_array[i].busy == false)
{
timer_array[i].Timeout_Callback = timer_callback;
timer_array[i].time = t;
timer_array[i].orig_time = t;
timer_array[i].repeat_flag = rf;
timer_array[i].busy = true;
success = true;
break;
}
}
if(success == false)
{
dprintf("Could not find any free timer!\n");
return NULL;
}
return &timer_array[i];
}
/* *******************************************
*
* @name void SystemResetTimers(void)
*
* @author: Xavier Del Campo
*
* @brief: reportedly, removes all timers.
*
* *******************************************/
void SystemResetTimers(void)
{
uint8_t i;
for(i = 0; i < SYSTEM_MAX_TIMERS; i++)
{
SystemTimerRemove(&timer_array[i]);
}
}
/* *****************************************************
*
* @name void SystemUserTimersHandler(void)
*
* @author: Xavier Del Campo
*
* @brief: reportedly, handles all available timers.
*
* @remarks: calls callback on timeout.
*
* *****************************************************/
void SystemUserTimersHandler(void)
{
uint8_t i;
for(i = 0; i < SYSTEM_MAX_TIMERS; i++)
{
if(timer_array[i].busy == true)
{
if(System100msTick() == true)
{
timer_array[i].time--;
if(timer_array[i].time == 0)
{
timer_array[i].Timeout_Callback();
if(timer_array[i].repeat_flag == true)
{
timer_array[i].time = timer_array[i].orig_time;
}
}
}
}
}
}
/* *********************************************************************
*
* @name void SystemUserTimersHandler(void)
*
* @author: Xavier Del Campo
*
* @brief: sets time left for TYPE_TIMER instance to initial value.
*
* @remarks: specially used when TYPE_TIMER.rf is enabled.
*
* *********************************************************************/
void SystemTimerRestart(TYPE_TIMER* timer)
{
timer->time = timer->orig_time;
}
/* *********************************************************************
*
* @name void SystemTimerRemove(TYPE_TIMER* timer)
*
* @author: Xavier Del Campo
*
* @brief: Resets timer parameters to default values so timer instance
* can be recycled.
*
* @remarks:
*
* *********************************************************************/
void SystemTimerRemove(TYPE_TIMER* timer)
{
timer->time = 0;
timer->orig_time = 0;
timer->Timeout_Callback = NULL;
timer->busy = false;
timer->repeat_flag = false;
}
bool SystemArrayCompare(unsigned short* arr1, unsigned short* arr2, size_t sz)
{
size_t i;
@ -826,62 +476,18 @@ int32_t SystemIndexOfStringArray(char* str, char** array)
return -1;
}
int32_t SystemIndexOf_U16(uint16_t value, uint16_t* array, uint32_t sz)
{
int32_t i;
for(i = 0; i < sz; i++)
{
if(value == array[i])
{
return i;
}
}
return -1;
}
int32_t SystemIndexOf_U8(uint8_t value, uint8_t* array, uint32_t from, uint32_t sz)
{
int32_t i;
for(i = from; i < sz; i++)
{
if(value == array[i])
{
return i;
}
}
return -1;
}
void SystemCyclicHandler(void)
{
if(UpdatePads() == false)
{
SystemSetEmergencyMode(true);
}
else
{
SystemSetEmergencyMode(false);
}
SystemRunTimers();
SystemUserTimersHandler();
{
SystemDisableScreenRefresh();
SystemCheckStack();
}
void SystemDisableVBlankInterrupt(void)
{
I_MASK &= ~(0x0001);
I_MASK &= ~(0x00000001);
}
void SystemEnableVBlankInterrupt(void)
{
I_MASK |= (0x0001);
I_MASK |= (0x00000001);
}

View File

@ -52,9 +52,6 @@ bool SystemIsRandSeedSet(void);
// Stops program flow during X cycles
void SystemWaitCycles(uint32_t cycles);
// To be called from GfxDrawScene after each cycle
void SystemRunTimers(void);
// 1 cycle-length flag with a frequency of 1 Hz
bool System1SecondTick(void);
@ -88,26 +85,12 @@ bool SystemContains_u8(uint8_t value, uint8_t* buffer, size_t sz);
// Overload for uint16_t
bool SystemContains_u16(uint16_t value, uint16_t* buffer, size_t sz);
// Creates a timer instance wiht a determined value and associates it to a callback
// Once time expires, callback is automatically called right after GfxDrawScene().
// Time is expressed so that t = 100 ms e.g.: 2 seconds = 20.
TYPE_TIMER* SystemCreateTimer(uint32_t t, bool rf, void (*timer_callback)(void) );
// Reportedly, sets all timer data to zero.
void SystemResetTimers(void);
// To be called every cycle (i.e.: inside GfxDrawScene() ).
void SystemUserTimersHandler(void);
// Sets timer remaining time to initial value.
void SystemTimerRestart(TYPE_TIMER* timer);
// Flushes a timer pointed to by timer.
void SystemTimerRemove(TYPE_TIMER* timer);
// Compares two arrays of unsigned short type.
bool SystemArrayCompare(unsigned short* arr1, unsigned short* arr2, size_t sz);
// Looks for string "str" inside a string array pointed to by "array".
// Returns index inside string array on success, -1 if not found.
int32_t SystemIndexOfStringArray(char* str, char** array);

View File

@ -54,6 +54,8 @@ int main(void)
uint32_t i;
void (*exeAddress)(void);
GfxSetGlobalLuminance(0);
SerialInit();
// Read PSX-EXE header (32 bytes will be enough).
@ -117,8 +119,6 @@ int main(void)
SerialSetState(SERIAL_STATE_READING_EXE_DATA);
SystemDisableVBlankInterrupt();
while(GfxIsGPUBusy() == true);
for(i = 0; i < ExeSize; i += EXE_DATA_PACKET_SIZE)
@ -143,16 +143,14 @@ int main(void)
SerialWrite(ACK_BYTE_STRING, sizeof(uint8_t)); // Write ACK
}
SystemEnableVBlankInterrupt();
//SystemLoadFileToBuffer("cdrom:\\AIRPORT.EXE;1", 2048, (uint8_t*)0x80010000, (uint32_t) (0x801A0000 - 0x80010000) );
SetVBlankHandler(&ISR_SystemDefaultVBlank);
// Make a pretty animation before exeting OpenSend application.
EndAnimation();
PSX_DeInit();
// PSX-EXE has been successfully loaded into RAM. Run executable!
//dprintf("Entering exe...\n");