Sim, é possível incluir Assembler dentro do C, e a forma depende de cada compilador.
Sobre a matriz de bit, vai umas correções e dicas.
Não conheço o sdcc, mas se é C, deve ou deveria ser padrão.
em C, para declar matriz é:
tipo nome[y][x];
Assim é só um vetor;
tipo nome[x];
Mas como no C não tem o tipo bit, você pode fazer uma matriz de bit, através de um simples vetor, ou de uma matriz mesmo.
Um exemplo:
Matriz de bit 8 x 8;
- Código: Selecionar todos
unsigned char matriz[8];
Neste caso você terá 8 elementos, que você deve tratar como sendo o alinhamento no eixo y, e a variação em x você faz com logica binária.
Se você quer o bit da posiçao y = 5, x = 3;
- Código: Selecionar todos
bit = ((matriz[y] & (1<<x)) >> x);
Neste caso o bit MSB será o oitavo elemento da posição x.
Se precisar uma matriz maior em x, basta trocar o tipo de dado. Exemplo, 16 usa tipo int, mais vai pra long,.....
Claro isso depende da plataforma que esta trabalhando.
Se não tiver o tamanho que precisa, você pode usar multiplos elementos com uma declaração do tipo matriz mesmo.
Exemplo de 8 x 16, usando unsigned char.
- Código: Selecionar todos
unsigned char matriz[8][2];
Neste caso, o byte da posição 0, será seus bits de 0 a 7, e o byte de index 1, os bits de 8 a 15. O mesmo conceito vale para outros tipos de dados. Só que ai sua logica de acesso vai ter que melhorar para saber qual o index do bit que quer. Nada dificil.
- Código: Selecionar todos
index_byte = (index_bit / 8);
index_real_bit = (index_bit % 8);
Se quiser usar mais recursos do C, poderia usar bit field, mas ai neste momento, acho que sua lógica de acesso pode ficar pior.
Se bem que com ponteiro e um swicth fica facil.
- Código: Selecionar todos
BOOL p_get_bit_matriz (U8 *u8_matriz, U8 u8_x, U8 u8_y)
{
swicth (u8_x)
{
case 0: return u8_matriz[u8_y].bit_0;
case 1: return u8_matriz[u8_y].bit_1;
case 2: return u8_matriz[u8_y].bit_2;
case 3: return u8_matriz[u8_y].bit_3;
case 4: return u8_matriz[u8_y].bit_4;
case 5: return u8_matriz[u8_y].bit_5;
case 6: return u8_matriz[u8_y].bit_6;
case 7: return u8_matriz[u8_y].bit_7;
}
}
Acho que funciona, tem que testar.
Acho que chega, pois este foi meu maior post aqui. Inspirado.[/code]