Haciendo una librería para CPC.
Como ejemplo, voy a meter cómo dibujar un sprite en pantalla que tiene bastantes parámetros para pasar: Posición pantalla, sprite y dimensiones. Cada parámetro, independientemente de si es un char o un int ocupa 2 bytes. En caso de ser char, uno de los bytes será 0.
1. Crear el código. El nombre del fichero será el mismo que el de la rutina. En este caso:
imp_sp_normal.asm
Código: Seleccionar todo
XLIB imp_sp_normal
.imp_sp_normal ; dibujar en pantalla el sprite
; Entradas bc-> Alto Ancho
; de-> origen
; hl-> destino
; Se alteran hl, bc, de, af
ld hl,2
add hl,sp ; Los parámetros entran en la pila, a partir de la siguiente posición a la actual.
push hl
pop ix
ld l,(ix+0)
ld h,(ix+1)
ld a,(ix+2)
ld c,(ix+4)
ld e,(ix+6)
ld d,(ix+7)
defb $DD
LD H,c ;ALTO, SE PUEDE TRABAJAR CON HX DIRECTAMENTE
ld (ancho+1),a
.loop_alto_2
.ancho
ld b,0
push hl
.loop_ancho_2
ld A,(DE)
ld (hl),a
inc de
inc hl
dec b
jp nz,loop_ancho_2
pop hl
defb $DD
dec H
ret z
ld A,H
add $08
ld H,A
sub $C0
jp nc,loop_alto_2
ld bc,$c050
add HL,BC
jp loop_alto_2
2. Para compilar el código en una librería tengo que meter los componentes (nombres de las rutinas) en un archivo con el nombre de la librería:
libreria.lst
Código: Seleccionar todo
imp_sp_normal
3. Compilo la librería:
Código: Seleccionar todo
z80asm -v -xlibreria.lib @libreria.lst
Código: Seleccionar todo
#ifndef _CPCRSLIB_H
#define _CPCRSLIB_H
extern void __LIB__ imp_sp_normal(int *sprite, char *ancho, char *alto, int *posicion);
#endif
[i]_fin_[/i]
5. En el código fuente de mi programa tengo que incluir la librería: [b]ejemplo.c [/b]
[i]_inicio_[/i]
#include "libreria.h"
// Mi sprite:
extern char coche[8];
#asm
._coche
defb $4c,$cc
defb $4c,$cc
defb $4c,$cc
defb $4c,$cc
#endasm
main() {
int *sprite;
sprite=coche;
imp_sp_normal(sprite,4,2,0xC000);
}
6. Compilo mi ejemplo:
Código: Seleccionar todo
zcc +cpc -create-app -make-app -O3 -unsigned -o ejemplo.bin ejemplo.c -llibreria
8. Si quisiera hacer una rutina que devolviera un valor, éste valor se tiene que asignar a HL antes de terminar la rutina. En el fichero de cabecera se indica qué valor se devuelve y en el código de mi programa se tiene que asignar a algo. Por ejemplo, si quisiera saber la última posición de la pantalla dibujada por la rutina de los sprites:
libreria.h
Código: Seleccionar todo
#ifndef _CPCRSLIB_H
#define _CPCRSLIB_H
extern int __LIB__ imp_sp_normal(int *sprite, char *ancho, char *alto, int *posicion);
#endif
ejemplo.c
Código: Seleccionar todo
#include "libreria.h"
// Mi sprite:
extern char coche[8];
#asm
._coche
defb $4c,$cc
defb $4c,$cc
defb $4c,$cc
defb $4c,$cc
#endasm
main() {
int *sprite;
int z;
sprite=coche;
z=imp_sp_normal(sprite,4,2,0xC000);
}