堺風の頭部

徘徊、カメラ、PC、その他。

IchigoJam買ってみた~モールス信号出力プログラム

ichigojam.net

 私も子供の頃にBASIC触ってた世代なので、IchigoJamはちょっと気になるアイテムだったんだけど、たまたまちょっと立ち寄った共立電子で、2200円で完成品が売ってるのを見かけて衝動買いした。今更もいいとこだけどね。

 

 この記事の最後の方に書いてるプログラムは、少し改良した上で動作させた様子を動画に撮った記事をアップしてあるよ。

mubouan.hatenablog.com

 

配線について

 とりあえずつなげてみて、手元のキーボード(エレコム TK-FCM084)でも動作した。
 現行のIchigoJam Sってバージョンだと、キーボード端子がPS/2からUSBに変更されてる。だけど、どうも変換アダプター的な処理らしく、キーボード側がPS/2・USB両用のものでないとだめだそうだ。

 モニターは専用品ではなくて、PCに入れてるアナログビデオキャプチャーに接続した。
 買ってから「あ、今時RCAケーブルなんか手元にない」と気付いたけど、大きなダイソーを覗いたらまだ売っていた。「ビデオコード」という商品名で、1.5mの3色のものがあった。もちろん黄色だけあればいいので解した。

 電源はmicro USBだったので、適当にACアダプターに接続。モバイルバッテリーとかでもかなり長時間使えると思う。

 

BASICの仕様について

 最新のファームウェアだとBASICがver. 1.4らしいけど、手元のやつは切り替わり前のブツなのか、1.3だった。アップデートは単体じゃ無理みたい。

ichigojam.net

 リファレンスは上記だけど、パっと見て、流石にN88-BASIC(86)と同じ仕様ではなさそうだった。

15jamrecipe.jimdofree.com

 イチゴジャムレシピというサイトに詳細な情報もあるようだ。

 こちらの「はじめの一歩」が、仕様把握に便利そうだった。

 

 大きいところでは、

  • 数値は符号付き16bit整数だけ
  • 変数はA~Zの1文字ずつ26個
  • 配列変数は1個だけ、[0]~[101](旧版に[101]が使えないのあり)
  • 変数には文字列も格納できるものの、文字列を操作する関数が少ない(LEFT$とかMID$とかFINDとかはない)
  • INPUT命令はそのままでは数値の入力、文字列は入力時にダブルクオートで囲む
  • 条件判断を式の中で行うと、真のとき-1ではなく1になる
  • プログラム長は1024KBまで
  • プログラムの1行は行番号を含めて200字まで

 あたりかな。30年前に触ってたN88-BASIC(86)がめっちゃリッチなBASIC環境に思えるな。

  

単純10万回ループ

10 CLT
20 FOR I=1 TO 1000
30  FOR N=1 TO 100
40  NEXT
50 NEXT
60 PRINT TICK();"TICK (";TICK()/60;"SEC.)"

 このような、ただ単に10万回ループして所要時間を測定するプログラムを走らせてみたところ、7823TICK (130SEC.)と出た。
 IchigoJam BASICは、経過時間の計測が簡単にできて便利ね。

 私がI/Oマガジンを読んでた1992年ごろ、「単純100万回ループ」という遊びが、よく読者投稿コーナーに載っていた。
 当時のパソコン(PC-98が大多数)で、N88-BASIC(86)インタプリタを使ってやるんだけど、数分くらいかかってたはず。V30-10MHzくらいだと10分過ぎてたっけな。結果まで覚えてないけど。
 この遊び、私の記憶にはあるんだけど、ネットには全然見当たらないな。

 IchigoJam Sだと、100万回ループだと約1300秒=21分以上かかるみたい。さすがに16bit時代より時間かかるな。

 

モールス信号再生プログラム

 ちょっと試しに、「入力したキーに応じたモールス信号を出力する」というプログラムを作ってみた。

 IchigoJam Sだからブザーも鳴るし、LEDも光る。
 画面表示・ブザー・LEDの3箇所で、モールス信号を出力するのだ。

 

100' MORSE CODE
110 [0]=0:[1]=3280:[2]=148
120 [3]=448:[8]=484:[9]=158
130 [10]=644:[11]=68:[12]=151
140 [13]=692:[14]=608:[15]=637
150 [16]=149:[17]=242:[18]=241
160 [19]=238:[20]=229:[21]=202
170 [22]=121:[23]=122:[24]=125
180 [25]=134:[26]=161:[27]=377
190 [32]=400:[33]=457:[34]=7
200 [35]=41:[36]=50:[37]=14
210 [38]=1:[39]=49:[40]=17
220 [41]=40:[42]=4:[43]=79
230 [44]=23:[45]=43:[46]=8
240 [47]=5:[48]=26:[49]=52
250 [50]=71:[51]=16:[52]=13
260 [53]=2:[54]=22:[55]=67
270 [56]=25:[57]=68:[58]=77
280 [59]=44:[63]=364
290 CLS:PRINT "PRESS ALT+Q TO END"
300 @LOOP
310  K=INKEY()
320  IF K=250 END
330  IF K=0 GOTO @LOOP
340  IF K=8 C=[1]
350  IF K=10 C=[2]
360  IF K=32 C=[0]
370  IF K>32 C=[K-31]
380  PRINT CHR$(K);"   ";
390  R=C MOD 3
400  IF R>0 GOSUB @SIG
410  C=C/3
420  IF C>0 GOTO 390
430 PRINT:WAIT 6:GOTO @LOOP
440 @SIG
450  PRINT CHR$(47-R);
460  IF R=2 R=3
470  R=R*3
480  LED 1:BEEP 7,R:WAIT R
490  LED 0:WAIT 3
500 RETURN

 ほい。全然煮詰めてないからブサイクな部分が多いとは思うけど。
 420行でラベルじゃなく行番号でジャンプしてるのは、なんかラベルにしたらエラーが出たから。なんだろう?

 プログラムは1KBまでという制限があって、できるだけ無駄なくコード書かないとすぐOut of Memoryが出るね。
 さすがにPC-98でBASIC触ってたら、事実上メモリーなんて埋まりようがなかった。私あんまりタイトなプログラミングやったことないのだなあ。(だから「終了はESCキーでBreakする」なんてやり方はダーティだ、なんて考えた形跡が)

 モールス信号のデータ化は、3進数とみなして数値化してどうにかした。
 とりあえず、まだこの程度のことは自力で思いつける頭の柔軟さがあってよかった。

 BEEPの音長とかWAITの待機時間などは、内部的に1/60秒単位で処理されてるので、ここは扱いやすかった。
 PC-98のBASICだと、CPUが変わっても動作速度が変わらない、というゲームなんかでは必須のことをやるのに結構な手間がかかったもんで。