C for Experts
Criando Bibliotecas em Assembly
Você está em: MarMSX >> Cursos >> C
Linguagem Assembly exclusiva do MSX.
Foi visto no capítulo anterior que podemos criar programas em Assembly dentro de um programa em C. Entretanto, este curso aborda somente o Assembly do MSX. Dessa forma, é necessário um estudo a parte da linguagem de máquina para outros computadores, bem como utilizá-la no C da máquina em questão.
De modo a simplificar o processo de compilação, podemos colocar tais programas dentro de bibliotecas, conforme visto no capítulo 9.
Os passos necessários à criação de um biblioteca dos programas Assembly para o C são:
- Criar um programa em Assembly puro.
- Criar referências para cada rotina.
- Criar um arquivo ".h" contendo a declaração das funções que irão chamar as rotinas.
- Compilar o arquivo em Assembly com o ZAS.
- Criar a biblioteca, reunindo todos os módulos.
Passo 1: Criar um programa em Assembly puro
Utilizando o exemplo da paleta do MSX do capítulo anterior, temos [2]:
iniplt equ 0141h
setplt equ 014Dh
exbrsa equ 0FAF8h
calslt equ 001Ch
MACRO subrom,rotina
psect text
di
push ix
push iy
ld iy,(exbrsa-1)
ld ix,rotina
call calslt
pop iy
pop ix
ei
ENDM
; void iniplt()
psect text
GLOBAL _iniplt
_iniplt:
subrom iniplt
ret
; void setplt(uchar indice, uint rgb)
psect text
GLOBAL _setplt, csv, cret
_setplt:
call csv ; Usar em funções com parâmetros
ld d,(ix+6) ; Indice
ld a,(ix+8) ; RB
ld e,(ix+9) ; G
subrom setplt
jp cret ; Usar em funções com parâmetros
Salvar o arquivo como "palette.as".
Passo 2: Criar referências para cada rotina
No programa anterior, os labels globais "_iniplt" e "_setplt" fazem referência a cada trecho de código. O primeiro referencia um programa que resseta a paleta de cores, enquanto que o segundo referencia um programa que irá modificar as cores da paleta.
No próximo passo, criaremos as declarações das funções que irão chamar cada rotina. O nome decada função coincide com o nome declarado dos labels, mas sem o símbolo de underscore "_".
Passo 3: Criar um arquivo ".h" contendo a declaração das funções que irão chamar as rotinas
void iniplt(void);
void setplt(unsigned char, unsigned int);
Salvar como "palette.h".
Passo 4: Compilar o arquivo em Assembly com o ZAS
No prompt do DOS 1, digite:
A> zas -n -opal.o palette.as
O arquivo objeto "pal.o" será gerado.
Passo 5: Criar a biblioteca, reunindo todos os módulos
No prompt do DOS 1, digite:
A> libr r libpal.lib pal.o
Testando a biblioteca criada
Crie o programa em C:
#include <stdio.h>
#include <conio.h>
#include <palette.h>
main()
{
setplt(15,0x0700);
printf("Tecle algo para voltar a cor normal\n");
getch();
iniplt();
}
Salve com o nome "teste.c".
No prompt do DOS, digite:
A> c -lpal teste
Funções que recebem apenas um parâmetro
É possível utilizar o registrador HL para ler um parâmetro do tipo inteiro ou char passado para a função, quando se utiliza uma biblioteca. Veja o exemplo a seguir.
psect text
GLOBAL _dobra
_dobra:
add hl,hl ; HL recebe valor e também armazena retorno
dobra.as
int dobra(int)
dobra.h
#include <stdio.h>
#include <dobra.h>
main()
{
printf("O dobro de 15 é: %d\n", dobra(15));
}
Saída:
O dobro de 15 é: 30
No exemplo da paleta de cores, vamos introduzir uma rotina [2] para ler dados da paleta de cores (GETPLT).
getplt equ 0149h
...
; int getplt(uchar pal)
psect text
GLOBAL _getplt
_getplt:
ld a,l ; Lê indice
subrom getplt
ld h,c ; Retorna G
ld l,b ; Retorna RB
ret
Referências:
[1]- Hi-Tech C user's manual, 1989.
[2]- Rotinas do Pierre Gielen, 1993.