ccz80

Programando el Amstrad en BASIC, C, etc.
Avatar de Usuario
dinoneno
Megaforero
Megaforero
Mensajes: 298
Registrado: Mié 13 Sep , 2006 7:32 am
Ubicación: Nambroca

Re: ccz80

Mensajepor dinoneno » Mar 07 Abr , 2009 12:15 pm

¿Puedo declarar una función a la que al llamarse no se inluyan parámetros en la pila?
Desde luego puedes declarar una función sin parámetros:

Código: Seleccionar todo

function nombre() { ... }
y en ella poner rutinas que utilicen otras funciones. En esas otras funciones sería conveniente utilizar la claúsula using. Si desde una función piensas utilizar parte de otra, puedes indicar que esa otra se incluya en el código aunque no la utilices directamente en él. En el ejemplo que has puesto en la función cpc_PrintStr para cerrar la llave pondrías

Código: Seleccionar todo

} using basura;
y con ello esta función basura se incluiría en el código final aunque no la uses directamente en el programa; eso sí, la función basura no debe ser inline, puedes declararla sin parámetros y yo le pondría un

Código: Seleccionar todo

ret
como primera instrucción, por si se llama "accidentalmente".

Supongo que el ejemplo que has puesto es un caso tonto, pero en cpc_PrintStr tras el jp entrada no haría falta el ret, y en la rutina entrada de la función basura yo haría jp #BB5A o bien poner un ret tras call #BB5A, ya que no es inline y así regresaría a cpc_PrintStr.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: ccz80

Mensajepor Artaburu » Mar 07 Abr , 2009 12:28 pm

Gracias, he probado pero si intento declarar una función sin parámetros me da syntax error:

Código: Seleccionar todo

C:\ccz80>ccz80.exe uno.ccz80
ERROR: syntax error in file C:\ccz80\cpcrslib.ccz80 line 4 position 10
function cpc_PrintStr()
Si le pongo parámetros tanto de entrada como de salida tira bien.
También voy a probar lo de la claúsula using. Por cierto, si uso varias veces la llamada a basura, ¿añade varias veces el código o lo reutiliza?
Salu2,
Arta

Avatar de Usuario
dinoneno
Megaforero
Megaforero
Mensajes: 298
Registrado: Mié 13 Sep , 2006 7:32 am
Ubicación: Nambroca

Re: ccz80

Mensajepor dinoneno » Mar 07 Abr , 2009 12:55 pm

... si intento declarar una función sin parámetros me da syntax error
Creo que querías decir una función sin valor de retorno, no sin parámetros. Sin parámetros es posible, pero sin valor de retorno no. Declárala de tipo byte y como no vas a usarla realmente no hace falta que cargues nada en el registro A antes de salir. Si quieres ser muy purista ponle como código de la función el siguiente, por ejemplo:

Código: Seleccionar todo

function byte basura()
{
"xor a ; Valor de retorno 0",
"ret ; Sale de la función devolviendo 0",
"; Aquí a continuación ya pones todas tus declaraciones y rutinas auxiliares de otras funciones",
"entrada:",
"..."
}
Por cierto, si uso varias veces la llamada a basura, ¿añade varias veces el código o lo reutiliza?
Se incluirá sólo una vez la función basura y quedará como un código estático en tu programa para ser llamado desde fuera. Para comprobarlo utiliza la opción /asm al compilar y verás exactamente el resultado :D.

Adelante ... \:D/

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: ccz80

Mensajepor Artaburu » Mar 07 Abr , 2009 1:08 pm

Bueno, como a lo mejor os da vergüenza pedirlo :oops:, ahí va el código fuente del formateador de funciones para ccz80. Está hecho en Visual Basic .NET.
Tengo un pequeño problema y es que no tengo el .NET instalado... y la herramienta me casca cada vez que pulso el botón que tiene :( He mirado el código fuente y no es compatible con VB6 así que tampoco lo puedo compilar.
Salu2,
Arta

Avatar de Usuario
dinoneno
Megaforero
Megaforero
Mensajes: 298
Registrado: Mié 13 Sep , 2006 7:32 am
Ubicación: Nambroca

Re: ccz80

Mensajepor dinoneno » Mar 07 Abr , 2009 1:18 pm

Tengo un pequeño problema y es que no tengo el .NET instalado... y la herramienta me casca cada vez que pulso el botón que tiene :( He mirado el código fuente y no es compatible con VB6 así que tampoco lo puedo compilar.
Qué pena que no tengas el .NET instalado. Se podría reescribir en VB6, pero creo que se tarda menos instalando el .NET (si es posible, claro). Pero si tienes un buen editor de textos (PSPad, UltraEdit, ...) también puedes hacer una macro para poner las comillas y la coma tras cada línea ensamblador.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: ccz80

Mensajepor Artaburu » Mar 07 Abr , 2009 1:31 pm

Ya me las apañaré para hacerme un programilla para añadir el formato.
Otra cosa, hago esto:

Código: Seleccionar todo

function byte cpc_PutSp(word, byte, byte, word)
{
"ld ix,2",
"add ix,sp",
"ld l,(ix+0)",
"ld h,(ix+1)",
"ld a,(ix+2)",
"ld e,(ix+6)",
"ld d,(ix+7)",
"ld (loop_alto_2+1),a ;actualizo rutina de captura",
"sub 1",
"cpl",
"ld (salto_linea+1),a ;comparten los 2 los mismos valores. ",
"ld A,(ix+4)",
"jp cpc_PutSp0"
} using loop_alto_2, salto_linea;

function byte cpc_PutSp0()
{
"defb #fD",
"LD H,a",
"ld b,7",
"loop_alto_2:",
"ld c,4",
"loop_ancho_2:",
"ld A,(DE)",
"ld (hl),a",
"inc de",
"inc hl",
"dec c",
"jp nz,loop_ancho_2",
"defb #fD",
"dec H",
"ret z",
"salto_linea:",
"LD C,#ff",
"ADD HL,BC",
"jp nc,loop_alto_2",
"ld bc,#c050",
"add HL,BC",
"ld b,7",
"jp loop_alto_2"
}
Porque quiero modificar el código de cpc_PutSp0 desde cpc_PutSp (y desde otras funciones) pero el using aquí me da que no funciona porque no declaro ni salto_linea ni loop_alto_2. Existe la opción de hacer las llamadas con salto relativo a cpc_PutSp0 pero es un poco incómodo contar los bytes que hay en el compilado hasta salto_linea. ¿Alguna idea?
Salu2,
Arta

Avatar de Usuario
dinoneno
Megaforero
Megaforero
Mensajes: 298
Registrado: Mié 13 Sep , 2006 7:32 am
Ubicación: Nambroca

Re: ccz80

Mensajepor dinoneno » Mar 07 Abr , 2009 1:50 pm

Lo que debes poner en using es el nombre de una función, no el de elementos de esa función. Si pones using cpc_PutSp0 esta función se incluirá en el código y cuando llegue el momento del ensamblado las instrucciones de cpc_PutSp que usan etiquetas de cpc_PutSp0 las encontrarán en el código.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: ccz80

Mensajepor Artaburu » Mar 07 Abr , 2009 1:58 pm

Vale, ahora sí, pero también he tenido que definir una etiqueta con el mismo nombre de la función para que me la encuentre:

Código: Seleccionar todo

function byte cpc_PutSp(word, word, word, word)
{
"ld ix,2",
"add ix,sp",
"ld l,(ix+0)",
"ld h,(ix+1)",
"ld a,(ix+2)",
"ld e,(ix+6)",
"ld d,(ix+7)",
"ld (loop_alto_2+1),a ;actualizo rutina de captura",
"sub 1",
"cpl",
"ld (salto_linea+1),a ;comparten los 2 los mismos valores. ",
"ld A,(ix+4)",
"jp cpc_PutSp0"
} using cpc_PutSp0;


function byte cpc_PutSp0()
{
"cpc_PutSp0:",
"defb #fD",
"LD H,a ;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE",
"ld b,7",
"loop_alto_2:",
"ld c,4",
"loop_ancho_2:",
"ld A,(DE)",
"ld (hl),a",
"inc de",
"inc hl",
"dec c",
"jp nz,loop_ancho_2",
"defb #fD",
"dec H",
"ret z",
"salto_linea:",
"LD C,#ff ;&07f6 ;salto linea menos ancho",
"ADD HL,BC",
"jp nc,loop_alto_2 ",
"ld bc,#c050",
"add HL,BC",
"ld b,7",
"jp loop_alto_2"
}
Por lo que veo, sólo es cuestión de tiempo pasar las rutinas que tengo para que estén disponibles en el ccz80 ya que usas el mismo método de paso de parámetros que z88dk aunque he visto que en ccz80 cuando envías un byte por parámetro cambia algo pero si se define como word va igual... z88dk siempre pasa words a la pila.
Salu2,
Arta

Avatar de Usuario
dinoneno
Megaforero
Megaforero
Mensajes: 298
Registrado: Mié 13 Sep , 2006 7:32 am
Ubicación: Nambroca

Re: ccz80

Mensajepor dinoneno » Mar 07 Abr , 2009 2:14 pm

Por afinar un poco más, si usas la opción /asm al compilar te darás cuenta que las rutinas correspondientes a funciones son el nombre de la función con un subrayado delante (o dos, ahora lo dudo). Es por si quieres evitarte definir esas etiquetas al principio de la función.

Otra cosa. Yo intenté pasar tus rutinas para ccz80 pero de verdad que no me enteraba cómo estaban hechas. Si permites que te ayude y me das las indicaciones para hacerlo ya me vas diciendo, a ver si en estos días de vacaciones se puede adelantar.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: ccz80

Mensajepor Artaburu » Mar 07 Abr , 2009 4:20 pm

Pues mira, con lo de poner un _ al principio de la llamada se arregla :D

Sobre convertir la librería, genial. Te ayudo en lo que quieras (o me ayudas tu). Sí que puede ser un poco compleja de entender pero bueno, yendo por partes y con cariño no debería haber problemas. Por ejemplo, he convertido la de imprimir una cadena de texto cpc_PrintStr y la de poner un sprite en pantalla cpc_PutSp.
Muchas de las funciones de la librería son directas, es decir, la función no llama a nada más ni usa referencias de ningún tipo, se basta con los parámetros (por ejemplo cpc_PrintStr). Otras estan "divididas" para economizar-reutilizar código, por ejemplo cpc_PutSp llama a cpc_PutSp0.
Había pensado en empezar a transferir las funciones más sencillas de la librería: sprites, teclado, ... y dejar para el final todo lo relativo al mapa de tiles, que es lo que más problemas puede dar.
Salu2,
Arta

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: ccz80

Mensajepor Artaburu » Mar 07 Abr , 2009 5:10 pm

He visto lo que más problemas puede dar así que lo hago con un ejemplo.
cpc_PutMaskSp y cpc_PutMaskSp0
desde la primera se llama a la segunda y se le modifican un par de bytes en las llamadas:

Código: Seleccionar todo

ld (cpc_PutMaskSp0+ancho_m0+1),a
ld (cpc_PutMaskSp0+suma_siguiente_linea_m0+1),a
si vas a la segunda verás cómo se definen ancho_m0 y suma_siguiente_linea_m0:

Código: Seleccionar todo

DEFC ancho_m0 = loop_alto_2m
DEFC suma_siguiente_linea_m0 = salto_linea_m0
Como desde ccz80 la llama de modo absoluto y en z88dk lo hace de forma relativa, nos calzamos la referencia a la función y dejamos las líneas tal que así:

Código: Seleccionar todo

ld (loop_alto_2m+1),a
ld (salto_linea_m0+1),a
y ya tenemos el código fuente preparado para que funcione desde ccz80 (a falta de meter ")

Código: Seleccionar todo

function byte cpc_PutMaskSp(word, word, word, word)
{
ld ix,2
add ix,sp

ld l,(ix+0)
ld h,(ix+1)

ld a,(ix+2)

ld e,(ix+6)
ld d,(ix+7)

ld (loop_alto_2m+1),a
sub 1
cpl
ld (salto_linea_m0+1),a

ld A,(ix+4)
jp _cpc_PutMaskSp0
} using cpc_PutMaskSp0;

function byte cpc_PutMaskSp0()
{
defb #fD
LD H,a
ld b,7
loop_alto_2m:
ld c,4
ex de,hl
loop_ancho_2m:

LD A,(DE) ;leo el byte del fondo
AND (HL) ;lo enmascaro
INC HL
OR (HL) ;lo enmascaro
LD (DE),A ;actualizo el fondo
INC DE
INC HL


dec c
jp nz,loop_ancho_2m
defb #fD
dec H
ret z
ex de,hl

salto_lineam:
LD C,#ff
ADD HL,BC
jp nc,loop_alto_2m
ld bc,#c050

add HL,BC
ld b,7 ;sólo se daría una de cada 8 veces en un sprite
jp loop_alto_2m
}
Salu2,
Arta

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: ccz80

Mensajepor Artaburu » Mar 07 Abr , 2009 6:05 pm

He metido unas cuantas rutinas ya en la librería:
cpc_GetScrAddress (x,y)
cpc_GetSp (buffer,alto,ancho,origen)
cpc_PutSp (sprite,alto,ancho,destino)
cpc_PutSprite (sprite,destino)
cpc_PutMaskSp (sprite,alto,ancho,destino)
cpc_PutMaskSprite (sprite,destino)
cpc_PutSpXOR (sprite,alto,ancho,destino)
cpc_PutSpriteXOR (sprite,destino)
cpc_PutTile2x8 (tile,x,y)
cpc_PutTile4x16 (tile,x,y)
cpc_PrintStr(cadena)

y un pequeño programa de ejemplo que las usa todas:

Código: Seleccionar todo

include "cpcrslib.ccz80";
byte x;
byte y;
x=0;
y=0;
cpc_PrintStr("hola mundo");
cpc_PutSprite(sprite2x8,#c000); //dibuja un sprite en la parte superior izquierda de la pantalla
repeat (100) {
cpc_GetSp(buffer,16,4,cpc_GetScrAddress(x,y)); //captura el fondo
cpc_PutSp(buffer,16,4,cpc_GetScrAddress(x,30)); //y lo dibuja más abajo
x++;
}
x=0;

repeat (20) {
cpc_PutSpriteXOR(sprite2x8,cpc_GetScrAddress(x,90));
x=x+2;
}
x=x-2;
repeat (20) {
cpc_PutSpXOR(sprite2x8d,8,2,cpc_GetScrAddress(x,90));
x=x-2;
}


cpc_PutMaskSp(sprite,16,4,cpc_GetScrAddress(20,30)); //dimensiones en parámetros
cpc_PutMaskSprite(sprite0,cpc_GetScrAddress(10,10)); //dimensiones dentro del sprite
return;

array byte buffer = {
#C0,#C8,#C4,#C0,
#C4,#CC,#CC,#C8,
#C0,#0C,#0C,#C0,
#C0,#0C,#0C,#C0,
#C0,#0C,#0C,#C0,
#C0,#C0,#C0,#C0,
#C0,#48,#84,#C0,
#C0,#48,#84,#C0,
#C0,#00,#00,#C0,
#84,#0C,#0C,#48,
#C0,#04,#08,#C0,
#C0,#00,#00,#C0,
#C4,#88,#44,#C8,
#C4,#00,#00,#C8,
#C4,#CC,#CC,#C8,
#C0,#C0,#C0,#C0
};

array byte sprite0 = {
4, 16, //dimensiones del sprite
#88,#70,#11,#E0,#88,#70,#11,#E0, //MASCARA,SPRITE,MASCARA,SPRITE...
#11,#E0,#88,#70,#11,#E0,#88,#70, //MASK, SPRITE, MASK, SPRITE...
#00,#96,#00,#96,#00,#96,#00,#96,
#00,#F0,#00,#F0,#00,#F0,#00,#F0,
#00,#F7,#00,#FE,#00,#F7,#00,#FE,
#00,#C7,#00,#3E,#00,#C7,#00,#3E,
#00,#F3,#00,#FC,#00,#F3,#00,#FC,
#88,#70,#11,#E0,#88,#70,#11,#E0,
#88,#70,#11,#E0,#88,#70,#11,#E0,
#11,#E0,#88,#70,#11,#E0,#88,#70,
#00,#96,#00,#96,#00,#96,#00,#96,
#00,#F0,#00,#F0,#00,#F0,#00,#F0,
#00,#F7,#00,#FE,#00,#F7,#00,#FE,
#00,#C7,#00,#3E,#00,#C7,#00,#3E,
#00,#F3,#00,#FC,#00,#F3,#00,#FC,
#88,#70,#11,#E0,#88,#70,#11,#E0,
};

array byte sprite = {
#88,#70,#11,#E0,#88,#70,#11,#E0, //MASCARA,SPRITE,MASCARA,SPRITE...
#11,#E0,#88,#70,#11,#E0,#88,#70, //MASK, SPRITE, MASK, SPRITE...
#00,#96,#00,#96,#00,#96,#00,#96,
#00,#F0,#00,#F0,#00,#F0,#00,#F0,
#00,#F7,#00,#FE,#00,#F7,#00,#FE,
#00,#C7,#00,#3E,#00,#C7,#00,#3E,
#00,#F3,#00,#FC,#00,#F3,#00,#FC,
#88,#70,#11,#E0,#88,#70,#11,#E0,
#88,#70,#11,#E0,#88,#70,#11,#E0,
#11,#E0,#88,#70,#11,#E0,#88,#70,
#00,#96,#00,#96,#00,#96,#00,#96,
#00,#F0,#00,#F0,#00,#F0,#00,#F0,
#00,#F7,#00,#FE,#00,#F7,#00,#FE,
#00,#C7,#00,#3E,#00,#C7,#00,#3E,
#00,#F3,#00,#FC,#00,#F3,#00,#FC,
#88,#70,#11,#E0,#88,#70,#11,#E0,
};

array byte sprite2x8 = {
2,8, //dimensiones del sprite
#07,#0E,
#2D,#C3,
#0F,#2D,
#0F,#2D,
#0F,#0F,
#0F,#2D,
#0F,#0F,
#07,#0E
};

array byte sprite2x8d = {
#07,#0E,
#2D,#C3,
#0F,#2D,
#0F,#2D,
#0F,#0F,
#0F,#2D,
#0F,#0F,
#07,#0E
};
Y cuelgo la librería tal como va hasta ahora, por si queréis ir probando.

EDITO, que he añadido dos funciones más (las dos de tiles)
Adjuntos
cpcrslib.rar
rutinas para usar sprites bajo ccz80
(1.8 KiB) Descargado 112 veces
Salu2,
Arta

Avatar de Usuario
dinoneno
Megaforero
Megaforero
Mensajes: 298
Registrado: Mié 13 Sep , 2006 7:32 am
Ubicación: Nambroca

Re: ccz80

Mensajepor dinoneno » Mar 07 Abr , 2009 6:23 pm

Vaya, qué buen ritmo llevas en la conversión. En cuanto pueda pruebo el ejemplo que has hecho.

Quedo a tu disposición para que me digas funciones que pueda yo ir convirtiendo para empezar (que sepas que no tienen excesiva dificultad), y por supuesto para todas las dudas que pueda resolver.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: ccz80

Mensajepor Artaburu » Mar 07 Abr , 2009 6:32 pm

Puedes ir probando a convertir las siguientes que son inmediatas:
cpc_SetMode
cpc_SetColour
cpc_EnableFirmware
cpc_DisableFirmware
cpc_CollSp
cpc_ClrScr
cpc_PutMaskSp2x8
cpc_PutMaskSp4x16
cpc_UnExo
cpc_Uncrunch
Algunas puede que las tengas incorporadas ya pero estas que yo te digo no usan el firmware.

Y luego ya nos pondremos con las del teclado y texto en formato gráfico sin firmware.

EDITO: Algunas de estas funciones solo requieren un parámetro y en z88dk se envía en HL, habría que modificarlas para que entren en ccz80 y cojan de la pila el parámetro.
Salu2,
Arta

Avatar de Usuario
dinoneno
Megaforero
Megaforero
Mensajes: 298
Registrado: Mié 13 Sep , 2006 7:32 am
Ubicación: Nambroca

Re: ccz80

Mensajepor dinoneno » Mar 07 Abr , 2009 8:31 pm

De acuerdo. Todas esas funciones para mí. En cuando a lo de las funciones que reciben directamente en HL un valor, sin tomarlo de la pila, en ccz80 son las funciones inline, que pueden recibir ningún o un parámetro, y si lo reciben, si es byte llega en A y si es word llega en HL. Ver manual :D


¿Quién está conectado?

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


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic