IchigoDotsWatchを作りました。

IchigojamにIchigoDotsとリアルタイムクロックモジュールを組み合わせた時計を作りました。

動画は、13時59分~14時0分と、14時10分~14時11分です。

スクロールや画面切り替えは無しで時計を作りたかったので、表示を工夫しました。
周りの点の、点滅している場所で時刻がわかります。アナログ時計の文字盤を歪めたような配置です。数字は分です。(使用に慣れがいります)

表示する数字と文字盤のパターンをすべてPCGで文字として定義し、ビット演算で合成して表示しています。

参考:
http://fukuno.jig.jp/app/IchigoJam/monodots-i.html (monodots-i PCG定義)
http://fukuno.jig.jp/1426 (同じRTCモジュールを使用しました)

http://d.hatena.ne.jp/shiro0922/ (IchigoDots関連)

書籍「みんなのIchigoJam入門 BASICで楽しむゲーム作りと電子工作 」(ビット演算)

以下はプログラムです。2スロット使用しています。IchigoDots POKEの方を0番、IchigoDotsWatchを1番にセーブすることを想定しています。

10 'IchigoDots POKE
20 CLV:CLS:CLP:VIDEO 0:UART 1:?"MATLED SHOW F0F0F0F00F0F0F0F"
30 ?"MATLED ROTATE 0"
40 POKE#7E8,#2A,#01,#80,#01,#80,#01,#80,#54
50 POKE#708,#00,#00,#00,#00,#00,#00,#00,#00
60 FOR T=#710 TO #760 STEP 8:COPY T,#708,8:NEXT
70 POKE#708,#08:POKE#710,#02
80 POKE#719,#01:POKE#723,#01:POKE#72D,#01
90 POKE #737,#04:POKE#73F,#10:POKE#747,#40
100 POKE #74E,#80:POKE#754,#80:POKE#75A,#80
110 POKE #760,#20
120 M=#0E:N=#0A:O=#02:P=#08
130 POKE #768,#00,#00,M,N,M,N,M,#00
140 FOR T=#770 TO #7B0 STEP 8:COPY T,#768,8:NEXT
150 POKE#76C,N:POKE#772,O,O,O,O,O:POKE#77B,O,M,P:POKE#783,O,M,O
160 POKE#78A,N,N,M,O,O:POKE#793,P,M,O:POKE#79B,P:POKE#7A3,O,O,O,O
170 POKE#78A,N,N,M,O,O:POKE#793,P,M,O:POKE#79B,P:POKE#7A3,O,O,O,O
180 POKE#7B5,O
190 COPY #7B7,#768,49
200 FOR I=#7B8 TO #7E7:Q=PEEK(I)<<3:POKE I,Q:NEXT
210 POKE #7C1,#40,#40,#40,#40,#40
220 FOR T=0 TO 31
230 ?HEX$(T*8+#700);CHR$(T+#E0);"  ";
240 NEXT
250 LRUN 1
5 'IchigoDotsWatch
10 FOR J=0 TO 5:[J+20]=#7B8+J*8:NEXT
13 FOR J=0 TO 9:[J+30]=#768+J*8:NEXT
15 FOR J=0 TO 11:[J+40]=#708+J*8:NEXT
20 CLS
30 GOSUB400
70 FOR I=0 TO 7
80 A=PEEK(#7E8+I)
90 B=PEEK([E]+I)
95 C=PEEK([F]+I)
100 POKE #7F8+I,A|B|C
110 NEXT
200 GOSUB 600
210 WAIT 30
220 FOR I=0 TO 7
230 A=PEEK([D]+I)
240 B=PEEK(#7F8+I)
250 POKE #7F8+I,A^B:NEXT
260 GOSUB 600
300 WAIT30:GOTO 30
400 POKE#700,0
410 IF I2CR(#68,#700,1,#701,7) ERR
420 FOR I=0 TO 5:[I]=PEEK(#707-I):[I]=[I]>>4*10+[I]&15:NEXT
430 IF[4]>12 [4]=[4]-12
440 D=[4]+40
450 E=[5]/10+20:F=[5]%10+30
500 RTN
600 ?"MATLED SHOW ";:FOR I=0 TO 7:N=PEEK(#7F8+I):IF N<16 ?0;
610 ?HEX$(N);:NEXT:?
620 RTN

≪解説≫

IchigoDots POKEから

20 初期化とIchigoDotsにダミーデータ。これがないと30でのROTATEが効かなかった。
あとはひたすらPOKE。COPYも使って節約しようとしています。

30 文字を作成して、それをIchigoDotsに表示させる方法をとったので、画面回転して、文字を表示させやすくしました。(単純にIchigoDots自体を回転させても可)

220~240は、確認用に画面表示しています。開発中の名残です。20のVIDEO 0と250のLRUNを消すと、定義した文字の一覧が見れます。

f:id:maeno369:20161119002946j:plain

#708~#760時刻を表す点の点滅用マスク
#768~#7B0分の一の位
#7B8~#7E0分の十の位
#7E8時刻を表す点

IchigoDotsWatch

10~15配列に文字の入ったメモリを割り当てます。
[20]~[25]分の十の位を表す文字
[30]~[39]分の一の位を表す文字
[40]~[51]時刻を表す文字(点滅する位置)

先にサブルーチンから。
400~410リアルタイムクロックモジュールから時刻を取り出しています。これは福野さんのブログのプログラムのままなので、年月日や秒も取り出しています。(正直わかっていません)

430~500[4]が時刻、[5]が分です。変数Dに時刻(午後の場合、➖12しています)、Eに分の十の位、Fに分の一の位を入れて、それぞれ最初の配列に対応するように40,20,30を足してます。

600~620IchigoDotsに出力しています。

70~110文字を論理和で合成してIchigoDotsに表示させる文字を作成。
220~250先ほどの文字の、時刻部分が消えた文字を排他的論理和で作成して、0.5秒ごとに切り替えて点滅させます。