home *** CD-ROM | disk | FTP | other *** search
/ HOT Scene Stuff / hotscenestuffzyklop1996.iso / diskmags / deutsch / microcod / stod1 / text / text013.txt < prev    next >
Text File  |  1994-11-11  |  7KB  |  210 lines

  1.  
  2.  
  3.                     PCX-Bilder in Assembler
  4.                     -----------------------
  5.  
  6.  
  7. Nachdem Ihr sicherlich schon die Theorieabhandlung des PCX-For-
  8. mats gelesen habt, gibt's jetzt etwas Handfestes in Assembler.
  9.  
  10. Das folgende Programm liest ein 320x200x256-PCX-Bild ein und
  11. bringt es auf die (dann bunte) Mattscheibe. Ich werde mich dabei
  12. wieder an die im 'Theorie-Text' beschriebene Struktur halten.
  13.  
  14. O.K, ersteinmal das Listing, danach ein paar Anmerkungen:
  15.  
  16.  
  17. SHOWPCX320x200x256 PROC
  18.   lea dx,DateiName
  19.   mov ax,3d00h
  20.   int 21h                    ; Datei öffnen
  21.   mov Handle,ax              ; FileHandle nach Handle
  22.  
  23.   mov ax,3F00h
  24.   mov bx,Handle
  25.   mov cx,128
  26.   lea dx,Header
  27.   int 21h                    ; Header auslesen
  28.  
  29.   mov Video_Offset,0
  30.   mov repeatCount,0
  31.  
  32. Schleife:
  33.   mov ax,3F00h
  34.   mov bx,Handle
  35.   mov cx,Buff_Size
  36.   lea dx,DatenPuffer
  37.   int 21h                    ; 50000b aus PCX-File lesen
  38.   jc  Ende                   ; Wenn Fehler aufgetreten -> Ende
  39.   cmp ax,0
  40.   je  MakePalette            ;0 Byte gelesen -> Ende
  41.   mov BytesRead,ax
  42.   call Decode                ;Gelesene Bytes decodieren
  43.   jmp Schleife
  44.  
  45. MakePalette:
  46.   mov ah,42h
  47.   mov al,02h
  48.   mov bx,Handle
  49.   mov cx,0
  50.   mov dx,0
  51.   int 21h                    ;Laenge der Datei bestimmen
  52.  
  53.   sub ax,768                 ;DWord (DX:AX) um 768 erniedrigen
  54.   jnc nextpal
  55.   sub dx,1
  56.  
  57. nextpal:
  58.   mov cx,dx
  59.   mov dx,ax
  60.   mov ah,42h
  61.   mov al,00h
  62.   mov bx,Handle
  63.   int 21h                    ;FilePointer 768b vor Ende setzen
  64.  
  65.   mov ah,3Fh
  66.   mov bx,Handle
  67.   mov cx,768
  68.   lea dx,Palette
  69.   int 21h                    ; 768b aus File lesen (in Palette)
  70.  
  71.   lea bx,Palette
  72.   mov cx,768
  73. decrease:
  74.   mov ah,[bx]
  75.   shr ah,2
  76.   mov [bx],ah
  77.   inc bx
  78.   loop decrease              ;Alle Farbeinträge durch 4 teilen
  79.  
  80.   mov ax,1012h
  81.   mov bx,0
  82.   mov cx,256
  83.   mov dx,Seg Palette
  84.   mov es,dx
  85.   lea dx,Palette
  86.   int 10h                    ;256 Farben setzen
  87.  
  88. DateiSchliessen:
  89.   mov ah,3Eh           
  90.   mov bx,Handle
  91.   int 21h                    ; Datei schließen
  92.  
  93. ENDE:
  94.  ret
  95. ShowPCX320x200x256 ENDP
  96.  
  97. Decode Proc
  98.     mov ax, Page_Addr        ; Video-Segment nach AX
  99.     mov es, ax               ; Video-Segment nach ES
  100.     mov di, Video_Offset     ; Video_Offset nach DI
  101.     xor cx, cx               ; CX auf null
  102.     mov cl, RepeatCount      ; Anzahl der Wiederholungen nach CL
  103.     mov bx, BytesRead        ; Anzahl der gelesenen Bytes nach BX
  104.     lea si, DatenPuffer      ; Offset von DatenPuffer nach SI
  105.     add bx, si               ; Offset-Ende vom Puffer in BX
  106.     cld                      ; Lösche DF - INC DI (stosb/lodsb)
  107.  
  108. checkbyte:
  109.     cmp si, bx               ; Noch Daten da?
  110.     je exit                  ; Wenn nicht : EXIT
  111.     lodsb                    ; Lade nächstes Byte nach AL
  112.     cmp cl, 0                ; Wiederholungsschleife ?
  113.     jne WriteByte            ; Wenn ja : WriteByte
  114.     cmp al, 11000000b        ; Sonst prüfe BIT 7+6 (> 192)
  115.     jb VorWriteByte          ; Nicht gesetzt -> VorWriteByte
  116.     and al, 00111111b        ; BIT 0-5 : Wiederholungszähler
  117.     mov cl, al               ; Wiederholungsanzahl nach CL
  118.     jmp checkbyte            ; Prüfe nächste Data
  119.  
  120. VorWriteByte:
  121.     mov cl,1
  122.  
  123. WriteByte:
  124.     stosb                    ; AL in VideoSpeicher, INC DI
  125.  
  126.     cmp di,64000
  127.     je Exit                  ; Wenn 64000 Punkte gesetzt wurden,
  128.                              ; nächstes Fenster einblenden
  129.     loop writebyte
  130.  
  131.     jmp checkbyte            ; Prüfe nächste Data
  132.  
  133. exit:
  134.     mov Video_Offset, di
  135.     mov repeatcount, cl
  136.     ret                      ;Werte zwischenspeichern und zurück
  137. Decode Endp
  138.  
  139.  
  140. Das Listing beinhaltet nur die Prozedur zum darstellen des PCX-
  141. Bildes. Der VideoModus 13h (320x200x256) muß gesetzt sein, und
  142. folgendes muß im Hauptprogramm deklariert sein:
  143.  
  144. Page_Addr       equ 0A000h
  145. Buff_Size       equ 50000
  146.  
  147. .DATA
  148.  
  149. Handle       dw (?)          ; Filehandle zum Zugriff auf Datei
  150. Header       db 128 dup (?)  ; Buffer für Header
  151. RepeatCount  db (?)          ; Wiederholungszaehler
  152. BytesRead    dw (?)          ; Länge der gelesenen Daten in Byte
  153. Video_Offset dw (?)          ; Offset-Addy vom ViedeoRam
  154. DatenPuffer  db Buff_Size dup (?) ; Tab für gelesene Bytes
  155. Palette      db 768 dup (?)  ; Nimmt Palette auf
  156. DateiName    db 'test.pcx',0 ; Beliebiger Dateiname
  157.  
  158.  
  159. Der angegebene Dateiname sollte wirklich existieren und auch
  160. ein PCX-Bild sein, sonst könnte es zu Problemen kommen. Der
  161. QuellCode ist zwar einigermaßen dokumentiert, läßt aber bestimmt
  162. noch einige Fragen offen. Wenn Ihr genau hinschaut, seht Ihr
  163. aber, daß ich das im Theorieteil beschriebene Schema zum anzei-
  164. gen eines Bildes tatsächlich benutzt habe.
  165.  
  166. Nachdem die Datei geöffnet und der Header ausgelesen wurde, be-
  167. ginnt die Ausgabe des Bildes (Marke: Schleife). Es werden nach
  168. Möglichkeit 50000 Byte ausgelesen. Die reale Anzahl der gele-
  169. senen Bytes steht im AX-Register. Sollte hier eine Null zu finden
  170. sein, so wurden alle Daten ausgelesen. Danach wird dann die Pa-
  171. lette gesetzt und die Prozedur verlassen. Sollten Daten gelesen
  172. worden sein, so wird die Prozedur 'Decode' angesprungen.
  173. Hier geht's nun (nach der Initialisierung einiger Werte) in
  174. 'CheckByte' richtig los. Es wird ein Byte ausgelesen und über-
  175. prüft, ob die obersten beiden Bits gesetzt sind (192...).
  176. Ist das der Fall, so werden diese beiden Bits ausgeblendet
  177. (Byte AND 00111111b). Der verbleibende Wert repräsentiert den
  178. Index, der in CX (dem Wiederholungszähler) gespeichert wird.
  179. Das nächste Byte wird ausgelesen. Da CX > 0 ist, wird WriteByte
  180. angesprungen, wo dieses neue Byte nun in den Videospeicher ge-
  181. schrieben wird (mit STOSB). Dabei wird auch DI erhöht, der
  182. gleichzeitig als 'Pixelzähler' eingesetzt werden kann. Wurden
  183. 64000 Pixel gesetzt (320x200), so steht das Bild vollständig
  184. auf dem Bildschirm, und die Palette kann gesetzt werden. Wenn
  185. nicht, wird, nachdem die Pixel gesetzt wurden, wieder von
  186. vorne begonnen.
  187. Sollte bei einem ausgelesenem Byte nicht die obersten beiden Bits
  188. gesetzt sein, so wird das Byte nur einmal in den Speicher ge-
  189. schrieben (VorWriteByte: CX (=Index) auf 1).
  190. Tja, wahrscheinlich ist immer noch nicht alles geklärt, aber
  191. das Grundprinzip dürfte wohl verstanden sein.
  192. Alle die, die noch kein Vorwissen über den 320x200x256-Grafikmo-
  193. dus haben, sollten sich das nächste STOD antun, da dort auch
  194. darüber etwas zufinden sein wird.
  195.  
  196. Da ich mich noch nicht besonders gut mit den Schlüsselwörtern
  197. Public und Extern etc. auskenne, weiß ich auch nicht, wie ich
  198. obiges als externe Linkdatei angeben kann. Daher diese etwas
  199. aufwendige Methode mit der Deklaration der benutzten Variablen
  200. im Hauptprogramm und nicht in der Prozedur selber. Sollte es
  201. jemand besser wissen, kann er ja mal schreiben...
  202.  
  203.  
  204. Tja, das war's dann auch schon mit diesem Artikel. Wenn noch
  205. Fragen offen stehen sollten: immer her damit!
  206. Das Listing befindet sich natürlich auch in dem QuellCode-Pfad
  207. 'SOURCES'.
  208.                                                  Kemil
  209.  
  210.