home *** CD-ROM | disk | FTP | other *** search
- '* -------------------------------------------------- *
- '* PBPCX.BAS *
- '* (C) 1991 Andreas Maslo & DMV-Verlag *
- '* Sprache: Power-Basic 2.xx *
- '* Funktion: PCX-Lader für VGA *
- '* -------------------------------------------------- *
-
- '* Compilerschalter
- $STACK 32766 '* Maximaler Stack
- $COMPILE EXE '* EXE-Programm
- $LIB GRAPH '* Grafikbibliothek einbinden
- $LIB FULLFLOAT '* Fließkommaarithmetik einb.
- $FLOAT PROCEDURE '* schnelle Fließkommaarith.
- $LIB COM OFF '* keine serielle Unterst.
- $LIB LPT OFF '* keine Druckerunterst.
- $LIB VGA ON '* VGA-Grafik
- $LIB HERC OFF '* keine Herculesgrafik
- $OPTION CNTLBREAK OFF '* Crt-Break abschalten
- $OPTION AUTODIM OFF '* kein ARRAY-AUTODIM
- $EVENT ON '* ON ERROR ...
- $CPU 8086 '* alle Maschinen
- $ERROR ALL OFF '* keine Fehlerroutinen
-
- '* Hauptprogramm
-
- CLS
- ON ERROR GOTO ErrorHandling '* Fehlerbehandlung
- Datei$ = COMMAND$ '* Dateiname = Parameter
- IF Datei$ = "" THEN '* Parameter vorhanden?
- ERROR 1 '* falls nicht, Fehler!
- END IF
- Datei$ = UCASE$(Datei$)
- IF RIGHT$(Datei$, 4) <> ".PCX" THEN
- '* Suffix angegeben?
- Datei$ = Datei$ + ".PCX"
- '* falls nicht, ergänzen!
- END IF
- CALL LoadPCX (Datei$) '* Datei laden und anzeigen
- BEEP
- WHILE INKEY$ = "": WEND '* auf Taste warten
- END '* Programm beenden
-
- ErrorHandling:
- PRINT "Datei kann nicht ausgegeben werden..."
- PRINT "Programmaufruf: PCX Datei <─┘"
- END
- RESUME
-
- SUB ClosePCX '* Datei schließen
- SHARED PCXNr '* globale Dateinummer
- CLOSE #PCXNr
- END SUB
-
- FUNCTION Combine% (FirstByte$, SecondByte$)
- '* Speicherwort aus
- First% = ASC(FirstByte$)
- '* zwei Bytes generieren
- Second% = ASC(SecondByte$)
- Combine% = INT(First% + Second% * 256)
- END FUNCTION
-
- SUB LoadPCX (Datei$) '* PCX-Datei laden und anzeigen
- SHARED PCXNr '* globale Variablen im Modul
- SHARED ID%, Ver%, Komp%, Bits%, x1%, y1%, x2%, y2%
- SHARED AX%, ay%, Pal$, Reserve%, Ebenen%, BpL%, Pal%
- SCREEN 12 '* 640x480 Pixel
- CALL OpenPCX (Datei$) '* Datei öffnen
- CALL PCXInit '* Kopfinformationen lesen
- OUT &H3CE, 5
- OUT &H3CF, 0
- OUT &H3CE, 1
- OUT &H3CF, 0
- DEF SEG = &HA000 '* Segment der Grafikkarte
- Zeile$ = SPACE$(BpL%) '* Länge einer Bildschirmzeile
- FOR K% = 0 TO y2% - y1% '* Einzelne Bildschirmzeile
- FOR J% = 0 TO Ebenen% - 1 '* Ebenen innerhalb der
- '* Bildschirmzeile
- Zeile$ = RIGHT$(Zeile$, LEN(Zeile$) - BpL%)
- I% = 0 '* Informationen
- WHILE NOT I% >= BpL% '* Information für die
- '* Zeile ausreichend
- GET$ #PCXNr,1 , Byte$ '* Byte lesen (String)
- Byte% = ASC(Byte$) '* Byte in ASCII-Wert
- '* konvertieren
- IF Byte% \ (2 ^ 6) = 3 THEN
- '* obere 2 Bits gesetzt?
- Zaehler% = Byte% XOR &HC0
- '* 6 untere Bits ergeben Zaehler%
- GET$ #PCXNr,1 , Byte$
- '* Bildinformation
- FOR a% = 1 TO Zaehler%
- '* dekomprimieren
- Zeile$ = Zeile$ + Byte$
- '* ersetzt Byte$ f.BildInfo$
- NEXT a%
- ELSE '* keine Dekomprimierung notwendig
- Zaehler% = 1 '* einmalige Information
- Zeile$ = Zeile$ + Byte$ '* BildInfo$
- END IF
- I% = LEN(Zeile$) '* Gesamtlänge der Information
- WEND
- OUT &H3C4, 2
- OUT &H3C5, 1 * (2 ^ J%) '* Ebene umschalten
- Adr = K% * 80 '* Startadresse linker Rand und
- POKE$ Adr, Zeile$ '* Zeile in Bildschirmspeicher
- NEXT J%
- NEXT K%
- CALL ClosePCX '* Datei schließen
- DEF SEG '* Umschaltung BASIC-Segment
- END SUB
-
- SUB OpenPCX (Datei$) '* PCX-Datei öffnen
- SHARED PCXNr '* globale Dateinummer
- PCXNr = FREEFILE '* freie Dateinummer verwenden
- OPEN Datei$ FOR BINARY AS #PCXNr
- '* Datei binär öffnen
- END SUB
-
- FUNCTION PCXHeader$ '* PCX-Header lesen
- SHARED PCXNr '* globale Dateinummer
- IF LOF(PCXNr) >= 128 THEN '*Dateilänge ausreichend?
- GET$ #PCXNr,128 , Header$ '* Kopf lesen, 128 Bytes
- PCXHeader$ = Header$ '* Zuweisung
- END IF
- END FUNCTION
-
- SUB PCXInit '* Dateikopf auswerten
- SHARED ID%, Ver%, Komp%, Bits%, x1%, y1%, x2%, y2%
- '* im Modul global
- SHARED AX%, ay%, Pal$, Reserve%, Ebenen%, BpL%, Pal%
- Header$ = PCXHeader$ '* binäre Informationen
- ID% = ASC(LEFT$(Header$, 1))
- '* Identifikation=10, 1 Byte
- Ver% = ASC(MID$(Header$, 2, 1))
- '* Versionnummer, 1 Byte
- Komp% = ASC(MID$(Header$, 3, 1))
- '* Komprimierungsart=1, 1 Byte
- Bits% = ASC(MID$(Header$, 4, 1))
- '* Bits pro Bildpunkt, 1 Byte
- x1% = Combine%(MID$(Header$, 5, 1), _
- MID$(Header$, 6, 1)) '* linke obere Ecke, 2 Bytes
- y1% = Combine%(MID$(Header$, 7, 1), _
- MID$(Header$, 8, 1)) '* linke obere Ecke, 2 Bytes
- x2% = Combine%(MID$(Header$, 9, 1), _
- MID$(Header$, 10, 1)) '* rechte unt. Ecke, 2 Bytes
- y2% = Combine%(MID$(Header$, 11, 1), _
- MID$(Header$, 12, 1)) '* rechte unt. Ecke, 2 Bytes
- AX% = Combine%(MID$(Header$, 13, 1), _
- MID$(Header$, 14, 1)) '* horiz. Auflösung 2 Bytes
- ay% = Combine%(MID$(Header$, 15, 1), _
- MID$(Header$, 16, 1)) '* vert. Auflösung 2 Bytes
- Pal$ = MID$(Header$, 17, 48) '* Palette je 3 Bytes
- Reserve% = ASC(MID$(Header$, 65, 1)) '* Reserve
- Ebenen% = ASC(MID$(Header$, 66, 1))
- '* Anzahl der Farbebenen
- BpL% = Combine%(MID$(Header$, 67, 1), _
- MID$(Header$, 68, 1)) '* Anzahl Bytes/Zeile, 2 Byte
- Pal% = Combine%(MID$(Header$, 69, 1), _
- MID$(Header$, 70, 1)) '* Art der Palette
- Rest$ = RIGHT$(Header$, 58) '* unbenutzt
- END SUB
-
- '* -------------------------------------------------- *
- '* Ende von PBPCX.BAS *