Ver Mensaje Individual
  #18  
Antiguo 22-04-2008
Avatar de Dedalo
Dedalo Dedalo is offline
Miembro
 
Registrado: abr 2008
Ubicación: Albacete (España)
Posts: 32
Reputación: 0
Dedalo Va por buen camino
Este es el fichero PIC16F84.pas. Es el que cambio en el compilador al cambiar de procesador. Tengo varios, segun el procesador para el que vaya a compilar.


Código Delphi [-]
unit Pic16F84;
interface
uses SysUtils;
type
 Tpic = Record
  MemPrograma:array[0..1023] of Word;
  MemDatos:array[0..63] of Word;
  Id:array[0..3] of Word;
  Configuracion:Word;
  MemProgramaOk:Boolean;
  MemDatosOk:Boolean;
  ConfiguracionOk:Boolean;
 end;
const
 LoadConfiguration  = 0;
 Desconocido1   = 1;
 LoadProgramMemory  = 2;
 LoadDataMemory   = 3;
 ReadProgramMemory  = 4;
 ReadDataMemory   = 5;
 IncrementAddress  = 6;
 Desconocido7   = 7;
 BeginEraseProgramming = 8;
 BeginProgrammingOnly = 24;
 BulkEraseProgram  = 9;
 BulkEraseData   = 11;
function ConvierteToken(Token:String):Integer;
function DecodificaInstruccion(Opcode:Word):String;
function ParametrosInstruccion(Instruccion:String):Integer;
implementation
function ConvierteToken(Token:String):Integer;
begin
// Tokens propios del procesador
 if UpperCase(Token)=  'CLRW'   then Result := $0100
 else if UpperCase(Token)= 'CLRWDT' then Result := $0064
 else if UpperCase(Token)= 'NOP'    then Result := $0000
 else if UpperCase(Token)= 'RETURN' then Result := $0008
 else if UpperCase(Token)= 'RETFIE' then Result := $0009
 else if UpperCase(Token)= 'SLEEP'  then Result := $0063
 else if UpperCase(Token)= 'OPTION' then Result := $0062
 else if UpperCase(Token)= 'TRIS'   then Result := $0060
 else if UpperCase(Token)= 'MOVWF'  then Result := $0080
 else if UpperCase(Token)= 'CLRF'   then Result := $0180
 else if UpperCase(Token)= 'ADDLW'  then Result := $3E00
 else if UpperCase(Token)= 'ANDLW'  then Result := $3900
 else if UpperCase(Token)= 'IORLW'  then Result := $3800
 else if UpperCase(Token)= 'MOVLW'  then Result := $3000
 else if UpperCase(Token)= 'RETLW'  then Result := $3400
 else if UpperCase(Token)= 'XORLW'  then Result := $3A00
 else if UpperCase(Token)= 'SUBLW'  then Result := $3C00
 else if UpperCase(Token)= 'CALL'   then Result := $2000
 else if UpperCase(Token)= 'GOTO'   then Result := $2800
 else if UpperCase(Token)= 'ADDWF'  then Result := $0700
 else if UpperCase(Token)= 'ANDWF'  then Result := $0500
 else if UpperCase(Token)= 'COMF'   then Result := $0900
 else if UpperCase(Token)= 'DECF'   then Result := $0300
 else if UpperCase(Token)= 'DECFSZ' then Result := $0B00
 else if UpperCase(Token)= 'INCF'   then Result := $0A00
 else if UpperCase(Token)= 'INCFSZ' then Result := $0F00
 else if UpperCase(Token)= 'IORWF'  then Result := $0400
 else if UpperCase(Token)= 'MOVF'   then Result := $0800
 else if UpperCase(Token)= 'RLF'    then Result := $0D00
 else if UpperCase(Token)= 'RRF'    then Result := $0C00
 else if UpperCase(Token)= 'SUBWF'  then Result := $0200
 else if UpperCase(Token)= 'SWAPF'  then Result := $0E00
 else if UpperCase(Token)= 'XORWF'  then Result := $0600
 else if UpperCase(Token)= 'BCF'    then Result := $1000
 else if UpperCase(Token)= 'BSF'    then Result := $1400
 else if UpperCase(Token)= 'BTFSC'  then Result := $1800
 else if UpperCase(Token)= 'BTFSS'  then Result := $1C00
// Tokens del compilador (iguales para cualquier procesador)
 else if UpperCase(Token)= 'EQU'    then Result := -2
 else if UpperCase(Token)= 'ORG'    then Result := -3
 else if UpperCase(Token)= 'DB'     then Result := -4
 else if UpperCase(Token)= 'END'    then Result := -5
 else Result:=-1;
end;
function DecodificaInstruccion(Opcode:Word):String;
var
 d,f,b,k,kl:String;
begin
 Result:='???';
 f:='$'+IntToHex(Opcode and $7F,2);
 if (Opcode and $80)=0 then d:='W' else d:='F';
 b:='$'+IntToHex((Opcode shr 7) and $7,1);
 k:='$'+IntToHex(Opcode and $ff,2);
 Kl:='$'+IntToHex(Opcode and $7ff,2);
 case Opcode shr 7 of
  $01      :Result:='MOVWF '+ f;
  $02      :Result:='CLRW';
  $03      :Result:='CLRF '+ f;
  $04,$05  :Result:='SUBWF '+ f+','+d;
  $06,$07  :Result:='DECF '+ f+','+d;
  $08,$09  :Result:='IORWF '+ f+','+d;
  $0A,$0B  :Result:='ANDWF '+ f+','+d;
  $0C,$0D  :Result:='XORWF '+ f+','+d;
  $0E,$0F  :Result:='ADDWF '+ f+','+d;
  $10,$11  :Result:='MOVF '+ f+','+d;
  $12,$13  :Result:='COMF '+ f+','+d;
  $14,$15  :Result:='INCF '+ f+','+d;
  $16,$17  :Result:='DECFSZ '+ f+','+d;
  $18,$19  :Result:='RRF '+ f+','+d;
  $1A,$1B  :Result:='RLF '+ f+','+d;
  $1C,$1D  :Result:='SWAPF '+ f+','+d;
  $1E,$1F  :Result:='INCFSZ '+ f+','+d;
  $20..$27 :Result:='BCF '+ f+','+b;
  $28..$2F :Result:='BSF '+ f+','+b;
  $30..$37 :Result:='BTFSC '+ f+','+b;
  $38..$3F :Result:='BTFSS '+ f+','+b;
  $40..$4F :Result:='CALL '+ kl;
  $50..$5F :Result:='GOTO '+ kl;
  $60..$67 :Result:='MOVLW '+ k;
  $68..$6F :Result:='RETLW '+ k;
  $70,$71  :Result:='IORLW '+ k;
  $72,$73  :Result:='ANDLW '+ k;
  $74,$75  :Result:='XORLW '+ k;
  $76,$77  :Result:='???';
  $78..$7B :Result:='SUBLW '+ k;
  $7C..$7F :Result:='ADDLW '+ k;
  $00:
  begin
   if (Opcode and $3FF8)=$060 then
          begin
    Result:='TRIS '+IntToHex(Opcode and 7,2);
    Exit;
   end;
       case Opcode of
    $000,$020,$040,$060:Result:='NOP';
    $064:Result:='CLRWDT';
    $009:Result:='RETFIE';
    $008:Result:='RETURN';
    $063:Result:='SLEEP';
    $062:Result:='OPTION';
   end;
  end;
 end;
end;
function ParametrosInstruccion(Instruccion:String):Integer;
begin
 case ConvierteToken(Instruccion) of
  $0100,$0064,$0000,$0008,$0009,$0063,$0062: Result:=0; // Sin Operandos
  $0060: Result:=1;     // 0 <= f <= 7
  $0080,$0180: Result:=2;     // 0 <= f <= 127
  $3E00,$3900,$3800,$3000,$3400,$3A00,$3C00: Result:=3; // 0 <= k <= 255
  $2000,$2800: Result:=4;     // 0 <= k <= 2047
  $0700,$0500,$0900,$0300,$0B00,$0A00,$0F00,$0400,$0800,
  $0D00,$0C00,$0200,$0E00,$0600: Result:=5;  // 0 <= f <= 127 y W ó F
  $1000,$1400,$1800,$1C00: Result:=6;   // 0<= f <= 128 / 0 <= b <= 7
  else Result:=-1;
 end;
end;
end.
Responder Con Cita