(toppers-users 40) スクロール処理を追加してみました (Re: Re: i386(PC/AT) =?ISO-2022-JP?B?GyRCJFgwXD8iJDckRiRfJF4kNyQ/GyhC?=)

Ryuichi NAITOH liu1 @ at.sakura.ne.jp
2000年 11月 28日 (火) 12:26:01 JST


内藤です。

From: ACKyugo <ackyugo @ geocities.co.jp>
Subject: (toppers-users 32) Re: i386(PC/AT) へ移植してみました
Date: Thu, 23 Nov 2000 21:06:51 +0900
Message-ID: <3A1D085B1EA.4AADACKYUGO @ mail.geocities.co.jp>

> こんにちは。
> 
> > うーん、先を越されてしまった(笑い)。
> 
> ヒマは学生の最大にして唯一の武器ですから(笑)
> 
> > 素早いですねー(実質何日で移植したんでしょうか?)。
> > 早速、落して、拝見させていただきます。
> 
> 土、日、月であらかた仕上げました。
> 書くところといったらディスパッチャと割り込みの出入り口ぐらいしかありませ
> んから作業量は少なかったです。
> 

拝見しました。

画面に表示する処理で、画面の最下行を越えると画面の一番上に表示位置を変
更しているみたいですね。
これだと、ちょっと見にくいと思うので、スクロール処理を追加してみました。

それほど大きなものではないので、変更したファイルをそのまま添付します。
添付ファイルを config/i386/pcat/sys_config.c に置き換えてコンパイルし
てください。

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


-------------- 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;
	short	*p;

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

	/* 最下行をクリア */
	for (x = 0; x < COLUMNS; x++) {
		video[x + (LINES - 1) * COLUMNS] = ' ' | ATTRIBUTE;
	}
}