POKE#800,7,34,18,2,137,24,10,120,19,70,82,8,26,67,10,112,1,49,1,56,247,209,112,71
PCGの#700に使いたい文字のパターンをコピー(この例は0〜9の数字をALT+0〜9へコピー)
COPY#700,ASC("0")*8,10*8
あとは太字化処理したいバイト数を指定してマシン語呼び出し!(2度実行すると更に太字に!)
U=USR(#800,10*8)
ALT+0〜9で書いてみましょう!プログラムでももちろん使えます
FOR I=0 TO 9:?CHR$(224+I):NEXT
ベースのアイデアはこちらMSX版
MSX BASIC で書いたコード(前半)をマシン語で書きなおす(後半)とこれくらい差がある。コードは文字を太文字化するやつ。 pic.twitter.com/ntc2rk7jUR
— ミクミンP/Kazuhiro Sasao (@ksasao) September 14, 2017
MSX BASICのプログラム、70行で書き込んでいる23byteのマシン語部分を解析(逆ハンドアセンブル)してみました。(表示用につくった MSXLIST)
Z80のニーモニックを、asm15表記風に書いてみるとこんな感じです。
BC=#700 HL=#100 @LOOP GOSUB @RDVRM E=A A>>=1 A|=E GOSUB @WRVRM HL+=1 BC-=1 A=B A|=C IF !0 GOTO @LOOP RET
Z80のレジスタは基本8bitなので、16bitとして使うBCレジスタの0判定がおもしろいですね! MSXのVRAMはRAMに割り当てられていないので、BIOSというMSX組み込みのコードを呼び出していました(RDVRM/WRVRM)。 どうもこの呼出が結構遅い様子。VDPという一種のGPUを使って高速化するのが常套手段だったようです。(VDPはGPUの元祖かも?)
IchigoJam用に書き換えたマシン語がこちら(asm15 assemblerでアセンブルできます)
R2=7 R2=R2<<8 R1=R1+R2 @LOOP R2=[R1] R3=R2 R2=R2>>1 R2|=R3 [R1]=R2 R1+=1 R0-=1 IF !0 GOTO @LOOP RET
ほぼ一緒ですね!
このようにCPUが違うとそのCPUで使えるレジスタや、コマンドが違いますが、やっていることは基本的に同じ。 C言語やJavaなどは、このようなCPU毎の差を埋めるプログラム(コンパイラ)が助けてくれているわけです。
何でも作れちゃう感がアップする「マシン語」おすすめです!
「連載、IchigoJamではじめる、Armマシン語入門 1. はじめてのマシン語」