mirror of
https://github.com/skoelle/dos-tcm-intros.git
synced 2026-09-17 20:30:24 +00:00
added license comment in source
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 f�r Demo }
|
VGAColorInfo = array[0..2] of byte; { eine VGA-Farbe: nur f�r 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 f�r die Grafikpalette, die dann
|
Textpalette und reserviert Speicher f�r 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 f�r die Paletten (ca. 1.5Kb) frei.}
|
wieder ab und gibt den Speicher f�r 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 zur�ck. Vorher sollte ein Grafikmodus mit
|
{ Schaltet in die Grafik zur�ck. 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 f�r das Demoprogramm. Kann gel”scht werden, wenn BGI-Routinen
|
{ nur f�r das Demoprogramm. Kann gel�scht 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; { f�r intr }
|
regs: registers; { f�r 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 f�r Init }
|
ModeNr: byte = $FF; { Kennung f�r 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); { g�ltiger Aufruf }
|
IsVga:= (AL = $1A); { g�ltiger 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 ge„ndert ? }
|
IsEga:= (BL <> $10); { hat sich was ge�ndert ? }
|
||||||
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 ver„ndern! }
|
const HData: array[0..13] of byte = { Timingdaten! Nicht ver�ndern! }
|
||||||
($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 f�r Full Mode) }
|
port[$3bf]:= 0; { Config Reg: HalfMode: eine Seite (3 f�r 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 ver„ndern! }
|
const HData: array[0..13] of byte = { Timingdaten! Nicht ver�ndern! }
|
||||||
($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 f�r Full Mode) }
|
port[$3bf]:= 1; { Config Reg: HalfMode: eine Seite (3 f�r 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 f�r Demo }
|
procedure GrafikMode(Mode: byte); { Setzt den Videomodus, nur f�r 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 au�er 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 f�r das Demo }
|
function GetMonTyp: MonitorTyp; { Zugriffsfunktion, nur f�r 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 zur�ck }
|
Port[$3cf]:= b; { Wert zur�ck }
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure ToTextEGA; { wie oben jedoch Variante f�r EGA, }
|
procedure ToTextEGA; { wie oben jedoch Variante f�r 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 zur�ck }
|
Port[$3cf]:= 0; { Default zur�ck }
|
||||||
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 zur�ck }
|
CharGen:= CGBuf^; { Zeichengenerator zur�ck }
|
||||||
Port[$3c5]:= b; { Wert zur�ck }
|
Port[$3c5]:= b; { Wert zur�ck }
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure ToGraphEGA; { wie oben jedoch Variante f�r EGA, }
|
procedure ToGraphEGA; { wie oben jedoch Variante f�r 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 zur�ck }
|
Port[$3c5]:= 0; { Default zur�ck }
|
||||||
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 f�r EGA & VGA }
|
begin { Vorgaben f�r EGA & VGA }
|
||||||
GMode:= $10; { Grafik 640x350 }
|
GMode:= $10; { Grafik 640x350 }
|
||||||
if MaxAvail >= sizeof(CGBuf) then { Speicher f�r Puffer belegen }
|
if MaxAvail >= sizeof(CGBuf) then { Speicher f�r 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 l”schen }
|
HercTextMode { Hercules Textmodus ohne Bildspeicher l�schen }
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht l”schen }
|
regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht l�schen }
|
||||||
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 zur�ck in Textbildschirm f�llen }
|
TScreen^:= ScrBuf^; { Grafikinhalt zur�ck in Textbildschirm f�llen }
|
||||||
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 l”schen }
|
regs.ax:= GMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht l�schen }
|
||||||
intr($10, regs);
|
intr($10, regs);
|
||||||
if (VMonitor = VGA) and (VGAGraphPal <> nil) then
|
if (VMonitor = VGA) and (VGAGraphPal <> nil) then
|
||||||
SetVGAColors(VGAGraphPal^);
|
SetVGAColors(VGAGraphPal^);
|
||||||
|
|||||||
@@ -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 unterdr�cken }
|
procedure CLI; inline( $FA ); { Interrupts unterdr�cken }
|
||||||
procedure STI; inline( $FB ); { Interrupts wieder erlauben }
|
procedure STI; inline( $FB ); { Interrupts wieder erlauben }
|
||||||
begin
|
begin
|
||||||
CLI;
|
CLI;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 f�r Demo }
|
VGAColorInfo = array[0..2] of byte; { eine VGA-Farbe: nur f�r 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 f�r die Grafikpalette, die dann
|
Textpalette und reserviert Speicher f�r 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 f�r die Paletten (ca. 1.5Kb) frei.}
|
wieder ab und gibt den Speicher f�r 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 zur�ck. Vorher sollte ein Grafikmodus mit
|
{ Schaltet in die Grafik zur�ck. 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 f�r das Demoprogramm. Kann gel”scht werden, wenn BGI-Routinen
|
{ nur f�r das Demoprogramm. Kann gel�scht 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; { f�r intr }
|
regs: registers; { f�r 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 f�r Init }
|
ModeNr: byte = $FF; { Kennung f�r 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); { g�ltiger Aufruf }
|
IsVga:= (AL = $1A); { g�ltiger 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 ge„ndert ? }
|
IsEga:= (BL <> $10); { hat sich was ge�ndert ? }
|
||||||
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 ver„ndern! }
|
const HData: array[0..13] of byte = { Timingdaten! Nicht ver�ndern! }
|
||||||
($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 f�r Full Mode) }
|
port[$3bf]:= 0; { Config Reg: HalfMode: eine Seite (3 f�r 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 ver„ndern! }
|
const HData: array[0..13] of byte = { Timingdaten! Nicht ver�ndern! }
|
||||||
($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 f�r Full Mode) }
|
port[$3bf]:= 1; { Config Reg: HalfMode: eine Seite (3 f�r 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 f�r Demo }
|
procedure GrafikMode(Mode: byte); { Setzt den Videomodus, nur f�r 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 au�er 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 f�r das Demo }
|
function GetMonTyp: MonitorTyp; { Zugriffsfunktion, nur f�r 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 zur�ck }
|
Port[$3cf]:= b; { Wert zur�ck }
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure ToTextEGA; { wie oben jedoch Variante f�r EGA, }
|
procedure ToTextEGA; { wie oben jedoch Variante f�r 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 zur�ck }
|
Port[$3cf]:= 0; { Default zur�ck }
|
||||||
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 zur�ck }
|
CharGen:= CGBuf^; { Zeichengenerator zur�ck }
|
||||||
Port[$3c5]:= b; { Wert zur�ck }
|
Port[$3c5]:= b; { Wert zur�ck }
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure ToGraphEGA; { wie oben jedoch Variante f�r EGA, }
|
procedure ToGraphEGA; { wie oben jedoch Variante f�r 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 zur�ck }
|
Port[$3c5]:= 0; { Default zur�ck }
|
||||||
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 f�r EGA & VGA }
|
begin { Vorgaben f�r EGA & VGA }
|
||||||
GMode:= $10; { Grafik 640x350 }
|
GMode:= $10; { Grafik 640x350 }
|
||||||
if MaxAvail >= sizeof(CGBuf) then { Speicher f�r Puffer belegen }
|
if MaxAvail >= sizeof(CGBuf) then { Speicher f�r 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 l”schen }
|
HercTextMode { Hercules Textmodus ohne Bildspeicher l�schen }
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht l”schen }
|
regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht l�schen }
|
||||||
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 zur�ck in Textbildschirm f�llen }
|
TScreen^:= ScrBuf^; { Grafikinhalt zur�ck in Textbildschirm f�llen }
|
||||||
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 l”schen }
|
regs.ax:= GMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht l�schen }
|
||||||
intr($10, regs);
|
intr($10, regs);
|
||||||
if (VMonitor = VGA) and (VGAGraphPal <> nil) then
|
if (VMonitor = VGA) and (VGAGraphPal <> nil) then
|
||||||
SetVGAColors(VGAGraphPal^);
|
SetVGAColors(VGAGraphPal^);
|
||||||
|
|||||||
@@ -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 l„uft auf Ihrer Grafikkarte leider nicht!');
|
writeln(' Dieses Programm l�uft auf Ihrer Grafikkarte leider nicht!');
|
||||||
halt(1);
|
halt(1);
|
||||||
end;
|
end;
|
||||||
1: begin
|
1: begin
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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 f�r Demo }
|
VGAColorInfo = array[0..2] of byte; { eine VGA-Farbe: nur f�r 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 f�r die Grafikpalette, die dann
|
Textpalette und reserviert Speicher f�r 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 f�r die Paletten (ca. 1.5Kb) frei.}
|
wieder ab und gibt den Speicher f�r 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 zur�ck. Vorher sollte ein Grafikmodus mit
|
{ Schaltet in die Grafik zur�ck. 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 f�r das Demoprogramm. Kann gel”scht werden, wenn BGI-Routinen
|
{ nur f�r das Demoprogramm. Kann gel�scht 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; { f�r intr }
|
regs: registers; { f�r 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 f�r Init }
|
ModeNr: byte = $FF; { Kennung f�r 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); { g�ltiger Aufruf }
|
IsVga:= (AL = $1A); { g�ltiger 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 ge„ndert ? }
|
IsEga:= (BL <> $10); { hat sich was ge�ndert ? }
|
||||||
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 ver„ndern! }
|
const HData: array[0..13] of byte = { Timingdaten! Nicht ver�ndern! }
|
||||||
($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 f�r Full Mode) }
|
port[$3bf]:= 0; { Config Reg: HalfMode: eine Seite (3 f�r 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 ver„ndern! }
|
const HData: array[0..13] of byte = { Timingdaten! Nicht ver�ndern! }
|
||||||
($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 f�r Full Mode) }
|
port[$3bf]:= 1; { Config Reg: HalfMode: eine Seite (3 f�r 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 f�r Demo }
|
procedure GrafikMode(Mode: byte); { Setzt den Videomodus, nur f�r 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 au�er 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 f�r das Demo }
|
function GetMonTyp: MonitorTyp; { Zugriffsfunktion, nur f�r 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 zur�ck }
|
Port[$3cf]:= b; { Wert zur�ck }
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure ToTextEGA; { wie oben jedoch Variante f�r EGA, }
|
procedure ToTextEGA; { wie oben jedoch Variante f�r 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 zur�ck }
|
Port[$3cf]:= 0; { Default zur�ck }
|
||||||
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 zur�ck }
|
CharGen:= CGBuf^; { Zeichengenerator zur�ck }
|
||||||
Port[$3c5]:= b; { Wert zur�ck }
|
Port[$3c5]:= b; { Wert zur�ck }
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure ToGraphEGA; { wie oben jedoch Variante f�r EGA, }
|
procedure ToGraphEGA; { wie oben jedoch Variante f�r 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 zur�ck }
|
Port[$3c5]:= 0; { Default zur�ck }
|
||||||
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 f�r EGA & VGA }
|
begin { Vorgaben f�r EGA & VGA }
|
||||||
GMode:= $10; { Grafik 640x350 }
|
GMode:= $10; { Grafik 640x350 }
|
||||||
if MaxAvail >= sizeof(CGBuf) then { Speicher f�r Puffer belegen }
|
if MaxAvail >= sizeof(CGBuf) then { Speicher f�r 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 l”schen }
|
HercTextMode { Hercules Textmodus ohne Bildspeicher l�schen }
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht l”schen }
|
regs.ax:= TMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht l�schen }
|
||||||
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 zur�ck in Textbildschirm f�llen }
|
TScreen^:= ScrBuf^; { Grafikinhalt zur�ck in Textbildschirm f�llen }
|
||||||
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 l”schen }
|
regs.ax:= GMode or $80; { Text, Bit 7 = 1: Bildspeicher nicht l�schen }
|
||||||
intr($10, regs);
|
intr($10, regs);
|
||||||
if (VMonitor = VGA) and (VGAGraphPal <> nil) then
|
if (VMonitor = VGA) and (VGAGraphPal <> nil) then
|
||||||
SetVGAColors(VGAGraphPal^);
|
SetVGAColors(VGAGraphPal^);
|
||||||
|
|||||||
@@ -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+}
|
||||||
|
|||||||
Reference in New Issue
Block a user