Muy interesante, veo que mi intuición iba por buen camino
Y ya para rizar el rizo, si queremos también la máxima compresión y hay espacio en la ram, quizás se pueda aplicar antes alguna compresión basada en Lempel-Ziv, porque los datos RLE a su vez suelen ser bastantes comprimibles con ese sistema.
Si que es muy interesante!
. Con la última optimización usando la pila, por lo que he visto una compresión del 50% aprox. compensa en espacio y en velocidad. Depende de como estén ordenados los datos puede ser incluso mas rápido que OUTI a secas y por supuesto mas rápido si es OUTI+NOP.
La compresión es muy sencilla para permitir la velocidad en la descompresión a VRAM pero si hay grandes areas continuas puede ser bastante efectivo.
Os dejo el código por si quieres trastear o aorante quiere mirarlo para su uso:
* Hay que añadir un bitmap en screen 3 (&H0600 bytes)
.page 1
.ROM
.start BOOT
.DB "RLE2VDP"
VRAMFRM EQU $0000
DATA_PORT EQU $0098 ;PUEDE VARIARSE
REG_PORT EQU $0099 ;PUEDE VARIARSE
IMAGE_RLE EQU $8800
STACK EQU $87F0
INTVECTAB EQU $FC00 ;TABLA -$101
HOOK EQU $FDFD
.INCLUDE "ASM/SYSVAR.ASM"
.INCLUDE "ASM/KEYBOARD.ASM"
BOOT: EI
CALL $0075
DI
;COMPRESION RLE 127
LD HL,IMAGE1
LD DE,IMAGE_RLE
COMPRLEBC1: LD BC,$0000
LD A,[HL]
AND A
JR Z,COMPRLEND
COMPRLEBC0: INC HL ;CPI PARA OPTIMIZAR
LD C,[HL]
BIT 7,B
JR Z,COMPRLEJP3
LD B,0
DEC HL
JR COMPRLEJP2
COMPRLEJP3: INC B
CP C
JR Z,COMPRLEBC0
COMPRLEJP2: LD [DE],A ;GUARDA DATO
INC DE
LD A,B
RLCA ;DUPLICA
NEG ;NEGATIVO
LD [DE],A ;GUARDA Nº REPETICIONES EN NEGATIVO
INC DE
JR COMPRLEBC1
COMPRLEND: LD [DE],A
LD HL,RAWDATA
;CONFIGURA GANCHO INTERRUPCIONES IM2
LD HL,RLEDATA
LD [HOOK+1],HL
CALL INSTALLISR
I_LOOP: JR I_LOOP
INSTALLISR: DI
LD HL,INTVECTAB
LD E,L
LD D,H
INC DE
LD [HL],HOOK>>8
LD BC,256
LDIR
LD A,$C3
LD [HOOK],A
LD A,INTVECTAB>>8
LD I,A
IM 2
EI
RET
;________________________________________________
RLEDATA: IN A,[REG_PORT]
LD A,44
LD B,7
CALL W_REGVDP
LD HL,VRAMFRM
CALL INIVPOKE
CALL RLEDATA_OUT
LD A,11
LD B,7
CALL W_REGVDP
;BARRA ESPACIADORA
;OUT: FLAG C
LD C,8
CALL K_GET_LINE
RRA
JR NC,NO_SPACE1
LD HL,RAWDATA
LD [HOOK+1],HL
LD A,$C3
LD [HOOK],A
NO_SPACE1: EI
RETI
RLEDATA_OUT: LD [STACK],SP
LD SP,IMAGE_RLE
POP BC
LD A,C
LD L,B
LD H,$44
JP [HL]
.ORG $4400
REPT 128
OUT [DATA_PORT],A
ENDR
POP BC
LD L,B
LD A,C
AND A
JP Z,RLEDATA_END
JP [HL]
RLEDATA_END: LD SP,[STACK]
RET
RAWDATA: IN A,[REG_PORT]
LD A,44
LD B,7
CALL W_REGVDP
LD HL,VRAMFRM
CALL INIVPOKE
LD HL,IMAGE1
LD C,DATA_PORT
CALL REPOUTI256 ;256 OTIR'S
CALL REPOUTI256 ;256 OTIR'S
CALL REPOUTI256 ;256 OTIR'S
CALL REPOUTI256 ;256 OTIR'S
CALL REPOUTI256 ;256 OTIR'S
CALL REPOUTI256 ;256 OTIR'S
LD A,11
LD B,7
CALL W_REGVDP
;BARRA ESPACIADORA
;OUT: FLAG C
LD C,8
CALL K_GET_LINE
RRA
JR NC,NO_SPACE2
LD HL,RLEDATA
LD [HOOK+1],HL
LD A,$C3
LD [HOOK],A
NO_SPACE2: EI
RETI
REPOUTI256:
REPT 256
OUTI
ENDR
RET
W_REGVDP: OUT (REG_PORT),A
LD A,B
OR 10000000B
OUT (REG_PORT),A
RET
INIVPOKE: LD A,L
OUT [REG_PORT],A
LD A,H
OR 01000000B
OUT [REG_PORT],A
RET
IMAGE1: .INCBIN "IMAGE1.SC3"
IMAGE1_OEF: DB 0