Ejemplos con aPLib para C64

PET, VIC-20, MAX Machine, 64, 64x, SX-64, 16, Plus/4, 128, 65 ...
Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2004
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 3 veces

Re: Ejemplos con aPLib para C64

Mensajepor antoniovillena » 23 Oct 2017, 18:36

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.
Adjuntos
depack.zip
(31.6 KiB) Descargado 5 veces

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1043
Registrado: 07 Nov 2009, 11:38
Ubicación: Madrid
Gracias dadas: 2 veces
Gracias recibidas: 67 veces

Re: Ejemplos con aPLib para C64

Mensajepor BlackHole » 24 Oct 2017, 00:23

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.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2004
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 3 veces

Re: Ejemplos con aPLib para C64

Mensajepor antoniovillena » 24 Oct 2017, 01:54

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.
Adjuntos
depack.zip
(16.89 KiB) Descargado 6 veces

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2004
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 3 veces

Re: Ejemplos con aPLib para C64

Mensajepor antoniovillena » 25 Oct 2017, 20:26

Ya he terminado mi propio descompresor basado en ZX7

https://github.com/antoniovillena/c64f

Es 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.

Avatar de Usuario
Namek
MSX Turbo R
MSX Turbo R
Mensajes: 506
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 5 veces
Gracias recibidas: 14 veces

Re: Ejemplos con aPLib para C64

Mensajepor Namek » 26 Oct 2017, 12:58

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.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2004
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 3 veces

Re: Ejemplos con aPLib para C64

Mensajepor antoniovillena » 26 Oct 2017, 14:09

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.

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1043
Registrado: 07 Nov 2009, 11:38
Ubicación: Madrid
Gracias dadas: 2 veces
Gracias recibidas: 67 veces

Re: Ejemplos con aPLib para C64

Mensajepor BlackHole » 27 Oct 2017, 00:17

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.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2004
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 3 veces

Re: Ejemplos con aPLib para C64

Mensajepor antoniovillena » 27 Oct 2017, 01:55

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

Avatar de Usuario
explorer
Amstrad PCW 8256
Amstrad PCW 8256
Mensajes: 158
Registrado: 11 May 2014, 17:10
Sistema Favorito: Atari ST
primer_sistema: Atari 800XL/600XL
consola_favorita: Atari 2600
Primera consola: Atari 2600
Ubicación: Valladolid, España
Gracias recibidas: 32 veces
Contactar:

Re: Ejemplos con aPLib para C64

Mensajepor explorer » 27 Oct 2017, 21:13

Hola. ¿Tienes el código del compresor? ¿O solo has trabajado el descompresor?

BlackHole
Amiga 1200
Amiga 1200
Mensajes: 1043
Registrado: 07 Nov 2009, 11:38
Ubicación: Madrid
Gracias dadas: 2 veces
Gracias recibidas: 67 veces

Re: Ejemplos con aPLib para C64

Mensajepor BlackHole » 27 Oct 2017, 21:22

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


Volver a “Commodore”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado