home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Computer Club Elmshorn Atari PD
/
CCE_PD.iso
/
mac
/
1000
/
CCE_1024.ZIP
/
CCE_1024
/
SOZLIB07.LZH
/
SOZDISTR
/
INCLUDE
/
OVERSCAN.H
< prev
next >
Wrap
C/C++ Source or Header
|
1990-07-05
|
7KB
|
216 lines
/*************************************************************
*
* OVERSCAN.H (c)1990 K.Isakovic Berlin, 12.03.90
*
*************************************************************
* HEADER-File für die OverScan-Xbios-Erweiterungen
*
* Die speziellen OverScan-Xbios-Funktionen haben unter dem
* 'normalen Betrieb' keinen Einfluß, sie produzieren keine Bomben
* oder Fehlermeldungen, werden also einfach ignoriert.
*
* Die Funktionsnummern haben sich gegenüber den vorherigen
* OverScan Versionen geändert, da die Nummern 84-90 vom TT-TOS
* benötigt werden. Die alten Nummern werden trotzdem noch bearbeitet.
*
* für TurboC 1.1
*/
#include <tos.h>
typedef struct
{
int width; /* Breite in Pixel */
int height; /* Höhe in Pixel */
int bytes_per_line; /* Bytes pro Bildschirmzeile */
long length_of_screen; /* Länge des Bildschirmspeichers in Bytes */
long physbase_offset; /* Offset Start-Bildschirmspeicher<>Physbase */
long logbase_offset; /* Offset Start-Bildschirmspeicher<>Logbase */
} SCREEN;
typedef struct
{
int low_w ,mid_w ,high_w; /* Breite in Pixeln */
int low_h ,mid_h ,high_h; /* Höhe in Pixeln */
long low_off,mid_off,high_off; /* Offset Bildschirmspeicher<>Logbase */
long mono_add,color_add; /* Zusätzlicher Speicherbedarf */
char clear_scan; /* Scancode der Clear-Funktion */
char clear_shift; /* Shiftcode der Clear-Funktion */
char setup_shift; /* Shiftcode für Setup (Maske) */
char invert_shift; /* Shiftcode zum Invertieren des Moduse */
char abort_shift; /* Shiftcode zum Abbrechen */
} OVERPATCH;
int Oscanis(void)
{
return (int)xbios(4200) ;
}
/*
* Liefert entweder 4200 oder Versionsnummer. Die Version 1.8 die als
* erste Xbios unterstützt, liefert $0108 (HEX !), diese vorliegende
* OverScan-Version 3.0 liefert $300 usw....
* Die Funktionsnummer 4200 würde der Version 10.68 entsprechen,
* die demnach nie erscheinen darf.
*
*/
SCREEN *Oscantab(int Res)
{
return (SCREEN *)xbios(4201,Res) ;
}
/*
* Liefert einen Zeiger auf die Datenstruktur SCREEN. Dabei gibt Res an,
* welche der Auflösungungen der Zeiger zurückgeliefert werden soll. Für
* jede Auflösung wird ein anderer Zeiger zurückgeliefert . Es gilt :
* Res 0 -> Low
* Res 1 -> Mid
* Res 2 -> High
* Res -1 -> Aktuelle Einstellung, wobei die Schalterstellung beachtet
* wird.
* Die Datenstruktur der aktuellen Einstellung wird bei jedem Aufruf von
* Oscantab aktualisiert.
*/
int Oscanphy(int Mode)
{
return (int)xbios(4202,Mode);
}
/*
* Mit dieser Funktion kann der Physbase-Emulator umgeschaltet werden.
* Wenn der Emulator eingeschaltet ist, wird beim Aufruf von Physbase der
* Wert von Logbase zurückgeliefert.
*
* Mode 0 -> PhysbaseEmulator aus
* Mode 1 -> PhysbaseEmulator an (Default)
* Mode -1 -> Status abfragen
*
* WICHTIG !
*------------
* Man muß vor dem Programmende den Phybase-Emulator wieder anschalten !
*/
int Oscanscr(int Mode)
{
return (int)xbios(4203,Mode);
}
/*
* Mit dieser Funktion kann der 'Setscreen'-Aufruf umgeschaltet werden.
* Normalerweise ist unter OverScan ein Verlegen des Bildschirms oder
* ein Wechsel der Auflösung nicht möglich.
*
* Mode 0 -> Setscreen zulässig
* Mode 1 -> Setscreen NICHT zulässig (Default)
* Mode -1 -> Status abfragen
* Es wird jeweils die aktuelle Einstellung zurückgeliefert.
*
* Wenn man den Bildschirmspeicher mit Setscreen verlegen will, darf
* man den Offset zwischen Logbase und Physbase nicht zerstören.
*
* WICHTIG !
*------------
* Man muß vor dem Programmende den 'Setscreen'-Aufruf wieder sperren !
*/
int Oscanvb(int Mode)
{
return (int)xbios(4204,Mode);
}
/*
* Mit dieser Funktion kann die VB Randtest-Routine und der Test auf
* Shift/Shift/Clear im IKBD-Interrupt ausgeschaltet werden. Diese
* Tests benötigen 1-2% Rechenzeit, dieses könnte aber für zeitkritische
* Midi-Routinen & Animationen zuviel sein.
*
* Mode 0 -> Tests auschalten
* Mode 1 -> Tests einschalten (Default)
* Mode -1 -> Status abfragen
* Es wird jeweils die aktuelle Einstellung zurückgeliefert.
*
* WICHTIG !
*------------
* Man muß vor dem Programmende die Tests wieder einschalten !
*/
OVERPATCH *Oscanpatch(void)
{
return (OVERPATCH *)xbios(4205);
}
/*
* Liefert einen Zeiger auf den Patchbereich von OverScan.
*/
int Oscanswitch(int Mode)
{
return (int)xbios(4206,Mode);
}
/*
* Dieses ist die mächtigste Funktion, die OverScan anbietet,
* sie schaltet den aktuellen Modus um. Es wird dabei nicht nur
* die Hardware umgeschaltet, sondern auch alle internen
* GEM-Variablen gepatcht und der Bildschirm umkopiert.
*
* Mode 0 -> Normalmodus
* Mode 1 -> OverScan
* Mode -1 -> Status abfragen
* Es wird jeweils die aktuelle Einstellung zurückgeliefert.
*/
/*************************************************************
* UtilityFunktion zum Anlegen einer 2. Bildschirmseite
* Läuft auch ohne OverScan
*/
int OverscanScreen(long *Block,long *NewLog,long *NewPhy,int Res)
{
/* Block Zeiger auf den mit Malloc besorgten Speicherplatz
* NewLog Zeiger auf den Logbasewert der neuen Bildschirmseite
* NewPhy Zeiger auf den Physbasewert der neuen Bildschirmseite
* Rez Gewünschte Auflösung der neuen Bildschirmseite
*
* Wenn nicht genug Speicher für die 2.Bildschirmseite da ist, ist Block
* negativ und die Funktion liefert eine 0 zurück. Wenn alles glatt ging,
* liefert die Funktion eine 1 zurück.
*/
if ((int)Oscanis()!= 4200) /* OverScan-Version testen */
{
SCREEN *Over;
Over = Oscantab(Res); /* Werte holen */
*Block = (long)Malloc(Over->length_of_screen); /* Speicher anlegen */
if (*Block > 0)
{
*NewLog = ((*Block+256L)&0xffff00L) + Over->logbase_offset;
*NewPhy = ((*Block+256L)&0xffff00L) + Over->physbase_offset;
return 1;
}
}
else
{
*Block = (long)Malloc(32256L); /* ohne OverScan */
if (*Block>0)
{
*NewLog = (*Block+256L)&0xffff00L;
*NewPhy = *NewLog;
return 1;
}
}
return 0;
}
/*************************************************************
* Utilityfunktion zum Erfahren von Logbase/Physbase
* Läuft auch ohne OverScan
*/
void OscanLogPhy(long *AktLog,long *AktPhy)
{
int Emulator;
Emulator = Oscanphy(-1); /* Alte Einstellung retten */
Oscanphy(0); /* Physbase-Emulator aus */
*AktLog = (long)Logbase();
*AktPhy = (long)Physbase();
Oscanphy(Emulator); /* Alte Einstellung wieder an */
}