Karoshi MSX Community
18 de Agosto de 2017, 10:33:21 pm *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias:
 
  Inicio Ayuda Buscar Calendario Ingresar Registrarse  
  Mostrar Mensajes
Páginas: [1] 2 3 ... 6
1  Development Boards (English) / Development / Re:Help with ASM code (DPLAY source) : 07 de Marzo de 2016, 08:09:50 am
I think it has incomplete source code. Some functions are not defined:

Código:
$ sjasm DPLAY.ASM
Sjasm Z80 Assembler v0.42c - www.xl2s.tk
DPLAY.ASM(1374) : Label not found: AniCmd
DRIVER.ASM(78) : Label not found: _var6
DRIVER.ASM(192) : Label not found: _copyIntF
DRIVER.ASM(279) : Label not found: _DoPlay1
DRIVER.ASM(309) : Label not found: AniCmd
DRIVER.ASM(834) : Label not found: AniCmd
DPLAY.ASM(1588) : Label not found: calsub

$ grep DoPlay1 *.ASM
DRIVER.ASM: jr nz,_DoPlay1

$ grep calsub *.ASM
DPLAY.ASM: call calsub
2  Foros de Desarrollo (Español) / Desarrollo / Re:sacar a pantalla por lineas : 06 de Diciembre de 2015, 02:29:07 pm
Si lo he entendido bien lo único que neceitas es añadir una pausa entre linea y linea. Métele un buen puñado de halt al bucle después de escribir a vram.
3  Foros de Desarrollo (Español) / Desarrollo / Re:¿Mejor forma de restaurar background después de un COPY? : 26 de Enero de 2015, 09:34:02 am
A lo mejor no es el caso pero cuando restaures el fondo de la otra página has de tener en cuenta que las coordenadas no son las actuales. Son las del frame anterior.
4  Resources (English) / Snippets / lz77 compression : 15 de Enero de 2015, 04:36:05 pm
I have written z80 code to decompress using lz77 algorithm (with sliding window of 256 bytes). Maybe it is not the best compressor for msx but it is fast, small, easy and only needs 256 bytes of ram to decompress (512 bytes for vram). Other algorithms has better compression ratios but they only work on ram (no vram).

It is perfect to decompress a full screen 5/8 screen to vram.

python compressor
Código:
import sys

def compress(values):
    out = []

    def equal_len(left, right):
        length = 0
        while left < right and right < len(values) and values[left] == values[right] and length < 255:
            length += 1
            left += 1
            right += 1
        return length

    def find_back_offset(current_index):
        max_back_offset = 0
        max_back_len = 0
        i = max(0,current_index-255)
        while i < current_index:
            back_len = equal_len(i, current_index)
            if back_len > max_back_len:
                max_back_len = back_len
                max_back_offset = current_index-i
            i += 1
        return (max_back_offset, max_back_len)

    i = 0
    size = 0
    while i < len(values):
        back_offset, back_len = find_back_offset(i)
        i += back_len
        next_char = values[i] if i < len(values) else 0
        if back_len==0:
            out.extend([back_len, next_char])
        else:
            out.extend([back_len, back_offset, next_char])
        i += 1
        size += 1
        sys.stderr.write("compressing... %d%%\t\t\r" % (i/float(len(values))*100))
        sys.stderr.flush()

    sys.stderr.write("original %s bytes -> final %s bytes\n" % (len(values), len(out)))
   
    return [size&0xff,size>>8] + out

def uncompress(data):
    out = []

    i = 2
    while i < len(data):
        back_len = data[i]
        i += 1
        if back_len != 0:
            back_offset = len(out)-data[i]
            i += 1
            while back_len > 0:
                out.append(out[back_offset])
                back_offset += 1
                back_len -= 1
        out.append(data[i])
        i += 1
   
    return out

if __name__ == "__main__":
    if sys.argv[1] == "c":
        with open(sys.argv[2], "rb") as f:
            sys.stdout.buffer.write(bytes(compress(f.read())))
    elif sys.argv[1] == "d":
        with open(sys.argv[2], "rb") as f:
            sys.stdout.buffer.write(bytes(uncompress(f.read())))

decompress from ram to ram
Código:
    ;; IX=ptr to compressed data
decompress2ram:
    ;; bc=token count
    ld c,(ix+0)
    ld b,(ix+1)
    inc ix
    inc ix

    ;; de=dest
    ld de,ram256bytes

    ;; uncompress loop
loop1:
    ;; a=len
    ld a,(ix+0)
    inc ix
    or a
    jr z,skip

    push bc
    ;; hl=offset
    push de
    pop hl
    ld c,(ix+0)                  ; back offset
    ld b,0
    sbc hl bc
    inc ix
    ;; copy from back offset
    ld c,a
    ldir
    pop bc
skip:

    ;; a=nextchar
    ld a,(ix+0)

    ;; write nextchar
    ld (de),a
    inc de
    inc ix

    ;; end?
    dec bc
    ld a,c
    or b
    jr nz,loop1

    ret

decompress from ram to vram
Código:
    ;; IX=ptr to compressed data
decompress2vram:
    ;; bc=token count
    ld c,(ix+0)
    ld b,(ix+1)
    inc ix
    inc ix

    ;; de=dest (256 bytes align)
    ld hl,ram512bytes
    ld de,256
    add hl,de
    ld l,0
    ex de,hl

    ;; uncompress loop
loop1:
    ;; a=len
    ld a,(ix+0)
    inc ix
    or a
    jr z,skip

    push bc
    ld b,a
    ;; hl=offset = (de-backoffset) mod 256
    ld c,(ix+0)                  ; back offset
    ld a,e
    sub c
    ld l,a
    ld h,d
    inc ix
    ;; copy from back offset
loop2:
    ld a,(hl)
    inc l                     ; hl=hl mod 256
    ld (de),a
    inc e                     ; de=de mod 25
    out (0x98),a
    djnz loop2
    pop bc
skip:

    ;; a=nextchar
    ld a,(ix+0)

    ;; write nextchar
    out (0x98),a
    ld (de),a
    inc e                          ; de=de mod 256
    inc ix

    ;; end?
    dec bc
    ld a c
    or b
    jr nz,loop1

    ret
5  Foros de Desarrollo (Español) / Desarrollo / Re:Nuevo assembler js80 : 29 de Diciembre de 2013, 10:26:09 am
¿Y para cuando un DesEnsamblador...? XD  Roll Eyes Huh

El ida pro soporta z80 si mal no recuerdo.
6  Foros de Desarrollo (Español) / Desarrollo / Re:Nuevo assembler js80 : 05 de Noviembre de 2013, 02:28:30 pm
Ahora mismo no soporta "insertarlo" en una web. Pero se podría adaptar facilmente.

Node no es solamente para el lado servidor. Es un lenguaje completo. A mi personalmente javascript me gusta bastante, es pequeño, potente, rápido y multiplataforma. Podría haberlo hecho en C pero habría tardado más del doble y no supondría ninguna ventaja.

Además tengo en mente añadir macros con javascript. Así se podría añadir utilidades como un conversor automático de imagen a sprite y simplificar el desarrollo para msx.
7  Foros de Desarrollo (Español) / Desarrollo / Nuevo assembler js80 : 05 de Noviembre de 2013, 11:35:38 am
Como tengo tanto tiempo libre (que más quisiera yo). Me he liado a hacer un assembler para z80 en javascript usando el conocido nodejs.

De todos los ensambladores que hay pululando por ahí pocos están en desarrollo activo y pienso que se podrían hacer cosas muy interesantes.

Está en pañales, con lo que seguramente hayan bugs. Pero nada que no se pueda solucionar fácilmente. La documentación es bastante escasa pero ya iré mejorandola. Mi idea es añadir funcionalidad añadiendo nuevas funciones, librerías e incluso algún optimizador simple de código.

Para probarlo instalar nodejs y hacer un 'npm install js80 -g'. Se instalarán el modulo js80 y el comando js80asm.

Acepto sugerencias y cartas de amenzas de muerte.

Código fuente: https://github.com/samsaga2/js80


8  Foros de Desarrollo (Español) / Desarrollo / Re: sprites multiplexer para msx 2 : 29 de Abril de 2013, 02:21:28 pm
Pues uso los sprites al máximo, 32 sprites de colores diferentes y usando el bit para hacer xor de colores. Ahora en la interrupción estoy movimendo en cada frame 32 sprites más un volcado de pantalla, en total unos 768bytes. Sería viable añadir también volcar la tabla de colores en cada interrupción (512bytes más)? Me parece demasiada vram para una interrupción.
9  Foros de Desarrollo (Español) / Desarrollo / Re: sprites multiplexer para msx 2 : 24 de Abril de 2013, 08:37:50 am
Veo que está complicado el tema. El problema es que mi juego es casi horizontal y ocurre a menudo que haya más de ocho sprites en linia. Intenté usar el vdp status#0 que indica el sprite "sobrante" (mi idea era no pintarlo en el siguiente frame) pero no sé porque no acabo de leer bien el sprite problematico.
10  Foros de Desarrollo (Español) / Desarrollo / sprites multiplexer para msx 2 : 20 de Abril de 2013, 07:47:31 am
A ver si podeis ayudarme. Para hacer el parpadeo de los sprites lo que hacía en msx1 era rotarlos. Volcar primero sprites 0 1 2 3 4..., en el siguiente frame sprites 1 2 3 4 ... 0, luego 2 3 4 ... 0 1 etc... Mi problema es que en msx 2 no es tan fácil porque tambíén hay que mover la tabla de colores de sprites con lo que es un gasto innecesario. ¿Como puedo implementar el multiplexer de sprites en msx 2?
11  Resources (English) / Snippets / Re: Linear trajectory : 12 de Julio de 2012, 09:25:06 am
Estoy probando este código para implementar balas y estoy viendo que sólo funciona cuando la trayectoria de la bala es hacia la derecha y abajo. Si intentas disparar de derecha a izquierda (por ejemplo) no funciona bien. El problema viene cuando calcula la diferencia de la posición incial y la final (sbc hl,de) que no tiene en cuenta el signo. Mi solución ha sido reemplazar esa resta por:

Código:
    ld a,h
    sub d
    jp nc,.noy
    neg
.noy
    ld h,a

    ld a,l
    sub e
    jp nc,.nox
    neg
.nox
    ld l,a

Ahora la bala apunta bien independientemente de la dirección a disparar.

Mi siguiente problema es que la velocidad de la bala varia bastante. A veces el disparo es muy lento.

Por lo demás agradecería una ayudita para entender para que sirve el cálculo del modulo~1.
12  Foros de Desarrollo (Español) / Informacion General / Re: Msx Top Secret : 04 de Julio de 2012, 02:23:58 pm
Mola, menudo curro.
13  Foros de Desarrollo (Español) / Desarrollo / Re: Rincón del novato en ASM : 06 de Junio de 2012, 04:45:59 pm
Ahora que comentais sobre 50Hz y 60Hz...

¿Si fuerzo a 50hz cambiando la vdp puedo tener algún problema? ¿Que no se vea en algún monitor o algo?
14  Resources (English) / Snippets / Send text to console from openMsx emulator : 05 de Junio de 2012, 04:33:04 pm
OpenMSX has a great debugger but sometimes it's better printing messages to the shell.

Sjasm code:
Código:
DEBUG equ 1

macro dbg msg
if DEBUG
    push af
    push bc
    push hl
    ld b,.next-.text ; string size
    ld hl,.text
    ld a,0x23
    out (0x2e),a ; multibyte
    ld c,0x2f
    otir ; print chars
    jr .next
.text db msg, 13, 10
.next
    pop hl
    pop bc
    pop af
endif
endmacro
15  Foros de Desarrollo (Español) / Desarrollo / Re: Comparar números de 16 bits con signo en asm : 16 de Mayo de 2012, 10:35:30 am
Perfecto gracias   Cheesy

Si los números están en el rango -16834 a 16383 se puede usar esto:
Código:
or a
sbc hl,de
jp m,aa1   ; Salta si HL < DE
jp p,aa1   ; Salta si HL >= DE
Si los números usan el rango completo de -32768 a 32767 se puede usar esto:
Código:
ld a,h
xor $80
ld h,a
ld a,d
xor $80
ld d,a
sbc hl,de
jp c,aa1    ; Salta si HL < DE
jp nc,aa1   ; Salta si HL >= DE
Espero que te sea de utilidad

Páginas: [1] 2 3 ... 6
Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.21 | SMF © 2013, Simple Machines XHTML 1.0 válido! CSS válido!