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
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
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; $0060: Result:=1; $0080,$0180: Result:=2; $3E00,$3900,$3800,$3000,$3400,$3A00,$3C00: Result:=3; $2000,$2800: Result:=4; $0700,$0500,$0900,$0300,$0B00,$0A00,$0F00,$0400,$0800,
$0D00,$0C00,$0200,$0E00,$0600: Result:=5; $1000,$1400,$1800,$1C00: Result:=6; else Result:=-1;
end;
end;
end.