(toppers-users 44) Re: スクロール処理を追加してみました

Ryuichi Naitoh night @ bfree.rim.or.jp
2000年 11月 29日 (水) 20:07:14 JST



自己フォロー。


やはり、原因は、スクロール時の画面のコピーでした。
一旦、変数 video の値を unsigned short * の変数にコピーすることで、
正常にスクロールできるようになりました。

どうも、御迷惑をおかけしました。


修正したものを添付ファイルにつけてます。

また、今回は、config/i386/pcat/sys_config.c だけではなく、
PCAT/sample1.c もつけています。
こちらのファイルは、スクロールのため、26 行分の出力を行って
います。

ではでは。

---
内藤隆一 (rnaitoh @ st.rim.or.jp)



From: "Ryuichi NAITOH" <liu1 @ at.sakura.ne.jp>
Subject: (toppers-users 43) Re: スクロール処理を追加してみました
Date: Wed, 29 Nov 2000 12:54:32 +0900
Message-ID: <20001129125432L.night @ at.sakura.ne.jp>
Reply-to: rnaitoh @ st.rim.or.jp
Fcc: +outbox
> 
> 内藤です。
> 
> 
> From: ACKyugo <ackyugo @ geocities.co.jp>
> Subject: (toppers-users 41) Re: スクロール処理を追加してみました
> Date: Wed, 29 Nov 2000 01:14:59 +0900
> Message-ID: <3A23DA03294.1DA6ACKYUGO @ mail.geocities.co.jp>
> 
> > こんにちは。
> > 
> > On Tue, 28 Nov 2000 12:26:01 +0900
> > "Ryuichi NAITOH" <liu1 @ at.sakura.ne.jp> wrote:
> > 
> > > 画面に表示する処理で、画面の最下行を越えると画面の一番上に表示位置を変
> > > 更しているみたいですね。
> > > これだと、ちょっと見にくいと思うので、スクロール処理を追加してみました。
> > 
> > 上手く動きませんでした。
> > 本来なら149行目の「short *p」を使うはずだったのでしょうが、ちゅうぶらりん
> > になっているようです。
> 
> ですね。
> 変数 video が、short * だと勘違いしてしまったようです。
> このため、画面の半分しか、コピーしていませんでした(sizeof (short)/2 ==
> sizeof (char) のため)。
> 
> 修正したものを、あとで出すことにします。
> 
> 
> ではでは。
> 

-------------- next part --------------
/*
 *  TOPPERS/JSP Kernel
 *      Toyohashi Open Platform for Embedded Real-Time Systems/
 *      Just Standard Profile Kernel
 * 
 *  Copyright (C) 2000 by ????
 * 
 *  上記著作権者は,以下の条件を満たす場合に限り,本ソフトウェア(本ソ
 *  フトウェアを改変したものを含む.以下同じ)を使用・複製・改変・再配
 *  布(以下,利用と呼ぶ)することを無償で許諾する.
 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
 *      スコード中に含まれていること.
 *  (2) 本ソフトウェアをバイナリコードの形または機器に組み込んだ形で利
 *      用する場合には,次のいずれかの条件を満たすこと.
 *    (a) 利用に伴うドキュメント(利用者マニュアルなど)に,上記の著作
 *        権表示,この利用条件および下記の無保証規定を掲載すること.
 *    (b) 利用の形態を,別に定める方法によって,上記著作権者に報告する
 *        こと.
 *  (3) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
 *      害からも,上記著作権者を免責すること.
 * 
 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者は,
 *  本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
 *  ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
 *  かなる損害に関しても,その責任を負わない.
 */

/* modified by R.Naitoh (2000/11/28)
 *	画面の最下行を越えたらスクロールする処理を追加。
 *      カーソルを移動する処理を追加。
 */


/*
 *	ターゲットシステム依存モジュール(PC/AT用)
 */

#include "jsp_kernel.h"
#include "sys_insn.h"

#define DISPLAY_IO	0x03d4
#define	COLUMNS		80
#define	LINES		24
#define	ATTRIBUTE	7
static int xpos;
static int ypos;
static volatile UB *video;

static void	scroll_up();
static void	move_cursor();


/*
 *  ターゲットシステム依存の初期化
 */
void
sys_initialize()
{
	W i;

	video = (UB *)0xB8000;
	xpos = 0;
	ypos = 0;

	for(i = 0; i < COLUMNS * LINES * 2; i++)
	{
		*(video + i) = 0;
	}

	/* てきとー(^^; */
	outb(0x20, 0x11);
	outb(0x21, 0x20);
	outb(0x21, 0x04);
	outb(0x21, 0x01);
	outb(0xA0, 0x11);
	outb(0xA1, 0x28);
	outb(0xA1, 0x02);
	outb(0xA1, 0x01);
	outb(0x21, ~(0x04));
	outb(0xA1, ~(0x00));	
}

/*
 *  ターゲットシステムの終了
 */
void
sys_exit(void)
{
	while(1);
}


/*
 *  ターゲットシステムの文字出力
 */
void
sys_putc(char c)
{
	if(c == '\n' || c == '\r')
	{
		newline:
		xpos = 0;
		ypos++;
		if(ypos >= LINES)
		{
			scroll_up();
			ypos = LINES - 1;
		}
		move_cursor(xpos, ypos);
		return;
	}

	*(video + (xpos + ypos * COLUMNS) * 2) = c & 0xFF;
	*(video + (xpos + ypos * COLUMNS) * 2 + 1) = ATTRIBUTE;

	xpos++;
	if(xpos >= COLUMNS)
		goto newline;
	move_cursor(xpos, ypos);
}


/* カーソルを指定した位置に移動する
 */
static void
move_cursor()
{
	int	addr;

	addr = xpos + ypos * 80;

	outb(DISPLAY_IO,	0x0e );
	outb(DISPLAY_IO + 1,	addr >> 8 );

	outb(DISPLAY_IO,	0x0f );
	outb(DISPLAY_IO + 1,	addr & 0xFF );
}


/* 1 行だけスクロールする
 * カーソルは移動しない
 * (カーソルについての処理は呼び出し側で行う必要がある)。
 */
static void
scroll_up()
{
	int		x, y;
	unsigned short	*p;


	p = (unsigned short *)video;

	/* 行をコピー */
	for (y = 0; y < LINES - 1; y++) {
		for (x = 0; x < COLUMNS; x++) {
			p[x + y * COLUMNS] = p[x + (y + 1) * COLUMNS];
		}
	}

	/* 最下行をクリア */
	for (x = 0; x < COLUMNS; x++) {
		p[x + (LINES - 1) * COLUMNS] = ' ' | ATTRIBUTE;
	}
}
-------------- next part --------------
/*
 *  TOPPERS/JSP Kernel
 *      Toyohashi Open Platform for Embedded Real-Time Systems/
 *      Just Standard Profile Kernel
 * 
 *  Copyright (C) 2000 by どこかのだれか
 * 
 *  上記著作権者は,以下の条件を満たす場合に限り,本ソフトウェア(本ソ
 *  フトウェアを改変したものを含む.以下同じ)を使用・複製・改変・再配
 *  布(以下,利用と呼ぶ)することを無償で許諾する.
 *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
 *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
 *      スコード中に含まれていること.
 *  (2) 本ソフトウェアをバイナリコードの形または機器に組み込んだ形で利
 *      用する場合には,次のいずれかの条件を満たすこと.
 *    (a) 利用に伴うドキュメント(利用者マニュアルなど)に,上記の著作
 *        権表示,この利用条件および下記の無保証規定を掲載すること.
 *    (b) 利用の形態を,別に定める方法によって,上記著作権者に報告する
 *        こと.
 *  (3) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
 *      害からも,上記著作権者を免責すること.
 * 
 *  本ソフトウェアは,無保証で提供されているものである.上記著作権者は,
 *  本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
 *  ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
 *  かなる損害に関しても,その責任を負わない.
 * 
 */

#include <jsp_services.h>
#include "kernel_id.h"
#include "sample1.h"

void task(VP_INT exinf)
{
	syslog(LOG_EMERG, "task1");
}

void main_task(VP_INT exinf)
{
	int	i;

	syslog(LOG_EMERG, "main_task");
	Asm("int $80");
	syslog(LOG_EMERG, "I'm main_task.");

	for (i = 0; i < 26; i++) {
		syslog (LOG_EMERG, "test line: %d", i);
	}

	kernel_exit();
}

void sample_init(VP_INT exinf)
{
	syslog(LOG_EMERG, "sample1");
}

void exc_handler(VP _sp)
{
	UW *sp = _sp;
	ER ercd;

	syslog(LOG_EMERG, "exc_handler(%d)", sp[0]);
	ercd = iact_tsk(TASK1);
	syslog(LOG_EMERG, "iact_tsk(TASK1) ercd == %d", ercd);
	syslog(LOG_EMERG, "end of exc_handler(%d)", sp[0]);
}

void int_handler(void)
{
	syslog(LOG_EMERG, "int_handler");
	Asm("int $0");
	syslog(LOG_EMERG, "end of int_handler");
}


Inline void
write_vram(int x, int y, int ch)
{
        UB *video = (UB *)0xB8000;
        *(video + ((x + y * 80) * 2)) = ch & 0xFF;
        *(video + ((x + y * 80) * 2) + 1) = 7;
}

void cyclic_handler(VP_INT exinf)
{
	static UB flag = 0;

	if(flag == 0)
	{
		write_vram(78, 0, 'o');
		flag = 1;
	}
	else
	{
		write_vram(78, 0, 'x');
		flag = 0;
	}
}