home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1988 / 05 / t3_tsr / merker.inc < prev    next >
Encoding:
Text File  |  1988-02-24  |  7.9 KB  |  231 lines

  1. (* ------------------------------------------------------ *)
  2. (*                    MERKER.INC                          *)
  3.  
  4. VAR
  5.     DOS_Puffer: ARRAY [30..61] OF BYTE
  6.                 ABSOLUTE $0040:$001E;
  7.                                     (* DOS-Tastaturpuffer *)
  8.     Anfang : INTEGER ABSOLUTE $0040:$001A;
  9.                                     (* Anfang DOS-Puffer  *)
  10.     Ende   : INTEGER ABSOLUTE $0040:$001C;
  11.                                     (* Ende   DOS-Puffer  *)
  12.  
  13. PROCEDURE Schreibe( c:INTEGER);
  14. BEGIN
  15.   MOVE( c,DOS_Puffer[Ende],2);
  16.   Ende := Ende+2;
  17.   IF Ende=62 THEN Ende := 30;
  18. END;
  19.  
  20. PROCEDURE lese(VAR c:INTEGER);
  21. BEGIN
  22.   MOVE(DOS_Puffer[Anfang],c,2);
  23.   Anfang := Anfang + 2;
  24.   IF Anfang = 62 THEN Anfang := 30;
  25. END;
  26.  
  27. PROCEDURE tsrpgm;
  28. TYPE MerkerTyp = RECORD
  29.                    Zeile,Spalte : INTEGER;
  30.                    Aktiv        : BOOLEAN;
  31.                  END;
  32. CONST MerkerConst : STRING[49] = 'leer';
  33.       AnzZeichen  : INTEGER = 0;
  34.         (* Anzahl Zeichen, die noch in den Tastaturpuffer *)
  35.         (*  zu schreiben sind                             *)
  36.       Geschrieben : INTEGER = 0;
  37.         (* Anzahl Zeichen, die schon geschrieben wurden   *)
  38.  
  39. VAR Merker        : ARRAY['0'..'9'] OF MerkerTyp
  40.                                     ABSOLUTE MerkerConst;
  41.     ZeichenBuffer : ARRAY[1..128] OF INTEGER;
  42.     Ch            : CHAR;
  43.     Screen        : ARRAY[1..25,1..80] OF INTEGER
  44.                                        ABSOLUTE $b800:0000;
  45.                           (* Für Hercules-Karte anpassen !*)
  46.     GotoZeile,
  47.     AktZeile,
  48.     AktSpalte,
  49.     Taste,
  50.     ox,oy,i       : INTEGER;
  51.     Savezeile     : ARRAY[1..80,1..2] OF CHAR;
  52.     SaveWindow    : ARRAY[1..12,1..27] OF INTEGER;
  53.  
  54. PROCEDURE Speichern(c:INTEGER);
  55. BEGIN
  56.   IF AnzZeichen = 0 THEN Schreibe(TSR_Char);
  57.                            (* damit die Interrupt-Routine *)
  58.                            (* wieder aufgerufen wird      *)
  59.   AnzZeichen := SUCC(AnzZeichen);
  60.   ZeichenBuffer[AnzZeichen] := c;
  61. END;
  62.  
  63. BEGIN
  64.   IF AnzZeichen>0 THEN BEGIN    (* alle Cursortasten zum  *)
  65.                                 (* TURBO-EDITOR schicken  *)
  66.     Geschrieben := SUCC(Geschrieben);
  67.                                 (* immer nur eine Taste   *)
  68.                                 (* und Alt+M, damit die   *)
  69.                                 (* Routine wieder aufge-  *)
  70.                                 (* rufen wird.            *)
  71.     Schreibe(ZeichenBuffer[Geschrieben]);
  72.     IF Geschrieben = AnzZeichen THEN BEGIN
  73.       Geschrieben := 0;
  74.       AnzZeichen  := 0;
  75.     END
  76.     ELSE Schreibe(TSR_Char);
  77.       EXIT;
  78.     END;
  79.  
  80.     IF MerkerConst = 'leer' THEN BEGIN
  81.       FILLCHAR(Merker,50,0);     (* Erster Aufruf -> INIT *)
  82.       Merker['0'].Zeile := 1;
  83.       Merker['0'].Spalte := 1;
  84.       Merker['0'].Aktiv := TRUE;
  85.     END;
  86.  
  87.     MOVE (screen[1],Savezeile,160);
  88.     i := 12; AktZeile := 0;
  89.     WHILE SaveZeile[i,1] IN ['0'..'9'] DO BEGIN
  90.                       (* Zeile,Spalte vom Editor holen    *)
  91.                       (* 0,0 - falls Editor nicht geladen *)
  92.       AktZeile := AktZeile*10 + ORD(SaveZeile[i,1])
  93.                   - ORD('0');
  94.       i := SUCC(i);
  95.     END;
  96.     i := 21; AktSpalte := 0;
  97.     WHILE SaveZeile[i,1] IN ['0'..'9'] DO BEGIN
  98.         AktSpalte := AktSpalte*10 + ORD(SaveZeile[i,1])
  99.                      - ORD('0');
  100.         i := SUCC(i);
  101.     END;
  102.  
  103.     IF AktZeile OR AktSpalte = 0 THEN
  104.       IF KeyPressed THEN BEGIN             (* Reinstall ? *)
  105.         Lese(Taste);Schreibe(Taste);
  106.         IF Taste <> 0 THEN EXIT;
  107.       END
  108.     ELSE EXIT;
  109.  
  110.     ox := WhereX;oy := WhereY;
  111.     TextColor(0);TextBackground(15);
  112.     GOTOXY(1,1); Write('Merker ');clreol;
  113.     GOTOXY(25,1);
  114.     Write('I=Info S=Setzen D=Löschen Z=Zeile 0=alte Pos.',
  115.           '1..9=GOTO');
  116.     GOTOXY(8,1);
  117.     REPEAT UNTIL KeyPressed;
  118.     Lese(Taste);
  119.  
  120.     CASE Taste OF
  121.       Klein_s,Gross_S,Alt_S              (* Merker setzen *)
  122.        : BEGIN
  123.            Write(' setzen Nr.: ');
  124.            Read(kbd,ch);Write(Ch);
  125.            IF Ch in ['0'..'9'] THEN BEGIN
  126.              Merker[Ch].Zeile  := AktZeile;
  127.              Merker[Ch].Spalte := AktSpalte;
  128.              Merker[Ch].Aktiv  := TRUE;
  129.            END;
  130.          END;
  131.       Klein_d,Gross_D,Alt_D             (* Merker löschen *)
  132.        : BEGIN
  133.            Write(' löschen Nr.: ');
  134.            Read(kbd,ch);Write(Ch);
  135.            IF Ch in ['1'..'9'] THEN
  136.              Merker[Ch].Aktiv := FALSE;
  137.          END;
  138.       Klein_i,Gross_I,Alt_I             (* Merker info    *)
  139.        : BEGIN
  140.  
  141.            FOR i := 2 TO 13 DO
  142.                       MOVE(Screen[i,5],SaveWindow[i-1],54);
  143.            GOTOXY(5,2);Write('╔Merker Zeile   Sp. Atkiv╗');
  144.            FOR ch := '0' TO '9' DO BEGIN
  145.              GOTOXY(5,ORD(ch)-ORD('0')+3);
  146.              Write('║  '+ch,Merker[Ch].Zeile:
  147.                                    8,Merker[Ch].Spalte:7);
  148.              IF Merker[Ch].Aktiv THEN Write('JA':5,' ║')
  149.              ELSE Write('--':5,' ║');
  150.            END;
  151.            GOTOXY(5,13);Write('╚════════════════════════╝');
  152.            Read(kbd,ch);
  153.            FOR i := 2 TO 13 DO
  154.                       MOVE(SaveWindow[i-1],Screen[i,5],54);
  155.          END;
  156.     Null,Eins,Zwei,Drei,Vier,Fuenf,Sechs,Sieben,Acht,Neun,
  157.     Alt_Null,Alt_Eins,Alt_Zwei,Alt_Drei,Alt_Vier,
  158.     Alt_Fuenf,Alt_Sechs,Alt_Sieben,Alt_Acht,Alt_Neun
  159.        : BEGIN
  160.            Schreibe(Alt_Eins);
  161.                (* eine Taste, welche keine Aktion auslöst *)
  162.            Ch := CHR(LO(Taste));
  163.            IF NOT(Ch IN ['0'..'9']) THEN    (* Alt_Nummer *)
  164.              Ch := CHR(HI(Taste) - $47);
  165.            IF Ch = ':' THEN Ch := '0';
  166.            WITH Merker[Ch] DO BEGIN
  167.              IF Ch <> '0' THEN BEGIN
  168.                Merker['0'].Zeile  := AktZeile;
  169.                Merker['0'].Spalte := AktSpalte;
  170.              END;
  171.              IF NOT Aktiv THEN BEGIN
  172.                AktSpalte := Spalte;
  173.                AktZeile  := Zeile;
  174.              END;
  175.              WHILE AktZeile+22 < Zeile DO BEGIN
  176.                Speichern(PDN); AktZeile := AktZeile+23
  177.              END;
  178.              WHILE AktZeile-22 > Zeile DO BEGIN
  179.                Speichern(PUP); AktZeile := AktZeile-23
  180.              END;
  181.              WHILE AktZeile < Zeile DO BEGIN
  182.                Speichern(PFU); AktZeile := SUCC(AktZeile)
  183.              END;
  184.              WHILE AktZeile > Zeile DO BEGIN
  185.                Speichern(PFO); AktZeile := PRED(AktZeile)
  186.              END;
  187.              WHILE AktSpalte < Spalte DO BEGIN
  188.                Speichern(PFR); AktSpalte := SUCC(AktSpalte)
  189.              END;
  190.              WHILE AktSpalte > Spalte DO BEGIN
  191.                Speichern(PFL); AktSpalte := PRED(AktSpalte)
  192.              END;
  193.            END;
  194.          END;
  195.       Klein_z,Gross_Z,Alt_Z                 (* goto Zeile *)
  196.        : BEGIN
  197.            GotoXY(1,1); Write(' goto Zeile : ');ClrEol;
  198.            (*$I-*) Read(GotoZeile);
  199.            IF IOResult <> 0 THEN GotoZeile := AktZeile
  200.            ELSE BEGIN
  201.              Merker['0'].Zeile  := AktZeile;
  202.              Merker['0'].Spalte := AktSpalte;
  203.            END;
  204.            Schreibe(Alt_Eins);
  205.            WHILE AktZeile+22 < GotoZeile DO BEGIN
  206.              Speichern(PDN); AktZeile := AktZeile+23
  207.            END;
  208.            WHILE AktZeile-22 > GotoZeile DO BEGIN
  209.              Speichern(PUP); AktZeile := AktZeile-23
  210.            END;
  211.            WHILE AktZeile < GotoZeile DO BEGIN
  212.              Speichern(PFU); AktZeile := SUCC(AktZeile)
  213.            END;
  214.            WHILE AktZeile > GotoZeile DO BEGIN
  215.              Speichern(PFO); AktZeile := PRED(AktZeile)
  216.            END;
  217.          END;
  218.     0  : BEGIN
  219.            MOVE(Savezeile,screen[1],160);
  220.            GOTOXY(ox,oy);
  221.            reinstall;
  222.          END;
  223.   END;  { CASE }
  224.   Schreibe(Alt_Eins);
  225.   MOVE(Savezeile,screen[1],160);
  226.   GOTOXY(ox,oy);
  227. END;
  228.  
  229. (* ----------------------------------------------------- *)
  230. (*               Ende von MERKER.INC                     *)
  231.