[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
(toppers-users 44) Re: スクロール処理を追加してみました
- To: toppers-users at ertl ics tut ac jp
- From: Ryuichi Naitoh <night at bfree rim or jp>
- Date: Wed, 29 Nov 2000 20:07:14 +0900
自己フォロー。
やはり、原因は、スクロール時の画面のコピーでした。
一旦、変数 video の値を unsigned short * の変数にコピーすることで、
正常にスクロールできるようになりました。
どうも、御迷惑をおかけしました。
修正したものを添付ファイルにつけてます。
また、今回は、config/i386/pcat/sys_config.c だけではなく、
PCAT/sample1.c もつけています。
こちらのファイルは、スクロールのため、26 行分の出力を行って
います。
ではでは。
---
内藤隆一 (rnaitoh at st rim or jp)
From: "Ryuichi NAITOH" <liu1 at at sakura ne jp>
Subject: (toppers-users 43) Re: スクロール処理を追加してみました
Date: Wed, 29 Nov 2000 12:54:32 +0900
Message-ID: <20001129125432L night at at sakura ne jp>
Reply-to: rnaitoh at st rim or jp
Fcc: +outbox
>
> 内藤です。
>
>
> From: ACKyugo <ackyugo at geocities co jp>
> Subject: (toppers-users 41) Re: スクロール処理を追加してみました
> Date: Wed, 29 Nov 2000 01:14:59 +0900
> Message-ID: <3A23DA03294 1DA6ACKYUGO at mail geocities co jp>
>
> > こんにちは。
> >
> > On Tue, 28 Nov 2000 12:26:01 +0900
> > "Ryuichi NAITOH" <liu1 at at sakura ne jp> wrote:
> >
> > > 画面に表示する処理で、画面の最下行を越えると画面の一番上に表示位置を変
> > > 更しているみたいですね。
> > > これだと、ちょっと見にくいと思うので、スクロール処理を追加してみました。
> >
> > 上手く動きませんでした。
> > 本来なら149行目の「short *p」を使うはずだったのでしょうが、ちゅうぶらりん
> > になっているようです。
>
> ですね。
> 変数 video が、short * だと勘違いしてしまったようです。
> このため、画面の半分しか、コピーしていませんでした(sizeof (short)/2 ==
> sizeof (char) のため)。
>
> 修正したものを、あとで出すことにします。
>
>
> ではでは。
>
/*
* 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;
}
}
/*
* 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;
}
}