Register des SpartanMC
Der SpartanMC 18 kann 16 Register direkt ansprechen, davon sind die Register 0 bis 3 global immer erreichbar. Die Register 4 bis 15 können bei einem Unterprogrammaufruf immer mit einem Offset von 8 umgeschaltet werden. Bei einem Rücksprung kann dann das Registerfenster wieder um eine Ebene zurückgeschaltet werden. Bei einem Interrupt wird immer das Registerfenster um eine Ebene erhöht. Die Umschaltung der Registerfenster wird mit einem 7 Bit Register mit der Bezeichnung RegBase realisiert, welches sich in den unteren Bit des Special Function Register SFR_STATUS befindet. Damit können 16 + 126*8 = 1024 Register realisiert werden. Wenn RegBase den Wert 127 erhält soll ein Interrupt erzeugt werden. Dieser Interrupt ist zur Zeit nicht implementiert.Register Fenster des SpartanMC 18
Im Hauptprogramm sollte man mit den Registern r4 bis r11 arbeiten und in Unterprogrammen oder Interrupt Service Programmen sollte man mit den Registern r8 bis r15 arbeiten. Die Register r0 bis r3 sollten für spezielle Operanden eingesetzt werden, die für alle Programme von Bedeutung sind. Der GCC des SpartanMC verwendet r0 als Stackpointer. Achtung in Register r11 steht immer die Rücksprungadresse für das Unterprogramm oder das Interrupt Service Programm. Das Hauptprogramm wird als Unterprogramm gestartet und im Register r11 befindet sich die Rücksprungadresse zu einer Endlosschleife im Startup Code des SpartanMC. Dadurch stürzt das System nicht ab, wenn der Anwender sein Programm einfach beendet und die für Mikrokonmtroller typische Endlosschleife vergessen hat.
Das Hauptprogramm oder das übergeordnete Unterprogramm kann 4 Werte an ein aufzurufendes Unterprogramm in den Registern r12 bis r15 übergeben. In dem Unterprogramm sind diese Werte dann in den Registern r4 bis r7 verfügbar. Über diese 4 Register können Ergebnisse wieder an das aufrufende Programm zurückgegeben werden. Sie sind im aufrufenden Programm dann wieder in den Registern r12 bis r15 vorhanden.
Damit können 127 ineinander geschachtelte Unterprogramme und Interrupt Programme aufgerufen werden ohne dazu einen Stack einrichten zu müssen. Für Mikrokontroller Applikationen sollte diese Anzahl völlig ausreichend sein.
Folgenden absoluten Registeradressen ergeben sich in Abhängigkeit von der aktuellen Fensternummer in RegBase:
RegBase r0 r1 r2 r3 r4 r5 r5 r7 r8 r9 r10 r11 r12 r13 r14 r15 ------------------------------------------------------------------- 0 r0 r1 r2 r3 r4 r5 r5 r7 r8 r9 r10 r11 r12 r13 r14 r15 1 r0 r1 r2 r3 r12 r13 r14 r15 r16 r17 r18 r19 r20 r21 r22 r23 2 r0 r1 r2 r3 r20 r21 r22 r23 r24 r25 r26 r27 r28 r29 r30 r31 3 r0 r1 r2 r3 r28 r29 r30 r31 r32 r33 r34 r35 r36 r37 r38 r39 4 r0 r1 r2 r3 r36 r37 r38 r39 r40 r41 r42 r43 r44 r45 r46 r47 5 r0 r1 r2 r3 r44 r45 r46 r47 r48 r49 r50 r51 r52 r53 r54 r55 ... 126 r0 r1 r2 r3 r1012 r1013 r1014 r1015 r1016 r1017 r1018 r1019 r1020 r1021 r1022 r1023 127 unzulässig! r0 r1 r2 r3 r1020 r1021 r1022 r1023 r0 r1 r2 r3 r4 r5 r6 r7 Absolute Adresse = Registernummer + RegBase * 8 Registernummer (4 Bit) 0 0 0 0 0 0 rn3 rn2 rn1 rn0 + RegBase (7 Bit) * 8 rb6 rb5 rb4 rb3 rb2 rb1 rb0 0 0 0 --------------------------------------------------------------------- Absolute Adresse (10 Bit) aa9 aa8 aa7 aa6 aa5 aa4 aa3 aa2 aa1 aa0 Diese Berechnung wird nur für Registernummern > 3 vorgenommen. Die Registernummern 0 bis 3 werden immer mit 0 erweitert direkt in die 10 Bit Absolute Adresse überführt. Neben der alte Register Bezeichnung von R0 bis R15 gibt es im aktuellen System noch die folgenden Registernamen: r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 sp g1 g2 g3 i0 i1 i2 i3 l0 l1 l2 l3 o0 o1 o2 o3 globals | in | local | out