: DRX gibt die Register einer Task in erweiterter Darstellung aus.
: WRITTEN BY TP:   01.05.93 (START)
:                  03.05.93  (FIN)
: PPC EXTENDED AND BETTER 68K-VERSION BY I.HASSINE 
:                  04.02.99
: FOR OLD AND NEW `L`-COMMAND (PR)
:                  24.02.99
TWSOFF=16;     : Adressoffset der Register im TWSP
DMLEN=40;      : Laenge des DM 
PTYPE='P68K';  : Prozessortyp
IF TEST -N $P_TYPE; THEN
  : Nur auf neuerem System, wenn P_TYPE vorhanden ist.
  IF TEST SEG[1,3]($P_TYPE) = 'PPC'; THEN
    PTYPE='PPC';
    TWSOFF=18; : Adressoffset der Register im TWSP
    DMLEN=90;  : Laenge des DM : $A0 BYTES
  FI;  
FI;
HILF='NEIN';   : ANNAHME: KEINE HILFE BENOETIGT;
SYSTASK='NEIN';: ANNAHME: KEINE SYSTEMTASK
IF TEST $# -NE '1'; THEN
  HILF='JA1';
ELSE
  TASK=$1;
  IF TEST $1 = '-?'; THEN
    HILF='JA1';
  FI;   
FI;
IF TEST $HILF='NEIN'; THEN
    HILF='JA1';       :  ANNAHME: TASK NICHT IM SYSTEM                   
    FOR ZEILE IN -L `L`
    DO
      SET $ZEILE
      IF TEST $# = '7';THEN    
        6=$7;
        4=$5;
      FI;
      IF TEST $6=$TASK; THEN
        HILF='NEIN';
        ADDR=SEG[5,12]($4)
        IF TEST $ADDR='00000000'; THEN
          HILF='JA2';
          BREAK;
          ELSE
             INPUT=`DM $ADDR+$TWSOFF,$DMLEN`;
             BREAK;
          FI;
      FI; 
    DONE;
FI;
CASE $HILF IN 
JA1)
  ECHO '      *** DRX : Version 24.02.99 ***';
  ECHO 'DRX gibt eine leichter verstaendliche Darstellung der Register einer Task';
  ECHO 'aus. Beispiel: DRX #USER0 zeigt die Register der Task #USER0.';
;;  
JA2)
  ECHO $TASK' :   not active .';
;;
NEIN)
  LOOPCT='1';
  FOR ZEILE IN -L $INPUT
  DO
    SET $ZEILE;
    : VERZWEIGUNG P68 <-> PPC
    IF TEST $PTYPE='PPC';THEN
    : AUSWERTUNG FUER PPC
      IF TEST $LOOPCT = '1'; THEN
        1=SEG[1,8]($1);
        ECHO ; 
        ECHO 'Die Register liegen ab $'$1 'im Speicher.';
        ECHO ;
        ECHO 'REG HEXA      ASC   REG HEXA      ASC   REG HEXA      ASC   REG HEXA      ASC';  
        BL16='                ';
      FI;
      : ALS ERSTES  $2...$9 AUSWERTEN, BEVOR SHIFTEN SIE ZERSTOERT 
        CASE $LOOPCT IN
        1)
          ZEILE11=' r0 '$2' '$3;        ZEILE12='  r1 '$4' '$5;
          ZEILE13='  r2 '$6' '$7;       ZEILE14='  r3 '$8' '$9;
        ;; 
        2)
          ZEILE21=' r4 '$2' '$3;        ZEILE22='  r5 '$4' '$5;
          ZEILE23='  r6 '$6' '$7;       ZEILE24='  r7 '$8' '$9;
        ;;
        3)
          ZEILE31=' r8 '$2' '$3;        ZEILE32='  r9 '$4' '$5;
          ZEILE33=' r10 '$6' '$7;       ZEILE34=' r11 '$8' '$9;
        ;;
        4)
          ZEILE41='r12 '$2' '$3;        ZEILE42=' r13 '$4' '$5;
          ZEILE43=' r14 '$6' '$7;       ZEILE44=' r15 '$8' '$9;
        ;;
        5)
          ZEILE51='r16 '$2' '$3;        ZEILE52=' r17 '$4' '$5;
          ZEILE53=' r18 '$6' '$7;       ZEILE54=' r19 '$8' '$9;
        ;;
        6)
          ZEILE61='r20 '$2' '$3;        ZEILE62=' r21 '$4' '$5;
          ZEILE63=' r22 '$6' '$7;       ZEILE64=' r23 '$8' '$9;
        ;;
        7)
          ZEILE71='r24 '$2' '$3;        ZEILE72=' r25 '$4' '$5;
          ZEILE73=' r26 '$6' '$7;       ZEILE74=' r27 '$8' '$9;
        ;;
        8)
          ZEILE81='r28 '$2' '$3;        ZEILE82=' r29 '$4' '$5;
          ZEILE83=' r30 '$6' '$7;       ZEILE84=' r31 '$8' '$9;
        ;;
        9)
          ZEILE91='CTR '$2' '$3;        ZEILE92=' XER '$4' '$5;
          ZEILE93='  MQ '$6' '$7;       ZEILE94=' MSR '$8' '$9;
        ;;
        10)
          ZEILE101=' PC '$2' '$3;       ZEILE102='  LR '$4' '$5;
          ZEILE103='  CR '$6' '$7;  
          CR0=SEG[1,1]($6);            CR2=SEG[3,3]($6);
        ;; 
       ESAC    
    
    : AUSWERTUNG FUER P68K
    ELSE
      IF TEST $LOOPCT = '1'; THEN
        1=SEG[1,8]($1);
        ECHO ;
        ECHO 'Die Register liegen ab $'$1 'im Speicher.';
        ECHO ;
        ECHO 'REG HEXA      ASC  REG HEXA      ASC  REG HEXA      ASC     REG HEXA      ASC';
        BL16='                ';
      FI;
      CASE $LOOPCT IN 
      1)
        ZEILE44=' A7(US) '$2' '$3;
        ZEILE53='                      A7(SS) '$4' '$5;
        ZEILE11=' D0 '$6' '$7;            ZEILE12='  D1 '$8' '$9;
        STELLVAR=$5;
      ;; 
      2)
        ZEILE13='  D2 '$2' '$3;           ZEILE14='     D3 '$4' '$5;
        ZEILE21=' D4 '$6' '$7;            ZEILE22='  D5 '$8' '$9;
      ;;
      3)
        ZEILE23='  D6 '$2' '$3;           ZEILE24='     D7 '$4' '$5;
        ZEILE31=' A0 '$6' '$7;            ZEILE32='  A1 '$8' '$9;
      ;;
      4)
        ZEILE33='  A2 '$2' '$3;           ZEILE34='     A3 '$4' '$5;
        ZEILE41=' A4 '$6' '$7;            ZEILE42='  A5 '$8' '$9;
      ;;
      5)
        ZEILE43='  A6 '$2' '$3;
        CASE $STELLVAR IN 
           '07F8')  PC=$8' '$9;  SR=$7;;
           '07F6')  PC=$7' '$8;  SR=$6;;
           '07F4')  PC=$6' '&7;  SR=$5;;
           '07F2')  PC=$5' '$6;  SR=$4;;
        ESAC;
        ZEILE51=' PC='$PC;                ZEILE52='  SR='$SR;
      ;;
      ESAC;
    FI
    
    : NUN ASCII TEXTE KITTEN, FALLS DIESE DURCH BLANKS GETRENNT WURDEN  
    LENASC=LEN($10);
    IF TEST $LENASC != '16'; THEN
      : REPARATUR NOTWENDIG
      REGALL=$2$3$4$5$6$7$8$9  : REGISTERINHALTE DER VIER AKTUELLEN REGS
      : ECHO $REGALL
      SPALTCT=3;                               : BEGINN BEI ZWEITEM BYTE
      AKTZ=SEG[1,2]($2);               :  ASCII WERT DES ERSTEN ZEICHENS
      IF TEST $AKTZ='20'; THEN          : SCHON ERSTES ZEICHEN EIN BLANK
        ASCII=''; ANZBL='1';        : ASCII-TEXT DER REGISTER VORBELEGEN
      ELSE
        ASCII=$10; SHIFT; ANZBL=0;
      FI;
      
      WHILE TEST $SPALTCT != 33; DO
        AKTZ=SEG[$SPALTCT, EXPR $SPALTCT+1]($REGALL);
        IF TEST $AKTZ = '20'; THEN
          ANZBL=EXPR $ANZBL+1;   : BLANKCOUNTER HOCHZAEHLEN;
        ELSE
          IF TEST $ANZBL != 0; THEN
            : KACKE AM DAMPFEN
            : ECHO $ANZBL' Blanks hintereinander gefunden';
            BLAKT=SEG[1,$ANZBL]($BL16)
            ASCII=$ASCII$BLAKT; : VERLORENE BLANKS AUFFUELLEN
            LENASC=LEN($ASCII);
            : ECHO $LENASC;
            : ECHO $ASCII'<<<';
            IF TEST $LENASC = '16'; THEN
              BREAK       : ALL DONE: LAST CHARACTERS ARE BLANKS 
            ELSE
              ASCII=$ASCII$10; SHIFT; : DURCH BLANK ZERSTUECKELTEN TEIL
            FI;                       : ANFUEGEN           
            : ECHO $ASCII
            ANZBL=0; 
          FI;
        FI;           
        SPALTCT=EXPR $SPALTCT+2;
      DONE;
      IF TEST $ANZBL != '0'; THEN   : RECHTSBUENDIGE BLANKS FEHLEN NOCH
        : ECHO $ANZBL' Blanks hintereinander gefunden';
        BLAKT=SEG[1,$ANZBL]($BL16)
        ASCII=$ASCII$BLAKT; : VERLORENE BLANKS AUFFUELLEN
      FI;
      LENASC=LEN($ASCII)
      IF TEST $LENASC != 16; THEN 
        ECHO 'Fehler im Programm. Abbruch';
        ECHO $REGALL;
        ECHO $ASCII'<<<';
        ECHO $LENASC;
        SLEEP 50; STOP;
      FI; 
    ELSE
      ASCII=$10;
      SHIFT; 
    FI;
    1=SEG[1,4]($ASCII);                2=SEG[5,8]($ASCII);
    3=SEG[9,12]($ASCII);               4=SEG[13,16]($ASCII);
    
    IF TEST $PTYPE='PPC'; THEN
    : CHARACTER-AUSWERTUNG PPC
      CASE $LOOPCT IN
      1)
        ZEILE1=$ZEILE11' '$1' '$ZEILE12' '$2' '$ZEILE13' '$3' '$ZEILE14' '$4;
      ;;
      2)
        ZEILE2=$ZEILE21' '$1' '$ZEILE22' '$2' '$ZEILE23' '$3' '$ZEILE24' '$4;
      ;;     
      3)
        ZEILE3=$ZEILE31' '$1' '$ZEILE32' '$2' '$ZEILE33' '$3' '$ZEILE34' '$4;
      ;;
      4)
        ZEILE4=$ZEILE41' '$1' '$ZEILE42' '$2' '$ZEILE43' '$3' '$ZEILE44' '$4;
      ;;
      5)
        ZEILE5=$ZEILE51' '$1' '$ZEILE52' '$2' '$ZEILE53' '$3' '$ZEILE54' '$4;
      ;;
      6)
        ZEILE6=$ZEILE61' '$1' '$ZEILE62' '$2' '$ZEILE63' '$3' '$ZEILE64' '$4;
      ;;
      7)
        ZEILE7=$ZEILE71' '$1' '$ZEILE72' '$2' '$ZEILE73' '$3' '$ZEILE74' '$4;
      ;;
      8)
        ZEILE8=$ZEILE81' '$1' '$ZEILE82' '$2' '$ZEILE83' '$3' '$ZEILE84' '$4;
      ;;
      9)
        ZEILE9=$ZEILE91' '$1' '$ZEILE92' '$2' '$ZEILE93' '$3' '$ZEILE94' '$4;
      ;;
      10)
        ZEILE10=$ZEILE101' '$1' '$ZEILE102' '$2' '$ZEILE103' '$3;
      ;;
      ESAC;
    ELSE
      : CHARACTER-AUSWERTUNG P68K
      CASE $LOOPCT IN
      1)
        ZEILE4N=$ZEILE44' '$1;            ZEILE5=$ZEILE53' '$2;
        ZEILE1=$ZEILE11' '$3$ZEILE12' '$4;
      ;; 
      2)
        ZEILE1=$ZEILE1$ZEILE13' '$1$ZEILE14' '$2;
        ZEILE2=$ZEILE21' '$3$ZEILE22' '$4;
      ;;
      3)
        ZEILE2=$ZEILE2$ZEILE23' '$1$ZEILE24' '$2;
        ZEILE3=$ZEILE31' '$3$ZEILE32' '$4;
      ;;
      4)
        ZEILE3=$ZEILE3$ZEILE33' '$1$ZEILE34' '$2;
        ZEILE4=$ZEILE41' '$3$ZEILE42' '$4;
      ;;
      5)
        ZEILE4=$ZEILE4$ZEILE43' '$1$ZEILE4N;
        CASE $STELLVAR IN
           '07F8')   ZEILE5=$ZEILE51' '$4$ZEILE52'      'SEG[3,4]($3)$ZEILE5;;
           '07F6')   ZEILE5=$ZEILE51' 'SEG[3,4]($3)SEG[1,2]($4)$ZEILE52'      'SEG[1,2]($3)$ZEILE5;;
           '07F4')   ZEILE5=$ZEILE51' '$3$ZEILE52'      'SEG[3,4]($2)$ZEILE5;;
           '07F2')   ZEILE5=$ZEILE51' 'SEG[3,4]($2)SEG[1,2]($3)$ZEILE52'      'SEG[1,2]($2)$ZEILE5;;
           ESAC;
      ;;
      ESAC;
    FI;  
    IF TEST $# != '9'; THEN
      ECHO 'Fehler beim SHIFTen in Zeile '$LOOPCT'. Abbruch'
      ECHO '$#='$#;
      STOP;
    FI;
    LOOPCT=EXPR $LOOPCT+1;
  DONE;
  IF TEST $PTYPE='PPC';THEN;
    ECHO $ZEILE1;
    ECHO $ZEILE2;
    ECHO $ZEILE3;
    ECHO $ZEILE4;
    ECHO $ZEILE5;
    ECHO $ZEILE6;
    ECHO $ZEILE7;
    ECHO $ZEILE8;
    ECHO $ZEILE9;
    ECHO $ZEILE10;
    ECHO;
    N=0; GT=0; Z=0; SO=0; V=0; C=0;
    CASE $CR0 IN
       1  ) SO=1;;
       2  ) Z=1;;
       3  ) Z=1; S0=1;;
       4  ) GT=1;;
       5  ) GT=1; SO=1;;
       6  ) GT=1; Z=1;;
       7  ) GT=1; Z=1; SO=1;;
       8  ) N=1;; 
       9  ) N=1; SO=1;;
       A  ) N=1; Z=1;;
       B  ) N=1; Z=1; SO=1;;
       C  ) N=1; GT=1;;
       D  ) N=1; GT=1; SO=1;;
       E  ) N=1; GT=1; Z=1;;
       F  ) N=1; GT=1; Z=1; SO=1;;
    ESAC;
    CASE $CR2 IN
       2 | 3 | A | B  ) C=1;;
       4 | 5 | C | D  ) V=1;;
       6 | 7 | E | F  ) V=1; C=1;;
    ESAC;
    ECHO 'Prozessorstatus-Bits:  N='$N'   GT='$GT'   Z='$Z'   SO='$SO'   V='$V'   C='$C' .';
    ECHO;
    ECHO 'DRX '$TASK': All done.'
    ECHO; 
   ELSE
    ECHO $ZEILE1;
    ECHO $ZEILE2;
    ECHO $ZEILE3;
    ECHO $ZEILE4;
    ECHO $ZEILE5;
    T=0; X=0; N=0; Z=0; V=0; C=0;
    DIG4=SEG[4,4]($SR);
    CASE $DIG4 IN
       1  ) C=1;;
       2  ) V=1;;
       3  ) V=1; C=1;;
       4  ) Z=1;;
       5  ) Z=1; C=1;;
       6  ) Z=1; V=1;;
       7  ) Z=1; V=1; C=1;;
       8  ) N=1;;
       9  ) N=1; C=1;;
       A  ) N=1; V=1;;
       B  ) N=1; V=1; C=1;;
       C  ) N=1; Z=1;;
       D  ) N=1; Z=1; C=1;;
       E  ) N=1; Z=1; V=1;;
       F  ) N=1; Z=1; V=1; C=1;;
    ESAC;
    IF TEST SEG[3,3]($SR) -NE 0 ; THEN ;
       X=1;
    FI;
    IF TEST SEG[1,1]($SR) -NE 0 ; THEN ;
       T=1;
    FI;
    ECHO;
    ECHO 'Prozessorstatus-Bits:  T='$T'    X='$X'    N='$N'    Z='$Z'    V='$V'    C='$C' .';
    ECHO;
    ECHO 'DRX '$TASK': All done.'
   FI; 
;;
ESAC  


EXIT(0);

















