学研大人の科学:4ビットマイコン(GMC-4)
大人の科学の4ビットマイコン。 これで2500円というのは安い。
本物の4ビットマイコンというのではなく、 組み込みCPUでのシミュレータなんだけど、 アドレス表示の2進LEDとデータ(メモリ)表示の7セグLEDで 十分4ビットマイコンになっている。
当然、命令コードは読みやすい……はずがない… だけど、ステップ実行だったり、音発生だったりと、実験のネタにする機能が十分備わっている。
メモリ・レジスタ
プログラム 00-4F データ 50-5F レジスタ A,B,Y,Z,A',B',Y',Z'
命令コード
基本命令 Opコード ニーモニック 内容 Flag 0 KA K→Ar キー入力有無 1 AO Ar→Op 1 2 CH Ar⇔Br , Yr⇔Zr 1 3 CY Ar⇔Yr 1 4 AM Ar→(Yr) 1 5 MA (Yr)→Ar 1 6 M+ Ar+(Yr)→Ar 桁上がり 7 M- Ar-(Yr)→Ar マイナス 8 TIA □ □→Ar 1 9 AIA □ Ar+□→Ar 桁上がり A TIY □ □→Yr 1 B AIY □ Yr+□→Yr 桁上がり C CIA □ Ar≠□→Flag 不一致 D CIY □ Yr≠□→Flag 不一致 E (CAL) (別表参照) (-) F JUMP □□ if(Flag)goto□□ 1 CAL命令 Opコード ニーモニック 内容(CAL命令はFlag=1の時だけ実行) Flag E0 CAL RSTO 0→数字LED 1 E1 CAL SETR 1→2進LED[Y] 1 E2 CAL RSTR 0→2進LED[Y] 1 E3 E4 CAL CMPL NOT(Ar)→Ar 1 E5 CAL CHNG A,B,Y,Z⇔A',B',Y',Z' 1 E6 CAL SIFT Ar%2→Flag,Ar/2→Ar Ar[0] E7 CAL ENDS エンド音 1 E8 CAL ERRS エラー音 1 E9 CAL SHTS ショート音 1 EA CAL LONS ロング音 1 EB CAL SUND Arの音階の音 1 EC CAL TIMR (Ar+1)×0.1sec待ち 1 ED CAL DSPR (E)→2進LED[0:3],(F)→2進LED[4:6] 1 EE CAL DEM- DEC((Y)-Ar)→(Y),Y– 1 EF CAL DEM+ DEC((Y)+Ar)→(Y),Y– 1
学研FX-マイコン
記事を読むと、元々は、学研の電子ブロックのFX-マイコン(R-165)として 販売されていたものがベースらしい。 A,B,Y,Zと補助レジスタA',B',Y',Z'という考え方は、まるでZ80。 ニーモニックは、学研の子供向けというのもあるのか、違和感を感じる。 どちらにしろ、この価格は素晴らしい!
H21年度高専プロコン、競技部門本選参加へ…
高専プロコンの予選結果が発表となりました。 自由部門×2、課題部門×1、競技部門×1にて、応募しましたが、 残念ながら、競技部門1チームが本選参加となりました。
- 競技部門:くるったー、4EI:奥村、小林、丸山(指導高久)
参加学生の方は、全力が出せるように準備頑張ってください。
本戦では、残念ながら勝ち残ることができませんでしたが、 参加者の学生さんは良い経験となったようです。
高専プロコン予選通過、競技部門のみ
高専プロコンの予選結果が発表となった。 残念ながら、今年度は競技部門だけとなった。 審査員の講評を見ると、
- … 自由と課題の中身が似通ってきています。 これは課題部門が幅広い解釈ができるため…
- … 世の中にある話題の中から適当なものを見つけてきたような作品が多く、 若者らしい斬新なアイデアが少なかったことが残念です。
と書かれている。実際、応募資料を作る時も、 自由/課題の選択はアイディアが出てからの後付け。 アイディアについても、指導教員の知っているネタ説明を元に、 考え出したりしていれば、ご指摘のとおり…としかならない。 逆の見方をすれば、資料さえあと少し頑張れば、予選通過をしてもおかしくなかったとも言える。
シリアル通信やら赤外線リモコン信号やら…
創造工学演習にて、実際にプログラムを動かし始めるチームがではじめ、 その動作確認をするための環境のお手伝い。
Bluetooth経由でLEGO操作のチームでは、ひとまずシリアル通信の実験をしてもらうために、 シリアル信号をオシロスコープでみせたり、 端末ソフトと他のパソコンとつないで実験するためのクロスケーブルを渡したり。
赤外線リモコン制御に関係するチームには、ひとまず実証対象として、 部屋にあったSONYのTVを動かしてもらうために、 手元資料の赤外線波形とリモコンコードの表を渡して解説。 理解を深めてもらうために、赤外線リモコンのデコーダICの結果を、 オシロスコープにつないで波形観察。
相変わらず、説明ネタの幅が広くて疲れる授業時間でした…
ファイルの説明の前にOSの歴史
前期中間以降は、ファイルの入出力の講義が中心になるけど、 最も共通の知識として「OS寄り」な部分を説明となるので、 OSの歴史として説明を行う。
古くはOSを起動するときのモニタであり、 次の8bitパソコンの時代では、 BASICがOSの役割を担っていたことを説明。 その後、16bit CPUの出現で Intel 8086 がIBM-PCの OSとしてMS-DOSを紹介。 その後、Apple社のMacintoshのGUIに触発されて、 Windowsが開発された点を説明。 しかしながら、この時代までは、「シングルタスク・シングルユーザ」のOSであった。
この後、Windows/95 あたりでインターネットの普及が起こるが、 このあたりから32bit CPUの普及がはじまる。 32bitCPUでは、メモリ保護機能が実装され、「マルチユーザ・マルチタスク」のOSが 普及していく。 IBMのOS/2に始まり、Windows NT,2000と開発されていく。
これと並行して、汎用機の世界では、マルチタスク・マルチユーザの取り扱いでは、 Multics というOSが作られるが、ミニコンで使うために規模を縮小した unix が開発される。 unix は、研究機関のBSD系,企業でのSystemV系と分かれて開発がすすむが、 その中で、教育用のMINIXに触発され、Linux が開発され、オープンソースの流れのなか、 サーバ分野で普及していく…
この話の中で、「ハッカー」とは「コンピュータの世界で崇拝される専門家」であり、 「コンピュータの犯罪者」は「クラッカー」だよ…といった説明も行う。
2009年6月28日 (第118回)
- にしにしの部屋 長水先生の高専選抜サッカーチームのドイツ遠征について その2
nishi090629.mp3
停電によるサーバ停止(2009/06/26-29)
停電に伴い、下記の時間帯に電子情報のサーバを停止します。
2009/6/26(Fri) 17:00~ 6/29(Mon) 8:00 理由:6/27(Sat) 11:00~12:00 の停電に伴うネットワーク停止。
追記:停電より復旧しました。 停止期間は、6/27 10:00-15:00 でした。
リスト構造の簡単処理とリスト生成
mallocの課題で、独学でリスト構造を勉強している人が、すでにリスト構造で 課題を提出してきたひともいたりするんだが….
前回の講義に引き続き、必要に応じてメモリを確保するリスト構造について 説明を行う。list要素の全印刷の説明のあと、簡単なサンプルプログラムを 黒板で書いてもらう。int sum(List*); int max(List*); int find(List*,int); などの プログラムを出題するが、次に説明する予定の再帰によってプログラムを 書く人もいて、授業に熱心な人が増えている結果だと思える。
ループによるsum,max,findの後、再帰によって処理の例を示す。 再帰によるプログラミングは、単純リスト構造ではあまり必要ではないが、 再帰関数の処理速度のオーダなどの説明でも、再帰に慣れてほしいし、 後で出てくる2分木構造での導入にもなるので、解説を行った。
データ構造の宣言の説明では、古い教科書でtypedefを使った宣言の例も多いので、 typedefによるList宣言や、C++での構造体タグ名が型名として使えることを説明する。
TeraStationにAppleTalkを入れて文字化け対策
TeraStation を使っているが、Windowsファイル共有のファームウェアが、samba 2.x 系 であるため、Mac,Linuxからマウントすると漢字ファイル名が文字化けしてしまう。 "mount -t cifs …. iocharset=xxx,codepage=xxx" などを色々試すが、やっぱり無理。
ひとまずMac側からは、TeraStation 側で AppleTalk を動かし afp で接続したら、 文字化け問題はなくなった。 相変わらず、Linux 側からは文字化け。"mount -t afp" のネタを探すけど、 見つからない。
GrWinを用いた仮想関数演習の考え方
仮想関数と派生を理解した後の、グラフィックスの演習で、 図形クラスより、より具体的な四角クラス・丸クラスを作り、 この処理に色を使うクラスを追加するのが演習の目標。 これにより、色の取り扱いを、様々なクラス階層で作れることを考えてもらいたい。
しかし、C++初体験組が多いし、上位クラスのメソッドを呼び出すために、 クラス指定子「クラス::メソッド()」なんかの説明も足りないので、 ヒントをWebに掲載する。
単純に基底クラスが色を持つ
色を追加する際に、サンプルで示した処理の中に色を埋め込ませる事例。 色の取り扱いのために追加した部分が、元プログラムの中に色々と組み込まれる。
// 基底クラスが色の情報を持つ // Figure(color) // ↓派生 // FigureBox(width,height) class Figure { private: int color ; // 色を追加(元サンプルでは、何も無かったけど) public: Figure( int col ) // 色付き基底クラスのコンストラクタ : color( col ) {} virtual void draw( int , int ) { // 描画の前に色を設定 GWsetpen( color , 1 , 1 , -1 ) ; // 色以外は基本設定 } } ; class FigureBox : public Figure { // 派生クラスで色の処理を追加 private: int width , height ; public: FigureBox( int col , int w , int h ) : Figure( col ) , // 色付き基底クラスを初期化 width( w ) , height( h ) {} virtual void draw( int x , int y ) { Figure::draw( x , y ) ; // 基底クラスで色を設定 // ここに四角を描く処理 } } ; int main() { FigureBox cbox( 13 , 100 , 100 ) ; // 赤い100x100のBox cbox.draw( 10 , 10 ) ; // (10,10)にBoxを描く : }
既存クラスを流用し色の扱いを追加
元のプログラムを触らず、追加した色のクラスをさらに派生させる考え方。
// 色を持った派生クラスを作る // Figure(無し) 純粋基底クラス // ↓派生 // FigureBox(width,height) // ↓派生 // FigureBoxColor(color) class FigureBoxColor : public FigureBox { // FigureBoxに色を追加 private: int color ; public: FigureBoxColor( int x , int y , int col ) : FigureBox( x , y ) , // 基本となるクラスを初期化 color( col ) {} // 追加された色を初期化 virtual void draw( int x , int y ) { GWsetpen( color , 1 , 1 , -1 ) ; // 描画の前に色を設定 FigureBox::draw( x , y ) ; } } ; int main() { FigureBoxColor cbox( 100 , 100 , 13 ) ; cbox.draw( 10 , 10 ) ; : }
既存クラスを流用し多重継承を使ってみる
元のプログラムを触らず、追加した色のクラスも多重継承を用いる考え方。 Javaならば、インタフェース機能などを使わないとダメなケース。
ただし、FigureBoxColorと、FigureBoxCircleを派生させたあとで、 「指定した色で四角の中に丸が描かれるような1図形」などといった 要求がでてきたら、ダイヤモンド型の派生となる。 こういう場合がどういったデータ構造になるのかが、注目すべき事例。
// 多重継承で動かしてみる // Figure(無し) // 派生↓ // FigureBox Color(color) // 派生\ /派生 // FigureBoxColor class Color { private: int color ; public: Color( int col ) // 色を初期化 : color( col ) {} void setcolor() { // 描画前に色を設定するメソッド GWsetpen( color , 1 , 1 , -1 ) ; } } ; class FigureBoxColor : public FigureBox , public Color { public: FigureBoxColor( int w , int h , int col ) : FigureBox( w , h ) , // 基底クラスの初期化 Color( col ) {} // 色クラスを初期化 virtual void draw( int x , int y ) { 色を設定する処理を呼び出す。 FigureBoxのdrawを呼び出す。 } } ;