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Última revisiónAmbos lados, revisión siguiente | ||
cursos:ensamblador:compresion_rle [18-01-2024 10:00] – [Rutina optimizada por Z80user] sromero | cursos:ensamblador:compresion_rle [19-01-2024 12:34] – [Rutina descompresora] sromero | ||
---|---|---|---|
Línea 345: | 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 567: | 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 573: | 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 581: | Línea 581: | ||
[sromero@compiler: | [sromero@compiler: | ||
- | ; File created with BIN2CODE | + | ; File created with BIN2CODE |
BINDATASIZE | BINDATASIZE | ||
Línea 611: | 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), 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 | + | |
; 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 695: | Línea 651: | ||
\\ | \\ | ||
- | //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 725: | Línea 681: | ||
RLE_descompress: | RLE_descompress: | ||
rle_dec_loop: | rle_dec_loop: | ||
- | | + | |
- | | + | |
- | | + | |
rle_test_end: | rle_test_end: | ||
- | | + | |
- | | + | |
- | | + | |
rle_dec: | rle_dec: | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
rle_bucle: | rle_bucle: | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
Línea 751: | Línea 707: | ||
RLE_Comprimir: | RLE_Comprimir: | ||
rle_byte_1: | rle_byte_1: | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
rle_byte_2: | rle_byte_2: | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
rle_ultimo_byte: | rle_ultimo_byte: | ||
- | | + | |
- | | + | |
- | | + | |
rle_compress2: | rle_compress2: | ||
- | | + | |
- | | + | |
rle_compress: | rle_compress: | ||
- | | + | |
rle_repetido: | rle_repetido: | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
rle_distinto: | rle_distinto: | ||
- | | + | |
- | | + | |
rle_byte_simple: | rle_byte_simple: | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
rle_get_byte: | rle_get_byte: | ||
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||
Línea 849: | Línea 805: | ||
<code z80> | <code z80> | ||
- | | + | |
- | | + | |
- | | + | |
</ | </ | ||
Línea 868: | Línea 824: | ||
ORG 33500 | ORG 33500 | ||
- | | + | |
- | | + | |
- | | + | |
loop: | loop: | ||
- | | + | |
INCLUDE " | INCLUDE " | ||
Línea 932: | Línea 888: | ||
\\ | \\ | ||
**[ [[.: | **[ [[.: | ||
+ |