まず異常終了している<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
※コメント投稿者のブログIDはブログ作成者のみに通知されます