in-line assembler en z88dk

Todo sobre la creación, diseño y programación de nuevo software para
nuestro Spectrum

Moderador: Sir Cilve Sinclair

Responder
zilogz80a
rst 0
Mensajes: 8
Registrado: Lun May 20, 2013 7:35 pm

in-line assembler en z88dk

Mensaje por zilogz80a » Lun May 20, 2013 9:06 pm

Hola amigos, soy relativamente nuevo en este lugar, digo relativamente porque cuando años antes existía la registración automática fui uno de los usuarios del foro.

bueno espero que este sea el lugar indicado para esta pregunta.

me gustaría saber si la sintaxis del assembler que debo usar en el in-line asm dentro de c en z88dk cuando quiero desarrollar para zx spectrum o para timex sinclair 2068 es la sintaxis del assembler que se enseña en "por ejemplo" el libro de código máquina de microhobby o si es un asm con sintaxis genérica que debo aprender de algún manual genérico sobre z80?

esa es toda mi duda, he leído la documentación de z88dk pero parece que no doy con el apartado correcto, espero, repito este sea el lugar indicado para publicar esta duda, desde ya les estoy muy agradecido por vuestro tiempo y dedicación a este tema.

saludos!

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: in-line assembler en z88dk

Mensaje por na_th_an » Mar May 21, 2013 8:38 am

El ensamblador en linea de z88dk no tiene nada especial, salvo que las etiquetas deben empezar con un punto:

Código: Seleccionar todo

void cortina () {
    #asm
        ;; Antes que nada vamos a limpiar el PAPER de toda la pantalla
        ;; para que no queden artefactos feos
       
        ld  de, 22528           ; Apuntamos con DE a la zona de atributos
        ld  b,  3               ; Procesamos 3 tercios
    .clearb1
        push bc
       
        ld  b, 255              ; Procesamos los 256 atributos de cada tercio
    .clearb2
   
        ld  a, (de)             ; Nos traemos un atributo
        and 199                 ; Le hacemos la máscara 11000111 y dejamos PAPER a 0
        ld  (de), a             ; Y lo volvemos a poner
       
        inc de                  ; Siguiente atributo
   
        djnz clearb2
       
        pop bc
        djnz clearb1
       
        ;; Y ahora el código original que escribí para UWOL:   
   
        ld  a,  8
   
    .repitatodo
        ld  c,  a           ; Salvamos el contador de "repitatodo" en 'c'
   
        ld  hl, 16384
        ld  a,  12
   
    .bucle
        ld  b,  a           ; Salvamos el contador de "bucle" en 'b'
        ld  a,  255
   
    .bucle1
        sla (hl)
        inc hl
        dec a
        jr  nz, bucle1
           
        ld  a,  255
    .bucle2
        srl (hl)
        inc hl
        dec a
        jr  nz, bucle2
           
        ld  a,  b           ; Restituimos el contador de "bucle" a 'a'
        dec a
        jr  nz, bucle
   
        ld  a,  c           ; Restituimos el contador de "repitatodo" a 'a'
        dec a
        jr  nz, repitatodo
    #endasm
    // Estoy llorando
}


Puedes referenciar directamente variables de C si las declaras como extern y globales y usas un _ en la parte de ensamblador:

Código: Seleccionar todo

extern unsigned int asm_int [1];
extern unsigned int seed [1];

#asm
._asm_int
    defw 0
._seed   
    defw 0
#endasm

void srand (unsigned int new_seed) {
    seed [0] = new_seed;   
}

unsigned char rand () {
    unsigned char res;
   
    #asm
        .rand16
            ld  hl, _seed
            ld  a, (hl)
            ld  e, a
            inc hl
            ld  a, (hl)
            ld  d, a
           
            ;; Ahora DE = [SEED]
                       
            ld  a,  d
            ld  h,  e
            ld  l,  253
            or  a
            sbc hl, de
            sbc a,  0
            sbc hl, de
            ld  d,  0
            sbc a,  d
            ld  e,  a
            sbc hl, de
            jr  nc, nextrand
            inc hl
        .nextrand
            ld  d,  h
            ld  e,  l
            ld  hl, _seed
            ld  a,  e
            ld  (hl), a
            inc hl
            ld  a,  d
            ld  (hl), a
           
            ;; Ahora [SEED] = HL
       
            ld  hl, _asm_int
            ld  a,  e   
            ld  (hl), a
            inc hl
            ld  a,  d
            ld  (hl), a
           
            ;; Ahora [ASM_INT] = HL
    #endasm
   
    res = asm_int [0];

    return res;
}

zilogz80a
rst 0
Mensajes: 8
Registrado: Lun May 20, 2013 7:35 pm

Re: in-line assembler en z88dk

Mensaje por zilogz80a » Mar May 21, 2013 5:51 pm

Muchas gracias por tomarte el tiempo en responder amigo, entiendo lo que me comentas, pero estoy preguntando más precisamente sobre que literatura puedo tomar como referencia para el estudio de la sintaxis con la que debo escribir en inline assembler en z88dk, por eso digo, sería válido usar lo aprendido en el libro de código máquina de zx spectrum? es totalmente compatible con este tipo de sintaxis? o debo usar otra literatura?

ej: http://www.robertp.net/MicroHobby/CodiMaquina.htm

gracias :)

Avatar de Usuario
na_th_an
Nonamed
Mensajes: 1889
Registrado: Lun May 07, 2007 10:16 am
Ubicación: Andalucía

Re: in-line assembler en z88dk

Mensaje por na_th_an » Jue May 23, 2013 8:39 am

Assembler es assembler, te vale cualquier tutorial. Cada entorno tiene sus peculiaridades, pero no van más allá de cómo se nombran las etiquetas o como se representan los números.

zilogz80a
rst 0
Mensajes: 8
Registrado: Lun May 20, 2013 7:35 pm

Re: in-line assembler en z88dk

Mensaje por zilogz80a » Jue May 23, 2013 7:38 pm

gracias!!

susso
Jack The Nipper
Mensajes: 146
Registrado: Mar May 07, 2013 9:42 am

Re: in-line assembler en z88dk

Mensaje por susso » Vie May 31, 2013 7:34 pm

Si, da igual z80 para spectrum que para Gameboy, de igual manera que es igual el 68000 de Motorola para Amiga que para Megadrive, lo único que cambia es la referencia hardware. Es posible que se usen procesadores capados y economicos con menos operandos, unos que otros pero en general la base es la misma.


Enviado con Tapatalk

Z80user
Manic Miner
Mensajes: 215
Registrado: Vie Jun 08, 2007 9:42 am
Ubicación: En un lugar de la mancha
Contactar:

Re: in-line assembler en z88dk

Mensaje por Z80user » Sab Jun 01, 2013 7:40 pm

también tienen algunas sutiles diferencias que no te das cuenta a simple vista.
Por ejemplo. Si A vale 1
ADD A,A
con algunos compiladores A vale 2 y en otros 4 según como lo interpreten.
alguno inspiran ADD como que el operando A va implícito y toman todos los operandos como una forma resumida de poner ADD A, A dos veces y no una.
Otra es que ADD si lo tiene implícito y por ejemplo en SUB A,B el operando A no está implícito en esta operación.

Te recomiendo probar estas cosas antes de nada.
Si vas a tirar Hardware, primero pregunta si alguien lo puede recuperar.
No abandones un ordenador en un vertedero, donalo a alguien.

zilogz80a
rst 0
Mensajes: 8
Registrado: Lun May 20, 2013 7:35 pm

Re: in-line assembler en z88dk

Mensaje por zilogz80a » Dom Jun 02, 2013 12:23 am

Muchas gracias muchachos, tomo nota.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: Ahrefs [Bot] y 10 invitados