Commit f30d68cb authored by Recolic Keghart's avatar Recolic Keghart
Browse files

Merge branch 'check' into 'pa2'

Check

See merge request !3
parents b2d955b3 e48eb1ea
Pipeline #817 passed with stages
in 9 minutes and 51 seconds
......@@ -17,7 +17,7 @@ struct WP {
bool evalulate() {
auto new_value = evaluate_expr(expr);
std::swap(new_value, curr_value);
return new_value != curr_value;
return new_value != curr_value && curr_value != 0;
}
WP(std::string e, int id) : expr(e), id(id) {
evalulate(); // initial expr value.
......
......@@ -40,8 +40,6 @@ static void timer_sig_handler(int signum) {
Assert(ret == 0, "Can not set timer");
}
void device_update() {} // Now an independent thread will do it.
void device_update_impl() {
if (update_screen_flag) {
update_screen();
......@@ -72,7 +70,16 @@ void device_update_impl() {
}
}
static void device_update_thread_daemon() {
void device_update() {
#ifdef ENABLE_ASYNC_RENDER
#else
if(device_update_flag.exchange(false)) {
device_update_impl();
}
#endif
}
[[maybe_unused]] static void device_update_thread_daemon() {
while(true) {
if(device_update_flag.exchange(false)) {
device_update_impl();
......@@ -104,7 +111,9 @@ void init_device() {
ret = setitimer(ITIMER_VIRTUAL, &it, NULL);
Assert(ret == 0, "Can not set timer");
#ifdef ENABLE_ASYNC_RENDER
std::thread(device_update_thread_daemon).detach();
#endif
}
#else
......
......@@ -19,9 +19,11 @@ static uint32_t (*vmem) [SCREEN_W];
static uint32_t *screensize_port_base;
inline void SDL_ErrorCheck(int ret) {
#ifdef DEBUG
if(ret != 0) {
rlib::println("SDL_Error: ret=", ret, ", GETERR=", SDL_GetError());
}
#endif
}
static void init_vga_impl() {
......@@ -38,7 +40,9 @@ static void init_vga_impl() {
void update_screen() {
#ifndef DISABLE_MMIO
#ifdef ENABLE_ASYNC_RENDER
if(window == nullptr) init_vga_impl();
#endif
SDL_ErrorCheck(SDL_UpdateTexture(texture, NULL, vmem, SCREEN_W * sizeof(vmem[0][0])));
SDL_ErrorCheck(SDL_RenderClear(renderer));
SDL_ErrorCheck(SDL_RenderCopy(renderer, texture, NULL, NULL));
......@@ -47,8 +51,12 @@ void update_screen() {
}
void init_vga() {
#ifdef ENABLE_ASYNC_RENDER
// Because of fucking SDL design, vga_init should be done in updating thread.
// Do nothing in main thread.
#else
init_vga_impl();
#endif
}
#endif /* HAS_IOE */
......@@ -13,7 +13,7 @@
%%
[ \t\n] {}
0x[0-9a-f]+ {yylval.ival = (int)strtol(yytext, NULL, 16); return T_INT;}
0[xX][0-9a-f]+ {yylval.ival = (int)strtol(yytext, NULL, 16); return T_INT;}
[0-9]+ {yylval.ival = atoi(yytext); return T_INT;}
"==" {return T_EQUAL;}
"!=" {return T_NEQUAL;}
......@@ -21,6 +21,7 @@
[-+*/()] {return yytext[0];}
"%"[a-z]{3} {yylval.ival = ((uint32_t)yytext[2] << 8) + yytext[3]; return T_REG;}
"$"[a-z]{3} {yylval.ival = ((uint32_t)yytext[2] << 8) + yytext[3]; return T_REG;}
. {throw std::runtime_error(std::string("lexer error around token: ") + yytext);}
%%
// Registers: eax='a'+'x', ebx='b'+'x', ...
......@@ -70,6 +70,7 @@ static struct {
{ "help", "Display informations about all supported commands", cmd_help },
{ "c", "Continue the execution of the program", cmd_c },
{ "n", "= GDB `n`", cmd_n },
{ "si", "= GDB `n`", cmd_n },
{ "info", "= GDB `info`, supporting `info r` / `info w`", cmd_info },
{ "x", "x <bytes> <startAddr or expr>, dump memory content.", cmd_x },
{ "w", "w <expr>, add watchpoint for $expr", cmd_w },
......@@ -201,7 +202,7 @@ static int cmd_w(char *_args) {
if(_args == NULL)
throw std::invalid_argument("w <expr>");
watchpoints.emplace_front(std::string(_args), ++max_watchpoint_id);
watchpoints.emplace_front(std::string(_args), max_watchpoint_id++);
auto iter = watchpoints.begin(); // not thread-safe.
rlib::println("Add watchpoint:", *iter);
return 0;
......
#include "game.h"
//#define SCREEN_STRETCH
#define SCREEN_STRETCH
static uint32_t canvas[H][W];
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment