03-09-2010, 03:30 PM
Unchunk: This is the uncompression routine by S.Romero (I think, but not sure) posted in the Speccy.org wiki:
Code:
SUB unchunk (source as uinteger,display as uinteger,size as uinteger)
POKE uinteger @datosch,source: POKE uinteger @datosch+2,display: POKE uinteger @datosch+4,size
gosub chunk
END SUB
datosch:
ASM
sourcech: defw 0
displaych: defw 0
sizech: defw 0
END ASM
chunk:
ASM
; Prueba de descompresion RLE
; Desempaquetamos un SCR comprimido con RLE sobre la pantalla
;ORG 32768
; Cargamos los datos y preparamos nuestra rutina
LD HL, (sourcech)
LD DE, (displaych)
LD BC, (sizech)
;CALL RLE_decompress
;;
;; RLE_decompress
;; Descomprime un bloque de datos RLE de memoria a memoria.
;;
;; Entrada a la rutina:
;;
;; HL = dirección origen de los datos RLE.
;; DE = destino donde descomprimir los datos.
;; BC = tamaño de los datos comprimidos.
;;
RLE_decompress:
RLE_dec_loop:
ld a,(hl) ; leemos un byte
cp 192
jp nc, RLE_dec_compressed ; si byte > 192 = está comprimido
ld (de), a ; si no está comprimido, escribirlo
inc de
inc hl
dec bc
RLE_dec_loop2:
ld a,b
or c
jr nz, RLE_dec_loop
ret ; miramos si hemos acabado
RLE_dec_compressed: ; bucle para descompresión
push bc
and 63 ; cogemos el numero de repeticiones
ld b, a ; lo salvamos en B
inc hl ; y leemos otro byte (dato a repetir)
ld a, (hl)
RLE_dec_loop3:
ld (de),a ; bucle de escritura del dato B veces
inc de
djnz RLE_dec_loop3
inc hl
pop bc ; recuperamos BC
dec bc ; Este DEC BC puede hacer BC=0 si los datos
; RLE no correctos. Cuidado (mem-smashing).
dec bc
jr RLE_dec_loop2
ret
END ASM