【MSX】MSX-BASICとマシン語の処理速度差を体感してみる
さて、前回は開発環境を作りました。
せっかくなので、同じ処理をBASICとアセンブラで書いて、処理速度を比較してみたいと思います。
(2023/04/02) アセンブラソースで不要な部分(SET VRAM WRITE)があったため、削除しました。
BASICの場合
次のようなBASICプログラムを実行してみます。
10 SCREEN 1:WIDTH 32:KEY OFF 20 PRINT "################################"; 30 PRINT "################################"; 40 PRINT "################################"; 50 PRINT "################################"; 60 PRINT "# ### # # ##### ####### ##"; 70 PRINT "# ### # ##### ##### ###### ### #"; 80 PRINT "# # ## ##### ###### ### #"; 90 PRINT "# ### # ##### ##### ###### ### #"; 100 PRINT "# ### # # # ### ##"; 110 PRINT "################################"; 120 PRINT "################################"; 130 PRINT "################################"; 140 PRINT "################################"; 150 PRINT "################################"; 160 PRINT "################################"; 170 PRINT "####### ### ### ## ### ########"; 180 PRINT "####### # ## ##### # #########"; 190 PRINT "####### # # ### #### ##########"; 200 PRINT "####### ### ##### ## # #########"; 210 PRINT "####### ### ## ## ### ########"; 220 PRINT "################################"; 230 PRINT "################################"; 240 PRINT "################################"; 250 PRINT "###############################"; 260 LOCATE 0,0 270 END
ベタで画面いっぱいに文字を表示するプログラムです。
これを適当なファイル名(拡張子は.BAS)で保存して、実行してみましょう。
こんな感じで表示されました。
実行中は、描画しているのが目でわかるくらいに処理が遅いと思います。
アセンブラの場合
では、次にアセンブラで書いてみます。
; ; 画面いっぱいにテキストを表示するプログラム ; CTRL+STOPで停止する ; .area CODE (ABS) .org #0xD000 ; 開始アドレス BREAKX = 0x00B7 ; BIOS(Ctrl-STOP) INIT32 = 0x006F ; BIOS(INIT32) ERAFNK = 0x00CC ; BIOS(ERASE FUNCTION) SETWRT = 0x0053 ; BIOS(SET VRAM WRITE) LDIVRM = 0x005C ; BIOS(RAM TO VRAM BLOCK COPY) PG_START: CALL PG_INIT ; 初期処理 CALL TEXTFILL ; 画面をテキストで埋める PG_MAIN: CALL BREAKX ; BIOSコール(Ctrl-STOP) RET C ; キャリーフラグが立っていたらリターン LD A, #0 JR PG_MAIN PG_INIT: CALL INIT32 ; BIOSコール(INIT32) CALL ERAFNK ; BIOSコール(ERASE FUNCTION) RET TEXTFILL: LD HL, #TEXT ; VRAMに転送するメモリの先頭アドレス LD DE, #0x1800 ; 転送先VRAMアドレス LD BC, #0x300 ; 転送データ長 CALL LDIVRM ; BIOSコール(RAM TO VRAM BLOCK COPY) RET TEXT: .ASCII "################################" .ASCII "################################" .ASCII "################################" .ASCII "################################" .ASCII "# ### # # ##### ####### ##" .ASCII "# ### # ##### ##### ###### ### #" .ASCII "# # ## ##### ###### ### #" .ASCII "# ### # ##### ##### ###### ### #" .ASCII "# ### # # # ### ##" .ASCII "################################" .ASCII "################################" .ASCII "################################" .ASCII "################################" .ASCII "################################" .ASCII "################################" .ASCII "####### ### ### ## ### ########" .ASCII "####### # ## ##### # #########" .ASCII "####### # # ### #### ##########" .ASCII "####### ### ##### ## # #########" .ASCII "####### ### ## ## ### ########" .ASCII "################################" .ASCII "################################" .ASCII "################################" .ASCII "################################" .DB #0
これを適当なファイル名で保存して、前回のようにコンパイルし、MSXでBLOADしましょう。
どうでしょうか?
一瞬で表示さましたね!
これがマシン語の威力です!
([CTRL]+[STOP]で停止します)
おわりに
私はこれまでアセンブラでプログラムを作ったことがなく、敷居が高い印象がありましたが、MSXはBIOSルーチンが充実しているので、思ったよりも簡単に組めるのではないかな、と感じてます。
ただ、いきなり全体をマシン語で書くのは大変なので、まずはBASICをメインに、重い部分をアセンブラで書くようにして、徐々に慣れていきたいと思います。
というわけで、次は「BASICから呼び出すマシン語サブルーチンを作る」にチャレンジします!