program sss;

{$NOSHADOW}
{ $WG}                     {global Warnings off}

Device = mega168P, VCC=5;
{$BOOTRST $01C00}          {Reset Jump to $01C00}

Define_Fuses
//  Override_Fuses;
  NoteBook   = A;
  COMport    = USB;
  LockBits0 = [];
  FuseBits0  = [];
  FuseBits1  = [];
  FuseBits2  = [BOOTRST, BOOTSZ0, BOOTSZ1];

Import SysTick, FlashWrite;

From System Import ;


Define
  ProcClock      = 16000000;       {Hertz}
  SysTick        = 10;             {msec}
  StackSize      = $0032, iData;
  FrameSize      = $0032, iData;

Implementation

{$IDATA}

{--------------------------------------------------------------}
{ Type Declarations }

type


{--------------------------------------------------------------}
{ Const Declarations }
const
  _BootCheckF[@$37FE]  : word    = $AA55;

{--------------------------------------------------------------}
{ Var Declarations }
{$IDATA}


{--------------------------------------------------------------}
{ functions }

{$PHASE BootBlock $01C00}
procedure BootTest;               // this is the first code building
begin                             // part of the boot block
                                  // this is the absolute reset entry
  ASM;
   ; check Flash validity         // replace "%" by real name
    LDI       _ACCCLO, %._BOOTCHECKF AND 0FFh
    LDI       _ACCCHI, %._BOOTCHECKF SHRB 8
    LPM       _ACCA, Z+
    CPI       _ACCA, 055h
    BRNE      BootTestX
    LPM       _ACCA, Z+
    CPI       _ACCA, 0AAh
    BRNE      BootTestX
   ;  // normal program start
    JMP       0000h;
    BootTestX:
   ; // check failed, try to download
  ENDASM;

  FlashDownLoader;
end;

procedure FlashLoaderInit;
begin
  ASM;
   ; > > SERPORT Init < <
   ; > > Baudrate 2400Baud < <
    LDI       _ACCA, 01Dh                   ; Rx and Tx enanable, polling
    STS       ucr1, _ACCA                   ;
    LDI       _ACCA, 0A0h                   ; Baud
    STS       UBRR0L, _ACCA                 ;
    LDI       _ACCA, 001h
    STS       UBRR0H, _ACCA                  ;
  ENDASM;
end;

procedure FlashLoaderRecv;
begin
  ASM;
FLASHLDRRX:
    LDS       _ACCA, usr1                    ; Receiver ready?
    SBRS      _ACCA, 7                       ; Receiver ready?
    RJMP      FLASHLDRRX                     ; if not
    LDS       _ACCA, udr1
  ENDASM;
end;

procedure FlashLoaderTransm;
begin
  ASM;
FLASHLDRTX:
    LDS       _ACCB, usr1                   ; Transmitter ready?
    SBRS      _ACCB, 5                      ; Transmitter ready?
    RJMP      FLASHLDRTX                    ; if not
    STS       udr1, _ACCA
  ENDASM;
end;

{ optional
procedure FlashLoaderExit;
begin
  ASM: JMP    0000h;
end;
}
{$DEPHASE BootBlock}



{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin


  EnableInts;
  loop


  endloop;
end sss.

