FC2ブログ
マシン語で高速グラフィックをやろうとしていますが、どうもサブルーチンにするとうまくない動作をします。
下のようにpsetをサブルーチンにしているのですが、これだと暴走します。

#include
void pset(int16_t ,int16_t ) ;

int16_t usr_sample(int16_t val, void *mem)
{
int16_t x,y,v,w,z;
uint8_t *p0;
p0 = 0x100002d0;
for (y=0;y<10;y++) {
x=y;
pset(x,y);
//z=(x&1)+(y&1)*2;w=(y/2)*32+(x/2);
//p0[w]=p0[w] | (1< }
return -2 * val;
}

void pset(int16_t x,int16_t y)
{
int16_t w,z;
uint8_t *p0;
p0 = 0x100002d0;
z=(x&1)+(y&1)*2;w=(y/2)*32+(x/2);
p0[w]=p0[w] | (1<}


「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



pset関数内でx、yを固定値にすると正常に動くので、どうやら関数呼び出しは行われている物の、引数の引き継ぎがうまくできていないみたいです。

ならば、と思って以下のようにしてみました。グローバル変数X,Yを定義して、その値を渡してみます。

#include
int16_t X,Y; <====================== ここ変更
void pset(int16_t ,int16_t ) ;
int16_t usr_sample(int16_t val, void *mem)
{
int16_t x,y,v,w,z;
uint8_t *p0;
p0 = 0x100002d0;
for (y=0;y<10;y++) {
X=x;Y=y; <====================== ここ変更
pset(X,Y); <====================== ここ変更
//z=(x&1)+(y&1)*2;w=(y/2)*32+(x/2);
//p0[w]=p0[w] | (1< }
return -2 * val;
}

void pset(int16_t x,int16_t y)
{
int16_t w,z;
uint8_t *p0;
p0 = 0x100002d0;
z=(x&1)+(y&1)*2;w=(y/2)*32+(x/2);
p0[w]=p0[w] | (1<}



これでもだめでした。そういうものなのかな?

単一関数で作ると同じような処理で無駄が多発するのでサブルーチンは使いたいですね。
固定メモリ領域で引数を渡せばよさそうですが、それも美しくないですね。

何かコンパイル、リンク設定的なものがないか調べてみようと思います。


2016.06.19 Sun l 未分類 l コメント (0) l top
どうもVRAMの指定アドレスと表示が合わないな、と思って調べていたところ、
猫にコ・ン・バ・ン・ワ様の別のページを見つけました。

ichigojamのファームバージョンごとに実アドレスが違っているということですね。それはそうですね。
実アドレスを調べるコードを開示していただいているので、それを使ってみたところ、Version1.2.1では以下と分かりました。

MEMORY MAP
#000 CHR 0x00004FF0
#700 PCG 0x100000D0
#800 VAL 0x100001D0
#900 VRM 0x100002D0
#C00 PRG 0x100005D0


これで再度試してみます。


2016.06.19 Sun l ICHIGOJAM l コメント (0) l top
ichigojamファームを1.2.1にバージョンアップしてみたところ、以前のものよりかなり速くなっていることが分かりました。

この際だからマシン語と組み合わせて色々やってみようかと思い、環境をセットアップしました。

使ったのが、こちらのIJUTILITYS様のところにある。IJBIN2POKEです。



「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">




これは大変素晴らしいソフトで、上の入力スペースにC言語を入れると、即ICHIGOJAM用のPOKE文データを吐き出してくれます。写真は画面を@で埋めるCソースで試したもので、コードは下のようになります。

#include
int16_t usr_sample(int16_t val, void *mem)
{
int x,y;
char *p0;
p0=0x10000388;
for (x=0;x<24;x++) {
for (y=0;y<32;y++) {
*p0++ = 0x40;
}
}
}

最初 p0=0x900としていたのですが、それだと暴走します。仮想アドレスと気付いて、実アドレスの所在を調べたところ
猫にコ・ン・バ・ン・ワ様の所で公開されているのを見つけ、p0=0x10000388;としたところ、うまく動くようになりました。

スピードはさすがマシン語で、一瞬に画面を@で埋め尽くします。
マシン語サイズも32BYTE程で思ったよりコンパクトです。これはgccがえらいのかな。

ともかく、これでマシン語も使えるようになりましたので、昔を思い出して色々作ってみようかと思います。










2016.06.19 Sun l ICHIGOJAM l コメント (0) l top
ichigojamと繋いでプログラム動作させてみました。
全体像はこんな感じです。


配線は以下のように。



100円ピアノのGND(電池のマイナス)と8個のキーパッドをichigojamのGND,OUT1~6、8,9に繋ぎます。
キーはドレミファソラシドの順でOUT1~6、8,9とします。

動きは動画でご覧ください。


「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">


プログラムは以下の通りです。コマンドとして以下が有ります。

  ”Pキー” :普通の演奏モードです。1~8キーでドレミファソラシドの演奏。スペースでモードから抜けます。
  ”Rキー” :演奏記録モードです。1~8キーでドレミファソラシドの演奏。スペースでモードから抜けます。
          または最大50音符で抜けます。
  ”Mキー” :メモり演奏モードです。演奏記録モードで演奏した内容をリピートします。

2016/6/19AM9 510行、820行を修正しました。

15 t=0:p=0
20 CLS
40 ?"***** 100yen piano *****
60 lc1,5:?"DO RE MI FA SO RA SI DO"
70 OUT1,0:OUT2,0:OUT3,0:OUT4,0:OUT5,0:OUT6,0:OUT8,0:OUT9,0
90 LC1,8:?"Play Rec MemPlay"
100 K=INKEY()
110 IF K=112 OR K=80 GOTO 200
120 IF K=114 OR K=82 GOTO 500
125 IF K=109 OR K=77 GOTO 800
130 GOTO 100
200 '***** PLAYING *****
210 LC1,10:?"PLAYING"
220 GOSUB900
230 IF K=32 GOTO 20
300 GOTO 220
500 LC1,10:?"RECORDING"
510 P=0:T=0
520 GOSUB 900
530 LC1,12:?"TONE:";K;"TIME:";T;" "
540 IF K=32 GOTO 700
550 [P*2]=T:[P*2+1]=K:T=0
560 P=P+1:IF P>=50 GOTO 700
600 GOTO 520
700 LC1,14:?"ENDED"
710 WAIT 60:GOTO 20
800 I=0
805 IF I>=P GOTO 20
806 LC1,12:?I
810 FORJ=0TO[I*2]*2:NEXT
820 K=[I*2+1]+#30:GOSUB943
830 I=I+1:GOTO805
900 K=INKEY():IF K<>0 GOTO 930
910 IF T<10000 T=T+1
920 GOTO 900
930 IF K=32 RTN
940 IF K<#31 OR K>#38 RTN
943 LC1,6:?" ";
945 LC1+(K-#31)*3,6:?"^^^";
950 K=K-#30
960 IF K<7 THEN OUT K,1:WAIT10:OUT K,0:RTN
970 OUT K+1,1:WAIT10:OUT K+1,0
980 RTN


これで普通演奏、録音、再生ができます。
プログラムを工夫すればオルゴールや、ichigojamの演奏機能を合奏なども出来ると思います。




※ご注意:電池3Vで動いているおもちゃですし何か問題が有るとは思えませんが、特にデータシート等が有るわけではないので申し訳ないですが保証はできないです。同じことを実験される場合は一応自己責任でお願いいたします。
2016.06.18 Sat l 未分類 l コメント (0) l top
久しぶりに土日フルに休めますので、朝から工作&ブログ更新を始めました。

まず、だいぶ前にいじってみた100円オルガン。これをichigojamで自動演奏させてやろう、と考えました。



テスターで電圧を測ってみると、キーオンの時の3.2V、オフでは0Vとなっていました。
つまりアクティブHiでオンとなるインタフェースです。

オルガンの基板を見ると、各鍵の丸いテストパッドのようなものが有ります。


しめしめ、と思い、そのパッドにピン付きの線をハンダ付けしました。

なかなか綺麗にできたかと思います。各線を電池の+に当てるとちゃんと音も出ます。

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



試しにichigojamのOUT1とGNDだけ繋いで、OUT1,1でオンにしてみました。
OK,ちゃんと音がでます。



ではこれからプログラムに入ります。
2016.06.18 Sat l 未分類 l コメント (0) l top