OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 27.04.2024, 08:04

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 7 ] 
Autor Zpráva
 Předmět příspěvku: Emulácia inštrukcie BIT na Z80
PříspěvekNapsal: 08.05.2015, 18:17 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1406
Has thanked: 130 times
Been thanked: 71 times
Zexall mi píše, že mám chybu v emulácii inštrukcie BIT:
Kód:
Z80 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>....  ERROR **** crc expected:5e020e98 found:fe7d580c
cpd<r>........................  OK
cpi<r>........................  OK
<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

Čo je na tom zvláštne je, že Zexdoc mi chybu nepíše nikde (pokiaľ tomu správne rozumiem, Zexall testuje všetko a Zexdoc len dokumentované inštrukcie:
Kód:
Z80 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>........................  OK
cpi<r>........................  OK
<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

Moja implementácia tejto inštrukcie je takáto:
Kód:
function Z80Bit8(b, r: Integer): Integer; inline;
var
  reg: Integer;
begin
  case PrefixIndex of
  0:
    begin
      case r of
      0: reg := Z80GetB;
      1: reg := Z80GetC;
      2: reg := Z80GetD;
      3: reg := Z80GetE;
      4: reg := Z80GetH;
      5: reg := Z80GetL;
      6: reg := MemGet(Z80GetHL);
      7: reg := Z80GetA;
      end;
      XF := Z80GetBit(reg, 3);
      YF := Z80GetBit(reg, 5);
    end;
  1:
    begin
      reg := MemGet(Z80GetIX + OffsetIndex);
      XF := Z80GetBit(Z80GetIX + OffsetIndex, 11);
      YF := Z80GetBit(Z80GetIX + OffsetIndex, 13);
    end;
  2:
    begin
      reg := MemGet(Z80GetIY + OffsetIndex);
      XF := Z80GetBit(Z80GetIY + OffsetIndex, 11);
      YF := Z80GetBit(Z80GetIY + OffsetIndex, 13);
    end;
  end;
  reg := reg and (1 shl b);
  NF := 0;
  HF := 1;
  Z80SetZFlag(reg);
  PF := ZF;
  SF := Z80GetBit(reg, 7);
  case PrefixIndex of
  1, 2: Result := 20;
  else
    if r = 6 then
      Result := 12
    else
      Result := 8;
  end;
end;

Vstupy sú tieto:
b: bit
r: poradové číslo registra (v tele funkcie je to vidieť)
Výstup je počet tikov inštrukcie.

Je to kompletná funkcia pre emuláciu BIT vrátane nedokumentovaných vlastností. Emulácia s prefixom pre IX alebo IY register je v poriadku, takže Zexall píše chybu vtedy, ak má premenná PrefixIndex hodnotu 0. Použité funkcie v kóde sú použité na zistenie bitu a zistenie nuly. Používajú sa aj inde a sú určite v poriadku. Chyba je niekde v uvedenom kóde.

Vie mi niekto poradiť, čo je tam zle?

Emuláciu Z80 mám podľa tohto dokumentu:
http://www.z80.info/zip/z80-documented.pdf

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Emulácia inštrukcie BIT na Z80
PříspěvekNapsal: 08.05.2015, 18:59 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3675
Bydliště: Bratislava
Has thanked: 373 times
Been thanked: 798 times
Flagy SF,XF,YF by sa mali nastavovat do 1 podla prislusnych bitov temporary bajtu len ak testovany bit je 1.
Ale ak som spravne pochopil tvoj kod, nastavujes ich podla prislusnych bitov napevno, bez ohladu na stav testovaneho bitu.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Emulácia inštrukcie BIT na Z80
PříspěvekNapsal: 08.05.2015, 19:53 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2735
Has thanked: 147 times
Been thanked: 423 times
Milsa ja to vidim takto, kdyz se zamerim jen na YF, tak skoro vzdy je navratova hodnota nula. Jen pri r=5 a soucasne kdyz bit5 je v log1 je navratova hodnota jedna.

if ( (r==5) && (b and 32) ) YF=1; else YF=0;


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Emulácia inštrukcie BIT na Z80
PříspěvekNapsal: 08.05.2015, 21:31 
Offline
Radil

Registrován: 08.10.2013, 18:00
Příspěvky: 297
Has thanked: 13 times
Been thanked: 228 times
Tak tak, bity 3 a 5 (stejně jako ostatní) registru F se nastavují podle výsledku operace, ne podle registru. BIT se interně provádí jako "r AND (2^bit)", výsledek se zahodí, ale flagy se nastavují podle tohoto výsledku.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Emulácia inštrukcie BIT na Z80
PříspěvekNapsal: 08.05.2015, 23:25 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1406
Has thanked: 130 times
Been thanked: 71 times
Aha, jasné, túto drobnosť som prehliadol. Takže rozdiel medzi Zexall a Zexdoc je aj v bitoch 3 a 5. Veľká vďaka. To je tak, keď si človek prezerá vlastný kód, tak mu neraz chyby ujdú a musí to proste vidieť niekto iný, aby si tú chybu dotyčný uvedomil. Vedel som, že bity X a Y sa nastavujú len vtedy, ak sa aj testujú, ale akosi som si neuvedomil, že keď načítam register, tak ešte nie je spracovaný.

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Emulácia inštrukcie BIT na Z80
PříspěvekNapsal: 09.05.2015, 10:49 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 09.10.2013, 19:04
Příspěvky: 1406
Has thanked: 130 times
Been thanked: 71 times
Tak problém som vyriešil pre ostatné registre a ostal mi (HL). No ale toto ma dostalo:
Citace:
Things get more bizarre with the BIT n,(HL) instruction. Again, except for YF and XF the
flags are the same. YF and XF are copied from some sort of internal register. This register is
related to 16 bit additions. Most instructions do not change this register. Unfortunately, I haven’t
tested all instructions yet, but here is the list so far.

To netuším ako mám emulovať. Dole sú nejaké inštrukcie, čo ten register menia, ale mám z toho španielsku dedinu.

Doplnené: To mám teraz vytvoriť nový register a pri týchto inštrukciách upravovať jeho hodnotu, aby som mal čo vložiť do týchto bitov registra F?

_________________
Sharp MZ-821
Milsa MZ-841


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Emulácia inštrukcie BIT na Z80
PříspěvekNapsal: 09.05.2015, 12:25 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2735
Has thanked: 147 times
Been thanked: 423 times
Milsa myslim ze budes muset navic pri kazde instrukci nastavovat v programu dalsi registr TMP. Vzdy do neho budes muset ulozit posledni hodnotu co prochazi pres tento registr, samozrejme jen kdyz bude prochazet. Inspiroval bych se http://www.msxarchive.nl/pub/msx/mirror ... 0prg02.htm. Podle vseho tento docasny vnitrni registr hraje roli pri instrukci BIT.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 7 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 24 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz