Página 1 de 1

código fonte do emu51

MensagemEnviado: 16 Mar 2010 17:38
por Francesco
Pessoal, apesar do fonte ser de um simulador de 8051, minha dúvida é quanto ao C++.

Achei o código fonte muito simples de um simulador de 8051 que funciona muito bem. Não é complicado de usar...

Olhando o código fonte, me deparei com algumas dúvidas. Gostaria de compartilha-la. A estrutura principal da classe é essa:

Código: Selecionar todos
class code_51
{
public:
        char mnem[6];              // instruction mnemonic (2-4 characters)
        BYTE code;                 // instruction code
        BYTE lenght;               // bytes which are needed to write this
                                   // instruction into memory
        BYTE cycles;               // time unit
        char display_string[20];   // string which is ready for displaying,
                                   // it's made by make_ds(WORD) method
        char datas[12];            // string which contains datas which
                                   // will be displayed after mnemonic
        void make_ds (WORD);       // make display string
        void process ();           // process the instruction
};


Quando ele declara o objeto dessa classe, ele usa a seguinte instrução.

Código: Selecionar todos
code_51 asm51[256];


Depois utiliza da seguinte forma, por exemplo no seguinte código:


[code]int get_lenght (BYTE code)
{
if (asm51[code].code==code) return asm51[code].lenght;
else return 1;
}[/code]

Eu sei que não são 256 simuladores, é um só. Mas havia a necessidade de se declarar asm51[256]? Por que não declarar de uma maneira mais "normal"?

Agradeço desde já.

Francesco

MensagemEnviado: 17 Mar 2010 00:07
por barboza
Pelo que estou entendendo são para 256 instruções e não simuladores.

Cada instancia, tem os dados referentes a cada instrução do core.

MensagemEnviado: 17 Mar 2010 09:17
por Francesco
Barboza, eu cheguei a imaginar que seriam os 256 bytes de RAM...
Não pode ser as 256 instruções pois elas estão todas em um grande switch no método process(). Dessa forma...

Código: Selecionar todos
void code_51::process (void)
{
  BYTE tmpB;
  WORD tmpW;
  switch (code)
  {
        case 0x00:  //nop                      00
          PC++;
        break;
        case 0x74:  // mov a,#(byte)           74 xx
          PC++;
          *Acc=prog[PC];
          PC++;
        break;
        case 0x75:  // mov (adress),#(byte)    75 xx yy
          PC++;
          SFR[prog[PC]]=prog[PC+1];
          PC+=2;
        break;
      case 0x02:  // ljmp 16bit_adres        02 xx yy
          PC++;
          PC=(WORD)prog[PC]<<8 | prog[PC+1];
        break;
        case 0x80:  // sjmp offset             80 oo
          PC++;
          PC+=(signed char)prog[PC]+1;
        break;
        case 0x85:  // mov (adress1),(ardess2) 85 yy xx
          PC++;
          SFR[prog[PC+1]]=SFR[prog[PC]];
          PC+=2;
        break;
        case 0xe5:  // mov A,(adress)
          PC++;
          *Acc=SFR[prog[PC]];
          PC++;
        break;
      case 0x92:  // mov (bit),C
        PC++;
        if (check_C()) setB(prog[PC]);
        else clrB(prog[PC]);
        PC++;
      break;
        case 0x04:  // inc a
          (*Acc)++;
          PC++;
        break;
        case 0x05:  // inc (adress)
          PC++;
          SFR[prog[PC]]++;
          PC++;
        break;
        case 0xa3:  // inc DPTR
          *DPTR=*DPTR+1;
          PC++;
        break;
        case 0x06: //inc @R0
          SFR[R[0]]++;
          PC++;
        break;
        case 0x07: //inc @R1
          SFR[R[1]]++;
          PC++;
        break;
        case 0x08: //inc R0
          R[0]++;
          PC++;
        break;
        case 0x09: //inc R1
          R[1]++;
          PC++;
        break;
        case 0x0a: //inc R2
          R[2]++;
          PC++;
        break;
        case 0x0b: //inc R3
.....................


E por aí vai...

Francesco

MensagemEnviado: 17 Mar 2010 10:34
por ivan
O Barboza está correto.
O process mencionado é um método da classe code51 e ele processa a instrução armzenada na classe.
As 256 ocorrências são instâncias da classe. De jeito algum podem ser 256 bytes uma vêz que só as propriedades públicas somam mais q isso.

Posta o link pro código completo pra vermos o todo.

MensagemEnviado: 17 Mar 2010 10:40
por Francesco
Ivan,

Entendo que a classe tenha mais de 256 bytes, compreendo bem o conceito de orientação a objeto e classes em C++.

Mas não faz sentido haverem 256 instâncias da classe, pois apenas uma daria conta de processar as instruções do 8051. Eu indiquei o quão bizarro isso parecia quando ele utiliza o objeto:

[code]
if( asm51[code].code==code)
return( asm51[code].lenght ;
[/code]

O fonte completo você pode baixar deste link:
http://sourceforge.net/projects/emu51/files/emu51%20v0.03%20%28alpha%29/emu51%20source%2Bexe%2Bsamples/

Francesco

MensagemEnviado: 17 Mar 2010 11:23
por ivan
Francesco,

O fio da meada é por aki.
Código: Selecionar todos
void main_init (void)
{
  load_code_table (asm51);
...


nesta função são carregadas as instruções.

É comum ao ler um arquivo, abrí-lo e carregá-lo na memória, seja todo ou uma boa parte, por questões de desempenho.

Pq 256 instruções? Boa sorte!

Francesco wrote:

Mas não faz sentido haverem 256 instâncias da classe, pois apenas uma daria conta de processar as instruções do 8051. Eu indiquei o quão bizarro isso parecia quando ele utiliza o objeto:


Apenas a aplicação dos conceitos de OO.

MensagemEnviado: 17 Mar 2010 11:33
por Francesco
Ivan, é verdade...

Ele carrega em cada instância da classe o texto do código em assembly para gerar o desassembly. O dendereço de cada dado é o opcode de código.

No entanto, ficou muito feito ele ter um ponteiro para process() dentro dessa classe, uma vez que este é único.

Valeu pessoal!

Francesco