石原 博の覚書

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

avrcpm注意点5-2

2020-10-23 17:03:02 | 日記

まず異常終了している<inc,dec> (<ix,iy>+1)を調査

config.inc でINS_DEBUGを有効にすると、以下の情報が得られた

INC (IY+1)
HVNC A =33 BC =5057 DE =8894 HL =2C28 SP=286F PC=1CBE FD 34 01
a'=00 bc'=0000 de'=0000 hl'=0000 IX=0102 IY=0102 I=00
C A =33 BC =5057 DE =8894 HL =2C28 SP=286F PC=1CC1 01 ED 73 -->本来は 00 ED 73
a'=00 bc'=0000 de'=0000 hl'=0000 IX=0102 IY=0102 I=00
C A =33 BC =73ED DE =8894 HL =2C28 SP=286F PC=1CC4 07 1D 31

DEC (IX+1)
HVNC A =33 BC =5057 DE =8894 HL =2C28 SP=286F PC=1CBE DD 35 01
a'=00 bc'=0000 de'=0000 hl'=0000 IX=0102 IY=0102 I=00
S H NC A =33 BC =5057 DE =8894 HL =2C28 SP=286F PC=1CC1 FF ED 73 -->本来は 00 ED 73
a'=00 bc'=0000 de'=0000 hl'=0000 IX=0102 IY=0102 I=00

どうもIY+1やIX+1が 0x1CC1のアドレスを指しており、もともと00だったものが、01やFFになっている。
FFとなってしまった場合に、その部分を RST 7 と解釈して異常を起こしている

インストラクションを実行しているのはZ80int-jmp.asmのこの部分。
instr fetch_MXX, op_INC, store_MXX_0 ;34 ;INC (xx+d)
instr fetch_MXX, op_DEC, store_MXX_0 ;35 ;DEC (xx+d)

fetchとstoreは以下の部分なので、mem_read_dsが怪しい。
fetch_MMX
------------
do_fetch_mxx:
sbic flags,prefixfd
rjmp fetchmxx_fd
ldd xh,y+oz_xh
ldd xl,y+oz_xl
rjmp fetchmxx1
fetchmxx_fd:
ldd xh,y+oz_yh
ldd xl,y+oz_yl
fetchmxx1:
mem_read_ds opl, z_pc ;get displacement
adiw z_pcl,1
clr oph ;sign extend
tst opl
brpl fetchmxx2
com oph
fetchmxx2:
add xl,opl ;add displacement
adc xh,oph
mem_read_d opl ;get operand
ret ;(Ix+d) still in xl,xh

store_MXX_0
--------------
do_store_mxx_0:
mem_write_s opl ;store operand
ret


dram-4bit.inc内のmem_read_dsを見ると、xh, xlを壊していた。
mem_read_ds opl, z_pc なので、xh, xl は DEC (IX+1) DD 35 01 の displacementの部分を指すように
変更される。なので DEC (IX+1)だとdisplacementの次のアドレスをデクリメントしFFになる。
辻褄は完全にあう。
----------------------------------------------
; Read byte from DRAM
; mem_read destreg, memaddr

.macro mem_read_ds
movw xl,@1l
lcall dram_read
mov @0,temp
.endm

ちなみに dram-8bit.incでは xh, xlは壊さない
---------------------------------
.macro mem_read_ds
; cli ;1
out PORTD,@1h ;1
out PORTC,_RAS0 ;1
out PORTD,@1l ;1
out PORTC,_CAS0 ;1
out DDRD,_0 ;1
out PORTC,_OE ;1
rjmp PC+1 ;2
dram_wait DRAM_WAITSTATES ;
in @0,PIND ;1
out PORTC,_255 ;1
; sei ;1
out DDRD,_255 ;1 = 14 + DRAM_WAITSTATES
.endm

4bit DRAMでのテストはしてなかったのだろうと思われる。
結局 mem_read_ds で xh, xlを保存するようにして回避
-------------------------------
.macro mem_read_ds
push xh
push xl
movw xl,@1l
lcall dram_read
pop xl
pop xh
mov @0,temp
.endm

同様のことが mem_read_sにもあり、push popした
----------------------------------------------
.macro mem_read_s
push xh
push xl
movw xl,@0l
lcall dram_read
pop xl
pop xh
.endm

以上の修正でturbo pascalが動くようになった。

 

ただまだエラーが...

Z80doc instruction exerciser
<adc,sbc> hl,<bc,de,hl,sp>....  OK
add hl,<bc,de,hl,sp>..........  OK
add ix,<bc,de,ix,sp>..........  OK
add iy,<bc,de,iy,sp>..........  OK
aluop a,nn....................  OK
aluop a,<b,c,d,e,h,l,(hl),a>..  OK
aluop a,<ixh,ixl,iyh,iyl>.....  OK
aluop a,(<ix,iy>+1)...........  OK
bit n,(<ix,iy>+1).............  OK
bit n,<b,c,d,e,h,l,(hl),a>....  OK
cpd<r>........................  ERROR **** crc expected:a87e6cfa found:7f0bf9d2
cpi<r>........................  ERROR **** crc expected:06deb356 found:0855bd37
<daa,cpl,scf,ccf>.............  OK
<inc,dec> a...................  OK
<inc,dec> b...................  OK
<inc,dec> bc..................  OK
<inc,dec> c...................  OK
<inc,dec> d...................  OK
<inc,dec> de..................  OK
<inc,dec> e...................  OK
<inc,dec> h...................  OK
<inc,dec> hl..................  OK
<inc,dec> ix..................  OK
<inc,dec> iy..................  OK
<inc,dec> l...................  OK
<inc,dec> (hl)................  OK
<inc,dec> sp..................  OK
<inc,dec> (<ix,iy>+1).........  OK
<inc,dec> ixh.................  OK
<inc,dec> ixl.................  OK
<inc,dec> iyh.................  OK
<inc,dec> iyl.................  OK
ld <bc,de>,(nnnn).............  OK
ld hl,(nnnn)..................  OK
ld sp,(nnnn)..................  OK
ld <ix,iy>,(nnnn).............  OK
ld (nnnn),<bc,de>.............  OK
ld (nnnn),hl..................  OK
ld (nnnn),sp..................  OK
ld (nnnn),<ix,iy>.............  OK
ld <bc,de,hl,sp>,nnnn.........  OK
ld <ix,iy>,nnnn...............  OK
ld a,<(bc),(de)>..............  OK
ld <b,c,d,e,h,l,(hl),a>,nn....  OK
ld (<ix,iy>+1),nn.............  OK
ld <b,c,d,e>,(<ix,iy>+1)......  OK
ld <h,l>,(<ix,iy>+1)..........  OK
ld a,(<ix,iy>+1)..............  OK
ld <ixh,ixl,iyh,iyl>,nn.......  OK
ld <bcdehla>,<bcdehla>........  OK
ld <bcdexya>,<bcdexya>........  OK
ld a,(nnnn) / ld (nnnn),a.....  OK
ldd<r> (1)....................  OK
ldd<r> (2)....................  OK
ldi<r> (1)....................  OK
ldi<r> (2)....................  OK
neg...........................  OK
<rrd,rld>.....................  OK
<rlca,rrca,rla,rra>...........  OK
shf/rot (<ix,iy>+1)...........  OK
shf/rot <b,c,d,e,h,l,(hl),a>..  OK
<set,res> n,<bcdehl(hl)a>.....  OK
<set,res> n,(<ix,iy>+1).......  OK
ld (<ix,iy>+1),<b,c,d,e>......  OK
ld (<ix,iy>+1),<h,l>..........  OK
ld (<ix,iy>+1),a..............  OK
ld (<bc,de>),a................  OK
Tests complete

 



最新の画像もっと見る

コメントを投稿