unit Microcontroller;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, atmega328_types, StreamUtils, MicroControllerConstants,
MicroControllerTypes;
type
TMicroControllerMethod = procedure of object;
TMicroControllerMethodTable = array [UInt16] of TMicroControllerMethod;
{ TMicroControllerATMEL }
TMicroControllerATMEL = class
private
function GetPORT(idx: UInt8): UInt8;
function GetRR(idx: UInt8): UInt8;
function GetXPORT(idx: UInt8): UInt8;
procedure SetPORT(idx: UInt8; AValue: UInt8);
procedure SetRR(idx: UInt8; AValue: UInt8);
procedure SetXPORT(idx: UInt8; AValue: UInt8);
protected
FDecodeTable: TMicroControllerMethodTable;
fOnBoardMemory: UInt64;
FProgramMemorySpace: PInt8;
FSRAMDataMemory: PInt8;
FEPROM: PInt8;
FProgramCounter: UInt64;
FPause: boolean;
FSREG: UInt8;
protected
{$I './inc/method_declaration.inc'}
protected
procedure initDecodeTable;
function fetchIstruction: UInt16;
function decodeIstruction(opCode: UInt16): TMicroControllerMethod;
public
constructor Create;
procedure FlushMemory(memory: PInt8; memorySize: UInt64);
procedure run;
property R[idx: UInt8]: UInt8 read GetRR write SetRR;
property PORT[idx: UInt8]: UInt8 read GetPORT write SetPORT;
property XPORT[idx: UInt8]: UInt8 read GetXPORT write SetXPORT;
end;
implementation
{ TMicroControllerATMEL }
function TMicroControllerATMEL.GetPORT(idx: UInt8): UInt8;
begin
Result := FSRAMDataMemory[idx and $1F];
end;
function TMicroControllerATMEL.GetRR(idx: UInt8): UInt8;
begin
Result := FSRAMDataMemory[idx and $5F];
end;
function TMicroControllerATMEL.GetXPORT(idx: UInt8): UInt8;
begin
Result := FSRAMDataMemory[idx and $FF];
end;
procedure TMicroControllerATMEL.SetPORT(idx: UInt8; AValue: UInt8);
begin
FSRAMDataMemory[idx and $FF] := aValue;
end;
procedure TMicroControllerATMEL.SetRR(idx: UInt8; AValue: UInt8);
begin
FSRAMDataMemory[idx and $1F] := aValue;
end;
procedure TMicroControllerATMEL.SetXPORT(idx: UInt8; AValue: UInt8);
begin
FSRAMDataMemory[idx and $FF] := aValue;
end;
procedure TMicroControllerATMEL.initDecodeTable;
var
index: word;
begin
for index := low(UInt16) to high(UInt16) do
begin
FDecodeTable[index] := @call_nop;
case index of
{$i './inc/decode_instructions.inc'}
end;
end;
end;
function TMicroControllerATMEL.fetchIstruction: UInt16;
begin
if (FProgramCounter > fOnBoardMemory) then
raise EOutOfMemory.Create('Program Counter gone out from memory');
Result := FEPROM[FProgramCounter];
end;
function TMicroControllerATMEL.decodeIstruction(opCode: UInt16): TMicroControllerMethod;
begin
Result := FDecodeTable[opCode];
end;
constructor TMicroControllerATMEL.Create;
begin
initDecodeTable;
FProgramCounter := 0;
fOnBoardMemory := 32 * KB;
FPause := False;
Getmem(FProgramMemorySpace, 16 * KB);
Getmem(FSRAMDataMemory, $08FF);
Getmem(FEPROM, fOnBoardMemory);
FillWord(FEPROM^, fOnBoardMemory, $00);
end;
procedure TMicroControllerATMEL.FlushMemory(memory: PInt8; memorySize: UInt64);
begin
if (memorySize > $3FFF) then
raise EOutOfMemory.Create('Flush Memory Size is great than processor memory');
Move(memory, FProgramMemorySpace, memorySize);
end;
procedure TMicroControllerATMEL.run;
var
opcode: Int16;
begin
while True do
begin
if (FPause) then
continue;
opcode := fetchIstruction;
decodeIstruction(opcode);
end;
end;
{$I './inc/nop.inc'}
{$I './inc/add.inc'}
{$I './inc/adc.inc'}
{$I './inc/and.inc'}
{$I './inc/andi.inc'}
{$I './inc/bclr.inc'}
{$I './inc/asr.inc'}
{$I './inc/adiw.inc'}
{$I './inc/brbs.inc'}
{$I './inc/brcc.inc'}
{$I './inc/brbc.inc'}
{$I './inc/bld.inc'}
{$I './inc/brcs.inc'}
{$I './inc/break.inc'}
{$I './inc/breq.inc'}
{$I './inc/brge.inc'}
{$I './inc/brhc.inc'}
{$I './inc/brhs.inc'}
{$I './inc/brid.inc'}
{$I './inc/brie.inc'}
{$I './inc/brlo.inc'}
{$I './inc/brlt.inc'}
{$I './inc/brmi.inc'}
{$I './inc/brne.inc'}
{$I './inc/brpl.inc'}
{$I './inc/brsh.inc'}
{$I './inc/brtc.inc'}
{$I './inc/brts.inc'}
{$I './inc/brvc.inc'}
{$I './inc/brvs.inc'}
{$I './inc/bset.inc'}
{$I './inc/bst.inc'}
{$I './inc/call.inc'}
{$I './inc/cbi.inc'}
{$I './inc/clc.inc'}
{$I './inc/clh.inc'}
{$I './inc/cli.inc'}
{$I './inc/cln.inc'}
{$I './inc/clr.inc'}
{$I './inc/cls.inc'}
{$I './inc/clt.inc'}
{$I './inc/clv.inc'}
{$I './inc/clz.inc'}
{$I './inc/com.inc'}
{$I './inc/cp.inc'}
{$I './inc/cpc.inc'}
{$I './inc/cpi.inc'}
{$I './inc/cpse.inc'}
{$I './inc/dec.inc'}
{$I './inc/eicall.inc'}
{$I './inc/eijmp.inc'}
{$I './inc/elpm.inc'}
{$I './inc/elpm.inc'}
{$I './inc/elpm.inc'}
{$I './inc/eor.inc'}
{$I './inc/fmul.inc'}
{$I './inc/fmuls.inc'}
{$I './inc/fmulsu.inc'}
{$I './inc/icall.inc'}
{$I './inc/ijmp.inc'}
{$I './inc/in.inc'}
{$I './inc/inc.inc'}
{$I './inc/jmp.inc'}
{$I './inc/ld.inc'}
{$I './inc/ld.inc'}
{$I './inc/ld.inc'}
{$I './inc/ld.inc'}
{$I './inc/ld.inc'}
{$I './inc/ld.inc'}
{$I './inc/ld.inc'}
{$I './inc/ld.inc'}
{$I './inc/ld.inc'}
{$I './inc/ld.inc'}
{$I './inc/ld.inc'}
{$I './inc/ldi.inc'}
{$I './inc/lds.inc'}
{$I './inc/lpm.inc'}
{$I './inc/lpm.inc'}
{$I './inc/lpm.inc'}
{$I './inc/lsl.inc'}
{$I './inc/lsr.inc'}
{$I './inc/mov.inc'}
{$I './inc/movw.inc'}
{$I './inc/mul.inc'}
{$I './inc/muls.inc'}
{$I './inc/mulsu.inc'}
{$I './inc/neg.inc'}
{$I './inc/nop.inc'}
{$I './inc/or.inc'}
{$I './inc/ori.inc'}
{$I './inc/out.inc'}
{$I './inc/pop.inc'}
{$I './inc/push.inc'}
{$I './inc/rcall.inc'}
{$I './inc/ret.inc'}
{$I './inc/reti.inc'}
{$I './inc/rjmp.inc'}
{$I './inc/rol.inc'}
{$I './inc/ror.inc'}
{$I './inc/sbc.inc'}
{$I './inc/sbci.inc'}
{$I './inc/sbi.inc'}
{$I './inc/sbic.inc'}
{$I './inc/sbis.inc'}
{$I './inc/sbiw.inc'}
{$I './inc/sbr.inc'}
{$I './inc/sbrc.inc'}
{$I './inc/sbrs.inc'}
{$I './inc/sec.inc'}
{$I './inc/seh.inc'}
{$I './inc/sei.inc'}
{$I './inc/sen.inc'}
{$I './inc/ser.inc'}
{$I './inc/ses.inc'}
{$I './inc/set.inc'}
{$I './inc/sev.inc'}
{$I './inc/sez.inc'}
{$I './inc/sleep.inc'}
{$I './inc/spm.inc'}
{$I './inc/st.inc'}
{$I './inc/st.inc'}
{$I './inc/st.inc'}
{$I './inc/st.inc'}
{$I './inc/st.inc'}
{$I './inc/st.inc'}
{$I './inc/st.inc'}
{$I './inc/st.inc'}
{$I './inc/st.inc'}
{$I './inc/st.inc'}
{$I './inc/st.inc'}
{$I './inc/sts.inc'}
{$I './inc/sub.inc'}
{$I './inc/subi.inc'}
{$I './inc/swap.inc'}
{$I './inc/tst.inc'}
{$I './inc/wdr.inc'}
end.
procedure call_adc; virtual;
procedure call_add; virtual;
procedure call_adiw; virtual;
procedure call_and; virtual;
procedure call_andi; virtual;
procedure call_asr; virtual;
procedure call_bclr; virtual;
procedure call_bld; virtual;
procedure call_brbc; virtual;
procedure call_brbs; virtual;
procedure call_brcc; virtual;
procedure call_brcs; virtual;
procedure call_break; virtual;
procedure call_breq; virtual;
procedure call_brge; virtual;
procedure call_brhc; virtual;
procedure call_brhs; virtual;
procedure call_brid; virtual;
procedure call_brie; virtual;
procedure call_brlo; virtual;
procedure call_brlt; virtual;
procedure call_brmi; virtual;
procedure call_brne; virtual;
procedure call_brpl; virtual;
procedure call_brsh; virtual;
procedure call_brtc; virtual;
procedure call_brts; virtual;
procedure call_brvc; virtual;
procedure call_brvs; virtual;
procedure call_bset; virtual;
procedure call_bst; virtual;
procedure call_call; virtual;
procedure call_cbi; virtual;
procedure call_clc; virtual;
procedure call_clh; virtual;
procedure call_cli; virtual;
procedure call_cln; virtual;
procedure call_clr; virtual;
procedure call_cls; virtual;
procedure call_clt; virtual;
procedure call_clv; virtual;
procedure call_clz; virtual;
procedure call_com; virtual;
procedure call_cp; virtual;
procedure call_cpc; virtual;
procedure call_cpi; virtual;
procedure call_cpse; virtual;
procedure call_dec; virtual;
procedure call_eicall; virtual;
procedure call_eijmp; virtual;
procedure call_elpm; virtual;
procedure call_eor; virtual;
procedure call_fmul; virtual;
procedure call_fmuls; virtual;
procedure call_fmulsu; virtual;
procedure call_icall; virtual;
procedure call_ijmp; virtual;
procedure call_in; virtual;
procedure call_inc; virtual;
procedure call_jmp; virtual;
procedure call_ld; virtual;
procedure call_ldi; virtual;
procedure call_lds; virtual;
procedure call_lpm; virtual;
procedure call_lsl; virtual;
procedure call_lsr; virtual;
procedure call_mov; virtual;
procedure call_movw; virtual;
procedure call_mul; virtual;
procedure call_muls; virtual;
procedure call_mulsu; virtual;
procedure call_neg; virtual;
procedure call_nop; virtual;
procedure call_or; virtual;
procedure call_ori; virtual;
procedure call_out; virtual;
procedure call_pop; virtual;
procedure call_push; virtual;
procedure call_rcall; virtual;
procedure call_ret; virtual;
procedure call_reti; virtual;
procedure call_rjmp; virtual;
procedure call_rol; virtual;
procedure call_ror; virtual;
procedure call_sbc; virtual;
procedure call_sbci; virtual;
procedure call_sbi; virtual;
procedure call_sbic; virtual;
procedure call_sbis; virtual;
procedure call_sbiw; virtual;
procedure call_sbr; virtual;
procedure call_sbrc; virtual;
procedure call_sbrs; virtual;
procedure call_sec; virtual;
procedure call_seh; virtual;
procedure call_sei; virtual;
procedure call_sen; virtual;
procedure call_ser; virtual;
procedure call_ses; virtual;
procedure call_set; virtual;
procedure call_sev; virtual;
procedure call_sez; virtual;
procedure call_sleep; virtual;
procedure call_spm; virtual;
procedure call_st; virtual;
procedure call_sts; virtual;
procedure call_sub; virtual;
procedure call_subi; virtual;
procedure call_swap; virtual;
procedure call_tst; virtual;
procedure call_wdr; virtual;
procedure TMicroControllerATMEL.call_nop;
Begin
inc(fProgramCounter, 1);
End;
procedure TMicroControllerATMEL.call_add;
Begin
inc(fProgramCounter, 1);
End;
procedure TMicroControllerATMEL.call_elpm;
Begin
inc(fProgramCounter, 1);
End;
Errori in compilazione:
Compila il progetto, Destinazione: C:\lavoro\lazarus\projects\attuali\Processor\bin\i386-win32\ATmega328_Emu.exe: Codice di uscita 1, Errori: 50, suggerimenti: 2
Hint: Start of reading config file C:\programmi\lazarus1.6\fpc\3.0.0\bin\i386-win32\fpc.cfg
Hint: End of reading config file C:\programmi\lazarus1.6\fpc\3.0.0\bin\i386-win32\fpc.cfg
elpm.inc(1,33) Error: overloaded functions have the same parameter list
elpm.inc(1,33) Error: Found declaration: call_elpm;
elpm.inc(1,33) Error: function header doesn't match any method of this class "call_elpm;"
elpm.inc(1,33) Error: Found declaration: call_elpm;
elpm.inc(1,33) Error: overloaded functions have the same parameter list
elpm.inc(1,33) Error: Found declaration: call_elpm;
elpm.inc(1,33) Error: Found declaration: call_elpm;
elpm.inc(1,33) Error: function header doesn't match any method of this class "call_elpm;"
elpm.inc(1,33) Error: Found declaration: call_elpm;
elpm.inc(1,33) Error: Found declaration: call_elpm;
ld.inc(1,33) Error: overloaded functions have the same parameter list
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: function header doesn't match any method of this class "call_ld;"
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: overloaded functions have the same parameter list
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: function header doesn't match any method of this class "call_ld;"
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: overloaded functions have the same parameter list
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: function header doesn't match any method of this class "call_ld;"
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: overloaded functions have the same parameter list
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: function header doesn't match any method of this class "call_ld;"
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: overloaded functions have the same parameter list
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: function header doesn't match any method of this class "call_ld;"
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;
ld.inc(1,33) Error: Found declaration: call_ld;