home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* LZ.PAS *)
- (* Residentes Linienzeichenprogramm *)
- (* (c) 1993 Martin Wölker & DMV-Verlag *)
- (* ------------------------------------------------------ *)
- PROGRAM Linien_zeichnen;
- {$F-,R-,S-,I-,V-,B-,N-,D-,G+} (* Keine Tests; 286 an *)
- {$M 1024,0,0} (* minimaler Speicher *)
-
- USES Crt, Dos;
-
- CONST
- Kennung = $0202; { Versionsnummer als Kennung }
- Datum = '04-28-1993';
- Zeile : STRING [20] = 'DOS toolbox 3/1993';
- { wird auch als Zwischenspeicher genutzt }
-
- SoftKey : WORD = $7100;
- Tasten_String : STRING [9] = '<ALT-F10>';
-
- { Position der "Aktiv"-Anzeige: diese Position kann }
- xOut : BYTE = 72; { Spalte beim Start der TSR }
- yOut : BYTE = 1; { Zeile frei bestimmt werden }
-
- { Mit größeren Pufferlängen kann man natürlich auch andere }
- { Funktionen realisieren }
- Maxlen = 4; { maximale Länge des Ausgabepuffers }
-
- { Modusschalter für den Betriebszustand des Programms }
- LZ_on_off : BYTE = 0; { 0 --> Wartestellung }
- { Sleep-Modus }
- { 1 --> Zeichnen }
- { KBD-Modus }
- { 2 --> Ausgabe erzeugen }
- { OUT-Modus }
-
- { Tastaturcodes (ermittelt mit Scancode) mit 2 Funktionen }
- right =$4D00; left =$4b00; { 1.: Auslesen der }
- up =$4800; Down =$5000; { Tastatur }
- sright=$4D36; Sleft=$4B34; { 2.: Versorgung des }
- sup =$4838; Sdown=$5032; { aktuellen Programms }
- ins =$5200; del =$5300; { mit Steuerzeichen }
-
- { Schalter für den internen Betriebszustand des Programms }
- insert_on: { TRUE: Das Programm erzeugt zu jedem Zei- }
- BOOLEAN= { chen ein Del um das automatische }
- TRUE; { Einfügen des Editors auszugleichen. }
- { FALSE: Stattdessen wird eine Nulleingabe }
- { erzeugt }
-
- TYPE
- typen = (s,d,p,n); { vier definierte Linientypen }
- { │ │ │ └──── unterbrochen }
- { │ │ └────── gepunktet }
- { │ └──────── doppelliniert }
- { └────────── einfachliniert }
- { │ <── Defaulteinstellung Einfachlinie }
- CONST
- LZ_Typ : typen = s; { aktueller Linientyp }
- typ_char : ARRAY[typen] OF CHAR { Umschaltzeichen }
- = ('s' ,'d' ,'p' ,'u' );
- LZ_typ_char : ARRAY[typen] OF CHAR { Anzeigezeichen }
- = ('─' ,'═' ,'∙' ,'|' );
- LZ_typ_color: ARRAY[typen] OF BYTE { Anzeigefarbe }
- = (red ,green ,cyan ,magenta);
- dummy_signs : ARRAY[1..2,typen] OF CHAR = { Dummies für }
- (('─','═','∙','-'), { Tastatur- }
- ('│','║',':','|')); { simulation }
-
- { Tabellen zur Interpretation des Bildschirms }
- TYPE
- allowed_signs = STRING[13]; { Alle Zeichen, die in der }
- { jeweiligen Richtung als benachbarte Zeichen erlaubt sind.}
- CONST
- singleleft : allowed_signs = '┌┬├┼└┴─╓╥╟╫╙╨';
- singleright: allowed_signs = '┬┐┼┤┴┘─╥╖╫╢╨╜';
- singleup : allowed_signs = '┌┬┐├┼┤│╒╤╕╞╪╡';
- singledown : allowed_signs = '├┼┤└┴┘│╞╪╡╘╧╛';
- doubleleft : allowed_signs = '╔╦╠╬╚╩═╒╤╞╪╘╧';
- doubleright: allowed_signs = '╦╗╬╣╩╝═╤╕╪╡╧╛';
- doubleup : allowed_signs = '╔╦╗╠╬╣║╓╥╖╟╫╢';
- doubledown : allowed_signs = '╠╬╣╚╩╝║╟╫╢╙╨╜';
- pointhor : CHAR = '∙';
- pointver : CHAR = ':';
- dashedhor : CHAR = '-';
- dashedver : CHAR = '|';
-
- TYPE
- Tablechars = ARRAY[1..3,1..3] OF CHAR;
- tablecodes = ARRAY[1..3,1..3] OF WORD;
- CONST
- allframe : ARRAY[1..9] OF tablechars =
- ( { Zuerst für gerade Linien }
- ('───','∙∙∙','═══'), { jeweils 3 Zeichen }
- ('│││',':::','║║║'), { rechts/links/re&li }
- ('---','|||','???'), { oben/unten/ob&unten }
- { Alle Kombinationen aus Vertikal/Horizontal }
- ('┌┬┐', { }
- '├┼┤', { V:einfach }
- '└┴┘'), { H:einfach }
- ('╔╦╗', { }
- '╠╬╣', { V:Doppelt }
- '╚╩╝'), { H:Doppelt }
- ('╓╥╖', { }
- '╟╫╢', { V:Doppelt }
- '╙╨╜'), { H:Einfach }
- ('╒╤╕', { }
- '╞╪╡', { V:Einfach }
- '╘╧╛'), { H:Doppelt }
- ('∙:∙', { }
- ':::', { V:Gepunktet }
- '∙:∙'), { H:Gepunktet }
- ('┌┬┐', { }
- '|||', { V:gestrichelt }
- '└┴┘')); { H:gestrichelt }
-
- { Lo(code) Hi(code) }
- {┌─────────────────┴─────────────────┐ ┌───────┴───────┐ }
- {│ │ │ │ }
- { 16 32 32 16 16 32 }
- { 1 ┼ 4 2 ╬ 8 1 ╫ 4 2 ╪ 8 1 : 4 2 | 8 }
- { 64 128 128 64 64 128 }
-
- codes:ARRAY[1..9] OF tablecodes= ( { Umsetztabelle }
- (( 4, 5, 1),( 256, 1280, 1024), { }
- ( 8, 10, 2)), { Nach der Be- }
- (( 64, 80, 16),( 4096,20480,16384), { stimmung des }
- ( 128, 160, 32)), { Codes, wird }
- (( 512, 2560, 2048),( 8192,40960,32768), { dieser hier }
- ( 0, 0, 0)), { gesucht. }
- (( 68, 69, 65),( 84, 85, 81), { Mit dem Index }
- ( 20, 21, 17)), { i,j,k wird }
- (( 136, 138, 130),( 168, 170, 162), { das richtige }
- ( 40, 42, 34)), { Zeichen aus }
- (( 132, 133, 129),( 164, 165, 161), { der Tabelle }
- ( 36, 37, 33)), { allframe s.o. }
- (( 72, 74, 66),( 88, 90, 82), { entnommen. }
- ( 24, 26, 18)), { Danach wird }
- ((17408,17664,16640),(21504,21760,20736), { Schreibpuffer }
- ( 5120, 5376, 4352)), { gefüllt. }
- ((34816,35328,33280),(43008,43520,41472), { }
- (10240,10752, 8704)) );
-
- TYPE
- TScreen = ARRAY[1..25,1..80] OF WORD;
-
- VAR
- SCR_Segment : ^TScreen;
-
- int16save:POINTER; { INT $16 beim Installieren der TSR }
-
- LZBuffer:ARRAY[1..maxlen] OF WORD; { Ausgabepuffer }
- bufpos, { aktuelle Position }
- buflength:BYTE; { wirkliche Länge }
-
- { Variablen mit dem Code aus der Zeichenumgebung }
- code:WORD; { Die Codevariable }
- acode:ARRAY[1..2] OF BYTE { Damit kann man dem Lo- und }
- ABSOLUTE code; { Hi-Byte einfach Werte zuweisen }
-
- r,l,u,o:CHAR; { die Textzeichen }
- { in der Umgebung der aktuellen Cursorposition }
- i,j,k:byte; { indices für die }
- { Suche des richtigen Zeichens bei Bewegungen }
- x,y:byte;
- Regs:REGISTERS;
-
- (**********************************************************)
- (* Hilfsroutinen hier: Steuerung *)
- (**********************************************************)
-
- FUNCTION KeyFromOldInt16 :WORD;
- INLINE ($31/$C0/$9C/$FF/$1E/Int16Save);
-
- PROCEDURE ExitOldInt16;
- INLINE ($A1/Int16Save+2/$87/$46/$10/$8B/$1E/Int16Save/
- $87/$5E/$0E/$5D/$07/$1F/$5F/$5E/$5A/$59/$CB);
-
- (**********************************************************)
- (* Hilfsroutinen hier: Schreibroutinen *)
- (**********************************************************)
-
- PROCEDURE Write_LZ;
- {*** Schreibt eine Status-Anzeige an die Position x,y ***}
- BEGIN
- TextColor(black); { Textfarbe }
- TextBackground(LZ_typ_color[lz_typ]); { Hintergrund }
- x:=WhereX; { Cursorpos }
- y:=WhereY; { retten }
- GotoXY(xout,yout); { Ausgabepos }
- Write('LZ:',LZ_typ_char[lz_typ]); { "LZ" zeigen }
- IF insert_on THEN { TSR im ───┐ }
- Write(' ins') { insertmod │ }
- ELSE { oder │ }
- Write(' '); { überschr.─┘ }
- GotoXY(x,y); { alte Pos }
- NormVideo; { alte Farben }
- END;
-
- PROCEDURE Write_buffer_to_kbd;
- {*** Schreibt das nächste Zeichen in den Tastaturpuffer ***}
- BEGIN
- IF bufpos=buflength THEN BEGIN { Puffer leer dann }
- LZ_on_off:=1; { zurückschalten in Tastatursteuerung }
- EXIT;
- END;
- INC(bufpos);
- regs.Ah:=5; regs.cx:=LZBuffer[bufpos]; Intr($16,Regs);
- END;
-
-
- PROCEDURE Write_false_key;
- {*** Fehlermeldung, bei unzulässigen Tastatureingaben ***}
- BEGIN Sound(200); Delay(20); NoSound; END;
-
-
- (**********************************************************)
- (* Hauptteil Suchen, Puffer füllen, Tastaturinterrupt *)
- (**********************************************************)
-
- PROCEDURE Suche_zeichen(Cursor_move:WORD);
- {╔════════════════════════════════════════════════════════╗}
- {║ Suchroutine: Setzt die Zeichen in der Umgebung des ║}
- {║ Cursors und Cursor_move in ein Code-Wort ║}
- {║ um, das wiederum den Index für das kor- ║}
- {║ rekte Linienelement bestimmt. ║}
- {╚════════════════════════════════════════════════════════╝}
- BEGIN
- { Alte Umgebung löschen ──┐ }
- l:=' '; { │ }
- r:=' '; { │ }
- o:=' '; { │ }
- u:=' '; { ──────────┘ }
-
- { Lesen der Zeichen in der Umgebung der Cursorposition ──┐ }
- x:=WhereX; y:=WhereY; { Cursorpos │ }
- IF x>1 THEN { │ }
- l:=CHAR(Lo(scr_segment^[y,Pred(x)])); { links │ }
- IF x<80 THEN { │ }
- r:=CHAR(Lo(scr_segment^[y,Succ(x)])); { rechts │ }
- IF y>1 THEN { │ }
- o:=CHAR(Lo(scr_segment^[Pred(y),x])); { oben │ }
- IF y<25 THEN { │ }
- u:=CHAR(Lo(scr_segment^[Succ(y),x])); { unten │ }
- CASE cursor_move { Cursor- │ }
- OF { moves ──┐│ }
- right : r:=dummy_signs[1,LZ_typ]; { RECHTS ││ }
- left : l:=dummy_signs[1,LZ_typ]; { LINKS ││ }
- up : o:=dummy_signs[2,LZ_typ]; { OBEN ││ }
- down : u:=dummy_signs[2,LZ_typ]; { UNTEN ││ }
- END; {case} { simulieren│ }
- { ──────────┘ }
-
- { analysieren der Zeichen ──┐ }
- { pointleft doubledown │ }
- { dashedleft │ │ singledown │ }
- { pointright │ │ │ │ doubleup │ }
- { dashedright │ │ │ │ │ │ singleup │ }
- { pointup │ │ │ │ │ │ │ │ doubleright │ }
- { dashedup │ │ │ │ │ │ │ │ │ │ singleright │ }
- { pointdown │ │ │ │ │ │ │ │ │ │ │ │ doubleleft │ }
- { dasheddown │ │ │ │ │ │ │ │ │ │ │ │ │ │ singleleft│ }
- { │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ }
- { Bits in Code 10 F D E C B A 9 8 7 6 5 4 3 2 1 │ }
- { │ }
- code:=0; { löschen │ }
- IF (lz_typ=s) OR (LZ_typ=d) THEN BEGIN { s oder d ┐│ }
- IF pos(l,singleleft)>0 THEN { LO(code) ││ }
- INC(acode[1],1); { setzen │ ││ }
- IF pos(l,doubleleft)>0 THEN { │ ││ }
- INC(acode[1],2); { │ ││ }
- IF pos(r,singleright)>0 THEN { │ ││ }
- INC(acode[1],4); { │ ││ }
- IF pos(r,doubleright)>0 THEN { │ ││ }
- INC(acode[1],8); { │ ││ }
- IF pos(o,singleup)>0 THEN { │ ││ }
- INC(acode[1],16); { │ ││ }
- IF pos(o,doubleup)>0 THEN { │ ││ }
- INC(acode[1],32); { │ ││ }
- IF pos(u,singledown)>0 THEN { │ ││ }
- INC(acode[1],64); { │ ││ }
- IF pos(u,doubledown)>0 THEN { │ ││ }
- INC(acode[1],128); { ───────┘ ││ }
- END { ─────────┘│ }
- ELSE { sonst │ }
- IF LZ_typ=p THEN BEGIN { points ──┐│ }
- IF l = pointhor THEN { HI(code) ││ }
- INC(acode[2],1); { setzen ││ }
- IF r = pointhor THEN { ││ }
- INC(acode[2],4); { ││ }
- IF o = pointver THEN { ││ }
- INC(acode[2],16); { ││ }
- IF u = pointver THEN { ││ }
- INC(acode[2],64); { ││ }
- END { ─────────┘│ }
- ELSE { sonst │ }
- IF LZ_typ=n THEN BEGIN { dashed ──┐│ }
- IF pos(l,dashedhor+singleleft)>0 THEN { HI(code) ││ }
- INC(acode[2],2); { setzen │ ││ }
- IF pos(r,dashedhor+singleright)>0 THEN { │ ││ }
- INC(acode[2],8); { │ ││ }
- IF pos(o,dashedver+singleup)>0 THEN { │ ││ }
- INC(acode[2],32); { │ ││ }
- IF pos(u,dashedver +singledown)>0 THEN { │ ││ }
- INC(acode[2],128); { ───────┘ ││ }
- END; { ─────────┴┘ }
- { Hier kann man den Inhalt von Code ansehen }
- { GotoXY(1,1); { │ }
- { FOR i:=15 DOWNTO 0 DO { │ }
- { write(code AND (1 SHL i) SHR i); { │ }
- { ──────────┘ }
-
- { gegenüberliegende einfach/doppelt Wiedersprüche ──┐ }
- IF { verboten ┐│ }
- (code AND $0009=$0009) OR { sl«»dr ││ }
- (code AND $0006=$0006) { dl«»sr ││ }
- THEN BEGIN { ─────────┘│ }
- code:= code AND $F0F0; { löschen │ }
- IF LZ_typ=s THEN { setzen ──┐│ }
- INC(code,5) { einfach ││ }
- ELSE IF LZ_typ=d THEN { ││ }
- INC(code,10); { doppelt ││ }
- END; { ─────────┘│ }
- IF { verboten ┐│ }
- (code AND $0090=$0090) OR { su«»dd ││ }
- (code AND $0060=$0060) { du«»sd ││ }
- THEN BEGIN { ─────────┘│ }
- code:= code AND $0F0F; { löschen │ }
- IF LZ_typ=s THEN { setzen───┐│ }
- INC(code,80) { einfach ││ }
- ELSE IF LZ_typ=d THEN { ││ }
- INC(code,160); { doppelt ││ }
- END; { ─────────┴┘ }
-
- { ermitteln des Zeichens ──┐ }
- For i:= 1 to 9 do { INC(i,j,k)│ }
- For j:=1 to 3 do { und ver- │ }
- For k:=1 to 3 do { lassen, │ }
- if code=codes[i,j,k] then { wenn │ }
- EXIT; { gefunden │ }
- END;
-
- PROCEDURE Fill_buffer(Cursor_move:WORD);
- {╔════════════════════════════════════════════════════════╗}
- {║ Puffer mit den richtigen Zeichen füllen. ║}
- {╚════════════════════════════════════════════════════════╝}
- BEGIN
- buflength:=1;
- Bufpos:=1;
- { Steuertasten mit Shift nur einfach weitergeben ─┐ }
- CASE cursor_move OF { │ }
- sleft : LZBuffer[1]:=left; { │ }
- sright : LZBuffer[1]:=right; { │ }
- sup : LZBuffer[1]:=up; { │ }
- sdown : LZBuffer[1]:=down; { │ }
- ELSE BEGIN { Linienelement berechnen ──┐ }
- Suche_Zeichen(cursor_move); {<<SUCHEN>> │ }
- buflength:=4; { │ }
- IF insert_on THEN { insertmode│ }
- LZBuffer[1]:=del { weg │ │ }
- ELSE { sonst ──┤ │ }
- LZBuffer[1]:=$00; { nix │ │ }
- { ────┘ │ }
- LZBuffer[2]:=$00+BYTE(allframe[i,j,k]);{ │ }
- LZBuffer[3]:=left; { │ }
- LZBuffer[4]:=cursor_move; { │ }
- END; { ──┘ }
- END {case}; { }
- LZ_on_off:=2; { Umschalten in den Ausgabemodus }
- END;
-
- procedure toggle_lz;
- {╔════════════════════════════════════════════════════════╗}
- {║ Schaltet die TSR an bzw aus. ║}
- {╚════════════════════════════════════════════════════════╝}
- BEGIN
- IF LZ_on_off=1 THEN BEGIN { TSR ist an ──┐ }
- Move(Zeile,scr_segment^[yout,xout],16);{Restaurieren │ }
- LZ_on_off:=0; { ausschalten │ }
- END { ─────┘ }
- ELSE BEGIN { TSR ist aus ─┐ }
- Move(scr_segment^[yout,xout],zeile,16);{Sichen │ }
- LZ_on_off:=1; { anschalten │ }
- write_LZ; { Marke │ }
- END; { ─────┘ }
- END;
-
- procedure lz_function(var ax:WORD);
- {╔════════════════════════════════════════════════════════╗}
- {║ Interpretation der Tastatureingaben ║}
- {║ 1. Cursorbewegungeninterpretieren ║}
- {║ 2. Linienzeichener steuern ║}
- {╚════════════════════════════════════════════════════════╝}
- BEGIN
- CASE AX OF { Welche Taste ? ───┐}
- right, { rechts ╔══════════════╗ │}
- left, { links ║ Bewegungen ║ │}
- up, { rauf ║interpretieren║ │}
- down, { runter ╚══════════════╝ │}
- sright, { shiftrechts ╔══════════════╗ │}
- sleft, { shiftlinks ║ Bewegungen ║ │}
- sup, { shiftrauf ║ weiterreichen║ │}
- sdown : BEGIN { shiftrunter ╚══════════════╝ │}
- Fill_buffer(ax); { Folge berechnen │}
- ax:=LZBuffer[1]; { 1.Zeichen sofort │}
- END; { zurückgeben │}
- ELSE { sonst ───┤}
- BEGIN { LZ steuern ───┐ │}
- IF (CHAR(Lo(ax))='s') { Eingabe "s" ─┐│ │}
- then LZ_typ:=s { Singeleline <┘│ │}
- ELSE IF (CHAR(Lo(ax))='d') { Eingabe "d" ─┐│ │}
- then LZ_TYP:=d { Doubleline <┘│ │}
- ELSE IF (CHAR(Lo(ax))='p') { Eingabe "p" ─┐│ │}
- then LZ_TYP:=p { Pointline <┘│ │}
- ELSE IF (CHAR(Lo(ax))='u') { Eingabe "u" ─┐│ │}
- then LZ_TYP:=n { Dashedline <┘│ │}
- ELSE IF ax=ins then { Eingabe "ins" ─┐│ │}
- insert_on:=NOT insert_on { <┘│ │}
- ELSE { sonst │ │}
- write_false_key; { Taste verboten │ │}
- ax:=$00; { Nix zurückgeben │ │}
- write_LZ; { Status ausgeben │ │}
- END;{elsecase} { ───┘ │}
- END; {case} { ───┘}
- END;
-
- PROCEDURE Int16_LZ
- (Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP :WORD);
- {╔════════════════════════════════════════════════════════╗}
- {║Neuer Tastaturinterrupt mit drei Funktionen: ║}
- {║ -1- Hotkeywächter ║}
- {║ -2- Linienzeichner ║}
- {║ -3- Installationscheck ║}
- {║ Diese Routine wartet auf den Hotkey, um den Linien- ║}
- {║ zeichner dann an- oder abzuschalten. ║}
- {║ Es löscht/Schreibt die Anzeige "LZ" ║}
- {║ Die Variable LZ_on_off steuert den Interrupt: ║}
- {║ 0: Linienzeichner Wartestellung ║}
- {║ 1: Interpreter aktiv ║}
- {║ 2: Puffer-Ausgabefunktion aktiv ║}
- {║ ║}
- {║ Eine neue Unterfunktion Hi(ax):=$F0 liefert in AX die ║}
- {║ Versionskennung und verhindert so Doppelinstallation. ║}
- {╚════════════════════════════════════════════════════════╝}
- INTERRUPT;
-
- BEGIN
- { Unterfunktionen: Das laufende Programm liest ein Zeichen }
- IF (Hi(AX)=$0) OR { Keyboard Read für alle PCs }
- (Hi(AX)=$A) { Extended Read PC-AT MF-2 }
- { muß für MS-DOS ab 4 abgefangen werden }
- THEN
- BEGIN
- AX := KeyFromOldInt16; { immer Tastencode holen }
- { Fallunterscheidung═══╗}
- IF AX = Softkey THEN BEGIN { Hotkey gefunden ║}
- Toggle_LZ; { Ein bzw. Ausschalten ║}
- ax:=$00; { nix zurückgeben ║}
- END { ║}
- ELSE BEGIN { sonst ═══╣}
- IF LZ_on_off=1 THEN { wenn LZ im KBD-Modus ║}
- LZ_function(ax); { Taste interpretieren ║}
- IF LZ_on_off=2 then { Wenn LZ im Out-Modus ║}
- Write_buffer_to_kbd; { nächstes Zeichen ║}
- { in den Tastaturpuffer ║}
- END; { ende Tastenanalyse ══╝}
- END {IF-Readkeyboard}
- { Unterfunktionen: Zusatzfunktion zum Installationstest }
- ELSE IF (Hi(AX)=$f0) THEN
- ax:=kennung
- { alle restlichen Unterfunktionen }
- ELSE
- ExitOldInt16
- END;
-
- (**********************************************************)
- (* Installationsteil: Parameter interpretieren *)
- (* Adressen ermitteln *)
- (* Interruptvektoren sichern *)
- (* resident beenden *)
- (**********************************************************)
-
- PROCEDURE give_syntax;
- VAR d:TEXT;
- zeile:STRING[80];
- BEGIN
- Assign(d,'LZ.txt'); Reset(d);
- REPEAT
- ReadLn(d,zeile);
- UNTIL (Pos('≡',zeile)<>0);
- WHILE NOT Eof(d) DO BEGIN
- ReadLn(d,zeile);
- WriteLn(zeile);
- END;
- HALT;
- END;
-
- PROCEDURE give_logo;
- VAR d:TEXT;
- zeile:STRING[80];
- BEGIN
- Assign(d,'LZ.txt'); Reset(d);
- repeat
- ReadLn(d,zeile);
- WriteLn(zeile);
- until (Pos('¢',zeile)<>0);
- HALT;
- END;
-
- PROCEDURE paramcheck;
- VAR s:STRING[10];
- retcode:INTEGER;
- d:TEXT;
- zeile:STRING[80];
- BEGIN
- FOR i:=1 TO ParamCount DO BEGIN
- s:=ParamStr(i);
- zeile:='';
- IF (Pos('?',s)=1) OR (Pos('h',s)=1) OR (Pos('H',s)=1) THEN
- give_logo;
- IF Length(s)<3 THEN give_syntax;
- IF (Pos('c',s)=1) OR (Pos('C',s)=1) THEN BEGIN
- Assign(d,'LZ.txt'); Reset(d);
- REPEAT
- ReadLn(d,zeile);
- UNTIL (Pos('¢',zeile)<>0);
- WHILE (Pos('≡',zeile)=0) DO BEGIN
- WriteLn(zeile);
- ReadLn(d,zeile);
- END;
- HALT; END
- ELSE IF (Pos('x',s)=1) OR (Pos('X',s)=1)THEN BEGIN
- Move(s[3],s[1],Length(s)-2); s[0]:=CHAR(Length(s)-2);
- Val(s,x,retcode);
- IF retcode = 0 THEN
- xout:=x
- ELSE
- give_syntax
- END
- ELSE IF (Pos('y',s)=1) OR (Pos('Y',s)=1)THEN BEGIN
- Move(s[3],s[1],Length(s)-2); s[0]:=CHAR(Length(s)-2);
- Val(s,y,retcode);
- IF retcode = 0 THEN
- yout:=y
- ELSE
- give_syntax
- END
- ELSE IF (Pos('s',s)=1) OR (Pos('S',s)=1)THEN BEGIN
- Move(s[3],s[1],Length(s)-2); s[0]:=CHAR(Length(s)-2);
- tasten_string:=s; END
- ELSE IF (Pos('k',s)=1) OR (Pos('K',s)=1)THEN BEGIN
- Move(s[3],s[1],Length(s)-2); s[0]:=CHAR(Length(s)-2);
- Val(s,code,retcode);
- IF retcode = 0 THEN
- IF code>255 THEN
- softkey:=code
- ELSE
- softkey:=code SHL 8
- ELSE
- give_syntax;
- END
- ELSE
- give_syntax;
- END;
- END;
-
- PROCEDURE MakeResident;
- BEGIN
- IF Lo(LastMode) = 7 THEN SCR_Segment := Ptr($B000,$0000)
- ELSE SCR_Segment := Ptr($B800,$0000);
- GetIntVec ($16, int16save);
- SetIntVec ($16, @Int16_LZ);
- Keep (0);
- END;
-
- BEGIN
- IF ParamCount<>0 THEN
- paramcheck;
- regs.AH:=$f0; Intr($16,Regs); { schon installiert ? }
- IF regs.ax=kennung THEN
- give_logo;
- WriteLn(' LZ vom ',datum);
- WriteLn(' ',tasten_string,' startet/beendet die Routine');
- MakeResident; { Resident beenden }
- END.
- (* ------------------------------------------------------ *)
- (* Ende von LZ.PAS *)
-