Ignore:
Timestamp:
Oct 20, 2020, 1:10:09 AM (4 years ago)
Author:
chronos
Message:
  • Added: Devices form with tree view of connected devices. Device control form can be opened by double click.
  • Modifid: IN/OUT instructions now use also device group index to directly specify which device should be read/written.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/CpuSingleSize/UAssembler.pas

    r219 r220  
    2525    FOnError: TErrorEvent;
    2626    Parser: TParser;
     27    function ParseVar: Boolean;
    2728    function ParseDb: Boolean;
    2829    function ParseOrg: Boolean;
     
    3637    Labels: TDictionary<string, Integer>;
    3738    LabelRefs: TList<TLabelRef>;
     39    Variables: TDictionary<string, Integer>;
    3840    Messages: TMessages;
    3941    procedure Error(Text: string; Pos: TPoint);
     
    8183  end else
    8284  if Token.Kind = tkIdentifier then begin;
     85    if Variables.TryGetValue(Token.Value, Addr) then begin
     86      Memory.Write(Addr);
     87    end else
    8388    if Labels.TryGetValue(Token.Value, Addr) then begin
    8489      Memory.Write(Addr);
     
    107112  while not Parser.CheckNextKind(tkEof) do begin
    108113    ParseLabel;
     114    if ParseVar then begin
     115    end else
    109116    if ParseDb then begin
    110117    end else
     
    119126  UpdateLabelRefs;
    120127  Error('Compilation finished.', Point(0, 0));
     128end;
     129
     130function TAssembler.ParseVar: Boolean;
     131var
     132  TokenName: TToken;
     133  TokenValue: TToken;
     134  Number: TInteger;
     135begin
     136  Result := False;
     137  if Parser.CheckNextAndRead(tkIdentifier, 'VAR') then begin
     138    Result := True;
     139    while True do begin
     140      TokenName := Parser.ReadNext;
     141      if TokenName.Kind = tkIdentifier then begin
     142        TokenValue := Parser.ReadNext;
     143        if TokenValue.Kind = tkNumber then begin
     144          if not Labels.ContainsKey(TokenName.Value) then begin
     145            if TryStrToInt(TokenValue.Value, Number) then
     146              Variables.Add(TokenName.Value, Number)
     147            else Error('Expected number', TokenValue.Pos);
     148          end else Error('Duplicate variable name ' + TokenName.Value, TokenName.Pos);
     149        end else Error('Expected variable value.', TokenValue.Pos);
     150      end else Error('Expected variable name.', TokenName.Pos);
     151      if Parser.CheckNextAndRead(tkSpecialSymbol, ',') then begin
     152        Continue;
     153      end;
     154      Break;
     155    end;
     156  end;
    121157end;
    122158
     
    212248        Parser.Expect(tkSpecialSymbol, ')');
    213249      end else
     250      if InstructionInfo.Params[I] = ptRegIndirectGroup then begin
     251        Parser.Expect(tkSpecialSymbol, '(');
     252        Token := Parser.ReadNext;
     253        if (Token.Value <> '') and (Token.Value[1] = 'R') then begin
     254          Token.Value := Copy(Token.Value, 2, MaxInt);
     255          if TryStrToInt(Token.Value, Number) then begin
     256            Memory.Write(Number);
     257            Parser.Expect(tkSpecialSymbol, ':');
     258            Token := Parser.ReadNext;
     259            if (Token.Value <> '') and (Token.Value[1] = 'R') then begin
     260              Token.Value := Copy(Token.Value, 2, MaxInt);
     261              if TryStrToInt(Token.Value, Number) then begin
     262                Memory.Write(Number);
     263              end else Error('Expected numeric register index error', Token.Pos);
     264            end else Error('Expected register name starting with R character.', Token.Pos);
     265          end else Error('Expected numeric register index error', Token.Pos);
     266        end else Error('Expected register name starting with R character.', Token.Pos);
     267        Parser.Expect(tkSpecialSymbol, ')');
     268      end else
    214269    end;
    215270  end;
     
    271326  Labels := TDictionary<string, Integer>.Create;
    272327  LabelRefs := TList<TLabelRef>.Create;
     328  Variables := TDictionary<string, Integer>.Create;
    273329end;
    274330
    275331destructor TAssembler.Destroy;
    276332begin
     333  FreeAndNil(Variables);
    277334  FreeAndNil(Labels);
    278335  FreeAndNil(LabelRefs);
Note: See TracChangeset for help on using the changeset viewer.