Skip to content
Snippets Groups Projects
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
No related branches found
No related tags found
1 merge request!3Check
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.
......
File added
File added
......@@ -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];
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment