home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 13 / CDA13.ISO / cdactual / demobin / share / program / Pascal / ASSEM120.ZIP / TRANSLAT.PAS < prev   
Encoding:
Pascal/Delphi Source File  |  1989-09-24  |  5.8 KB  |  205 lines

  1. Program Translate;
  2. { Translates MNEMONIC.LST to MNEMONIC.BIN }
  3. Type
  4.     EncodRec=record
  5.          Mnem:  string[8];
  6.          Byte1:  string[9];
  7.          OpType,Byte2,Class:  byte
  8.     End;
  9.  
  10.     ChartType = array[0..160] of EncodRec;
  11.  
  12. Var
  13.      Fin:  text;
  14.      Fout:  file of ChartType;
  15.      Chart:  ChartType;
  16.      ChartPtr:  integer;
  17.      Line:  string;
  18.      Item:  string;
  19.      Value:  byte;
  20.      Code:  integer;
  21.  
  22. Const
  23.      NO_OPERAND =            0;
  24.      REG_MEM_REGISTER =      1;
  25.      IMMEDIATE_AL_AX =       2;
  26.      IMMEDIATE_REG_MEM =     3;
  27.      DIRECT_IN_SEGMENT =     4;
  28.      INDIRECT_IN_SEGMENT =   5;
  29.      DIRECT_INTRASEGMENT =   6;
  30.      INDIRECT_INTRASEGMENT = 7;
  31.      REGISTER_MEMORY =       8;
  32.      A16_BIT_REGISTER =      9;
  33.      ESC =                  10;
  34.      IMMEDIATE_PORT =       11;
  35.      PORT_ADDRESS_IN_DX =   12;
  36.      INT =                  13;
  37.      EIGHT_BIT_REL =        14;
  38.      MEMORY_AL_AX =         15;
  39.      AL_AX_MEMORY =         16;
  40.      REG_MEM_SR =           17;
  41.      SR_REG_MEM =           18;
  42.      SEGMENT_REGISTER =     19;
  43.      ANOTHER_INSTRUCTION =  20;
  44.      RET =                  21;
  45.      IMMEDIATE_REGISTER =   22;
  46.  
  47. Function NextItem(Var Line:  string):  string;
  48. {Takes an item (each item is separated by a | character) from Line.}
  49. {Whitespace is ignored.  The item is removed from the left of Line.}
  50. Var
  51.      p:  integer;
  52.      Item:  string;
  53.  
  54. Begin
  55.       p:=Pos('|',Line);
  56.       if p=0 then p:=Length(Line);
  57.       Item:='';
  58.       For p:=1 to p do
  59.       Begin
  60.            if not (Line[1] in [' ','|']) then Item:=Item+Line[1];
  61.            Line:=Copy(Line,2,Length(Line)-1)
  62.       End;
  63.       NextItem:=Item
  64. End;
  65.  
  66. Procedure Capitalize(Var St:  string);
  67. Var
  68.       i:  integer;
  69.  
  70. Begin
  71.      For i:=1 to length(St) do St[i]:=Upcase(St[i])
  72. End;
  73.  
  74. Function FromHex(n:  string):  word;
  75. Var
  76.      n1:  byte;
  77.      Tmp:  word;
  78.      i:  integer;
  79.  
  80. Begin
  81.      Capitalize(n);
  82.      Tmp:=0;
  83.      i:=2;
  84.      While (i<=length(n)) and (n[i] in ['0'..'9','A'..'F']) do
  85.      Begin
  86.           Tmp:=Tmp shl 4;
  87.           if n[i] in ['A'..'F'] then
  88.                 n1:=15-(ord('F')-ord(n[i]))
  89.           else
  90.                 n1:=9-(ord('9')-ord(n[i]));
  91.           Tmp:=Tmp+n1;
  92.           inc(i)
  93.      End;
  94.      FromHex:=Tmp
  95. End;
  96.  
  97. Function FromBin(n:  string):  word;
  98. Var
  99.      i,mult,res:  word;
  100.  
  101. Begin
  102.      Mult:=1; res:=0;
  103.      For i:=1 to length(n)-1 do
  104.      Begin
  105.           if n[length(n)]='1' then
  106.                res:=res+mult;
  107.           n:=Copy(n,1,length(n)-1);
  108.           mult:=mult shl 1
  109.      End;
  110.      FromBin:=res
  111. End;
  112.  
  113. Function GetValue(St:  string):  byte;
  114. Begin
  115.      if St='' then
  116.      Begin
  117.           GetValue:=0;
  118.           Exit
  119.      End;
  120.      Case St[1] of
  121.           'B':  GetValue:=lo(FromBin(St));
  122.           'H':  GetValue:=lo(FromHex(St))
  123.           else
  124.           Begin
  125.                 WriteLn(#7,'Error in LST file.');
  126.                 Close(Fin);
  127.                 Halt
  128.           End
  129.      End
  130. End;
  131.  
  132.  
  133. Function GetOpType(St:  string):  byte;
  134. Begin
  135.      if St='NO_OPERAND' then GetOpType:=NO_OPERAND else
  136.      if St='REG/MEM,REGISTER' then GetOpType:=REG_MEM_REGISTER else
  137.      if St='IMMEDIATE,AL/AX' then GetOpType:=IMMEDIATE_AL_AX else
  138.      if St='IMMEDIATE,REG/MEM' then GetOpType:=IMMEDIATE_REG_MEM else
  139.      if St='DIRECT_IN_SEGMENT' then GetOpType:=DIRECT_IN_SEGMENT else
  140.      if St='INDIRECT_IN_SEGMENT' then GetOpType:=INDIRECT_IN_SEGMENT else
  141.      if St='DIRECT_INTRASEGMENT' then GetOpType:=DIRECT_INTRASEGMENT else
  142.      if St='INDIRECT_INTRASEGMENT' then GetOpType:=INDIRECT_INTRASEGMENT else
  143.      if St='REGISTER/MEMORY' then GetOpType:=REGISTER_MEMORY else
  144.      if St='16-BIT_REGISTER' then GetOpType:=A16_BIT_REGISTER else
  145.      if St='ESC' then GetOpType:=ESC else
  146.      if St='IMMEDIATE_PORT' then GetOpType:=IMMEDIATE_PORT else
  147.      if St='PORT_ADDRESS_IN_DX' then GetOpType:=PORT_ADDRESS_IN_DX else
  148.      if St='INT' then GetOpType:=INT else
  149.      if St='8-BIT-REL' then GetOpType:=EIGHT_BIT_REL else
  150.      if St='MEMORY,AL/AX' then GetOpType:=MEMORY_AL_AX else
  151.      if St='AL/AX,MEMORY' then GetOpType:=AL_AX_MEMORY else
  152.      if St='REG/MEM,SR' then GetOpType:=REG_MEM_SR else
  153.      if St='SR,REG/MEM' then GetOpType:=SR_REG_MEM else
  154.      if St='IMMEDIATE,REGISTER' then GetOpType:=IMMEDIATE_REGISTER else
  155.      if St='SEGMENT_REGISTER' then GetOpType:=SEGMENT_REGISTER else
  156.      if St='ANOTHER_INSTRUCTION' then GetOpType:=ANOTHER_INSTRUCTION else
  157.      if St='RET' then GetOpType:=RET else
  158.      Begin
  159.           WriteLn(#7,St,' is a bad operand type.');
  160.           Close(fin);
  161.           Halt
  162.      End
  163. End;
  164.  
  165. Function Blank(Line:  string):  boolean;
  166. Var
  167.      i:  integer;
  168.  
  169. Begin
  170.      Blank:=TRUE;
  171.      For i:=1 to length(Line) do
  172.           if not (Line[i] in [#32,#0]) then Blank:=FALSE
  173. End;
  174.  
  175. Begin
  176.      Assign(Fin,'mnemonic.lst');
  177.      Reset(Fin);
  178.      ChartPtr:=0;
  179.      Repeat
  180.           ReadLn(Fin,Line);
  181.           Capitalize(Line);
  182.           if (Line[1]<>';') and (not Blank(Line)) then
  183.           Begin
  184.                inc(ChartPtr);
  185.                Chart[ChartPtr].Mnem:=NextItem(Line);
  186.                if Chart[ChartPtr].Mnem<>'ENDOFLIS' then
  187.                Begin
  188.                     Chart[ChartPtr].Byte1:=NextItem(Line);
  189.                     Item:=NextItem(Line);
  190.                     Chart[ChartPtr].OpType:=GetOpType(Item);
  191.                     Item:=NextItem(Line);
  192.                     Chart[ChartPtr].Byte2:=GetValue(Item);
  193.                     Item:=NextItem(Line);
  194.                     Val(Item,Value,Code);
  195.                     Chart[ChartPtr].Class:=Value
  196.                End
  197.           End
  198.      Until Chart[ChartPtr].Mnem='ENDOFLIS';
  199.      dec(ChartPtr);
  200.      Close(Fin);
  201.      Assign(Fout,'programs\mnemonic.bin');
  202.      Rewrite(Fout);
  203.      Write(Fout,Chart);
  204.      Close(Fout)
  205. End.