home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9202 / 3dgraf / lbm / lbm.def next >
Text File  |  1992-01-10  |  13KB  |  261 lines

  1. (* ------------------------------------------------------ *)
  2. (*                     LBM.DEF                            *)
  3. (*            Definitionsmodul für LBM                    *)
  4. (*    Das Modul lbm stellt Routinen zum Einlesen von      *)
  5. (*    IFF-Bildern und Farbpaletten in den VGA-Modi 18     *)
  6. (*              und 19 zur Verfügung.                     *)
  7. (*                                                        *)
  8. (*        (C) 1992 Dietmar Ring & DMV-Verlag              *)
  9. (*             Compiler: TopSpeed Modula                  *)
  10. (* ------------------------------------------------------ *)
  11. DEFINITION MODULE lbm;
  12.  
  13. FROM FIO IMPORT File;
  14.  
  15. CONST
  16.   MAX18X  =   80;             (* Bildschirmbreite Mode 18 *)
  17.   MAX18Y  =  480;             (* Bildschirmhöhe   Mode 18 *)
  18.   MAX19X  =  320;             (* Bildschirmbreite Mode 19 *)
  19.   MAX19Y  =  200;             (* Bildschirmhöhe   Mode 19 *)
  20.  
  21. (*     Header der IFF Datei     *)
  22. TYPE
  23.   header_typ  = RECORD
  24.   lang     : LONGCARD;          (* Länge des Blocks       *)
  25.   breit    : CARDINAL;          (* Breite des Bildes      *)
  26.   hoch     : CARDINAL;          (* Höhe des Bildes        *)
  27.   xpos     : INTEGER;           (* Position der linken    *)
  28.   ypos     : INTEGER;           (* oberen Ecke            *)
  29.   tiefe    : SHORTCARD;         (* Anzahl Bitplanes       *)
  30.   maske    : SHORTCARD;         (* Art der Maske          *)
  31.   pack     : SHORTCARD;         (* 01 = Bild gepackt      *)
  32.   leer     : SHORTCARD;         (* Nicht verwendet        *)
  33.   transp   : CARDINAL;          (* Transparente Farbe     *)
  34.   xasp     : SHORTCARD;         (* Verhältnis x zu y      *)
  35.   yasp     : SHORTCARD;         (* eines Pixels           *)
  36.   scbreit  : INTEGER;           (* Größe des realen       *)
  37.   schoch   : INTEGER;           (* Bildschirms            *)
  38.   (* Die nächsten Daten stehen eigentlich nicht im        *)
  39.   (* Header                                               *)
  40.   size     : LONGCARD;          (* Dateigröße             *)
  41.   graphik  : LONGCARD;          (* Größe des Graphikblocks*)
  42.   typ      : ARRAY[1..4] OF CHAR;         (* Dateiart     *)
  43.  END;
  44.  
  45. (* Aufbau des Grafikbildschirms im Mode 18 *)
  46.   screen16_typ   = ARRAY [1..MAX18Y], [1..MAX18X] OF BYTE;
  47.  
  48. (* Aufbau des Grafikbildschirms im Mode 19 *)
  49.   screen256_typ  = ARRAY [1..MAX19Y],[1..MAX19X] OF BYTE;
  50.  
  51. (* Farbwerte des Bildes *)
  52.   pal256_typ      = ARRAY [1..256] OF RECORD
  53.                                        rt,gr,bl :BYTE;
  54.                                       END;
  55.  
  56. (* Zeiger auf eine Farbpalette      *)
  57.   pal_pointer_typ = POINTER TO pal256_typ;
  58.  
  59. (* Zeiger auf einen Zwischenspeicher *)
  60.   puf_pointer_typ = POINTER TO BYTE;
  61.  
  62. (* Virtueller Bildschirm Mode 18 *)
  63.   virt16_typ = ARRAY[1..4] OF POINTER TO screen16_typ;
  64.  
  65. (* Zeiger auf einen virtuellen Bildschirm Mode 19 *)
  66.   virt16_pointer_typ = POINTER TO virt16_typ;
  67.  
  68. (* Zeiger auf einen virtuellen Bildschirm Mode 19 *)
  69.   virt256_pointer_typ  = POINTER TO screen256_typ;
  70.  
  71. VAR
  72.   screen1[0A000H:0000] : screen16_typ;
  73.                         (* Array auf der Startadresse des *)
  74.                         (* Bildschirmspeichers Mode 18    *)
  75.  
  76.   screen2[0A000H:0000]  : screen256_typ;
  77.                         (* Array auf der Startadresse des *)
  78.                         (* Bildschirmspeichers Mode 19    *)
  79.  
  80.   speedh  : CARDINAL;  (* Default 10 *)
  81.   speedv  : CARDINAL;  (* Default 0  *)
  82.               (* Geschwindigkeitsanpassung für einen Teil *)
  83.               (* Teil der Überblendroutinen (ToScreen).   *)
  84.  
  85.  
  86. PROCEDURE Off();         (* Off und On schalten die       *)
  87. PROCEDURE On();          (* Bildschirmausgabe ein bzw aus *)
  88. PROCEDURE Wait();        (* wartet auf den vertikalen     *)
  89.                          (* Strahlrücklauf                *)
  90. PROCEDURE IstLbm(datei : File): BOOLEAN;
  91.  (* IstLbm gibt TRUE zurück, wenn am Anfang der Datei die *)
  92.  (* Zeichenfolge FORM steht. datei = File-Handle der IFF- *)
  93.  (* Datei (z.B. von FIO.Open)                             *)
  94.  
  95. PROCEDURE ReadHeader(datei: File): header_typ;
  96.  (* ReadHeader liest den Header (BMHD) Block, die Größe   *)
  97.  (* der gesammten Datei, die Größe des BODY Blocks und    *)
  98.  (* gibt einen Record vom Typ header_typ zurück. datei =  *)
  99.  (* File-Handle der IFF-Datei (z.B. von FIO.Open).        *)
  100.  (* Benutzt: SearchBody, swap-Utilities                   *)
  101.  
  102. PROCEDURE ReadPalette(datei: File; pal: pal_pointer_typ;
  103.                       anzahl: CARDINAL): BOOLEAN;
  104.  (* ReadPalette liest die Farbdaten (Palette) einer IFF-  *)
  105.  (* Datei in einen Puffer.                                *)
  106.  (* datei  = File-Handle der IFF-Datei (z.B. von FIO.Open)*)
  107.  (* pal    = Zeiger auf eine Puffer oder Variable vom     *)
  108.  (*          Typ pal_pointer_typ                          *)
  109.  (* anzahl = Anzahl der zu lesenden Farben, 16 oder 256   *)
  110.  (* Return = True  : Palette konnte gelesen werden        *)
  111.  
  112. PROCEDURE ReadPuffer      (datei : File;lang : LONGCARD)
  113.                           :puf_pointer_typ;
  114.  (* ReadPuffer liest die Grafikdaten (BODY) einer IFF-    *)
  115.  (* Datei in einen Puffer und gibt einen Zeiger auf den   *)
  116.  (* Puffer vom Typ puf_pointer_typ zurück.                *)
  117.  (* datei  = File-Handle der IFF-Datei (z.B. von FIO.Open)*)
  118.  (* lang   = Länge des BODY, zB  aus Header.graphik       *)
  119.  (* Bei einem Fehler wird NIL zurückgegeben.              *)
  120.  
  121. PROCEDURE ReadLbm256(datei : File; header: header_typ;
  122.                      puffer: BOOLEAN;
  123.                      ziel  : virt256_pointer_typ): CARDINAL;
  124.  (* Liest die Grafikdaten einer IFF-Datei in das Video-   *)
  125.  (* RAM (VGA Mode 19, 256 Farben, 320X200 Punkte)         *)
  126.  (* datei  = File-Handle der IFF-Datei (z.B. von FIO.Open)*)
  127.  (* header = Header der IFF-Datei (Return von ReadHeader) *)
  128.  (* puffer = TRUE : BODY wird gepuffert (Schneller !!)    *)
  129.  (* ziel   <> NIL : Zeiger, der mit MakeVirt256 erzeugt   *)
  130.  (*                 wird. Das Bild wird in einem virtuel- *)
  131.  (*                 len Bildschirm abgelegt.              *)
  132.  (* ziel    = NIL : Bild direkt in das VideoRAM schreiben *)
  133.  (* Return  = 0   : Das Bild wurde gelesen                *)
  134.  (*           1   : BODY nicht gefunden                   *)
  135.  (*           2   : Bild enthält eine Maske               *)
  136.  (* Benutzt : SearchBody, ReadPuffer                      *)
  137.  
  138. PROCEDURE ReadLbmAlt256(datei : File; header: header_typ;
  139.                         puffer: BOOLEAN;
  140.                         ziel  : virt256_pointer_typ):
  141.                         CARDINAL;
  142.  (* ReadLbmAlt256 liest Grafikdaten einer IFF Datei, die  *)
  143.  (* im älteren ILBM-Datei vorliegen - z.B. von ICONVERT - *)
  144.  (* in den Bildspeicher (VGA MODE 19)                     *)
  145.  (* datei  = File-Handle der IFF-Datei (z.B. von FIO.Open)*)
  146.  (* header = Header der IFF Datei (Return von ReadHeader) *)
  147.  (* puffer = TRUE : BODY wird gepuffert ( Schneller !! )  *)
  148.  (* ziel   <> NIL : Zeiger der mit MakeVirt256 erzeugt    *)
  149.  (*                 wird. Das Bild wird in einem          *)
  150.  (*                 virtuellen Bildschirm abgelegt.       *)
  151.  (* ziel    = NIL : Bild direkt in den Grafiksp. schreiben*)
  152.  (* Return  = 0   : Das Bild wurde gelesen                *)
  153.  (*           1   : BODY nicht gefunden                   *)
  154.  (*           2   : Bild enthält eine Maske               *)
  155.  (* Benutzt : SearchBody, ReadPuffer                      *)
  156.  
  157. PROCEDURE ReadLbm16(datei : File;
  158.                     header: header_typ;
  159.                     puffer: BOOLEAN;
  160.                     ziel  : virt16_pointer_typ): CARDINAL;
  161.  (* ReadLbm16 liest die Grafikdaten einer IFF-Datei in den*)
  162.  (* Bildspeicher (VGA Mode 18,  16 Farben, 640X480 Punkte)*)
  163.  (* datei  = File-Handle der IFF-Datei (z.B. von FIO.Open)*)
  164.  (* header = Header der IFF-Datei (Return von ReadHeader) *)
  165.  (* puffer = TRUE : BODY wird gepuffert ( Schneller !! )  *)
  166.  (* ziel   <> NIL : Zeiger der mit MakeVirt16 erzeugt wird*)
  167.  (*                 Das Bild wird in einem virtuellen     *)
  168.  (*                 Bildschirm abgelegt.                  *)
  169.  (* ziel    = NIL : Bild direkt ins VideoRAM schreiben    *)
  170.  (* Return  = 0   : Das Bild wurde gelesen                *)
  171.  (*           1   : BODY nicht gefunden                   *)
  172.  (*           2   : Bild enthält eine Maske               *)
  173.  (* Benutzt : SearchBody, ReadPuffer                      *)
  174.  
  175. PROCEDURE MakeVirt16():virt16_typ;
  176.  (* MakeVirt erzeugt einen virtuellen Bildschirm für      *)
  177.  (* Modus 18. Gibt einen Record zurück, der den Zeiger    *)
  178.  (* auf die einzelnen Planes des virtuellen Bildschirms   *)
  179.  (* enthält. Zuwenig Speicher: Die Zeiger enthalten NIL.  *)
  180.  
  181. PROCEDURE MakeVirt256():virt256_pointer_typ;
  182.  (* MakeVirt256 erzeugt einen virtuellen Bildschirm für   *)
  183.  (* Modus 19. Gibt einen Zeiger auf den virtuellen        *)
  184.  (* Bildschirm zurück.                                    *)
  185.  (* Zuwenig Speicher: Zeiger enthält NIL                  *)
  186.  
  187. PROCEDURE RemoveVirt16(virt16: virt16_typ);
  188. PROCEDURE RemoveVirt256(virt256: virt256_pointer_typ);
  189.  (* RemoveVirt16 und RemoveVirt256 entfernen die          *)
  190.  (* virtuellen Bildschirme wieder aus dem Speicher.       *)
  191.  
  192. PROCEDURE ToScreen16(quelle: virt16_typ; mode: CARDINAL);
  193. PROCEDURE ToScreen256(quelle: virt256_pointer_typ;
  194.                       mode: CARDINAL);
  195.  (* ToScreen16 kopiert einen virtuellen Mode18-Bild-      *)
  196.  (* schirmspeicher in den Grafikspeicher der VGA-Karte.   *)
  197.  (* ToScreen256 kopiert einen Mode19 Bildspeicher         *)
  198.  (* quelle : Ein Array von Zeigern das von MakeVirt16     *)
  199.  (*          erzeugt wird.                                *)
  200.  (* mode   : (1..4) bestimmt auf welche Art das Bild in   *)
  201.  (*          den Grafikspeicher kopiert wird.             *)
  202.  (*          1 : direkte Kopie                            *)
  203.  (*          2 : Horizontal Mitte nach Außen              *)
  204.  (*          3 : Horizontal Außen zur Mitte               *)
  205.  (*          4 : Vertikal   Mitte nach Außen              *)
  206.  (*          5 : Vertikal   Außen zur Mitte               *)
  207.  (*          6 : Anregung für weitere Möglichkeiten       *)
  208.  
  209. PROCEDURE SetColors   (datei : File; anzahl : CARDINAL)
  210.                        : BOOLEAN;
  211.  (* SetColor setzt die DAC-Register der VGA-Karte         *)
  212.  (* datei  = File-Handle der IFF-Datei (z.B. von FIO.Open)*)
  213.  (* anzahl = Anzahl der zu setzenden Farben               *)
  214.  (* Benutzt: ReadPalette                                  *)
  215.  
  216. PROCEDURE SetColorsPap(pal: pal_pointer_typ; anz: CARDINAL);
  217.  (* SetColorPap setzt die DAC-Register mit einer bereits  *)
  218.  (* geladenen Farbpalette                                 *)
  219.  (* anzahl = Anzahl der zu setzenden Farben               *)
  220.  (* pal    = Zeiger auf eine Farbpalette                  *)
  221.  
  222. PROCEDURE LeseBild(name  : ARRAY OF CHAR;
  223.                    puffer: BOOLEAN;
  224.                    auto  : BOOLEAN;
  225.                    farb  : BOOLEAN;
  226.                    bild  : BOOLEAN;
  227.                    ziel  : BOOLEAN;
  228.                    mode  : CARDINAL) : CARDINAL;
  229.  (* LeseBild liest die Grafikdaten einer IFF-Datei ein.   *)
  230.  (* Das Bild wird direkt in den Grafikspeicher geschrieben*)
  231.  (* Der richtige Grafikmodus (18 oder 19) wird gesetzt    *)
  232.  (* name     : Name der IFF-Datei                         *)
  233.  (* puffer   : FALSE = BODY-Block wird direkt gelesen     *)
  234.  (*            TRUE  = Der BODY-Block wird zuerst in einen*)
  235.  (*                    Puffer gelesen (ist schneller!!)   *)
  236.  (* auto     : TRUE  = Grafikmodus automatisch setzten    *)
  237.  (*            FALSE = Grafikmodus nicht ändern           *)
  238.  (* farb     : TRUE  = Die Palette wird gesetzt           *)
  239.  (*            FALSE = Die Palette wird nicht gesetzt     *)
  240.  (* bild     : TRUE  = Das Bild wird gelesen              *)
  241.  (*            FALSE = Das Bild wird nicht gelesen,       *)
  242.  (*                    z.B. um nur die Palette eines      *)
  243.  (*                    Bildes zu lesen.                   *)
  244.  (* ziel     : TRUE  = Virtuellen Bildspeicher benutzen   *)
  245.  (*            FALSE = Direkt in das VideoRAM schreiben   *)
  246.  (* mode     : (1..4)  Bestimmt bei der Benutzung eines   *)
  247.  (*                    virtuellen Bildschirms die         *)
  248.  (*                    Übertragungsart (siehe ToScreen16) *)
  249.  (* Return  : 0  = Bild wurde gelesen.                    *)
  250.  (*           1  = Keine IFF Datei.                       *)
  251.  (*           2  = Header nicht gefunden                  *)
  252.  (*           3  = Graphik Modus nicht gesetzt            *)
  253.  (*           4  = Graphikdaten wurden nicht gelesen      *)
  254.  (* Benutzt : ReadHeader,ReadLbm16,ReadLbm256,SetColors   *)
  255.  
  256. END lbm.
  257.  
  258. (* ------------------------------------------------------ *)
  259. (*                  Ende von LBM.DEF                      *)
  260. (* ------------------------------------------------------ *)
  261.