mirror of
https://github.com/libretro/Mu.git
synced 2026-09-24 15:46:20 +00:00
Now compiles, has hex ram/rom browser
This commit is contained in:
@@ -11,8 +11,8 @@ CREATORID="guiC"
|
||||
RESFILE=$APPNAME.rcp
|
||||
PRC=$APPNAME.prc
|
||||
|
||||
SRCS="testSuite.c viewer.c ugui.c"
|
||||
DEFINES="-DHW_TEST"
|
||||
SRCS="testSuite.c viewer.c tests.c ugui.c snprintf.c"
|
||||
DEFINES="-DHW_TEST -DNEED_SNPRINTF_ONLY"
|
||||
CFLAGS="-O2 -g $DEFINES $INCLUDES"
|
||||
|
||||
if [ "$1" = "clean" ]; then
|
||||
|
||||
1025
hwTestSuite/snprintf.c
Normal file
1025
hwTestSuite/snprintf.c
Normal file
File diff suppressed because it is too large
Load Diff
26
hwTestSuite/snprintf.h
Normal file
26
hwTestSuite/snprintf.h
Normal file
@@ -0,0 +1,26 @@
|
||||
#ifndef _PORTABLE_SNPRINTF_H_
|
||||
#define _PORTABLE_SNPRINTF_H_
|
||||
|
||||
#define PORTABLE_SNPRINTF_VERSION_MAJOR 2
|
||||
#define PORTABLE_SNPRINTF_VERSION_MINOR 2
|
||||
|
||||
#ifdef HAVE_SNPRINTF
|
||||
#include <stdio.h>
|
||||
#else
|
||||
extern int snprintf(char *, size_t, const char *, /*args*/ ...);
|
||||
extern int vsnprintf(char *, size_t, const char *, va_list);
|
||||
#endif
|
||||
|
||||
#if defined(HAVE_SNPRINTF) && defined(PREFER_PORTABLE_SNPRINTF)
|
||||
extern int portable_snprintf(char *str, size_t str_m, const char *fmt, /*args*/ ...);
|
||||
extern int portable_vsnprintf(char *str, size_t str_m, const char *fmt, va_list ap);
|
||||
#define snprintf portable_snprintf
|
||||
#define vsnprintf portable_vsnprintf
|
||||
#endif
|
||||
|
||||
extern int asprintf (char **ptr, const char *fmt, /*args*/ ...);
|
||||
extern int vasprintf (char **ptr, const char *fmt, va_list ap);
|
||||
extern int asnprintf (char **ptr, size_t str_m, const char *fmt, /*args*/ ...);
|
||||
extern int vasnprintf(char **ptr, size_t str_m, const char *fmt, va_list ap);
|
||||
|
||||
#endif
|
||||
@@ -37,6 +37,9 @@ uint32_t getVarDataLength(var thisVar){
|
||||
void* getVarPointer(var thisVar){
|
||||
return (void*)(thisVar.value & 0xFFFFFFFF);
|
||||
}
|
||||
uint32_t getVarPointerSize(var thisVar){
|
||||
return thisVar.value >> 32;
|
||||
}
|
||||
var_value getVarValue(var thisVar){
|
||||
return thisVar.value;
|
||||
}
|
||||
@@ -67,6 +70,25 @@ Boolean getButtonReleased(uint16_t button){
|
||||
return !(palmButtonsLastFrame & button) && (palmButtonsLastFrame & button);
|
||||
}
|
||||
|
||||
uint8_t readArbitraryMemory8(uint32_t address){
|
||||
return *((uint8_t*)address);
|
||||
}
|
||||
uint16_t readArbitraryMemory16(uint32_t address){
|
||||
return *((uint16_t*)address);
|
||||
}
|
||||
uint32_t readArbitraryMemory32(uint32_t address){
|
||||
return *((uint32_t*)address);
|
||||
}
|
||||
void writeArbitraryMemory8(uint32_t address, uint8_t value){
|
||||
*((uint8_t*)address) = value;
|
||||
}
|
||||
void writeArbitraryMemory16(uint32_t address, uint16_t value){
|
||||
*((uint16_t*)address) = value;
|
||||
}
|
||||
void writeArbitraryMemory32(uint32_t address, uint32_t value){
|
||||
*((uint32_t*)address) = value;
|
||||
}
|
||||
|
||||
|
||||
/*exports*/
|
||||
uint16_t palmButtons;
|
||||
@@ -88,6 +110,7 @@ static uint32_t subprogramIndex;
|
||||
static activity_t currentSubprogram;
|
||||
static var subprogramData[MAX_SUBPROGRAMS];
|
||||
static var subprogramArgs;/*optional arguments when one subprogram calls another*/
|
||||
static var lastSubprogramReturnValue;
|
||||
static Boolean subprogramArgsSet;
|
||||
static Boolean applicationRunning;
|
||||
|
||||
@@ -160,6 +183,18 @@ void exitSubprogram(){
|
||||
}
|
||||
}
|
||||
|
||||
void execSubprogram(activity_t activity){
|
||||
if(!subprogramArgsSet)
|
||||
subprogramArgs = makeVar(LENGTH_0, TYPE_NULL, 0);
|
||||
subprogramArgsSet = false;/*clear to prevent next subprogram called from inheriting the args*/
|
||||
parentSubprograms[subprogramIndex] = activity;
|
||||
currentSubprogram = activity;
|
||||
}
|
||||
|
||||
var getSubprogramReturnValue(){
|
||||
return lastSubprogramReturnValue;
|
||||
}
|
||||
|
||||
var getSubprogramArgs(){
|
||||
return subprogramArgs;
|
||||
}
|
||||
@@ -215,10 +250,18 @@ void testerInit(){
|
||||
UG_Init(&uguiStruct, uguiDrawPixel, 160, 160);
|
||||
UG_SetBackcolor(C_WHITE);
|
||||
UG_SetForecolor(C_BLACK);
|
||||
UG_ConsoleSetBackcolor(C_WHITE);
|
||||
UG_ConsoleSetForecolor(C_BLACK);
|
||||
|
||||
//make test list, c89 again
|
||||
initTestList();
|
||||
|
||||
//load first subprogram
|
||||
subprogramIndex = 0;
|
||||
subprogramArgsSet = false;
|
||||
currentSubprogram = testViewer;
|
||||
lastSubprogramReturnValue = makeVar(LENGTH_0, TYPE_NULL, 0);
|
||||
subprogramArgs = makeVar(LENGTH_0, TYPE_NULL, 0);
|
||||
currentSubprogram = testPicker;
|
||||
}
|
||||
|
||||
void testerExit(){
|
||||
@@ -232,7 +275,7 @@ void testerExit(){
|
||||
void testerFrameLoop(){
|
||||
palmButtons = KeyCurrentState();
|
||||
|
||||
currentSubprogram();
|
||||
lastSubprogramReturnValue = currentSubprogram();
|
||||
|
||||
palmButtonsLastFrame = palmButtons;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
#define TYPE_UINT 0x01
|
||||
#define TYPE_INT 0x02
|
||||
#define TYPE_FLOAT 0x03
|
||||
#define TYPE_POINTER 0x04
|
||||
#define TYPE_PTR 0x04
|
||||
#define LENGTH_0 0x00/*for null*/
|
||||
#define LENGTH_1 0x10
|
||||
#define LENGTH_8 0x20
|
||||
@@ -26,6 +26,7 @@
|
||||
#define LENGTH_32 0x40
|
||||
#define LENGTH_64 0x50
|
||||
#define LENGTH_PTR 0x60/*first half of 64bit value is length, second is pointer*/
|
||||
#define LENGTH_ANY 0x70/*for pointers with a user defined end or no end*/
|
||||
#define LENGTH_STR 0xF0/*for pointers to string*/
|
||||
|
||||
|
||||
@@ -40,9 +41,10 @@ typedef struct{
|
||||
typedef var (*activity_t)();
|
||||
|
||||
typedef struct{
|
||||
char name[32];
|
||||
Boolean isSimpleTest;/*if simple run once, if complex take control over user input and runloop*/
|
||||
var expectedResult;
|
||||
activity_t callTest;
|
||||
activity_t testFunction;
|
||||
}test_t;
|
||||
|
||||
|
||||
@@ -81,18 +83,28 @@ uint8_t getVarType(var thisVar);
|
||||
uint8_t getVarLength(var thisVar);
|
||||
uint32_t getVarDataLength(var thisVar);
|
||||
void* getVarPointer(var thisVar);
|
||||
uint32_t getVarPointerSize(var thisVar);
|
||||
var_value getVarValue(var thisVar);
|
||||
var makeVar(uint8_t length, uint8_t type, uint64_t value);
|
||||
Boolean varsEqual(var var1, var var2);
|
||||
|
||||
uint8_t readArbitraryMemory8(uint32_t address);
|
||||
uint16_t readArbitraryMemory16(uint32_t address);
|
||||
uint32_t readArbitraryMemory32(uint32_t address);
|
||||
void writeArbitraryMemory8(uint32_t address, uint8_t value);
|
||||
void writeArbitraryMemory16(uint32_t address, uint16_t value);
|
||||
void writeArbitraryMemory32(uint32_t address, uint32_t value);
|
||||
|
||||
void callSubprogram(activity_t activity);
|
||||
void exitSubprogram();
|
||||
void execSubprogram(activity_t activity);/*replace current subprogram with a new one*/
|
||||
var getSubprogramReturnValue();
|
||||
var getSubprogramArgs();
|
||||
void setSubprogramArgs(var args);
|
||||
var subprogramGetData();/*for subprograms to get data they stored*/
|
||||
void subprogramSetData(var data);/*for subprograms to save data when calling a new subprogram*/
|
||||
|
||||
/*special subprograms*/
|
||||
var memoryAllocationError();
|
||||
|
||||
#endif
|
||||
|
||||
@@ -5,5 +5,6 @@
|
||||
#define SCREEN_HEIGHT 160
|
||||
|
||||
#define MAX_SUBPROGRAMS 20
|
||||
#define TESTS_AVAILABLE 20
|
||||
|
||||
#endif
|
||||
|
||||
49
hwTestSuite/tests.c
Normal file
49
hwTestSuite/tests.c
Normal file
@@ -0,0 +1,49 @@
|
||||
#include <stdio.h>
|
||||
#include "testSuite.h"
|
||||
#include "viewer.h"
|
||||
#include "ugui.h"
|
||||
|
||||
var hexRamBrowser(){
|
||||
static Boolean clearScreen = true;
|
||||
static uint32_t column = 0;/*what column to change with up/down keys*/
|
||||
static uint32_t pointerValue = 0x00000000;
|
||||
static char hexString[32];
|
||||
|
||||
if(getButtonPressed(buttonUp)){
|
||||
pointerValue += 0x1 << (4 * (7 - column));
|
||||
}
|
||||
|
||||
if(getButtonPressed(buttonDown)){
|
||||
pointerValue -= 0x1 << (4 * (7 - column));
|
||||
}
|
||||
|
||||
if(getButtonPressed(buttonLeft)){
|
||||
if(column > 0)
|
||||
column--;
|
||||
}
|
||||
|
||||
if(getButtonPressed(buttonRight)){
|
||||
if(column < 7)
|
||||
column++;
|
||||
}
|
||||
|
||||
if(getButtonPressed(buttonSelect)){
|
||||
/*open hex viewer*/
|
||||
clearScreen = true;
|
||||
setSubprogramArgs(makeVar(LENGTH_ANY, TYPE_PTR, pointerValue));/*length doesnt matter*/
|
||||
execSubprogram(hexViewer);
|
||||
}
|
||||
|
||||
if(getButtonPressed(buttonBack)){
|
||||
clearScreen = true;
|
||||
exitSubprogram();
|
||||
}
|
||||
|
||||
snprintf(hexString, 32, "Open Hex Viewer At:0x%08X", pointerValue);
|
||||
|
||||
if(clearScreen){
|
||||
UG_FillScreen(C_WHITE);
|
||||
clearScreen = false;
|
||||
}
|
||||
UG_PutString(0, 0, hexString);
|
||||
}
|
||||
8
hwTestSuite/tests.h
Normal file
8
hwTestSuite/tests.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef TESTS_HEADER
|
||||
#define TESTS_HEADER
|
||||
|
||||
#include "testSuite.h"
|
||||
|
||||
|
||||
var hexRamBrowser();
|
||||
#endif
|
||||
@@ -1,49 +1,117 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "testSuiteConfig.h"
|
||||
#include "testSuite.h"
|
||||
#include "snprintf.h"
|
||||
#include "tests.h"
|
||||
#include "ugui.h"
|
||||
|
||||
|
||||
#define MAX_OBJECTS 50
|
||||
|
||||
#define FONT_WIDTH 8
|
||||
#define FONT_HEIGHT 8
|
||||
#define FONT_SPACING 0
|
||||
|
||||
#define MAX_OBJECTS 50
|
||||
#define RESERVED_PIXELS_Y (SCREEN_HEIGHT / 4)/*save pixels at the bottom of the screen for other information on the current item*/
|
||||
|
||||
#define TEXTBOX_PIXEL_MARGIN 1 /*add 1 pixel border around text*/
|
||||
#define TEXTBOX_PIXEL_WIDTH (SCREEN_WIDTH / 4 * 3) /*3/4 of the screen*/
|
||||
#define TEXTBOX_PIXEL_HEIGHT (FONT_HEIGHT + (TEXTBOX_PIXEL_MARGIN * 2))
|
||||
#define TEXTBOX_DEFAULT_COLOR C_WHITE
|
||||
#define TEXTBOX_PIXEL_MARGIN 1 /*add 1 pixel border around text*/
|
||||
#define TEXTBOX_PIXEL_WIDTH SCREEN_WIDTH
|
||||
#define TEXTBOX_PIXEL_HEIGHT (FONT_HEIGHT + (TEXTBOX_PIXEL_MARGIN * 2))
|
||||
#define TEXTBOX_DEFAULT_COLOR C_WHITE
|
||||
#define TEXTBOX_DEFAULT_TEXT_COLOR C_BLACK
|
||||
#define TEXTBOX_CURSOR_COLOR C_BLACK
|
||||
#define TEXTBOX_CURSOR_TEXT_COLOR C_WHITE
|
||||
#define TEXTBOX_CURSOR_COLOR C_BLACK
|
||||
#define TEXTBOX_CURSOR_TEXT_COLOR C_WHITE
|
||||
|
||||
#define ITEM_LIST_ENTRYS (SCREEN_HEIGHT / TEXTBOX_PIXEL_HEIGHT - 1)
|
||||
#define ITEM_LIST_ENTRYS ((SCREEN_HEIGHT - RESERVED_PIXELS_Y) / TEXTBOX_PIXEL_HEIGHT - 1)
|
||||
#define ITEM_STRING_SIZE (TEXTBOX_PIXEL_WIDTH / (FONT_WIDTH + FONT_SPACING))
|
||||
|
||||
|
||||
Boolean viewerInitialized = false;
|
||||
int32_t listLength;
|
||||
int32_t selectedEntry;
|
||||
|
||||
UG_GUI fbGui;
|
||||
UG_WINDOW fbWindow;
|
||||
UG_OBJECT fbObjects[MAX_OBJECTS];
|
||||
UG_TEXTBOX listEntrys[ITEM_LIST_ENTRYS];
|
||||
char textboxString[ITEM_LIST_ENTRYS][ITEM_STRING_SIZE];
|
||||
#define LIST_REFRESH 0
|
||||
#define LIST_ITEM_SELECTED 1
|
||||
|
||||
|
||||
/*tests*/
|
||||
static test_t hwTests[TESTS_AVAILABLE];
|
||||
static uint32_t totalHwTests;
|
||||
|
||||
/*graphics*/
|
||||
static UG_GUI fbGui;
|
||||
static UG_WINDOW fbWindow;
|
||||
static UG_OBJECT fbObjects[MAX_OBJECTS];
|
||||
static UG_TEXTBOX listEntrys[ITEM_LIST_ENTRYS];
|
||||
static char textboxString[ITEM_LIST_ENTRYS][ITEM_STRING_SIZE];
|
||||
|
||||
/*list handler variables*/
|
||||
static Boolean viewerInitialized = false;
|
||||
static uint32_t page = 0;
|
||||
static uint32_t index = 0;
|
||||
static uint32_t lastIndex = 0;
|
||||
static uint32_t lastPage = 0;
|
||||
static uint32_t listLength = 0;
|
||||
static uint32_t selectedEntry = 0;
|
||||
static Boolean forceListRefresh = true;
|
||||
static void (*listHandler)(uint32_t command);
|
||||
|
||||
/*specific handler variables*/
|
||||
static uint32_t bufferAddress;/*used to put the hex viewer in buffer mode instead of free roam*/
|
||||
|
||||
|
||||
/*functions*/
|
||||
static void windowCallback(UG_MESSAGE* message){
|
||||
/*do nothing*/
|
||||
}
|
||||
|
||||
static void forceTextEntryRefresh(uint32_t box){
|
||||
UG_TextboxSetText(&fbWindow, 0, textboxString[0]);
|
||||
}
|
||||
|
||||
static void hexHandler(uint32_t command){
|
||||
if(command == LIST_REFRESH){
|
||||
int i;
|
||||
uint32_t hexViewOffset = bufferAddress + selectedEntry;
|
||||
|
||||
/*fill strings*/
|
||||
for(i = 0; i < ITEM_LIST_ENTRYS; i++){
|
||||
snprintf(textboxString[i], ITEM_STRING_SIZE, "0x%08X:0x%02X", hexViewOffset - bufferAddress, readArbitraryMemory8(hexViewOffset));
|
||||
forceTextEntryRefresh(i);
|
||||
hexViewOffset++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void testPickerHandler(uint32_t command){
|
||||
if(command == LIST_REFRESH){
|
||||
int i;
|
||||
|
||||
/*fill strings*/
|
||||
for(i = 0; i < ITEM_LIST_ENTRYS; i++){
|
||||
if(i < totalHwTests){
|
||||
strncpy(textboxString[i], hwTests[i].name, ITEM_STRING_SIZE);
|
||||
}
|
||||
else{
|
||||
strncpy(textboxString[i], "Test List Overflow", ITEM_STRING_SIZE);
|
||||
}
|
||||
forceTextEntryRefresh(i);
|
||||
}
|
||||
}
|
||||
else if(command == LIST_ITEM_SELECTED){
|
||||
callSubprogram(hwTests[selectedEntry].testFunction);
|
||||
}
|
||||
}
|
||||
|
||||
static void resetListHandler(){
|
||||
page = 0;
|
||||
index = 0;
|
||||
lastIndex = 0;
|
||||
lastPage = 0;
|
||||
listLength = 0;
|
||||
selectedEntry = 0;
|
||||
forceListRefresh = true;
|
||||
}
|
||||
|
||||
static void listModeFrame(){
|
||||
int32_t page;
|
||||
int32_t index;
|
||||
static int32_t lastIndex = 0;
|
||||
static int32_t lastPage = 0;
|
||||
|
||||
if (getButtonPressed(buttonUp)){
|
||||
if(selectedEntry - 1 >= 0)
|
||||
if(selectedEntry > 0)
|
||||
selectedEntry--;
|
||||
}
|
||||
|
||||
@@ -63,22 +131,20 @@ static void listModeFrame(){
|
||||
if(selectedEntry + ITEM_LIST_ENTRYS < listLength)
|
||||
selectedEntry += ITEM_LIST_ENTRYS;/*flip the page*/
|
||||
else
|
||||
selectedEntry = listLength - 1;
|
||||
selectedEntry = listLength - ITEM_LIST_ENTRYS - 1;
|
||||
}
|
||||
|
||||
page = selectedEntry / ITEM_LIST_ENTRYS;
|
||||
index = selectedEntry % ITEM_LIST_ENTRYS;
|
||||
|
||||
/*
|
||||
if (page != last_page || index != last_index && list_handler){
|
||||
listLength = list_handler(page * ITEM_LIST_ENTRYS);
|
||||
if ((page != lastPage || index != lastIndex || forceListRefresh) && listHandler){
|
||||
listHandler(LIST_REFRESH);
|
||||
forceListRefresh = false;
|
||||
}
|
||||
*/
|
||||
|
||||
if (getButtonPressed(buttonSelect)){
|
||||
/*select*/
|
||||
/*run_action(list_index_action[index]);*/
|
||||
/*nothing yet*/
|
||||
listHandler(LIST_ITEM_SELECTED);
|
||||
}
|
||||
|
||||
if (getButtonPressed(buttonBack)){
|
||||
@@ -145,18 +211,27 @@ var hexViewer(){
|
||||
}
|
||||
|
||||
where = getSubprogramArgs();
|
||||
if(getVarType(where) == TYPE_POINTER){
|
||||
|
||||
|
||||
resetListHandler();
|
||||
listLength = getVarPointerSize(where);
|
||||
if(listLength){
|
||||
/*displaying a result buffer*/
|
||||
selectedEntry = 0;
|
||||
bufferAddress = (uint32_t)getVarPointer(where);
|
||||
}
|
||||
|
||||
/*make hex value list*/
|
||||
|
||||
else{
|
||||
/*free roam ram access*/
|
||||
selectedEntry = (uint32_t)getVarPointer(where);
|
||||
bufferAddress = 0;
|
||||
listLength = 0xFFFFFFFF;
|
||||
}
|
||||
listHandler = hexHandler;
|
||||
listModeFrame();
|
||||
|
||||
return makeVar(LENGTH_1, TYPE_BOOL, true);
|
||||
}
|
||||
|
||||
var testViewer(){
|
||||
var testPicker(){
|
||||
if(!viewerInitialized){
|
||||
var passFail = initViewer();
|
||||
if(varsEqual(passFail, makeVar(LENGTH_1, TYPE_BOOL, true))){
|
||||
@@ -166,9 +241,21 @@ var testViewer(){
|
||||
viewerInitialized = true;
|
||||
}
|
||||
|
||||
/*make test list*/
|
||||
|
||||
resetListHandler();
|
||||
listLength = totalHwTests;
|
||||
listHandler = testPickerHandler;
|
||||
listModeFrame();
|
||||
|
||||
return makeVar(LENGTH_1, TYPE_BOOL, true);
|
||||
}
|
||||
|
||||
void initTestList(){
|
||||
var nullVar = makeVar(LENGTH_0, TYPE_NULL, 0);
|
||||
|
||||
strncpy(hwTests[0].name, "Ram Browser", 32);
|
||||
hwTests[0].isSimpleTest = false;
|
||||
hwTests[0].expectedResult = nullVar;
|
||||
hwTests[0].testFunction = hexRamBrowser;
|
||||
|
||||
totalHwTests = 1;
|
||||
}
|
||||
|
||||
@@ -5,5 +5,6 @@
|
||||
|
||||
|
||||
var hexViewer();
|
||||
var testViewer();
|
||||
var testPicker();
|
||||
void initTestList();
|
||||
#endif
|
||||
|
||||
@@ -65,7 +65,7 @@ typedef struct{
|
||||
|
||||
//display chip addresses
|
||||
#define SED1376_REG_START_ADDRESS 0x1FF80000
|
||||
#define SED1376_FB_START_ADDRESS 0x1FFA0000
|
||||
#define SED1376_FB_START_ADDRESS 0x1FFA0000
|
||||
#define SED1376_REG_SIZE 0xB4//it has 0x20000 used address space entrys but only 0xB4 registers
|
||||
#define SED1376_FB_SIZE 0x14000//likely also has 0x20000 used address space entrys
|
||||
|
||||
|
||||
Reference in New Issue
Block a user