Página 2 de 10
Re: Ejemplos con aPLib para C64
Publicado: 23 Oct 2017, 18:36
por antoniovillena
BlackHole escribió:VICE lo hace automáticamente. Entras en el monitor con ALT+M, usas "sw reset" para inicializar el cronómetro (stopwatch) y en cada instrucción te muestra el contador de ciclos. Puedes poner puntos de ruptura permanentes con "break" o de un solo uso con "until".
Todavía no he programado nada, pero he hecho pruebas tanto con tu código como con el del repositorio de svendahl y tu código es ligeramente más lento: 103383 ciclos frente a los 91795 ciclos del código de svendahl para un ejemplo de texto de 1k. Seguramente tengas algún cuello de botella (rutina getbit o algo que se ejecute muy frecuentemente). Cuando encuentres el problema tu rutina será más rápida, ya que la diferencia es pequeña. Adjunto ficheros. He usado el ensamblador 64tass y el emulador WinVice para las pruebas.
Re: Ejemplos con aPLib para C64
Publicado: 24 Oct 2017, 00:23
por BlackHole
No tengo tiempo de probarlo ahora, tengo médico mañana por la mañana así que me voy a acostar pronto.
Intenta tú si puedes con algo más grande, datos de un juego típico que sean 40-60 KB y que tarde 5-6 millones de ciclos.
Re: Ejemplos con aPLib para C64
Publicado: 24 Oct 2017, 01:54
por antoniovillena
He probado con un fichero de 32K. También he hecho algunas optimizaciones en el otro descompresor. Los resultados son estos:
Tu descompresor: 2981034 ciclos
El otro optimizado: 1991448 ciclos
Más o menos es 1/3 más rápido el otro descompresor optimizado. Adjunto ficheros.
Re: Ejemplos con aPLib para C64
Publicado: 25 Oct 2017, 20:26
por antoniovillena
Ya he terminado mi propio descompresor basado en ZX7
https://github.com/antoniovillena/c64fEs un 33% más rápido que la versión más rápida de Aplib. En un 6502 apenas hay margen para optimizar en velocidad, aunque el otras plataformas como 68000 es un 200-300% más rápido.
Re: Ejemplos con aPLib para C64
Publicado: 26 Oct 2017, 12:58
por Namek
Estupendo trabajo, enhorabuena!!! En cuanto se queda la rutina descompresora? Es este compresor mejor que EXOMIZER? Cual es el mejor compresor en ratio de compresion para Spectrum?
Gracias y saludos.
Re: Ejemplos con aPLib para C64
Publicado: 26 Oct 2017, 14:09
por antoniovillena
No. El que mejor ratio de compresión da es exomizer. Aquí pongo una comparativa de los 3 (ficheros en bytes).
Código: Seleccionar todo
Size _____Exomizer aPLib zx7
lena1k 812 872 900
lena16k 13581 14635 14677
lena32k 28019 29991 30227
alice1k 613 617 627
alice16k 7266 7659 8161
alice32k 13461 14473 16056
128rom1k 884 889 923
128rom16k 12260 12434 12808
128rom32k 24415 24820 26541
En cuanto a comparación de velocidad, el benchmark bueno (la versión más rápida en de cada algoritmo) lo tengo en Z80. En ciclos es el siguiente:
Código: Seleccionar todo
deexov4 aPLib zx7bf2
--------------------------------------
lena1k 303436 176642 81040
lena16k 4407913 2961621 1462568
lena32k 8443253 5820921 2803116
alice1k 274111 136224 73459
alice16k 2973592 2143122 1328886
alice32k 5378511 4189855 2654236
128rom1k 249124 131667 62000
128rom16k 3571407 2292945 1180569
128rom32k 7355277 4583902 2381847
Como ves, el aPLib está a medio camino entre exomizer y zx7. Mayor ratio significa menor velocidad y viceversa. En 6502 las diferencias de velocidad son menores debido a la propia arquitectura, por lo que es más interesante el exomizer que en otras plataformas.
En cuanto a la rutina descompresora (c64f, que es el port del zx7 para 6502) he sacado 2 versiones: la rápida ocupa 266 bytes y la lenta 147 bytes. Es bastante. El culpable es el 6502 que tiene muy pocos registros y hay que hacerlo todo tirando de variables en página cero. Para que te hagas una idea, el mismo algoritmo en un 68000 ocupa 58 bytes.
Re: Ejemplos con aPLib para C64
Publicado: 27 Oct 2017, 00:17
por BlackHole
Hola. Por problemas de salud y por calendario de citas médicas, no he tenido tiempo a revisar la rutina de aPLib que dejaste hace 3 días. Ando haciendo mi crack (por llamarlo de alguna forma) del juego Rambo de Ocean, que es un juego que ocupa casi toda la memoria ($0334-$FF00) y es complicado moverse con él. Cuando pueda intentaré ensamblar tu código a ver cómo se comporta.
Re: Ejemplos con aPLib para C64
Publicado: 27 Oct 2017, 01:55
por antoniovillena
No te preocupes. Tu código me despertó la curiosidad por el 6502 y a raíz de ahí hice el port del ZX7. Y le metí mano al descompresor de Sven-Åke porque era más propenso a hacer optimizaciones en él. Estoy seguro que ambos se pueden combinar para conseguir una rutina aún más rápida. Pero no tengas prisa en meterle mano. Dejo lo último que tengo aquí:
Código: Seleccionar todo
apd_src = $f4
apd_bitbuffer = $f6
apd_lwm = $f7
apd_length = $f8
apd_offset = $fa
apd_source = $fc
apd_dest = $fe
daplib: lda #$80
sta apd_bitbuffer
ldy #0
sty apd_length+1
read_lit: #getbyte
write_lit: sta (apd_dest), y
inc apd_dest
bne clear_lwm
inc apd_dest+1
clear_lwm: sty apd_lwm
read_flag: #mgetbitd
bcc read_lit
#mgetbitd
bcc large_match
#mgetbitd
bcc short_match
lda #%11100000
mini_match: #mgetbit
rol
bcs mini_match
beq write_lit
sbc apd_dest
eor #%11111111
sta apd_source
tya
sbc apd_dest+1
eor #%11111111
sta apd_source+1
lda (apd_source), y
bne write_lit
apd_end: rts
short_match:#getbyte
lsr
beq apd_end
sta apd_offset
sty apd_offset+1
lda #1
rol
sta apd_length
jmp set_lwm
large_match:#getgamma
cmp #2
bne offset_mat
cpy apd_lwm
bne offset_mat
#getgamma
bcc set_lwm
offset_mat: lsr apd_lwm
sbc #2
sta apd_offset+1
#getbyte
sta apd_offset
#getgamma
lda apd_offset+1
bne al_chkh
bit apd_offset
bmi set_lwm
lda #2
bcc al_add
al_chkh: cmp #>1280
bcc set_lwm
cmp #>32000
lda #1
al_add: adc apd_length
sta apd_length
bcc set_lwm
inc apd_length+1
set_lwm: lda #1
sta apd_lwm
sec
lda apd_dest
sbc apd_offset
sta apd_source
lda apd_dest+1
sbc apd_offset+1
sta apd_source+1
lda apd_length+1
beq cm_skip
cm_loop1: lda (apd_source), y
sta (apd_dest), y
iny
bne cm_loop1
inc apd_source+1
inc apd_dest+1
dec apd_length+1
bne cm_loop1
cm_skip: ldx apd_length
beq cm_end
cm_loop2: lda (apd_source), y
sta (apd_dest), y
iny
dex
bne cm_loop2
clc
tya
ldy #0
adc apd_dest
sta apd_dest
bcc cm_end
inc apd_dest+1
cm_end: jmp read_flag
getgamma: .macro
sty apd_length+1
lda #1
getgamma1: #mgetbit
rol
rol apd_length+1
#mgetbit
bcs getgamma1
sta apd_length
.endm
getbyte .macro
lda (apd_src), Y
inc apd_src
bne getbyte1
inc apd_src+1
getbyte1: .endm
mgetbit .macro
asl apd_bitbuffer
bne m_getbit1
tax
#getbyte
rol
sta apd_bitbuffer
txa
m_getbit1: .endm
mgetbitd .macro
asl apd_bitbuffer
bne m_getbit2
#getbyte
rol
sta apd_bitbuffer
m_getbit2: .endm
Re: Ejemplos con aPLib para C64
Publicado: 27 Oct 2017, 21:13
por explorer
Hola. ¿Tienes el código del compresor? ¿O solo has trabajado el descompresor?
Re: Ejemplos con aPLib para C64
Publicado: 27 Oct 2017, 21:22
por BlackHole
La biblioteca de compresión es solo para PC y su código fuente no está disponible, solo rutinas de descompresión para algunos sistemas.
Están disponibles en la página oficial
http://ibsensoftware.com/products_aPLib.html