;gyr's 320x200x256 pcx reader±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
; 8
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
code  segment para public 'CODE'
		assume cs:code, ds:code
		.386
		org 100h
start:
  lea dx, NoFile            ; punem in dx adresa mesajului de eroare

  mov al, es:[80h]          ; ne uitam in PSP sa vedem ce fisier primim ca argument
  cmp al, 6                 ; comparam cu 6 (nume+'.pcx'+0h >5)
  jb Eroare               ; daca e mai mic ca 6 nu am primit argument corect
			    ; sarim la eroare

  mov bx, 81h               ; numele fisierului incepand cu psp:81h
  add bx, ax                ; sting ASCIIZ (text+00h)
  mov [bx], ah              ; 

  mov ax, 3d00h             ; deschidem fisierul
  mov dx, 82h               ; ds:[82h] = startof paramstr(1)
  int 21h
    lea dx, NoFile            ; adresa mesajului de eroare
  jc Eroare                 ; setat flagul -> fisierul nu exista
  mov bx, ax                ; in bx avem acum hadleul 

  push 0a000h               ; adresa memoriei vga
  pop es                    ; o punem in es

;Rutina de decodare PCX±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

  mov ah, 3fh           ; functia citeste fisierul 
  mov cx, 128+64768     ; dimensiunea maxima a unu fisier PCX 200x300x256 culori

  lea dx, Manufacturer  ; adresa inceputului headerului pcx
  int 21h               ; citeste !

  lea dx, NoFile	; mesaj de eroare

  cmp [Manufacturer], 0ah ; este pcx autentic ?
  jne Iesire

  mov ax, 13h		; schimbam modul video
  int 10h

  lea si, ScrPal        ; adresa unde incepe imaginea si apoi paleta de culori
                        ; 

  xor di, di            ; di=0, incepem cu inceputul

DecodeLoop:
  mov cx, 1             ; acelasi mod pt ambele cazuri
  lodsb
  cmp al, 192           ; este un pixel sau un sir de pixeli ?
  jb Single
  and al, 63            ; este string, facem mod(64)
  mov cl, al            ; punem in cl rezultatul ca sa putem folosi 'rep' mai jos
  lodsb                 ; punem bytul de cl ori pe ecran (mutam in memoria video)
Single:
  rep stosb             ; mutam toti bytetii
  cmp di, 64001		; am ajuns la capat ?
  jb DecodeLoop

  mov dx, 3c8h          ; registru de index al paletei de culori.
  xor al, al            ; culoarea 0.
  out dx, al            ; transmitem la vga
  inc dx                ; 3c9h = palette data register.

  mov cx, 768           ; 256 de culori, rgb..= 768
SetPal:
  lodsb                 ; urmatorul byte
  shr al, 2             ; paleta e impartita la 4, inmultim
  out dx, al            ; transmitem la vga
  loop SetPal           ; loopenim 

;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

  xor ah, ah            ; asteptam o tasta
  int 16h

  lea dx, yay           ; mesajul de sfarsit !

Iesire:
  mov ax, 3             ; schimbam moul video (refacem) 80x25, standard dos
  int 10h

Eroare:
  mov ah, 09h         ; comentariu
  int 21h
  ret

Yay      db   'code by gyr',0ah, 0dh
         db   'Thanks 4 useing ! $'    
NoFile   db   'N-am gasit fisierul ! Imi trebuie ca argument un fisier PCX !$'

;PCX data±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
Manufacturer   db    ?         
PCXVersion     db    ?   
Encoding       db    ?   
BitsPerPixel   db    ? 
XMin           dw    ? 
YMin           dw    ?  
XMax           dw    ? 
YMax           dw    ? 
Hres           dw    ?
Vres           dw    ?
CrapPalette 	db 	48 dup (?)
Reserved1      db    ?        
                              
ColorPlanes 	db 	?			
BytesPerLine	dw 	?
PaletteType 	dw 	?
Reserved2		db 	58 dup (?)
ScrPal         db    64768 dup (?)     
;±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±

ends code
end start




