mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ARM7 Assembler: nur 8 Bit der 32 Bit Register verwenden


Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo NG,

der 6502-Emulator in Assembler ist nun schon weit vortgeschritten. 
Während des Programmierens und des Optimierens ist mir eine Idee 
eingefallen:

bei mir ist es ja so, dass ich die Register A, X und Y jeweils in R10, 
R11 und R12 des ARM7 abbilde. Das Ganze finde ich soweit eigentlich auch 
schon ganz gut. Allerdings sehe ich noch Optimierungspotenzial:

Der ARM7 hat ja im Endeffekt auch Statusflags, die sich stellenweise 
analog dem 6502 verhalten (z.B. Carry-Flag). Das nütze ich z.B. auch 
gleich aus, um LSR und ROR zu Emulieren. Da gehe ich direkt auf das 
Carry-Flag vom ARM7 ein.
op_4a:                    // ASR
  lsrs r10, r10, #1       // shift right r10 (A)
  orrcs r9, r9, #flag_c   // c-flag?
  biccc r9, r9, #flag_c
  affect_nz r10           // calculate affected flags
  add r8, r8, #1          // program counter
  add r6, r6, #2          // 2 clock cycles
  b drive_cpu

Geht das auch mit N und V? Also V wenn Register-Wert > 255. N Wenn im 
Register-Wert BIT7 (0x80) gesetzt ist?

Viele Grüße,
Peter

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Pippinger schrieb:

> Geht das auch mit N und V?

Grundsätzlich ähneln sich die Flags N,V,C,Z oft, aber du musst die 
meisten Operationen dann in den Bits 24-31 durchführen, mit Nullen in 
den Bits 0-23, nicht in den Bits 0-7. Ausser bei den Shifts/Rotates nach 
rechts. Da geht das zwar so auch, aber C kommt aus Bit 23 und Z taugt 
nicht.

Das N Flag ist üblicherweise Bit 7 vom Resultat der 6502 Operation, was 
sich auch ohne Nutzung des N-Flags des ARM testen lässt. Kompliziert ist 
eigentlich nur V, wenn man nicht das V-Flag vom ARM nutzt.

Da es dir offenbar um "Overclocking" der armen 6502 geht (d.h. u Tempo): 
Garnicht erst versuchen, das Statusregister exakt als Byte zu tracken, 
sondern diese 4 Flags so fix wie möglich in irgendwelche Register packen 
(ggf. in mehreren) und nur dort geordnet in einem Byte kombinieren wo 
das gesamte Statusregister benötigt wird (PHP, PLP und Interrupt).

Autor: Peter Pippinger (uncle-sam7)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo AK,

naja, Overclocking kann man nicht sagen. Eigentlich hat das C-Konstrukt 
ja schon von der Geschwindigkeit gereicht, um die SID-Files abzuspielen. 
Mir gehts da eher um den Lerneffekt. Würde das halt gerne so "schick" 
wie möglich lösen. Nebenbei fände ich es auch cool, wenn das Ding am 
Ende Zyklengenau arbeitet...

hab eben noch nen interessanten Beitrag zum Thema gefunden, wo sowas 
wohl schon gemacht wird:

http://forum.6502.org/viewtopic.php?t=1603

Gruß
Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.