TIPS und TRICKS mit Turbo-Pascal (c) 1991 by H.-J. Schloáarek Mit den EGA/VGA Grafikkarten hat man die M”glichkeit mehr Textzeilen auf dem Bildschirm darzustellen als die blichen 25 Zeilen. Wie das im einzelnen geschieht kann man in keinem Handbuch zum Computer nachlesen. Der nachfolgende Text bringt die L”sung des Problems. Das umschalten auf die entsprechende Darstellungsweise der Zeichen bernehmen verschiedene Interruptroutinen des Betriebssystems. Diese Routinen k”nnen mit Turbo-Pascal problemlos aufgerufen werden. Es drfte aber kein Problem darstellen diese Routinen auch mit anderen Programmier- sprachen zu nutzen. Das Programm textmodi nutzt diese Interruptroutinen in Turbo- Pascal. Folgende Routinen werden gebraucht: 1. 8x8 Zeichensatz aufrufen (EGA/VGA). Wird dieser Zeichensatz geladen und aktiviert, kann die EGA-Karte 43 Zeilen und VGA-Karte 50 Zeilen darstellen. Dazu wird der Interrupt 10 hex mit der Funktion 11 hex und der Unterfunktion 12 hex des EGA/VGA Bios genutzt. Registereingabe: AH = 11 hex, AL = 12 hex und BL = Nr. der Zeichentabelle (0 oder 1). Siehe Procedure TEXT_8x8 im Programm Textmodi. 2. 8x14 Zeichensatz aufrufen (EGA/VGA). Dieser Zeichensatz wird beim Starten des Computers mit EGA- karte aktiviert (25 Zeilen). Bei der VGA-Karte sind 28 Zeilen darstellbar. Registereingabe: AH = 11 hex, AL = 11 hex und BL = Nr. der Zeichentabelle (0 oder 1). Siehe Procedure TEXT_8x14 im Programm Textmodi. 3. 8x16 Zeichensatz aufrufen (VGA). Dieser Zeichensatz wird beim Starten des Computers mit VGA- karte aktiviert (25 Zeilen). Registereingabe: AH = 11 hex, AL = 11 hex und BL = Nr. der Zeichentabelle (0 oder 1). Siehe Procedure TEXT_8x14 im Programm Textmodi. Wie ein Programm aussehen kann das diese Interruptroutinen nutzt, sehen Sie anhand des Programmes TEXTMODI. Das Programm wird folgendermaáen aufgrufen: Textmodi 8x8 oder Textmodi 8x14 usw. Es folgen einige Erkl„rungen zum Programm. Die betreffenden Stellen sind im Quellcode mit Buchstaben gekennzeichnet. {-- A --} Ist eine VGA-Karte vorhanden dann ist OK_VGA = TRUE (1); Ist eine EGA-Karte vorhanden dann wird OK_EGA auf TRUE gesetzt. Regs dient zur Aufnahme der Registerwerte (AH,AL usw.). Der Typ Registers ist in der Unit DOS definiert. {-- B --} Es folgen die einzelnen Proceduren zur Festlegung der Textzeilen, dazu werden die Register mit den Werten belegt und der Interrupt 10 hex aufgerufen. Die Procedure CURSOR_SETZEN ist zust„ndig um den blinkenden Cursor dem entsprechenden Textmodi anzupassen. {-- C --} Die Procedur EGA_UMSCHALTEN ist fr die EGA-Karte zust„ndig und VGA-UMSCHALTEN fr die VGA-Karte. {-- D --} Mit diesen Proceduren wird festgestellt ob eine EGA- oder VGA-Karte installiert ist. {-- E --} Sollte ein falscher Programmaufruf erfolgen wird diese Procedur aufgerufen und der Text wird angezeigt. {-- F --} Es folgt das eigentliche Hauptprogramm, als erstes werden die Variablen OK_EGA und OK_VGA auf False gesetzt. Nun wird abgefragt ob der Aufruf mit der richtigen Parameteranzahl gestartet wurde, wenn nicht wird die Procedur Hilfe aufgerufen. Stimmt die Parameterangabe wird getestet ob eine Ega- oder Vga-Karte vorhanden ist. Ist keine der beiden Karten vorhanden wird eine Meldung ausgegeben und das Programm wird abgebrochen. Ist eine der beiden Karten vorhanden wird die entsprechende Umschaltprocedur aufgerufen. PROGRAM TEXTMODI; { (c) 1991 BY HANS-JšRGEN SCHLOáAREK } USES DOS,CRT; {-- A --} VAR OK_EGA,OK_VGA:BOOLEAN; REGS:REGISTERS; {-- B --} PROCEDURE TEXT_8X8; { EGA=43 ZEILEN, VGA=50 ZEILEN } BEGIN REGS.AH:=$11; REGS.AL:=$12; REGS.BL:=$0; INTR($10,REGS); END; PROCEDURE TEXT_8X14; { EGA=25 ZEILEN, VGA=28 ZEILEN } BEGIN REGS.AH:=$11; REGS.AL:=$11; REGS.BL:=$0; INTR($10,REGS); END; PROCEDURE TEXT_8X16; { NUR VGA=25 ZEILEN } BEGIN REGS.AH:=$11; REGS.AL:=$14; REGS.BL:=$0; INTR($10,REGS); END; PROCEDURE CURSOR_SETZEN(A,E:BYTE); BEGIN REGS.AH:=$01;REGS.CH:=A;REGS.CL:=E;INTR($10,REGS); REGS.AH:=$02;REGS.BH:=0;REGS.DH:=1;REGS.DL:=1;INTR($10,REGS); END; {-- C --} PROCEDURE EGA_UMSCHALTEN; BEGIN IF (PARAMSTR(1) = '8x8') OR (PARAMSTR(1) = '8X8') THEN BEGIN TEXT_8X8;CURSOR_SETZEN(6,7);EXIT; END; IF (PARAMSTR(1) = '8x14') OR (PARAMSTR(1) = '8X14') THEN TEXT_8X14;CURSOR_SETZEN(12,13); END; PROCEDURE VGA_UMSCHALTEN; BEGIN IF (PARAMSTR(1) = '8x8') OR (PARAMSTR(1) = '8X8') THEN BEGIN TEXT_8X8;CURSOR_SETZEN(6,7); EXIT; END; IF (PARAMSTR(1) = '8x14') OR (PARAMSTR(1) = '8X14') THEN BEGIN TEXT_8X14;CURSOR_SETZEN(12,13);EXIT; END; IF (PARAMSTR(1) = '8x16') OR (PARAMSTR(1) = '8X16') THEN TEXT_8X16;CURSOR_SETZEN(13,15); END; {-- D --} PROCEDURE IST_EGA; BEGIN REGS.AH:=$12; REGS.BL:=$10; INTR($10,REGS); IF REGS.BL <> $10 THEN OK_EGA := TRUE; END; PROCEDURE IST_VGA; BEGIN REGS.AH:=$1A; REGS.AL:=$0; INTR($10,REGS); IF REGS.AL = $1A THEN OK_VGA := TRUE; END; {-- E --} PROCEDURE HILFE; BEGIN CLRSCR; WRITELN('DAS PROGRAMM STELLT DIE ANZAHL DER TEXTZEILEN EIN!'); WRITELN('FOLGENDE AUFRUFE SIND M™GLICH:'); WRITELN('TEXTMODI 8X8 '); WRITELN('TEXTMODI 8X14 '); WRITELN('TEXTMODI 8X16 '); WRITELN; WRITELN('ANZEIGE MIT RETURNTASTE BEENDEN!'); READLN; END; BEGIN { HAUPTPROGRAMM } OK_EGA:=FALSE;OK_VGA:=FALSE; IF PARAMCOUNT <> 1 THEN BEGIN HILFE; CLRSCR; HALT(0); END; IST_VGA; IF NOT OK_VGA THEN IST_EGA; IF (NOT OK_VGA) AND (NOT OK_EGA) THEN BEGIN WRITELN('DIESES PROGRAMM BRAUCHT EINE EGA- ODER VGA-KARTE!'); DELAY(2000); CLRSCR; HALT(0); END; IF OK_VGA THEN VGA_UMSCHALTEN ELSE IF OK_EGA THEN EGA_UMSCHALTEN; END.