avrcpm注意点5-2の最後に zexdocのテストのうち
cpd, cpiでエラーが出ていることを報告したが、
これはavrcpmが原因でないことが分かった。
原因は思いもよらないところ。以下に状況を説明する。
[1]zexdocで <inc,dec>(<ix,iy>+1)が異常終了することがわかった
[2]全テストをすると12時間以上かかることから、zexdocのソースを編集し一部のテストだけ実行するように変更しアセンブルすることを試みた
[3]ソースにはマクロが使われており、またz80のニーモニックのためcp/mのasm.comではアセンブル出来ない。zmacアセンブラが必要らしい。しかしzmacの入手方法がわからない。
[4]やむおえず、rubyを使用してマクロ展開。linux上のz80asmを使用してアセンブル
[5]これで調査し、異常終了は解決出来た(avrcpm注意点5-2 参照) ところが、cpd, cpiでエラーが発生することがわかった
原因
zexdocのソースは以下のとおり
----------------
; cpd<r> (1) (6144 cycles)
cpd1: db 0d7h ; flag mask
tstr 0edh,0a9h,0,0,0c7b6h,072b4h,018f6h,msbt+17,08dbdh,1,0c0h,030h,094a3h
tstr 0,010h,0,0,0,0,0,0,0,010,0,-1,0 ; (1024 cycles)
tstr 0,0,0,0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles)
db 0a8h,07eh,06ch,0fah ; expected crc
tmsg 'cpd<r>........................'
; cpi<r> (1) (6144 cycles)
cpi1: db 0d7h ; flag mask
tstr 0edh,0a1h,0,0,04d48h,0af4ah,0906bh,msbt,04e71h,1,093h,06ah,0907ch
tstr 0,010h,0,0,0,0,0,0,0,010,0,-1,0 ; (1024 cycles)
tstr 0,0,0,0,0,0,0,0,0,0,0d7h,0,0 ; (6 cycles)
db 006h,0deh,0b3h,056h ; expected crc
tmsg 'cpi<r>........................'
rubyでマクロを展開したものは以下のとおり
---------------------
; cpd<r> (1) (6144 cycles)
cpd1: db 0d7h ; flag mask
lab41: db 0edh,0a9h,0,0
dw 0c7b6h,072b4h,018f6h,msbt+17,08dbdh,1
db 0c0h
db 030h
dw 094a3h
lab42: db 0,010h,0,0
dw 0,0,0,0,0,010
db 0
db -1
dw 0 ; (1024 cycles)
lab43: db 0,0,0,0
dw 0,0,0,0,0,0
db 0d7h
db 0
dw 0 ; (6 cycles)
db 0a8h,07eh,06ch,0fah ; expected crc
lab44: db 'cpd<r>........................'
ds lab44+30-$,'.'
db '$'
; cpi<r> (1) (6144 cycles)
cpi1: db 0d7h ; flag mask
lab45: db 0edh,0a1h,0,0
dw 04d48h,0af4ah,0906bh,msbt,04e71h,1
db 093h
db 06ah
dw 0907ch
lab46: db 0,010h,0,0
dw 0,0,0,0,0,010
db 0
db -1
dw 0 ; (1024 cycles)
lab47: db 0,0,0,0
dw 0,0,0,0,0,0
db 0d7h
db 0
dw 0 ; (6 cycles)
db 006h,0deh,0b3h,056h ; expected crc
lab48: db 'cpi<r>........................'
ds lab48+30-$,'.'
db '$'
ここで注意が必要なのは、以下の部分の「010」。
ただしソースがおかしいわけでも、マクロの展開がおかしいわけでもない。
------------------------------------
lab42: db 0,010h,0,0
dw 0,0,0,0,0,010
lab46: db 0,010h,0,0
dw 0,0,0,0,0,010
実は z80asm では 「010」は(unixの伝統か?)8進数として扱われ、
8とアセンブルされてしまうが、オリジナルでは10とアセンブルされている。
(実はオリジナルのzexdoc.comと、z80asmでアセンブルしたzexdoc.comを xxd と diffを使用し比較し気づいた)
結局avrcpmは、前回の修正を行えばzexdocで問題が出ないことがわかった。