スクリーン - みる会図書館


検索対象: コンピュータシステムの理論と実装 : モダンなコンピュータの作り方
55件見つかりました。

1. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

12.1 文字出力 月 . 示 . スクリーンへの出力について、これまで扱ってきた対象はグラフィカルなもの ピクセル、直線、円一一一であった。ここでは、文字をスクリーンに描画する方法につ いて説明する。そのために、 OS の便利なサービスを利用し、ピクセル単位の描画を 打つ。 スクリーンにテキストを出力する機能を開発するためには、ますは物理的なピクセ ル指向のスクリーンを文字指向のスクリーンに分割することから始める。たとえば、 横 512 ピクセル、縦 256 ピクセルのスクリーンを考えよう。もしひとつの文字を描画 するために 8X11 ピクセルのグリッドを配置するとすれば、 1 行あたり 64 文字を 23 行分表示することができる ( スクリーン最下部の 3 ピクセルは使わすのままである ) 。 続いて、スクリーンに表示したい文字を対象に、形の良いフォントをデザインする。 そのためには、文字ごとにビットマップを使って実装する。たとえば、 "A" という文 字のビットマップは図 12-12 のようになる。 図 1 2-12 " の文字ビットマップ こでは文字間のスペースを考慮して、 8 x 11 ピクセルのビットマップにおいて、 次の文字と最低でも 1 ピクセル、その下の文字に対しても同様に最低で 1 ピクセル、 空白が入るようにデザインしている ( 空白のサイズは文字によって異なる ) 。 通常、文字は左から右へ順々にスクリーンに描かれる。たとえば、 print("al') と print("b") というふたつのコマンドを実行した場合、プログラマーがおそらく期

2. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

5.2 Hack ハードウェアのプラットフォーム仕様ー メモリマップ 97 ューザーとインタラクテイプなやりとりをするために、 Hack プラットフォームは スクリーンとキーポードのふたつの周辺機器と接続することができる。このデバイス は両方共にメモリマップを通じてコンピュータと情報をやりとりする。具体的に言う と、スクリーンの画像は対応するメモリの場所を読み書きすることで、描画とそのピ クセルの値を調べることができる。同様に、現在どのキーが押されているかを調べる ためには、キーボード用のメモリマップにおいて指定された場所のメモリの値を調べ ればよい。メモリマップはコンピュータの外部に存在する周辺機器用の論理回路を通 して、それが対象とする I / O デバイスに作用する。スクリーンについては、スクリー ン用メモリマップのビットが変更されるたびに、物理的なスクリーンの対応するピク セルが描画される。キーポードについては、物理的なキーポードのキーが押されるた びに、対応するキーコードがキーポード用のメモリマップに現れる。 こでは初めに、ハードウェアのインターフェイス部分と I / O デバイスの間を連結 する既製の回路についてその仕様を示す。続いて、これらの回路を組み込んでメモリ モジュールを完成させる。 スクリーン Hack コンピュータは、横 512 x 縦 256 ピクセルの白黒のスクリーンと接続するこ とができる。コンピュータは物理的なスクリーンとメモリマップを介して接続される。 このメモリマップは screen と呼ばれる回路で実装されており、この回路は通常のメ モリのように動作する。つまり、メモリのように読み書きが行えるということである。 さらに、その回路に書き込まれたビットは物理的なスクリーン上にピクセルとして反 映される ( 1 = 黒、 0 = 白 ) 。メモリマップと物理スクリーン座標の正確な対応マッ プを以下に示す。

3. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

4.2 Hack 機械語の仕様ー乃 マンドにより xxx というシンポルが定義される。そのシンポルの値は、そのシンポル が定義された場所の次のコマンドの ( 命令メモリ中における ) アドレスを表す。ラベ ルは一度だけ定義することができ、アセンプリコードのどの場所からでも使用するこ とができる ( そのシンポルが定義される行の前であっても、使用することができる ) 。 変数シンボル ユーザーが定義したシンポルの中で、アセンプリプログラムで事前に定義されてお らず、かっ " ( xxx ) " というコマンドによってどこにも定義されていない場合、それ は変数 (variable) として扱われる。このシンポルはアセンプラによって一意のメモ リアドレスが与えられる。このアドレスは 16 ( 0X0010 ) から始まる。 4.2.5 入出力操作 Hack プラットフォームはスクリーンとキーボードのふたつの周辺機器につなぐこ とができる。このデバイスは両方ともにメモリマップ (memory map) を介してコン ピュータのプラットフォームと対話することができる。具体的に言うと、スクリーン に結びついたメモリ領域にバイナリ値を書き込むことで、スクリーン内のピクセルを 描画することができる。同様に、キーポードに結びついたメモリ領域の値を読み込む ことで、キーポードの状態を把握することができる。物理的な入出力デバイスとメモ リマップは更新ループによって同期される。 スクリーン Hack コンピュータは、横 512 ピクセル、縦 256 ピクセルの白黒のスクリーンを備 える。スクリーンの中身は 8K のメモリマップで表すことができ、このメモリマップ の RAM アドレスは 16384 ( 0X4000 ) から始まる。物理スクリーンはスクリーンの左 上隅からスタートし、物理スクリーンの各行は 16 ビットのワードが 32 個連続して並 んだ形で表される。そのため、上から 7 、番目の行で、左から c 番目の列に位置するピ クセルは、 RAM [ 16384 十 7 ・・ 32 十 c / 16 ] に位置するワードの c % 16 番目のビットに 対応する ( ここでの番号は、左から数えたときの番号 ) 。物理スクリーンのピクセルを 読み書きするためには、 RAM 中のメモリマップに対して対応するビットを読み書き すればよい ( 1 = 黒、 0 = 白 ) 。具体例を示すと、次のようになる。

4. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

5.5 プロジェクトー 107 コンピュータは通常、プリンタや外付けハードディスク、ネットワークコネクタなど と接続される。また、一般的なスクリーンは Hack のスクリーンよりも性能が良い。 たとえば、スクリーンのピクセル数が多く、各ピクセルは複数の輝度レベルを持ち、 カラー表示が可能である。このように Hack のスクリーンは性能の点では劣るが、主 要となる原理は他のスクリーンと同じである。主要となる原理とは、つまり、各ピク セルはメモリに在中するバイナリ値によって制御されるという原理である。 Hack で は 1 ビットによって各ピクセルの白黒が制御されるが、通常のコンピュータでは複数 のビットを用いて輝度レベルやカラー制御を行っている。また、 Hack スクリーンの メモリマップは単純であり、ピクセルとメモリ中のビットは直接マッピングされてい る。それに比べて、現代のほとんどのコンピュータでは、スクリーンを制御するため のグラフィックカードに高水準なグラフィック命令を送信することで描画を行う。こ のようにして、 CPU は円や多角形などを描画するといった退屈な作業から解放され る。グラフィックカードは、専用の回路セットを用いてそのような描画作業を行う。 最後に以下の点を強調しておく。それは、コンピュータハードウェアの設計におい て、ほとんどすべての努力や創造性がパフォーマンスを向上させるために費やされる、 ということである。そのため、ハードウェアのアーキテクチャに関する授業や教科書 では、メモリキャッシュ、 I / O デバイスへの高速アクセス、パイプライン、並列化、命 令のプリフェッチ ( 先読み込み ) 、他の最適化技術などを実装する問題を軸に議論が展 開されるであろう。本書ではそのような最適化については省略している。 歴史的に見ると、プロセッサのパフォーマンスを向上させるため、主に次のふたっ のハードウェア設計の道がたどられてきた。それは C 旧 C と R 旧 C である。 CISC は 「 Complex lnstruction Set Computing ( 複合命令セットコンピュータ ) 」の略で、複 雑な命令セットを提供しパフォーマンスの向上を達成することを目的としたアプロー チである。一方、 RISC は「 Reduced lnstruction Set Computing ( 縮小命令セット コンピュータ ) 」の略で、できるかぎり高速なハードウェア実装を行うために、より単 築する。 最上位が Computer 回路となっている Hack コンピュータのプラットフォームを構 目標 5.5 プロジェクト 純な命令セットが用いられる。

5. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

100 図 5-5 データメモリ い章 16 コンピュ ータアーキテクチャ load Memory 0 RAM ( 1 6K) スクリーン用 メモリマップ (8K) キーボード用 メモリマップ out 16 address 15 16383 16384 24575 24576 スクリーン キーボード 5.25 コンビュータ Hack のハードウェア階層において一番上に位置する回路 (Computer 回路 ) は、完 全なコンピュータシステムであり、 Hack 機械語で書かれたプログラムを実行するよ うに設計されている。この C 。 mputer 回路を抽象化して図示すると、図 5-6 のように なる。 Computer 回路はコンピュータを操作するために必要なハードウェアデバイス をすべて備える。このハードウェアデバイスには、 CPU 、データメモリ、命令メモリ (ROM) 、スクリーン、キーポードが含まれ、これらはすべて内部バーツとして実装 される。プログラムを実行するためには、プログラムのコードをあらかじめ ROM に 読み込む必要がある。また、スクリーンとキーポードの制御にはメモリマップを通し て行う。このメモリマップについては、 Screen と Keyboard 回路で示した仕様を満

6. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

仕 五ロ 一三ロ 2 function Array new(int size) 与えられたサイズの配列を生成する。 method void dispose ( ) この配列を破棄する。 Output このクラスはスクリーンへのテキストによる出力を扱う。 function void init ( ) 内部的な用途にのみ使用する。 function VOid moveCursor (int int j) カーソルをスクリーンの 0 , のへ移動し、そこに表示されている文字を消去する。 function VOid printChar (char c) カーソルが位置する場所に c という文字を表示させ、カーソルの場所を 1 列先 へ進ませる。 functi 〇 n void printString(String s) カーソルが位置する場所に s という文字列を表示させ、その文字数に応じてカー ソルを先に進ませる。 functi 〇 n void p て土 n セ工 n セ (int i) カーソルが位置する場所に i を表示させ、その数値の桁数に応じてカ ーソルを 先に進ませる。 function void println ( ) カーソルを次の行の先頭に移動する。 function void backSpace ( ) カーソルを一列後ろへ戻す。 Screen このクラスはスクリーンへのグラフィックによる描画を行う。スクリーンの列 (column) は 0 から始まり、左から右へ進む。行 (row) は 0 から始まり上から下へ 進む。スクリーンのサイズはハードウェアに依存する。 Hack のプラットフォームで は 256 行 x 512 列である ( 縦 256 x 横 512 ) 。

7. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

80 ー 4 章機械語 規約 以下に示すふたつのプログラムを書き、テストする。各自が書いたプログラムを CPU 工ミュレータで実行すると、結果が出力される。その結果はプロジェクトのディ レクトリにあるテストスクリプトによって正誤の確認が行われる。 乗算プログラム (Mult. asm) このプログラムへの入力は、 R0 と R1 に現在格納されている値とする ()0 、 RI は RAM の最初と 2 番目にそれぞれ位置する ) 。そして、このプログラム は R0 ☆ RI の乗算を行い、結果を R2 に格納する。こでは、 RO>=O 、 RI>=O 、 R0 ☆ RI く 32768 であると想定する。そのため、あなたのプログラムはその条件 を確認する必要はなく、その条件が満たされているものと想定してプログラム を書くことができる。このプログラムのために Mu lt . t st と Mu1t . cmp とい うスクリプトが与えられている。これらのスクリプトは代表的な数値を用いて、 あなたのプログラムのテストを行う。 入出力操作プログラム (FiII. asm) このプログラムは無限ループを実行し、そのループの中でキーポードの入力を 監視する。キーが押されると ( どのキーであっても ) 、プログラムはスクリーン を黒くする、つまり、すべてのピクセルを黒で描画する。キーが何も押されて いないと、スクリーンを消去する。スクリーンを黒または白で塗りつぶすため の処理は、要件を満たせば、どのような方法で行ってもよい。要件とは、つま り、キーが押されている間中はすっとスクリーン全体が黒であり、キーが何も 押されていない間はスクリーンは白である、ということである。このプログラ ムのためにテストスクリプト (F i 11 . t st ) はあるが、比較用ファイルは用意 されていない シミュレートされるスクリーンを目で見て確認してほしい。 手順 次の手順で進めることを推奨する。 1. 本プロジェクトに必要な CPU 工ミュレータとアセンプラは本書ソフトウェアパッ ケージの t 〇〇 1 s ディレクトリに用意されている。それを使い始める前に「アセ ンプラ・チュートリアル」と「 CPU 工ミュレータ・チュートリアル」に目を通す

8. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

12.1 背景 術的詳細を把握しなければならない。一方、高水準言語を用いれば、そのような詳細は プログラマーにとって抽象化される。たとえば、 c=readChar() や printChar(c) のような高水準な命令を用いることができる。これらの命令は、 OS のルーチンとし て実装されており、そのルーチンが実際の入出力に関する処理を行っている。 コンピュータにつながれたさまざまな入出力装置を操作することは OS の重要な機 能である。これを行うには、デバイスのインターフェイスの詳細をカプセル化し、そ これはデバイスドライバとして知られ の装置にアクセスするための便利な関数群 る一一を提供する。本書では、最も一般的な入出力であるスクリーンとキーポードの ふたつを対象とする。スクリーンの扱いはロジック的にふたつの別のモジュールに分 けて行う。そのふたつのモジュールとは、グラフィック出力 (graphicsoutput) と文 字出力 (character output) である。 12.1.6 グラフィック出力 ピクセル描画 今日のほとんどすべてのコンピュータは「ラスター」または「ビットマップ」と呼 ばれるディスプレイ技術を使用している。ビットマップスクリーンにおいて物理的に 行われるプリミテイプな命令は、個別のピクセルの描画だけである。ピクセルは ( 行、 列 ) によって、その場所が指定される。慣例としては、行は左から右へいくに従い数 が増え ( 通常のェ軸のように ) 、列は上から下へいくに従い数が増える ( 通常の〃軸 とは反対に ) 。そのため、スクリーンの左上の座標は ( 0 , 0 ) である。 低レベルにおけるピクセルの描画はハードウェアに関連した操作であり、スクリー ンに関連したインターフェイスと内部のグラフィックカードに依存して決まる。もし スクリーンのインターフェイスが RAM 常駐のメモリマップに基づくものであれば (Hack のように ) 、ピクセルの描画は適切な RAM 位置にバイナリ値を書き込むこと で行うことができる ( 図 1 2 - 8 ) 。 Hack スクリーンのメモリマップについては 5.2.4 節で説明を行った。 drawPixel アルゴリズムは、その節で説明した規約を満たす。その実装は簡単であり、こでは 読者の練習問題として残しておくことにする。さて、それでは、単一のピクセルの描 画を行う方法はすでに知っているものとして、直線と円を描画する方法について考え よう。

9. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

仕 五ロ 9 function string readLine(String message) message をスクリーンに表示し、キーポードから文字列 ( 改行文字が入力され るまでに押された文字列 ) を読む。この文字列をスクリーンに表示し、ファン クションはその文字列を返す。このファンクションはユー ザーのノヾックスペー スにも対応する。 function int readlnt (String message) message をスクリーンに表示し、キーポードから数字の列 ( 改行文字が入力 されるまでに押された数字列 ) を読む。この数字列をスクリーンに表示し、そ の整数の値を返す。このファンクションはユーザーのバックスペースにも対応 Memory このクラスはプラットフォームのメインメモリへ直接アクセスする。 function void init ( ) 内部的な用途にのみ使用する。 function int peek (int address) メインメモリの addre s s の場所にある値を返す。 function VOid poke (int address' int value) メインメモリの address の場所に value を設定する。 function Array alloc(int size) ヒープから指定されたサイズのメモリプロックを探し、それを確保し、そのべー スアドレスを返す。 function void deA110c(Array 0 ) 与えられたオプジェクトが占めるメモリ領域を破棄する。 Sys このクラスはプログラムの実行に関連するサービスを提供する。

10. コンピュータシステムの理論と実装 : モダンなコンピュータの作り方

12.2 Jack 〇 S の仕様ー 301 function void drawRectang1e(int xl' int yl ′ int x2 ′ int Y2) 左上コーナーがは 1 , ″ 1 ) 、右下コーナーがは 2 , 翼 ) の塗りつぶされた矩形を描 画する。 function v 〇 id drawCirc1e(int int int r) は , のを中心に、半径が 7 、の塗りつぶされた円を描画する ( ただし 7 、 < = 181 ) 。 内部的な用途にのみ使用する。 function void init ( ) このクラスはキーポードからのユーザー入力を扱う。 122.6 Keyboard functi 〇 n char readChar ( ) を返す。 function char keyPressed ( ) キーポードで現在押されているキーの文字を返す。何も押されていなければ 0 数の値を返す。このファンクションはユーザーのバックスペースにも対応する。 れるまで押された数字列 ) を読む。この数字列をスクリーンに表示し、その整 message をスクリーンに表示し、キーポードから数字の列 ( 改行文字が判定さ function int readlnt (String message) スにも対応する。 クションはその文字列を返す。このファンクションはユーザーのバックスペー れるまで押された文字列 ) を読む。この文字列をスクリーンに表示し、ファン message をスクリーンに表示し、キーポードから文字列 ( 改行文字が判定さ functi 〇 n string readLine (String message) リーンにその文字を表示し、このファンクションはその文字を返す。 キーポードでキーが押され、離されるまで待つ。キーが話された時点で、スク 12.27 Memory このクラスはプラットフォームのメインメモリへ直接アクセスする。