2015年12月5日
2015年12月26日 KM-BASIC向けブロック崩しゲーム掲載
2017年5月6日 キーボードライブラリ更新
PIC32MXにPS/2キーボードを接続して読み取る実験に成功したので、今度はPIC32MX上で動作するテキストエディターを製作しました。操作はWindowsのメモ帳を意識して作成したので、メモ帳を利用している方には違和感なく操作可能だと思います。保存先はSDカードまたはマイクロSDカードとなります。FAT32形式のSDカードに対応しているので、パソコンとテキストファイルを共有することも可能です。PIC32MXマイコン上で動作するBASIC言語のプログラム入力をそのマシン上で行うことを目指して作成しました。
以前作成した、SDカードブートローダとPS/2キーボード読み込み実験を組み合わせた回路となります。そのため、SDカードブートローダや、その対応アプリケーションもこの回路上で動作させることが可能です。また、これまで作成してきたワンチップテレビゲーム同様に、PIC32MX150F128B、PIC32MX250F128Bどちらでも動作するようなピン割り当てを行っています。ただ、そうすると汎用I/Oピンが不足するため、左右の入力ボタンとPS/2インターフェイスで同じポートを使用し、トランジスタを用いてRA1ポートで排他制御を行うようにしました。RA1をHにした時キーボードが有効となり、RA1がLの時は左右ボタンが有効です。ボタンとキーボードの同時使用はできません。(※)
※単純にボタンとPS/2インターフェイスの両方を1つのポートに接続すると、ボタン押下時にキーボードが誤動作するため、排他制御は必須です。
今回作成のテキストエディタ自体はボタンを使用しませんが、今後このハードウェアを用いてキーボードとボタンの両方に対応したアプリケーションを作成したいと思っています。
また、回路図上のオーディオ出力も今回は使用していませんが、これまで作成したゲーム等で使用可能です。
電源はキーボード用の5VとPIC用の3.3Vが必要です。私の場合は、5VのACアダプタの電圧をそのままキーボードにつなぎ、三端子レギュレータで単純に3.3Vを作ってマイコンの電源としています。
わざわざマイコンでテキストエディタとしてだけ使用、というのはあまり意味がないと思うので、他のアプリケーションとも共有できるようSDカードブートローダでの使用を前提としています。SDカードに本システムのHEXファイルを入れて、ブートローダから本アプリケーションを書き込んで起動してください。エディタ起動時にSDカードの有無のチェックを行いますので、今後もカードは挿入した状態で起動してください。
起動直後は新規テキストの状態です。右の画面イメージはBASICソースプログラム入力をしたところのイメージです。画面右下には入力可能な残りバイト数が表示されています。入力可能な文字は英数記号のみで、日本語等の入力はできません。
本エディタは通常のキー入力のほか、以下の機能が使用可能です。
F1 (CTRL+O) | SDカードから既存ファイルの読み込み。保存前のテキストがあれば、保存の確認あり |
F2 (CTRL+S) | SDカードへの保存。ファイル名を指定可能 |
F4 (CTRL+N) | 新規テキスト作成。保存前のテキストがあれば、保存の確認あり |
INSERT | 挿入モード/上書きモードの切り替え(カーソル形状が変更) |
Delete | カーソル位置の1文字削除 |
Back Space | カーソルの1つ前の1文字削除 |
Enter | 改行 |
矢印キー | カーソルの移動 |
Home (CTRL+左矢印) | 行頭に移動 |
End (CTRL+右矢印) | 行末に移動 |
Page Up | 1画面上にスクロール |
Page Down | 1画面下にスクロール |
Shift+矢印キー | 範囲選択。選択部分は緑で表示。選択可能範囲は1画面内に収まる量に制限 |
CTRL+C | 選択範囲をクリップボードにコピー |
CTRL+X | 選択範囲をクリップボードにコピーして削除 |
CTRL+V | クリップボードから貼り付け |
単純にテキストエディタを考えると、メモリ上にリニアな領域を確保し、そこに入力された文字を上から順に記憶していくことになりますが、この方法ではテキストの先頭に戻って文字を挿入したり削除したりしようとすると、そこからテキストの終了位置までの全てをずらす必要があります。サイズが大きくなると1文字入力するたびに待ち時間が発生することになり、使い勝手がよくありません。そこで、右図のような双方向参照可能なリスト構造のバッファ方式を採用しました。
1行分のバッファがいっぱいになると、新たな領域を確保し、前後のリンクを張ることでバッファ挿入を実現します。この方法では1文字挿入や削除する場合、最大でもバッファ1行分の文字をずらすだけで済みます。その代わり、カーソル移動しながらあちこちに挿入を繰り返し行うと、メモリ内に空き領域が散らばって残ることになり、テキストサイズが大きくなると、空きがあるはずなのに新たな領域確保ができないという事態が発生します。そこでこの断片化された空き領域を埋めなおしてきれいにする作業が必要になります。これをガベージコレクション(ゴミ収集)といい、本システムではキー入力待ちの間、常時1バイトずつ自動で行っています。
実際のバッファサイズは1バッファあたり200バイト、行数101行、ただし1行は作業用として使われるため20000バイトが最大入力文字数となります。PIC32MX250F128BのRAMは32Kバイトあり、ビデオ用メモリを差し引いてもまだ余裕がありますが、マイコンでのテキストエディタとしては十分だと思っています。
#define TBUFSIZE 200
#define TBUFMAXLINE 101
struct _TBUF{
//リンク付きのテキストバッファ
struct _TBUF *prev;//前方へのリンク。NULLの場合先頭または空き
struct _TBUF *next;//後方へのリンク。NULLの場合最後
unsigned short n;//現在の使用バイト数
unsigned char Buf[TBUFSIZE];//バッファ
} ;
typedef struct _TBUF _tbuf;
_tbuf TextBuffer[TBUFMAXLINE]; //テキストバッファの実体
テキストバッファ構造
ソースファイルは2つに分かれており、このほかこれまでに作成した3つのライブラリを利用しています。SDカードブートローダで使用するためのリンカースクリプトも必要です。ビルドして利用する場合これらのファイル全てをプロジェクトに追加してください。
texteditor.c | テキストエディター本体 |
keyinput.c | キー入力やカーソル点滅関連部品。ヘッダーファイルはkeyinput.h |
ps2keyboard.X.a | PS/2キーボードを使用するためのライブラリ(2017.5.6更新)。ヘッダーファイルはps2keyboard.h |
lib_colortext32.a | カラービデオ出力するためのライブラリ。ヘッダーファイルはcolortext32.h |
libsdfsio.a | SDカードにアクセスするためのライブラリ。ヘッダーファイルはSDFSIO.h |
App_32MX250F128B.ld | SDカードブートローダAP用リンカースクリプト |
上記のソースファイル、ライブラリファイル、ヘッダーファイル、リンカースクリプトはこちらからダウンロード可能です。また、SDカードブートローダで使用可能なHEXファイルも同梱しておきます。
関連ファイル一式のダウンロード |
今回のテキストエディタを作成しようと考えた動機は、私のSDカードブートローダシステムで動作するようにKatsumi氏が作成してくれたKM-BASIC用プログラムを作っていて、いちいちプログラム修正するたびにSDカードをパソコンに移して、修正してまたSDカードをマイコンに戻す、という動作が面倒なため、PICマイコン上で動作するテキストエディタの必要性を感じたことです。
このテキストエディタが完成したことで、当初の目的は達成しました。実際にこのシステムを使ってBASICのプログラムを入力し、SDカードに保存して、KM-BASICを起動してBASICプログラムを走らせる、という一連の作業もできました。ただ、今度はいちいちブートローダでアプリケーションを変更することが面倒だと感じるようになりました。そのため、次はKatsumi氏と共同で、テキストエディタとKM-BASIC実行環境を統合したKM-BASICプログラム統合開発実行環境を作成したいと思います。
(2015.12.24) KM-BASICがこのPS/2キーボードの回路対応となりました。
(2015.12.26追加)
本テキストエディタの実用性を確かめるため、パソコンは一切使わずにKM-BASIC向けのブロック崩しゲームを作成してみました。以前C言語で作成したものの移植です。画面が狭いのが難点ですが、簡単なプログラムであれば十分作れます。
右のリンクからソースプログラムをダウンロードして、SDカードに「block.txt」というファイル名で保存します。また こちらでダウンロードしたKM-BASIC for MIPS ver 1.1のbasic106.hexというファイルを「block.hex」というファイル名に変更して同じSDカードに保存します。このSDカードでブートローダを立ち上げ、「BLOCK」を選択して起動すると、ブロック崩しプログラムがコンパイルされ、ゲームが始まります。
遊び方は単純で、STARTボタンでゲーム開始、左右ボタンでパッドを左右に動かしてボールを落とさないようにして、全てのブロックを消去すれば、1面クリアです。面クリアするごとに少しずつボールのスピードが速くなり、難易度が上がります。
本ゲームは単純なので、すぐに飽きてしまうかもしれませんが、KM-BASIC向けプログラム作成の参考にしてください。
何かご不明点やご意見などありましたら、お気軽にこちらの掲示板に書き込みをお願いします。