| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- MODULE decode; (*NW 26.1.84*)
- FROM InOut IMPORT Done,
- OpenInput, OpenOutput, CloseInput, CloseOutput,
- Read, ReadWrd,
- Write, WriteLn, WriteString, WriteCard, WriteOct;
- TYPE String = ARRAY [0..63] OF CHAR;
- VAR ch: CHAR; a, L, w: CARDINAL;
- Mnem: ARRAY [0..15] OF String;
- PROCEDURE Rd(n: CARDINAL);
- BEGIN ReadWrd(w); IF w # n THEN HALT END
- END Rd;
- PROCEDURE ReadName;
- VAR i: CARDINAL;
- BEGIN Write(" "); Write(" ");
- FOR i := 0 TO 15 DO Read(ch);
- IF ch < " " THEN ch := " " END ;
- Write(ch)
- END ;
- WriteString(" key =");
- FOR i := 0 TO 2 DO ReadWrd(w); WriteOct(w, 7) END ;
- WriteLn
- END ReadName;
- PROCEDURE WBt;
- VAR cch: CHAR;
- BEGIN Read(cch); a := a+1;
- WriteString(" "); WriteOct(CARDINAL(cch), 3)
- END WBt;
- PROCEDURE WWd;
- VAR cch, cch1: CHAR;
- BEGIN Read(cch); Read(cch1); a := a+2;
- WriteOct(CARDINAL(cch)*400B + CARDINAL(cch1), 9)
- END WWd;
- PROCEDURE WOp(n: CARDINAL);
- VAR i,j: CARDINAL;
- BEGIN i := n DIV 20B; j := (n MOD 20B) * 4;
- Write(Mnem[i,j]); Write(Mnem[i,j+1]); Write(Mnem[i,j+2]); ch := Mnem[i,j+3];
- IF ch = "+" THEN WBt
- ELSIF ch > "`" THEN WriteCard(CARDINAL(ch) - 87, 2)
- ELSIF ch = "-" THEN WBt; WBt
- ELSIF ch = "*" THEN WWd
- ELSIF ch = "/" THEN WWd; WWd
- ELSIF ch = "?" THEN WBt; WWd
- ELSE Write(ch)
- END
- END WOp;
- BEGIN
- Mnem[ 0] := "LI0 LI1 LI2 LI3 LI4 LI5 LI6 LI7 LI8 LI9 LI10LI11LI12LI13LI14LI15";
- Mnem[ 1] := "LIB+--- LIW*LID/LLA+LGA+LSA+LEA*JPC*JP *JFC+JPF+JBC+JPB+ORJ+AJP+";
- Mnem[ 2] := "LLW+LLD+LEW-LED-LLW4LLW5LLW6LLW7LLW8LLW9LLWaLLWbLLWcLLWdLLWeLLWf";
- Mnem[ 3] := "SLW+SLD+SEW-SED-SLW4SLW5SLW6SLW7SLW8SLW9SLWaSLWbSLWcSLWdSLWeSLWf";
- Mnem[ 4] := "LGW+LGD+LGW2LGW3LGW4LGW5LGW6LGW7LGW8LGW9LGWaLGWbLGWcLGWdLGWeLGWf";
- Mnem[ 5] := "SGW+SGD+SGW2SGW3SGW4SGW5SGW6SGW7SGW8SGW9SGWaSGWbSGWcSGWdSGWeSGWf";
- Mnem[ 6] := "LSW0LSW1LSW2LSW3LSW4LSW5LSW6LSW7LSW8LSW9LSWaLSWbLSWcLSWdLSWeLSWf";
- Mnem[ 7] := "SSW0SSW1SSW2SSW3SSW4SSW5SSW6SSW7SSW8SSW9SSWaSSWbSSWcSSWdSSWeSSWf";
- Mnem[ 8] := "LSW+LSD+LSD0LXFWLST+LXB LXW LXD DADDDSUBDMULDDIV--- --- DSHLDSHR";
- Mnem[ 9] := "SSW+SSD+SSD0SXFWTS SXB SXW SXD FADDFSUBFMULFDIVFCMPFABSFNEGFCT+";
- Mnem[10] := "READWRT DSKRDSKWSTRKUCHK--- SYS+ENP+EXP ULSSULEQUGTRUGEQTRA+RDS+";
- Mnem[11] := "LDFWLDFDSTORSTFVSTOTCOPTDECSPCP+UADDUSUBUMULUDIVUMODROR SHL SHR ";
- Mnem[12] := "FR1?FR2?ENC*EXC TRAPCHK CHKZCHKSEQL NEQ ILSSILEQIGTRIGEQABS NEG ";
- Mnem[13] := "OR XOR AND COM IN LIN MSK NOT IADDISUBIMULIDIV--- BIT NOP MOVF";
- Mnem[14] := "MOV CMP DDT REPLBBLTDCH UNPKPACKGB +GB1 ALOCENT+RTN CLX-CLI+CLF ";
- Mnem[15] := "CLL+CLL1CLL2CLL3CLL4CLL5CLL6CLL7CLL8CLL9CLLaCLLbCLLcCLLdCLLeCLLf";
- LOOP OpenInput("OBJ");
- IF NOT Done THEN EXIT END ;
- OpenOutput("DEX");
- IF NOT Done THEN Write(14C) END ;
- Rd(200B); Rd(1); ReadWrd(w);
- Rd(201B); Rd(14); WriteString("header"); WriteLn; ReadName;
- ReadWrd(w); WriteString(" datasize ="); WriteOct(w,7);
- ReadWrd(w); WriteString(" codesize ="); WriteOct(w,7);
- ReadWrd(w); WriteLn; ReadWrd(w);
- IF w = 202B THEN
- ReadWrd(L); WriteString("imports: "); WriteLn;
- WHILE L > 0 DO ReadName; L := L-11 END ;
- ReadWrd(w)
- END ;
- WHILE w = 204B DO
- WriteLn; ReadWrd(L);
- ReadWrd(a); WriteString("data"); WriteLn;
- WHILE L > 1 DO
- WriteOct(a, 8); a := a+1; ReadWrd(w);
- WriteOct(w, 8); WriteLn; L := L-1
- END ;
- ReadWrd(w)
- END ;
- IF w = 203B THEN
- WriteLn; ReadWrd(L); Rd(0); WriteString("entries"); a := 0; WriteLn;
- WHILE L > 1 DO
- WriteOct(a, 8); a := a+2; ReadWrd(w);
- WriteOct(w, 8); WriteLn; L := L-1
- END ;
- ReadWrd(w)
- END ;
- IF w = 203B THEN
- WriteLn; ReadWrd(L); ReadWrd(a); WriteString("code"); WriteLn;
- L := 2*(a+L-1); a := 2*a;
- WHILE a < L DO
- WriteOct(a, 8); a := a+1; Read(ch); w := CARDINAL(ch);
- WriteString(" "); WOp(w); WriteLn
- END ;
- ReadWrd(w)
- END ;
- IF w = 205B THEN
- WriteLn; ReadWrd(L); WriteString("relocation"); WriteLn;
- WHILE L > 0 DO
- ReadWrd(w); WriteOct(w, 8); WriteLn; L := L-1
- END
- END ;
- CloseOutput; CloseInput
- END
- END decode.
|