chigolatte+pancakeでカラースタンプのデータを作成できます。
作成したデータはEEPROMに保存/読み込みできます。
また画面上好きな場所にスタンプを表示出来ます。
EEPROM1スロット使ってpancake80x45ドット分のカラースタンプデータを保存できます。
pancakeの画面で
点滅している点がカーソルです。
矢印ボタンで上下左右に移動します。
数字0~9、小文字a~fでカーソルの場所の色データを書き換え、ichigolatteのテキスト画面のVRAMにバイナリデータを書きこみます。
カーソルの色は赤とグレーの時があり、スペースキーで切り替わります。
赤の状態はカーソルを移動後、VRAMのに記録された色が描画されます。
グレーの状態はカーソル移動後はVRAMの状態に関わらずグレーが描画されます。
カーソルを移動させると、縦横8ドットごとにBEEPがなります。
描画したデータは画面左上から縦横8ドットごとにカラースタンプのバイナリデータがichigolatteのテキストVRAMに記録されます。
pancake画面でx、y座標左上から始まり8ドット右にいくごとに次の32ビットになります。pancake画面はい横80ドットですのでpancake画面で一行に10個カラースタンプが並びます。
下に8ドット下がったところは11個目からのデータになります。
pancakeの画面は縦45ドットですのでカラースタンプははみ出るものも入れると縦に6個並びますが、ichigolatteのテキスト画面は24行しかない為、カラースタンプ20個ごとにVRAMは先頭から使うようになっています。
大文字Wを押すと、カーソルの位置を含む8x8ドットの範囲のVRAMのデータをEEPROMのスロット49番目を使用して書きこみます。
EEPROMは1スロットでpancake全画面分のカラースタンプのデータを記録できますので、描画中のVRAMは20個ごとに1個目からのVRAMを上書きしますが、EEPROMに記録されるデータは別々のデータとして保存されます。
大文字Rを押すと、カーソルの位置を含む8x8ドットの範囲のデータをEEPROMからVRAMに書きこみ、読み込んだスタンプをpancake画面に表示します。このとき表示される位置はカーソルの座標より8で割った余りを切り捨てた位置を起点に表示されます。
大文字Cを押すと、カーソルの位置を含むデータがpancake画面の6行目にコピーされ、VRAMもコピーされ、カーソルは6行目に移動します。この状態で大文字Wを押すと、EEPROMにデータが保存出来ます。6行目はpancake画面の縦45ドットより下を直接編集できないため、他の行で作成したスタンプデータをコピーして保存出来るようにしました。
このプログラムでは49番目のスロットにデータ保存しますが、EEPROMのスロット番号はfunction putの部分の1行目のedd=2048*49の49を書き換えて下さい。
小文字g~zを押すと、カーソルの位置を起点にVRAMのスタンプが表示されます。このときは1ドットごとに任意の座標に表示します。お気に入りのスタンプを好きな場所に表示して遊べます。色番号15(f)は透明色になっています。function stpのuartシリアルデータの15を変えれば透明色を変更できます。
説明すると長いですが直感的に好きな絵を描いて保存できますので是非触ってみて下さい。
またこのプログラムで作成したスタンプはEEPROMからデータを読むか、VRAMにバイナリデータを書き込んだ状態で他のプログラムをlrunすれば他のプログラムで使用できます。
このプログラムを作成中に偶然発見したのですが、関数を呼び出すときに引数を省略できる場合があるようです。関数を定義したときと呼び出すときで同じ変数名を使用すると引数を書かなくても動きました。容量を削るときに役立つかもしれません。
// COLOR STAMP var x=0,y=0; uart(128,4,0,15); function line(o){ uart(128,8,1,x,y,x,y,o); } function co(d){ var o; if(x%2>0){ o=d%16; }else{ o=d/16; } return o; } function cd(d,o){ var e; if(x%2>0){ e=d-d%16+o; }else{ e=o*16+d%16; } return e; } function key(k){ var d,o,adr,i,w; adr=x/8*32+x%8/2+y%16/8*320+y%8*4+mem("s"); if((58>k)*(k>47)){ o=k-48; d=cd(mem(adr)); mem(adr,d); } if((103>k)*(k>96)){ o=k-87; d=cd(mem(adr)); mem(adr,d); } if(k>102){ adr=(k-103)*32; stp(); } if(k==87){ w=1; adr=x/8*32+y/8*320; put(); } if(k==82){ w=0; adr=x/8*32+y/8*320; put(); } if(k==67){ w=2; adr=x/8*32+y/8*320; y=42; put(); } if(k==32){ env(env()^2); } w=env()>>1&1; d=mem(adr); o=co(d)*w+15*!w; if((k==28)*(x>0)){ line();x=x-1; } if((k==29)*(x<79)){ line();x=x+1; } if((k==30)*(y>0)){ line();y=y-1; } if((k==31)*(y<44)){ line();y=y+1; } beep((x%8<1)+(y%8<1)); } function put(adr,w){ var d,h,l,i=0,edd,n; while(i<32){ edd=2048*49; d=0x50|(((adr+edd>>16)&1)<<2); h=((adr+edd)&0xff00)>>8; l=(adr+edd)&0xff; edd=mem("s")+adr%640; if(w<1){ i2cw(d,h,l); sleep(30); i2cr(d,n); mem(edd,n); } if(w==1){ n=mem(edd); i2cw(d,h,l,n); sleep(30); } if(w>1){ n=mem(edd); mem(mem("s")+adr%320+320,n); } i=i+1; adr=adr+1; } x=x/8*8;y=y/8*8; stp((adr-32)%640); } function stp(adr){ uart(128,38,2,x,y,15); i=0; while(i<32){ uart(mem(mem("s")+adr+i)); i=i+1; } } function main(){ line((15-(env()>>1&1)*13)*(env()&1)); env(env()^1); setTout(main,300); } setKprs(key); main();
おおお! これはまた気合の入ったツール。PanCakeのスタンプはJamのPCGよりも複雑な分、このツールの強力さが際立ちますね。長い解説もありがとうございます。