Z80 ASM(TASM)を8080 ASMへ移植する - kuninet/KZ80_CPM GitHub Wiki
このメモの概要
- TASM (A Table Driven Cross Assembler for the MSDOS)で書かれたZ80アセンブラソースを、ザイログニーモニックのまま8080非対応命令をみつけて修正する場合の手順メモ。(ニッチだw)
- Z80ニーモニックで書かれたソースをアセンブリ時に、8080命令以外(アドレッシングモードが対応してナイヨなど...)の場合はエラーを出してくれますので移植がスムーズに進みます。(疑似命令などが変わっちゃうのが痛いですが...)
使用する8080用クロスアセンブラについて
$ asl -cpu 8080 -L xxxx.ASM
- ちなみにアセンブリするとxxxx.pファイルができるので、以下のコマンドでインテルHex形式に変換したりする。
$ p2hex -r \$-\$ -F Intel XXXX.p
ASで8080ソースだけどZ80ニーモニックを使う場合
- ソースコードの先頭に以下を追加してザイログニーモニックを許可する
- ただしCP命令はCall S,xx命令、JP命令はJP S,xx命令と認識される。(☆★重要)
- 以下の宣言文を入れても8080命令が通るので、上記2命令は8080命令へ変更する
Z80SYNTAX ON
アセンブラが認識できないコードを手動置換
- "JP"命令を検索して無条件ジャンプは"JMP"命令へ手動変更
- "CP"命令を検索してリテラルと比較するCP命令は"CPI"命令へ。レジスタと比較する命令は"CMP"命令へ変更
疑似命令変換
- TASM(テーブルアセンブラ)の疑似命令は先頭に"."がついている
- .EQU → EQU
- .DB → DB
- .DW → DW
- .TEXT → DB
- .BYTE → DB
- .ORG → ORG
- .END → END
16進定数変換
検索 : \$([0-9|A-F][0-9|A-F])
置換 : $1h
- $E0のように英文字で始まる場合は頭ゼロが必要 → 0E0h みたいな
Z80固有命令変換
- JR(相対ジャンプ)命令
- 一律JP命令へ変換する。ただし無条件ジャンプは"JMP"命令なので注意。
- IM
- DJNZ
DEC B
JP NZ,xxx
mvloop:
LD A,(HL)
LD (DE),A
INC HL
INC DE
DEC BC
JP NZ,mvloop
- ローテート命令
- RLC x、RRC Hなどは8080には無い。ローテートできるのはAレジスタだけ
- 処理順番を変えてAレジスタへロードしてからローテート実行へ変更
- HL以外のレジスタペアからメモリへロードができない
PUSH HL
PUSH BC
POP HL
LD (dmaAddr),HL
POP HL