mkread.mod 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. MODULE mkread ;
  2. (* Generates readtest.MC4, a single-module MC64 image that reads two lines
  3. from the host standard input via SYSTEM service 2 and echoes both back:
  4. reserve 128 bytes ; store_global 1 ; input buffer
  5. load_global 1 ; id 2 ; system ; read line 1 (pushes count)
  6. drop ; ignore the count here
  7. "you said: " ; write string ; echo buffer ; CRLF
  8. load_global 1 ; id 2 ; system ; read line 2
  9. drop
  10. "again: " ; write string ; echo buffer ; CRLF
  11. end_program ; service 0x50 *)
  12. FROM FileIO IMPORT WriteFile ;
  13. FROM Console IMPORT Fatal ;
  14. CONST
  15. HeaderSize = 64 ;
  16. DescName = 264 ;
  17. DescChecksum = 288 ;
  18. DescFlags = 292 ;
  19. DescDepCount = 294 ;
  20. DescProcs = 296 ;
  21. BufSize = 512 ;
  22. VAR
  23. buf : ARRAY [0 .. BufSize - 1] OF CHAR ;
  24. i, sum : CARDINAL ;
  25. pc, ilen : CARDINAL ;
  26. PROCEDURE Put32 (off, v : CARDINAL) ;
  27. BEGIN
  28. buf [off] := CHR (v MOD 256) ;
  29. buf [off + 1] := CHR ((v DIV 256) MOD 256) ;
  30. buf [off + 2] := CHR ((v DIV 65536) MOD 256) ;
  31. buf [off + 3] := CHR (v DIV 16777216) ;
  32. END Put32 ;
  33. PROCEDURE Put64 (off : CARDINAL ; v : LONGCARD) ;
  34. VAR j : CARDINAL ;
  35. BEGIN
  36. FOR j := 0 TO 7 DO
  37. buf [off + j] := CHR (VAL (CARDINAL, v MOD 256)) ;
  38. v := v DIV 256 ;
  39. END ;
  40. END Put64 ;
  41. PROCEDURE Op (o : CARDINAL) ;
  42. BEGIN
  43. buf [HeaderSize + pc] := CHR (o MOD 256) ;
  44. INC (pc) ;
  45. END Op ;
  46. PROCEDURE OpB (o, b : CARDINAL) ;
  47. BEGIN
  48. Op (o) ;
  49. buf [HeaderSize + pc] := CHR (b MOD 256) ;
  50. INC (pc) ;
  51. END OpB ;
  52. PROCEDURE EStr (s : ARRAY OF CHAR ; nl : BOOLEAN) ;
  53. VAR len, i2 : CARDINAL ;
  54. BEGIN
  55. Op (8CH) ;
  56. IF nl THEN
  57. len := LENGTH (s) + 3 ;
  58. ELSE
  59. len := LENGTH (s) + 1 ;
  60. END ;
  61. buf [HeaderSize + pc] := CHR (len) ;
  62. INC (pc) ;
  63. IF LENGTH (s) > 0 THEN
  64. FOR i2 := 0 TO LENGTH (s) - 1 DO
  65. buf [HeaderSize + pc + i2] := s [i2] ;
  66. END ;
  67. END ;
  68. INC (pc, LENGTH (s)) ;
  69. IF nl THEN
  70. buf [HeaderSize + pc] := CHR (13) ;
  71. buf [HeaderSize + pc + 1] := CHR (10) ;
  72. INC (pc, 2) ;
  73. END ;
  74. buf [HeaderSize + pc] := 0C ;
  75. INC (pc) ;
  76. END EStr ;
  77. PROCEDURE PrintStr ;
  78. BEGIN
  79. OpB (8DH, 1) ; (* id = write string *)
  80. Op (0C3H) ; (* system *)
  81. END PrintStr ;
  82. PROCEDURE ReadEcho (s : ARRAY OF CHAR) ;
  83. BEGIN
  84. OpB (2DH, 1) ; OpB (8DH, 2) ; Op (0C3H) ; (* read line into GP[1] *)
  85. Op (40H) ; Op (00H) ; (* drop the byte count *)
  86. EStr (s, FALSE) ; PrintStr ;
  87. OpB (2DH, 1) ; PrintStr ; (* echo the line *)
  88. EStr ("", TRUE) ; PrintStr ; (* CRLF *)
  89. END ReadEcho ;
  90. BEGIN
  91. FOR i := 0 TO BufSize - 1 DO
  92. buf [i] := 0C ;
  93. END ;
  94. buf [0] := 'M' ;
  95. buf [1] := 'C' ;
  96. buf [2] := '6' ;
  97. buf [3] := '4' ;
  98. buf [HeaderSize + DescName] := 'r' ;
  99. buf [HeaderSize + DescName + 1] := 'e' ;
  100. buf [HeaderSize + DescName + 2] := 'a' ;
  101. buf [HeaderSize + DescName + 3] := 'd' ;
  102. buf [HeaderSize + DescFlags] := CHR (4) ;
  103. buf [HeaderSize + DescDepCount] := CHR (0) ;
  104. Put64 (HeaderSize + DescProcs, 304) ;
  105. pc := 312 ;
  106. OpB (0D4H, 255) ; (* enter : no locals *)
  107. OpB (8DH, 128) ; Op (0D2H) ; OpB (3DH, 1) ; (* GP[1] := reserve 128 *)
  108. ReadEcho ("you said: ") ;
  109. ReadEcho ("again: ") ;
  110. Op (50H) ; (* end_program *)
  111. ilen := pc ;
  112. Put64 (HeaderSize + 304, 8) ; (* proc0 at image 312 *)
  113. sum := 0 ;
  114. FOR i := HeaderSize TO HeaderSize + ilen - 1 DO
  115. IF NOT ((i >= 352) AND (i <= 355)) THEN
  116. sum := sum + ORD (buf [i]) ;
  117. END ;
  118. END ;
  119. Put32 (HeaderSize + DescChecksum, sum) ;
  120. IF NOT WriteFile ("readtest.MC4", buf, HeaderSize + ilen) THEN
  121. Fatal ("mkread: cannot write readtest.MC4") ;
  122. END ;
  123. END mkread.