福野泰介の一日一創 - create every day

8/5は、日本最古級のパソコン、PC-8001の誕生日!


40周年を記念した、ちっちゃい版がお披露目!
BASICやマシン語で作られたゲームが16本、もちろん、自分で開発も可能!
細部まで再現し、BASICが動作する「PasocomMini PC-8001」 - PC Watch

今回はオリジナルのマイクロソフトのN-BASIC搭載!
33年前の私も、同マイクロソフト製のMSX-BASICで学びました!

35年後輩にあたる、IchigoJam BASICで自在に扱える国産パソコンIchigoJamは、現在バージョン1.4調整中。
こんなBASICのプログラムを入力すると・・・

10 A=RND(14)+1:T=RND(3)*20+20 15 FOR J=0 TO 3 20 FOR I=0 TO A-1 25 LET[I*3],RND(16),RND(16),RND(16) 26 NEXT 30 WS.LED A,256/A+1 40 WAIT T 42 NEXT 50 GOTO 10

オシャレな模様をランダム模様が表示されます!

こちら先週末の永平寺イベントで活躍した、WS2812Bを16x16、256コ並べた、大型ディスプレイ。

WS.LEDコマンドは配列にRGBやGRBの順に入った値を使って最大34コのWS2812BなどのLEDを制御できる1.4新設コマンド。 台二パラメータでリピート設定すれば、何千個ものフルカラーLEDも制御できます!

16x16、256コを個別に制御するには?
ちょっと背伸びしてマシン語を使いましょう。10進数の数を打ち込むだけで使えます。

10 POKE#700,16,181,6,72,9,34,18,2,17,68,3,34,18,2,1,35,238,36,36,136,160,71,16,189,112,71,0,0,4,0,1,80 50 CLS 60 S="プログラミングフェス2019 in エイヘイジ " 100 FOR K=0 TO LEN(S)-1 101 GSB200 102 C=ASC(S+K):P=1:GSB210 103 C=ASC(S+K+1):P=0:GSB210 104 U=USR(#700) 105 NEXT 110 GOTO 100 200 FORI=0TO5:[I]=RND(5)+I/3*15:NEXT:RTN 210 FOR I=0 TO 7 220 FOR J=0 TO 7 230 N=PEEK(C*8+7-I)>>J&1*3 235 A=#900+I*6+J*3*16+P*8*3*16 240 POKE A,[N],[N+1],[N+2],[N],[N+1],[N+2] 250 NEXT 260 NEXT 270 RTN

こちらが1.4で対応するAPIを呼び出す、マシン語部分のプログラム、asm15でアセンブルすると、10行の数の並び、マシン語が生成されます。

PUSH {R4,LR} R0=[@OUT1]L R2=9 ' = data address #900 R2=R2<<8 R1+=R2 R2=3 R2=R2<<8 ' = send 256*3 byte R3=1 ' = step 1 R4=#EE ' API to use WS2812B R4=[R4]W GOSUB R4 POP {R4,PC} RET @OUT1 DATA L #50010004

ただ、32byteもあって、APIを使っている割にはちょっと長い。

使うレジスタを破壊してOKなR3までにできればGOTOで呼び出しでき、PUSH/POPが不要になりそう。短縮するために数とリピートの指定を16bitシフトして1つのレジスタで渡すようにして、OUT1を表すアドレスの設定に6〜8byteも使うので、0指定ならOUT1ってことにしておくと、次のように14byteまで縮まる!

R0+=R1 R1=3 R1=R1<<(8+16) ' 256*3 R2=0 R3=#EE R3=[R3]W GOTO R3

APIづくりは、利用者想いが大事!
まずは自分で使うことだと、身にしみました。

近々バージョンアップします。
BASICで配列を使ったLED遊びはできるので、ベータ版お試しください
IchigoJam 1.4β7


Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / アイコン画像 / プロフィール画像