C for Experts
Criando Bibliotecas em Assembly


  Foi visto no capítulo anterior que podemos criar programas em Assembly dentro de um programa em C.
  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:
  1. Criar um programa em Assembly puro.
  2. Criar referências para cada rotina.
  3. Criar um arquivo ".h" contendo a declaração das funções que irão chamar as rotinas.
  4. Compilar o arquivo em Assembly com o ZAS.
  5. 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:
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:
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:
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.


/MARMSX/CURSOS/C