Press enter to see results or esc to cancel.

Port Statement

This procedure processes Port and PortW statements. This stetement accesses I/O address space and generates OUT instruction. Reading from Port and PortW is done at expression processing.

Procedure TStatement.ProcessPortStatement;
Var PortAddress, PortData: TExpression;
    OutOpCode: Byte;
begin
  GetNextToken;
  OutOpCode := Byte (CurrentIdentifierDataPtr^) + $E6;  { Port = 0, PortW = 1 => OUT_Address_AX }
  ExpectTokenAndGetNext (Token_LeftBracket);
  PortAddress.ExpectIntegerExpression;
  PortAddress.CheckOrdinalRange (Ptr (SystemUnitSegment, Word_TypeOffset));
  ExpectTokenAndGetNext (Token_RightBracket);
  ExpectTokenAndGetNext (Token_Assignment);
  PortData.ExpectIntegerExpression;
  Case OutOpCode and $01 <> 0 of
    True: PortData.CheckOrdinalRange (Ptr (SystemUnitSegment, Word_TypeOffset));
    else PortData.CheckOrdinalRange (Ptr (SystemUnitSegment, Byte_TypeOffset));
  end;
  If (PortAddress.Location = elConstant) and (PortAddress.Value.Byte1 = 0) then
    begin
      PortData.Calculate;
      PortData.LoadExpressionToRegisters (urAX);
      GenerateInstruction_TwoBytes (OutOpCode, PortAddress.Value.Byte);
    end else begin
               CalculateExpressionsAndLoadLeftTo_rAX_AndRightTo_rDX (PortData, PortAddress);
               GenerateInstruction_Byte (OutOpCode or $08);
             end;

  StatementCode := EndSubroutine;
end;