decode.mod 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. MODULE decode; (*NW 26.1.84*)
  2. FROM InOut IMPORT Done,
  3. OpenInput, OpenOutput, CloseInput, CloseOutput,
  4. Read, ReadWrd,
  5. Write, WriteLn, WriteString, WriteCard, WriteOct;
  6. TYPE String = ARRAY [0..63] OF CHAR;
  7. VAR ch: CHAR; a, L, w: CARDINAL;
  8. Mnem: ARRAY [0..15] OF String;
  9. PROCEDURE Rd(n: CARDINAL);
  10. BEGIN ReadWrd(w); IF w # n THEN HALT END
  11. END Rd;
  12. PROCEDURE ReadName;
  13. VAR i: CARDINAL;
  14. BEGIN Write(" "); Write(" ");
  15. FOR i := 0 TO 15 DO Read(ch);
  16. IF ch < " " THEN ch := " " END ;
  17. Write(ch)
  18. END ;
  19. WriteString(" key =");
  20. FOR i := 0 TO 2 DO ReadWrd(w); WriteOct(w, 7) END ;
  21. WriteLn
  22. END ReadName;
  23. PROCEDURE WBt;
  24. VAR cch: CHAR;
  25. BEGIN Read(cch); a := a+1;
  26. WriteString(" "); WriteOct(CARDINAL(cch), 3)
  27. END WBt;
  28. PROCEDURE WWd;
  29. VAR cch, cch1: CHAR;
  30. BEGIN Read(cch); Read(cch1); a := a+2;
  31. WriteOct(CARDINAL(cch)*400B + CARDINAL(cch1), 9)
  32. END WWd;
  33. PROCEDURE WOp(n: CARDINAL);
  34. VAR i,j: CARDINAL;
  35. BEGIN i := n DIV 20B; j := (n MOD 20B) * 4;
  36. Write(Mnem[i,j]); Write(Mnem[i,j+1]); Write(Mnem[i,j+2]); ch := Mnem[i,j+3];
  37. IF ch = "+" THEN WBt
  38. ELSIF ch > "`" THEN WriteCard(CARDINAL(ch) - 87, 2)
  39. ELSIF ch = "-" THEN WBt; WBt
  40. ELSIF ch = "*" THEN WWd
  41. ELSIF ch = "/" THEN WWd; WWd
  42. ELSIF ch = "?" THEN WBt; WWd
  43. ELSE Write(ch)
  44. END
  45. END WOp;
  46. BEGIN
  47. Mnem[ 0] := "LI0 LI1 LI2 LI3 LI4 LI5 LI6 LI7 LI8 LI9 LI10LI11LI12LI13LI14LI15";
  48. Mnem[ 1] := "LIB+--- LIW*LID/LLA+LGA+LSA+LEA*JPC*JP *JFC+JPF+JBC+JPB+ORJ+AJP+";
  49. Mnem[ 2] := "LLW+LLD+LEW-LED-LLW4LLW5LLW6LLW7LLW8LLW9LLWaLLWbLLWcLLWdLLWeLLWf";
  50. Mnem[ 3] := "SLW+SLD+SEW-SED-SLW4SLW5SLW6SLW7SLW8SLW9SLWaSLWbSLWcSLWdSLWeSLWf";
  51. Mnem[ 4] := "LGW+LGD+LGW2LGW3LGW4LGW5LGW6LGW7LGW8LGW9LGWaLGWbLGWcLGWdLGWeLGWf";
  52. Mnem[ 5] := "SGW+SGD+SGW2SGW3SGW4SGW5SGW6SGW7SGW8SGW9SGWaSGWbSGWcSGWdSGWeSGWf";
  53. Mnem[ 6] := "LSW0LSW1LSW2LSW3LSW4LSW5LSW6LSW7LSW8LSW9LSWaLSWbLSWcLSWdLSWeLSWf";
  54. Mnem[ 7] := "SSW0SSW1SSW2SSW3SSW4SSW5SSW6SSW7SSW8SSW9SSWaSSWbSSWcSSWdSSWeSSWf";
  55. Mnem[ 8] := "LSW+LSD+LSD0LXFWLST+LXB LXW LXD DADDDSUBDMULDDIV--- --- DSHLDSHR";
  56. Mnem[ 9] := "SSW+SSD+SSD0SXFWTS SXB SXW SXD FADDFSUBFMULFDIVFCMPFABSFNEGFCT+";
  57. Mnem[10] := "READWRT DSKRDSKWSTRKUCHK--- SYS+ENP+EXP ULSSULEQUGTRUGEQTRA+RDS+";
  58. Mnem[11] := "LDFWLDFDSTORSTFVSTOTCOPTDECSPCP+UADDUSUBUMULUDIVUMODROR SHL SHR ";
  59. Mnem[12] := "FR1?FR2?ENC*EXC TRAPCHK CHKZCHKSEQL NEQ ILSSILEQIGTRIGEQABS NEG ";
  60. Mnem[13] := "OR XOR AND COM IN LIN MSK NOT IADDISUBIMULIDIV--- BIT NOP MOVF";
  61. Mnem[14] := "MOV CMP DDT REPLBBLTDCH UNPKPACKGB +GB1 ALOCENT+RTN CLX-CLI+CLF ";
  62. Mnem[15] := "CLL+CLL1CLL2CLL3CLL4CLL5CLL6CLL7CLL8CLL9CLLaCLLbCLLcCLLdCLLeCLLf";
  63. LOOP OpenInput("OBJ");
  64. IF NOT Done THEN EXIT END ;
  65. OpenOutput("DEX");
  66. IF NOT Done THEN Write(14C) END ;
  67. Rd(200B); Rd(1); ReadWrd(w);
  68. Rd(201B); Rd(14); WriteString("header"); WriteLn; ReadName;
  69. ReadWrd(w); WriteString(" datasize ="); WriteOct(w,7);
  70. ReadWrd(w); WriteString(" codesize ="); WriteOct(w,7);
  71. ReadWrd(w); WriteLn; ReadWrd(w);
  72. IF w = 202B THEN
  73. ReadWrd(L); WriteString("imports: "); WriteLn;
  74. WHILE L > 0 DO ReadName; L := L-11 END ;
  75. ReadWrd(w)
  76. END ;
  77. WHILE w = 204B DO
  78. WriteLn; ReadWrd(L);
  79. ReadWrd(a); WriteString("data"); WriteLn;
  80. WHILE L > 1 DO
  81. WriteOct(a, 8); a := a+1; ReadWrd(w);
  82. WriteOct(w, 8); WriteLn; L := L-1
  83. END ;
  84. ReadWrd(w)
  85. END ;
  86. IF w = 203B THEN
  87. WriteLn; ReadWrd(L); Rd(0); WriteString("entries"); a := 0; WriteLn;
  88. WHILE L > 1 DO
  89. WriteOct(a, 8); a := a+2; ReadWrd(w);
  90. WriteOct(w, 8); WriteLn; L := L-1
  91. END ;
  92. ReadWrd(w)
  93. END ;
  94. IF w = 203B THEN
  95. WriteLn; ReadWrd(L); ReadWrd(a); WriteString("code"); WriteLn;
  96. L := 2*(a+L-1); a := 2*a;
  97. WHILE a < L DO
  98. WriteOct(a, 8); a := a+1; Read(ch); w := CARDINAL(ch);
  99. WriteString(" "); WOp(w); WriteLn
  100. END ;
  101. ReadWrd(w)
  102. END ;
  103. IF w = 205B THEN
  104. WriteLn; ReadWrd(L); WriteString("relocation"); WriteLn;
  105. WHILE L > 0 DO
  106. ReadWrd(w); WriteOct(w, 8); WriteLn; L := L-1
  107. END
  108. END ;
  109. CloseOutput; CloseInput
  110. END
  111. END decode.