home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* MERKER.INC *)
-
- VAR
- DOS_Puffer: ARRAY [30..61] OF BYTE
- ABSOLUTE $0040:$001E;
- (* DOS-Tastaturpuffer *)
- Anfang : INTEGER ABSOLUTE $0040:$001A;
- (* Anfang DOS-Puffer *)
- Ende : INTEGER ABSOLUTE $0040:$001C;
- (* Ende DOS-Puffer *)
-
- PROCEDURE Schreibe( c:INTEGER);
- BEGIN
- MOVE( c,DOS_Puffer[Ende],2);
- Ende := Ende+2;
- IF Ende=62 THEN Ende := 30;
- END;
-
- PROCEDURE lese(VAR c:INTEGER);
- BEGIN
- MOVE(DOS_Puffer[Anfang],c,2);
- Anfang := Anfang + 2;
- IF Anfang = 62 THEN Anfang := 30;
- END;
-
- PROCEDURE tsrpgm;
- TYPE MerkerTyp = RECORD
- Zeile,Spalte : INTEGER;
- Aktiv : BOOLEAN;
- END;
- CONST MerkerConst : STRING[49] = 'leer';
- AnzZeichen : INTEGER = 0;
- (* Anzahl Zeichen, die noch in den Tastaturpuffer *)
- (* zu schreiben sind *)
- Geschrieben : INTEGER = 0;
- (* Anzahl Zeichen, die schon geschrieben wurden *)
-
- VAR Merker : ARRAY['0'..'9'] OF MerkerTyp
- ABSOLUTE MerkerConst;
- ZeichenBuffer : ARRAY[1..128] OF INTEGER;
- Ch : CHAR;
- Screen : ARRAY[1..25,1..80] OF INTEGER
- ABSOLUTE $b800:0000;
- (* Für Hercules-Karte anpassen !*)
- GotoZeile,
- AktZeile,
- AktSpalte,
- Taste,
- ox,oy,i : INTEGER;
- Savezeile : ARRAY[1..80,1..2] OF CHAR;
- SaveWindow : ARRAY[1..12,1..27] OF INTEGER;
-
- PROCEDURE Speichern(c:INTEGER);
- BEGIN
- IF AnzZeichen = 0 THEN Schreibe(TSR_Char);
- (* damit die Interrupt-Routine *)
- (* wieder aufgerufen wird *)
- AnzZeichen := SUCC(AnzZeichen);
- ZeichenBuffer[AnzZeichen] := c;
- END;
-
- BEGIN
- IF AnzZeichen>0 THEN BEGIN (* alle Cursortasten zum *)
- (* TURBO-EDITOR schicken *)
- Geschrieben := SUCC(Geschrieben);
- (* immer nur eine Taste *)
- (* und Alt+M, damit die *)
- (* Routine wieder aufge- *)
- (* rufen wird. *)
- Schreibe(ZeichenBuffer[Geschrieben]);
- IF Geschrieben = AnzZeichen THEN BEGIN
- Geschrieben := 0;
- AnzZeichen := 0;
- END
- ELSE Schreibe(TSR_Char);
- EXIT;
- END;
-
- IF MerkerConst = 'leer' THEN BEGIN
- FILLCHAR(Merker,50,0); (* Erster Aufruf -> INIT *)
- Merker['0'].Zeile := 1;
- Merker['0'].Spalte := 1;
- Merker['0'].Aktiv := TRUE;
- END;
-
- MOVE (screen[1],Savezeile,160);
- i := 12; AktZeile := 0;
- WHILE SaveZeile[i,1] IN ['0'..'9'] DO BEGIN
- (* Zeile,Spalte vom Editor holen *)
- (* 0,0 - falls Editor nicht geladen *)
- AktZeile := AktZeile*10 + ORD(SaveZeile[i,1])
- - ORD('0');
- i := SUCC(i);
- END;
- i := 21; AktSpalte := 0;
- WHILE SaveZeile[i,1] IN ['0'..'9'] DO BEGIN
- AktSpalte := AktSpalte*10 + ORD(SaveZeile[i,1])
- - ORD('0');
- i := SUCC(i);
- END;
-
- IF AktZeile OR AktSpalte = 0 THEN
- IF KeyPressed THEN BEGIN (* Reinstall ? *)
- Lese(Taste);Schreibe(Taste);
- IF Taste <> 0 THEN EXIT;
- END
- ELSE EXIT;
-
- ox := WhereX;oy := WhereY;
- TextColor(0);TextBackground(15);
- GOTOXY(1,1); Write('Merker ');clreol;
- GOTOXY(25,1);
- Write('I=Info S=Setzen D=Löschen Z=Zeile 0=alte Pos.',
- '1..9=GOTO');
- GOTOXY(8,1);
- REPEAT UNTIL KeyPressed;
- Lese(Taste);
-
- CASE Taste OF
- Klein_s,Gross_S,Alt_S (* Merker setzen *)
- : BEGIN
- Write(' setzen Nr.: ');
- Read(kbd,ch);Write(Ch);
- IF Ch in ['0'..'9'] THEN BEGIN
- Merker[Ch].Zeile := AktZeile;
- Merker[Ch].Spalte := AktSpalte;
- Merker[Ch].Aktiv := TRUE;
- END;
- END;
- Klein_d,Gross_D,Alt_D (* Merker löschen *)
- : BEGIN
- Write(' löschen Nr.: ');
- Read(kbd,ch);Write(Ch);
- IF Ch in ['1'..'9'] THEN
- Merker[Ch].Aktiv := FALSE;
- END;
- Klein_i,Gross_I,Alt_I (* Merker info *)
- : BEGIN
-
- FOR i := 2 TO 13 DO
- MOVE(Screen[i,5],SaveWindow[i-1],54);
- GOTOXY(5,2);Write('╔Merker Zeile Sp. Atkiv╗');
- FOR ch := '0' TO '9' DO BEGIN
- GOTOXY(5,ORD(ch)-ORD('0')+3);
- Write('║ '+ch,Merker[Ch].Zeile:
- 8,Merker[Ch].Spalte:7);
- IF Merker[Ch].Aktiv THEN Write('JA':5,' ║')
- ELSE Write('--':5,' ║');
- END;
- GOTOXY(5,13);Write('╚════════════════════════╝');
- Read(kbd,ch);
- FOR i := 2 TO 13 DO
- MOVE(SaveWindow[i-1],Screen[i,5],54);
- END;
- Null,Eins,Zwei,Drei,Vier,Fuenf,Sechs,Sieben,Acht,Neun,
- Alt_Null,Alt_Eins,Alt_Zwei,Alt_Drei,Alt_Vier,
- Alt_Fuenf,Alt_Sechs,Alt_Sieben,Alt_Acht,Alt_Neun
- : BEGIN
- Schreibe(Alt_Eins);
- (* eine Taste, welche keine Aktion auslöst *)
- Ch := CHR(LO(Taste));
- IF NOT(Ch IN ['0'..'9']) THEN (* Alt_Nummer *)
- Ch := CHR(HI(Taste) - $47);
- IF Ch = ':' THEN Ch := '0';
- WITH Merker[Ch] DO BEGIN
- IF Ch <> '0' THEN BEGIN
- Merker['0'].Zeile := AktZeile;
- Merker['0'].Spalte := AktSpalte;
- END;
- IF NOT Aktiv THEN BEGIN
- AktSpalte := Spalte;
- AktZeile := Zeile;
- END;
- WHILE AktZeile+22 < Zeile DO BEGIN
- Speichern(PDN); AktZeile := AktZeile+23
- END;
- WHILE AktZeile-22 > Zeile DO BEGIN
- Speichern(PUP); AktZeile := AktZeile-23
- END;
- WHILE AktZeile < Zeile DO BEGIN
- Speichern(PFU); AktZeile := SUCC(AktZeile)
- END;
- WHILE AktZeile > Zeile DO BEGIN
- Speichern(PFO); AktZeile := PRED(AktZeile)
- END;
- WHILE AktSpalte < Spalte DO BEGIN
- Speichern(PFR); AktSpalte := SUCC(AktSpalte)
- END;
- WHILE AktSpalte > Spalte DO BEGIN
- Speichern(PFL); AktSpalte := PRED(AktSpalte)
- END;
- END;
- END;
- Klein_z,Gross_Z,Alt_Z (* goto Zeile *)
- : BEGIN
- GotoXY(1,1); Write(' goto Zeile : ');ClrEol;
- (*$I-*) Read(GotoZeile);
- IF IOResult <> 0 THEN GotoZeile := AktZeile
- ELSE BEGIN
- Merker['0'].Zeile := AktZeile;
- Merker['0'].Spalte := AktSpalte;
- END;
- Schreibe(Alt_Eins);
- WHILE AktZeile+22 < GotoZeile DO BEGIN
- Speichern(PDN); AktZeile := AktZeile+23
- END;
- WHILE AktZeile-22 > GotoZeile DO BEGIN
- Speichern(PUP); AktZeile := AktZeile-23
- END;
- WHILE AktZeile < GotoZeile DO BEGIN
- Speichern(PFU); AktZeile := SUCC(AktZeile)
- END;
- WHILE AktZeile > GotoZeile DO BEGIN
- Speichern(PFO); AktZeile := PRED(AktZeile)
- END;
- END;
- 0 : BEGIN
- MOVE(Savezeile,screen[1],160);
- GOTOXY(ox,oy);
- reinstall;
- END;
- END; { CASE }
- Schreibe(Alt_Eins);
- MOVE(Savezeile,screen[1],160);
- GOTOXY(ox,oy);
- END;
-
- (* ----------------------------------------------------- *)
- (* Ende von MERKER.INC *)