home *** CD-ROM | disk | FTP | other *** search
- '* -------------------------------------------------- *
- '* LLPCX.BAS *
- '* (C) 1991 A. Maslo & DMV-Verlag *
- '* Sprache: Quick Basic *
- '* Funktion: PCX-Lader für VGA, 640x480 *
- '* -------------------------------------------------- *
-
- '* Deklarationsteil
-
- DECLARE FUNCTION Combine% (FirstByte$, SecondByte$)
- DECLARE SUB LoadPCX (Datei$)
- DECLARE SUB ClosePCX ()
- DECLARE SUB OpenPCX (Datei$)
- DECLARE FUNCTION PCXHeader$ ()
- DECLARE SUB PCXInit ()
-
- '* Hauptprogramm
-
- CLS
- ON ERROR GOTO ErrorHandling '* Fehlerbehandlung
- Datei$ = COMMAND$ '* Parameter entspricht Dateiname
- IF Datei$ = "" THEN
- '* Parameter vorhanden?
- ERROR 1 '* falls nicht, Fehler!
- END IF
- IF RIGHT$(Datei$, 4) <> ".PCX" THEN
- '* Suffix angegeben?
- Datei$ = Datei$ + ".PCX" '* falls nicht, ergänzen!
- END IF
- LoadPCX Datei$ '* Datei laden und anzeigen
- 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 zwei Bytes generieren
- First% = ASC(FirstByte$)
- 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
- OpenPCX Datei$
- '* Datei öffnen
- PCXInit
- '* Kopfinformationen lesen
- OUT &H3CE, 5
- OUT &H3CF, 0
- OUT &H3CE, 1
- OUT &H3CF, 0
- DEF SEG = &HA000
- '* Segment der Grafikkarte
- Byte$ = SPACE$(1)
- '* Informationseinheit
- Zeile$ = SPACE$(BpL%)
- '* Länge einer Bildschirmzeile
- FOR K% = 0 TO y2% - y1%
- '* Einzelne Bildschirmzeile
- FOR J% = 0 TO Ebenen% - 1
- '* Ebenen innerhalb Bildschirmzeile
- Zeile$ = RIGHT$(Zeile$, LEN(Zeile$) - BpL%)
- I% = 0
- '* Informationen
- WHILE NOT I% >= BpL%
- '* Information für Zeile ausreichend
- GET #PCXNr, , 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, , 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
- P% = 0 '* Zeilenposition ergibt Offset
- FOR Z% = 1 TO BpL% - 1
- '* Bytes der Zeile direkt in
- POKE Adr + P%, ASC(MID$(Zeile$, Z%, 1))
- '* Bildschirmspeicher schreiben
- P% = P% + 1
- NEXT Z%
- NEXT J%
- NEXT K%
- 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
- Header$ = SPACE$(128) '* Dateikopf mit 128 Byte
- IF LOF(PCXNr) >= 128 THEN
- '* Dateilänge ausreichend ?
- GET #PCXNr, , Header$ '* Kopf lesen
- 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)) '* ID=10, 1 Byte
- Ver% = ASC(MID$(Header$, 2, 1)) '* Version, 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 untere Ecke, 2 Bytes
- y2% = Combine%(MID$(Header$, 11, 1), _
- MID$(Header$, 12, 1))
- '* rechte untere Ecke, 2 Bytes
- AX% = Combine%(MID$(Header$, 13, 1), _
- MID$(Header$, 14, 1)) '* hor. Auflösung 2 Bytes
- ay% = Combine%(MID$(Header$, 15, 1), _
- MID$(Header$, 16, 1)) '* ver. Auflösung 2 Bytes
- Pal$ = MID$(Header$, 17, 48)
- '* Palette jeweils 3 Byte
- 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 LLPCX.BAS *
-