Forum

Z PMD 85 Infoserver

:: späť na začiatok témy :: späť na zoznam tém ::
Správa
Autor  Autor ::  Dr.Sid
Poslaná  Poslaná ::  13.07.2009 23:09:27
Predmet  Predmet ::  Re: Popis instrukci
Tak prvni zakys. Jak ma fungovat AC priznak pri odecitani ? Zkousel jsem to krokovat ve vasem emulatoru a nejak mi to nedava smysl. Neni to ani jako pri scitani, ani negace flagu po pricteni doplnku (jak to ma CY).

Jinac uz mam klavesnici, editace radku jede, prikazy zda se jedou, akorat dump vypisuje nesmysly, prave proto ze tam se pouziva DAA a AC. DAA mi zda se jede dobre, ale jak je na adrese 888c 'sbi 2f' tak tam se mi to AC vychazi jinak nez vam .. a vysledek je spatne.
 
Správa
Autor  Autor ::  Roman Bórik
Poslaná  Poslaná ::  14.07.2009 09:04:40
Predmet  Predmet ::  Re: Popis instrukci
Ako bol písal Dex, vyladenie flagov je zvyčajne najväčšia "zábava". Ja som sa tiež pôvodne snažil nájsť na nete rôzne implementácie emulácie i8080, ale nie vždy to čo som našiel bolo správne, takže som nakoniec "ladil" inštrukcie na reálnom PMD 85. V každom prípade mi niektoré implementácie pomohli v tom, že ma inšpirovali, ako na tie flagy ísť. Sám by som na všetko asi neprišiel.
Aby nastavovanie flagov "nezdržiavalo", časť je robená cez tabuľky:


// Tabulka vyhodnotenia pomocneho prenosu AC po operaciach ADD a SUB.
// To ci nastalo AC je mozne zistit z 3. bitu oboch argumentov a vysledku.
// Index do tabulky je vo forme r21, kde r je 3. bit vysledku, 1 je 3. bit prveho
// argumentu (registra A) a 2 je 3. bit druheho argumentu.
// Tabulka je odlisna pre operaciu scitanie a odcitanie.
//
BYTE ChipCpu8080::auxcarryAddTable[8] = {
  0, FLAG_AC, FLAG_AC, FLAG_AC, 0, 0, 0, FLAG_AC
};
BYTE ChipCpu8080::auxcarrySubTable[8] = {
  FLAG_AC, FLAG_AC, 0, FLAG_AC, 0, FLAG_AC, 0, 0
};


Tabuľka pre ostatné príznaky (okrem CY) je dopredu vygenerovaná a v kóde je ako pole bytov:

// Tabulka vyhodnotenia priznakov S, Z, 5, 3, PE a 1

// Tabulka bola vytvorena nasledujucim algoritmom
/*
  int ii, jj, kk;
  BYTE byte;

  for (ii = 0; ii < 0x100; ii++) {
    jj = ii;
    // vypocet parity
    byte = 0;
    for (kk = 0; kk < 8; kk++) {
      byte ^= (jj & 1);
      jj >>= 1;
    }

    sz53p1Table[ii] = (ii & FLAG_S) | (byte ? 0 : FLAG_PE) | FLAG_1;
  }
  sz53p1Table[0] |= FLAG_Z; // Z je nastavene pre hodnotu 0
*/
BYTE ChipCpu8080::sz53p1Table[0x100] = { ... };
 
Správa
Autor  Autor ::  Roman Bórik
Poslaná  Poslaná ::  14.07.2009 09:07:39
Predmet  Predmet ::  Re: Popis instrukci
Tabuľka pre DAA je tiež dopredu vygenerovaná a v kóde je ako pole wordov:

// Tabulka pre instrukciu DAA.
// bity 7:0 indexu predstavuju hodnotu z A pred vykonanim DAA
// bit 8 indexu je CY pred vykonanim DAA
// bit 9 indexu je AC pred vykonanim DAA
// vyssi byte hodnoty predstavuje hodnotu A po vykonani DAA
// nizsi byte hodnoty predstavuje nastavenie priznakov (F) po vykonani DAA
//
// Tabulka bola vytvorena nasledujucim algoritmom
/*
  int ii;
  WORD af;
  BYTE byte;

  for (ii = 0; ii < 0x400; ii++) {
    byte = (ii & 0xFF);
    af = 0;
    if ((ii & 0x200) || (byte & 0x0F) > 9) { // AC
      if ((byte & 0x0F) > 9)
        af |= FLAG_AC;
      byte += 6;
    }
    if ((ii & 0x100) || (byte & 0xF0) > 0x90) { // CY
      byte += 0x60;
      af |= FLAG_CY;
    }
    af |= ((byte << 8) | sz53p1Table[byte]);

    daaTable[ii] = af;
  }
*/
WORD ChipCpu8080::daaTable[0x400] = { ... };

Pochopiteľne, jednotlivé inštrukcie sú spracovávané osobitne a predošlé tabuľky sú používané pre spoločné "vlastnosti".
 
Správa
Autor  Autor ::  Dr.Sid
Poslaná  Poslaná ::  13.07.2009 23:58:54
Predmet  Predmet ::  Re: Popis instrukci
Tak ne, chyba je v tom jak pricitam CY .. ne v AC .. to uz si najdu. Sorry :-D
 
Správa
Autor  Autor ::  dex
Poslaná  Poslaná ::  14.07.2009 07:17:57
Predmet  Predmet ::  Re: Popis instrukci
To znám.
Když jsem psal emulátor Apple I pro ZX Spectrum, měl jsem nahrubo instrukce a hardware za den, a pak týden u instrukcí ladil flagy :o)
:: späť na začiatok témy :: späť na zoznam tém ::