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 >
C/C++ Source or Header  |  1990-07-05  |  7KB  |  216 lines

  1. /*************************************************************
  2.  *
  3.  * OVERSCAN.H         (c)1990   K.Isakovic   Berlin, 12.03.90
  4.  *
  5.  *************************************************************
  6.  *      HEADER-File für die OverScan-Xbios-Erweiterungen 
  7.  *
  8.  * Die speziellen OverScan-Xbios-Funktionen haben unter dem 
  9.  * 'normalen Betrieb' keinen Einfluß, sie produzieren keine Bomben
  10.  * oder Fehlermeldungen, werden also einfach ignoriert.
  11.  *
  12.  * Die Funktionsnummern haben sich gegenüber den vorherigen
  13.  * OverScan Versionen geändert, da die Nummern 84-90 vom TT-TOS
  14.  * benötigt werden. Die alten Nummern werden trotzdem noch bearbeitet.
  15.  *
  16.  * für TurboC  1.1
  17.  */ 
  18. #include <tos.h>
  19.  
  20. typedef struct
  21. {
  22.  int  width;            /* Breite in Pixel                              */
  23.  int  height;           /* Höhe   in Pixel                              */
  24.  int  bytes_per_line;   /* Bytes pro Bildschirmzeile                    */
  25.  long length_of_screen; /* Länge des Bildschirmspeichers in Bytes       */
  26.  long physbase_offset;  /* Offset Start-Bildschirmspeicher<>Physbase    */
  27.  long logbase_offset;   /* Offset Start-Bildschirmspeicher<>Logbase     */
  28. } SCREEN;
  29.  
  30. typedef struct
  31. {
  32.  int  low_w  ,mid_w  ,high_w;    /* Breite in Pixeln             */
  33.  int  low_h  ,mid_h  ,high_h;    /* Höhe   in Pixeln            */
  34.  long low_off,mid_off,high_off;    /* Offset Bildschirmspeicher<>Logbase    */
  35.  long mono_add,color_add;    /* Zusätzlicher Speicherbedarf        */
  36.  char clear_scan;        /* Scancode  der Clear-Funktion        */
  37.  char clear_shift;        /* Shiftcode der Clear-Funktion        */
  38.  char setup_shift;        /* Shiftcode für Setup (Maske)        */
  39.  char invert_shift;        /* Shiftcode zum Invertieren des Moduse    */
  40.  char abort_shift;        /* Shiftcode zum Abbrechen         */
  41. } OVERPATCH;
  42.  
  43. int Oscanis(void)
  44. {
  45.   return (int)xbios(4200) ;
  46. }
  47. /*
  48.  * Liefert entweder 4200 oder Versionsnummer. Die Version 1.8 die als
  49.  * erste Xbios unterstützt, liefert $0108 (HEX !), diese vorliegende 
  50.  * OverScan-Version 3.0 liefert $300 usw....
  51.  * Die Funktionsnummer 4200 würde der Version 10.68 entsprechen, 
  52.  * die demnach nie erscheinen darf.
  53.  * 
  54.  */
  55.  
  56. SCREEN *Oscantab(int Res)
  57. {
  58.  return (SCREEN *)xbios(4201,Res) ;
  59. }
  60. /*
  61.  * Liefert einen Zeiger auf die Datenstruktur SCREEN. Dabei gibt Res an,
  62.  * welche der Auflösungungen der Zeiger zurückgeliefert werden soll. Für
  63.  * jede Auflösung wird ein anderer Zeiger zurückgeliefert . Es gilt :
  64.  *    Res  0 -> Low  
  65.  *    Res  1 -> Mid  
  66.  *    Res  2 -> High 
  67.  *    Res -1 -> Aktuelle Einstellung, wobei die Schalterstellung beachtet
  68.  *              wird.
  69.  * Die Datenstruktur der aktuellen Einstellung wird bei jedem Aufruf von
  70.  * Oscantab aktualisiert. 
  71.  */
  72.  
  73. int Oscanphy(int Mode)
  74. {
  75.  return (int)xbios(4202,Mode);
  76. }
  77. /*    
  78.  * Mit dieser Funktion kann der Physbase-Emulator umgeschaltet werden. 
  79.  * Wenn der Emulator eingeschaltet ist, wird beim Aufruf von Physbase der
  80.  * Wert von Logbase zurückgeliefert.
  81.  *
  82.  *    Mode  0 -> PhysbaseEmulator aus
  83.  *    Mode  1 -> PhysbaseEmulator an  (Default)
  84.  *    Mode -1 -> Status abfragen
  85.  *
  86.  * WICHTIG !
  87.  *------------
  88.  *   Man muß vor dem Programmende den Phybase-Emulator wieder anschalten !
  89.  */
  90.  
  91. int Oscanscr(int Mode)
  92. {
  93.   return (int)xbios(4203,Mode);
  94. }
  95. /*    
  96.  * Mit dieser Funktion kann der 'Setscreen'-Aufruf umgeschaltet werden. 
  97.  * Normalerweise ist unter OverScan ein Verlegen des Bildschirms oder
  98.  * ein Wechsel der Auflösung nicht möglich.
  99.  *
  100.  *    Mode  0 -> Setscreen zulässig
  101.  *    Mode  1 -> Setscreen NICHT zulässig (Default)
  102.  *    Mode -1 -> Status abfragen
  103.  * Es wird jeweils die aktuelle Einstellung zurückgeliefert.
  104.  *
  105.  * Wenn man den Bildschirmspeicher mit Setscreen verlegen will, darf 
  106.  * man den Offset zwischen Logbase und Physbase nicht zerstören.
  107.  *
  108.  * WICHTIG !
  109.  *------------
  110.  *   Man muß vor dem Programmende den 'Setscreen'-Aufruf wieder sperren !
  111.  */
  112.  
  113.  
  114. int Oscanvb(int Mode)
  115. {
  116.   return (int)xbios(4204,Mode);
  117. }
  118. /*    
  119.  * Mit dieser Funktion kann die VB Randtest-Routine und der Test auf
  120.  * Shift/Shift/Clear im IKBD-Interrupt ausgeschaltet werden. Diese
  121.  * Tests benötigen 1-2% Rechenzeit, dieses könnte aber für zeitkritische
  122.  * Midi-Routinen & Animationen zuviel sein.
  123.  *
  124.  *    Mode  0 -> Tests auschalten
  125.  *    Mode  1 -> Tests einschalten (Default)
  126.  *    Mode -1 -> Status abfragen
  127.  * Es wird jeweils die aktuelle Einstellung zurückgeliefert.
  128.  *
  129.  * WICHTIG !
  130.  *------------
  131.  *   Man muß vor dem Programmende die Tests wieder einschalten !
  132.  */
  133.  
  134.  
  135. OVERPATCH *Oscanpatch(void)
  136. {
  137.   return (OVERPATCH *)xbios(4205);
  138. }
  139. /*
  140.  * Liefert einen Zeiger auf den Patchbereich von OverScan.
  141.  */
  142.  
  143. int Oscanswitch(int Mode)
  144. {
  145.   return (int)xbios(4206,Mode);
  146. }
  147. /*
  148.  * Dieses ist die mächtigste Funktion, die OverScan anbietet,
  149.  * sie schaltet den aktuellen Modus um. Es wird dabei nicht nur
  150.  * die Hardware umgeschaltet, sondern auch alle internen
  151.  * GEM-Variablen gepatcht und der Bildschirm umkopiert.
  152.  *
  153.  *    Mode  0 -> Normalmodus
  154.  *    Mode  1 -> OverScan
  155.  *    Mode -1 -> Status abfragen
  156.  * Es wird jeweils die aktuelle Einstellung zurückgeliefert.
  157.  */
  158.  
  159.  
  160.  
  161. /*************************************************************
  162.  *  UtilityFunktion zum Anlegen einer 2. Bildschirmseite
  163.  *  Läuft auch ohne OverScan 
  164.  */
  165. int OverscanScreen(long *Block,long *NewLog,long *NewPhy,int Res)
  166. {
  167. /*  Block       Zeiger auf den mit Malloc besorgten Speicherplatz
  168.  *  NewLog      Zeiger auf den Logbasewert  der neuen Bildschirmseite
  169.  *  NewPhy      Zeiger auf den Physbasewert der neuen Bildschirmseite
  170.  *  Rez         Gewünschte Auflösung der neuen Bildschirmseite
  171.  *
  172.  *  Wenn nicht genug Speicher für die 2.Bildschirmseite da ist, ist Block
  173.  *  negativ und die Funktion liefert eine 0 zurück. Wenn alles glatt ging,
  174.  *  liefert die Funktion eine 1 zurück.
  175.  */
  176.   if ((int)Oscanis()!= 4200)             /* OverScan-Version testen   */
  177.     {
  178.     SCREEN *Over;
  179.  
  180.     Over   = Oscantab(Res);                    /* Werte holen          */
  181.     *Block = (long)Malloc(Over->length_of_screen);   /* Speicher anlegen     */
  182.     if (*Block > 0)
  183.       {
  184.       *NewLog = ((*Block+256L)&0xffff00L) + Over->logbase_offset;
  185.       *NewPhy = ((*Block+256L)&0xffff00L) + Over->physbase_offset;
  186.       return 1;
  187.       }
  188.     }
  189.   else
  190.     {
  191.     *Block  = (long)Malloc(32256L);           /* ohne OverScan        */
  192.     if (*Block>0)
  193.       {
  194.       *NewLog = (*Block+256L)&0xffff00L;
  195.       *NewPhy = *NewLog;
  196.       return 1;
  197.       }
  198.     }
  199.   return 0;
  200. }
  201.  
  202. /*************************************************************
  203.  * Utilityfunktion zum Erfahren von Logbase/Physbase
  204.  * Läuft auch ohne OverScan
  205.  */
  206. void OscanLogPhy(long *AktLog,long *AktPhy)
  207. {
  208. int Emulator;
  209.  
  210.  Emulator = Oscanphy(-1);       /* Alte Einstellung retten      */
  211.  Oscanphy(0);                   /* Physbase-Emulator aus        */
  212.  *AktLog = (long)Logbase();
  213.  *AktPhy = (long)Physbase();
  214.  Oscanphy(Emulator);            /* Alte Einstellung wieder an   */
  215. }
  216.