in-line assembler en z88dk
Moderador: Sir Cilve Sinclair
-
- rst 0
- Mensajes: 8
- Registrado: Lun May 20, 2013 7:35 pm
in-line assembler en z88dk
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!
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!
- na_th_an
- Nonamed
- Mensajes: 1889
- Registrado: Lun May 07, 2007 10:16 am
- Ubicación: Andalucía
Re: in-line assembler en z88dk
El ensamblador en linea de z88dk no tiene nada especial, salvo que las etiquetas deben empezar con un punto:
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
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;
}
-
- rst 0
- Mensajes: 8
- Registrado: Lun May 20, 2013 7:35 pm
Re: in-line assembler en z88dk
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
ej: http://www.robertp.net/MicroHobby/CodiMaquina.htm
gracias
- na_th_an
- Nonamed
- Mensajes: 1889
- Registrado: Lun May 07, 2007 10:16 am
- Ubicación: Andalucía
Re: in-line assembler en z88dk
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.
-
- rst 0
- Mensajes: 8
- Registrado: Lun May 20, 2013 7:35 pm
Re: in-line assembler en z88dk
gracias!!
-
- Jack The Nipper
- Mensajes: 146
- Registrado: Mar May 07, 2013 9:42 am
Re: in-line assembler en z88dk
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
Enviado con Tapatalk
-
- 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
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.
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.
No abandones un ordenador en un vertedero, donalo a alguien.
-
- rst 0
- Mensajes: 8
- Registrado: Lun May 20, 2013 7:35 pm
Re: in-line assembler en z88dk
Muchas gracias muchachos, tomo nota.
¿Quién está conectado?
Usuarios navegando por este Foro: Bing [Bot] y 14 invitados