石原 博の覚書

電子工作に関する日々の覚書を記載します

avrcpm注意点5-3

2020-10-31 20:56:43 | 日記

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で問題が出ないことがわかった。

 



最新の画像もっと見る

コメントを投稿