added license comment in source

This commit is contained in:
2026-08-04 22:59:34 +02:00
parent 25b7e21a18
commit 562f6af31d
11 changed files with 123 additions and 101 deletions
+2
View File
@@ -1,3 +1,5 @@
{ Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
Licensed under the MIT License. See LICENSE file in project root for details. }
unit amn; unit amn;
INTERFACE INTERFACE
procedure tcmamn; procedure tcmamn;
+2
View File
@@ -1,3 +1,5 @@
REM Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
REM Licensed under the MIT License. See LICENSE file in project root for details.
c:\progs\tp\tpc amn.pas c:\progs\tp\tpc amn.pas
c:\progs\tp\tpc textgraf.pas c:\progs\tp\tpc textgraf.pas
c:\progs\tp\tpc logo-int.pas c:\progs\tp\tpc logo-int.pas
+35 -33
View File
@@ -1,29 +1,31 @@
{ Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
Licensed under the MIT License. See LICENSE file in project root for details. }
unit TextGraf; unit TextGraf;
interface interface
uses dos; uses dos;
type type
MonitorTyp = (Hercules, EGA, VGA, other); MonitorTyp = (Hercules, EGA, VGA, other);
VGAColorInfo = array[0..2] of byte; { eine VGA-Farbe: nur fr Demo } VGAColorInfo = array[0..2] of byte; { eine VGA-Farbe: nur fr Demo }
VGAColors = array[0..255] of VGAColorInfo; { alle VGA-Farben: dito } VGAColors = array[0..255] of VGAColorInfo; { alle VGA-Farben: dito }
function InitTextGraf: integer; function InitTextGraf: integer;
{ Muá ganz zu Anfang des Programms, noch im Textmodus aufgerufen { Mu ganz zu Anfang des Programms, noch im Textmodus aufgerufen
werden. Ohne das funktioniert der Rest nicht. Ergebnis 0: Alles Ok, werden. Ohne das funktioniert der Rest nicht. Ergebnis 0: Alles Ok,
unbekannter Videotyp: -1, zuwenig Speicher: 1 (Bedarf ca. 12Kb) } unbekannter Videotyp: -1, zuwenig Speicher: 1 (Bedarf ca. 12Kb) }
procedure SetPaletteSave(On: boolean); procedure SetPaletteSave(On: boolean);
{ Mit On = true nach InitTextGraf und im Textmodus aufrufen. Sichert die { Mit On = true nach InitTextGraf und im Textmodus aufrufen. Sichert die
Textpalette und reserviert Speicher fr die Grafikpalette, die dann Textpalette und reserviert Speicher fr die Grafikpalette, die dann
automatisch verwendet werden. On = false schaltet diese Automatik automatisch verwendet werden. On = false schaltet diese Automatik
wieder ab und gibt den Speicher fr die Paletten (ca. 1.5Kb) frei.} wieder ab und gibt den Speicher fr die Paletten (ca. 1.5Kb) frei.}
procedure ToText; procedure ToText;
{ Schaltet vom Grafik- in den Testmodus. Bildspeicher etc. werden in { Schaltet vom Grafik- in den Testmodus. Bildspeicher etc. werden in
Sicherheit gebracht } Sicherheit gebracht }
procedure ToGraph; procedure ToGraph;
{ Schaltet in die Grafik zurck. Vorher sollte ein Grafikmodus mit { Schaltet in die Grafik zurck. Vorher sollte ein Grafikmodus mit
ToText verlassen worden sein, um alle Werte zu initialisieren } ToText verlassen worden sein, um alle Werte zu initialisieren }
procedure GrafikMode(Mode: byte); procedure GrafikMode(Mode: byte);
{ nur fr das Demoprogramm. Kann gelscht werden, wenn BGI-Routinen { nur fr das Demoprogramm. Kann gelscht werden, wenn BGI-Routinen
(InitGraph) verwendet werden } (InitGraph) verwendet werden }
function GetMonTyp: MonitorTyp; function GetMonTyp: MonitorTyp;
{ dito } { dito }
@@ -38,7 +40,7 @@ type
ModeType = (Text, Grafik, unknown); ModeType = (Text, Grafik, unknown);
var var
regs: registers; { fr intr } regs: registers; { fr intr }
CharGen: CharGenArray absolute $A000:0; { Adresse Zeichengenerator } CharGen: CharGenArray absolute $A000:0; { Adresse Zeichengenerator }
BMode: byte absolute $40:$49; { Bios-Videomode } BMode: byte absolute $40:$49; { Bios-Videomode }
@@ -48,7 +50,7 @@ const
TScreen: ^ScreenArray = nil; { zeigt in den Bildspeicher } TScreen: ^ScreenArray = nil; { zeigt in den Bildspeicher }
ScrBuf: ^ScreenArray = nil; { speichert Textschirm zwischen } ScrBuf: ^ScreenArray = nil; { speichert Textschirm zwischen }
CGBuf: ^CharGenArray = nil; { speichert Zeichengenerator } CGBuf: ^CharGenArray = nil; { speichert Zeichengenerator }
ModeNr: byte = $FF; { Kennung fr Init } ModeNr: byte = $FF; { Kennung fr Init }
TMode: byte = $FF; { der zu restaurierende Textmodus } TMode: byte = $FF; { der zu restaurierende Textmodus }
GMode: byte = $FF; { dito Grafikmodus } GMode: byte = $FF; { dito Grafikmodus }
VGATextPal: ^VGAColors = nil; VGATextPal: ^VGAColors = nil;
@@ -60,7 +62,7 @@ begin
begin begin
AX:= $1A00; { Display Combination abfragen } AX:= $1A00; { Display Combination abfragen }
Intr($10, regs); Intr($10, regs);
IsVga:= (AL = $1A); { gltiger Aufruf } IsVga:= (AL = $1A); { gltiger Aufruf }
end; end;
end; end;
@@ -71,7 +73,7 @@ begin
AH:= $12; { Funktion $12 } AH:= $12; { Funktion $12 }
BL:= $10; { get EGA Information } BL:= $10; { get EGA Information }
Intr($10, regs); Intr($10, regs);
IsEga:= (BL <> $10); { hat sich was gendert ? } IsEga:= (BL <> $10); { hat sich was gendert ? }
end; end;
end; end;
@@ -110,10 +112,10 @@ end;
procedure HercTextMode; procedure HercTextMode;
var i: integer; var i: integer;
ModeReg: byte absolute 0:$465; ModeReg: byte absolute 0:$465;
const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! } const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! }
($61,$50,$52,$0f,$19,$06,$19,$19,$02,$0d,$0b,$0c,0,0); ($61,$50,$52,$0f,$19,$06,$19,$19,$02,$0d,$0b,$0c,0,0);
begin begin
port[$3bf]:= 0; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) } port[$3bf]:= 0; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) }
port[$3b8]:= $21; { Mode Control: Dunkel, Text, 80x25 } port[$3b8]:= $21; { Mode Control: Dunkel, Text, 80x25 }
for i:= 0 to 13 do { die Timing-Daten komplett } for i:= 0 to 13 do { die Timing-Daten komplett }
begin begin
@@ -127,10 +129,10 @@ end;
procedure HercGraphMode; procedure HercGraphMode;
var i: integer; var i: integer;
ModeReg: byte absolute 0:$465; ModeReg: byte absolute 0:$465;
const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! } const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! }
($35,$2d,$2e,$07,$5b,$02,$57,$57,$02,$03,0,0,0,0); ($35,$2d,$2e,$07,$5b,$02,$57,$57,$02,$03,0,0,0,0);
begin begin
port[$3bf]:= 1; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) } port[$3bf]:= 1; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) }
port[$3b8]:= 2; { Mode Control: Dunkel, Grafik, Seite 0 } port[$3b8]:= 2; { Mode Control: Dunkel, Grafik, Seite 0 }
for i:= 0 to 13 do { die Timing-Daten komplett } for i:= 0 to 13 do { die Timing-Daten komplett }
begin begin
@@ -141,10 +143,10 @@ begin
ModeReg:= $0a; { im BIOS-Ram protokollieren } ModeReg:= $0a; { im BIOS-Ram protokollieren }
end; end;
procedure GrafikMode(Mode: byte); { Setzt den Videomodus, nur fr Demo } procedure GrafikMode(Mode: byte); { Setzt den Videomodus, nur fr Demo }
var i: integer; var i: integer;
begin begin
if VMonitor <> Hercules then { alle auáer Hercules sind sehr einfach } if VMonitor <> Hercules then { alle auer Hercules sind sehr einfach }
with regs do with regs do
begin begin
AX:= Mode; { AH:= 0; AL:= Mode } AX:= Mode; { AH:= 0; AL:= Mode }
@@ -157,13 +159,13 @@ begin
end; end;
end; end;
function GetMonTyp: MonitorTyp; { Zugriffsfunktion, nur fr das Demo } function GetMonTyp: MonitorTyp; { Zugriffsfunktion, nur fr das Demo }
begin begin
GetMonTyp:= VMonitor; GetMonTyp:= VMonitor;
end; end;
procedure ToTextVGA; { sichert den Teil des Grafik-Bildspeichers, der } procedure ToTextVGA; { sichert den Teil des Grafik-Bildspeichers, der }
var b: byte; { vom Zeichengenerator berschrieben wird } var b: byte; { vom Zeichengenerator berschrieben wird }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
intr($10, regs); { Bildspeicher bleibt erhalten } intr($10, regs); { Bildspeicher bleibt erhalten }
@@ -171,10 +173,10 @@ begin
b:= Port[$3cf]; { lesen } b:= Port[$3cf]; { lesen }
Port[$3cf]:= 2; { Plane 2 ein } Port[$3cf]:= 2; { Plane 2 ein }
CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern } CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern }
Port[$3cf]:= b; { Wert zurck } Port[$3cf]:= b; { Wert zurck }
end; end;
procedure ToTextEGA; { wie oben jedoch Variante fr EGA, } procedure ToTextEGA; { wie oben jedoch Variante fr EGA, }
var b: byte; { deren Register nicht lesbar sind } var b: byte; { deren Register nicht lesbar sind }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
@@ -182,10 +184,10 @@ begin
Port[$3ce]:= 4; { Read Map Select holen } Port[$3ce]:= 4; { Read Map Select holen }
Port[$3cf]:= 2; { Plane 2 ein } Port[$3cf]:= 2; { Plane 2 ein }
CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern } CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern }
Port[$3cf]:= 0; { Default zurck } Port[$3cf]:= 0; { Default zurck }
end; end;
procedure ToGraphVGA; { berschreibt den Zeichengenerator mit } procedure ToGraphVGA; { berschreibt den Zeichengenerator mit }
var b: byte; { gesicherten Grafikinhalt } var b: byte; { gesicherten Grafikinhalt }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
@@ -193,11 +195,11 @@ begin
Port[$3C4]:= 2; { Map Mask Register holen } Port[$3C4]:= 2; { Map Mask Register holen }
b:= Port[$3c5]; { lesen } b:= Port[$3c5]; { lesen }
Port[$3c5]:= 4; { Plane 2 ein } Port[$3c5]:= 4; { Plane 2 ein }
CharGen:= CGBuf^; { Zeichengenerator zurck } CharGen:= CGBuf^; { Zeichengenerator zurck }
Port[$3c5]:= b; { Wert zurck } Port[$3c5]:= b; { Wert zurck }
end; end;
procedure ToGraphEGA; { wie oben jedoch Variante fr EGA, } procedure ToGraphEGA; { wie oben jedoch Variante fr EGA, }
var b: byte; { deren Register nicht lesbar sind } var b: byte; { deren Register nicht lesbar sind }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
@@ -205,7 +207,7 @@ begin
Port[$3C4]:= 2; { Map Mask Register holen } Port[$3C4]:= 2; { Map Mask Register holen }
Port[$3c5]:= 4; { Plane 2 ein } Port[$3c5]:= 4; { Plane 2 ein }
CharGen:= CGBuf^; { Zeichengenerator kopieren } CharGen:= CGBuf^; { Zeichengenerator kopieren }
Port[$3c5]:= 0; { Default zurck } Port[$3c5]:= 0; { Default zurck }
end; end;
function InitTextGraf: integer; { ermittelt Monitor, setzt Variablen, } function InitTextGraf: integer; { ermittelt Monitor, setzt Variablen, }
@@ -229,9 +231,9 @@ begin { reserviert Speicher }
if VMonitor = other then exit; { was anderes? geht nicht! } if VMonitor = other then exit; { was anderes? geht nicht! }
InitTextGraf:= 1; { Fehlervorgabe: kein Speicher } InitTextGraf:= 1; { Fehlervorgabe: kein Speicher }
if VMonitor in [EGA, VGA] then if VMonitor in [EGA, VGA] then
begin { Vorgaben fr EGA & VGA } begin { Vorgaben fr EGA & VGA }
GMode:= $10; { Grafik 640x350 } GMode:= $10; { Grafik 640x350 }
if MaxAvail >= sizeof(CGBuf) then { Speicher fr Puffer belegen } if MaxAvail >= sizeof(CGBuf) then { Speicher fr Puffer belegen }
New(CGBuf) New(CGBuf)
else else
exit; { raus mit Fehler 1 } exit; { raus mit Fehler 1 }
@@ -270,7 +272,7 @@ begin
end; end;
end; end;
procedure ToText; { Schaltet in Textmodus, bringt, was berschrieben } procedure ToText; { Schaltet in Textmodus, bringt, was berschrieben }
begin { wird in Sicherheit } begin { wird in Sicherheit }
if ModeNr = $FF then NoInitStop; { schon Init ? } if ModeNr = $FF then NoInitStop; { schon Init ? }
GMode:= BMode; { Grafikmodus merken } GMode:= BMode; { Grafikmodus merken }
@@ -283,10 +285,10 @@ begin { wird in Sicherheit }
EGA: ToTextEGA; EGA: ToTextEGA;
end; {case} end; {case}
if VMonitor = Hercules then if VMonitor = Hercules then
HercTextMode { Hercules Textmodus ohne Bildspeicher lschen } HercTextMode { Hercules Textmodus ohne Bildspeicher lschen }
else else
begin begin
regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen } regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen }
intr($10, regs); intr($10, regs);
if (VMonitor = VGA) and (VGATextPal <> nil) then if (VMonitor = VGA) and (VGATextPal <> nil) then
SetVGAColors(VGATextPal^); SetVGAColors(VGATextPal^);
@@ -299,7 +301,7 @@ procedure ToGraph; { versucht den Grafikmodus zu restaurieren }
begin begin
if ModeNr = $FF then NoInitStop; { schon Init ? } if ModeNr = $FF then NoInitStop; { schon Init ? }
TMode:= BMode; TMode:= BMode;
TScreen^:= ScrBuf^; { Grafikinhalt zurck in Textbildschirm fllen } TScreen^:= ScrBuf^; { Grafikinhalt zurck in Textbildschirm fllen }
case VMonitor of case VMonitor of
VGA: begin VGA: begin
if VGATextPal <> nil then if VGATextPal <> nil then
@@ -312,7 +314,7 @@ begin
HercGraphMode { Hercules handmade Grafikmodus } HercGraphMode { Hercules handmade Grafikmodus }
else else
begin begin
regs.ax:= GMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen } regs.ax:= GMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen }
intr($10, regs); intr($10, regs);
if (VMonitor = VGA) and (VGAGraphPal <> nil) then if (VMonitor = VGA) and (VGAGraphPal <> nil) then
SetVGAColors(VGAGraphPal^); SetVGAColors(VGAGraphPal^);
+3 -1
View File
@@ -1,3 +1,5 @@
{ Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
Licensed under the MIT License. See LICENSE file in project root for details. }
{$A-,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X-} {$A-,B-,D-,E-,F-,G-,I-,L-,N-,O-,R-,S-,V-,X-}
{$M 16384,0,655360} {$M 16384,0,655360}
uses crt,textgraf,WOWTPU,WOWCONST,amn; uses crt,textgraf,WOWTPU,WOWCONST,amn;
@@ -56,7 +58,7 @@ begin
end; end;
end; end;
end; end;
procedure CLI; inline( $FA ); { Interrupts unterdrcken } procedure CLI; inline( $FA ); { Interrupts unterdrcken }
procedure STI; inline( $FB ); { Interrupts wieder erlauben } procedure STI; inline( $FB ); { Interrupts wieder erlauben }
begin begin
CLI; CLI;
+2
View File
@@ -1,3 +1,5 @@
{ Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
Licensed under the MIT License. See LICENSE file in project root for details. }
unit amn; unit amn;
INTERFACE INTERFACE
procedure tcmamn; procedure tcmamn;
+2
View File
@@ -1,3 +1,5 @@
REM Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
REM Licensed under the MIT License. See LICENSE file in project root for details.
c:\progs\tp\tpc amn.pas c:\progs\tp\tpc amn.pas
c:\progs\tp\tpc textgraf.pas c:\progs\tp\tpc textgraf.pas
c:\progs\tp\tpc menu-int.pas c:\progs\tp\tpc menu-int.pas
+35 -33
View File
@@ -1,29 +1,31 @@
{ Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
Licensed under the MIT License. See LICENSE file in project root for details. }
unit TextGraf; unit TextGraf;
interface interface
uses dos; uses dos;
type type
MonitorTyp = (Hercules, EGA, VGA, other); MonitorTyp = (Hercules, EGA, VGA, other);
VGAColorInfo = array[0..2] of byte; { eine VGA-Farbe: nur fr Demo } VGAColorInfo = array[0..2] of byte; { eine VGA-Farbe: nur fr Demo }
VGAColors = array[0..255] of VGAColorInfo; { alle VGA-Farben: dito } VGAColors = array[0..255] of VGAColorInfo; { alle VGA-Farben: dito }
function InitTextGraf: integer; function InitTextGraf: integer;
{ Muá ganz zu Anfang des Programms, noch im Textmodus aufgerufen { Mu ganz zu Anfang des Programms, noch im Textmodus aufgerufen
werden. Ohne das funktioniert der Rest nicht. Ergebnis 0: Alles Ok, werden. Ohne das funktioniert der Rest nicht. Ergebnis 0: Alles Ok,
unbekannter Videotyp: -1, zuwenig Speicher: 1 (Bedarf ca. 12Kb) } unbekannter Videotyp: -1, zuwenig Speicher: 1 (Bedarf ca. 12Kb) }
procedure SetPaletteSave(On: boolean); procedure SetPaletteSave(On: boolean);
{ Mit On = true nach InitTextGraf und im Textmodus aufrufen. Sichert die { Mit On = true nach InitTextGraf und im Textmodus aufrufen. Sichert die
Textpalette und reserviert Speicher fr die Grafikpalette, die dann Textpalette und reserviert Speicher fr die Grafikpalette, die dann
automatisch verwendet werden. On = false schaltet diese Automatik automatisch verwendet werden. On = false schaltet diese Automatik
wieder ab und gibt den Speicher fr die Paletten (ca. 1.5Kb) frei.} wieder ab und gibt den Speicher fr die Paletten (ca. 1.5Kb) frei.}
procedure ToText; procedure ToText;
{ Schaltet vom Grafik- in den Testmodus. Bildspeicher etc. werden in { Schaltet vom Grafik- in den Testmodus. Bildspeicher etc. werden in
Sicherheit gebracht } Sicherheit gebracht }
procedure ToGraph; procedure ToGraph;
{ Schaltet in die Grafik zurck. Vorher sollte ein Grafikmodus mit { Schaltet in die Grafik zurck. Vorher sollte ein Grafikmodus mit
ToText verlassen worden sein, um alle Werte zu initialisieren } ToText verlassen worden sein, um alle Werte zu initialisieren }
procedure GrafikMode(Mode: byte); procedure GrafikMode(Mode: byte);
{ nur fr das Demoprogramm. Kann gelscht werden, wenn BGI-Routinen { nur fr das Demoprogramm. Kann gelscht werden, wenn BGI-Routinen
(InitGraph) verwendet werden } (InitGraph) verwendet werden }
function GetMonTyp: MonitorTyp; function GetMonTyp: MonitorTyp;
{ dito } { dito }
@@ -38,7 +40,7 @@ type
ModeType = (Text, Grafik, unknown); ModeType = (Text, Grafik, unknown);
var var
regs: registers; { fr intr } regs: registers; { fr intr }
CharGen: CharGenArray absolute $A000:0; { Adresse Zeichengenerator } CharGen: CharGenArray absolute $A000:0; { Adresse Zeichengenerator }
BMode: byte absolute $40:$49; { Bios-Videomode } BMode: byte absolute $40:$49; { Bios-Videomode }
@@ -48,7 +50,7 @@ const
TScreen: ^ScreenArray = nil; { zeigt in den Bildspeicher } TScreen: ^ScreenArray = nil; { zeigt in den Bildspeicher }
ScrBuf: ^ScreenArray = nil; { speichert Textschirm zwischen } ScrBuf: ^ScreenArray = nil; { speichert Textschirm zwischen }
CGBuf: ^CharGenArray = nil; { speichert Zeichengenerator } CGBuf: ^CharGenArray = nil; { speichert Zeichengenerator }
ModeNr: byte = $FF; { Kennung fr Init } ModeNr: byte = $FF; { Kennung fr Init }
TMode: byte = $FF; { der zu restaurierende Textmodus } TMode: byte = $FF; { der zu restaurierende Textmodus }
GMode: byte = $FF; { dito Grafikmodus } GMode: byte = $FF; { dito Grafikmodus }
VGATextPal: ^VGAColors = nil; VGATextPal: ^VGAColors = nil;
@@ -60,7 +62,7 @@ begin
begin begin
AX:= $1A00; { Display Combination abfragen } AX:= $1A00; { Display Combination abfragen }
Intr($10, regs); Intr($10, regs);
IsVga:= (AL = $1A); { gltiger Aufruf } IsVga:= (AL = $1A); { gltiger Aufruf }
end; end;
end; end;
@@ -71,7 +73,7 @@ begin
AH:= $12; { Funktion $12 } AH:= $12; { Funktion $12 }
BL:= $10; { get EGA Information } BL:= $10; { get EGA Information }
Intr($10, regs); Intr($10, regs);
IsEga:= (BL <> $10); { hat sich was gendert ? } IsEga:= (BL <> $10); { hat sich was gendert ? }
end; end;
end; end;
@@ -110,10 +112,10 @@ end;
procedure HercTextMode; procedure HercTextMode;
var i: integer; var i: integer;
ModeReg: byte absolute 0:$465; ModeReg: byte absolute 0:$465;
const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! } const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! }
($61,$50,$52,$0f,$19,$06,$19,$19,$02,$0d,$0b,$0c,0,0); ($61,$50,$52,$0f,$19,$06,$19,$19,$02,$0d,$0b,$0c,0,0);
begin begin
port[$3bf]:= 0; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) } port[$3bf]:= 0; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) }
port[$3b8]:= $21; { Mode Control: Dunkel, Text, 80x25 } port[$3b8]:= $21; { Mode Control: Dunkel, Text, 80x25 }
for i:= 0 to 13 do { die Timing-Daten komplett } for i:= 0 to 13 do { die Timing-Daten komplett }
begin begin
@@ -127,10 +129,10 @@ end;
procedure HercGraphMode; procedure HercGraphMode;
var i: integer; var i: integer;
ModeReg: byte absolute 0:$465; ModeReg: byte absolute 0:$465;
const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! } const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! }
($35,$2d,$2e,$07,$5b,$02,$57,$57,$02,$03,0,0,0,0); ($35,$2d,$2e,$07,$5b,$02,$57,$57,$02,$03,0,0,0,0);
begin begin
port[$3bf]:= 1; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) } port[$3bf]:= 1; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) }
port[$3b8]:= 2; { Mode Control: Dunkel, Grafik, Seite 0 } port[$3b8]:= 2; { Mode Control: Dunkel, Grafik, Seite 0 }
for i:= 0 to 13 do { die Timing-Daten komplett } for i:= 0 to 13 do { die Timing-Daten komplett }
begin begin
@@ -141,10 +143,10 @@ begin
ModeReg:= $0a; { im BIOS-Ram protokollieren } ModeReg:= $0a; { im BIOS-Ram protokollieren }
end; end;
procedure GrafikMode(Mode: byte); { Setzt den Videomodus, nur fr Demo } procedure GrafikMode(Mode: byte); { Setzt den Videomodus, nur fr Demo }
var i: integer; var i: integer;
begin begin
if VMonitor <> Hercules then { alle auáer Hercules sind sehr einfach } if VMonitor <> Hercules then { alle auer Hercules sind sehr einfach }
with regs do with regs do
begin begin
AX:= Mode; { AH:= 0; AL:= Mode } AX:= Mode; { AH:= 0; AL:= Mode }
@@ -157,13 +159,13 @@ begin
end; end;
end; end;
function GetMonTyp: MonitorTyp; { Zugriffsfunktion, nur fr das Demo } function GetMonTyp: MonitorTyp; { Zugriffsfunktion, nur fr das Demo }
begin begin
GetMonTyp:= VMonitor; GetMonTyp:= VMonitor;
end; end;
procedure ToTextVGA; { sichert den Teil des Grafik-Bildspeichers, der } procedure ToTextVGA; { sichert den Teil des Grafik-Bildspeichers, der }
var b: byte; { vom Zeichengenerator berschrieben wird } var b: byte; { vom Zeichengenerator berschrieben wird }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
intr($10, regs); { Bildspeicher bleibt erhalten } intr($10, regs); { Bildspeicher bleibt erhalten }
@@ -171,10 +173,10 @@ begin
b:= Port[$3cf]; { lesen } b:= Port[$3cf]; { lesen }
Port[$3cf]:= 2; { Plane 2 ein } Port[$3cf]:= 2; { Plane 2 ein }
CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern } CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern }
Port[$3cf]:= b; { Wert zurck } Port[$3cf]:= b; { Wert zurck }
end; end;
procedure ToTextEGA; { wie oben jedoch Variante fr EGA, } procedure ToTextEGA; { wie oben jedoch Variante fr EGA, }
var b: byte; { deren Register nicht lesbar sind } var b: byte; { deren Register nicht lesbar sind }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
@@ -182,10 +184,10 @@ begin
Port[$3ce]:= 4; { Read Map Select holen } Port[$3ce]:= 4; { Read Map Select holen }
Port[$3cf]:= 2; { Plane 2 ein } Port[$3cf]:= 2; { Plane 2 ein }
CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern } CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern }
Port[$3cf]:= 0; { Default zurck } Port[$3cf]:= 0; { Default zurck }
end; end;
procedure ToGraphVGA; { berschreibt den Zeichengenerator mit } procedure ToGraphVGA; { berschreibt den Zeichengenerator mit }
var b: byte; { gesicherten Grafikinhalt } var b: byte; { gesicherten Grafikinhalt }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
@@ -193,11 +195,11 @@ begin
Port[$3C4]:= 2; { Map Mask Register holen } Port[$3C4]:= 2; { Map Mask Register holen }
b:= Port[$3c5]; { lesen } b:= Port[$3c5]; { lesen }
Port[$3c5]:= 4; { Plane 2 ein } Port[$3c5]:= 4; { Plane 2 ein }
CharGen:= CGBuf^; { Zeichengenerator zurck } CharGen:= CGBuf^; { Zeichengenerator zurck }
Port[$3c5]:= b; { Wert zurck } Port[$3c5]:= b; { Wert zurck }
end; end;
procedure ToGraphEGA; { wie oben jedoch Variante fr EGA, } procedure ToGraphEGA; { wie oben jedoch Variante fr EGA, }
var b: byte; { deren Register nicht lesbar sind } var b: byte; { deren Register nicht lesbar sind }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
@@ -205,7 +207,7 @@ begin
Port[$3C4]:= 2; { Map Mask Register holen } Port[$3C4]:= 2; { Map Mask Register holen }
Port[$3c5]:= 4; { Plane 2 ein } Port[$3c5]:= 4; { Plane 2 ein }
CharGen:= CGBuf^; { Zeichengenerator kopieren } CharGen:= CGBuf^; { Zeichengenerator kopieren }
Port[$3c5]:= 0; { Default zurck } Port[$3c5]:= 0; { Default zurck }
end; end;
function InitTextGraf: integer; { ermittelt Monitor, setzt Variablen, } function InitTextGraf: integer; { ermittelt Monitor, setzt Variablen, }
@@ -229,9 +231,9 @@ begin { reserviert Speicher }
if VMonitor = other then exit; { was anderes? geht nicht! } if VMonitor = other then exit; { was anderes? geht nicht! }
InitTextGraf:= 1; { Fehlervorgabe: kein Speicher } InitTextGraf:= 1; { Fehlervorgabe: kein Speicher }
if VMonitor in [EGA, VGA] then if VMonitor in [EGA, VGA] then
begin { Vorgaben fr EGA & VGA } begin { Vorgaben fr EGA & VGA }
GMode:= $10; { Grafik 640x350 } GMode:= $10; { Grafik 640x350 }
if MaxAvail >= sizeof(CGBuf) then { Speicher fr Puffer belegen } if MaxAvail >= sizeof(CGBuf) then { Speicher fr Puffer belegen }
New(CGBuf) New(CGBuf)
else else
exit; { raus mit Fehler 1 } exit; { raus mit Fehler 1 }
@@ -270,7 +272,7 @@ begin
end; end;
end; end;
procedure ToText; { Schaltet in Textmodus, bringt, was berschrieben } procedure ToText; { Schaltet in Textmodus, bringt, was berschrieben }
begin { wird in Sicherheit } begin { wird in Sicherheit }
if ModeNr = $FF then NoInitStop; { schon Init ? } if ModeNr = $FF then NoInitStop; { schon Init ? }
GMode:= BMode; { Grafikmodus merken } GMode:= BMode; { Grafikmodus merken }
@@ -283,10 +285,10 @@ begin { wird in Sicherheit }
EGA: ToTextEGA; EGA: ToTextEGA;
end; {case} end; {case}
if VMonitor = Hercules then if VMonitor = Hercules then
HercTextMode { Hercules Textmodus ohne Bildspeicher lschen } HercTextMode { Hercules Textmodus ohne Bildspeicher lschen }
else else
begin begin
regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen } regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen }
intr($10, regs); intr($10, regs);
if (VMonitor = VGA) and (VGATextPal <> nil) then if (VMonitor = VGA) and (VGATextPal <> nil) then
SetVGAColors(VGATextPal^); SetVGAColors(VGATextPal^);
@@ -299,7 +301,7 @@ procedure ToGraph; { versucht den Grafikmodus zu restaurieren }
begin begin
if ModeNr = $FF then NoInitStop; { schon Init ? } if ModeNr = $FF then NoInitStop; { schon Init ? }
TMode:= BMode; TMode:= BMode;
TScreen^:= ScrBuf^; { Grafikinhalt zurck in Textbildschirm fllen } TScreen^:= ScrBuf^; { Grafikinhalt zurck in Textbildschirm fllen }
case VMonitor of case VMonitor of
VGA: begin VGA: begin
if VGATextPal <> nil then if VGATextPal <> nil then
@@ -312,7 +314,7 @@ begin
HercGraphMode { Hercules handmade Grafikmodus } HercGraphMode { Hercules handmade Grafikmodus }
else else
begin begin
regs.ax:= GMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen } regs.ax:= GMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen }
intr($10, regs); intr($10, regs);
if (VMonitor = VGA) and (VGAGraphPal <> nil) then if (VMonitor = VGA) and (VGAGraphPal <> nil) then
SetVGAColors(VGAGraphPal^); SetVGAColors(VGAGraphPal^);
+3 -1
View File
@@ -1,3 +1,5 @@
{ Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
Licensed under the MIT License. See LICENSE file in project root for details. }
uses WOWCONST, WOWTPU,crt,textgraf,amn; uses WOWCONST, WOWTPU,crt,textgraf,amn;
type type
lpi = array[0..2] of byte; lpi = array[0..2] of byte;
@@ -71,7 +73,7 @@ begin
DirectVideo:= false; DirectVideo:= false;
case InitTextGraf of case InitTextGraf of
-1: begin -1: begin
writeln(' Dieses Programm luft auf Ihrer Grafikkarte leider nicht!'); writeln(' Dieses Programm luft auf Ihrer Grafikkarte leider nicht!');
halt(1); halt(1);
end; end;
1: begin 1: begin
+2
View File
@@ -1,2 +1,4 @@
REM Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
REM Licensed under the MIT License. See LICENSE file in project root for details.
c:\progs\tp\tpc textgraf.pas c:\progs\tp\tpc textgraf.pas
c:\progs\tp\tpc star-int.pas c:\progs\tp\tpc star-int.pas
+35 -33
View File
@@ -1,29 +1,31 @@
{ Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
Licensed under the MIT License. See LICENSE file in project root for details. }
unit TextGraf; unit TextGraf;
interface interface
uses dos; uses dos;
type type
MonitorTyp = (Hercules, EGA, VGA, other); MonitorTyp = (Hercules, EGA, VGA, other);
VGAColorInfo = array[0..2] of byte; { eine VGA-Farbe: nur fr Demo } VGAColorInfo = array[0..2] of byte; { eine VGA-Farbe: nur fr Demo }
VGAColors = array[0..255] of VGAColorInfo; { alle VGA-Farben: dito } VGAColors = array[0..255] of VGAColorInfo; { alle VGA-Farben: dito }
function InitTextGraf: integer; function InitTextGraf: integer;
{ Muá ganz zu Anfang des Programms, noch im Textmodus aufgerufen { Mu ganz zu Anfang des Programms, noch im Textmodus aufgerufen
werden. Ohne das funktioniert der Rest nicht. Ergebnis 0: Alles Ok, werden. Ohne das funktioniert der Rest nicht. Ergebnis 0: Alles Ok,
unbekannter Videotyp: -1, zuwenig Speicher: 1 (Bedarf ca. 12Kb) } unbekannter Videotyp: -1, zuwenig Speicher: 1 (Bedarf ca. 12Kb) }
procedure SetPaletteSave(On: boolean); procedure SetPaletteSave(On: boolean);
{ Mit On = true nach InitTextGraf und im Textmodus aufrufen. Sichert die { Mit On = true nach InitTextGraf und im Textmodus aufrufen. Sichert die
Textpalette und reserviert Speicher fr die Grafikpalette, die dann Textpalette und reserviert Speicher fr die Grafikpalette, die dann
automatisch verwendet werden. On = false schaltet diese Automatik automatisch verwendet werden. On = false schaltet diese Automatik
wieder ab und gibt den Speicher fr die Paletten (ca. 1.5Kb) frei.} wieder ab und gibt den Speicher fr die Paletten (ca. 1.5Kb) frei.}
procedure ToText; procedure ToText;
{ Schaltet vom Grafik- in den Testmodus. Bildspeicher etc. werden in { Schaltet vom Grafik- in den Testmodus. Bildspeicher etc. werden in
Sicherheit gebracht } Sicherheit gebracht }
procedure ToGraph; procedure ToGraph;
{ Schaltet in die Grafik zurck. Vorher sollte ein Grafikmodus mit { Schaltet in die Grafik zurck. Vorher sollte ein Grafikmodus mit
ToText verlassen worden sein, um alle Werte zu initialisieren } ToText verlassen worden sein, um alle Werte zu initialisieren }
procedure GrafikMode(Mode: byte); procedure GrafikMode(Mode: byte);
{ nur fr das Demoprogramm. Kann gelscht werden, wenn BGI-Routinen { nur fr das Demoprogramm. Kann gelscht werden, wenn BGI-Routinen
(InitGraph) verwendet werden } (InitGraph) verwendet werden }
function GetMonTyp: MonitorTyp; function GetMonTyp: MonitorTyp;
{ dito } { dito }
@@ -38,7 +40,7 @@ type
ModeType = (Text, Grafik, unknown); ModeType = (Text, Grafik, unknown);
var var
regs: registers; { fr intr } regs: registers; { fr intr }
CharGen: CharGenArray absolute $A000:0; { Adresse Zeichengenerator } CharGen: CharGenArray absolute $A000:0; { Adresse Zeichengenerator }
BMode: byte absolute $40:$49; { Bios-Videomode } BMode: byte absolute $40:$49; { Bios-Videomode }
@@ -48,7 +50,7 @@ const
TScreen: ^ScreenArray = nil; { zeigt in den Bildspeicher } TScreen: ^ScreenArray = nil; { zeigt in den Bildspeicher }
ScrBuf: ^ScreenArray = nil; { speichert Textschirm zwischen } ScrBuf: ^ScreenArray = nil; { speichert Textschirm zwischen }
CGBuf: ^CharGenArray = nil; { speichert Zeichengenerator } CGBuf: ^CharGenArray = nil; { speichert Zeichengenerator }
ModeNr: byte = $FF; { Kennung fr Init } ModeNr: byte = $FF; { Kennung fr Init }
TMode: byte = $FF; { der zu restaurierende Textmodus } TMode: byte = $FF; { der zu restaurierende Textmodus }
GMode: byte = $FF; { dito Grafikmodus } GMode: byte = $FF; { dito Grafikmodus }
VGATextPal: ^VGAColors = nil; VGATextPal: ^VGAColors = nil;
@@ -60,7 +62,7 @@ begin
begin begin
AX:= $1A00; { Display Combination abfragen } AX:= $1A00; { Display Combination abfragen }
Intr($10, regs); Intr($10, regs);
IsVga:= (AL = $1A); { gltiger Aufruf } IsVga:= (AL = $1A); { gltiger Aufruf }
end; end;
end; end;
@@ -71,7 +73,7 @@ begin
AH:= $12; { Funktion $12 } AH:= $12; { Funktion $12 }
BL:= $10; { get EGA Information } BL:= $10; { get EGA Information }
Intr($10, regs); Intr($10, regs);
IsEga:= (BL <> $10); { hat sich was gendert ? } IsEga:= (BL <> $10); { hat sich was gendert ? }
end; end;
end; end;
@@ -110,10 +112,10 @@ end;
procedure HercTextMode; procedure HercTextMode;
var i: integer; var i: integer;
ModeReg: byte absolute 0:$465; ModeReg: byte absolute 0:$465;
const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! } const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! }
($61,$50,$52,$0f,$19,$06,$19,$19,$02,$0d,$0b,$0c,0,0); ($61,$50,$52,$0f,$19,$06,$19,$19,$02,$0d,$0b,$0c,0,0);
begin begin
port[$3bf]:= 0; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) } port[$3bf]:= 0; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) }
port[$3b8]:= $21; { Mode Control: Dunkel, Text, 80x25 } port[$3b8]:= $21; { Mode Control: Dunkel, Text, 80x25 }
for i:= 0 to 13 do { die Timing-Daten komplett } for i:= 0 to 13 do { die Timing-Daten komplett }
begin begin
@@ -127,10 +129,10 @@ end;
procedure HercGraphMode; procedure HercGraphMode;
var i: integer; var i: integer;
ModeReg: byte absolute 0:$465; ModeReg: byte absolute 0:$465;
const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! } const HData: array[0..13] of byte = { Timingdaten! Nicht verndern! }
($35,$2d,$2e,$07,$5b,$02,$57,$57,$02,$03,0,0,0,0); ($35,$2d,$2e,$07,$5b,$02,$57,$57,$02,$03,0,0,0,0);
begin begin
port[$3bf]:= 1; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) } port[$3bf]:= 1; { Config Reg: HalfMode: eine Seite (3 fr Full Mode) }
port[$3b8]:= 2; { Mode Control: Dunkel, Grafik, Seite 0 } port[$3b8]:= 2; { Mode Control: Dunkel, Grafik, Seite 0 }
for i:= 0 to 13 do { die Timing-Daten komplett } for i:= 0 to 13 do { die Timing-Daten komplett }
begin begin
@@ -141,10 +143,10 @@ begin
ModeReg:= $0a; { im BIOS-Ram protokollieren } ModeReg:= $0a; { im BIOS-Ram protokollieren }
end; end;
procedure GrafikMode(Mode: byte); { Setzt den Videomodus, nur fr Demo } procedure GrafikMode(Mode: byte); { Setzt den Videomodus, nur fr Demo }
var i: integer; var i: integer;
begin begin
if VMonitor <> Hercules then { alle auáer Hercules sind sehr einfach } if VMonitor <> Hercules then { alle auer Hercules sind sehr einfach }
with regs do with regs do
begin begin
AX:= Mode; { AH:= 0; AL:= Mode } AX:= Mode; { AH:= 0; AL:= Mode }
@@ -157,13 +159,13 @@ begin
end; end;
end; end;
function GetMonTyp: MonitorTyp; { Zugriffsfunktion, nur fr das Demo } function GetMonTyp: MonitorTyp; { Zugriffsfunktion, nur fr das Demo }
begin begin
GetMonTyp:= VMonitor; GetMonTyp:= VMonitor;
end; end;
procedure ToTextVGA; { sichert den Teil des Grafik-Bildspeichers, der } procedure ToTextVGA; { sichert den Teil des Grafik-Bildspeichers, der }
var b: byte; { vom Zeichengenerator berschrieben wird } var b: byte; { vom Zeichengenerator berschrieben wird }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
intr($10, regs); { Bildspeicher bleibt erhalten } intr($10, regs); { Bildspeicher bleibt erhalten }
@@ -171,10 +173,10 @@ begin
b:= Port[$3cf]; { lesen } b:= Port[$3cf]; { lesen }
Port[$3cf]:= 2; { Plane 2 ein } Port[$3cf]:= 2; { Plane 2 ein }
CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern } CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern }
Port[$3cf]:= b; { Wert zurck } Port[$3cf]:= b; { Wert zurck }
end; end;
procedure ToTextEGA; { wie oben jedoch Variante fr EGA, } procedure ToTextEGA; { wie oben jedoch Variante fr EGA, }
var b: byte; { deren Register nicht lesbar sind } var b: byte; { deren Register nicht lesbar sind }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
@@ -182,10 +184,10 @@ begin
Port[$3ce]:= 4; { Read Map Select holen } Port[$3ce]:= 4; { Read Map Select holen }
Port[$3cf]:= 2; { Plane 2 ein } Port[$3cf]:= 2; { Plane 2 ein }
CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern } CGBuf^:= CharGen; { Grafikinhalt von Zeichengenerator sichern }
Port[$3cf]:= 0; { Default zurck } Port[$3cf]:= 0; { Default zurck }
end; end;
procedure ToGraphVGA; { berschreibt den Zeichengenerator mit } procedure ToGraphVGA; { berschreibt den Zeichengenerator mit }
var b: byte; { gesicherten Grafikinhalt } var b: byte; { gesicherten Grafikinhalt }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
@@ -193,11 +195,11 @@ begin
Port[$3C4]:= 2; { Map Mask Register holen } Port[$3C4]:= 2; { Map Mask Register holen }
b:= Port[$3c5]; { lesen } b:= Port[$3c5]; { lesen }
Port[$3c5]:= 4; { Plane 2 ein } Port[$3c5]:= 4; { Plane 2 ein }
CharGen:= CGBuf^; { Zeichengenerator zurck } CharGen:= CGBuf^; { Zeichengenerator zurck }
Port[$3c5]:= b; { Wert zurck } Port[$3c5]:= b; { Wert zurck }
end; end;
procedure ToGraphEGA; { wie oben jedoch Variante fr EGA, } procedure ToGraphEGA; { wie oben jedoch Variante fr EGA, }
var b: byte; { deren Register nicht lesbar sind } var b: byte; { deren Register nicht lesbar sind }
begin begin
regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen } regs.ax:= $90; { Standardmodus setzen um Zugriff sicherzustellen }
@@ -205,7 +207,7 @@ begin
Port[$3C4]:= 2; { Map Mask Register holen } Port[$3C4]:= 2; { Map Mask Register holen }
Port[$3c5]:= 4; { Plane 2 ein } Port[$3c5]:= 4; { Plane 2 ein }
CharGen:= CGBuf^; { Zeichengenerator kopieren } CharGen:= CGBuf^; { Zeichengenerator kopieren }
Port[$3c5]:= 0; { Default zurck } Port[$3c5]:= 0; { Default zurck }
end; end;
function InitTextGraf: integer; { ermittelt Monitor, setzt Variablen, } function InitTextGraf: integer; { ermittelt Monitor, setzt Variablen, }
@@ -229,9 +231,9 @@ begin { reserviert Speicher }
if VMonitor = other then exit; { was anderes? geht nicht! } if VMonitor = other then exit; { was anderes? geht nicht! }
InitTextGraf:= 1; { Fehlervorgabe: kein Speicher } InitTextGraf:= 1; { Fehlervorgabe: kein Speicher }
if VMonitor in [EGA, VGA] then if VMonitor in [EGA, VGA] then
begin { Vorgaben fr EGA & VGA } begin { Vorgaben fr EGA & VGA }
GMode:= $10; { Grafik 640x350 } GMode:= $10; { Grafik 640x350 }
if MaxAvail >= sizeof(CGBuf) then { Speicher fr Puffer belegen } if MaxAvail >= sizeof(CGBuf) then { Speicher fr Puffer belegen }
New(CGBuf) New(CGBuf)
else else
exit; { raus mit Fehler 1 } exit; { raus mit Fehler 1 }
@@ -270,7 +272,7 @@ begin
end; end;
end; end;
procedure ToText; { Schaltet in Textmodus, bringt, was berschrieben } procedure ToText; { Schaltet in Textmodus, bringt, was berschrieben }
begin { wird in Sicherheit } begin { wird in Sicherheit }
if ModeNr = $FF then NoInitStop; { schon Init ? } if ModeNr = $FF then NoInitStop; { schon Init ? }
GMode:= BMode; { Grafikmodus merken } GMode:= BMode; { Grafikmodus merken }
@@ -283,10 +285,10 @@ begin { wird in Sicherheit }
EGA: ToTextEGA; EGA: ToTextEGA;
end; {case} end; {case}
if VMonitor = Hercules then if VMonitor = Hercules then
HercTextMode { Hercules Textmodus ohne Bildspeicher lschen } HercTextMode { Hercules Textmodus ohne Bildspeicher lschen }
else else
begin begin
regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen } regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen }
intr($10, regs); intr($10, regs);
if (VMonitor = VGA) and (VGATextPal <> nil) then if (VMonitor = VGA) and (VGATextPal <> nil) then
SetVGAColors(VGATextPal^); SetVGAColors(VGATextPal^);
@@ -299,7 +301,7 @@ procedure ToGraph; { versucht den Grafikmodus zu restaurieren }
begin begin
if ModeNr = $FF then NoInitStop; { schon Init ? } if ModeNr = $FF then NoInitStop; { schon Init ? }
TMode:= BMode; TMode:= BMode;
TScreen^:= ScrBuf^; { Grafikinhalt zurck in Textbildschirm fllen } TScreen^:= ScrBuf^; { Grafikinhalt zurck in Textbildschirm fllen }
case VMonitor of case VMonitor of
VGA: begin VGA: begin
if VGATextPal <> nil then if VGATextPal <> nil then
@@ -312,7 +314,7 @@ begin
HercGraphMode { Hercules handmade Grafikmodus } HercGraphMode { Hercules handmade Grafikmodus }
else else
begin begin
regs.ax:= GMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen } regs.ax:= GMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht lschen }
intr($10, regs); intr($10, regs);
if (VMonitor = VGA) and (VGAGraphPal <> nil) then if (VMonitor = VGA) and (VGAGraphPal <> nil) then
SetVGAColors(VGAGraphPal^); SetVGAColors(VGAGraphPal^);
+2
View File
@@ -1,3 +1,5 @@
{ Copyright (c) 2026 Stefan Koelle (https://stefankoelle.de)
Licensed under the MIT License. See LICENSE file in project root for details. }
{$S-} {$S-}
{$R-} {$R-}
{$G+} {$G+}