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

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


SpartanMC