* Uses Format-Lib "SUPERVIS.FOR"  rev. 1.4(03/01)*
       PRINT  0
*------------------------------------------------*
* Format Collection for Supervisor-Code          *
* =====================================          *
* 1.1 04/97 Derived form COMFORM               Ge*
* 1.2 05/97 IRENTC/IREXTC/IRMALF... added      Wo*1/2
* 1.3 11/99 TOR1Sx/TOA7Sx added;?-Test freigg. Wo*1/3
* 1.4 03/01 Fuer System on a Chip (PPC)        Wo*1/4
*------------------------------------------------*
      .IF_PROCTYPE  M68K 
*------------------------------------------------*
*..... Dispatcher Call ..........................*
DPCALL FORMAT.W              ; no parameter      *
/ 01010000111110000000100000000000 ST DPC        *
/ e
*------------------------------------------------*
*..... IRs auf Supervisorlevel freigeben ........*
IRON   FORMAT.W  a           Dummy Reg-Nr.       *
/ 00000010011111001111100011111111 ANDI =$F8FF,SR*
/ e
*------------------------------------------------*
*..... IRs auf Supervisorlevel sperren ..........*
IROFF  FORMAT.W  a           Dummy Reg-Nr.       *
/ 00000000011111000000011100000000 ORI =$700,SR  *
/ e
*------------------------------------------------*
*..... IR-Entry-Code ............................*1/2
IRENTC FORMAT.W+2 r,a        Malfunktion,IR-Vec  *
/ #A=#1#A-#$#A-2#A(16:31)          DC.W Malfkt-$-2
/ #A?16 passt in 16 Bit? (ab Assembler 4.8-A)    *
/ 00111111001110000000011111111110 MOVE.W IID,-(A7)
/ 0011000111111100#2(16:31)                      *
/ 0000011111111110              MOVE.W =IR-Vec,IID
/ e
*------------------------------------------------*
*..... IR-Exit-Code .............................*1/2
IREXTC FORMAT.W              ; no parameter      *
/ 00110001110111110000011111111110 MOVE.W (A7)+,IID
/ 00000000011111000000011100000000 ORI    =$700,SR
/ 01001010011110000000100000000000 TST    DPC    *
/ 0110101100000010                 BMI.S  $+2    *
/ 0100111001110011                 RTE           *
/ 01001110111110000000100100000110 JMP    DISEX  *
/ e
*------------------------------------------------*
*..... IR-Malfunction (Dummy in 68k).............*1/2
IRMALF FORMAT.W    a         IR-Vec              *
/ e
*------------------------------------------------*
      .FIN
       PAGE

      .IF_PROCTYPE  MPC604       
*------------------------------------------------*
*..... Dispatcher Call ..........................*
DPCALL FORMAT.L              ; no parameter      *
/ 01001110110101101011001001000010 creqv crb(dpbit),...
/ e
*------------------------------------------------*
       .IF SOCPPC            <<<<<<<<<<<<<<<<<<<<<1/4
*------------------------------------------------*
*..... IRs auf Supervisorlevel freigeben ........*
IRON   FORMAT.L  a,(SUMSR)   Hilfsregister-Nr. rH*1/4
/ 001111#1(27:31)00000#A=#2#A%16#A(0:15) lis rH,=SUMSRhi*1/4
/ 100000#1(27:31)#1(27:31)#2(16:31)      lwz rH,SUMSRlo(rH)*1/4
/ 011111#1(27:31)000000000000100100100   mtmsr rH*
/ e
*------------------------------------------------*
*..... IRs auf Supervisorlevel sperren ..........*
IROFF  FORMAT.L  a,(SUMSR)   Hilfsregister-Nr. rH*1/4
/ 001111#1(27:31)00000#A=#2#A%16#A(0:15) lis rH,=SUMSRhi*1/4
/ 100000#1(27:31)#1(27:31)#2(16:31)      lwz rH,SUMSRlo(rH)*1/4
/ 010101#1(27:31)#1(27:31)0000010001011110 rlwinm rH,rH,0,17,15
/ 011111#1(27:31)000000000000100100100   mtmsr rH*
/ e
*------------------------------------------------*
*..... IR-Entry-Code ............................*1/2
IRENTC FORMAT.L r,a,(IID)    Malfunktion,IR-Vec  *1/4
/ 10010111110011111111111111111100 stwu r30,-4(A7)
/ 10010111101011111111111111111100 stwu r29,-4(A7)
/ 10010111100011111111111111111100 stwu r28,-4(A7)
/ 10010111011011111111111111111100 stwu r27,-4(A7)
/ 10010111010011111111111111111100 stwu r26,-4(A7)
/ 10010111001011111111111111111100 stwu r25,-4(A7)
/ 01111111111000010000001010100110 mfxer r31     *
/ 10010111111011111111111111111100 stwu r31,-4(A7)
/ 01111111111010000000001010100110 mflr r31      *
/ 10010111111011111111111111111100 stwu r31,-4(A7)
/ 0011111111000000#A=#3#A%16#A(0:15) lis r30,=IIDhi*1/4
/ 1000001111111110#3(16:31)   lwz  r31,IIDlo(r30)*1/4
/ 10010111111011111111111111111100 stwu r31,-4(A7)
/ 01001000000000000000000000000101 bl   $+4      *
/ 01111111111010000000001010100110 mflr r31      *
/ 0011101111111111#A=#1#A-#$#A-31#A-25           *1/4
/ #A(16:31)                 addi r31,=Malfkt-$-56*1/4
/ #A?16 passt in 16 Bit? (ab Tapp 2.6-A)         *
/ 1001001111111110#3(16:31)   stw  r31,IIDlo(r30)*1/4
/ e
*------------------------------------------------*
* (IRENPP fehlt noch fuer SOCPPC)                *1/4
*------------------------------------------------*
*..... IR-Exit-Code .............................*1/2
IREXTC FORMAT.L (IID)        ; no parameter      *1/4
/ 10000011111011110000000000000000 lwz  r31,(A7) *
/ 0011111111000000#A=#1#A%16#A(0:15) lis r30,=IIDhi*1/4
/ 1001001111111110#1(16:31)   stw  r31,IIDlo(r30)*1/4
/ 10000111111011110000000000000100 lwzu r31,4(A7)*
/ 01111111111010000000001110100110 mtlr r31      *
/ 10000111111011110000000000000100 lwzu r31,4(A7)*
/ 01111111111000010000001110100110 mtxer r31     *
/ 10000111001011110000000000000100 lwzu r25,4(A7)*
/ 10000111010011110000000000000100 lwzu r26,4(A7)*
/ 10000111011011110000000000000100 lwzu r27,4(A7)*
/ 10000111100011110000000000000100 lwzu r28,4(A7)*
/ 10000111101011110000000000000100 lwzu r29,4(A7)*
/ 10000111110011110000000000000100 lwzu r30,4(A7)*
/ 00111001111011110000000000000100 addi A7,=4    *
/ 01001110100000000000000000100000 blr to IR-Slot*
/ e
*------------------------------------------------*
* (IREXPP fehlt noch fuer SOCPPC)                *1/4
*------------------------------------------------*
       .ELSE SOCPPC          <<<<<<<<<<<<<<<<<<<<<1/4
*------------------------------------------------*
*..... IRs auf Supervisorlevel freigeben ........*
IRON   FORMAT.L  a           Hilfsregister-Nr. rH*
/ 100000#1(27:31)000000101000000001000 lwz rH,SUMSR
/ 011111#1(27:31)000000000000100100100 mtmsr rH  *
/ e
*------------------------------------------------*
*..... IRs auf Supervisorlevel sperren ..........*
IROFF  FORMAT.L  a           Hilfsregister-Nr. rH*
/ 100000#1(27:31)000000101000000001000 lwz rH,SUMSR
/ 010101#1(27:31)#1(27:31)0000010001011110 rlwinm rH,rH,0,17,15
/ 011111#1(27:31)000000000000100100100 mtmsr rH  *
/ e
*------------------------------------------------*
*..... IR-Entry-Code ............................*1/2
IRENTC FORMAT.L r,a          Malfunktion,IR-Vec  *
/ 10010111110011111111111111111100 stwu r30,-4(A7)
/ 10010111101011111111111111111100 stwu r29,-4(A7)
/ 10010111100011111111111111111100 stwu r28,-4(A7)
/ 10010111011011111111111111111100 stwu r27,-4(A7)
/ 10010111010011111111111111111100 stwu r26,-4(A7)
/ 10010111001011111111111111111100 stwu r25,-4(A7)
/ 01111111111000010000001010100110 mfxer r31     *
/ 10010111111011111111111111111100 stwu r31,-4(A7)
/ 01111111111010000000001010100110 mflr r31      *
/ 10010111111011111111111111111100 stwu r31,-4(A7)
/ 10000011111000000101000000000100 lwz  r31,IID  *
/ 10010111111011111111111111111100 stwu r31,-4(A7)
/ 01001000000000000000000000000101 bl   $+4      *
/ 01111111111010000000001010100110 mflr r31      *
/ 0011101111111111#A=#1#A-#$#A-31#A-21           *
/ #A(16:31)                 addi r31,=Malfkt-$-52*
/ #A?16 passt in 16 Bit? (ab Tapp 2.6-A)         *
/ 10010011111000000101000000000100 stw  r31,IID  *
/ e
*------------------------------------------------*
*..... IR-Entry-Code, nur PowerPC native! .......*1/2
IRENPP FORMAT.L r,a          Malfunktion,IR-Vec  *
/ 01111111111010000000001010100110 mflr r31      *
/ 10010111111011111111111111111100 stwu r31,-4(A7)
/ 10000011111000000101000000000100 lwz  r31,IID  *
/ 10010111111011111111111111111100 stwu r31,-4(A7)
/ 01001000000000000000000000000101 bl   $+4      *
/ 01111111111010000000001010100110 mflr r31      *
/ 0011101111111111#A=#1#A-#$#A-20                *
/ #A(16:31)                 addi r31,=Malfkt-$-20*
/ #A?16 passt in 16 Bit? (ab Tapp 2.6-A)         *
/ 10010011111000000101000000000100 stw  r31,IID  *
/ e
*------------------------------------------------*
*..... IR-Exit-Code .............................*1/2
IREXTC FORMAT.L              ; no parameter      *
/ 10000011111011110000000000000000 lwz  r31,(A7) *
/ 10010011111000000101000000000100 stw  r31,IID  *
/ 10000111111011110000000000000100 lwzu r31,4(A7)*
/ 01111111111010000000001110100110 mtlr r31      *
/ 10000111111011110000000000000100 lwzu r31,4(A7)*
/ 01111111111000010000001110100110 mtxer r31     *
/ 10000111001011110000000000000100 lwzu r25,4(A7)*
/ 10000111010011110000000000000100 lwzu r26,4(A7)*
/ 10000111011011110000000000000100 lwzu r27,4(A7)*
/ 10000111100011110000000000000100 lwzu r28,4(A7)*
/ 10000111101011110000000000000100 lwzu r29,4(A7)*
/ 10000111110011110000000000000100 lwzu r30,4(A7)*
/ 00111001111011110000000000000100 addi A7,=4    *
/ 01001110100000000000000000100000 blr to IR-Slot*
/ e
*------------------------------------------------*
*..... IR-Exit-Code, nur PowerPC native! ........*1/2
IREXPP FORMAT.L              ; no parameter      *
/ 10000011111011110000000000000000 lwz  r31,(A7) *
/ 10010011111000000101000000000100 stw  r31,IID  *
/ 10000111111011110000000000000100 lwzu r31,4(A7)*
/ 01111111111010000000001110100110 mtlr r31      *
/ 00111001111011110000000000000100 addi A7,=4    *
/ 01001110100000000000000000100000 blr to IR-Slot*
/ e
*------------------------------------------------*
       .FIN SOCPPC           <<<<<<<<<<<<<<<<<<<<<1/4
*------------------------------------------------*
*..... IR-Malfunction............................*1/2
IRMALF FORMAT.L+4  a         IR-Vec              *
/ #1(0:31)                   DC.L IR-Vec         *
/ e
*------------------------------------------------*
*...... Hinweise zu den Formaten ................*1/3
*       TOR1Sx "To r1-Stack" und                 *
*       TOA7Sx "To A7-Stack":                    *
* Die Formate dienen dazu, beim PowerPC auf      *
* Supervisor-Ebene vom normalen RTOS-Stackpionter*
* A7 zu dem in C gebraeuchlichen Stackpointer r1 *
* zu wechseln.                                   *
* . . . . . . . . . . . . . . . . . . . . . . . .*
* Das Paar mit der Endung "I" ist fuer IR-Routi- *
* nen gedacht. Typisch waere also folgender Code:*
* IRxy IRENTC Malf,IVEC      IR-Entry            *
*      TOR1SI                Wechsel nach r1-Stk.*
* (r1=D1 ist jetzt der gueltige System-Stk-Poin- *
*  ter, A7 darf zwischendurch verwendet werden.) *
*      .IF_PROCTYPE MPC604                       *
*      stwu   A7,-4(r1)      z.B. A7 auf r1-Stk  *
*      li     A7,=$1234      z.B.A7(=r15) aendern*
*      ...                                       *
* Exit lwz    A7,(r1)        alles zurueck ...   *
*      addi   r1,=4          auf Stack freigeben *
*      .FIN PROCTYPE MPC604                      *
*      TOA7SI                Wechsel nach A7-Stk.*
*      IREXTC                Ausgang mit A7-Stack*
* Malf IRMALF IVEC           Malfunction         *
*      ...                   (Stk. ist noch r1)  *
*      BRA    Exit           zum Ausstieg        *
* . . . . . . . . . . . . . . . . . . . . . . . .*
* Bei Verwendung mit PIRTRI ist folgendes Vorge- *
* hen notwendig:                                 *
* IRxy IRENTC Malf,IVEC      IR-Entry            *
*      MOVEM.L D1/D6/D7/A1,-(A7) PIRTRI-Regs save*
*      TOR1SI                Wechsel nach r1-Stk.*
* (r1=D1 ist jetzt der gueltige System-Stk-Poin- *
*  ter, A7 darf zwischendurch verwendet werden.) *
*      .IF_PROCTYPE MPC604                       *
*      stwu   A7,-4(r1)      z.B. A7 auf r1-Stk  *
*      li     A7,=$1234      z.B.A7(=r15) aendern*
*      ...                                       *
* Exit lwz    A7,(r1)        alles zurueck ...   *
*      addi   r1,=4          auf Stack freigeben *
*      .FIN PROCTYPE MPC604                      *
*      TOA7SI                Wechsel nach A7-Stk.*
*      MOVE.L =$80000000,D1  event-Code setzen   *
*      MOVEA.L PIRTRI,A1     Sprungadr. laden    *
*      JMP    (A1)           Prozess-IR feuern   *
* Malf IRMALF IVEC           Malfunction         *
*      ...                   (Stk. ist noch r1)  *
*      BRA    Exit           zum Ausstieg        *
* . . . . . . . . . . . . . . . . . . . . . . . .*
* Fuer eine Task im Supervisor-Mode sind die For-*
* mate mit der Endung "O" (fuer "OFF") gedacht.  *
* TOR1SO bringt A7(=r15) in den Zustand vor dem  *
* OFF und macht das vom User kommende r1 zum     *
* gueltigen System-Stackpointer!                 *
* Folglich muss r1 vor dem OFF von der User-Task *
* unbedingt als Stack-Pointer initialisiert wer- *
* den. Da IRs, welche die Supervisor-Sequenz     *
* durchschlagen, dieses r1 als Stack-Pointer ver-*
* wenden, muss auf dem r1-Stack zu jedem Zeit-   *
* punkt genug Platz (sicherheitshalber > $800    *
* Bytes) frei sein!                              *
* Typisch ist folgende Verwendung in einer Task: *
*      ...                   Init r1 als Stk-Pntr*
*      OFF                   to Supervisor       *
*      TOR1SO                r1 als Sys-Stk-Pntr.*
* (Das unveraenderte User-r1(=D1) ist jetzt der  *
*  gueltige System-Stack-Pointer. Der Stack darf *
*  benutzt werden. Der Stack-Fuellstand darf beim*
*  DPC anders sein als er beim OFF war.          *
*  r15(=A7) hat den gleichen Inhalt wie vor dem  *
*  OFF und darf beliebig veraendert werden.)     *
*      ...                                       *
*      IRON   30             "IR frei"ist erlaubt*
*      ...                                       *
*      TOA7SO                recall A7 Sys-Stack *
*      DPC                   wieder zu User werdn*
* (r1 und r15 haben fuer die User-Task nun wieder*
*  den gleichen Inhalt wie innerhalb der Supervi-*
*  sor-Sequenz.)                                 *
* . . . . . . . . . . . . . . . . . . . . . . . .*
* Achtung:                                       *
* - Die Aenderung von cr5 ist streng verboten!   *
*   (Dies gilt sowieso in jeder Supervisor-      *
*   Sequenz. Auch zwischenzeitliches "stacken"   * 
*   von cr5 ist nicht erlaubt.)                  *
* - Diese Fromate duerfen erst ab NUK 7.8-D      *
*   verwendet werden!                            *
* - Die Imp. muss speziell fuer den Stack-       *
*   Pointer-Wechsel angepasst sein!              *
* - Die Formate duerfen grundsaetzlich nur als   *
*   Paar verwendet werden (nach dem Einstieg erst*
*   "to r1" und dann vor dem Ausstieg "to A7")!  *
*------------------------------------------------*
*..... To r1-Stack (IR)..........................*1/3
TOR1SI FORMAT.L              ; no parameter      *
/ 01111100001111110000101101111000 or r31,r1,r1 copy Outer-r1
/ 01111101111000010111101101111000 or r1,A7,A7  Suprv-Stk A7 and r1
/ 01001110111000000000001001000010 creqv crb(r1bit),crb0,crb0 mark:r1-Stk
/ 01111111111011111111101101111000 or A7,r31,r31 save Outr-r1 to A7
/ e                                              *
*------------------------------------------------*
*..... To A7-Stack (IR)..........................*1/3
TOA7SI FORMAT.L              ; no parameter      *
/ 01111101111111110111101101111000 or r31,A7,A7 copy "Outer-r1"
/ 01111100001011110000101101111000 or A7,r1,r1 Suprv-Stk A7 and r1
/ 01001110111000000000000110000010 crxor crb(r1bit),crb0,crb0 mark:A7-Stk
/ 01111111111000011111101101111000 or r1,r31,r31 recll Outr-r1 (from A7)
/ e                                              *
*------------------------------------------------*
*..... To r1-Stack (OFF).........................*1/3
TOR1SO FORMAT.L              ; no parameter      *
/ 01001110111000000000001001000010 creqv crb(r1bit),crb0,crb0 mark:r1-Stk
/ 01111111110100010100001010100110 mfsprg1 r30 copy Task's Usr-A7
/ 01111101111100010100001110100110 mtsprg1 A7 save RTOS-Stk-Pntr.instead
/ 01111111110011111111001101111000 or A7,r30,r30 recall Task's Usr-A7
/ e                                              *
*------------------------------------------------*
*..... To A7-Stack (OFF).........................*1/3
TOA7SO FORMAT.L              ; no parameter      *
/ 01111101111111100111101101111000 or r30,A7,A7 copy (modified?) Tsk's A7
/ 01111101111100010100001010100110 mfsprg1 A7 recall RTOS-Stk.-Pntr.
/ 01111111110100010100001110100110 mtsprg1 r30 "resave" Tsk's A7 for Usr
/ 01001110111000000000000110000010 crxor crb(r1bit),crb0,crb0 mark:A7-Stk
/ e                                              *
*------------------------------------------------*
      .FIN 
