GUI: Added terminal output window
This commit is contained in:
parent
966a0eee14
commit
fe1bcfb471
91
gui.c
91
gui.c
@ -35,6 +35,7 @@ WINDOW *general_memdump;
|
|||||||
WINDOW *general_stack;
|
WINDOW *general_stack;
|
||||||
WINDOW *general_disas;
|
WINDOW *general_disas;
|
||||||
WINDOW *general_registers;
|
WINDOW *general_registers;
|
||||||
|
WINDOW *general_terminal_output;
|
||||||
|
|
||||||
int monochrome;
|
int monochrome;
|
||||||
|
|
||||||
@ -60,6 +61,8 @@ int gui_ncurses_refresh(){
|
|||||||
return 1;
|
return 1;
|
||||||
if(wrefresh(general_registers)==ERR)
|
if(wrefresh(general_registers)==ERR)
|
||||||
return 1;
|
return 1;
|
||||||
|
if(wrefresh(general_terminal_output)==ERR)
|
||||||
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,42 +148,52 @@ int start_gui(){
|
|||||||
update_tabs();
|
update_tabs();
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
int y1_divider;
|
int y1_divider,y2_divider;
|
||||||
|
|
||||||
int border=4;
|
int border=4;
|
||||||
|
|
||||||
if( (terminal_height-2*border)*0.2 < 8 )
|
if( (terminal_height-2*border-1)*0.2 < 8 )
|
||||||
y1_divider=terminal_height-border-8;
|
y1_divider=terminal_height-border-8;
|
||||||
else if ( ( terminal_height - 2*border )*0.2 < 15 )
|
else if ( ( terminal_height - 2*border )*0.2 < 15 )
|
||||||
y1_divider=terminal_height-border-11;
|
y1_divider=terminal_height-border-11;
|
||||||
else
|
else
|
||||||
y1_divider=(terminal_height-border*2)*0.8;
|
y1_divider=(terminal_height-border*2)*0.8;
|
||||||
|
|
||||||
|
y2_divider=(3*(terminal_height-2*border-1)/4);
|
||||||
|
|
||||||
int x=border;
|
int x=border;
|
||||||
|
int middle;
|
||||||
|
|
||||||
general_memdump=newwin(y1_divider,terminal_width/2,x,border);
|
general_memdump=newwin(y1_divider,terminal_width/2,x,border);
|
||||||
x+=terminal_width/2;
|
x+=terminal_width/2;
|
||||||
x++;
|
x++;
|
||||||
|
|
||||||
x+=3;
|
x+=3;
|
||||||
|
middle=x;
|
||||||
len=(terminal_width/6)>GENERAL_DISAS_WIDTH?GENERAL_DISAS_WIDTH:(terminal_width/6);
|
len=(terminal_width/6)>GENERAL_DISAS_WIDTH?GENERAL_DISAS_WIDTH:(terminal_width/6);
|
||||||
general_disas=newwin(y1_divider,len,4,x);
|
general_disas=newwin(y2_divider,len,4,x);
|
||||||
x+=len;
|
x+=len;
|
||||||
|
|
||||||
x+=3;
|
x+=3;
|
||||||
len=(terminal_width/6)>GENERAL_STACK_MAX_WIDTH?GENERAL_STACK_MAX_WIDTH:(terminal_width/6);
|
len=(terminal_width/6)>GENERAL_STACK_MAX_WIDTH?GENERAL_STACK_MAX_WIDTH:(terminal_width/6);
|
||||||
general_stack=newwin(y1_divider,len,4,x);
|
general_stack=newwin(y2_divider,len,4,x);
|
||||||
x+=len;
|
x+=len;
|
||||||
|
|
||||||
general_registers=newwin(terminal_height-y1_divider-border-1,terminal_width/2,y1_divider+border+1,border);
|
general_registers=newwin(terminal_height-y1_divider-border-1,terminal_width/2,y1_divider+border+1,border);
|
||||||
x+=terminal_width/2;
|
x+=terminal_width/2;
|
||||||
x++;
|
x++;
|
||||||
|
|
||||||
|
general_terminal_output=newwin(terminal_height-y2_divider-border-1,terminal_width/2-3*border,y2_divider+border+1,middle);
|
||||||
|
scrollok(general_terminal_output,TRUE);
|
||||||
|
x+=terminal_width/2;
|
||||||
|
x++;
|
||||||
|
|
||||||
if(gui_ncurses_refresh())
|
if(gui_ncurses_refresh())
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int gui_error(char *str){
|
int gui_error(char *str){
|
||||||
WINDOW *error_win = newwin(3,40,terminal_height/2-1,terminal_width/2-20);
|
WINDOW *error_win = newwin(3,40,terminal_height/2-1,terminal_width/2-20);
|
||||||
box(error_win, 0 , 0);
|
box(error_win, 0 , 0);
|
||||||
@ -197,7 +210,7 @@ int gui_error(char *str){
|
|||||||
wattroff(error_win,COLOR_PAIR(1));
|
wattroff(error_win,COLOR_PAIR(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
//// WARNING!! THIS ASSUMES THAT ADDRESS IS CORRECTLY ALIGNED!!
|
//// WARNING!! THIS ASSUMES THAT ADDRESS IS CORRECTLY ALIGNED WITH THE INSTRUCTION START/END!!
|
||||||
int select_instruction_color(struct simdata_t *simdata, WINDOW* window,uint32_t ADDRESS, int applyremove){
|
int select_instruction_color(struct simdata_t *simdata, WINDOW* window,uint32_t ADDRESS, int applyremove){
|
||||||
if(simdata->cpu_gui_hints){
|
if(simdata->cpu_gui_hints){
|
||||||
struct instr_list_t* pointer;
|
struct instr_list_t* pointer;
|
||||||
@ -519,10 +532,66 @@ int update_general_registers(struct simdata_t *simdata){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(height!=34242321)
|
return 0;
|
||||||
return 0;
|
}
|
||||||
else
|
|
||||||
return 0;
|
int term_curs_x,term_curs_y;
|
||||||
|
|
||||||
|
int update_general_terminal_output(struct simdata_t *simdata){
|
||||||
|
int width,height;
|
||||||
|
werase(general_terminal_output);
|
||||||
|
getmaxyx(general_terminal_output,height,width);
|
||||||
|
box(general_terminal_output, 0 , 0);
|
||||||
|
mvwprintw(general_terminal_output,0,width/2-7,"[ TERM OUTPUT ]");
|
||||||
|
|
||||||
|
term_curs_x=0;
|
||||||
|
term_curs_y=0;
|
||||||
|
|
||||||
|
for(uint64_t i=0;i < simdata->terminal_output_size;i++){
|
||||||
|
char c=simdata->terminal_output[i];
|
||||||
|
if(c>=' '&&c<='~'){
|
||||||
|
mvwprintw(general_terminal_output,term_curs_y+1,term_curs_x+1,"%c",c);
|
||||||
|
term_curs_x++;
|
||||||
|
if(term_curs_x>=width-2){
|
||||||
|
term_curs_x=0;
|
||||||
|
term_curs_y++;
|
||||||
|
}
|
||||||
|
if(term_curs_y>=height-2){
|
||||||
|
wscrl(general_terminal_output,1);
|
||||||
|
term_curs_y--;
|
||||||
|
for(int i=0;i<width;i++){
|
||||||
|
mvwprintw(general_terminal_output,term_curs_y+1,i," ");
|
||||||
|
}
|
||||||
|
box(general_terminal_output, 0 , 0);
|
||||||
|
mvwprintw(general_terminal_output,0,width/2-7,"[ TERM OUTPUT ]");
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
switch(c){
|
||||||
|
case 0x0a:
|
||||||
|
term_curs_x=0;
|
||||||
|
term_curs_y++;
|
||||||
|
if(term_curs_y>=height-2){
|
||||||
|
wscrl(general_terminal_output,1);
|
||||||
|
term_curs_y--;
|
||||||
|
for(int i=0;i<width;i++){
|
||||||
|
mvwprintw(general_terminal_output,term_curs_y+1,i," ");
|
||||||
|
}
|
||||||
|
box(general_terminal_output, 0 , 0);
|
||||||
|
mvwprintw(general_terminal_output,0,width/2-7,"[ TERM OUTPUT ]");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
werase(general_terminal_output);
|
||||||
|
box(general_terminal_output, 0 , 0);
|
||||||
|
mvwprintw(general_terminal_output,0,width/2-7,"[ TERM OUTPUT ]");
|
||||||
|
mvwprintw(general_terminal_output,1,1,"Invalid output");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mvwchgat(general_terminal_output,term_curs_y+1,term_curs_x+1, 1, A_REVERSE, 0, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int clear_back_window=1;
|
int clear_back_window=1;
|
||||||
@ -543,13 +612,15 @@ int update_gui(struct simdata_t *simdata){
|
|||||||
return 1;
|
return 1;
|
||||||
if(update_general_registers(simdata))
|
if(update_general_registers(simdata))
|
||||||
return 1;
|
return 1;
|
||||||
|
if(update_general_terminal_output(simdata))
|
||||||
|
return 1;
|
||||||
if(gui_ncurses_refresh())
|
if(gui_ncurses_refresh())
|
||||||
return 1;
|
return 1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int gui_continue_request(struct simdata_t *simdata){
|
int gui_continue_request(struct simdata_t *simdata){
|
||||||
char inch;
|
int inch;
|
||||||
int release=0;
|
int release=0;
|
||||||
while(release==0){
|
while(release==0){
|
||||||
if(((inch=getch())==ERR)){
|
if(((inch=getch())==ERR)){
|
||||||
|
13
simdata.c
13
simdata.c
@ -42,10 +42,20 @@ struct simdata_t *init_simdata(){
|
|||||||
ret->cpu_gui_hints->decoding_list=NULL;
|
ret->cpu_gui_hints->decoding_list=NULL;
|
||||||
ret->cpu_gui_hints->fetching_list=NULL;
|
ret->cpu_gui_hints->fetching_list=NULL;
|
||||||
ret->cpu_gui_hints->executing_list=NULL;
|
ret->cpu_gui_hints->executing_list=NULL;
|
||||||
|
ret->terminal_output=malloc(0);
|
||||||
|
ret->terminal_output_size=0;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int terminal_output(char c,struct simdata_t *simdata){
|
||||||
|
simdata->terminal_output=realloc(simdata->terminal_output,simdata->terminal_output_size+1);
|
||||||
|
if(!simdata->terminal_output)
|
||||||
|
return 1;
|
||||||
|
simdata->terminal_output[simdata->terminal_output_size]=c;
|
||||||
|
simdata->terminal_output_size++;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
void free_instr_list(struct instr_list_t **addr_of_tofree){
|
void free_instr_list(struct instr_list_t **addr_of_tofree){
|
||||||
struct instr_list_t *tofree=*addr_of_tofree;
|
struct instr_list_t *tofree=*addr_of_tofree;
|
||||||
while(tofree){
|
while(tofree){
|
||||||
@ -72,5 +82,6 @@ void free_simdata(struct simdata_t *p){
|
|||||||
free_instr_list(&p->cpu_gui_hints->fetching_list);
|
free_instr_list(&p->cpu_gui_hints->fetching_list);
|
||||||
free_instr_list(&p->cpu_gui_hints->executing_list);
|
free_instr_list(&p->cpu_gui_hints->executing_list);
|
||||||
free(p->cpu_gui_hints);
|
free(p->cpu_gui_hints);
|
||||||
|
free(p->terminal_output);
|
||||||
free(p);
|
free(p);
|
||||||
}
|
}
|
||||||
|
@ -9,12 +9,18 @@ enum CPU_STATE_t{
|
|||||||
struct simdata_t{
|
struct simdata_t{
|
||||||
long unsigned int current_clock;
|
long unsigned int current_clock;
|
||||||
uint8_t *RAM;
|
uint8_t *RAM;
|
||||||
|
|
||||||
struct fetch_data_t *fetch_data;
|
struct fetch_data_t *fetch_data;
|
||||||
struct decode_data_t *decode_data;
|
struct decode_data_t *decode_data;
|
||||||
struct exec_data_t *exec_data;
|
struct exec_data_t *exec_data;
|
||||||
struct registers_t *registers;
|
struct registers_t *registers;
|
||||||
|
|
||||||
enum CPU_STATE_t cpu_state;
|
enum CPU_STATE_t cpu_state;
|
||||||
|
|
||||||
struct cpu_gui_hints_t *cpu_gui_hints;
|
struct cpu_gui_hints_t *cpu_gui_hints;
|
||||||
|
|
||||||
|
char* terminal_output;
|
||||||
|
uint64_t terminal_output_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct instr_list_t{
|
struct instr_list_t{
|
||||||
@ -33,6 +39,7 @@ struct simdata_t *init_simdata();
|
|||||||
void free_simdata(struct simdata_t *);
|
void free_simdata(struct simdata_t *);
|
||||||
int add_to_instr_list(struct instr_list_t **addr_of_toadd,uint32_t address);
|
int add_to_instr_list(struct instr_list_t **addr_of_toadd,uint32_t address);
|
||||||
void free_instr_list(struct instr_list_t **addr_of_tofree);
|
void free_instr_list(struct instr_list_t **addr_of_tofree);
|
||||||
|
int terminal_output(char c,struct simdata_t *simdata);
|
||||||
|
|
||||||
enum GUI_CPU_STATE_t{
|
enum GUI_CPU_STATE_t{
|
||||||
GUI_CPU_RUNNING,
|
GUI_CPU_RUNNING,
|
||||||
|
Loading…
Reference in New Issue
Block a user