Saturday, July 21, 2018

プチコンで晴れときどき爆弾

MFANにあった「晴れときどき爆弾」です。
2011年ごろ見た目移植したもの。

うさぎの勇姿











動画(youtube)

Saturday, January 11, 2014

プチコンでローマ字入力

プチコンmkIIでローマ字カナ入力するプログラムを作りました。

プログラム自体は1年前にできてて他のプログラムに組み込む予定でした。が忙しくなったり思ったより大変そうだったのでローマ字部分だけ切り出し。

探してみたら、ローマ字変換はいろんな方が作成されていました。見つけていないものもある気がします。

作ったのはサブルーチン的に使うものです。
変換内容がカスタマイズしやすいかもしれません。
他の方と方向性はかぶっていないと思うので公開します。

表示されてるカナも変換結果


QRコード てきとうなプロムラム名 "RK"

使い方
1:準備
 GOSUB @RKSETUP:GOSUB @RK0を実行

2:ローマ字文字列をカナに変換する
 @TITLEのところがサンプルです。
 IN$に変換したいローマ字文字列を入れ、GOSUB @RKで、OUT$にカナ変換された結果が返ります。

3:キー入力を変換する
 @INPTのところがサンプルです。
 K$に入力文字を入れ、GOSUB @RK1で、O$にカナ変換された結果が返ります。
 このとき、文字が足りない場合はO$=""となります。
 例)「チャ」を入力する場合
  K$="C" --> O$=""
  K$="H" --> O$=""
  K$="A" --> O$="チャ"

GOSUB @RK0で入力途中の内容をクリアします。

注意:
  変数AB$、RM$()、RK$()にはカナ変換用データがあり、変数B, C, I$は入力途中の内容を保持しているため書き換えると結果がおかしくなります。
  変数A, D, I, J, L$は保持されません。

補足
ローマ字にはいろんな方式があるのですが、プログラムは今や廃止となったJISX4063:2000の規格+α(Lで始まる変換ほかいろいろ追加)です。

リスト
'ロ-マシ゛ カナ ヘンカン
CLEAR:CLS
GOSUB @RKSETUP
GOSUB @RK0
@TITLE
IN$="RO-MAJI HENNKANN NYUURYOKU"
GOSUB @RK:?OUT$
IN$="TEKITOUNI KI-WO TATTI SITEMITEKUDASAI"
GOSUB @RK:?OUT$
@INPT
VSYNC 1:K$=INKEY$()
IF K$=="" GOTO @INPT
GOSUB @RK1:?O$;:GOTO @INPT
'***************************
@RK
_A=A:_B=B:_C=C:_D=D:_I=I
_I$=I$:_K$=K$:_L$=L$:_O$=O$
OUT$="":GOSUB @RK0
FOR I=0 TO LEN(IN$)-1
K$=MID$(IN$,I,1):GOSUB @RK1
OUT$=OUT$+O$:NEXT
A=_A:B=_B:C=_C:D=_D:I=_I
I$=_I$:K$=_K$:L$=_L$:O$=_O$
RETURN
@RK0
B=0:C=0:I$="":RETURN
@RK1 'B,C,I$ ハ カキカエナイコト!!
IF K$=="^" THEN O$="-":I$="":C=0:RETURN
A=INSTR(RM$(0),K$)
IF A>=0 GOTO @RK2
I$=I$+K$:L$=K$:O$=""
D=B:B=INSTR(RM$(C+1),I$)
IF B>=0 THEN C=C+1:RETURN
IF I$=="NN" THEN O$="ン":I$="":C=0:RETURN
IF I$=="N'" THEN O$="ン":I$="":C=0:RETURN
IF INSTR(AB$,K$)>0 AND C AND K$==L$ THEN O$="ッ":I$=K$:B=D:C=1:RETURN
IF B<0 THEN C=0
O$=K$:I$="":RETURN
@RK2
D=0:IF C THEN D=B/(C+1)
O$=RK$(C*35+D,A):C=0
IF O$=="" THEN O$=I$+K$
I$="":RETURN
@RKSETUP
DIM RM$(4),RK$(35*4,5)
READ AB$:FOR I=0 TO 3:J=0
@RKL
READ A$,B$
IF A$=="-" GOTO @RKLN
RM$(I)=RM$(I)+A$:B=LEN(B$)/5
IF I THEN RM$(I)=RM$(I)+CHR$(176)
FOR K=0 TO 4
C$=MID$(B$,K*B,B)
IF RIGHT$(C$,1)=="." THEN C$=LEFT$(C$,B-1)
IF C$=="." THEN C$=""
RK$(I*35+J,K)=C$
NEXT:J=J+1:GOTO @RKL
@RKLN
NEXT:RETURN
@RKDAT
'JIS X 4063:2000
'*1 Mac:ラリルレロ MS/ATOK:ァィゥェォ
'*2 JISX4063:2000ニハナイ
'*3 チイサイ「カ」「ケ」ノモシ゛フォントカ゛フ゜チコンニナイ
'ッ
DATA .BCDFGHJKLMNPQRSTVWXYZ
'
DATA AIUEO,アイウエオ
DATA -,
DATA B,ハ゛ヒ゛フ゛ヘ゛ホ゛
DATA C,カキクケコ
DATA D,タ゛チ゛ツ゛テ゛ト゛
DATA F,ファフィフ.フェフォ
DATA G,カ゛キ゛ク゛ケ゛コ゛
DATA H,ハヒフヘホ
DATA J,シ゛ャシ゛.シ゛ュシ゛ェシ゛ョ
DATA K,カキクケコ
'*1
DATA L,ラリルレロ
'DATA L,ァィゥェォ
DATA M,マミムメモ
DATA N,ナニヌネノ
DATA P,ハ゜ヒ゜フ゜ヘ゜ホ゜
DATA Q,クァクィクゥクェクォ
DATA R,ラリルレロ
DATA S,サシスセソ
DATA T,タチツテト
DATA V,ウ゛ァウ゛ィウ゛.ウ゛ェウ゛ォ
DATA W,ワ.ウィウ.ウェヲ.
DATA X,ァィゥェォ
DATA Y,ヤ.イ.ユ.イェヨ.
DATA Z,サ゛シ゛ス゛セ゛ソ゛
DATA -,
DATA BY,ヒ゛ャヒ゛ィヒ゛ュヒ゛ェヒ゛ョ
DATA CH,チャチ.チュチェチョ
DATA CY,チャチィチュチェチョ
DATA D',タ゛ァテ゛ィト゛ゥテ゛ェト゛ォ
DATA DH,タ゛ァテ゛ィテ゛ュテ゛ェト゛ォ
DATA DW,ト゛ァト゛ィト゛ゥト゛ェト゛ォ
DATA DY,テ゛ャテ゛ィテ゛ュテ゛ェテ゛ョ
DATA FY,フャフィフュフェフョ
DATA GY,キ゛ャキ゛ィキ゛ュキ゛ェキ゛ョ
DATA HW,ファフィフゥフェフォ
DATA HY,ヒャヒィヒュヒェヒョ
'*2
DATA JY,シ゛ャシ゛ィシ゛ュシ゛ェシ゛ョ
DATA KW,クァクィクゥクェクォ
DATA KY,キャキィキュキェキョ
DATA MY,ミャミィミュミェミョ
DATA NY,ニャニィニュニェニョ
DATA PY,ヒ゜ャヒ゜ィヒ゜ュヒ゜ェヒ゜ョ
DATA RY,リャリィリュリェリョ
DATA SH,シャシ.シュシェショ
DATA SY,シャシィシュシェショ
DATA TH,タァティテュテェトォ
DATA T',タァティトゥテェトォ
DATA TS,ツァツィツ.ツェツォ
DATA TW,トァトィトゥトェトォ
DATA TY,チャチ.チュチェチォ
DATA VY,ウ゛ャウ゛ィウ゛ュウ゛ェウ゛ョ
DATA WH,ウァウィウゥウェウォ
DATA WY,..ウィ..ウェ..
DATA XT,..ッ..
'*3
DATA XK,.....
DATA XW,-....
DATA XY,ャ.ュ.ョ
DATA ZY,シ゛ャシ゛ィシ゛ュシ゛ェシ゛ョ
DATA -,
DATA D'Y,タ゛ァテ゛ィテ゛ュテ゛ェト゛ォ
DATA HWY,フャフィフュフェフョ
DATA T'Y,テャティテュテェテョ
DATA XTS,..ッ..
DATA -,

プログラムは、変換のデータ検索にループを使わず遅くならないようにし、データを人にやさしい感じにしました。データの追加はやりやすいです。

Tuesday, April 30, 2013

プチコンで香港

昔MSX・FANという雑誌に掲載されていた「香港」というゲームをタッチペンで遊ぶのにピッタリだと思ったので、プチコンへ移植してみました。さくさく遊べていい感じです。




操作は、上下左右でカーソル移動、Aで牌を取り、XでUNDO、開始/リプレイはANY KEY。ゲーム中はSTARTボタンでゲーム画面を上画面、下画面に移動できます。上画面のときは、ボタンのみで操作できます。
下画面のときは、タッチペンで操作できます。開始/リプレイは画面どこでもOK。牌を取るときは、タッチで選んで、タッチで取ります。このときタッチで選んでからそのまま(0.2秒以上)タッチし続けると、牌を取るので楽です。

ルールは、1牌目(TAKE OFF! が緑の牌)はどの牌でも可。その後、取った牌から一定の順番に牌を取っていきます。順番は東->南->西->北->白->發->中です。牌がすべてなくなればクリアとなり、エンディングデモがあります。牌の下に2つ空白があると、牌が落下するのでゲームオーバーとなります。



元のMSX版のリストからDATA文を打ちこんで使っていたり、円もGCIRCLEだと雰囲気が違うので自前で描画したりしているので、冗長です。もっと短く、速くできます。
ですが、上下画面で同じスプライト・グラフィック・パレットを利用し、パレットもSPRとGRPで同期したりする手法が遅まきながら分かってきました。

COLOR SPRITESや5ビットパレットをプチコンで利用する(べたべたな)技術も投入し、いろいろ勉強になりました。

なおMSX版香港では斬新な手法で牌の管理をしています。そのあたりも忠実に再現しています。

MSXはSCREEN5(256 x 212)で作られていたので、プチコンのGRP(256 x 192)に収めるために牌の大きさとかあちこち微調整してます。

Saturday, February 2, 2013

プチコンでラスタースクロール2

twitter界隈でラスタースクロールがはやっていたので、乗り遅れでしまいましたがつくってみました。
前に横方向の(疑似)ラスタースクロールを作ってたのですが、今度は横+縦です。もはやラスター関係ないですが、疑似ラスタースクロールということで。

中途半端に何かを意識している画面。。


 ○ッジ○ーサーには似てないし、○ari○Kart64とも違うし、その上遅いし、やっつけ感にあふれています。

こんなのとは違い、プチコン界の方々が作ったものが素晴らしすぎます。
togetter - プチコンでラスタースクロール

QRコード:

Monday, December 24, 2012

プチコンでTiny BASIC

プチコン版Tiny BASICを作ってみました。

Tiny BASICとはその昔作られた、OSがほぼ無いようなPCでRAM容量数KBで動くBASIC処理系です。英語版のwikipediaが詳しいです。

プチコン版を作るにあたり、各種Tiny BASIC(※1)がある中で、Palo Alto版を元にインタプリタ型とし、最も命令が少なそうなものを参考にしました。

プチコン版Tiny BASICの勇姿




処理速度。。。?プログラムによりますが、ループと計算を多く繰り返すようなプログラムでは、プチコン上で実行する速度に比べ、100倍以上遅いです。
動画の後半にある素数を求めるプログラムで、プチコン版だとは25個でTIME=12。Tiny版では7800くらい。(TIME:MAINCNTLのカウント値)




Tiny BASIC for Petitcom 起動後の画面。
現在はバージョン1.0alphaです。
Tiny BASIC on SMILE BASIC !


プチコン版Tiny BASICの仕様
  • プログラムは99行まで
  • プログラムは先頭に行番号が必要
  • 変数はA〜Zの26個(数値用、文字列変数はない)
  • コンソールで命令の直接実行も可能
  • プロムラム実行中、Xボタンで中断可能

命令一覧
HELPコマンドの実行結果です。使える命令が分かるようになっています。
プチコン版TinyBASICのHELP

補足説明
  • GOTO命令の飛び先には、変数を指定できます。
  • LINENOシステム関数は実行中の行番号を返します。GOTOと組み合わせると、なんちゃってGOSUB〜RETURNが実現できます。
  • LIST命令でPAUSEパラメータが指定されると、LIST表示は1画面毎に停止し、キー入力(EnterかAボタン)を待ちます。
  • SAVE、LOAD命令はパラメータに数値を指定します。プチコンの"GRP:TBn"(nは指定した数値)というファイルで保存されます。
  • MEM命令は、プログラム可能な行数の残りを表示します。

オリジナルにあって、プチコン版にない機能
  • コントロールキャラクタの表示 (^Lだとか^Gだとか)
  • GOSUB〜RETURN
  • 配列変数@
  • 数値、変数の2バイト整数演算(演算はプチコンの数値変数による演算そのままなので)
  • ほかにもいろいろあるかも

その他
プログラムの入力は、プチコンのLINPUT命令を利用しています。簡易な実装にはもってこいの命令で、ほぼオリジナルと同じような機能となるようです。しかし32桁しか入力できない、カーソル移動が無いためLIST結果の編集ができないなど、BASIC入力環境としての使い勝手はいまいちです。というわけで現在はbeta版作成中。

beta版以降の夢:
  1. LINPUTよりましなスクリーンエディタ
  2. GOSUB〜RETURN
  3. 配列変数 @
  4. FOR〜NEXT
  5. ほか



作った後に思いましたが、プチコンのSMILE BASICでTINY BASICを動かすのは
  • 車輪の再々...々発明
  • まさに屋上屋
  • いまどき行番号?
などいろんな意味で時代に逆行している感がありますが、それでも作って動くと楽しいのです。



TinyBASIC(alpha) for Petitcom




Saturday, December 8, 2012

プチコンでWIDTH80

プチコンでWIDTH80を実現します。1行に80文字を表示します。
そもそも256ピクセルしか無いところにムリヤリそれっぽく見えるようにしているだけで、その上特定の機種に依存しているため、あまり使えません。



 一部を虫眼鏡で拡大したところ


DSiの画面。虫眼鏡を通したため周辺が歪んでいます
なおこのプログラムはDSiのサブピクセルの仕様を利用(悪用)しているため、DSiでしか意図通りに表示されません。3DSでは、おかしな表示になり文字に見えなくなります。理由は、下の図のとおり、1ピクセル内のサブピクセルの並びがDSiと異なるためです。

DSiのサブピクセルの並び

B
 

G
 

R
 

3DSのサブピクセルの並び
   B   
   G   
   R   

3DSでは3D表示のため、左右方向のサブピクセルにはできなかったのかも知れません。
虫眼鏡でデバッグしていて、3DSで表示できなくて切ない気分を味わいました。

QRコードです。
SUBPXL2
WIDTHを1〜128まで変えられます。WIDTHに応じて、表示する方法を変えています。
WIDTH32までは通常、WIDTH40までは6x8っぽく、それ以上はsubpixel表示です。

サブピクセル関係は、機種依存が判明したため、ここでおわり。

Sunday, December 2, 2012

プチコンでサブピクセルレンダリング?

プチコンでサブピクセルレンダリングと題しましたが、たいしたことはなく、サブピクセルを利用して小さな文字を表示してみるテストです。

DSiの上画面

サブピクセレンダリングとは、おおざっぱにいうと、1ピクセルを構成するRGBをそれぞれ1ピクセルに見立てて、画面を描画することです。

サブピクセルレンダリングの利用例として、MacOS8.5とかClearTypeだとかで、液晶ディスプレイ上でのみ文字がキレイにみえるようにする、特殊なアンチエイリアシングのような技術があります。今でもMacOSXなど各種OSでの表示やテレビなどにも利用されているようです。

次は拡大画面。
文字部分の拡大
"ABCabc123%"という文字が上に横方向に縮小されて表示されます。フォントは、その下に表示されているプチコンのフォントをそのまま使っています。
変な色ですが、なんとか文字が読めるのではないでしょうか。

DSiの液晶は(少なくとも家にあるDSiは)、液晶の1ピクセルにサブピクセルが3つB,G,Rの順番に並んでいます。2つ目の画像を拡大すると見えるかもしれません。(蛇足ながら、B,G,RはBlue,Green,Redの略です)

プログラムでは、プチコンのフォントを読み取り、フォント定義の各ピクセルについて、1サブピクセルを使う様にパレットを定義し、GPSETしています。

例えば、"A"のフォントの1列目は"000F0000"なので、大文字を点灯、小文字を消灯とすると"bgrBgrbgr"となります。"bgr〜"が9個あるのは1ピクセルが3サブピクセル(BGR)で構成されており、8ピクセルの表現に3ピクセル=9サブピクセル必要なためです。

ただ今のプログラムでは制約がきつく、1ピクセルに1パレット割り当てるため、10文字を表現するのが上限です。(1文字あたり3列*8行=24ピクセル必要なので、FLOOR(256/24)=10(文字))

表示を割り切れば、所詮BGR3ビットの組み合わせなので、8パレットを使うと好きなだけ表示が可能になると思います。計算では FLOOR(256/3)=85 となるので、プチコン画面でMSXのSCREEN0,6,7が(変な色で)再現できるかもしれません。

自分のプチコンで見てみたいという物好きな人がいるかもしれませんので、QRコードです。