コード例 #1
0
ファイル: window.c プロジェクト: HuiSF/tos_back
void move_cursor(WINDOW* wnd, int x, int y)
{
		assert(x >= 0 && x < wnd->width && y >= 0 && y < wnd->height);
		// assert(0) causes always failure
		wnd->cursor_x = x;
		wnd->cursor_y = y;

		if (wnd->cursor_x >= wnd->width) {
				wnd->cursor_x = 0;
				wnd->cursor_y++;
		}

		if (wnd->cursor_y >= wnd->height) {
				int x_len = wnd->x + wnd->width;
				int y_len = wnd->y + wnd->height;
				int i, j, offset_1, offset_2;
				for (i = wnd->x; i < x_len; i++) {
						for (j = wnd->y; j < y_len; j++) {
								offset_1 = j * (80 * 2) + i * 2;
								offset_2 = (j + 1) * (80 * 2) + i * 2;
								poke_w(0xb8000 + offset_1, peek_b(0xb8000 + offset_2) | 0x0f00);
								poke_w(0xb8000 + offset_2, 0x0020);
						}
				}
				wnd->cursor_y--;
		}
}
コード例 #2
0
ファイル: window.c プロジェクト: weighan/tos
void output_string(WINDOW* wnd, const char *str){
  volatile int saved_if;
  DISABLE_INTR(saved_if);
  short tempchar;
  int len, i = 0;
  len = k_strlen(str);

  while(i < len){
    tempchar = (0x0f << 8) | str[i];
    if(str[i] != '\n'){
      poke_w(0xb8000 + ((wnd->x + wnd->cursor_x)*2) + ((wnd->y + wnd->cursor_y)*160) , tempchar);
    }
    if(wnd->cursor_x+1 >= wnd->width || str[i] == '\n'){
      if(wnd->cursor_y +1 >= wnd->height){
        scroll(wnd);
      }
      else{wnd->cursor_y++;}
      wnd->cursor_x =0;
    }
    else{
      wnd->cursor_x++;
    }
    i++;
  }
  ENABLE_INTR(saved_if);
}
コード例 #3
0
ファイル: window.c プロジェクト: weighan/tos
void show_cursor(WINDOW* wnd){
  volatile int saved_if;
  DISABLE_INTR(saved_if);
  short cursor = (0x82 << 8) | wnd->cursor_char;
  poke_w(0xb8000 + ((wnd->x + wnd->cursor_x)*2) + ((wnd->y + wnd->cursor_y)*160) , cursor);
  ENABLE_INTR(saved_if);
}
コード例 #4
0
ファイル: window.c プロジェクト: HuiSF/tos_back
void clear_window(WINDOW* wnd)
{
		int i;
		MEM_ADDR offset = wnd->y * (79 * 2) + wnd->x * 2;
		for (i = 0; i < wnd->width * wnd->height; i++)
				poke_w(0xb8000 + offset + i * 2, 0);
		wnd->cursor_x = 0;
		wnd->cursor_y = 0;
		show_cursor(wnd);
}
コード例 #5
0
ファイル: window.c プロジェクト: HuiSF/tos_back
void output_char(WINDOW* wnd, unsigned char c)
{
		remove_cursor(wnd);
		MEM_ADDR offset = (wnd->cursor_y + wnd->y) * (80 * 2) + (wnd->x + wnd->cursor_x) * 2;
		if (c == '\n') {
				move_cursor(wnd, 0, wnd->cursor_y + 1);
		} else {
				poke_w(0xb8000 + offset, c | 0x0f00);
				move_cursor(wnd, wnd->cursor_x + 1, wnd->cursor_y);
		}
		show_cursor(wnd);
}
コード例 #6
0
ファイル: window.c プロジェクト: weighan/tos
void clear_window(WINDOW* wnd){
  volatile int saved_if;
  DISABLE_INTR(saved_if);
  int w, h;
  for(h=0; h < wnd->height; h++){
    for(w=0; w < wnd->width; w++){
      poke_w(0xb8000 + ((wnd->x + w)*2) + ((wnd->y + h)*160) ,0);
    }
  }
  wnd->cursor_x = 0;
  wnd->cursor_y = 0;
  ENABLE_INTR(saved_if);
}
コード例 #7
0
ファイル: pacman.c プロジェクト: marzigolbaz/tos
void move_ghost(GHOST *ghost)
{
    int x, y;
    WORD *cl;
    volatile int saved_if;
    DISABLE_INTR(saved_if);

    while (1)
    {
        x = (random() % 4) - 1;
        y = 0;
        if ((x % 2) == 0)
        {
            y = x - 1;
            x = 0;
        }
            
        if (maze[ghost->y + y][ghost->x + x] == ' ')
        {
            break;
        }
    }

    /* save ghost locations in maze */
    /* add/remove characters from pacman_wnd directly as only 1 cursor per window */
    maze[ghost->y][ghost->x] = ' ';
    cl = (WORD*)WINDOW_BASE_ADDR + WINDOW_OFFSET(pacman_wnd, ghost->x, ghost->y);
    poke_w((MEM_ADDR)cl, ' ' | 0x0F00);

    ghost->x += x;
    ghost->y += y;

    maze[ghost->y][ghost->x] = GHOST_CHAR;
    cl = (WORD*)WINDOW_BASE_ADDR + WINDOW_OFFSET(pacman_wnd, ghost->x, ghost->y);
    poke_w((MEM_ADDR)cl, GHOST_CHAR | 0x0F00);

    ENABLE_INTR(saved_if);
}
コード例 #8
0
ファイル: window.c プロジェクト: weighan/tos
void output_char(WINDOW* wnd, unsigned char c){
  volatile int saved_if;
  DISABLE_INTR(saved_if);
  short tempchar = (0x0f << 8) | c;
  if(c != '\n'){
    poke_w(0xb8000 + ((wnd->x + wnd->cursor_x)*2) + ((wnd->y + wnd->cursor_y)*160) , tempchar);
  }
  if(wnd->cursor_x+1 >= wnd->width || c == '\n'){
    if(wnd->cursor_y +1 >= wnd->height){
      scroll(wnd);
    }
    else{wnd->cursor_y++;}
    wnd->cursor_x =0;
  }
  else{
    wnd->cursor_x++;
  }
  ENABLE_INTR(saved_if);
}
コード例 #9
0
ファイル: window.c プロジェクト: HariniParth/tos
void poke_screen(int x, int y, WORD ch)
{
	poke_w(SCREEN_BASE_ADDR + y * SCREEN_WIDTH * 2 + x * 2, ch);
}
コード例 #10
0
ファイル: window.c プロジェクト: pmk2429/_OS
void poke_screen(int x, int y, WORD ch)
{
    poke_w(DISP_START_ADDR + y * DISP_WIDTH * 2 + x * 2, ch);
}
コード例 #11
0
ファイル: window.c プロジェクト: weighan/tos
void remove_cursor(WINDOW* wnd){
  volatile int saved_if;
  DISABLE_INTR(saved_if);
  poke_w(0xb8000 + ((wnd->x + wnd->cursor_x)*2) + ((wnd->y + wnd->cursor_y)*160) , 0);
  ENABLE_INTR(saved_if);
}
コード例 #12
0
ファイル: window.c プロジェクト: HuiSF/tos_back
void show_cursor(WINDOW* wnd)
{
		MEM_ADDR offset = (wnd->cursor_y + wnd->y) * (80 * 2) + (wnd->x + wnd->cursor_x) * 2;
		// wnd->cursor_char = 0x5f;
		poke_w(0xb8000 + offset, wnd->cursor_char | 0x0f00);
}
コード例 #13
0
ファイル: window.c プロジェクト: HuiSF/tos_back
void remove_cursor(WINDOW* wnd)
{
		MEM_ADDR offset = (wnd->cursor_y + wnd->y) * (80 * 2) + (wnd->x + wnd->cursor_x) * 2;
		poke_w(0xb8000 + offset, 0x0020);
}