今年のプログラミング初めはマシン語で、7セグエミュレーション。
IchigoJam ver 1.4.1 実機での動作比較。BASICでもまぁまぁの速さですが、左から徐々に書き換わるところが目でも追えてしまう程度。対して、マシン語版は瞬時に切り替え、キビキビ動きます。
今年18年目を迎える株式会社jig.jp、社名の由来は「軽快」を辞書で探して見つけた単語「軽快なテンポで踊るjigダンス」に、日本発の意気込み加えた「jig.jp」。 原点は34年前から始めたプログラム、もっと快適に、もっと速く、もっと便利に。より豊かな社会の実現への探求は続きます。
一日一創 2020
今年もよろしくおねがいします
7セグエミュレーション、マシン語化メイキング
BASICのカウントダウンプログラムから、マシン語化する部分を決める
95 FORI=0TO7:[I]=0:NEXT 100 IFN&1[0]=[0]|#38 101 IFN&2[1]=[1]|4:[2]=[2]|4:[3]=[3]|4 102 IFN&4[5]=[5]|4:[6]=[6]|4 103 IFN&8[7]=[7]|#38 104 IFN&16[5]=[5]|#40:[6]=[6]|#40 105 IFN&32[1]=[1]|#40:[2]=[2]|#40:[3]=[3]|#40 106 IFN&64[4]=[4]|#38 107 IFN&128[2]=[2]|1:[5]=[5]|1 110 FORI=0TO7:POKE#700+I+M*8,[I]:NEXT
パラメータのセグメントを表すNと、書き換えるキャラクターを表すMをマシン語ルーティーンに渡す方法を決めます。 マシン語はPCG領域の始めの方を空けて、#740からスタート。192byteまでのマシン語が入ります。
U=USR(#740,M<<8|N)
RAMのアドレスR1を計算して、PCGをメモリアクセスを使って初期化(参考、マシン語入門その5)
R2=R0 R3=8 R2>>=R3 R3=3 R2<<=R3 R1=R1+R2 R2=7 R3=8 R2<<=R3 R1=R1+R2 R2=0 [R1+0]L=R2 [R1+1]L=R2
100行のBASICのプログラムのマシン語化、Nの1ビット目を判定して、メモリを書き換えます
R2=1 R0&R2 IF 0 GOTO @SKIP0 R3=#38 R4=[R1+0] R4|=R3 [R1+0]=R4 @SKIP0
この調子で7+1セグメント分作ります(asm15ソース全文)
レジスタR4は元に戻すルールなので、PUSH {R4,LR} ではじめて POP {R4,PC} で終わる、Armマシン語の定石。
できたアセンブリ言語のプログラムをハンドアセンブルか、asm15を使ってマシン語を生成して、プログラムへ組み込みます。
サクサクバージョンのできあがり!
10 POKE#740,16,181,2,70,8,35,218,64,3,35,154,64,137,24,7,34,8,35,154,64,137,24,0,34,10,96,74,96,1,34,16,66,3,208,56,35,12,120,28,67,12,112,82,0,16,66,9,208,4,35,76,120,28,67,76,112,140,120,28,67 20 POKE#77C,140,112,204,120,28,67,204,112,82,0,16,66,6,208,4,35,76,121,28,67,76,113,140,121,28,67,140,113,82,0,16,66,3,208,56,35,204,121,28,67,204,113,82,0,16,66,6,208,64,35,76,121,28,67,76,113 30 POKE#7B4,140,121,28,67,140,113,82,0,16,66,9,208,64,35,76,120,28,67,76,112,140,120,28,67,140,112,204,120,28,67,204,112,82,0,16,66,3,208,56,35,12,121,28,67,12,113,82,0,16,66,6,208,1,35,140,120 40 POKE#7EC,28,67,140,112,76,121,28,67,76,113,16,189 RUN NEW 10 S=1*60*60 20 VIDEO5:CLS:LC2,2:FORI=0TO4:?CHR$(224+I);:NEXT 25 LET[10],`111111,`110,`1011011,`1001111,`1100110,`1101101,`1111101,`100111,`1111111,`1101111 31 N=S/60/60:F=~S&1:M=0:GSB90 32 N=S/60%60/10:F=0:M=1:GSB90 33 N=S/60%60:F=~S&1:M=2:GSB90 34 N=S%60/10:F=0:M=3:GSB90 35 N=S%60:M=4:GSB90 40 S=S-1 42 WAIT60 50 IF S>=0 GOTO31 55 LET[20],`1110110,`1110111,`1110011,`1110011,`1110010 60 FORM=0TO4:N=[20+M]:GSB95:NEXT:WAIT60 61 LET[30],2,0,2,0:FORM=0TO3:N=[30+M]:GSB90:NEXT:N=0:M=4:GSB95:WAIT60 62 GOTO60 90 N=[N%10+10]+F*128 95 U=USR(#740,M<<8|N):RTN