helpenv;
type
$if (target = i86)
$set target86 = 1
$else
$set target86 = 0
$endif
$if target86 = 1
     inoutzone=record
                 iz,oz: op_zone;
                 p: ^pool;
          end;
$else
     inoutzone=record
                 iz,oz: zone;
                 p: ^pool;
          end;
$endif
        
procedure open_input_zone(var z: inoutzone); external;
procedure open_output_zone(var z: inoutzone); external;
$IF target86 = 0 
procedure outputEnd(var z: zone;b : boolean); external;
$ENDIF
.
$IF target = rc3502
procedure outstring(var z : Zone; s : string);
BEGIN
  for i := 1 to s!length do outchar(z,s(i));
END;
$ENDIF

$IF target86 = 0
procedure outputEnd(var z: zone;b : boolean);
begin
$IF target = rc3502
outend(z);
$ENDIF
$IF target = TA
outend(z,b);
delay(0);
$ENDIF
end;
$ENDIF
procedure open_input_zone(var z: inoutzone);
var mbx_ptr: ^mailbox;
begin
  if nil(z.p) then
  begin
    new(z.p);
$if target86=1
    op_initzone(z.iz);
$endif
    if allocpool(z.p^,2,100)<>2 then;
$if target86=1
    mbx_ptr:= search_object(operator_name);
    op_openzone(z.iz,mbx_ptr,z.iz.dataready,1,z.p^,1,7,0,0);
    op_in(z.iz);
    op_in(z.iz);
$else
    openopzone(z.iz,mbx_ptr,mbx_ptr,1,z.p^,1,7,0,0);
    opin(z.iz);
$endif
  end;
end;
procedure open_output_zone(var z: inoutzone);
var mbx_ptr: ^mailbox;
begin
  if nil(z.p) then
  begin
    new(z.p);
$if target86=1
    op_initzone(z.oz);
$endif
$code
    if allocpool(z.p^,1,100)<>1 then;
$nocode
$if target86=1
    mbx_ptr:= search_object(operator_name);
    op_openzone(z.oz,mbx_ptr,z.oz.free,1,z.p^,2,7,0,0);
$else
    openopzone(z.oz,mbx_ptr,mbx_ptr,1,z.p^,2,7,0,0);
$endif
  end;
end;
$code
procedure writechar(var z: inoutzone; aa: char);
begin
  open_output_zone(z);
$if target86=1
  op_outchar(z.oz,aa);
  op_outend(z.oz,true);
$else
  outchar(z.oz,aa);
  Outputend(z.oz,true);
$endif
end;
$nocode
procedure writestring(var z: inoutzone; inspect aa: string);
begin

  open_output_zone(z);
$if target86=1
  op_outstring(z.oz,aa);
  op_outchar(z.oz,' ');
  op_outend(z.oz,true);
$else
  for i := 1 to aa!length do
   outchar(z.oz,aa(i));
  outchar(z.oz,' ');
  Outputend(z.oz,true);
$endif
end;

procedure printboolean(var z: inoutzone; aa: boolean);
begin
  open_output_zone(z);
  if aa=true then
  begin
$if target86 = 1
  op_outstring(z.oz,"TRUE ");
  op_outend(z.oz,true);
$else
  outstring(z.oz,"TRUE ");
  Outputend(z.oz,true);
$endif
  end else
  begin
$if target86 = 1
  op_outstring(z.oz,"FALSE ");
  op_outend(z.oz,true);
$else
  outstring(z.oz,"FALSE ");
  Outputend(z.oz,true);
$endif
  end;
end;
procedure printinteger(var z: inoutzone; aa: integer);
begin
  open_output_zone(z);
$if target86=1
  op_outinteger(z.oz,aa,1);
  op_outchar(z.oz,' ');
  op_outend(z.oz,true);
$else
  outinteger(z.oz,aa,1);
  outchar(z.oz,' ');
  Outputend(z.oz,true);
$endif
end;
$code
procedure printword(var z: inoutzone; aa: word);
begin
  open_output_zone(z);

  with aa as ii: integer do
$if target86=1
   op_outhex(z.oz,ii,5);
  op_outstring(z.oz,"HW ");
  op_outend(z.oz,true);
$else
   outhex(z.oz,ii,5);
$nocode
  outstring(z.oz,"HW ");
  Outputend(z.oz,true);
$endif
end;

procedure printbyte(var z: inoutzone; aa: byte);
begin
  open_output_zone(z);
  with aa as ii: 0..255 do
$if target86=1
   op_outhex(z.oz,ii,5);
  op_outstring(z.oz,"HB ");
  op_outend(z.oz,true);
$else
   outhex(z.oz,ii,5);
  outstring(z.oz,"HB ");
  Outputend(z.oz,true);
$endif
end;

function readchar(var z: inoutzone): char;
var aa:char;
begin
  open_input_zone(z);
$if target86 = 1
  op_inchar(z.iz,aa);
$else
  inchar(z.iz,aa);
$endif
  if z.iz.readstate<>0 then
  begin
$if target86=1
    op_in(z.iz);
    op_wait(z.iz,z.p^);
    op_inchar(z.iz,aa);
$else
    opin(z.iz);
    opwait(z.iz,z.p^);
    inchar(z.iz,aa);
$endif
  end;
  readchar:=aa;
end;

function readinteger(var z: inoutzone): integer;
var aa:integer;
begin
  open_input_zone(z);
$if target86 = 1
  op_ininteger(z.iz,aa);
$else
  ininteger(z.iz,aa);
$endif
  if z.iz.readstate<>0 then
  begin
$if target86=1
    op_in(z.iz);
    op_wait(z.iz,z.p^);
    op_ininteger(z.iz,aa);
$else
    opin(z.iz);
    opwait(z.iz,z.p^);
    ininteger(z.iz,aa);
$endif
  end;
  readinteger:=aa;
end;


function byt(x : integer) : byte;
begin
  byt := x mod 256;
end;

function int(x : INT16) : integer;
begin
  int := x;
end;

function wrd(x : integer) : INT16; 
begin
wrd := x;
end.
