Autor ::Roman Bórik Poslaná :: 14.07.2009 09:04:40 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 ::Roman Bórik Poslaná :: 14.07.2009 09:07:39 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]);