Now compiles, has hex ram/rom browser

This commit is contained in:
meepingsnesroms
2018-04-02 16:34:55 -07:00
parent 191ed06e60
commit 593c19d336
11 changed files with 1299 additions and 47 deletions

View File

@@ -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

File diff suppressed because it is too large Load Diff

26
hwTestSuite/snprintf.h Normal file
View 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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -5,5 +5,6 @@
#define SCREEN_HEIGHT 160
#define MAX_SUBPROGRAMS 20
#define TESTS_AVAILABLE 20
#endif

49
hwTestSuite/tests.c Normal file
View 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
View File

@@ -0,0 +1,8 @@
#ifndef TESTS_HEADER
#define TESTS_HEADER
#include "testSuite.h"
var hexRamBrowser();
#endif

View File

@@ -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;
}

View File

@@ -5,5 +5,6 @@
var hexViewer();
var testViewer();
var testPicker();
void initTestList();
#endif

View File

@@ -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