SMB Laboratoryのトップページへ

SMBDIS.ASMをASM6でアセンブルできるように変更する方法

はじめに

 doppelganger氏による「SMBDIS.ASM - A COMPREHENSIVE SUPER MARIO BROS. DISASSEMBLY」は、minus氏によって開発された「X816 assembler」でアセンブルできるようになっています。これをloopy氏によって開発されたオープンソースの6502アセンブラ「ASM6」でアセンブルできるようにするための変更方法を紹介したいと思います。

具体的な方法と解説

 ASM6でSMBDIS.ASMをそのままアセンブルしようとすると、以下のようなエラーが出てしまいます。

pass 1..
smbdis.asm(667): Illegal instruction.
smbdis.asm(668): Illegal instruction.

※ 余談ですが、ASM6は、ソースコードのファイルが読み取り専用になっていると、「Can't open file.」というエラーがでます。

 エラーが出ている667行目〜668行目あたりをみてみましょう。

667        .index 8
668        .mem 8

 X816は、6502もサポートする65816用アセンブラです。65816は、8ビットCPUである6502の後継にあたる16ビットCPUであり、アキュムレータやインデックスレジスタのビット幅を16ビットではなく8ビットで使用するといったことが行えるようになっています。そのため、X816にはアキュムレータやインデックスレジスタのビット幅を指定するディレクティブが用意されています。X816でアセンブルできるように書かれたSMBDIS.ASMには、これらのディレクティブが含まれているのです。具体的にみていきましょう。667行目のディレクティブ .index 8は、インデックスレジスタを8ビットで使用することを指定しています。同様に、668行目のディレクティブ .mem 8は、アキュムレータを8ビットで使用することを指定しています。

 ASM6は、6502専用のアセンブラです。ですので、ASM6にはアキュムレータやインデックスレジスタのビット幅を指定するディレクティブは必要が無く用意されていません。そのため、SMBDIS.ASMをASM6でアセンブルしようとすると、X816のディレクティブを認識できず、エラーが発生するわけです。

 したがって、ASM6では必要が無く認識できないX816のディレクティブを削除することで、エラーが出なくなります。以下のように667行目と668行目の行頭を ; (セミコロン)にしてコメント化してしまいましょう。

667 ;      .index 8
668 ;      .mem 8

 変更したSMBDIS.ASMをASM6でアセンブルすると、以下のような出力があり、成功します。

pass 1..
pass 2..
smbdis.bin written (32768 bytes).
inserted by FC2 system