{====================================================================== Lebenswichtige Bios-Routinen V1.0 15.03.91 1991 Ralf Amandi Das Kopieren und Benutzen fr private Anwendungen ist ohne Einschr„nkungen erlaubt. Kontaktadresse: Ralf Amandi 02403/26689 (Anrufbeantworter) Konto: 391 501 00 KrSp Eschweiler ======================================================================} UNIT Bios; {speziellFr Portfolio} {Alle als VAR definierten Variablen werden bei Programm-Start gesetzt} {Konstaten sind Voreinstellungen fuer einen Normales IBM-PC} INTERFACE USES SaveIntr; {-- Bildschirm-Seite --} VAR ScrActPage:Byte; PROCEDURE SelScrPage(Seite:Byte); {-- Bildschirm / Farbe --} VAR DefMode :Byte; CONST ScrTxtCol:Byte=15; ScrBckCol:Byte=0; PROCEDURE SetVMode(Mode:Byte); FUNCTION GetVMode:Byte; PROCEDURE SetTextColor(Col:Byte); FUNCTION GetTextColor:Byte; PROCEDURE SetBackColor(Col:Byte);{Rahmen/Hintergrund} FUNCTION GetBackColor:Byte; PROCEDURE DefCur(StartZeile,EndZeile:Byte); {-- Textausgabe --} VAR ScrMaxX :Byte; CONST ScrMaxY :Byte=25; ScrOrgX :Byte=0; ScrOrgY :Byte=0; {Aktuelles fenster} TYPE WindowDef=RECORD ScrWdXo :Byte; ScrWdYo :Byte; ScrWdXu :Byte; ScrWdYu :Byte; TxtX :Byte;{Cursor-Position Absolut 0..79,0..24} TxtY :Byte; END; CONST ActWindow:WindowDef= (ScrWdYo:0; ScrWdXo:0; ScrWdYu:24); {Rest wird von "Start" erledigt} PROCEDURE Window(xo,yo,xu,yu:Byte);{x:1..,y:1..} PROCEDURE ClrScr; PROCEDURE GotoXY(x,y:Byte);{x:1.. y:1.. Siehe Window} FUNCTION WhereX:Byte; FUNCTION WhereY:Byte; PROCEDURE BWrite(s:String); PROCEDURE BWriteLN(s:String); FUNCTION ScrGetChar(x,y:Byte):Word;{Hi()=Attr LO()=Code} {-- Keybord --} FUNCTION KeyPressed:Boolean; FUNCTION ReadKey:CHAR; FUNCTION KeyStat:Byte; {-- PC-Infos --} VAR PC_Config :Word; AnzCom :Byte; AnzLpt :Byte; DosVerHi :Byte;{Versions-Nummer vor dem Punkt} DosVerLo :Byte;{Versions-Nummer nachn dem Punkt} IstColor :Boolean; FUNCTION GetKB:Word;{Hauptspeicher in KB} {-- Seriell/Parallel --} CONST SerStat:Byte=0; ModStat:Byte=0; {siehe AnzCom in PC-Infos} TYPE ComTyp=(Com1,Com2,Com3,Com4); PROCEDURE SerIni(Com:ComTyp;Baud:Word;Pari:Char;DBits,SBits:Byte);{z.B.(Com1,9600,'N',8,1),-> SerStat,ModStat} PROCEDURE SerSendChar(Com:ComTyp;Zeich:Char);{->SerStat} FUNCTION SerEmpfChar(Com:ComTyp):Char; PROCEDURE SerGetStat(Com:ComTyp); IMPLEMENTATION {$L Bios.OBJ} PROCEDURE Start;External; PROCEDURE SetTextColor(Col:Byte);External; FUNCTION GetTextColor:Byte;External; PROCEDURE SetBackColor(Col:Byte);External; FUNCTION GetBackColor:Byte;External; PROCEDURE SetVMode(Mode:Byte);External; FUNCTION GetVMode:Byte;External; PROCEDURE SelScrPage(Seite:Byte);External; PROCEDURE DefCur(StartZeile,EndZeile:Byte);External; PROCEDURE Window(xo,yo,xu,yu:Byte);{x:1..,y:1..}External; PROCEDURE GotoXY(x,y:Byte);{x:1.. y:2.. Siehe Window}External; FUNCTION WhereX:Byte;External; FUNCTION WhereY:Byte;External; PROCEDURE ScrollUp(AnzLines:Byte);External; PROCEDURE ScrollDwn(AnzLines:Byte);External; PROCEDURE ClrScr;External; FUNCTION ScrGetChar(x,y:Byte):Word;{Hi()=Attr LO()=Code}External; FUNCTION KeyPressed:Boolean;External; FUNCTION ReadKey:CHAR;External; FUNCTION KeyStat:Byte;External; FUNCTION GetKB:Word;{Hauptspeicher in KB}External; PROCEDURE BWrite(s:String);External; PROCEDURE BWriteLN(s:String);External; PROCEDURE SerIni;External; PROCEDURE SerSendChar;External; FUNCTION SerEmpfChar;External; PROCEDURE SerGetStat;External; BEGIN Start; END. Kurzbeschreibung: Lesen und setzen des Video-Modus: PROCEDURE SetVMode(Mode:Byte); FUNCTION GetVMode:Byte; Der Modus bei Programmstart wird in DefMode gespeichert. Lesen / Setzen der Farbeinstellung PROCEDURE SetTextColor(Col:Byte); FUNCTION GetTextColor:Byte; PROCEDURE SetBackColor(Col:Byte);{Rahmen/Hintergrund} FUNCTION GetBackColor:Byte; Die Vorgabe-Farbwerte sind als konstanten gespeichert: CONST ScrTxtCol:Byte=15; ScrBckCol:Byte=0; Cursor-Modus: PROCEDURE DefCur(StartZeile,EndZeile:Byte); Damit wird die Darstellung des Cursors eingestellt. Auf dem PC l„át sich der Cursor damit abschalten. Leider nicht auf dem Portfolio. Text-Fenster: PROCEDURE Window(xo,yo,xu,yu:Byte);{x:1..,y:1..} Fenster definieren (wird im gegensatz zu Crt nicht gel”scht). XY werte von 1 an z„hlend. Bei Programmstart wird Fensterbreite automatisch eingestellt. Leider habe ich bis jetzt keine BIOS-Funktion gefunden um die Zeilenanzahl zu bestimmen. PROCEDURE ClrScr; Fenster l”schen, benutzt die Scroll-Routine (laut DOS-Beschreibung ist dieser Vorgang definiert) Cursor Positionieren: PROCEDURE GotoXY(x,y:Byte);{x:1.. y:1.. Siehe Window} FUNCTION WhereX:Byte; FUNCTION WhereY:Byte; Bei Programmstart wird die Aktuelle Position ausgelesen. Text Ausgabe: PROCEDURE BWrite(s:String); PROCEDURE BWriteLN(s:String); Textausgabe im Fenster. Habe bis jetzt keine M”glichkeit die Standart- Funktionen dem Fenster entsprechend umzuleiten. Zeichen lesen: FUNCTION ScrGetChar(x,y:Byte):Word;{Hi()=Attr LO()=Code} Zeichen lesen. z.B. zum zwischenspeichern von Bildschirmdarstellungen fr eigene Fenster-Routinen. PROCEDURE ScrollDwn(AnzLines:Byte); PROCEDURE ScrollUp(AnzLines:Byte); Entsprechend Scrollen. AnzLines=0 bedeutet l”schen. Tastatur: FUNCTION KeyPressed:Boolean; FUNCTION ReadKey:CHAR; FUNCTION KeyStat:Byte; Entsprechen den Pascal-Routinen. Keystat gibt den Tastatur-Status (SHIFT,ALT,CTRL,INS usw.) zurck. Auch hier wird die BIOS-Funktion und nicht der direkt-Zugriff auf das BIOS-Segment benutzt. PC-Status: FUNCTION GetKB:Word;{Hauptspeicher in KB} Festellen der Speichergr”áe. Folgende Variablen werden beim Programmstart gesetzt PC_Config System-Einstellungen beim Booten BIT 0 : 1 wenn Disk-Laufwerk vorhanden BIT 1 : CoProzesser vorhanden (nur AT) BIT 2/3 : unwichtig (Hauptspeicher 16-64 KB, noch aus alten zeiten) BIT 4/5 : Boot-Videomodus BIT 6/7 : Anzahl Laufwerke BIT 8 : DMA Baustein vorhanden (nur XT/PC) BIT 9..11: Anzahl der Seriellen Schnittstellen (COM) BIT 12 : Spieleadapter angeschlossen (nur XT/PC) BIT 13 : --- BIT 14/15: Anzahl Paralleler Schnittstellen (LPT) AnzCom,AnzLpt: Entsprechende Anzahl der Schnittstellen IstColor True wenn Farbkarte installiert DosVerHi,DosVerLo: Dos-Version, DosVerHi=Nr vor dem Punkt Serielle Schnittstelle: SerStat/Modstat: SerStat Bit 0: Daten stehen bereit Bit 1: Daten berschrieben, (nicht schnell genug gelesen) Bit 2: Parit„t Fehler Bit 3: Protokoll (z.B. Daten empfangen, obwohl kein Eingangshandschake) Bit 4: Break empfangen Bit 5: Transmission Hold Register leer (1=Weitere Daten k”nnen geschrieben werden) Bit 6: Transmission Shift Register leer (1=Byte gesendet ?) Bit 7: Time Out ModStat Delta (ver„nderung) Bit 0:Modem ist sendebereit (CTS) Bit 1:Modem ist angeschaltet (DTR) Bit 2:Telefon l„utet (RI) Bit 3:Verbindung aufgebaut (DCD) Aktueller Status Bit 4:Modem ist sendebereit (CTS) Bit 5:Modem ist angeschaltet (DTR) Bit 6:Telefon l„utet (RI) Bit 7:Verbindung aufgebaut (DCD) Handhabung der šbertragung: Serini: Baud 150..9600 Parit„t: Non(=Kein),Even(=Gerade),Odd(=ungerade),Set(immer 1) DBits: 5..8 SBits: 1/2 VAR MyCom:ComTyp BEGIN MyCom=Com1; SerIni(MyCom,9600,'N',8,1) {Beispiel Empfangen} REPEAT SerGetStat; IF (SerStat AND 1)>0 THEN BEGIN BWrite(SerEmpfChar(MyCom));{Empfangen und ausgabe} END; UNTIL KeyPressed; {Beispiel Senden} SerSendChar(MyCom,#19);{Senden XOFF} END.