ich habe hier ein Problem bei dem ich mit meinem Latein an Ende bin.
Ich schreibe gerade an einer Emulation einer Zilog Z180 MPU. Der Befehlssatz funktioniert schon prima und ich kann auch schon Progamme darauf laufen lassen.
Das ganze soll später soweit funktionieren das ein CP/M drauf läuft. Die zu emulierende Hardware existiert in echt, habe ich vor ca. 15Jahren selbst designt und zusammengelötet.
Bei der emulation der OnChip Componenten gibt es aber nun ein Problem:
Ich habe folgendes Record:
Code: Alles auswählen
TioSTAT0 = bitpacked record // ASCI-Channel 0 Status
case byte of
0: (STAT0: byte); // 8Bit Register Data
1: (bitTIE: boolean; // Transmit Interrupt Enable
bitTDRE: boolean; // Transmit Data Register Empty
bitDCD0: boolean; // Data Carrier Detect
bitRIE: boolean; // Receive Interrupt Enable
bitFE: boolean; // Framing Error
bitPE: boolean; // Parity Error
bitOVRN: boolean; // Overrun Error
bitRDRF: boolean); // Receive Data Register Full
end;
..
..
ioSTAT0: TioSTAT0; // ASCI-Channel 0 Status
Code: Alles auswählen
if ((not ioSTAT0.bitRDRF) and asciRSR0F) then begin // ist RDR leer und liegen neue Daten im RSR
Auch folgender Test:
Code: Alles auswählen
test1, test2, test3, test4: boolean;
..
..
test1 := False;
test2 := True;
test3 := False;
test4 := True;
..
..
test1 := not ioSTAT0.bitRDRF;
test2 := not ioSTAT0.bitRDRF;
test3 := ioSTAT0.bitRDRF;
test4 := ioSTAT0.bitRDRF;
Seltsamerweise wird im Debug-Modus das Bit richtig ausgewertet.
Bei weiteren Test habe ich herausgefunden das die Bits 'TIE, TDRE, DCD0 und RIE' funktionieren, der Rest dann nicht.
Allerdings funktioniert dieses Record komplett fehlerfrei:
Code: Alles auswählen
TregAF = bitpacked record
case byte of
0: (value: word); // 16Bit Register-Paar AF
1: (F: byte; // 8Bit Register F (lower 8Bit)
A: byte); // 8Bit Register A (upper 8Bit)
2: (Flag_C: boolean; // 'Carry' Flag
Flag_N: boolean; // 'Negative' Flag
Flag_PV: boolean; // 'Parity/Overflow' Flag
nv1: boolean;
Flag_H: boolean; // 'Half-Carry' Flag
nv2: boolean;
Flag_Z: boolean; // 'Zero' Flag
Flag_S: boolean); // 'Sign' Flag
end;
Vielleicht hat jemand von euch eine Idee woran der Fehler liegt.
Falls Ihr weitere Infos braucht, einfach kurz schreiben.
Vielen Dank und schöne Ostern,
HobbyProgrammer