プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

プチコン作品一覧

プチコン3号作品

●7650
パックマンDLCを使ったパズルゲーム
http://d.hatena.ne.jp/eidaht/20160612/1465755564

●MISSILE DEFENSE for プチコン3号
ミサイルコマンド風ゲームのプチコン3号移植。
http://d.hatena.ne.jp/eidaht/20141223/1419341732

ゲームブックドルアーガの塔」アドベンチャーシート for プチコン3号
ゲームブックドルアーガの塔」のアドベンチャーシート。
http://d.hatena.ne.jp/eidaht/20160313/1457835356

●EDSMILE ツール
スマイルボタンに登録して使う便利ツール。
http://d.hatena.ne.jp/eidaht/20160207/1454810930

●漢字入力プログラム EDKANJIPNL
漢字入力を行うプログラム。
http://d.hatena.ne.jp/eidaht/20160225/1456356091

●スター○ォーズ風タイトル表示デモ
mkIIで作ってた奥の方にスクロールしていくタイトルデモが高速かつ立体視3DSで。
http://d.hatena.ne.jp/eidaht/20141130/1417357718

●文字列関連操作ライブラリ
文字列等を操作する関数を集めたライブラリ。
http://d.hatena.ne.jp/eidaht/20151213/1450016205

正規表現ライブラリ
正規表現を実現するライブラリ。
http://d.hatena.ne.jp/eidaht/20150105/1420484771
http://d.hatena.ne.jp/eidaht/20150108/1420728132(正規表現ライブラリ使い方)

●EDBF Brainfu*kコンパイラ
Brainfu*kソースを実行可能なSMILE BASICソースにコンパイルする。
http://d.hatena.ne.jp/eidaht/20141207/1417943515


■3号プログラミング覚え書きまとめ
3号プログラミング覚え書き(1) 変数編
3号プログラミング覚え書き(2) DEF編
3号プログラミング覚え書き(3) 文字列編
3号プログラミング覚え書き(4) 数値編
3号プログラミング覚え書き(5) 配列編
3号プログラミング覚え書き(6) スマイルボタン編

■SMILE BASIC 小技 まとめ
SMILE BASIC 小技(1)
SMILE BASIC 小技(2)
SMILE BASIC 小技(3)
SMILE BASIC 小技(4)
SMILE BASIC 小技(5)
SMILE BASIC 小技(6)
SMILE BASIC 小技(7)
SMILE BASIC 小技(8)


プチコンmkII作品

●2048 (勝手移植版)
2014年初頭に旋風を巻き起こしたパズルゲーム2048のプチコン勝手移植版。
QRコード

●クイズ 1ミニットショック
2人対戦可能なクイズゲーム
概要、QRコード等

プチコンポーザー
スーパーファミコンのソフト「マリオペイント」の一機能である「コンポーザー」のアイデアを源流とする音楽作成・演奏ソフト。
遊び方 QRコード サンプル動画

●MISSILE DEFFENSE ミサイルコマンド風ゲーム。
 最新版 動画 QRコード

●140文字プログラム 140文字以内でできた超ショートプログラム
140文字プログラム集+α QRコード

 140文字プログラム集その1 リストと解説
 140文字プログラム集その2 リストと解説
 140文字プログラム集その3 リストと解説
 140文字プログラム集その4 リストと解説
 140文字プログラム集その5 リストと解説
 140文字プログラム集その6 リストと解説
 140文字プログラム集その7 リストと解説
 140文字プログラム集その8 リストと解説
 収録作:(1) 140スキー、140ゴルフ、140スロット
     (2)140タッチ、140ショット、140ジャンケン
     (3)140ペイント、140ペイント改、140ベーダ、140ランチャ、
       140ランチャ(RECV編)、140コンフィグ
     (4)140スノー、140ピラミッド、140ザカリテ、140ザオリク、140UFO
     (5)140STAR、140PAI、140コラッツ
     (6)140シュウォッチ、140テンカウント、140にじみフォント
     (7)140エディタ、140フィボナッチ、140ペルシア絨毯模様
     (8)140曜日計算、140アナログ時計、140コムソート


●タートルグラフィックス LOGO風タートルグラフィックス。
 V0.4 QRコードと解説
 V0.3 解説
 V0.2 解説
 V0.1 解説 図形サンプル

●MINOR MINER パズルゲームPITMAN移植作品。
 最新版 QRコードと解説

●8x8フォントエディタ 8x8ピクセルフォントエディタ。
 最新版 QRコードと解説 ひらがな/カタカナ混在表示サンプル

●簡易テキストエディタ ショートテキストエディタ
 V0.12 QRコードと解説

バイナリエディタ バイナリデータエディタ。
 最新版 QRコードと解説

●フライングゲッツ ミニアクションゲーム。
 最新版 QRコードと動画

●レトロレーシング ミニレースゲーム。
 最新版 QRコードと画像

●プチグマ プチコン暗号プログラム。
 最新版 QRコードと解説

●対戦ゲーム ミニ対戦ゲーム。
 最新版 リストと解説

●Brainfu*k for プチコン 難読プログラム言語Brainfu*kインタプリタ
 最新版 リスト QRコード


<<以下、開発中の作品。>>

ジャイラス風シューティング
ジャイラス風シューティング製作中 - プチコンで遊ぼう! (はてなブログ版)

●16進データ入力プログラム MON
16進データ入力を効率的に入力するための16進データ専用エディタ。
製作中:16進データ入力プログラム「MON」 - プチコンで遊ぼう! (はてなブログ版)

●ロングテキストエディタ LTEDIT
プチコンのプログラムソース入力を目的とした長文編集可能なテキストエディタ。(開発凍結中)
製作中:ロングテキストエディタのデモ - プチコンで遊ぼう! (はてなブログ版)

<<お知らせ>>

◆公開しているプログラムは、特に記載のない限り、Apacheライセンス2.0として公開しています。
好きなようにお使いください。


<<以下、自分用メモ>>

■PCとのデータ交換 プチコン3号用
◆ぷっちコンバーター
http://plaza.rakuten.co.jp/route21/diary/?ctgy=22
3号→PC 単方向 画像でテキストを渡す


■PCによる入力支援 プチコンmkII用

プチコン用画像コンバータ DSPCBMP
�v�`�R�� MkII �v���O����
あおごん@さん作

◆PTCUtilites
PTCUtilities
micono @さん作

◆PetitEditor
http://www2.u-netsurf.ne.jp/~ozawa/petitcom/petiteditor.html
Gust Notch?@さん作

プチコン文法チェッカ
プチコン文法チェッカー
Actorbug@さん作


プチコン作品のリストへのリンク

プチコン3号作品データベース (Google Docs)
https://docs.google.com/spreadsheets/d/1ihBdTe0w3GRSE-NgzqTo7i0XtMvLKqWTZ6xuVmsHiJ4/edit#gid=0
OBONO@さん管理

プチコン3号作品データベース出張所
http://ptcm3db.chobi.net/
OBONO@さん管理


プチコンmkII作品データベース (Google Docs)
https://docs.google.com/spreadsheet/lv?key=0AqLEdMVWXjvPdEFKam1zSm45Ry1FeVlETDJBdmF5b1E&type=view&gid=0&f=true&sortcolid=-1&sortasc=true&rowsperpage=500
OBONO@さん管理

プチコン3号/BIGのランチャー

メモ

MOTさん LINE LAUNCHER
http://motmark3.web.fc2.com/petitcom3/mot3llc.html

みむさん みむめにゅ~

画面の横に表示可能な文字数を調べる

PEPの中のMOREを作る過程で得た知見です。

画面の横に表示可能な文字数を調べる方法を紹介します。

XSCREENで表示解像度を変えることができますが、現在設定されているXSCREENを取得する方法が現在ないため、現在の解像度が何かはわかりません。
テキストで画面の横1行に表示可能な文字数についても同様にわかりませんでした。

これについては、以下のようにして調べられることがわかりました。
仮に画面が50×30文字表示の状態だとします。
この時、本来LOCATE文で表示可能な範囲は(0,0)~(49,29)です。
ところが(50,0)を指定してPRINTすることができるのです。
そして、そうした時、実際には(0,1)の位置に文字が表示されます。
これを利用してCSRXを調べると、画面横1行に表示可能な文字数を調べることができます。

これを応用して3号およびBIGの全スクリーンモードにおいて画面横1行に表示可能な文字数を調べることが可能な関数が次のようなものになります。

f:id:eidaht:20170609000007j:plain

PEPの中のMOREに実装されていますので、ソースコードを見てみてください。
PEPはこちらを見てください。
eidaht.hatenablog.com


さて、横幅はわかりましたが縦の行数は?
これは次の方法でわかります。
画面上から下に1行ずつPRINTとしていきます。するとどこかでスクロールが発生します。
スクロールが発生すると、その発生前と同じ位置にCSRYがセットされていますから、PRINTの前後でCSRYが変わらなかった時、最大の行数となります。
MOREもこの考え方で実装しています。
ソースコードを参考にしてみてください。

プチコンデータ交換プロトコルPEPとデモプログラムを作りました

プロジェクト名: PEP

公開キー: NDHE33Y3 VKK8N5GY

公開日: 2017/06/11 2017/06/07

バージョン: 1.00

v1.00 初公開
(2017/06/11 --README--を単品で実行してメッセージ読めるようにした)

プチコンのプログラム間でデータ交換を行うためのプロトコルPEPの提案とその実装、およびそのデモプログラムを作りましたので公開です。

スマイルツールはスロット4で実行されるため、プログラム間でデータをやりとりする方法はファイルへの読み書きくらいしかありません。

PEPは、クリップボードをスタックのようにして使うことで、プログラム間でデータをやりとりすることを可能にします。

使い方の例としては、お絵かきプログラムからファイル選択を行う別プログラムを呼び出して、どのファイルが選択されたかを戻してもらう、などの使い方があります。

PEPの詳しい説明は、プロジェクトの中のファイルPEPの中をご覧ください。

デモプログラムとして、PCUIを用意しましたので、実行してみてください。
UNIX風のプログラムを連続実行するCUIの実行環境です。
例として、「FSEL | CAT | HEAD 15 | NL | PRINT」などと入力して実行してみてください。
それぞれのコマンドは別プログラムですが、パラメータをやりとりして連続実行されます。

f:id:eidaht:20170607222537j:plain

よければ、各プログラムのソースを見てみてください。


【PEP 今後の課題】
・PEPの仕様をブログにアップする
・PEPライブラリをプロジェクトをまたいだ実行が可能なようにバージョンアップする

標準のグラフィックエディタ(SBGED)に機能追加してみた

標準のグラフィックエディタ(SBGED)に、GSAVEデータをDATA文にして書き出す機能を追加してみました。

f:id:eidaht:20170515011029j:plain

ファイル名: SBGED

公開キー: 4RQ5438D

公開日: 2017/05/15

バージョン: 1.71 (標準のv1.7を基準にしている)


標準のグラフィックエディタ(SBGED)に次の機能を追加したものです。

・GSAVEデータをDATA文にして書き出す機能
スプライトのGRPをほんのちょっと直しただけなのに、GRP全体を配布するのは仰々しい...、というときに使える機能です。
GSAVEのデータをDATA文として出力してくれます。

【使い方】
①SBGEDが起動したら、COPYモードにして範囲選択します。
②Yボタンを押します。「フォント読み込み」となっていたところが「そのほかの機能」と表示されます。
③さらにYボタンを押します。使える機能が表示されます。
④Yボタンを押して「GSAVEデータ出力」の機能を起動します。
⑤出力先のスロットを聞いてくるので、上下でスロットを選択してAボタンで決定します。
⑥指定したスロットに、DEF文とDATA文が出力されます(画像参照)。
 DEF GLOAD_G04_001となっていたら、プログラム本体で「GLOAD_G04_001」を呼び出すとGRPへの書き込みを行います。
 スプライトやBGの定義に対して使うことを想定していますが、他のGRPに書き込みたい時は、DEF文中のGP,X,Yのあたりを適宜書き換えてください。

プチコンプログラミング覚え書き(7) 互換機能編

プチコンBIGも発売されたので、「3号プログラミング覚え書き」でなくて「プチコンプログラミング覚え書き」にしました。

バンナムDLCを使っているプログラムを一つのソースコードでBIGやDLCの入っていない3号で動かすには

 DLCが入っているか入っていないかは、FILESやCHKFILEでDLCのフォルダを調べることでチェックできます。
 例えば、パックマンDLCの場合、FILES "$PACMAN"とするとDLCが入っていればそのフォルダ名が返ってきますし、DLCが入っていなければ何も返ってきません。
 プチコン3号だけの時はこれでOKでした。

 ところが、プチコンBIGでは、FILES "$PACMAN" のように $ を含むフォルダ名/ファイル名をFILESやCHKFILEに指定すると、Illegal function callエラーになってしまいます。

 そのため、プチコンBIGを含めて対応するには、上記のチェックをするのに先だって、システム変数HARDWAREをチェックしておきます。

 具体的な方法は次のソースコードのとおりです。

VAR DLCNAME$="PACMAN"
IF HARDWARE<2 THEN
 IF CHKFILE("$"+DLCNAME$+"/DEFS") THEN
  DLCOPEN DLCNAME$
  'その他のDLCを使う処理....
 ENDIF
ENDIF

認知心理学の実験 on プチコン3号

以前、プチコンmkIIで作った認知心理学の実験をプチコン3号用に焼き直しました。

キー: EB2X5EKE
公開日: 2016/11/03

mkII時代の動画を貼っておきます。
なお、今回作ったのは、動画のうち実験2の方だけです。
www.youtube.com

補足: ほしけんさんのプチコン漢字ライブラリの高速化を試みた

「ほしけんさんのプチコン漢字ライブラリの高速化を試みた」のエントリの補足(兼自分用メモ)。
eidaht.hatenablog.com

「ほしけんさんのプチコン漢字ライブラリの高速化を試みた」でキャッシュなどを導入してプチコン漢字ライブラリの高速化を行いましたが、いくつか注意点と今後の改良点を。
改造版プチコン漢字ライブラリを以後はKNJLIB_MOD1と表記します。


■注意点1.KNJLIB_MOD1ではメモリ使用量に注意が必要

オリジナル版ではプログラム内リソースを使っているので、ライブラリがロードできればメモリが足りなくなる、ということはないように考えられています。
しかし、KNJLIB_MOD1では参照表に512キロバイトほどの配列を使い、さらにキャッシュ用として動的に拡張する配列を使います。
(キャッシュ用は、16x16フォントでキャッシュサイズが初期状態の300文字の場合、300キロバイト)。

つまり、オリジナル版は、使う側はライブラリの中身をよくしらなくてもブラックボックスとして使えるように設計されていますが、
KNJLIB_MOD1の方は使用するメモリ量を意識しておく必要があります。
(もちろんほとんどケースでは何も考えなくてもメモリが不足することはないと思いますが...。)

さもないと、単純にオリジナル版を置き換えたらメモリ不足で止まってしまった、ということが起こりえます。


■注意点2.パフォーマンス重視の場合、キャッシュを最適化する

KNJLIB_MOD1でパフォーマンス重視の設定にしたい場合は、キャッシュを最適化した方がよいです。
キャッシュは、決められたキャッシュサイズがあり、キャッシュサイズ一杯の状態で新たな文字を読み込むと、最も長く使われていなかった文字をキャッシュから追い出して新たな文字を追加します(いわゆるLRU法)。
この追い出しが発生すると処理に時間がかかってしまいます。
また、キャッシュされている文字がいつ使われたかを覚えておくための領域があり、キャッシュが使われるたびにこれを更新するので、ここでも若干の時間がかかります。
これらのことから、最もパフォーマンスを発揮できるのは、プログラム内で使う文字をすべてキャッシュに収め、かつ、使った文字を覚えておく機能をオフにした時です。

これをできるように、設定用のCOMMON DEFを追加してあります。

・GKNJCACHESIZE
 使い方: 変数 = GKNJCACHESIZE(キャッシュサイズ)
 キャッシュサイズを設定します。
 キャッシュサイズの変更は随時可能ですが、すでに使っているキャッシュサイズよりも小さな値を設定しても、実際のキャッシュサイズは縮小しません。
 キャッシュサイズは、キャッシュに納める文字数を設定します。戻り値はキャッシュサイズを返します。
 キャッシュサイズをプログラムで使う全ての文字の種類より大きく設定するとキャッシュ追い出しが発生しないので、最もパフォーマンスを得ることができます。
 なお、キャッシュに使うメモリ使用量は、(フォント幅×フォント高さ×4×キャッシュサイズ)で計算できます。
 例えば、16x16ドットフォントでキャッシュサイズが300文字の場合、16×16×4×300=307200バイト=300キロバイトを使用します。

・GKNJCACHELRU
 使い方: 変数 = GKNJCACHELRU(TRUE または FALSE)
 使った文字を覚えておく機能のオン・オフを設定します。TRUEでオン、FALSEでオフとなります。
 使った文字を覚えておく機能をオンにしておくと、キャッシュを使うごとにLRUキューの先頭に使った文字を移動します。
 オフの場合、LRUキューの先頭への移動は起こりません。
 LRUキューがキャッシュサイズに達している時に、新たな文字がキャッシュに追加されようとすると、LRUキューの末尾の文字をキャッシュから追い出します。
 前述のキャッシュサイズを最適化して、キャッシュの追い出しが発生しないようにした場合、オフにしておくと若干速度が向上します。
 
!!! とここまで書いて、GKNJCACHELRUにバグがあることがわかりましたので後で直します。スミマセン。 !!!



■注意点3.フォントを切り替えているケースではかえって遅くなる場合がある

KNJLIB_MOD1では、キャッシュがフォントの切り替えに対応しておらず、フォントが切り替わった時に一旦すべてのキャッシュを捨てています。
また、構造上、キャッシュに入っていないフォントをキャッシュに追加するオーバーヘッドで若干時間がかかります。
このため、フォントを頻繁に切り替えている場合、キャッシュを捨てる処理と、フォントをキャッシュに追加するオーバーヘッドの分、オリジナル版より時間がかかることになります。
これに対する対策はフォントの切り替えを行わない、くらいしかありません。
ですが、これでは既存のプログラムに対応できないので、次の今後の改良点につながります。


■今後の改良点.キャッシュをフォント切り替えに対応する

上記注意点3に関する問題は、キャッシュ自体をフォントの数だけ持っておき、それを切り替えることで理論上対応可能です(さらにメモリ消費しますが...)。
そこで次のバージョンではフォント切り替えに対応したキャッシュシステムへの拡張を行います。
さらにメモリを消費するようになるため、これで万事解決、ではないですがとりあえず。

文字列を追加していく時はINCの方が速い

数値を加算する時は、INCを使うよりもA=A+Bのようにふつうの代入と加算の組み合わせの方が速い、という事実が以前から知られていましたが、文字列の時はどうなのか?と思い検証してみました。

以下のようなプログラムを実行します。
f:id:eidaht:20161016194338j:plain
最初のループが代入を使う場合、後のループがINCを使う場合です。

結果は以下のようになりました。
f:id:eidaht:20161016194614j:plain
A(ループを使う方)がB(INCを使う方)の2倍程度の時間がかかっていることがわかります。

何回か実行しても、AとBの順番を入れ替えても同じような結果になるので、ほぼ間違いなく、文字列の場合はA$=A$+B$のような代入よりも、INCの方が速いようだと思われます。
(単純に2倍とは言い切れませんが、それに近い程度の大きな差があります。)

ゲームでは大量(1000回とか)の文字列の連結はほぼ使わないのでどちらでも問題ないでしょうが、文字列を扱うツール系のプログラムでは使い勝手の差が出てくる可能性がありますので気を付けておくといいかも。

ほしけんさんのプチコン漢字ライブラリの高速化を試みた

ほしけんさんのプチコン漢字ライブラリ(KNJLIB)の高速化を試みてみました。

ほしけんさんのプチコン漢字ライブラリ(http://wiki.hosiken.jp/petc3gou/?Toukou%2F%A5%D7%A5%C1%A5%B3%A5%F3%B4%C1%BB%FA%A5%E9%A5%A4%A5%D6%A5%E9%A5%EA)
はプログラムサイズと高速性のバランスがよく、普通の用途には十分な処理速度が出ます。
特に、New3DSではほとんど問題にならないと言っていいでしょう。
私の場合、特殊用途(リアルタイム進行するクイズゲーム)で使うために速度的な制約が厳しいため、プチコン漢字ライブラリの高速化を試みてみました。

キー: 432XE37D

高速化のために改造した点は以下の3点です。
・文字テーブルの検索を、INSTRの代わりに最初に展開した参照表を使うようにした。
・フォントのビットマップをキャッシュするようにした。
・ビットマップテーブルを探す時の処理を若干書き直した。
これにより、オリジナル版に比べて大体5割ほど高速化されていると思います。キャッシュが効く状況ではさらに改善されます。

また、まとめwikiでスーさんが報告されていた、変数の宣言もれなども修正に入れています。


この改造版(「KNJLIB_MOD1」)では、巨大な配列を使いまくっているので、オリジナル版に比べて最低でも1メガバイト程度メモリを余計に消費します。
メモリの制約が厳しいプログラムの場合には使うのはむずかしいかもしれません。
なお、キャッシュサイズはバイト数ではなく、キャッシュする文字数(初期設定では300文字分)で設定するようになっているため、大きなフォントを使うとより大きくメモリを消費します。

オリジナル版のKNJLIBをそのまま置き換えてもほぼ問題なく動作すると思います。
少なくとも、オリジナル版に同梱されているサンプル3種類については、私が検証できる範囲での問題はみられませんでした。

配布時のファイル名は「KNJLIB_MOD1」となっていますので、名前を「KNJLIB」にしてオリジナル版と差し替えることで動作します。


この改造版を使うメリットとデメリットは以下のとおりです。

メリット
・Old3DSの場合、目に見えて高速化する

デメリット
・メモリを非常に多く使う
・初期化により多く時間がかかる
・プログラムの保守性が悪くなっている
New3DSだともともと速いので違いがわりづらい