aburi6800のブログ

コンピュータのプログラミング、ゲームに関するニッチな情報を書いていくブログです。

【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]で停止します)

 

おわりに

 私はこれまでアセンブラでプログラムを作ったことがなく、敷居が高い印象がありましたが、MSXBIOSルーチンが充実しているので、思ったよりも簡単に組めるのではないかな、と感じてます。

 ただ、いきなり全体をマシン語で書くのは大変なので、まずはBASICをメインに、重い部分をアセンブラで書くようにして、徐々に慣れていきたいと思います。

 というわけで、次は「BASICから呼び出すマシン語サブルーチンを作る」にチャレンジします!