RtProbe.mod 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. MODULE RtProbe ;
  2. (* Dump the assembled runtime: size, entry offsets, hex. Kept separate from
  3. CompileTest so the library can be checked on its own, before the compiler
  4. is wired to it. *)
  5. FROM Posix IMPORT write ;
  6. FROM Runtime IMPORT RT_Build, RT_Size, RT_Byte, RT_Entry ;
  7. FROM SYSTEM IMPORT ADR, BYTE ;
  8. VAR
  9. c : CHAR ;
  10. PROCEDURE PC (ch : CHAR ) ;
  11. VAR n : LONGINT ;
  12. BEGIN
  13. n := write (1, ADR (ch), 1)
  14. END PC ;
  15. PROCEDURE PS (s : ARRAY OF CHAR ) ;
  16. VAR i : CARDINAL ; n : LONGINT ;
  17. BEGIN
  18. i := 0 ;
  19. WHILE (i <= HIGH (s)) AND (s [i] # 0C) DO
  20. n := write (1, ADR (s [i]), 1) ;
  21. INC (i)
  22. END
  23. END PS ;
  24. PROCEDURE PCARD (n : CARDINAL ) ;
  25. VAR d : ARRAY [0..9] OF CHAR ; i : CARDINAL ;
  26. BEGIN
  27. IF n = 0 THEN
  28. PC ("0")
  29. ELSE
  30. i := 0 ;
  31. WHILE n > 0 DO
  32. d [i] := CHR (ORD ("0") + (n MOD 10)) ;
  33. n := n DIV 10 ;
  34. INC (i)
  35. END ;
  36. WHILE i > 0 DO
  37. DEC (i) ;
  38. PC (d [i])
  39. END
  40. END
  41. END PCARD ;
  42. PROCEDURE NL ; BEGIN PC (CHR (13)) ; PC (CHR (10)) END NL ;
  43. PROCEDURE PHEX (b : CARDINAL ) ;
  44. VAR d : CARDINAL ;
  45. BEGIN
  46. d := b DIV 16 ;
  47. IF d < 10 THEN PC (CHR (ORD ("0") + d)) ELSE PC (CHR (ORD ("A") + d - 10)) END ;
  48. d := b MOD 16 ;
  49. IF d < 10 THEN PC (CHR (ORD ("0") + d)) ELSE PC (CHR (ORD ("A") + d - 10)) END
  50. END PHEX ;
  51. PROCEDURE PENT (i : CARDINAL ; name : ARRAY OF CHAR ) ;
  52. BEGIN
  53. PS (" entry ") ; PCARD (i) ; PS (" = ") ; PCARD (RT_Entry (i)) ;
  54. PS (" (") ; PS (name) ; PS (")") ; NL
  55. END PENT ;
  56. PROCEDURE Main ;
  57. VAR i, n : CARDINAL ;
  58. names : ARRAY [0..12] OF ARRAY [0..15] OF CHAR ;
  59. BEGIN
  60. RT_Build () ;
  61. PCARD (RT_Size ()) ; PS (" bytes") ; NL ;
  62. i := 0 ;
  63. WHILE i <= 12 DO
  64. names [i] := "" ;
  65. INC (i)
  66. END ;
  67. names [0] := "initmem" ; names [1] := "progend" ; names [2] := "stackchk" ;
  68. names [3] := "wrint" ; names [4] := "wrchar" ; names [5] := "wrbool" ;
  69. names [6] := "wrreal" ; names [7] := "wrln" ; names [8] := "rdint" ;
  70. names [9] := "rdchar" ; names [10] := "rdbool" ; names [11] := "rdln" ;
  71. names [12] := "halt" ;
  72. i := 0 ;
  73. WHILE i <= 12 DO
  74. PENT (i, names [i]) ;
  75. INC (i)
  76. END ;
  77. PS (" hex:") ; NL ;
  78. i := 0 ;
  79. WHILE i < RT_Size () DO
  80. PHEX ((i DIV 65536) MOD 16) ; PHEX ((i DIV 4096) MOD 16) ;
  81. PHEX ((i DIV 256) MOD 16) ; PHEX (i MOD 16) ;
  82. PS (" ") ;
  83. n := 0 ;
  84. WHILE (n < 16) AND (i + n < RT_Size ()) DO
  85. PHEX (VAL (CARDINAL, RT_Byte (i + n))) ;
  86. PC (" ") ;
  87. INC (n)
  88. END ;
  89. NL ;
  90. i := i + 16
  91. END
  92. END Main ;
  93. BEGIN
  94. Main
  95. END RtProbe.