コード例 #1
0
ファイル: console.c プロジェクト: ELWIN-MAO/OrangeS
/**
 * Print a char in a certain console.
 * 
 * @param con  The console to which the char is printed.
 * @param ch   The char to print.
 *****************************************************************************/
PUBLIC void out_char(CONSOLE* con, char ch)
{
	disable_int();

	u8* pch = (u8*)(V_MEM_BASE + con->cursor * 2);

	assert(con->cursor - con->orig < con->con_size);

	/*
	 * calculate the coordinate of cursor in current console (not in
	 * current screen)
	 */
	int cursor_x = (con->cursor - con->orig) % SCR_WIDTH;
	int cursor_y = (con->cursor - con->orig) / SCR_WIDTH;

	switch(ch) {
	case '\n':
		con->cursor = con->orig + SCR_WIDTH * (cursor_y + 1);
		break;
	case '\b':
		if (con->cursor > con->orig) {
			con->cursor--;
			*(pch - 2) = ' ';
			*(pch - 1) = DEFAULT_CHAR_COLOR;
		}
		break;
	default:
		*pch++ = ch;
		*pch++ = DEFAULT_CHAR_COLOR;
		con->cursor++;
		break;
	}

	if (con->cursor - con->orig >= con->con_size) {
		cursor_x = (con->cursor - con->orig) % SCR_WIDTH;
		cursor_y = (con->cursor - con->orig) / SCR_WIDTH;
		int cp_orig = con->orig + (cursor_y + 1) * SCR_WIDTH - SCR_SIZE;
		w_copy(con->orig, cp_orig, SCR_SIZE - SCR_WIDTH);
		con->crtc_start = con->orig;
		con->cursor = con->orig + (SCR_SIZE - SCR_WIDTH) + cursor_x;
		clear_screen(con->cursor, SCR_WIDTH);
		if (!con->is_full)
			con->is_full = 1;
	}

	assert(con->cursor - con->orig < con->con_size);

	while (con->cursor >= con->crtc_start + SCR_SIZE ||
	       con->cursor < con->crtc_start) {
		scroll_screen(con, SCR_UP);

		clear_screen(con->cursor, SCR_WIDTH);
	}

	flush(con);

	enable_int();
}
コード例 #2
0
ファイル: le_core.c プロジェクト: am-ivanov/le2d
void le_soa_step_x(le_task *t)
{
	assert(t->stype == ST_SOA);
	int i, j;
	
	const real k1 = t->dt * t->mat.c1 / t->h.x;
	const real k2 = t->dt * t->mat.c2 / t->h.x;
	
#define soa_omega_x(i, j, k) \
	{ \
	const real nv = soa_vx(i, j); \
	const real N00T = soa_sxx(i, j) * t->mat.irhoc1; \
	const real n1v = soa_vy(i, j); \
	const real N01T = soa_sxy(i, j) * t->mat.irhoc2; \
	\
	w1[k + 2] = nv  - N00T; \
	w2[k + 2] = nv  + N00T; \
	w3[k + 2] = n1v - N01T; \
	w4[k + 2] = n1v + N01T; \
	}

	for (j = 0; j < t->n.y; j++) {
		real w1[5], w2[5], w3[5], w4[5];
		soa_omega_x(0, j, 0);
		soa_omega_x(1, j, 1);
		soa_omega_x(2, j, 2);
		
#define w_init(w) w[0] = w[1] = w[2];
		w_init(w1);
		w_init(w2);
		w_init(w3);
		w_init(w4);
#undef w_init
		for (i = 0; i < t->n.x; i++) {
			real d1 = tvd2(k1, w1[0], w1[1], w1[2], w1[3]) - w1[2];
			real d2 = tvd2(k1, w2[4], w2[3], w2[2], w2[1]) - w2[2];
			real d3 = tvd2(k2, w3[0], w3[1], w3[2], w3[3]) - w3[2];
			real d4 = tvd2(k2, w4[4], w4[3], w4[2], w4[1]) - w4[2];
			d1 *= 0.5;
			d2 *= 0.5;
			d3 *= 0.5;
			d4 *= 0.5;
			
			soa_vx(i, j) += d1 + d2;
			soa_vy(i, j) += d3 + d4;
			soa_sxx(i, j) += (d2 - d1) * t->mat.rhoc1;
			soa_syy(i, j) += (d2 - d1) * t->mat.rhoc3;
			soa_sxy(i, j) += t->mat.rhoc2 * (d4 - d3);

			
			//reconstruct(w_2, w_1, w, w1, w2, k1, k2, &d);
			//inc_x(&t->mat, &gind(i, j), &d);
			
#define w_copy(w) \
			w[0] = w[1];\
			w[1] = w[2];\
			w[2] = w[3];\
			w[3] = w[4];
			w_copy(w1);
			w_copy(w2);
			w_copy(w3);
			w_copy(w4);
#undef w_copy
			if (i < t->n.x - 3) soa_omega_x(i + 3, j, 2);
		}
	}
}
コード例 #3
0
ファイル: console.c プロジェクト: Jimx-/lyos
/*****************************************************************************
 *						do_escape
 *****************************************************************************/
PRIVATE void do_escape(CONSOLE * con, char c)
{
	int value, m, n;
	unsigned src, dst, count;
	//int *paramp;
	
	int cursor_x = (con->cursor - con->orig) % SCR_WIDTH;
	int cursor_y = (con->cursor - con->orig) / SCR_WIDTH;

	flush(con);

	if (con->c_esc_intro == '\0') {
		switch (c) {
			case 'M':		/* Reverse Index */
			if (cursor_y == 0) {
				scroll_screen(con, SCR_DN);
			} else {
				con->cursor = con->orig + SCR_WIDTH * (cursor_y - 1);
			}
			flush(con);
			break;
			default: break;
		}
	} else
	if (con->c_esc_intro == '[') {
		value = con->c_esc_params[0];
		switch (c) {
	    case 'A':		/* ESC [nA moves up n lines */
			n = (value == 0 ? 1 : value);
			con->cursor = con->orig + SCR_WIDTH * (cursor_y - n);
			flush(con);
			break;
		case 'B':		/* ESC [nB moves down n lines */
			n = (value == 0 ? 1 : value);
			con->cursor = con->orig + SCR_WIDTH * (cursor_y + n);
			flush(con);
			break;
	    case 'C':		/* ESC [nC moves right n spaces */
			n = (value == 0 ? 1 : value);
			con->cursor = con->orig + SCR_WIDTH * cursor_y + cursor_x + n;
			flush(con);
			break;
		case 'D':		/* ESC [nD moves left n spaces */
			n = (value == 0 ? 1 : value);
			con->cursor = con->orig + SCR_WIDTH * cursor_y + cursor_x - n;
			flush(con);
			break;
		case 'H':		/* ESC [m;nH" moves cursor to (m,n) */
			m = con->c_esc_params[0] - 1;
			n = con->c_esc_params[1] - 1;
			con->cursor = con->orig + SCR_WIDTH * m + n;
			flush(con);
		break;
	    case 'J':		/* ESC [sJ clears in display */
		switch (value) {
		    case 0:	/* Clear from cursor to end of screen */
			count = SCR_SIZE - (con->cursor - con->orig);
			dst = con->cursor;
			break;
		    case 1:	/* Clear from start of screen to cursor */
			count = con->cursor - con->orig;
			dst = con->orig;
			break;
		    case 2:	/* Clear entire screen */
			count = SCR_SIZE;
			dst = con->orig;
			break;
		    default:	/* Do nothing */
			count = 0;
			dst = con->orig;
		}
		clear_screen(dst, count);
		break;
	    case 'K':		/* ESC [sK clears line from cursor */
		switch (value) {
		    case 0:	/* Clear from cursor to end of line */
			count = SCR_WIDTH - cursor_x;
			dst = con->cursor;
			break;
		    case 1:	/* Clear from beginning of line to cursor */
			count = cursor_x;
			dst = con->cursor - cursor_x;
			break;
		    case 2:	/* Clear entire line */
			count = SCR_WIDTH;
			dst = con->cursor - cursor_x;
			break;
		    default:	/* Do nothing */
			count = 0;
			dst = con->cursor;
		}
		clear_screen(dst, count);
		break;
	    case 'L':		/* ESC [nL inserts n lines at cursor */
		n = value;
		if (n < 1) n = 1;
		if (n > (25 - cursor_y))
			n = 25 - cursor_y;

		src = con->orig + cursor_y * SCR_WIDTH;
		dst = src + n * SCR_WIDTH;
		count = n * SCR_WIDTH;
		w_copy(dst, src, count);
		clear_screen(src, count);
		break;
	    case 'M':		/* ESC [nM deletes n lines at cursor */
		n = value;
		if (n < 1) n = 1;
		if (n > (25 - cursor_y))
			n = 25 - cursor_y;

		dst = con->orig + cursor_y * SCR_WIDTH;
		src = dst + n * SCR_WIDTH;
		count = (25 - cursor_y - n) * SCR_WIDTH;
		w_copy(dst, src, count);
		clear_screen(dst + count, n * SCR_WIDTH);
		break;
	    case '@':		/* ESC [n@ inserts n chars at cursor */
		n = value;
		if (n < 1) n = 1;
		if (n > (SCR_WIDTH - cursor_x))
			n = SCR_WIDTH - cursor_x;

		src = con->cursor;
		dst = src + n;
		count = SCR_WIDTH - cursor_x - n;
		w_copy(dst, src, count);
		clear_screen(src, n);
		break;
	    case 'P':		/* ESC [nP deletes n chars at cursor */
		n = value;
		if (n < 1) n = 1;
		if (n > (SCR_WIDTH - cursor_x))
			n = SCR_WIDTH - cursor_x;

		dst = con->cursor;
		src = dst + n;
		count = SCR_WIDTH - cursor_x - n;
		w_copy(dst, src, count);
		clear_screen(dst + count, n);
		break;
		}
	}
	con->c_esc_state = 0;
}
コード例 #4
0
ファイル: le_core.c プロジェクト: am-ivanov/le2d
void le_soa_step_y(le_task *t)
{
	assert(t->stype == ST_SOA);
	
	int i, j;
	const real k1 = t->dt * t->mat.c1 / t->h.y;
	const real k2 = t->dt * t->mat.c2 / t->h.y;
	
	real *w1[5], *w2[5], *w3[5], *w4[5];
#define w_malloc(w)\
	w[0] = (real*)malloc(sizeof(real) * t->n.x);\
	w[1] = (real*)malloc(sizeof(real) * t->n.x);\
	w[2] = (real*)malloc(sizeof(real) * t->n.x);\
	w[3] = (real*)malloc(sizeof(real) * t->n.x);\
	w[4] = (real*)malloc(sizeof(real) * t->n.x);
	
	w_malloc(w1);
	w_malloc(w2);
	w_malloc(w3);
	w_malloc(w4);
#undef w_malloc

#define soa_omega_y(i, j, k) \
	{ \
	const real nv = soa_vy(i, j); \
	const real N00T = soa_syy(i, j) * t->mat.irhoc1; \
	const real n1v = soa_vx(i, j); \
	const real N01T = soa_sxy(i, j) * t->mat.irhoc2; \
	\
	w1[k + 2][i] = nv  - N00T; \
	w2[k + 2][i] = nv  + N00T; \
	w3[k + 2][i] = n1v - N01T; \
	w4[k + 2][i] = n1v + N01T; \
	}

	for (i = 0; i < t->n.x; i++) {
		soa_omega_y(i, 0, 0);
		soa_omega_y(i, 1, 1);
		soa_omega_y(i, 2, 2);
	}
#define w_init(w)\
	for (i = 0; i < t->n.x; i++) {\
		w[0][i] = w[1][i] = w[2][i];\
	}
	
	w_init(w1);
	w_init(w2);
	w_init(w3);
	w_init(w4);
#undef w_init

	for (j = 0; j < t->n.y; j++) {
		for (i = 0; i < t->n.x; i++) {
			real d1 = tvd2(k1, w1[0][i], w1[1][i], w1[2][i], w1[3][i]) - w1[2][i];
			real d2 = tvd2(k1, w2[4][i], w2[3][i], w2[2][i], w2[1][i]) - w2[2][i];
			real d3 = tvd2(k2, w3[0][i], w3[1][i], w3[2][i], w3[3][i]) - w3[2][i];
			real d4 = tvd2(k2, w4[4][i], w4[3][i], w4[2][i], w4[1][i]) - w4[2][i];
			d1 *= 0.5;
			d2 *= 0.5;
			d3 *= 0.5;
			d4 *= 0.5;

			soa_vy(i, j) += d1 + d2;
			soa_vx(i, j) += d3 + d4;

			soa_syy(i, j) += (d2 - d1) * t->mat.rhoc1;
			soa_sxx(i, j) += (d2 - d1) * t->mat.rhoc3;
			soa_sxy(i, j) += t->mat.rhoc2 * (d4 - d3);
		}
		
#define w_copy(w)\
		{\
		real *t = w[0];\
		w[0] = w[1];\
		w[1] = w[2];\
		w[2] = w[3];\
		w[3] = w[4];\
		w[4] = t;\
		}
		
		w_copy(w1);
		w_copy(w2);
		w_copy(w3);
		w_copy(w4);
#undef w_copy
		
		if (j < t->n.y - 3) {
			for (i = 0; i < t->n.x; i++) {
				soa_omega_y(i, j + 3, 2);
			}
		}
	}

#define w_free(w)\
	free(w[0]);\
	free(w[1]);\
	free(w[2]);\
	free(w[3]);\
	free(w[4]);
	
	w_free(w1);
	w_free(w2);
	w_free(w3);
	w_free(w4);
#undef w_free
}
コード例 #5
0
ファイル: console.c プロジェクト: Jimx-/lyos
/**
 * Print a char in a certain console.
 * 
 * @param con  The console to which the char is printed.
 * @param ch   The char to print.
 *****************************************************************************/
PUBLIC void out_char(TTY* tty, char ch)
{
	CONSOLE * con = tty->tty_dev;
	u8* pch = (u8*)(V_MEM_BASE + con->cursor * 2);

	assert(con->cursor - con->orig < con->con_size);

	/*
	 * calculate the coordinate of cursor in current console (not in
	 * current screen)
	 */
	int cursor_x = (con->cursor - con->orig) % SCR_WIDTH;
	int cursor_y = (con->cursor - con->orig) / SCR_WIDTH;

	if (con->c_esc_state > 0) {	/* check for escape sequences */
		parse_escape(con, ch);
		return;
	}
  
	switch(ch) {
	case 000:
		return;
	case 007:		/* beep */
		//beep();
		break;
	case '\b':		/* backspace */
		if (con->cursor > con->orig) {
			con->cursor--;
			*(pch - 2) = ' ';
			*(pch - 1) = DEFAULT_CHAR_COLOR;
		}
		break;
	case '\n':		/* line feed */
		if ((con->con_tty->tty_termios.c_oflag & (OPOST|ONLCR))
						== (OPOST|ONLCR)) {
			con->cursor = con->orig + SCR_WIDTH * cursor_y;
		}
	case 013:		/* CTRL-K */
	case 014:		/* CTRL-L */
		con->cursor = con->cursor + SCR_WIDTH;
		break;
	case '\r':		/* carriage return */
		con->cursor = con->orig + SCR_WIDTH * cursor_y;
		break;
	case '\t':		/* tab */
		con->cursor = con->orig + SCR_WIDTH * cursor_y + ((cursor_x + TAB_SIZE) & ~TAB_MASK);
		break;
	case 033:		/* ESC - start of an escape sequence */
		con->c_esc_state = 1;
		return;
	default:
		*pch++ = ch;
		*pch++ = DEFAULT_CHAR_COLOR;
		con->cursor++;
		break;
	}

	if (con->cursor - con->orig >= con->con_size) {
		cursor_x = (con->cursor - con->orig) % SCR_WIDTH;
		cursor_y = (con->cursor - con->orig) / SCR_WIDTH;
		int cp_orig = con->orig + (cursor_y + 1) * SCR_WIDTH - SCR_SIZE;
		w_copy(con->orig, cp_orig, SCR_SIZE - SCR_WIDTH);
		con->crtc_start = con->orig;
		con->cursor = con->orig + (SCR_SIZE - SCR_WIDTH) + cursor_x;
		clear_screen(con->cursor, SCR_WIDTH);
		if (!con->is_full)
			con->is_full = 1;
	}

	assert(con->cursor - con->orig < con->con_size);

	while (con->cursor >= con->crtc_start + SCR_SIZE ||
	       con->cursor < con->crtc_start) {
		scroll_screen(con, SCR_UP);

		clear_screen(con->cursor, SCR_WIDTH);
	}

	flush(con);
}