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進定数変換

  • $xx → xxhへ
    • vscodeの置換だとこんな感じ
検索 : \$([0-9|A-F][0-9|A-F])
置換 : $1h
  • $E0のように英文字で始まる場合は頭ゼロが必要 → 0E0h みたいな

Z80固有命令変換

  • JR(相対ジャンプ)命令
    • 一律JP命令へ変換する。ただし無条件ジャンプは"JMP"命令なので注意。
  • IM
    • 割り込みモード命令は使えないのでコメントアウト
  • DJNZ
    • Bレジスタデクリメント&ループへ変更
    DEC B
    JP NZ,xxx
  • LDIR
    • 地道なデータCOPYループへ変更
mvloop:
	LD  A,(HL)
	LD  (DE),A
	INC HL
	INC DE
	DEC BC
	JP NZ,mvloop
  • ローテート命令
    • RLC x、RRC Hなどは8080には無い。ローテートできるのはAレジスタだけ
    • 処理順番を変えてAレジスタへロードしてからローテート実行へ変更
  • HL以外のレジスタペアからメモリへロードができない
    • HLレジスタへ入れてロードへ変更
	PUSH HL	
	PUSH BC
	POP HL
	LD 	(dmaAddr),HL
	POP HL