Diferencias
Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
cursos:ensamblador:compresion_rle [13-01-2024 11:09] – sromero | cursos:ensamblador:compresion_rle [19-01-2024 12:35] (actual) – [Programa de ejemplo de descompresión] sromero | ||
---|---|---|---|
Línea 298: | Línea 298: | ||
<code c> | <code c> | ||
// | // | ||
- | void RLE_decompress_C( unsigned char *src, unsigned char *dst, int length ) | + | void RLE_decompress_C(unsigned char *src, unsigned char *dst, int length) |
{ | { | ||
int i; | int i; | ||
unsigned char b1, b2, j; | unsigned char b1, b2, j; | ||
- | for( i=0; i< | + | for (i=0; i< |
{ | { | ||
b1 = *src++; | b1 = *src++; | ||
- | if( b1 > 192 ) // byte comprimido? | + | if (b1 > 192) |
{ | { | ||
b2 = *src++; | b2 = *src++; | ||
i++; | i++; | ||
- | for( j=0; j<(b1 & 63); j++ ) | + | for (j=0; j<(b1 & 63); j++) { |
*dst++ = b2; | *dst++ = b2; | ||
+ | } | ||
} | } | ||
- | else | + | |
*dst++ = b1; // no, es un byte de dato (escribe) | *dst++ = b1; // no, es un byte de dato (escribe) | ||
+ | | ||
} | } | ||
} | } | ||
Línea 343: | Línea 345: | ||
RLE_decompress: | RLE_decompress: | ||
- | RLE_dec_loop: | + | rle_dec_loop: |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | RLE_dec_loop2: | + | rle_dec_loop2: |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | RLE_dec_compressed: ; bucle para descompresión | + | rle_dec_compressed: ; bucle para descompresión |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | RLE_dec_loop3: | + | rle_dec_loop3: |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
; RLE no son correctos. Cuidado (mem-smashing). | ; RLE no son correctos. Cuidado (mem-smashing). | ||
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||
Línea 565: | Línea 567: | ||
\\ | \\ | ||
- | * **Método INCBIN**: Incluyendo el binario directamente en Pasmo con la directiva '' | + | * **Método INCBIN**: Incluyendo el binario directamente en Pasmo con la directiva '' |
Datos_Comprimidos: | Datos_Comprimidos: | ||
| | ||
Línea 571: | Línea 573: | ||
\\ | \\ | ||
- | * **Método BIN2CODE**: Convirtiendo los datos binarios a " | + | * **Método BIN2CODE**: Convirtiendo los datos binarios a " |
[sromero@compiler: | [sromero@compiler: | ||
BIN2CODE v1.0 By NoP of Compiler SoftWare | BIN2CODE v1.0 By NoP of Compiler SoftWare | ||
Línea 579: | Línea 581: | ||
[sromero@compiler: | [sromero@compiler: | ||
- | ; File created with BIN2CODE | + | ; File created with BIN2CODE |
BINDATASIZE | BINDATASIZE | ||
Línea 609: | Línea 611: | ||
; Cargamos los datos y preparamos nuestra rutina | ; Cargamos los datos y preparamos nuestra rutina | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
Wait_For_Keys_Pressed: | Wait_For_Keys_Pressed: | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | ;; | + | ; Aquí incluiremos el código |
- | ;; RLE_decompress | + | ;; --- RLE_decompress --- |
- | ;; Descomprime un bloque | + | |
- | ;; | + | |
- | ;; 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 | + | |
- | 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: | + | |
- | 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), | + | |
- | 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 | + | |
; Aquí viene nuestra pantalla comprimida con RLE. | ; Aquí viene nuestra pantalla comprimida con RLE. | ||
; Hay que darse cuenta de que está fuera de todo | ; Hay que darse cuenta de que está fuera de todo | ||
- | ; código ejecutable, es decir, el RET de la rutina | + | ; código ejecutable, es decir, el ret de la rutina |
- | ; principal y el RET de las subrutina de RLE_Decompress | + | ; principal y el ret de las subrutina de RLE_Decompress |
; hacen que nunca se llegue a este punto para ejecución. | ; hacen que nunca se llegue a este punto para ejecución. | ||
Línea 690: | Línea 648: | ||
===== Rutina optimizada por Z80user ===== | ===== Rutina optimizada por Z80user ===== | ||
- | El usuario Z80user, en los foros oficiales de Speccy.org, nos aporta una modificación de nuestra rutina original y una rutina compresora nativa: | + | El usuario Z80user, |
\\ | \\ | ||
- | //He leído el articulo del RLE, he reescrito el codigo de la rutina descompresora y he creado la rutina compresora. He realizado la compresion de la ROM de 48K, y posterior descompresión y salen identicas. He utilizado un pequeño truquito con el '' | + | //He leído el articulo del RLE, he reescrito el codigo de la rutina descompresora y he creado la rutina compresora. He realizado la compresion de la ROM de 48K, y posterior descompresión y salen identicas. He utilizado un pequeño truquito con el '' |
\\ | \\ | ||
Línea 706: | Línea 664: | ||
;; BC = tamaño de los datos a comprimir. | ;; BC = tamaño de los datos a comprimir. | ||
;; Salida | ;; Salida | ||
- | ;; AF,DE | + | ;; AF, DE |
;; HL = HL+longitud de los datos comprimidos | ;; HL = HL+longitud de los datos comprimidos | ||
;; IX = IX+BC | ;; IX = IX+BC | ||
Línea 715: | Línea 673: | ||
;; BC = tamaño de los datos a comprimir. | ;; BC = tamaño de los datos a comprimir. | ||
;; Salida | ;; Salida | ||
- | ;; AF,DE | + | ;; AF, DE |
;; HL = HL+longitud de los datos descomprimidos | ;; HL = HL+longitud de los datos descomprimidos | ||
;; DE = DE+BC | ;; DE = DE+BC | ||
Línea 721: | Línea 679: | ||
// | // | ||
- | RLE_descompress | + | RLE_descompress: |
- | RLE_dec_loop | + | rle_dec_loop: |
- | | + | |
- | | + | |
- | | + | |
- | test_end | + | rle_test_end: |
- | | + | ldi |
- | | + | |
- | RLE_dec | + | |
- | | + | rle_dec: |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | bucle | + | |
- | | + | rle_bucle: |
- | | + | ld (de), a ; \ |
- | | + | |
- | | + | |
- | | + | |
+ | | ||
+ | | ||
// | // | ||
- | RLE_Comprimir | + | RLE_Comprimir: |
- | byte_1 | + | rle_byte_1: |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | byte_2 | + | rle_byte_2: |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | ultimo_byte | + | rle_ultimo_byte: |
- | | + | ld (hl), e ; escribir el ultimo byte |
- | | + | |
- | RLE_compress2 | + | |
- | | + | rle_compress2: |
- | | + | |
- | RLE_compress | + | |
- | | + | rle_compress: |
- | RLE_Repetido | + | |
- | | + | rle_repetido: |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | RLE_distinto | + | |
- | | + | rle_distinto: |
- | | + | |
- | byte_simple | + | |
- | | + | rle_byte_simple: |
- | | + | |
- | | + | |
- | | + | |
- | get_byte | + | |
- | | + | rle_get_byte: |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
+ | | ||
</ | </ | ||
Línea 844: | Línea 805: | ||
<code z80> | <code z80> | ||
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||
Línea 863: | Línea 824: | ||
ORG 33500 | ORG 33500 | ||
- | | + | |
- | | + | |
- | | + | |
loop: | loop: | ||
- | | + | |
INCLUDE " | INCLUDE " | ||
Línea 927: | Línea 888: | ||
\\ | \\ | ||
**[ [[.: | **[ [[.: | ||
+ |