uint8_t ti92p_get_byte(uint32_t adr) { // RAM access if(IN_BOUNDS(0x000000, adr, 0x1fffff)) { return get_b(tihw.ram, adr, RAM_SIZE_TI92P - 1); } // FLASH access else if(IN_BOUNDS(0x200000, adr, 0x5fffff)) { return get_b(tihw.rom, adr, ROM_SIZE_TI92P - 1) | wsm.ret_or; } // memory-mapped I/O else if(IN_BOUNDS(0x600000, adr, 0x6fffff)) { return io_get_byte(adr); } // memory-mapped I/O (hw2) else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI92P)) { return io2_get_byte(adr); } return 0x14; }
void Canvas_setColorRGB(int red, int green, int blue) { CHECK_DRAWING(1); if (IN_BOUNDS(red, 0, 255) && IN_BOUNDS(green, 0, 255) && IN_BOUNDS(blue, 0, 255)) { currentColor = EncodeColor(red, green, blue); } }
void Canvas_putPixel(int x, int y) { CHECK_DRAWING(1); if (IN_BOUNDS(x, 0, width - 1) && IN_BOUNDS(y, 0, height - 1)) { CANVAS_AT(x, y) = currentColor; } }
uint32_t ti89_get_long(uint32_t adr) { // RAM access if(IN_BOUNDS(0x000000, adr, 0x1fffff)) { return get_l(ram, adr, RAM_SIZE_TI89 - 1); } // FLASH access else if(IN_BOUNDS(0x200000, adr, 0x5fffff)) { return get_l(rom, adr, ROM_SIZE_TI89 - 1); } return 0x14141414; }
uint8_t* ti89_get_real_addr(uint32_t adr) { // RAM access if(IN_BOUNDS(0x000000, adr, 0x1fffff)) { return get_p(ram, adr, RAM_SIZE_TI89 - 1); } // FLASH access else if(IN_BOUNDS(0x200000, adr, 0x5fffff)) { return get_p(rom, adr, ROM_SIZE_TI89 - 1); } return unused; }
/* Check whether instruction fetch is allowed at adr. The returned value can be used by breakpoints to determine the origin of violation. */ int hwp_fetch(uint32_t adr) { // protections (hw1) if(tihw.hw_type == HW1) { if(IN_BOUNDS2(0x390000+tihw.archive_limit*0x10000, adr, 0x3fffff)) // archive memory limit (hw1) { // three consecutive access to any adress >=$390000+limit*$10000 and <$400000 crashes the calc if(!(adr & 1)) arch_mem_crash++; if((tihw.hw_type == HW1) && (arch_mem_crash >= 4)) { freeze_calc(); return 1; } } } // protections (hw2) else { if(IN_BOUNDS(0x000000, adr, 0x03ffff)) // RAM page execution protection { if(tihw.ram_exec[adr >> 12]) { freeze_calc(); return 2; } } else if(IN_BOUNDS(0x040000, adr, 0x1fffff)) // RAM page execution protection { if(io2_bit_tst(6, 7)) { freeze_calc(); return 2; } } else if(IN_BOUNDS2(0x210000, adr, 0x1fffff + tihw.rom_size)) // FLASH page execution protection { if(adr >= (0x210000+ba + (uint32_t)tihw.io2[0x13]*0x10000)) { //printf(">> $%06x-%06x ", adr, 0x210000+ba + (uint32_t)tihw.io2[0x13]*0x10000); freeze_calc(); return 3; } } }
void Canvas_setColorValue(int value) { CHECK_DRAWING(1); if (IN_BOUNDS(value, 0, 255)) { currentColor = value; } }
void GLUI_EditText::set_float_limits( float low, float high, int limit_type ) { has_limits = limit_type; float_low = low; float_high = high; if ( NOT IN_BOUNDS( float_val, float_low, float_high )) set_float_val( float_low ); int_low = (int) float_low; int_high = (int) float_high; }
void GLUI_EditText::set_int_limits( int low, int high, int limit_type ) { has_limits = limit_type; int_low = low; int_high = high; if ( NOT IN_BOUNDS( int_val, int_low, int_high )) set_int_val( int_low ); float_low = (float) int_low; float_high = (float) int_high; }
void GLUI_EditText::set_double_limits( double low, double high, int limit_type ) { has_limits = limit_type; double_low = low; double_high = high; if ( NOT IN_BOUNDS( double_val, double_low, double_high )) set_double_val( double_low ); int_low = (int) double_low; int_high = (int) double_high; float_low = (float) double_low; float_high = (float) double_high; }
uint32_t ti89t_get_long(uint32_t adr) { // RAM access if(IN_BOUNDS(0x000000, adr, 0x03ffff) || IN_BOUNDS(0x200000, adr, 0x23ffff) || IN_BOUNDS(0x400000, adr, 0x43ffff)) { return get_l(tihw.ram, adr, 0x03ffff); } // FLASH access else if(IN_BOUNDS(0x800000, adr, 0xbfffff)) { // use FlashReadLong due to Epson Device ID return FlashReadLong(adr); } // memory-mapped I/O else if(IN_BOUNDS(0x600000, adr, 0x6fffff)) { return io_get_long(adr); } // memory-mapped I/O (hw2) else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI89T)) { return io2_get_long(adr); } // memory-mapped I/O (hw3) else if(IN_RANGE(adr, 0x710000, IO3_SIZE_TI89T)) { return io3_get_long(adr); } return 0x14141414; }
uint8_t* ti89t_get_real_addr(uint32_t adr) { // RAM access if(IN_BOUNDS(0x000000, adr, 0x03ffff) || IN_BOUNDS(0x200000, adr, 0x23ffff) || IN_BOUNDS(0x400000, adr, 0x43ffff)) { return get_p(tihw.ram, adr, 0x03ffff); } // FLASH access else if(IN_BOUNDS(0x800000, adr, 0xbfffff)) { return get_p(tihw.rom, adr, ROM_SIZE_TI89T - 1); } // memory-mapped I/O else if(IN_BOUNDS(0x600000, adr, 0x6fffff)) { return get_p(tihw.io, adr, IO1_SIZE_TI89T - 1); } // memory-mapped I/O (hw2) else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI89T)) { return get_p(tihw.io2, adr, IO2_SIZE_TI89T - 1); } // memory-mapped I/O (hw3) else if(IN_RANGE(adr, 0x710000, IO3_SIZE_TI89T)) { return get_p(tihw.io3, adr, IO3_SIZE_TI89T - 1); } return tihw.unused; }
void ti89t_put_byte(uint32_t adr, uint8_t arg) { // RAM access if(IN_BOUNDS(0x000000, adr, 0x03ffff) || IN_BOUNDS(0x200000, adr, 0x23ffff) || IN_BOUNDS(0x400000, adr, 0x43ffff)) { put_b(tihw.ram, adr, 0x03ffff, arg); } // FLASH access else if(IN_BOUNDS(0x800000, adr, 0xbfffff)) { FlashWriteByte(adr, arg); } // memory-mapped I/O else if(IN_BOUNDS(0x600000, adr, 0x6fffff)) { io_put_byte(adr, arg); } // memory-mapped I/O (hw2) else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI89T)) { io2_put_byte(adr, arg); } // memory-mapped I/O (hw3) else if(IN_RANGE(adr, 0x710000, IO3_SIZE_TI89T)) { io3_put_byte(adr, arg); } return; }
uint8_t ti89t_get_byte(uint32_t adr) { // RAM access if(IN_BOUNDS(0x000000, adr, 0x03ffff) || IN_BOUNDS(0x200000, adr, 0x23ffff) || IN_BOUNDS(0x400000, adr, 0x43ffff)) { return get_b(tihw.ram, adr, 0x03ffff); } // FLASH access else if(IN_BOUNDS(0x800000, adr, 0xbfffff)) { return FlashReadByte(adr); } // memory-mapped I/O else if(IN_BOUNDS(0x600000, adr, 0x6fffff)) { return io_get_byte(adr); } // memory-mapped I/O (hw2) else if(IN_RANGE(adr, 0x700000, IO2_SIZE_TI89T)) { return io2_get_byte(adr); } // memory-mapped I/O (hw3) else if(IN_RANGE(adr, 0x710000, IO3_SIZE_TI89T)) { return io3_get_byte(adr); } return 0x14; }
void GLUI_Slider::set_int_limits( int low, int high) { if (low > high) { fprintf(stderr,"GLUI_Slider::set_int_limits - Ignoring: low > hi\n"); return; } int_low = low; int_high = high; if ( NOT IN_BOUNDS( int_val, int_low, int_high )) { set_int_val( int_low ); set_float_val( (float)int_val ); } float_low = (float) int_low; float_high = (float) int_high; }
void GLUI_EditText::draw_text( int x, int y ) { GLUI_DRAWINGSENTINAL_IDIOM int text_x, i, sel_lo, sel_hi; if ( debug ) dump( stdout, "-> DRAW_TEXT" ); if ( NOT draw_text_only ) { if ( enabled ) glColor3f( 1., 1., 1. ); else set_to_bkgd_color(); glDisable( GL_CULL_FACE ); glBegin( GL_QUADS ); glVertex2i( text_x_offset+2, 2 ); glVertex2i( w-2, 2 ); glVertex2i( w-2, h-2 ); glVertex2i( text_x_offset+2, h-2 ); glEnd(); } /** Find where to draw the text **/ text_x = text_x_offset + 2 + GLUI_EDITTEXT_BOXINNERMARGINX; /*printf( "text_x: %d substr_width: %d start/end: %d/%d\n", text_x, substring_width( substring_start, substring_end ), substring_start, substring_end ); */ /** Find lower and upper selection bounds **/ sel_lo = MIN(sel_start, sel_end ); sel_hi = MAX(sel_start, sel_end ); int sel_x_start, sel_x_end, delta; /** Draw selection area dark **/ if ( sel_start != sel_end ) { sel_x_start = text_x; sel_x_end = text_x; for( i=substring_start; i<=substring_end; i++ ) { delta = char_width( text[i] ); if ( i < sel_lo ) { sel_x_start += delta; sel_x_end += delta; } else if ( i < sel_hi ) { sel_x_end += delta; } } glColor3f( 0.0f, 0.0f, .6f ); glBegin( GL_QUADS ); glVertex2i( sel_x_start, 2 ); glVertex2i( sel_x_end, 2 ); glVertex2i( sel_x_end, h-2 ); glVertex2i( sel_x_start, h-2 ); glEnd(); } if ( sel_start == sel_end ) { /* No current selection */ if ( enabled ) glColor3b( 0, 0, 0 ); else glColor3b( 32, 32, 32 ); glRasterPos2i( text_x, 13); for( i=substring_start; i<=substring_end; i++ ) { glutBitmapCharacter( get_font(), this->text[i] ); } } else { /* There is a selection */ int x = text_x; for( i=substring_start; i<=substring_end; i++ ) { if ( IN_BOUNDS( i, sel_lo, sel_hi-1)) { /* This character is selected */ glColor3f( 1., 1., 1. ); glRasterPos2i( x, 13); glutBitmapCharacter( get_font(), this->text[i] ); } else { glColor3f( 0., 0., 0. ); glRasterPos2i( x, 13); glutBitmapCharacter( get_font(), this->text[i] ); } x += char_width( text[i] ); } } if ( debug ) dump( stdout, "<- DRAW_TEXT" ); }
int main() { fdb = fopen("debug", "w"); memset(land.cells, '#', WIDTH_MAX * HEIGHT_MAX * sizeof(char)); memset(mines.cells, 0, sizeof(Landmap)); srand(time(NULL)); int i, x, y; for (i = 0; i < num_mine; ++i) { x = rand() % width, y = rand() % height; if (mines.cells[x][y]) --i; else mines.cells[x][y] = 1; } // this can be written much betterly :P int j; for (i = 0; i < width; ++i) { for (j = 0; j < height; ++j) { if (mines.cells[i][j]) { map.cells[i][j] = '#'; continue; } int k, l, tot = 0; for (k = -1; k <= 1; ++k) for (l = -1; l <= 1; ++l) tot += IN_BOUNDS(i + k, j + l) ? mines.cells[i+k][j+l] : 0; map.cells[i][j] = tot ? tot + '0' : ' '; } } initscr(); raw(); noecho(); keypad(stdscr, 1); start_color(); init_pair(1, COLOR_BLUE, COLOR_BLACK); init_pair(2, COLOR_BLACK, COLOR_BLUE); init_pair(3, COLOR_RED, COLOR_RED); int curx = 0, cury = 0; for (;;) { render(curx, cury); switch (getch()) { case 'k': case KEY_UP: if (cury > 0) --cury; break; case 'j': case KEY_DOWN: if (cury < height - 1) ++cury; break; case 'h': case KEY_LEFT: if (curx > 0) --curx; break; case 'l': case KEY_RIGHT: if (curx < width - 1) ++curx; break; case 'u': case ' ': if (mines.cells[curx][cury]) lose(mines); if (land.cells[curx][cury] == '#') flood(curx, cury); break; case 'q': endwin(); exit(0); } } return 0; // shouldn't be reached }
void GLUI_TextBox::draw_text( int x, int y ) { GLUI_DRAWINGSENTINAL_IDIOM int text_x, i, sel_lo, sel_hi, x_pos; if ( debug ) dump( stdout, "-> DRAW_TEXT" ); /** Find where to draw the text **/ text_x = 2 + GLUI_TEXTBOX_BOXINNERMARGINX; /** Find lower and upper selection bounds **/ sel_lo = MIN(sel_start, sel_end ); sel_hi = MAX(sel_start, sel_end ); int sel_x_start, sel_x_end, delta; /** Draw selection area dark **/ if ( sel_start != sel_end ) { sel_x_start = text_x; sel_x_end = text_x; for( i=substring_start; sel_x_end < (w - text_x) && i<=substring_end; i++ ) { delta = 0; if (text[i] == '\t') // Character is a tab, go to next tab stop while (((delta + sel_x_end) < (w - text_x)) && (delta == 0 || delta % tab_width)) delta++; else delta = char_width( text[i] ); if ( i < sel_lo ) { sel_x_start += delta; sel_x_end += delta; } else if ( i < sel_hi ) { sel_x_end += delta; } } glColor3f( 0.0f, 0.0f, .6f ); glRecti(sel_x_start, y+5, sel_x_end, y+20); } if ( sel_start == sel_end ) { // No current selection x_pos = text_x; if ( enabled ) glColor3b( 0, 0, 0 ); else glColor3b( 32, 32, 32 ); glRasterPos2i( text_x, y+LINE_HEIGHT); for( i=substring_start; i<=substring_end; i++ ) { if (this->text[i] == '\t') { // Character is a tab, go to next tab stop x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; glRasterPos2i( x_pos, y+LINE_HEIGHT); // Reposition pen after tab } else { glutBitmapCharacter( get_font(), this->text[i] ); x_pos += char_width( this->text[i] ); } } } else { // There is a selection x_pos = text_x; for( i=substring_start; i<=substring_end; i++ ) { if ( IN_BOUNDS( i, sel_lo, sel_hi-1)) { // This character is selected glColor3f( 1., 1., 1. ); glRasterPos2i( x_pos, y+LINE_HEIGHT); if (this->text[i] == '\t') { // Character is a tab, go to next tab stop x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; } else glutBitmapCharacter( get_font(), this->text[i] ); } else { glColor3f( 0., 0., 0. ); glRasterPos2i( x_pos, y+LINE_HEIGHT); if (this->text[i] == '\t') { // Character is a tab, go to next tab stop x_pos = ((x_pos-text_x)/tab_width)*tab_width+tab_width+text_x; glRasterPos2i( x_pos, y+LINE_HEIGHT); // Reposition pen after tab } else glutBitmapCharacter( get_font(), this->text[i] ); } x_pos += char_width( text[i] ); } } if ( debug ) dump( stdout, "<- DRAW_TEXT" ); }