CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

アセンブルエラー

1文字入出力の変更やメモリマップの違いは置いておいて、まずはそのままのコードで
ターゲットをTLCS-90指定でアセンブルできるかを確かめておきます
 
D:\USR\ASM\tlcs>asw -L monitor.asm
macro assembler 1.42 Beta [Bld 97]
(i386-unknown-win32)
(C) 1992,2014 Alfred Arnold
Motorola MPC821 Additions (C) 2012 Marcin Cieslak
68RS08-Generator (C) 2006 Andreas Bolsch
Mitsubishi M16C-Generator also (C) 1999 RMS
XILINX KCPSM(Picoblaze)-Generator (C) 2003 Andreas Wassatsch
TMS320C2x-Generator (C) 1994/96 Thomas Sailer
TMS320C5x-Generator (C) 1995/96 Thomas Sailer
 
assembling monitor.asm
PASS 1
TLCS-90-Adre疆efinitionen
(C) 1993 Alfred Arnold
stddef90.inc(130)
monitor.asm(1633)
PASS 2
stddef90.inc(130)
monitor.asm(1633)
0.34 seconds assembly time
   1633 lines source file
      1 pass
    138 errors
     32 warnings
 
約1600行のソースは瞬時にアセンブルできますが鬼のようにエラーが発生しています。
ただエラーの内容を見ると大したものはなく単純に削除、差し替えで対応できそうです
パタンも大体決まっています
 
(1)error: unknown opcode 
Z80固有のアーキテクチャによる命令でこれは使わないようにするしかありません
    RETN    ・・・NMIハンドラからのリタン RETIで置き換え
    IM 2    ・・・インタラプトモード指定 割込みベクタは固定されているし不要
    RST 18H       ・・・1バイトのリスタート命令は便利だったんですがCALL xxxxに置き換え
 
(2) error: unknown opcode
今更気づきますがTLCS-90でのI/OはメモリマップドI/OなのでもとよりI/O入出力命令はありません。内蔵レジスタもメモリアドレスの後半に割り付けられています。
    OUT (C),A
    IN A,(C)
    OTIR
これらは該当するメモリアドレスへのアクセス、ブロック転送命令に置き換えます
 
(3) error: invalid operand size
I,RレジスタZ80固有のレジスタですからガン無視。削除します
    LD I,A
    LD R,A
 
(4) error: wrong number of operands
TLCS-90アーキテクチャでは直交性が高くなり演算対象がアキュームレータでなくても良くなりました。Z80では演算対象が暗黙的にアキュームレータだったので以下のようなディストネーションを省略したニーモニックでしたがTLCS-90では明示しなくてはいけないようです
    OR L   ・・・ OR A,L    で置き換え
    AND A   ・・・ AND A,A で置き換え
    XOR A   ・・・ XOR A,A で置き換え
    CP nn    ・・・ CP A,nn  で置き換え
 
 (5)warning: short addressing possible
逆にZ80でもシフト・ローテーション命令はアキュームレータ以外も対象にできましたがTLCS-90ではアキュームレータ専用のニーモニックが用意され、それを使えば命令長が減るよ。と教えてくれるワーニングです
    SLA A  ・・・ SLAA で置き換え
    SRL A  ・・・ SRLA で置き換え
 
 
いまどき誰得?なZ80→TLCS90移植tipsでした