ライン

BASIC搭載カラーテレビゲームシステム MachiKania

ライン

2016年8月5日
最終更新日 2017年5月6日

 BASIC搭載カラーテレビゲームシステム「MachiKania」(マチカニア)の完成からちょうど半年が経ち、上位機である「MachiKania type Z」が完成しました。
 マイコンチップにメモリ容量が2倍のものを使うことで、BASICでカラーグラフィックや浮動小数点演算が扱えるようになりました。これでBASICを使って作成できるプログラムの応用範囲が大きく広がります。また、BASICの構文自体も見直し、構造化プログラミング対応により、これまでに比べ容易にプログラムを作成できるようになりました。
 ぜひ新たなMachiKaniaを体験してみてください。

トップ画像

Maker Faire Tokyo
Maker Faire Tokyo 2017に出展します。(2017.8.5-6、東京ビッグサイト)


MachiKania type Zでできること

 初代MachiKaniaに比べ以下の点が強化されました。
  ・256×224ドット、16色同時表示可能なカラーグラフィックに対応したBASICシステムを搭載
  ・32ビット単精度の浮動小数点演算をBASICでサポートし、各種の数学関数を実装
  ・サブルーチン内のローカル変数や、複数行にまたがるIF〜THEN構造、WHILE〜LOOP構造のサポート、
   引数や戻り値付きサブルーチンなど、構造化プログラミングに欠かせない命令を多数追加
   これにより、GOTO文をほぼ使わないプログラム作成を実現
  ・多次元配列に対応
  ・大容量メモリ搭載により、より大規模なBASICプログラムを作成可能
  ・SDカードのサブディレクトリ作成とサブディレクトリへの保存、読み込みに対応 (Ver 1.02)
  ・横40文字表示モードの追加 (Ver 1.02)
  ・BASICプログラムからSDカード上のファイルにアクセス可能 (Ver 1.04)
 搭載しているBASIC KM-1200は従来バージョンと互換性があり、従来プログラムはそのまま走らせることができます。

 また、初代MachiKaniaでできる以下の内容はそのまま引き継いでいます。

・テレビにつないで電源を入れればすぐにゲームが始められます。
・キーボードをつなげば、BASIC言語でオリジナルのゲームを作ることができます。
・カラー表示対応なので、カラフルなゲームが作れます。
・自分のオリジナルキャラクターを使ったゲームが作れます。
・BASICの実行は大変高速なので、本格的なゲームが作れます。
・作ったゲームはSDカードに保存することができます。
・SDカードを使ってパソコンからプログラムをコピーすることができます。
・ハードウェアもソフトウェアも公開されているので、全て自分で製作することができます。

利用シーン1

利用シーン2


MachiKania type Zの作り方

 MachiKania type Zの製作方法および基本的な操作方法は、初代MachiKaniaと全く同じです。そのため、詳細はこちらのページの「MachiKaniaの作り方」からまずはお読みください。
 (2016.9.19)部品セットが購入可能になりました。詳細
 大まかな製作手順は以下のようになります。
 1. ハードウェアの製作
 2. マイコンにブートローダプログラムの書き込み
 3. SDカードに必要ファイルをコピー

 既に初代MachiKaniaを製作している場合、手順1はマイコンチップの差し替えだけです(ICソケットを使っていればですが)。
 また、初代MachiKaniaをPIC32MX170F256Bで動かしている場合は、手順3だけでMachiKania type Zを導入することができます。

プリント基板での製作例

プリント基板での製作例 基板入手方法

回路図

回路図 (クリックで拡大)


部品表
部品表



部品表掲載以外に必要なもの
電源5VのACアダプタ利用がお勧め。3.3Vはレギュレータで降圧する
PICkit3ブートローダの書き込みに必要。PIC32に書き込みができれば他のものでもOK
ブートローダ書き込み済みマイコンを購入すれば不要(入手方法
SDカード、マイクロSDカード1GBもあれば十分
パソコンPICkit3利用時、SDカードの初期コピー作成時に使用
SDカードリーダライタパソコン連携する際に必要
テレビビデオ入力端子のあるもの。パソコンのビデオキャプチャユニットなどでも利用可能
PS/2キーボードBASICプログラムを組む際必要
ビデオケーブル、音声ケーブルテレビに接続します


ダウンロード

 MachiKania type Z に関するファイルをダウンロードできます。

Download 動作に必要なファイルとサンプルファイル一式(bootloader.hex以外はSDカードにコピーする)
bootloader.hexブートローダ本体。PICkit3等を用いてPICマイコンに書き込む
MACHIKAZ.HEXMachiKania type Z BASICシステム。SDカードに入れてブートローダから書き込んで起動
MACHIKAZ.INIMachiKania type Z BASICシステムの設定ファイル
その他ファイル「.BAS」ファイルはBASICサンプルプログラム。「.HEX」ファイルはブートローダで起動可能な実行ファイル(C言語で作成したサンプルゲーム)
Download ソースファイルおよびライブラリファイル一式
ps2keyborad.X.aPS/2キーボード用ドライバ
lib_videoout_machikania.X.aカラーテキスト&グラフィック出力ライブラリ
libsdfsio.aSDファイルアクセス用ライブラリ
App_32MX170F256B.ldブートローダ対応プログラムを作成するためのリンカースクリプト
その他ファイルMachiKania type Z BASICシステムソースファイル。LGPL(v2.1)のライセンスに基づきソース公開しています。

 (2016.8.5) 初版公開
 (2016.9.3) Ver Zoea 1.01 (KM-1201) 公開。CONTINUE文、ATAN2#関数を追加。IF文、実数取り扱いのバグ修正
 (2016.10.23) Ver Zoea 1.02 (KM-1202) 公開。ディレクトリ対応機能、横40文字モード追加、WIDTH文追加。詳細はこちら
         特殊なデータ列リンク時、READ()関数実行時のバグ修正。多次元配列での演算子を使った場合のバグ修正
 (2016.11.13) Ver Zoea 1.03公開。エディタにアンドゥ機能、カーソル行番号表示機能追加。詳細はこちら
         エディタでまれに画面が乱れる場合があるバグを修正
 (2017.1.1) Ver Zoea 1.04公開。BASICにSDカード上のファイルへのアクセス命令群、関数群を追加。詳細はこちら
 (2017.5.6) Ver Zoea 1.05公開。キー入力時の画面のチラつきを解消しました。
  【システムバージョンアップの適用方法】
   1. 上記から展開したMACHIKAZ.HEXをSDカードのルートディレクトリに上書きコピー
   2. SDカードをMachiKaniaに挿し、本体上のいずれかのボタンを押しながら電源を入れる
   3. ブートローダが起動するので、MACHIKAZを選択してFIREボタンを押す


MachiKania type Zの使い方

 使い方についても初代MachiKaniaと同じですので、最初に初代MachiKaniaのページの「使い方」を読んでください。

MachiKania type Z BASICシステムのロード

 初めて電源オンする時やどれかのボタンを押しながら電源オンまたはリセットすると、MachiKaniaブートローダが起動します。
 ボード上の4方向ボタンを使って「MACHIKAZ」を選択し、FIREボタンを押すと、MachiKania type Z BASICシステムのPICマイコンへの書き込みが開始されます。書き込み中は画面表示が停止されますが、数秒後に表示再開し、MachiKania type Z BASICシステムが起動します。

ブートローダ画面

ブートローダ画面

MachiKania type Z BASICシステム

 MachiKania type Z BASICシステムはKatsumi氏のBASICコンパイラ KM-1200(KM-BASIC)を搭載しています。
 KM-1200は以前のバージョンに比べ、主に以下のような機能追加が行われました。
 ・カラーグラフィック機能
 ・浮動小数点演算機能
 ・ローカル変数や多次元配列対応
 ・条件付きループ構文や複数行にまたがる
  IF〜ENDIF構文の追加

 さっそく右のプログラムを打ち込んで、F4キーで実行してみてください。一瞬でサインカーブが表示されたと思います。このプログラム終了をするには、ENTERキーを押してください。グラフィック画面はテキスト画面とは排他表示となっており、プログラム終了すると自動的にテキスト画面に戻ります。そのため、グラフィックの表示結果を確認するために、INPUT$関数で入力待ちにしています。
 DO WHILEは後ろのLOOP文と合わせて条件付き繰り返しを実現します。WHILE条件指定はLOOP文の後ろにすることもでき、その場合は最後に条件判断を行います。
 ※解説のためにDO〜LOOPを使いましたが、通常はFOR〜NEXTを使うところです。
 浮動小数点を表す数式には全て「#」が付きます。そのため、変数名もY#のように記述する必要があります。また、整数型と浮動小数点型の自動変換は行われません。INT関数やFLOAT#関数で明示的に変換する必要があります。
 GOSUBはサブルーチンを呼び出す命令ですが、括弧を付けることで戻り値のある関数のように使うことができます。また、引き数も複数個を指定可能です。サブルーチン側では、ARGS関数で引き数の番号を指定して読み出します。
 LINE文は線分を描画する命令で、始点と終点の2つの座標および色を指定しますが、ここでは最初の座標は省略しています。省略した場合、前回の終点が始点となります。最初は始点の指定がないため、X=0の場合はPOINT文で指定しています。ここで、IF文のTHENの後ろが改行されていることに注目してください。この改行を入れることにより、複数行にまたがるIF構文形式となり、最後にENDIF文を入れることで終了します。
 サブルーチン内のVAR文はサブルーチン内でのみ使用されるローカル変数を宣言します。これにより、変数名のダブりや不足を防ぐことができます。

MachiKania type Z BASICシステム起動画面

MachiKania type Z BASICシステム起動画面
Ver Zoeaがtype Zを表します


BASICプログラムサンプル

BASICプログラムサンプル


サンプルプログラム実行結果

サンプルプログラム実行結果

ビットマップの表示

 ゲームに登場するキャラクターをビットマップで表示させるには、PUTBMP命令が便利です。画像パターンの指定方法はいくつかありますが、最も簡単な方法としてCDATA文でパターンを記述する方法があります。ここでは横14ドット、縦13ドットのビットマップ画像を表示します。
 CDATA文はメモリ上に8ビットデータ列を展開します。行末に「,」を置くことで次行以降にもそのまま8ビットデータを記述することができます。データの読み出しにはCREAD関数を使用しますが、この例のようにPUTBMP文でラベルを使ってそのまま表示することもできます。
 PUTBMP文に与えるデータ列はカラーパレット番号(0〜15)の羅列ですが、0(ゼロ)だけはパレット番号ではなく透明色となり、背景を上書きしません。黒を表示したい場合は、0番以外のパレットに黒を指定する必要があります。(デフォルトでは8番が黒です。)

サンプルビットマップ

デフォルトカラーパレット

デフォルトカラーパレットとサンプルビットマップ

PUTBMPサンプル

PUTBMPサンプル


PUTBMPサンプル実行結果

PUTBMPサンプル実行結果


MachiKania type Zの主なスペック

使用マイコンMicrochip社PIC32MX170F256B(PIC32MX270F256Bも使用可)
動作クロック57.27272MHz (MachiKania type Z BASICシステム利用時)
使用可能RAM容量BASIC利用時は約55Kバイト。ただし、グラフィック機能使用時はビデオメモリとして28Kバイトを占有
搭載言語BASIC コンパイラー KM-1200
エディタ機能40,000文字まで入力可能
映像方式NTSCカラーコンポジット(SDTV)
記録メディアSDカードまたはマイクロSDカードが使用可能。FAT16またはFAT32フォーマット。ファイル名は英数字と一部記号のみ、8文字+拡張子3文字まで(大文字、小文字の区別なし)
キーボードPS/2キーボードを接続可能(日本語およびUS配列に対応)
テキスト表示機能横30文字×縦27文字、または横40文字×縦27文字(Ver1.02以降)、
256色同時表示可能、カラーパレットでRGBそれぞれ8ビット指定
グラフィック機能横256ドット×縦224ドット、16色同時表示可能、カラーパレットでRGBそれぞれ8ビット指定
ユーザ定義文字(PCG)機能あり(256文字)
音楽再生機能あり(ABC記譜法)

KM-BASICリファレンス

 追加された主な命令と関数を表にまとめました。
 詳細はKM-1200のマニュアルを参照してください。

KM-1200で追加された主な関数
ARGS, ARGS#, ARGS$サブルーチン呼び出し時の引き数を読み出す
CREADCDATA文の8ビットデータを読み出す
GCOLORグラフィック画面指定座標のパレット番号を読み出す
GOSUB, GOSUB#, GOSUB$戻り値付きサブルーチン呼び出し、戻り値の型の種類により使い分ける
SYSTEM, SYSTEM$各種SYSTEM変数を返す
INT実数値を整数値に変換
CEIL#, FLOOR#与えられた実数値以上/以下の整数を実数値で返す
FABS#実数の絶対値を返す
FLOAT#整数値を浮動小数点型実数値に変換
VAL#10進数文字列を浮動小数点型実数値に変換
FMOD#剰余を実数値で返す
MODF#実数の小数部を返す
SQRT#平方根を返す
POW#指数関数
EXP#自然対数の底eの指数関数
LOG#, LOG10#自然対数および常用対数を返す
SIN#, COS#, TAN#三角関数
ASIN#, ACOS#, ATAN#, ATAN2#逆三角関数
(ATAN2#はKM-1201で追加)
SINH#, COSH#, TANH#双曲線関数

SDカードアクセス関連命令・関数(KM-1203で追加)
FOPENファイルオープン
FCLOSEファイルクローズ
FILEアクティブファイルハンドル指定
FGETC1バイト読み込み関数
FGETバッファに読み込み
FINPUT$文字列読み込み関数
FPUTC1バイト書き込み
FPUTバッファから書き込み
FPRINTテキスト書き込み
FSEEKファイル位置移動。関数ではファイル位置を返す
FEOFファイル位置が末端かを返す関数
FLENファイル長を返す関数
FREMOVEファイル削除

KM-1200で追加された主な命令
BREAKFOR〜NEXT、DO〜LOOP、WHILE〜WENDループから抜け出す
CDATA8ビットデータ列を記述
CONTINUEFOR〜NEXT、DO〜LOOP、WHILE〜WENDループ内の以降の命令をスキップし、次の条件判断を行う(KM-1201で追加)
DIM配列を割り当てる、浮動小数点型や多次元配列に対応
DO
<命令ブロック>
LOOP
条件指定して命令ブロックを繰り返し実行する。DOまたはLOOPの後ろにWHILE<条件式>またはUNTIL<条件式>を記述
WHILE<条件式>
<命令ブロック>
WEND
条件式を満たす間、命令ブロックを繰り返し実行する
GOSUBサブルーチン呼び出し。引き数を指定可能
IF〜THEN
<命令ブロック>
ELSEIF〜THEN
<命令ブロック>
ENDIF
条件式を満たす場合は命令ブロックを実行。THENの後ろは改行が必要
VARサブルーチン内で使うローカル変数を指定
SYSTEM各種システム値を設定
WIDTH30文字モードと40文字モードの設定(KM-1202で追加)

グラフィック関連命令
USEGRAPHICグラフィックメモリを確保しグラフィック機能を利用開始
BOXFILL塗りつぶされた長方形を描画
CIRCLE円を描画
CIRCLEFILL塗りつぶされた円を描画
GCLSグラフィック画面を消去
GCOLOR色指定を省略した場合のパレット番号を設定
GPALETTEグラフィック用パレットの設定
GPRINTグラフィック画面に文字列を描画
LINE線分を描画
POINT座標指定を省略した場合の座標を設定
PSET点を描画
PUTBMPビットマップを描画


最後に

 最初のMachiKaniaを公開してからちょうど半年で、2番目のバージョンをリリースすることができました。その間、多くの方々から応援や提案、また指摘などをいただきました。ありがとうございました。
 今回の強化されたKM-BASICは、従来のものに比べかなりプログラム作りが容易になりましたので、ハードウェアの製作の後は、ぜひともBASICプログラミングにもチャレンジしてみてください。
 なお、今回のバージョンはグラフィック機能以外、ほとんどがKatsumi氏によるKM-BASICの機能追加です。Katsumi氏にもあらためて感謝いたします。

 何かご不明点やご意見などありましたら、お気軽にこちらの掲示板に書き込みをお願いします。





  ■追加コンテンツ  初期公開時以降に公開された内容を追記していきます



新たに追加された機能

 MachiKania type Zの初期公開以降に追加された機能について、解説します。

40文字モード

2016.10.23 Ver Zoea 1.02で追加
 従来1行に表示可能な文字数は30文字でしたが、横幅の細いフォントを使用することで、40文字表示可能なモードを追加しました。
 テキストエディタ利用時では、[SHIFT]+[F3]キーを押すことで30文字モードと40文字モードを切り替えることができます。文字がやや見にくくなりますが、プログラムを組む際には1行に表示できる文字数が多いほうが、組みやすいと思います。
 BASIC実行時には30文字モードで自動的に初期化されますが、新たに追加されたWIDTH命令を使うことで40文字モードに変更することができます。具体的にはBASICプログラム上で「WIDTH 40」と記述します。逆に30文字モードに戻す場合は「WIDTH 30」です。
 ※40文字モードの英数カナ等のフォントは美咲フォントの作者による「k6x8フォント」を使用しています。

40文字モード

40文字モードでの表示例

30文字モード
30文字モードでの表示例



SDカードのディレクトリ対応

2016.10.23 Ver Zoea 1.02で追加
 従来、SDカードのルートディレクトリのみ対応していたBASICプログラムの保存、読み込みをサブディレクトリにも対応させました。また、保存するファイル名を一覧から選択することも可能になりました。
 右図の中で黄色く[ ]で囲まれたものがディレクトリです。昔のDOSの時代をご存知の方はすぐに分かると思いますが、[.]は今表示しているディレクトリ、[..]は一つ上の親ディレクトリを表します。[..]を選択してENTERキーを押すと親ディレクトリに移動して、また一覧表示を行います。[.]は選んでも意味がありません。緑の<New Dir>でサブディレクトリの作成、<New FILE>で新たな名前を付けてファイル保存ができます。
ファイル読み込み時に<New FILE>を選んで存在するファイル名を入力することで、ファイル名を指定した読み込みが可能になりました。(Ver 1.03)

ディレクトリ対応

サブディレクトリへの保存画面



テキストエディタのアンドゥ機能、行番号表示

2016.11.13 Ver Zoea 1.03で追加
 パソコン等のテキストエディタでは当たり前の、「アンドゥ(元に戻す)」機能をエディタに追加しました。CTRL+Zキーで1つ前の状態に戻します。メモリ容量の制約上、単純な1文字入力や1文字消去の場合で512回まで元に戻せます。範囲選択での一括消去や、コピー&ペーストのアンドゥにも対応しており、元に戻せる回数は一括操作する文字数によって異なってきます。
 これまでエディタ画面最下行には、入力可能な残り文字数を表示していましたが、現在カーソルがある行番号表示に変更しました。行番号は、画面上の行とは関係なく、テキストの一番最初が1行目で、改行入力ごとに1増える番号のことです。従来あった残り文字数はSHIFTキー押下時に表示されるように変更しました。

行番号表示対応

カーソル行番号表示に対応



BASICからSDカード上のファイルへのアクセス機能

2017.1.1 Ver Zoea 1.04(KM-1203)で追加
 BASICプログラムから、SDカード上のファイルの読み書きを行う命令や関数を追加しました。FOPEN命令でファイル名とアクセス方法(読み込みや書き込み等)を指定してファイル使用が開始されます。アクセスできる場所は、ソースプログラムがあるディレクトリのみとなります。
 ファイルは同時に2つまでオープンでき、FOPEN命令でファイルハンドル番号1または2を指定します(省略時は1)。ファイルオープン後のアクティブなファイルハンドルはFILE命令を使用して切り替えます。
 使用サンプルとして、WindowsのBMP形式画像ファイルをグラフィック表示するプログラムを作成しました。256×192ドット、4ビットカラー(16色)の形式専用ですが、画像変換ソフトを使ってうまく変換すれば、写真も意外ときれいに表示され、これまでに比べMachiKaniaの利用シーンが大きく広がるものと思います。

SDカードアクセス使用例

SDカードアクセス使用例。
サンプルプログラムBITMAP16.BASでBMP画像を表示




BASICサンプルプログラム集

 KM-BASICのサンプルプログラムをここに追加していきます。ダウンロードしたBASICのソースプログラムをSDカードにコピーし、実行してください。BASICのバージョンは最新のものをご利用ください。

HSVカラースペースデモ

2016.9.3 追加
 MachiKaniaではカラーパレットを使うと、テキスト画面で256色同時表示が可能です。HSV色空間をキャラクターで表示してみました。計算には座標から角度を求めるため、逆正接関数を使います。実際には(x,y)座標から単純に計算できるATAN2#(y,x)関数を追加して使用しました。

ダウンロード HSV.BAS

HSVカラースペースデモ

レイトレーシング

2016.9.3 追加
 I/O誌1986年7月号に掲載(吉森昌弘氏)されたレイトレーシング(光線追跡法)という手法を用いた3Dグラフィックを、計算アルゴリズムはほぼそのままで再現しました。当時のPC-9801シリーズでは描画に1時間以上要した記憶があります。高校生だった私はそのリアルさに感動し、計算部分を全てアセンブラーによる簡易浮動小数点演算にして10倍以上(?)の高速化したりしました。
 MachiKania type Zは解像度が違いますが、上の画像の場合4分程度で描画できます。また、プログラム3行目のREM SYSTEM 200,0のREMを削除すると、ビデオ出力を停止し計算に専念するため、1分ちょっとで描画完了します。当時のプログラムは8色表示で作られていましたが、MachiKania type Zのグラフィックでは16色同時表示できるので、少し改良しています。
 プログラム4行目の変数Eを2や4にすると解像度が粗くなり描画が速くなります。また、RESTORE文のパラメータDAT1をDAT2やDAT3にすることで描画するデータを変更できます。

ダウンロード RAYTRACE.BAS

レイトレーシング画面

レイトレーシング画面2

球の衝突シミュレーション

2016.9.3 追加
 実行すると10個の球が摩擦のない平面上で、ランダムな方向に等速直線運動を開始します。球同士が衝突すると移動方向と速度を計算して跳ね返ります。(手抜きアルゴリズムなので、たまに球同士がめり込むことがあります。)

ダウンロード COLISION.BAS

球の衝突シミュレーションデモ

波紋グラフィック

2016.9.3 追加
 水面上の波紋のようなものをSIN関数で描画します。その昔、パソコンで高精細グラフィックが使えるようになった頃、こういうサンプルがよく見受けられました。画面横方向解像度分の配列を用意して、簡単な陰線処理を行っています。

ダウンロード 3DWAVE.BAS

波紋グラフィック




プリント基板、ブートローダ書き込み済みマイコン、部品セットの入手方法

 プリント基板、およびブートローダ書き込み済みのPICマイコンを購入することができます。


Assemblage
秋葉原にあるハンダ付けができるスペースです。プリント基板の販売をお願いしました。本当はIchigoJamの展示場所ですが、同じBASICマイコン仲間として、MachiKaniaの展示機を設置していただきました。
また、PIC32MXのフラッシュ書き込み器も使用させてもらえます。(2016.5.1現在)

オレンジピコショップ
ORANGE picoはMachiKaniaと同じPIC32MXで動作するBASIC搭載マイコンボードです。Webショップを開設されており、MachiKaniaのプリント基板も取り扱っていただきました。
また、MachiKaniaのブートローダプログラムを書き込み済みのPIC32MX170F256Bの販売をお願いしたところ、快く引き受けていただきました。これを購入すればPICkit3等の書き込み器がなくてもMachiKaniaを製作することができます。(PIC32MX170F256BでもMachiKaniaは問題なく動作します。)

プリント基板と必要な部品一式のセット品も発売されました。(2016.9)
ケンケンのホームページ掲示板プリント基板は私の掲示板からも直接お申し込みいただけます。


 頒布中プリント基板用 部品表と製作上の注意点および回路図

プリント基板

頒布中のプリント基板 (最新はR1.3です)

プリント基板完成イメージ

プリント基板による完成イメージ


Copyright (C) KenKen All Rights Reserved.