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


von Peter P. (uncle-sam7)


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.
1
op_4a:                    // ASR
2
  lsrs r10, r10, #1       // shift right r10 (A)
3
  orrcs r9, r9, #flag_c   // c-flag?
4
  biccc r9, r9, #flag_c
5
  affect_nz r10           // calculate affected flags
6
  add r8, r8, #1          // program counter
7
  add r6, r6, #2          // 2 clock cycles
8
  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

von (prx) A. K. (prx)


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).

von Peter P. (uncle-sam7)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.