home *** CD-ROM | disk | FTP | other *** search
/ Hot Shareware 32 / hot34.iso / ficheros / DTOOL / INTER57F.ZIP / INT2RTF.ZIP / INT2RTF.PAS < prev    next >
Pascal/Delphi Source File  |  1997-07-07  |  63KB  |  1,601 lines

  1. { INT2RTF. Main module for the Interrupt List -> .RTF compiler.}
  2. { The software included, data formats and basic algorithms are }
  3. { copyright (C) 1996 by Slava Gostrenko. All rights reserved.  }
  4.  
  5. {$M 16384}
  6. {$IFNDEF DPMI}
  7.   ! set Target to 'Protected Mode Application'
  8. {$ENDIF}
  9.  
  10. {$X+}
  11. program
  12.   Int2RTF;
  13.  
  14. uses
  15.   Upcaser, Objects, RTF;
  16.  
  17. var
  18.   FO: THelpFile;
  19.   IncompPattern: Text;
  20.   Hdrs: TStringCollection;
  21.   IntLists: array [Byte] of PTopic;
  22.   IntNames: array [Byte] of string [12];
  23.   KeyLists: TCollection;
  24.   KeyNames: TCollection;
  25.   IntList: PTopic;
  26.   IntListName: string;
  27.   Tables: PTopic;
  28.   TablesName: string;
  29.   CMOS: PTopic;
  30.   CMOSName: string;
  31.   FARCall: PTopic;
  32.   FARCallName: string;
  33.   Memory: PTopic;
  34.   MemoryName: string;
  35.   MSR: PTopic;
  36.   MSRName: string;
  37.   OpCodes: PTopic;
  38.   OpCodesName: string;
  39.   Ports: PTopic;
  40.   PortSName: string;
  41.  
  42.   IntListIndex: PTopic;
  43.   IntListIndexName: string;
  44.   Interrup1st: Text;
  45.   CopyrightStr: string;
  46.  
  47. const HexCh: array [0..$F] of Char = '0123456789ABCDEF';
  48. function HexWord (W: Word): string;
  49. begin
  50.   HexWord := HexCh[Hi(W) shr 4] + HexCh[Hi(W) and $F]
  51.            + HexCh[Lo(W) shr 4] + HexCh[Lo(W) and $F];
  52. end;
  53. function HexByte (B: Byte): string;
  54. begin
  55.   HexByte := HexCh[B shr 4] + HexCh[B and $F];
  56. end;
  57.  
  58. function MemInitSwapFile(FileName: PChar; FileSize: Longint): Integer; far; external 'RTM' Index 35;
  59. function MemCloseSwapFile(Delete: Integer): Integer; far; external 'RTM' Index 36;
  60.  
  61. function MakeCorrectTopicName (const TopicName: string): string;
  62. var
  63.   I: Integer;
  64.   V: Integer;
  65.   AddChar, TstTopic: string;
  66.   Rez: string;
  67. begin
  68.   Rez := TopicName;
  69.  
  70.   V := 0;
  71.  
  72.   AddChar := '';
  73.  
  74.   TstTopic := StUpcase2 (Rez);
  75.   while Hdrs. Search (@TstTopic, I) do begin
  76.     Dec (Rez [0], Length (AddChar));
  77.     Inc (V);
  78.     if V > 99 then
  79.       WriteLn ('error 3');
  80.  
  81.     System. Str (V, AddChar);
  82.     if Length (AddChar) = 1 then
  83.       AddChar := '_0' + AddChar
  84.     else
  85.       AddChar := '_'  + AddChar;
  86.  
  87.     Rez := Rez + AddChar;
  88.     TstTopic := StUpcase2 (Rez);
  89.   end;
  90.  
  91.   Hdrs. Insert (NewStr (TstTopic));
  92.  
  93.   MakeCorrectTopicName := Rez;
  94. end;
  95.  
  96. function ProcessPattern (var Str: string; var Pos: Integer;
  97.                          Pattern: string; Keyword: string;
  98.                          Topic: PTopic; StepBack: Integer): Boolean;
  99. var I, J: Integer;
  100. begin
  101.   I := 1;
  102.   while I <= Length (Pattern) do begin
  103.     if Pattern [I] in [#3, #6] then
  104.       if Upcase [Str [Pos + I - 1]] in HexChars + ['X'] then begin
  105.         J := System. Pos (#3, Keyword);
  106.         if J > 0 then
  107.           Keyword [J] := Str [Pos + I - 1]
  108.         else
  109.           if Pattern [I] = #3 then begin
  110.             WriteLn (Str);
  111.             WriteLn ('error in keyword pattern (1) ', Pattern, ' ', Keyword);
  112.             ProcessPattern := False;
  113.             Exit;
  114.           end;
  115.       end else begin
  116.         ProcessPattern := False;
  117.         Exit;
  118.       end
  119.     else
  120.     if Pattern [I] in [#4, #7] then begin
  121.       if (  (Upcase [Str [Pos + I - 1]] in ['B', 'C', 'D'])
  122.         and (Upcase [Str [Pos + I]] in ['X', 'L', 'H']))
  123.       or (  (Upcase [Str [Pos + I - 1]] in ['S', 'D'])
  124.         and (Upcase [Str [Pos + I]] = 'I'))
  125.       or (  (Upcase [Str [Pos + I - 1]] in ['B', 'S'])
  126.         and (Upcase [Str [Pos + I]] = 'P'))
  127.       or (  (Upcase [Str [Pos + I - 1]] in ['D', 'E', 'S', 'F', 'G'])
  128.         and (Upcase [Str [Pos + I]] = 'S'))
  129.       or (  (Upcase [Str [Pos + I - 1]] = 'S')
  130.         and (Upcase [Str [Pos + I]] = 'F'))
  131.       or (  (Upcase [Str [Pos + I - 1]] = 'V')
  132.         and (Upcase [Str [Pos + I]] = 'X'))
  133.       then begin
  134.         J := System. Pos (#4, Keyword);
  135.         if J > 0 then begin
  136.           Keyword [J] := Str [Pos + I - 1];
  137.           Keyword [J + 1] := Str [Pos + I];
  138.           Inc (I);
  139.         end else
  140.           if Pattern [I] = #4 then begin
  141.             WriteLn (Str);
  142.             WriteLn ('error in keyword pattern (2) ', Pattern, ' ', Keyword);
  143.             ProcessPattern := False;
  144.             Exit;
  145.           end else
  146.             Inc (I);
  147.       end else begin
  148.         ProcessPattern := False;
  149.         Exit;
  150.       end
  151.     end else
  152.     if Pattern [I] in [#5, #8] then begin
  153.       if (  (Upcase [Str [Pos + I - 1]] in ['B', 'C', 'D'])
  154.         and (Upcase [Str [Pos + I]] in ['X', 'L', 'H']))
  155.       or (  (Upcase [Str [Pos + I - 1]] = 'S')
  156.         and (Upcase [Str [Pos + I]] = 'F'))
  157.       or (  (Upcase [Str [Pos + I - 1]] = 'V')
  158.         and (Upcase [Str [Pos + I]] = 'X'))
  159.       then begin
  160.         J := System. Pos (#5, Keyword);
  161.         if J > 0 then begin
  162.           Keyword [J] := Str [Pos + I - 1];
  163.           Keyword [J + 1] := Str [Pos + I];
  164.           Inc (I);
  165.         end else
  166.           if Pattern [I] = #5 then begin
  167.             WriteLn (Str);
  168.             WriteLn ('error in keyword pattern (3) ', Pattern, ' ', Keyword);
  169.             ProcessPattern := False;
  170.             Exit;
  171.           end else
  172.             Inc (I);
  173.       end else begin
  174.         ProcessPattern := False;
  175.         Exit;
  176.       end
  177.     end else
  178.     if ((Pattern [I] = 'X') and (Upcase [Str [Pos + I - 1]] in ['L', 'H']))
  179.     or ((Pattern [I] in ['L', 'H']) and (Upcase [Str [Pos + I - 1]] = 'X'))
  180.     then
  181.       {Ok}
  182.     else
  183.     if Pattern [I] = 'H' then begin
  184.       if Upcase [Str [Pos + I - 1]] <> 'H' then begin
  185.         Delete (Pattern, I, 1);
  186.         Dec (I);
  187.       end;
  188.     end else
  189.     if Upcase [Str [Pos + I - 1]] <> Upcase [Pattern [I]] then begin
  190.       ProcessPattern := False;
  191.       Exit;
  192.     end;
  193.  
  194.     Inc (I);
  195.   end;
  196.  
  197.   {Once user's request for pattern with helper was confirmed}
  198.   {make the pattern suitable for helper string analizis.    }
  199.   if Pattern [Length (Pattern)] = '"' then
  200.     Dec (Pattern [0]);
  201.  
  202.   if  (Pos + Length (Pattern) - 1 > Length (Str))
  203.   and (Pattern [Length (Pattern)] in ['h', 'H']) then
  204.     Dec (Pattern [0]);
  205.  
  206.   if Pos + Length (Pattern) - 1 <= Length (Str) then begin
  207.     if (System. Pos (#3, Keyword) > 0)
  208.     or (System. Pos (#4, Keyword) > 0)
  209.     or (System. Pos (#5, Keyword) > 0) then begin
  210.       WriteLn (Str);
  211.       WriteLn ('error in keyword pattern (4) ', Pattern, ' ', Keyword);
  212.     end;
  213.  
  214.     if  (Length (Keyword) < 13)
  215.     and (Pos + Length (Pattern) <= Length (Str))
  216.     and (Str [Pos + Length (Pattern)] in (['/', 'h', 'H', ':', '-'] + HexChars))
  217.     and (Pos + Length (Pattern) + 1 <= Length (Str))
  218.     and (not (Str [Pos + Length (Pattern) + 1] in ['I', 'R', 'W', '-', ' ']))
  219.     then begin
  220.       WriteLn (IncompPattern, Str);
  221.       WriteLn (IncompPattern, 'not a complete pattern ', Pattern, ' for keyword ', Keyword);
  222.     end;
  223.  
  224.     if  (Pos + Length (Pattern) <= Length (Str))
  225.     and (Str [Pos + Length (Pattern)] = '"') then begin
  226.       Keyword := Keyword + '"';
  227.       I := Pos + Length (Pattern) + 1;
  228.       while (I <= Length (Str)) and (Str [I] <> '"') do begin
  229.         Keyword := Keyword + Str [I];
  230.         Inc (I);
  231.       end;
  232.       if I <= Length (Str) then begin
  233.         Keyword := Keyword + '"';
  234.         if Copy (Keyword, 1, 4) = 'INT ' then
  235.           Delete (Keyword, 1, 4);
  236.       end else
  237.         Delete (Keyword, System.Pos ('"', Keyword), Length (Keyword));
  238.     end;
  239.  
  240.     Topic^. AddKeyword (Keyword, StepBack);
  241.     Insert (#2, Str, Pos + Length (Pattern));
  242.     Insert (#2, Str, Pos);
  243.     Inc (Pos, Length (Pattern) + 1);
  244.  
  245.     ProcessPattern := True;
  246.   end else
  247.     ProcessPattern := False;
  248. end;
  249.  
  250. function SkipPattern (var Str: string; var Pos: Integer;
  251.                       Pattern: string): Boolean;
  252. var I, J: Integer;
  253. begin
  254.   I := 1;
  255.   while I <= Length (Pattern) do begin
  256.     if Pattern [I] = #3 then
  257.       if Upcase [Str [Pos + I - 1]] in HexChars + ['X'] then begin
  258.         {Ok}
  259.       end else begin
  260.         SkipPattern := False;
  261.         Exit;
  262.       end
  263.     else
  264.     if Pattern [I] = #4 then begin
  265.       if (  (Upcase [Str [Pos + I - 1]] in ['B', 'C', 'D'])
  266.         and (Upcase [Str [Pos + I]] in ['X', 'L', 'H']))
  267.       or (  (Upcase [Str [Pos + I - 1]] in ['S', 'D'])
  268.         and (Upcase [Str [Pos + I]] = 'I'))
  269.       or (  (Upcase [Str [Pos + I - 1]] in ['B', 'S'])
  270.         and (Upcase [Str [Pos + I]] = 'P'))
  271.       or (  (Upcase [Str [Pos + I - 1]] in ['D', 'E', 'S', 'F', 'G'])
  272.         and (Upcase [Str [Pos + I]] = 'S'))
  273.       or (  (Upcase [Str [Pos + I - 1]] = 'S')
  274.         and (Upcase [Str [Pos + I]] = 'F'))
  275.       or (  (Upcase [Str [Pos + I - 1]] = 'V')
  276.         and (Upcase [Str [Pos + I]] = 'X'))
  277.       then begin
  278.         {Ok}
  279.       end else begin
  280.         SkipPattern := False;
  281.         Exit;
  282.       end
  283.     end else
  284.     if Pattern [I] = #5 then begin
  285.       if (  (Upcase [Str [Pos + I - 1]] in ['B', 'C', 'D'])
  286.         and (Upcase [Str [Pos + I]] in ['X', 'L', 'H']))
  287.       or (  (Upcase [Str [Pos + I - 1]] = 'S')
  288.         and (Upcase [Str [Pos + I]] = 'F'))
  289.       or (  (Upcase [Str [Pos + I - 1]] = 'V')
  290.         and (Upcase [Str [Pos + I]] = 'X'))
  291.       then begin
  292.         {Ok}
  293.       end else begin
  294.         SkipPattern := False;
  295.         Exit;
  296.       end
  297.     end else
  298.     if ((Pattern [I] = 'X') and (Upcase [Str [Pos + I - 1]] in ['L', 'H']))
  299.     or ((Pattern [I] in ['L', 'H']) and (Upcase [Str [Pos + I - 1]] = 'X'))
  300.     then
  301.       {Ok}
  302.     else
  303.     if Pattern [I] = 'H' then begin
  304.       if Upcase [Str [Pos + I - 1]] <> 'H' then begin
  305.         Delete (Pattern, I, 1);
  306.         Dec (I);
  307.       end;
  308.     end else
  309.     if Upcase [Str [Pos + I - 1]] <> Upcase [Pattern [I]] then begin
  310.       SkipPattern := False;
  311.       Exit;
  312.     end;
  313.  
  314.     Inc (I);
  315.   end;
  316.  
  317.   if Pos + Length (Pattern) - 1 <= Length (Str) then begin
  318.     if  (Pos + Length (Pattern) <= Length (Str))
  319.     and (Str [Pos + Length (Pattern)] in (['/', 'h', 'H', ':', '-'] + HexChars))
  320.     and (Pos + Length (Pattern) + 1 <= Length (Str))
  321.     and (not (Str [Pos + Length (Pattern) + 1] in ['I', 'R', 'W', '-', ' ']))
  322.     then begin
  323.       WriteLn (IncompPattern, Str);
  324.       WriteLn (IncompPattern, 'not a complete pattern ', Pattern);
  325.     end;
  326.  
  327.     Inc (Pos, Length (Pattern) - 1);
  328.  
  329.     SkipPattern := True;
  330.   end else
  331.     SkipPattern := False;
  332. end;
  333.  
  334. procedure AddStr2Topic (Str: string; var Topic: PTopic;
  335.                         var TopicName: string; const CurInt, CurSubF, CurCat: string;
  336.                         Indexed: Boolean);
  337. var I: Integer;
  338.     KeyCnt: Integer;
  339. begin
  340.   KeyCnt := 0;
  341.   for I := 1 to Length (Str) do
  342.     if Str [I] = #2 then
  343.       Inc (KeyCnt);
  344.  
  345.   I := 1;
  346.   while I <= Length (Str) do begin
  347.     if Str [I] = #2 then
  348.       Dec (KeyCnt);
  349.  
  350.     if not Odd (KeyCnt) then
  351.       if  (I + 4 <= Length (Str))
  352.       and (Str [I] = '#')
  353.       and (Str [I + 1] in ['0'..'9', 'C', 'F', 'M', 'R', 'P'])
  354.       and (Str [I + 2] in ['0'..'9'])
  355.       and (Str [I + 3] in ['0'..'9'])
  356.       and (Str [I + 4] in ['0'..'9'])
  357.       then begin
  358.         Topic^. AddKeyword (Copy (Str, I, 5), KeyCnt div 2);
  359.         Insert (#2, Str, I + 5);
  360.         Insert (#2, Str, I);
  361.         Inc (I, 6);
  362.       end else
  363.         if (I = 1)
  364.         or (not (Upcase [Str [I - 1]] in ['A'..'Z', '0'..'9'])) then
  365.           case Upcase [Str [I]] of
  366.           'I':
  367.             if ProcessPattern (Str, I, 'INT '#3#3'H/AX='#3#3#3#3'H/'#4#4'='#3#3#3#3'H',
  368.                  #3#3#3#3#3#3#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  369.  
  370.             or ProcessPattern (Str, I, 'INT 13/AX=2000H/DL=81H', '1320' + CurCat, Topic, KeyCnt div 2)
  371.             or ProcessPattern (Str, I, 'INT '#3#3'H/AX='#3#3#3#3'H/'#5#5'='#3#3'H',
  372.                  #3#3#3#3#3#3#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
  373.  
  374.             or ProcessPattern (Str, I, 'INT 21/AX=4202H/CX=0/DX=0', '2142' + CurCat, Topic, KeyCnt div 2)
  375.             or ProcessPattern (Str, I, 'INT '#3#3'H/AX='#6#6#6#6'H-'#6#6#6#6'H',
  376.                  'INT '#3#3, Topic, KeyCnt div 2)
  377.             or ProcessPattern (Str, I, 'INT '#3#3'H/AX='#3#3#3#3'H',
  378.                  #3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  379.  
  380.             or ProcessPattern (Str, I, 'INT '#3#3'H/AH='#3#3#3#3'H',
  381.                  #3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  382.  
  383.             or ProcessPattern (Str, I, 'INT '#3#3'H/AH='#3#3'H/'#4#4'='#3#3#3#3'H',
  384.                  #3#3#3#3'--'#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  385.             or ProcessPattern (Str, I, 'INT '#3#3'H/AH='#3#3'H/'#5#5'='#3#3'H',
  386.                  #3#3#3#3'--'#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
  387.             or ProcessPattern (Str, I, 'INT '#3#3'H/AH='#6#6'H-'#6#6'H',
  388.                  'INT '#3#3, Topic, KeyCnt div 2)
  389.             or ProcessPattern (Str, I, 'INT '#3#3'H/AH='#3#3'H',
  390.                  #3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  391.  
  392.             or ProcessPattern (Str, I, 'INT '#3#3'H/AL='#3#3'H/'#4#4'='#3#3#3#3'H',
  393.                  #3#3'--'#3#3#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  394.             or ProcessPattern (Str, I, 'INT '#3#3'H/AL='#3#3'H/'#5#5'='#3#3'H',
  395.                  #3#3'--'#3#3#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
  396.             or ProcessPattern (Str, I, 'INT '#3#3'H/AL='#3#3'H',
  397.                  #3#3'--'#3#3 + CurCat, Topic, KeyCnt div 2)
  398.  
  399.             or ProcessPattern (Str, I, 'INT '#3#3'H/'#4#4'='#3#3#3#3'H',
  400.                  #3#3'----'#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  401.             or ProcessPattern (Str, I, 'INT '#3#3'H/'#5#5'='#3#3'H',
  402.                  #3#3'----'#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
  403.  
  404.             or ProcessPattern (Str, I, 'INT '#3#3'H/'#3#3#3#3'H',
  405.                  #3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  406.             or ProcessPattern (Str, I, 'INT '#3#3'H/'#6#6'H-'#6#6'H',
  407.                  'INT '#3#3, Topic, KeyCnt div 2)
  408.             or ProcessPattern (Str, I, 'INT '#3#3'H/'#3#3'H',
  409.                  #3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  410.             or ProcessPattern (Str, I, 'INT '#6#6'-INT '#6#6'H',
  411.                  'TITLES', Topic, KeyCnt div 2)
  412.             or ProcessPattern (Str, I, 'INT '#6#6'-'#6#6'H',
  413.                  'TITLES', Topic, KeyCnt div 2)
  414.             or ProcessPattern (Str, I, 'INT XXH',
  415.                  'TITLES', Topic, KeyCnt div 2)
  416.             or ProcessPattern (Str, I, 'INT '#3#3'H',
  417.                  'INT '#3#3, Topic, KeyCnt div 2)
  418.             then
  419.               ;
  420.           'A':
  421.             if ProcessPattern (Str, I, 'AX='#3#3#3#3'H/'#4#4'='#3#3#3#3'H',
  422.                  CurInt + #3#3#3#3#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  423.             or ProcessPattern (Str, I, 'AX='#3#3#3#3'H/'#5#5'='#3#3'H',
  424.                  CurInt + #3#3#3#3#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
  425.             or ProcessPattern (Str, I, 'AX='#6#6#6#6'H-'#6#6#6#6'H',
  426.                  'INT ' + CurInt, Topic, KeyCnt div 2)
  427.             or ProcessPattern (Str, I, 'AX='#3#3#3#3'H',
  428.                  CurInt + #3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  429.             or ProcessPattern (Str, I, 'AH='#3#3'H/AL='#3#3'H',
  430.                  CurInt + #3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  431.  
  432.             or ProcessPattern (Str, I, 'AH='#3#3'H/'#4#4'='#3#3#3#3'H',
  433.                  CurInt + #3#3'--'#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  434.             or ProcessPattern (Str, I, 'AH='#3#3'H/'#5#5'='#3#3'H',
  435.                  CurInt + #3#3'--'#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
  436.             or ProcessPattern (Str, I, 'AH='#6#6'H-'#6#6'H',
  437.                  'INT ' + CurInt, Topic, KeyCnt div 2)
  438.             or ProcessPattern (Str, I, 'AH='#3#3'H',
  439.                  CurInt + #3#3 + CurCat, Topic, KeyCnt div 2)
  440.  
  441.             or ProcessPattern (Str, I, 'AL='#3#3'H/'#4#4'='#3#3#3#3'H',
  442.                  CurInt + Copy (CurSubF, 1, 2) + #3#3#4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  443.             or ProcessPattern (Str, I, 'AL='#3#3'H/'#5#5'='#3#3'H',
  444.                  CurInt + Copy (CurSubF, 1, 2) + #3#3#5#5#3#3 + CurCat, Topic, KeyCnt div 2)
  445.             or ProcessPattern (Str, I, 'AL='#6#6'H/'#6#6'H',
  446.                  CurInt + Copy (CurSubF, 1, 2) + CurCat, Topic, KeyCnt div 2)
  447.             or ProcessPattern (Str, I, 'AL='#6#6'H-'#6#6'H',
  448.                  CurInt + Copy (CurSubF, 1, 2) + CurCat, Topic, KeyCnt div 2)
  449.             or ProcessPattern (Str, I, 'AL='#3#3'H',
  450.                  CurInt + Copy (CurSubF, 1, 2) + #3#3 + CurCat, Topic, KeyCnt div 2)
  451.             then
  452.               ;
  453.           'B', 'C', 'D', 'S', 'E', 'F', 'G', 'V':
  454.             if ProcessPattern (Str, I, #4#4'='#3#3#3#3'H',
  455.                  CurInt + CurSubF + #4#4#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  456.             or SkipPattern (Str, I, 'CX=CX-1')
  457.             or ProcessPattern (Str, I, #8#8'='#6#6'H/'#6#6'H',
  458.                  CurInt + CurSubF + CurCat, Topic, KeyCnt div 2)
  459.             or ProcessPattern (Str, I, #8#8'='#6#6'H-'#6#6'H',
  460.                  CurInt + CurSubF + CurCat, Topic, KeyCnt div 2)
  461.             or ProcessPattern (Str, I, #5#5'='#3#3'H',
  462.                  CurInt + CurSubF + #5#5#3#3 + CurCat, Topic, KeyCnt div 2)
  463.             then
  464.               {nothing}
  465.             else
  466.             if Upcase [Str [I]] = 'C' then begin
  467.               if ProcessPattern (Str, I, 'CMOS DATA',
  468.                    'CMOS', Topic, KeyCnt div 2)
  469.               or ProcessPattern (Str, I, 'CMOS 8086/88',
  470.                    'CMOS', Topic, KeyCnt div 2)
  471.               or ProcessPattern (Str, I, 'CMOS 80C86/88',
  472.                    'CMOS', Topic, KeyCnt div 2)
  473.               or ProcessPattern (Str, I, 'CMOS '#3#3#3#3'H',
  474.                    'R'#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  475.               or ProcessPattern (Str, I, 'CMOS '#3#3'H-'#3#3'H',
  476.                    'R'#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  477.               or ProcessPattern (Str, I, 'CMOS '#3#3'H',
  478.                    'R'#3#3 + CurCat, Topic, KeyCnt div 2)
  479.               or ProcessPattern (Str, I, 'CMOS',
  480.                    'CMOS', Topic, KeyCnt div 2)
  481.  
  482.               or ProcessPattern (Str, I, 'CALL XXXXH:XXXXH"',
  483.                    '@xxxxxxxx', Topic, KeyCnt div 2)
  484.               or ProcessPattern (Str, I, 'CALL XXXXH:XXXXH',
  485.                    'FAR CALLS', Topic, KeyCnt div 2)
  486.               or ProcessPattern (Str, I, 'CALL '#3#3#3#3'H:'#3#3#3#3'H',
  487.                  '@'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  488.               then
  489.                 ;
  490.             end;
  491.           '@':
  492.             if ProcessPattern (Str, I, '@XXXXH:XXXXH"',
  493.                  '@xxxxxxxx', Topic, KeyCnt div 2)
  494.             or ProcessPattern (Str, I, '@XXXXH:XXXXH',
  495.                  'FAR CALLS', Topic, KeyCnt div 2)
  496.             or ProcessPattern (Str, I, '@'#3#3#3#3'H:'#3#3#3#3'H',
  497.                  '@'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  498.             then
  499.               ;
  500.           'M':
  501.             if ProcessPattern (Str, I, 'MEM '#6#6#6#6'H:xxxxH',
  502.                  'MEMORY', Topic, KeyCnt div 2)
  503.             or ProcessPattern (Str, I, 'MEM '#3#3#3#3'H:'#3#3#3#3'H',
  504.                  'M'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  505.             or ProcessPattern (Str, I, 'MEM '#3#3#3#3#3#3#3#3'H',
  506.                  'M'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  507.  
  508.             or ProcessPattern (Str, I, 'MSR '#3#3#3#3#3#3#3#3'H',
  509.                  'S'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  510.             then
  511.               ;
  512.           'P':
  513.             if ProcessPattern (Str, I, 'PORT ACCESS',
  514.                  'PORTS', Topic, KeyCnt div 2)
  515.             or ProcessPattern (Str, I, 'PORT '#3#3#3#3'H-'#3#3#3#3'H',
  516.                  'P'#3#3#3#3#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  517.             or ProcessPattern (Str, I, 'PORT '#3#3#3#3'H-'#3#3#3'H',
  518.                  'P'#3#3#3#3#3#3#3' ' + CurCat, Topic, KeyCnt div 2)
  519.             or ProcessPattern (Str, I, 'PORT '#3#3#3#3'H-????H',
  520.                  'P'#3#3#3#3'????' + CurCat, Topic, KeyCnt div 2)
  521.             or ProcessPattern (Str, I, 'PORT '#3#3#3#3'H',
  522.                  'P'#3#3#3#3 + CurCat, Topic, KeyCnt div 2)
  523.             then
  524.               ;
  525.           end;
  526.  
  527.     Inc (I);
  528.   end;
  529.  
  530.   Topic^. AddString (' ' + Str);
  531. end;
  532.  
  533. function NoLinks (S: string): string;
  534. var I: Integer;
  535. begin
  536.   I := Pos (#2, S);
  537.   while I > 0 do begin
  538.     Delete (S, I, 1);
  539.     I := Pos (#2, S);
  540.   end;
  541.   NoLinks := S;
  542. end;
  543.  
  544. procedure Tab2Spc (var Str: string);
  545. var I, J: Integer;
  546. begin
  547.   I := Pos (#9, Str);
  548.   while I > 0 do begin
  549.     Delete (Str, I, 1);
  550.     for J := 7 downto ((I - 1) mod 8) do
  551.       Insert (' ', Str, I);
  552.     I := Pos (#9, Str);
  553.   end;
  554. end;
  555.  
  556. function ProcessInterrup (const FileName: string; const FileIsATopic: string): Boolean;
  557. type
  558.   DividerRec = record
  559.     Len: Byte;
  560.     S: array [0..7] of Char;   (* '--------' *)
  561.     Cat: Char;                 (* category *)
  562.     C: Char;                   (* '-' *)
  563.     case Integer of
  564.       0: (Int: array [0..1] of Char; (* Interrupt number, 2 hex digits *)
  565.           SubF: array [0..3] of Char;(* sub function, 4 hex digits or '-' *)
  566.           R: array [0..1] of Char;   (* Secondary Register Name, Two Letters or '--' *)
  567.           RV: array [0..3] of Char;  (* sec. reg. value, 4 hex digits or '-' *)
  568.           Rest: array [0..17] of Char;
  569.          );
  570.       1: (RSign: Char;
  571.           R1,
  572.           R2: array [0..1] of Char;
  573.          );
  574.       2: (AtSign: Char;
  575.           CallSeg,
  576.           CallOfs: array [0..3] of Char;
  577.          );
  578.       3: (MSign: Char;
  579.           MemSeg,
  580.           MemOfs: array [0..3] of Char;
  581.          );
  582.       4: (SSign: Char;
  583.           MSR: array [0..7] of Char;
  584.          );
  585.       5: (PSign: Char;
  586.           P1,
  587.           P2: array [0..3] of Char;
  588.          );
  589.       6: (Cat2: Char;                (* category *)
  590.           C2: Char;                  (* '-' *)
  591.          );
  592.   end;            (* record dividerRec *)
  593.  
  594.   T2W = record Lo, Hi: Word; end;
  595.   T22 = record Lo, Hi: array [0..1] of Char; end;
  596.  
  597. var
  598.   FI: Text;
  599.   Str, StrUp: string;
  600.   TopicName: string;
  601.  
  602.   CurCat: string [1];
  603.   CurInt: string [2];
  604.   CurSubF: string [4];
  605.  
  606.   DR: DividerRec absolute Str;
  607.  
  608. procedure ProcessHdr (Hdr: string);
  609. begin
  610.   with DR do begin
  611.     if (S <> '--------')
  612.     or (not (Cat in ['A'..'Z', 'a'..'z', '!', '*', '-']))
  613.     or (C <> '-')
  614.     or ((Cat <> '!')
  615.         and
  616.         ((Cat <> '-')
  617.       or (C2 <> '-')
  618.       or (Pos ('OPCODES', StUpcase2 (FileName)) = 0)
  619.         )
  620.         and
  621.         ((not (RSign in ['R', 'r']))
  622.       or (not (R1 [0] in HexChars))
  623.       or (not (R1 [1] in HexChars))
  624.       or (  (R2 <> '--')
  625.         and ((not (R2 [0] in HexChars))
  626.           or (not (R2 [1] in HexChars)))
  627.          )
  628.         )
  629.         and
  630.         ((not (AtSign = '@'))
  631.       or (not (CallSeg [0] in HexChars + ['x']))
  632.       or (not (CallSeg [1] in HexChars + ['x']))
  633.       or (not (CallSeg [2] in HexChars + ['x']))
  634.       or (not (CallSeg [3] in HexChars + ['x']))
  635.       or (not (CallOfs [0] in HexChars + ['x']))
  636.       or (not (CallOfs [1] in HexChars + ['x']))
  637.       or (not (CallOfs [2] in HexChars + ['x']))
  638.       or (not (CallOfs [3] in HexChars + ['x']))
  639.         )
  640.         and
  641.         ((not (MSign in ['M', 'm']))
  642.       or (not (MemSeg [0] in HexChars + ['x']))
  643.       or (not (MemSeg [1] in HexChars + ['x']))
  644.       or (not (MemSeg [2] in HexChars + ['x']))
  645.       or (not (MemSeg [3] in HexChars + ['x']))
  646.       or (not (MemOfs [0] in HexChars + ['x']))
  647.       or (not (MemOfs [1] in HexChars + ['x']))
  648.       or (not (MemOfs [2] in HexChars + ['x']))
  649.       or (not (MemOfs [3] in HexChars + ['x']))
  650.         )
  651.         and
  652.         ((not (SSign in ['S', 's']))
  653.       or (not (MSR [0] in HexChars))
  654.       or (not (MSR [1] in HexChars))
  655.       or (not (MSR [2] in HexChars))
  656.       or (not (MSR [3] in HexChars))
  657.       or (not (MSR [4] in HexChars))
  658.       or (not (MSR [5] in HexChars))
  659.       or (not (MSR [6] in HexChars))
  660.       or (not (MSR [7] in HexChars))
  661.         )
  662.         and
  663.         ((not (PSign in ['P', 'p']))
  664.       or (not (P1 [0] in HexChars + ['x']))
  665.       or (not (P1 [1] in HexChars + ['x']))
  666.       or (not (P1 [2] in HexChars + ['x']))
  667.       or (not (P1 [3] in HexChars + ['x']))
  668.       or (  (P2 <> '----')
  669.         and (P2 <> '????')
  670.         and ((not (P2 [0] in HexChars))
  671.           or (not (P2 [1] in HexChars))
  672.           or (not (P2 [2] in HexChars))
  673.           or (not (P2 [3] in HexChars + ['x', ' '])))
  674.          )
  675.         )
  676.         and
  677.         ((not (Int [0] in HexChars))
  678.       or (not (Int [1] in HexChars))
  679.       or (  (SubF <> '----')
  680.         and ((T22 (SubF). Lo <> '--')
  681.           or (not (SubF [2] in HexChars))
  682.           or (not (SubF [3] in HexChars)))
  683.         and ((T22 (SubF). Hi <> '--')
  684.           or (not (SubF [0] in HexChars))
  685.           or (not (SubF [1] in HexChars)))
  686.         and ((not (SubF [0] in HexChars))
  687.           or (not (SubF [1] in HexChars))
  688.           or (not (SubF [2] in HexChars))
  689.           or (not (SubF [3] in HexChars)))
  690.          )
  691.       or (  (R <> '--')
  692.         and ((R <> 'BX') or (not (RV [0] in HexChars))
  693.                          or (not (RV [1] in HexChars))
  694.                          or (not (RV [2] in HexChars))
  695.                          or (not (RV [3] in HexChars)))
  696.         and ((R <> 'CX') or (not (RV [0] in HexChars))
  697.                          or (not (RV [1] in HexChars))
  698.                          or (not (RV [2] in HexChars))
  699.                          or (not (RV [3] in HexChars)))
  700.         and ((R <> 'DX') or (not (RV [0] in HexChars))
  701.                          or (not (RV [1] in HexChars))
  702.                          or (not (RV [2] in HexChars))
  703.                          or (not (RV [3] in HexChars)))
  704.         and ((R <> 'SI') or (not (RV [0] in HexChars))
  705.                          or (not (RV [1] in HexChars))
  706.                          or (not (RV [2] in HexChars))
  707.                          or (not (RV [3] in HexChars)))
  708.         and ((R <> 'DI') or (not (RV [0] in HexChars))
  709.                          or (not (RV [1] in HexChars))
  710.                          or (not (RV [2] in HexChars))
  711.                          or (not (RV [3] in HexChars)))
  712.         and ((R <> 'SP') or (not (RV [0] in HexChars))
  713.                          or (not (RV [1] in HexChars))
  714.                          or (not (RV [2] in HexChars))
  715.                          or (not (RV [3] in HexChars)))
  716.         and ((R <> 'BP') or (not (RV [0] in HexChars))
  717.                          or (not (RV [1] in HexChars))
  718.                          or (not (RV [2] in HexChars))
  719.                          or (not (RV [3] in HexChars)))
  720.         and ((R <> 'ES') or (not (RV [0] in HexChars))
  721.                          or (not (RV [1] in HexChars))
  722.                          or (not (RV [2] in HexChars))
  723.                          or (not (RV [3] in HexChars)))
  724.         and ((R <> 'DS') or (not (RV [0] in HexChars))
  725.                          or (not (RV [1] in HexChars))
  726.                          or (not (RV [2] in HexChars))
  727.                          or (not (RV [3] in HexChars)))
  728.  
  729.         and ((R <> 'BH') or (not (RV [0] in HexChars))
  730.                          or (not (RV [1] in HexChars))
  731.                          or (T22 (RV). Hi <> '--'))
  732.         and ((R <> 'BL') or (not (RV [0] in HexChars))
  733.                          or (not (RV [1] in HexChars))
  734.                          or (T22 (RV). Hi <> '--'))
  735.         and ((R <> 'CH') or (not (RV [0] in HexChars))
  736.                          or (not (RV [1] in HexChars))
  737.                          or (T22 (RV). Hi <> '--'))
  738.         and ((R <> 'CL') or (not (RV [0] in HexChars))
  739.                          or (not (RV [1] in HexChars))
  740.                          or (T22 (RV). Hi <> '--'))
  741.         and ((R <> 'DH') or (not (RV [0] in HexChars))
  742.                          or (not (RV [1] in HexChars))
  743.                          or (T22 (RV). Hi <> '--'))
  744.         and ((R <> 'DL') or (not (RV [0] in HexChars))
  745.                          or (not (RV [1] in HexChars))
  746.                          or (T22 (RV). Hi <> '--'))
  747.  
  748.         and ((R <> 'SF') or (not (RV [0] in HexChars))
  749.                          or (not (RV [1] in HexChars))
  750.                          or (not (RV [2] in HexChars))
  751.                          or (not (RV [3] in HexChars)))
  752.         and ((R <> 'SF') or (not (RV [0] in HexChars))
  753.                          or (not (RV [1] in HexChars))
  754.                          or (T22 (RV). Hi <> '--'))
  755.  
  756.         and ((R <> 'Vx') or (not (RV [0] in HexChars))
  757.                          or (not (RV [1] in HexChars))
  758.                          or (not (RV [2] in HexChars))
  759.                          or (not (RV [3] in HexChars)))
  760.          )
  761.       or (Rest <> '------------------')
  762.         )
  763.         and
  764.         (Hdr <> '-----------------------------------------')
  765.         and
  766.         (Hdr <> '------------------------------------------')
  767.         and
  768.         (Hdr <> '--------------------------------------------')
  769.         and
  770.         (Hdr <> '---------------------------------------------')
  771.         and
  772.         (Hdr <> '----------------------------------------------')
  773.         and
  774.         (Hdr <> '------------------------------------------------')
  775.         and
  776.         (Hdr <> '-------------------------------------------------')
  777.         and
  778.         (Hdr <> '--------------------------------------------------')
  779.         and
  780.         (Hdr <> '---------------------------------------------------')
  781.         and
  782.         (Hdr <> '----------------------------------------------------')
  783.         and
  784.         (Hdr <> '-----------------------------------------------------')
  785.         and
  786.         (Hdr <> '------------------------------------------------------')
  787.         and
  788.         (Hdr <> '---------------------------------------------------------')
  789.         and
  790.         (Hdr <> '----------------------------------------------------------')
  791.         and
  792.         (Hdr <> '-----------------------------------------------------------')
  793.         and
  794.         (Hdr <> '------------------------------------------------------------')
  795.         and
  796.         (Hdr <> '-------------------------------------------------------------')
  797.         and
  798.         (Hdr <> '--------------------------------------------------------------')
  799.        )
  800.     then
  801.       WriteLn (' ': 79, #13, 'header error: ', Hdr);
  802.  
  803.     if Cat = '!' then begin
  804.       TopicName := Copy (Str, 10, Length (Str) - 9);
  805.       CurInt := '';
  806.       CurSubF := '';
  807.     end else
  808.     if  (Cat = '-') and (C2 = '-')
  809.     and (Pos ('OPCODES', StUpcase2 (FileName)) > 0) then begin
  810.       TopicName := Copy (Str, 12, Length (Str) - 11);
  811.       CurInt := '';
  812.       CurSubF := '';
  813.     end else
  814.       if RSign in ['R', 'r'] then begin
  815.         TopicName := RSign + R1 + R2;
  816.         CurInt := '';
  817.         CurSubF := '';
  818.       end else
  819.       if AtSign = '@' then begin
  820.         TopicName := AtSign + CallSeg + CallOfs;
  821.         CurInt := '';
  822.         CurSubF := '';
  823.       end else
  824.       if MSign in ['M', 'm'] then begin
  825.         TopicName := MSign + MemSeg + MemOfs;
  826.         CurInt := '';
  827.         CurSubF := '';
  828.       end else
  829.       if SSign in ['S', 's'] then begin
  830.         TopicName := SSign + MSR;
  831.         CurInt := '';
  832.         CurSubF := '';
  833.       end else
  834.       if PSign in ['P', 'p'] then begin
  835.         TopicName := PSign + P1 + P2;
  836.         CurInt := '';
  837.         CurSubF := '';
  838.       end else begin
  839.         TopicName := Int + SubF + R + RV;
  840.         CurInt := Int;
  841.         CurSubF := SubF;
  842.       end;
  843.  
  844.     while TopicName [Length (TopicName)] in ['-', ' ', #9] do Dec (TopicName [0]);
  845.     if Length (TopicName) > 0 then
  846.       while TopicName [1] in ['-', ' ', #9] do Delete (TopicName, 1, 1)
  847.     else
  848.       TopicName := FileName;
  849.  
  850.     if not (Cat in ['!', '-']) then begin
  851.       TopicName := TopicName + Cat;
  852.       CurCat := Cat;
  853.     end else
  854.       CurCat := '';
  855.   end;
  856. end;
  857.  
  858. var
  859.   SectionStarted: Boolean;
  860.   SectionClosed: Boolean;
  861.   I, J: Integer;
  862.   Topic: PTopic;
  863.   ExtendedHeader: string;
  864.   OriginalTopicName: string;
  865.  
  866.   TblStarted: Boolean;
  867.   TblClosed: Boolean;
  868.   TblTopic: PTopic;
  869.   TblTopicName: string;
  870.  
  871.   PrevStr, SavePtr: PString;
  872.   AddNextStringToTopicAsATblRef: Boolean;
  873.  
  874. begin
  875.   Assign (FI, FileName);
  876.   {$I-}
  877.   Reset (FI);
  878.   if IOResult = 0 then begin
  879.     ProcessInterrup := True;
  880.     WriteLn ('processing ', FileName, '                                      ');
  881.  
  882.     TblStarted := False;
  883.     TblClosed := True;
  884.  
  885.     SectionStarted := False;
  886.     SectionClosed := True;
  887.  
  888.     AddNextStringToTopicAsATblRef := False;
  889.  
  890.     if FileIsATopic <> '' then begin
  891.       TopicName := FileIsATopic;
  892.       CurCat := '';
  893.       CurInt := '';
  894.       CurSubF := '';
  895.  
  896.       New (Topic, Init (1, 1));
  897.       SectionStarted := True;
  898.       SectionClosed := False;
  899.       TopicName := MakeCorrectTopicName (TopicName);
  900.       OriginalTopicName := TopicName;
  901.       ExtendedHeader := #2 + TopicName + #2;
  902.     end;
  903.  
  904.     while not EOF (FI) do begin
  905.       ReadLn (FI, Str);
  906.  
  907.       if  (Length (Str) > 0)
  908.       and (FileIsATopic = '')
  909.       and ((Str [1] = '-') and (Pos ('--------', Str) <> 0))
  910.       and (Str <> '--------------')
  911.       then begin
  912.         if not TblClosed then begin
  913.           TblTopic^.AddKeywordAtStart (OriginalTopicName);
  914.           TblTopic^.SetSubHeader (ExtendedHeader);
  915.           FO. IdxTbl. Insert (New (PIndexEntry, Init (
  916.             TblTopicName, 0, TblTopic)));
  917.           TblStarted := False;
  918.           TblClosed := True;
  919.         end;
  920.  
  921.         if not SectionClosed then begin
  922.           if Pos ('CMOS', StUpcase2 (FileName)) > 0 then begin
  923.             CMOS^.AddKeyword (OriginalTopicName, 0);
  924.             AddStr2Topic (ExtendedHeader,
  925.                           CMOS, CMOSName, CurInt, CurSubF, CurCat, True);
  926.           end else
  927.           if Pos ('FARCALL', StUpcase2 (FileName)) > 0 then begin
  928.             FarCall^.AddKeyword (OriginalTopicName, 0);
  929.             AddStr2Topic (ExtendedHeader,
  930.                           FarCall, FarCallName, CurInt, CurSubF, CurCat, True);
  931.           end else
  932.           if Pos ('MEMORY', StUpcase2 (FileName)) > 0 then begin
  933.             Memory^.AddKeyword (OriginalTopicName, 0);
  934.             AddStr2Topic (ExtendedHeader,
  935.                           Memory, MemoryName, CurInt, CurSubF, CurCat, True);
  936.           end else
  937.           if Pos ('MSR', StUpcase2 (FileName)) > 0 then begin
  938.             MSR^.AddKeyword (OriginalTopicName, 0);
  939.             AddStr2Topic (ExtendedHeader,
  940.                           MSR, MSRName, CurInt, CurSubF, CurCat, True);
  941.           end else
  942.           if Pos ('OPCODES', StUpcase2 (FileName)) > 0 then begin
  943.             OpCodes^.AddKeyword (OriginalTopicName, 0);
  944.             AddStr2Topic (ExtendedHeader,
  945.                           OpCodes, OpCodesName, CurInt, CurSubF, CurCat, True);
  946.           end else
  947.           if Pos ('PORTS', StUpcase2 (FileName)) > 0 then begin
  948.             Ports^.AddKeyword (OriginalTopicName, 0);
  949.             AddStr2Topic (ExtendedHeader,
  950.                           Ports, PortsName, CurInt, CurSubF, CurCat, True);
  951.           end else
  952.           if  (FileIsATopic = '')
  953.           and ((not (ExtendedHeader [2] in HexChars))
  954.             or (not (ExtendedHeader [3] in HexChars)))
  955.           then begin
  956.             IntList^.AddKeyword (OriginalTopicName, 0);
  957.             AddStr2Topic (ExtendedHeader,
  958.                           IntList, IntListName, CurInt, CurSubF, CurCat, True);
  959.           end;
  960.  
  961.           Topic^.SetHeader (NoLinks (ExtendedHeader));
  962.           FO. IdxTbl. Insert (New (PIndexEntry, Init (
  963.             TopicName, 0, Topic)));
  964.           SectionClosed := True;
  965.         end;
  966.  
  967.         ProcessHdr (Str);
  968.  
  969.         if (StUpcase2 (TopicName) <> 'SECTION') then begin
  970.           New (Topic, Init (1, 1));
  971.           SectionStarted := True;
  972.           SectionClosed := False;
  973.           TopicName := MakeCorrectTopicName (TopicName);
  974.           OriginalTopicName := TopicName;
  975.           ExtendedHeader := #2 + TopicName + #2;
  976.           Write (TopicName: 31, ' mem - ', MaxAvail: 8, #13);
  977.         end else
  978.           SectionStarted := False;
  979.       end else begin
  980.         if SectionStarted then begin
  981.           Tab2Spc (Str);
  982.  
  983.           StrUp := StUpcase2 (Str);
  984.  
  985.           if  (Copy (StrUp, 1, 4) = 'INT ')
  986.           and (StrUp [5] in HexChars) and (StrUp [6] in HexChars)
  987.           and (Pos ('INT', StUpcase2 (FileName)) > 0) then begin
  988.             I := (Pos (StrUp [5], HexCh) - 1)*16 + Pos (StrUp [6], HexCh) - 1;
  989.             IntLists [I]^.AddKeyword (OriginalTopicName, 0);
  990.             ExtendedHeader := #2 + TopicName + #2
  991.                             + Copy (Str, 7, Length (Str) - 6);
  992.             AddStr2Topic (ExtendedHeader,
  993.                           IntLists [I], string (Pointer(@IntNames [I])^), CurInt, CurSubF, CurCat, True);
  994.           end;
  995.  
  996.           if  (Copy (StrUp, 1, 5) = 'CMOS ')
  997.           and (StrUp [6] in HexChars) and (StrUp [7] in HexChars)
  998.           and (StrUp [8] = 'H') then begin
  999.             if  (StrUp [9] = '-')
  1000.             and (StrUp [10] in HexChars) and (StrUp [11] in HexChars)
  1001.             and (StrUp [12] = 'H') then
  1002.               ExtendedHeader := Copy (Str, 13, Length (Str) - 12)
  1003.             else
  1004.               ExtendedHeader := Copy (Str, 9, Length (Str) - 8);
  1005.  
  1006.             ExtendedHeader := #2 + TopicName + #2 + ExtendedHeader;
  1007.           end;
  1008.  
  1009.           if  (Copy (StrUp, 1, 5) = 'CALL ')
  1010.           and (StrUp [6] in HexChars + ['X']) and (StrUp [7] in HexChars + ['X'])
  1011.           and (StrUp [8] in HexChars + ['X']) and (StrUp [9] in HexChars + ['X'])
  1012.           and (StrUp [10] = 'H')
  1013.           and (StrUp [11] = ':')
  1014.           and (StrUp [12] in HexChars + ['X']) and (StrUp [13] in HexChars + ['X'])
  1015.           and (StrUp [14] in HexChars + ['X']) and (StrUp [15] in HexChars + ['X'])
  1016.           and (StrUp [16] = 'H')
  1017.           then begin
  1018.             ExtendedHeader := #2 + TopicName + #2
  1019.                             + Copy (Str, 17, Length (Str) - 16);
  1020.           end;
  1021.  
  1022.           if  (Copy (StrUp, 1, 4) = 'MEM ')
  1023.           and (StrUp [5] in HexChars + ['X']) and (StrUp [6] in HexChars + ['X'])
  1024.           and (StrUp [7] in HexChars + ['X']) and (StrUp [8] in HexChars + ['X'])
  1025.           then
  1026.             if  (StrUp [9] = 'H')
  1027.             and (StrUp [10] = ':')
  1028.             and (StrUp [11] in HexChars + ['X']) and (StrUp [12] in HexChars + ['X'])
  1029.             and (StrUp [13] in HexChars + ['X']) and (StrUp [14] in HexChars + ['X'])
  1030.             and (StrUp [15] = 'H')
  1031.             then
  1032.               ExtendedHeader := #2 + TopicName + #2
  1033.                               + Copy (Str, 16, Length (Str) - 15)
  1034.             else
  1035.             if  (StrUp  [9] in HexChars + ['X']) and (StrUp [10] in HexChars + ['X'])
  1036.             and (StrUp [11] in HexChars + ['X']) and (StrUp [12] in HexChars + ['X'])
  1037.             and (StrUp [13] = 'H')
  1038.             then
  1039.               ExtendedHeader := #2 + TopicName + #2
  1040.                               + Copy (Str, 14, Length (Str) - 13);
  1041.  
  1042.           if  (Copy (StrUp, 1, 4) = 'MSR ')
  1043.           and (StrUp [5] in HexChars + ['X']) and (StrUp [6] in HexChars + ['X'])
  1044.           and (StrUp [7] in HexChars + ['X']) and (StrUp [8] in HexChars + ['X'])
  1045.           and (StrUp [9] in HexChars + ['X']) and (StrUp [10] in HexChars + ['X'])
  1046.           and (StrUp [11] in HexChars + ['X']) and (StrUp [12] in HexChars + ['X'])
  1047.           and (StrUp [13] = 'H')
  1048.           then begin
  1049.             ExtendedHeader := #2 + TopicName + #2
  1050.                             + Copy (Str, 14, Length (Str) - 13);
  1051.           end;
  1052.  
  1053.           if (Copy (StrUp, 1, 7) = 'OPCODE ')
  1054.           then begin
  1055.             for I := 8 to Length (StrUp) do
  1056.               if StrUp [I] = ' ' then Break;
  1057.             if  (I > 8)
  1058.             and (Pos (Copy (StrUp, 8, I - 8), StUpcase2 (TopicName)) > 0) then
  1059.               ExtendedHeader := #2 + TopicName + #2
  1060.                               + Copy (Str, I, Length (Str) - I + 1);
  1061.           end;
  1062.  
  1063.           if  (Copy (StrUp, 1, 5) = 'PORT ')
  1064.           and (StrUp [6] in HexChars) and (StrUp [7] in HexChars)
  1065.           and (StrUp [8] in HexChars) and (StrUp [9] in HexChars)
  1066.           then begin
  1067.             if  (StrUp [10] = '-')
  1068.             and (StrUp [11] in HexChars + ['?']) and (StrUp [12] in HexChars + ['?'])
  1069.             and (StrUp [13] in HexChars + ['?']) and (StrUp [14] in HexChars + ['?', 'x', ' '])
  1070.             then
  1071.               ExtendedHeader := Copy (Str, 15, Length (Str) - 14)
  1072.             else
  1073.               ExtendedHeader := Copy (Str, 10, Length (Str) - 9);
  1074.  
  1075.             ExtendedHeader := #2 + TopicName + #2 + ExtendedHeader;
  1076.           end;
  1077.  
  1078.           if  (ExtendedHeader = #2 + TopicName + #2)
  1079.           and (Str <> '') then
  1080.             ExtendedHeader := #2 + TopicName + #2' ' + Str;
  1081.  
  1082.           if KeyNames. Count > 0 then
  1083.             for I := 0 to KeyNames. Count - 1 do begin
  1084.               J := Pos (StUpcase2 (PString (KeyNames. At (I))^), StrUp);
  1085.               if  (J > 0)
  1086.               and ((PTopic (KeyLists. At (I))^. Count = 0)
  1087.                 or (PString (PTopic (KeyLists. At (I))^. At (
  1088.                     PTopic (KeyLists. At (I))^. Count - 1))^
  1089.                  <> ' ' + ExtendedHeader))
  1090.               then begin
  1091.                 PTopic (KeyLists. Items^ [I])^.AddKeyword (OriginalTopicName, 0);
  1092.                 AddStr2Topic (ExtendedHeader,
  1093.                               PTopic (KeyLists. Items^ [I]),
  1094.                               PString (KeyNames. At (I))^, CurInt, CurSubF, CurCat, True);
  1095.               end;
  1096.             end;
  1097.  
  1098.           I := Pos ('TABLE', StrUp);
  1099.           if  (I > 0) and (I + 9 <= Length (Str))
  1100.           and (Str [I + 6] in ['0'..'9', 'C', 'F', 'M', 'R', 'P'])
  1101.           and (Str [I + 7] in ['0'..'9'])
  1102.           and (Str [I + 8] in ['0'..'9'])
  1103.           and (Str [I + 9] in ['0'..'9'])
  1104.           then begin
  1105.             if not TblClosed then begin
  1106.               PrevStr := TblTopic^.At (TblTopic^.Count - 1);
  1107.               if (PrevStr <> nil) and (PrevStr^ <> '') and (PrevStr^ <> ' ') then begin
  1108.                 TblTopic^. AtDelete (TblTopic^.Count - 1);
  1109.                 if PrevStr <> nil then begin
  1110.                   J := Pos (#2, PrevStr^);
  1111.                   while J > 0 do begin
  1112.                     SavePtr := PrevStr;
  1113.                     PrevStr := NewStr (Copy (PrevStr^, 1, J - 1)
  1114.                                + Copy (PrevStr^, J + 1, Length (PrevStr^) - J));
  1115.                     DisposeStr (SavePtr);
  1116.                     J := Pos (#2, PrevStr^);
  1117.                     if J = 0 then
  1118.                       WriteLn ('error 5');
  1119.                     SavePtr := PrevStr;
  1120.                     PrevStr := NewStr (Copy (PrevStr^, 1, J - 1)
  1121.                                + Copy (PrevStr^, J + 1, Length (PrevStr^) - J));
  1122.                     DisposeStr (SavePtr);
  1123.                     TblTopic^. Keywords. AtFree (TblTopic^. Keywords. Count - 1);
  1124.                     J := Pos (#2, PrevStr^);
  1125.                   end;
  1126.                 end;
  1127.               end else
  1128.                 PrevStr := nil;
  1129.  
  1130.               TblTopic^.AddKeywordAtStart (OriginalTopicName);
  1131.               TblTopic^.SetSubHeader (ExtendedHeader);
  1132.               FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1133.                 TblTopicName, 0, TblTopic)));
  1134.               TblStarted := False;
  1135.               TblClosed := True;
  1136.             end else begin
  1137.               PrevStr := Topic^.At (Topic^.Count - 1);
  1138.               if (PrevStr <> nil) and (PrevStr^ <> '') and (PrevStr^ <> ' ') then begin
  1139.                 Topic^. AtDelete (Topic^.Count - 1);
  1140.                 if PrevStr <> nil then begin
  1141.                   J := Pos (#2, PrevStr^);
  1142.                   while J > 0 do begin
  1143.                     SavePtr := PrevStr;
  1144.                     PrevStr := NewStr (Copy (PrevStr^, 1, J - 1)
  1145.                                + Copy (PrevStr^, J + 1, Length (PrevStr^) - J));
  1146.                     DisposeStr (SavePtr);
  1147.                     J := Pos (#2, PrevStr^);
  1148.                     if J = 0 then
  1149.                       WriteLn ('error 5');
  1150.                     SavePtr := PrevStr;
  1151.                     PrevStr := NewStr (Copy (PrevStr^, 1, J - 1)
  1152.                                + Copy (PrevStr^, J + 1, Length (PrevStr^) - J));
  1153.                     DisposeStr (SavePtr);
  1154.                     Topic^. Keywords. AtFree (Topic^. Keywords. Count - 1);
  1155.                     J := Pos (#2, PrevStr^);
  1156.                   end;
  1157.                 end;
  1158.               end else
  1159.                 PrevStr := nil;
  1160.             end;
  1161.  
  1162.             New (TblTopic, Init (1, 1));
  1163.             TblStarted := True;
  1164.             TblClosed := False;
  1165.             TblTopicName := MakeCorrectTopicName ('#' + Copy (Str, I + 6, 4));
  1166.  
  1167.             if (PrevStr <> nil) and (PrevStr^ <> '') and (PrevStr^ <> ' ')
  1168.             then begin
  1169.               if Pos (#2, PrevStr^) > 0 then begin
  1170.                 WriteLn (PrevStr^);
  1171.                 WriteLn ('error 4');
  1172.               end;
  1173.               AddStr2Topic (PrevStr^, TblTopic, TblTopicName, CurInt, CurSubF, CurCat, False);
  1174.  
  1175.               AddStr2Topic (TblTopicName + PrevStr^, Topic, TopicName, CurInt, CurSubF, CurCat, True);
  1176.               TblTopic^.SetHeader (PrevStr^);
  1177.               Tables^.AddKeyword (TopicName, 0);
  1178.               AddStr2Topic (TblTopicName + ' '#2 + TopicName + #2
  1179.                           + PrevStr^, Tables, TablesName, CurInt, CurSubF, CurCat, True);
  1180.             end else
  1181.               AddNextStringToTopicAsATblRef := True;
  1182.             DisposeStr (PrevStr);
  1183.  
  1184.             AddStr2Topic (Str, TblTopic, TblTopicName, CurInt, CurSubF, CurCat, False);
  1185.           end else begin
  1186.             if TblStarted then begin
  1187.               if AddNextStringToTopicAsATblRef then begin
  1188.                 AddStr2Topic (TblTopicName + ' ' + Str, Topic, TopicName, CurInt, CurSubF, CurCat, True);
  1189.                 TblTopic^.SetHeader (Str);
  1190.                 Tables^.AddKeyword (TopicName, 0);
  1191.                 AddStr2Topic (TblTopicName + ' '#2 + TopicName + #2
  1192.                             + ' ' + Str, Tables, TablesName, CurInt, CurSubF, CurCat, True);
  1193.                 AddNextStringToTopicAsATblRef := False;
  1194.               end;
  1195.  
  1196.               AddStr2Topic (Str, TblTopic, TblTopicName, CurInt, CurSubF, CurCat, False);
  1197.             end;
  1198.           end;
  1199.  
  1200.           if not TblStarted then
  1201.             AddStr2Topic (Str, Topic, TopicName, CurInt, CurSubF, CurCat, True);
  1202.         end;
  1203.       end;
  1204.     end;
  1205.  
  1206.     if not TblClosed then begin
  1207.       TblTopic^.AddKeywordAtStart (OriginalTopicName);
  1208.       TblTopic^.SetSubHeader (ExtendedHeader);
  1209.       FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1210.         TblTopicName, 0, TblTopic)));
  1211.       TblStarted := False;
  1212.       TblClosed := True;
  1213.     end;
  1214.  
  1215.     if not SectionClosed then begin
  1216.       if Pos ('CMOS', StUpcase2 (FileName)) > 0 then begin
  1217.         CMOS^.AddKeyword (OriginalTopicName, 0);
  1218.         AddStr2Topic (ExtendedHeader,
  1219.                       CMOS, CMOSName, CurInt, CurSubF, CurCat, True);
  1220.       end else
  1221.       if Pos ('FARCALL', StUpcase2 (FileName)) > 0 then begin
  1222.         FarCall^.AddKeyword (OriginalTopicName, 0);
  1223.         AddStr2Topic (ExtendedHeader,
  1224.                       FarCall, FarCallName, CurInt, CurSubF, CurCat, True);
  1225.       end else
  1226.       if Pos ('MEMORY', StUpcase2 (FileName)) > 0 then begin
  1227.         Memory^.AddKeyword (OriginalTopicName, 0);
  1228.         AddStr2Topic (ExtendedHeader,
  1229.                       Memory, MemoryName, CurInt, CurSubF, CurCat, True);
  1230.       end else
  1231.       if Pos ('MSR', StUpcase2 (FileName)) > 0 then begin
  1232.         MSR^.AddKeyword (OriginalTopicName, 0);
  1233.         AddStr2Topic (ExtendedHeader,
  1234.                       MSR, MSRName, CurInt, CurSubF, CurCat, True);
  1235.       end else
  1236.       if Pos ('OPCODES', StUpcase2 (FileName)) > 0 then begin
  1237.         OpCodes^.AddKeyword (OriginalTopicName, 0);
  1238.         AddStr2Topic (ExtendedHeader,
  1239.                       OpCodes, OpCodesName, CurInt, CurSubF, CurCat, True);
  1240.       end else
  1241.       if Pos ('PORTS', StUpcase2 (FileName)) > 0 then begin
  1242.         Ports^.AddKeyword (OriginalTopicName, 0);
  1243.         AddStr2Topic (ExtendedHeader,
  1244.                       Ports, PortsName, CurInt, CurSubF, CurCat, True);
  1245.       end else
  1246.       if  (FileIsATopic = '')
  1247.       and ((not (ExtendedHeader [2] in HexChars))
  1248.         or (not (ExtendedHeader [3] in HexChars)))
  1249.       then begin
  1250.         IntList^.AddKeyword (OriginalTopicName, 0);
  1251.         AddStr2Topic (ExtendedHeader,
  1252.                       IntList, IntListName, CurInt, CurSubF, CurCat, True);
  1253.       end;
  1254.  
  1255.       Topic^.SetHeader (NoLinks (ExtendedHeader));
  1256.       FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1257.         TopicName, 0, Topic)));
  1258.       SectionClosed := True;
  1259.     end;
  1260.  
  1261.     Close (FI);
  1262.   end else
  1263.     ProcessInterrup := False;
  1264. end;
  1265.  
  1266. var
  1267.   Param: string;
  1268.   C: Char;
  1269.   T: PTopic;
  1270.   I: Integer;
  1271.  
  1272.   KeyFile: Text;
  1273.   KeyStr: string;
  1274.  
  1275.   BoldFile: Text;
  1276.   BoldStr: string;
  1277.  
  1278.   SwapFileSize: Longint;
  1279.  
  1280.   F: file;
  1281.  
  1282. begin
  1283.   WriteLn;
  1284.   WriteLn ('=== Int2RTF Interrupt List Compiler v1.2 Copyright (C) 1996 Slava Gostrenko ===');
  1285.   WriteLn;
  1286.  
  1287.   for I := 1 to ParamCount do begin
  1288.     Param := StUpcase2 (ParamStr (I));
  1289.     if Param [1] in ['/', '\', '-'] then
  1290.       if Param [2] in ['?', 'H'] then begin
  1291.         WriteLn ('Converts Ralf Brown''s Interrupt List into Rich Text Format (.RTF)');
  1292.         WriteLn ('to compile it further into windows help file (.HLP) with HC31.EXE.');
  1293.         WriteLn;
  1294.         WriteLn ('Usage: Int2RTF <enter>');
  1295.         Exit;
  1296.       end;
  1297.   end;
  1298.  
  1299.   SwapFileSize := Longint (6144)*1024 - MemAvail;
  1300.   if SwapFileSize > 0 then
  1301.     SwapFileSize := SwapFileSize and (-1024)
  1302.   else
  1303.     SwapFileSize := 0;
  1304.   if SwapFileSize > 0 then begin
  1305.     MemInitSwapFile ('int2rtf.swp', SwapFileSize);
  1306.     WriteLn ('swap file size - ', SwapFileSize);
  1307.   end;
  1308.  
  1309.   New (SwapFile, Init ('topics.swp', stCreate, 2048));
  1310.  
  1311.   Hdrs. Init (256, 256);
  1312.  
  1313.   FO. Init ('intwin.rtf', stCreate, 32768);
  1314.   Assign (IncompPattern, 'incomplt.log');
  1315.   Rewrite (IncompPattern);
  1316.  
  1317.   New (T, Init (16, 16));
  1318.   T^. AddString ('Visit the home page of Slava Gostrenko at http://sunny.aha.ru/~gw/');
  1319.   T^. AddString (' ');
  1320.   T^. AddString ('There  you  may check for the latest versions of Int2RTF and other software.');
  1321.   T^. AddString ('You  can  register  on my page to get automatic notifications when Interrupt');
  1322.   T^. AddString ('List or Int2RTF is updated.');
  1323.   T^. AddString (' ');
  1324.   T^. AddString ('=== ARVID AUDIO ===');
  1325.   T^. AddString (' ');
  1326.   T^. AddString ('is a CD quality digital audio tape recorder made of Sound Blaster sound card');
  1327.   T^. AddString ('and  Arvid  streamer  board.  Arvid is a PC board priced at as little as $60');
  1328.   T^. AddString ('that  makes  a  streamer  of your home video tape recorder. It is capable of');
  1329.   T^. AddString ('storing  2  GigaBytes of data on a single tape. With the help of Arvid Audio');
  1330.   T^. AddString ('software you may record 3 hours of digital audio sound on a regular 180 min.');
  1331.   T^. AddString ('videotape.  Arvid  Audio  records from all audio sources available on(via) a');
  1332.   T^. AddString ('Sound Blaster sound card, e.i. CD player, Microphone, Line In. And now it is');
  1333.   T^. AddString ('capable  of  Direct  Digital Recording From CD! Download it now and you will');
  1334.   T^. AddString ('get 3 hours of 44.1 kHz 16 bit stereo sound on a $2 videotape! Visit my home');
  1335.   T^. AddString ('page for more info and references.');
  1336.   T^. AddString (' ');
  1337.   T^. AddString ('=== ARVID DRAW ===');
  1338.   T^. AddString (' ');
  1339.   T^. AddString ('copies a text file to the TV screen via Arvid. Requires Arvid 1031.');
  1340.   T^. AddString (' ');
  1341.   T^. AddString ('=== CD2WAV ===');
  1342.   T^. AddString (' ');
  1343.   T^. AddString ('is  a  CD-DA  (Digital  Audio)  grabber  with  an advanced jitter correction');
  1344.   T^. AddString ('algorithm.');
  1345.   T^. AddString (' ');
  1346.   T^. AddString ('=== CD2SB ===');
  1347.   T^. AddString (' ');
  1348.   T^. AddString ('is  a  CD-DA (Digital Audio) player that plays CDs via your sound card''s DAC');
  1349.   T^. AddString ('(Digital-to-Analog  Converter)  rather  then  CD-ROM drive''s DAC. So you can');
  1350.   T^. AddString ('compare the quality of the DACs. Requires Sound Blaster SB16.');
  1351.   T^. AddString (' ');
  1352.   T^. AddString ('=== INT2TPH ===');
  1353.   T^. AddString (' ');
  1354.   T^. AddString ('is  a  program  that converts Ralf Brown''s Interrupt List into Borland Turbo');
  1355.   T^. AddString ('Help File (.TPH file format) to use it with Turbo Help TSR or within Borland');
  1356.   T^. AddString ('(Turbo)  Pascal  IDE. Int2TPH uses hypertext features of the Interrupt List.');
  1357.   T^. AddString ('It  is  the  first  (and the only) Interrupt List compiler that makes a real');
  1358.   T^. AddString ('hypertext  of  the  Interrupt  List.  It is made possible due to an advanced');
  1359.   T^. AddString ('pattern  processing  technique  used  in  the  compiler. Not only it creates');
  1360.   T^. AddString ('comprehensive  indexes  for  all  the  topics in the list but it also allows');
  1361.   T^. AddString ('users to add their own indexes to the help file. Int2TPH is distributed with');
  1362.   T^. AddString ('source texts!');
  1363.   T^. AddString (' ');
  1364.   T^. AddString ('=== BORLAND PASCAL AUTO CORRECTOR ===');
  1365.   T^. AddString (' ');
  1366.   T^. AddString ('is  a  program  that  makes  it much easier to edit your programs in Borland');
  1367.   T^. AddString ('Pascal''s  IDE. Using expandable dictionary BP Auto Corrector beautifies your');
  1368.   T^. AddString ('sources  on  the fly. Type "tmysuperobject" and look at the screen. You will');
  1369.   T^. AddString ('see "TMySuperObject". And you do not have to press shift keys to type such a');
  1370.   T^. AddString ('nice  identifiers.  AutoSave  feature  will unglue your hands from <F2> key.');
  1371.   T^. AddString ('VideoSubst  feature  will enable Borland Pascal''s IDE to work in video modes');
  1372.   T^. AddString ('others  than 80x25 and 80x50. Now you may set up your BP to work in any text');
  1373.   T^. AddString ('video  mode  that  is  supported  by your video card. You may use VESA video');
  1374.   T^. AddString ('modes  too  and enjoy modes with the resolution up to 132x60! Auto Corrector');
  1375.   T^. AddString ('includes  patches  for BP to make a real full screen editor with no menu and');
  1376.   T^. AddString ('status  lines. It means 2 more lines will be used for displaying your source');
  1377.   T^. AddString ('texts.');
  1378.   T^. AddString (' ');
  1379.   T^. AddString ('=== TICKTOSS ===');
  1380.   T^. AddString (' ');
  1381.   T^. AddString ('is a fileechoprocessor for end-user fidonet systems. TickToss is just a .bat');
  1382.   T^. AddString ('file.  No  .exe''s  or  .com''s.  But it has all the features an end-user ever');
  1383.   T^. AddString ('needs. Automatic creation of new fileechoes with meaningful directory names.');
  1384.   T^. AddString ('Creating  and  updating of area configuration file. Creating and updating of');
  1385.   T^. AddString ('files.bbs''s  in  your  fileecho  areas.  Support  for  long  multilined file');
  1386.   T^. AddString ('descriptions. Logging of performed actions. And all the abovelisted features');
  1387.   T^. AddString ('are implemented as a single .bat file. TickToss requires 4dos or compaitable');
  1388.   T^. AddString ('command processor.');
  1389.   T^. AddString (' ');
  1390.   T^. AddString ('=== VOXEL EARTH ===');
  1391.   T^. AddString (' ');
  1392.   T^. AddString ('It  is  a  demo  of my new real-time voxel 3D engine. Download it and have a');
  1393.   T^. AddString ('virtual  flight over the virtual (but quite realistic) landscape. Pentium or');
  1394.   T^. AddString ('better CPU is recommended.');
  1395.   T^. AddString (' ');
  1396.   T^. AddString ('=== And MORE... ===');
  1397.   T^. AddString (' ');
  1398.   T^. AddString ('Visit my homepage NOW! ;-)');
  1399.   T^. AddString (' ');
  1400.   FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1401.       'http://sunny.aha.ru/~gw/', 0, T)));
  1402.  
  1403.   for I := Low (IntLists) to High (IntLists) do begin
  1404.     New (IntLists [I], Init (16, 16));
  1405.     IntNames [I] := MakeCorrectTopicName ('INT ' + HexByte (I));
  1406.   end;
  1407.  
  1408.   New (IntListIndex, Init (16, 16));
  1409.   IntListIndexName := MakeCorrectTopicName (' INTERRUPT LIST INDEX ');
  1410.  
  1411.   Assign (Interrup1st, 'interrup.1st');
  1412.   {$I-}
  1413.   Reset (Interrup1st);
  1414.   {$I+}
  1415.   if IOResult = 0 then begin
  1416.     if not EOF (Interrup1st) then begin
  1417.       ReadLn (Interrup1st, CopyrightStr);
  1418.       Tab2Spc (CopyrightStr);
  1419.       while Pos ('       ', CopyrightStr) > 0 do
  1420.         Delete (CopyrightStr, Pos ('       ', CopyrightStr), 1);
  1421.       if CopyrightStr <> '' then
  1422.         IntListIndex^. SetHeader (CopyrightStr);
  1423.  
  1424.       if not EOF (Interrup1st) then begin
  1425.         ReadLn (Interrup1st, CopyrightStr);
  1426.         Tab2Spc (CopyrightStr);
  1427.         if CopyrightStr <> '' then
  1428.           IntListIndex^. SetSubHeader (CopyrightStr);
  1429.       end;
  1430.     end;
  1431.  
  1432.     Close (Interrup1st);
  1433.   end;
  1434.  
  1435.   IntListIndex^.AddString (' ===    This help file was compiled with    ===');
  1436.   IntListIndex^.AddString (' === Int2RTF v1.2 (C) 1996 Slava Gostrenko. ===');
  1437.   IntListIndex^.AddKeyword ('http://sunny.aha.ru/~gw/', 0);
  1438.   IntListIndex^.AddString (' === '#2'http://sunny.aha.ru/~gw/'#2' or gw@aha.ru, ===');
  1439.   IntListIndex^.AddString (' === FidoNet 2:5020/201.105,2:5020/468.105. ===');
  1440.   IntListIndex^.AddString (' ');
  1441.   IntListIndex^.AddKeyword ('TITLES', 0);
  1442.   IntListIndex^.AddString (' '#2'Interrupts'#2);
  1443.  
  1444.   KeyLists. Init (1, 1);
  1445.   KeyNames. Init (1, 1);
  1446.   Assign (KeyFile, 'int_keys.txt');
  1447.   {$I-}
  1448.   Reset (KeyFile);
  1449.   {$I+}
  1450.   if IOResult = 0 then begin
  1451.     while not EOF (KeyFile) do begin
  1452.       ReadLn (KeyFile, KeyStr);
  1453.       if KeyStr <> '' then begin
  1454.         KeyLists. AtInsert (KeyLists. Count, New (PTopic, Init (1, 1)));
  1455.         KeyStr := MakeCorrectTopicName (KeyStr);
  1456.         KeyNames. AtInsert (KeyNames. Count, NewStr (KeyStr));
  1457.  
  1458.         IntListIndex^.AddKeyword (KeyStr, 0);
  1459.         IntListIndex^.AddString (' '#2 + KeyStr + #2);
  1460.       end;
  1461.     end;
  1462.  
  1463.     Close (KeyFile);
  1464.   end;
  1465.  
  1466.   BoldNames. Init (1, 1);
  1467.   Assign (BoldFile, 'int_bold.txt');
  1468.   {$I-}
  1469.   Reset (BoldFile);
  1470.   {$I+}
  1471.   if IOResult = 0 then begin
  1472.     while not EOF (BoldFile) do begin
  1473.       ReadLn (BoldFile, BoldStr);
  1474.       if BoldStr <> '' then
  1475.         BoldNames. AtInsert (BoldNames. Count, NewStr (BoldStr));
  1476.     end;
  1477.  
  1478.     Close (BoldFile);
  1479.   end;
  1480.  
  1481.   New (IntList, Init (16, 16));
  1482.   IntListName := MakeCorrectTopicName ('Interrupt List Misc. Stuff');
  1483.   IntListIndex^.AddKeyword (IntListName, 0);
  1484.   IntListIndex^.AddString (' '#2 + IntListName + #2);
  1485.  
  1486.   New (Tables, Init (16, 16));
  1487.   TablesName := MakeCorrectTopicName ('Tables');
  1488.   IntListIndex^.AddKeyword (TablesName, 0);
  1489.   IntListIndex^.AddString (' '#2 + TablesName + #2);
  1490.  
  1491.   New (CMOS, Init (16, 16));
  1492.   CMOSName := MakeCorrectTopicName ('CMOS');
  1493.   IntListIndex^.AddKeyword (CMOSName, 0);
  1494.   IntListIndex^.AddString (' '#2 + CMOSName + #2);
  1495.  
  1496.   New (FarCall, Init (16, 16));
  1497.   FarCallName := MakeCorrectTopicName ('Far Calls');
  1498.   IntListIndex^.AddKeyword (FarCallName, 0);
  1499.   IntListIndex^.AddString (' '#2 + FarCallName + #2);
  1500.  
  1501.   New (Memory, Init (16, 16));
  1502.   MemoryName := MakeCorrectTopicName ('Memory');
  1503.   IntListIndex^.AddKeyword (MemoryName, 0);
  1504.   IntListIndex^.AddString (' '#2 + MemoryName + #2);
  1505.  
  1506.   New (MSR, Init (16, 16));
  1507.   MSRName := MakeCorrectTopicName ('Model-Specific Registers');
  1508.   IntListIndex^.AddKeyword (MSRName, 0);
  1509.   IntListIndex^.AddString (' '#2 + MSRName + #2);
  1510.  
  1511.   New (OpCodes, Init (16, 16));
  1512.   OpCodesName := MakeCorrectTopicName ('Opcodes List');
  1513.   IntListIndex^.AddKeyword (OpCodesName, 0);
  1514.   IntListIndex^.AddString (' '#2 + OpCodesName + #2);
  1515.  
  1516.   New (Ports, Init (16, 16));
  1517.   PortSName := MakeCorrectTopicName ('Ports');
  1518.   IntListIndex^.AddKeyword (PortsName, 0);
  1519.   IntListIndex^.AddString (' '#2 + PortsName + #2);
  1520.  
  1521.   ProcessInterrup ('interrup.1st', '');
  1522.   ProcessInterrup ('category.key', '');
  1523.   ProcessInterrup ('86bugs.lst', '86 Bugs');
  1524.   IntListIndex^.AddKeyword ('86 Bugs', 0);
  1525.   IntListIndex^.AddString (' '#2'86 Bugs'#2);
  1526.   ProcessInterrup ('biblio.lst', '');
  1527.   ProcessInterrup ('cmos.lst', '');
  1528.   ProcessInterrup ('farcall.lst', '');
  1529.   ProcessInterrup ('glossary.lst', 'Glossary of The Interrupt List');
  1530.   IntListIndex^.AddKeyword ('Glossary of The Interrupt List', 0);
  1531.   IntListIndex^.AddString (' '#2'Glossary of The Interrupt List'#2);
  1532.   ProcessInterrup ('memory.lst', '');
  1533.   ProcessInterrup ('msr.lst', '');
  1534.   ProcessInterrup ('opcodes.lst', '');
  1535.   ProcessInterrup ('overview.lst', '');
  1536.   ProcessInterrup ('ports.lst', '');
  1537.   ProcessInterrup ('tables.lst', '');
  1538.   ProcessInterrup ('interrup.pri', 'Interrupt Primer');
  1539.   IntListIndex^.AddKeyword ('Interrupt Primer', 0);
  1540.   IntListIndex^.AddString (' '#2'Interrupt Primer'#2);
  1541.   ProcessInterrup ('rbrown.txt', 'Ralf Brown');
  1542.   IntListIndex^.AddKeyword ('Ralf Brown', 0);
  1543.   IntListIndex^.AddString (' '#2'Ralf Brown'#2);
  1544.  
  1545.   if not ProcessInterrup ('interrup.lst', '') then
  1546.     for C := 'a' to 'z' do
  1547.       if not ProcessInterrup ('interrup.' + C, '') then
  1548.         Break;
  1549.  
  1550.   FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1551.     PortsName, 0, Ports)));
  1552.  
  1553.   FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1554.     MemoryName, 0, Memory)));
  1555.  
  1556.   FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1557.     MSRName, 0, MSR)));
  1558.  
  1559.   FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1560.     OpCodesName, 0, OpCodes)));
  1561.  
  1562.   FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1563.     FarCallName, 0, FarCall)));
  1564.  
  1565.   FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1566.     CMOSName, 0, CMOS)));
  1567.  
  1568.   FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1569.     TablesName, 0, Tables)));
  1570.  
  1571.   FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1572.     IntListName, 0, IntList)));
  1573.  
  1574.   if KeyLists. Count > 0 then
  1575.     for I := 0 to KeyLists. Count - 1 do
  1576.       FO. IDXTbl. Insert (New (PIndexEntry, Init (
  1577.         PString (KeyNames. At (I))^, 0, PTopic (KeyLists. Items^ [I]))));
  1578.  
  1579.   FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1580.     IntListIndexName, 0, IntListIndex)));
  1581.  
  1582.   for I := Low (IntLists) to High (IntLists) do
  1583.     FO. IdxTbl. Insert (New (PIndexEntry, Init (
  1584.       IntNames [I], 0, IntLists [I])));
  1585.  
  1586.   Close (IncompPattern);
  1587.   FO. Done;
  1588.  
  1589.   WriteLn (Hdrs. Count, ' topics processed.');
  1590.   Hdrs. Done;
  1591.  
  1592.   SwapFile^.Seek (0);
  1593.   SwapFile^.Truncate;
  1594.   Dispose (SwapFile, Done);
  1595.   Assign (F, 'topics.swp');
  1596.   Erase (F);
  1597.  
  1598.   if SwapFileSize > 0 then
  1599.     MemCloseSwapFile (1);
  1600. end.
  1601.