mirror of
https://github.com/libretro/hatari.git
synced 2026-11-09 17:24:15 -10:00
screen.h requires the SDL headers, so it's bad to include it in code that does not really depend on the SDL library, thus drop the inclusion of screen.h wherever it is possible. However, video.h currently depends on screen.h due to the HBL_PALETTE_LINES and HBL_PALETTE_MASKS macros. Fix this dependency by moving the HBLPalettes[] and HBLPaletteMasks[] arrays from video.c to screen.c instead.
93 lines
2.3 KiB
C
93 lines
2.3 KiB
C
/*
|
|
* Code to test Hatari expression evaluation in src/debug/evaluate.c
|
|
* (including Hatari variable and CPU register values in expressions)
|
|
*/
|
|
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
#include "stMemory.h"
|
|
#include "evaluate.h"
|
|
#include "m68000.h"
|
|
#include "configuration.h"
|
|
#include "video.h"
|
|
|
|
#define VBL_VALUE 21
|
|
|
|
int main(int argc, const char *argv[])
|
|
{
|
|
/* expected to fail */
|
|
const char *failure[] = {
|
|
"1+2*",
|
|
"*1+2",
|
|
"1+(2",
|
|
"1)+2",
|
|
"foo+1+bar",
|
|
};
|
|
/* expected to succeed, with given result */
|
|
struct {
|
|
const char *expression;
|
|
uint32_t result;
|
|
} success[] = {
|
|
{ "1+2*3", 7 },
|
|
{ "(2+5)*3", 9 },
|
|
{ "d0 + 2", 12 },
|
|
{ "VBL+10", VBL_VALUE + 10 },
|
|
{ "~%101 & $f0f0f ^ 0x21 * 0x200", 0xF4D0A },
|
|
};
|
|
int i, offset, tests = 0, errors = 0;
|
|
const char *expression, *errstr;
|
|
uint32_t result;
|
|
|
|
/* set values needed by above successful calculations */
|
|
nVBLs = VBL_VALUE;
|
|
memset(Regs, 0, sizeof(Regs));
|
|
Regs[REG_D0] = 10;
|
|
memset(STRam, 0, STRamEnd);
|
|
/* expressions use long access, 3*3 -> 9 */
|
|
STMemory_WriteLong(2+5, 3);
|
|
|
|
fprintf(stderr, "\nExpressions that should FAIL:\n");
|
|
|
|
for (i = 0; i < ARRAY_SIZE(failure); i++) {
|
|
expression = failure[i];
|
|
fprintf(stderr, "- '%s'\n", expression);
|
|
errstr = Eval_Expression(expression, &result, &offset, false);
|
|
if (errstr) {
|
|
fprintf(stderr, "%*c-%s\n",
|
|
3+offset, '^', errstr);
|
|
} else {
|
|
fprintf(stderr, " => %x\n ***Unexpected SUCCESS from expression***\n",
|
|
(uint32_t)result);
|
|
errors++;
|
|
}
|
|
}
|
|
tests += i;
|
|
|
|
fprintf(stderr, "\nExpressions that should SUCCEED with given result:\n");
|
|
|
|
for (i = 0; i < ARRAY_SIZE(success); i++) {
|
|
expression = success[i].expression;
|
|
fprintf(stderr, "- '%s'\n", expression);
|
|
errstr = Eval_Expression(expression, &result, &offset, false);
|
|
if (errstr) {
|
|
fprintf(stderr, "%*c-%s\n ***Unexpected ERROR in expression***\n",
|
|
3+offset, '^', errstr);
|
|
errors++;
|
|
} else if (result != success[i].result) {
|
|
fprintf(stderr, " => %x (not %x)\n ***Wrong result from expression***\n",
|
|
(uint32_t)result, (uint32_t)success[i].result);
|
|
errors++;
|
|
} else {
|
|
fprintf(stderr, " => 0x%x\n", (uint32_t)result);
|
|
}
|
|
}
|
|
tests += i;
|
|
|
|
if (errors) {
|
|
fprintf(stderr, "\n***Detected %d ERRORs in %d automated tests!***\n\n",
|
|
errors, tests);
|
|
} else {
|
|
fprintf(stderr, "\nFinished without any errors!\n\n");
|
|
}
|
|
return errors;
|
|
}
|