summaryrefslogtreecommitdiff
path: root/bootloader/bootloader-887.asm
blob: dbe2fac7a6827d860af82ee285a4635240a7227a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  ;;
  ;;  spreadspace pic utils
  ;;
  ;;
  ;;  Copyright (C) 2011 Christian Pointner <equinox@spreadspace.org>
  ;;
  ;;  This file is part of spreadspace pic utils.
  ;;
  ;;  spreadspace pic utils is free software: you can redistribute it and/or modify
  ;;  it under the terms of the GNU General Public License as published by
  ;;  the Free Software Foundation, either version 3 of the License, or
  ;;  any later version.
  ;;
  ;;  spreadspace pic utils is distributed in the hope that it will be useful,
  ;;  but WITHOUT ANY WARRANTY; without even the implied warranty of
  ;;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  ;;  GNU General Public License for more details.
  ;;
  ;;  You should have received a copy of the GNU General Public License
  ;;  along with spreadspace pic utils. If not, see <http://www.gnu.org/licenses/>.
  ;;
  ;; -------------------------------------
  ;; PREAMBLE

  LIST      p=16F887
  include   "p16f887.inc"
  __config  _CONFIG1,  _DEBUG_OFF & _LVP_OFF & _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _INTOSC
  __config  _CONFIG2,  _BOR21V & _WRT_256

  ;; -------------------------------------
  ;; DEFINES (chip/com specific)
#define BOOTPIN           PORTC,7
USERVECT        EQU       H'100'
ISRVECT         EQU       USERVECT + H'4'
FLASH_BOUNDARY  EQU       b'00001111' ; flash write boundary is at 16 bytes boundaries

VERSION_MAJ     EQU       .0
VERSION_MIN     EQU       .1
NAME_0          EQU       '8'
NAME_1          EQU       '8'
NAME_2          EQU       '7'
DEVID_L         EQU       H'82'
DEVID_H         EQU       H'20'
FLASH_SIZE_L    EQU       H'00'
FLASH_SIZE_H    EQU       H'20'       ; 0x2000 -> 8192 Words of Flash
FSS             EQU       .16         ; writing is done 8 words at a time but 16 words get erased
EEPROM_SIZE_L   EQU       H'00'
EEPROM_SIZE_H   EQU       H'01'       ; 0x0100 -> 256 Bytes of EEPROM
MESS            EQU       .64         ; this limit is because of to combuff size and single byte len field for messages
SUPPORTED_H     EQU       .0
SUPPORTED_L     EQU       b'00000110' ; only read/write flash is supported by now

#define HOOK_CMD_RESET    cmd_not_impl
#define HOOK_CMD_R_FLASH  cmd_r_flash
#define HOOK_CMD_W_FLASH  cmd_w_flash
#define HOOK_CMD_R_EEPROM cmd_not_impl
#define HOOK_CMD_W_EEPROM cmd_not_impl
#define HOOK_CMD_R_CONFIG cmd_not_impl
#define HOOK_CMD_W_CONFIG cmd_not_impl

  ;; Variables
combuff         EQU       H'0020'
combuff_end     EQU       H'006F'

current_cmdlen  EQU       H'0070'
csum            EQU       H'0071'

flags           EQU       H'007D'
#define F_CMD_STARTED     flags,0

cnt2            EQU       H'007E'
cnt             EQU       H'007F'


  ;; -------------------------------------
  ;; DEFINES (defines)
#include "generic-defines.inc"

  ;; -------------------------------------
  ;; Bootloader init
#include "generic-init.inc"

  ;; -------------------------------------
  ;; Bootloader (com specific subroutines and init)
#include "com-887-uart.inc"

  ;; -------------------------------------
  ;; Bootloader (generic init/body)
#include "generic-mainloop.inc"

  ;; -------------------------------------
  ;;  chip specific commands
#include "cmds-16f887.inc"

  ;; -------------------------------------
  ;; -------------------------------------
  ;; dummy user code
  org       USERVECT
  ;; goto      USERVECT
  bsf       STATUS,RP0
  bcf       TRISD,0
  bcf       STATUS,RP0
userloop
  movlw     b'00000001'
  xorwf     PORTD,f
  movlw     .255
  movwf     cnt
usercnt
  movlw     .255
  movwf     cnt2
usercnt2
  decfsz    cnt2,f
  goto      usercnt2
  decfsz    cnt,f
  goto      usercnt
  goto      userloop

  ;; -------------------------------------
  ;; END
  end