Module CHARIO(input,output);

 CONST IO$_TTYREADALL = %X003A;
       IO$M_NOECHO    = %X0040;
       IO$M_TRMNOECHO = %X1000;
       IO$_WRITEVBLK  = %X0030;
       IO$M_NOFORMAT  = %X0100;	

 TYPE charioquad = PACKED ARRAY [1..4] OF 0..65536;
      line=packed array[1..80] of char;

  FUNCTION sys$qiow ( %IMMED efn: INTEGER;
		      %IMMED chan: INTEGER;
		      %IMMED func: INTEGER;
		      VAR iosb: charioquad;
		      %IMMED astadr: INTEGER;
		      %IMMED astprm: INTEGER;
		      VAR p1: line;
		      %IMMED p2,p3,p4,p5,p6: INTEGER): INTEGER; EXTERN;

  FUNCTION sys$assign ( %STDESCR devnam: PACKED ARRAY [INTEGER] OF CHAR;
		        VAR chariochan: INTEGER;
			%IMMED acmode: INTEGER;
			%IMMED mbxnam: INTEGER): INTEGER; EXTERN;

  Procedure initchario(var CHARIOCHAN:integer);
  Var retcode: integer;
  begin 
    retcode:= sys$assign('TT',chariochan,0,0);
    if not(odd(retcode)) then writeln('?Unable to open TT:')
  end;

  Function Getchar(var CHARIOCHAN:integer):char;
  var retcode: integer; lin:line; iosb:charioquad;
  begin
    retcode := sys$qiow(0,chariochan,IO$_TTYREADALL+IO$M_NOECHO+IO$M_TRMNOECHO
 			 ,iosb,0,0,lin,1,0,0,0,0);
    getchar:=lin[1]
  end;

  Procedure PutLine(lin:line; length:integer; var CHARIOCHAN:integer);    
  var retcode:integer; iosb:charioquad;
  begin
    retcode := sys$qiow(0,chariochan,IO$_WRITEVBLK+IO$M_NOFORMAT,iosb,0,0,
			lin,length,0,0,0,0)
  end;

  Procedure Putchar(c:char; var CHARIOCHAN:integer);
  var retcode:integer; lin:line; iosb:charioquad;
  begin
    lin[1]:=c;
    retcode := sys$qiow(0,chariochan,IO$_WRITEVBLK+IO$M_NOFORMAT,iosb,0,0,
			lin,1,0,0,0,0)
  end;

end .
