diff --git a/BPv3-bootloader/firmware-v4.5/src/devices.inc b/BPv3-bootloader/firmware-v4.5/devices.inc
similarity index 95%
rename from BPv3-bootloader/firmware-v4.5/src/devices.inc
rename to BPv3-bootloader/firmware-v4.5/devices.inc
index 5d2a96d0..f414bde1 100644
--- a/BPv3-bootloader/firmware-v4.5/src/devices.inc
+++ b/BPv3-bootloader/firmware-v4.5/devices.inc
@@ -1,412 +1,412 @@
-;------------------------------------------------------------------------------
-;
-; Title: ds30 loader for PIC24FJ
-;
-; File description: Device specific constants
-;
-; Copyright: Copyright © 2009, Mikael Gustafsson
-;
-; Webpage: http://mrmackey.no-ip.org/elektronik/ds30loader/
-;
-; History: 1.0.1 Removed some incorrect include for ga002 and ga004
-; 1.0.0 Removed PIC24FxxKAyyy stuff, se separate fw
-; 0.9.1 Added pps equ
-; 0.9.0 First version of this file
-;
-;------------------------------------------------------------------------------
-
-;-----------------------------------------------------------------------------
-; This file is part of ds30 Loader.
-;
-; ds30 Loader 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.
-;
-; ds30 Loader 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 ds30 Loader. If not, see .
-;------------------------------------------------------------------------------
-
-
-;------------------------------------------------------------------------------
-; Devices PIC24F - 16kB
-;------------------------------------------------------------------------------
-.ifdef __24FJ16GA002
- .include "p24FJ"
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x2C00
- .equ HAS_UART2, 1
- .equ DEVICEID, 206
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ16GA004
- .include "p24FJ"
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x2C00
- .equ HAS_UART2, 1
- .equ DEVICEID, 207
- .equ HAS_PPS, 1
-.endif
-
-
-;------------------------------------------------------------------------------
-; Devices PIC24F - 32kB
-;------------------------------------------------------------------------------
-.ifdef __24FJ32GA002
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x5800
- .equ HAS_UART2, 1
- .equ DEVICEID, 208
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ32GA004
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x5800
- .equ HAS_UART2, 1
- .equ DEVICEID, 209
- .equ HAS_PPS, 1
-.endif
-
-
-;------------------------------------------------------------------------------
-; Devices PIC24F - 48kB
-;------------------------------------------------------------------------------
-.ifdef __24FJ48GA002
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x8400
- .equ HAS_UART2, 1
- .equ DEVICEID, 210
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ48GA004
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x8400
- .equ HAS_UART2, 1
- .equ DEVICEID, 211
- .equ HAS_PPS, 1
-.endif
-
-
-;------------------------------------------------------------------------------
-; Devices PIC24F - 64kB
-;------------------------------------------------------------------------------
-.ifdef __24FJ64GA002
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0xAC00
- .equ HAS_UART2, 1
- .equ DEVICEID, 212
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ64GA004
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0xAC00
- .equ HAS_UART2, 1
- .equ DEVICEID, 213.
- equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ64GA006
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0xAC00
- .equ HAS_UART2, 1
- .equ DEVICEID, 214
-.endif
-
-.ifdef __24FJ64GA008
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0xAC00
- .equ HAS_UART2, 1
- .equ DEVICEID, 215
-.endif
-
-.ifdef __24FJ64GA010
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0xAC00
- .equ HAS_UART2, 1
- .equ DEVICEID, 216
-.endif
-
-.ifdef __24FJ64GB106
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0xAC00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 217
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ64GB108
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0xAC00
- .equ HAS_UART2, 1
- .equ DEVICEID, 218
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ64GB110
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0xAC00
- .equ HAS_UART2, 1
- .equ DEVICEID, 219
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ HAS_PPS, 1
-.endif
-
-
-;------------------------------------------------------------------------------
-; Devices PIC24F - 96kB
-;------------------------------------------------------------------------------
-.ifdef __24FJ96GA006
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x10000
- .equ HAS_UART2, 1
- .equ DEVICEID, 220
-.endif
-
-.ifdef __24FJ96GA008
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x10000
- .equ HAS_UART2, 1
- .equ DEVICEID, 221
-.endif
-
-.ifdef __24FJ96GA010
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x10000
- .equ HAS_UART2, 1
- .equ DEVICEID, 222
-.endif
-
-
-;------------------------------------------------------------------------------
-; Devices PIC24F - 128kB
-;------------------------------------------------------------------------------
-.ifdef __24FJ128GA006
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x15800
- .equ HAS_UART2, 1
- .equ DEVICEID, 223
-.endif
-
-.ifdef __24FJ128GA008
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x15800
- .equ HAS_UART2, 1
- .equ DEVICEID, 224
-.endif
-
-.ifdef __24FJ128GA010
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x15800
- .equ HAS_UART2, 1
- .equ DEVICEID, 225
-.endif
-
-.ifdef __24FJ128GA106
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x15800
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 226
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ128GA108
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x15800
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 227
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ128GA110
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x15800
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 228
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ128GB106
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x15800
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 229
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ128GB108
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x15800
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 230
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ128GB110
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x15800
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 231
- .equ HAS_PPS, 1
-.endif
-
-
-;------------------------------------------------------------------------------
-; Devices PIC24F - 192kB
-;------------------------------------------------------------------------------
-.ifdef __24FJ192GA106
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x20C00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 232
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ192GA108
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x20C00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 233
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ192GA110
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x20C00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 234
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ192GB106
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x20C00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 235
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ192GB108
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x20C00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 236
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ192GB110
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x20C00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 237
- .equ HAS_PPS, 1
-.endif
-
-
-;------------------------------------------------------------------------------
-; Devices PIC24F - 256kB
-;------------------------------------------------------------------------------
-.ifdef __24FJ256GA106
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x2AC00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 238
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ256GA108
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x2AC00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 239
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ256GA110
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x2AC00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 240
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ256GB106
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x2AC00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 241
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ256GB108
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x2AC00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 242
- .equ HAS_PPS, 1
-.endif
-
-.ifdef __24FJ256GB110
- .equ VALID_DEV, 1
- .equ FLASHSIZE, 0x2AC00
- .equ HAS_UART2, 1
- .equ HAS_UART3, 1
- .equ HAS_UART4, 1
- .equ DEVICEID, 243
- .equ HAS_PPS, 1
-.endif
-
-
-
-;------------------------------------------------------------------------------
-;
-;------------------------------------------------------------------------------
-.ifndef VALID_DEV
- .error "Unknown device specified"
-.endif
+;------------------------------------------------------------------------------
+;
+; Title: ds30 loader for PIC24FJ
+;
+; File description: Device specific constants
+;
+; Copyright: Copyright © 2009, Mikael Gustafsson
+;
+; Webpage: http://mrmackey.no-ip.org/elektronik/ds30loader/
+;
+; History: 1.0.1 Removed some incorrect include for ga002 and ga004
+; 1.0.0 Removed PIC24FxxKAyyy stuff, se separate fw
+; 0.9.1 Added pps equ
+; 0.9.0 First version of this file
+;
+;------------------------------------------------------------------------------
+
+;-----------------------------------------------------------------------------
+; This file is part of ds30 Loader.
+;
+; ds30 Loader 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.
+;
+; ds30 Loader 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 ds30 Loader. If not, see .
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+; Devices PIC24F - 16kB
+;------------------------------------------------------------------------------
+.ifdef __24FJ16GA002
+ .include "p24FJ"
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x2C00
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 206
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ16GA004
+ .include "p24FJ"
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x2C00
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 207
+ .equ HAS_PPS, 1
+.endif
+
+
+;------------------------------------------------------------------------------
+; Devices PIC24F - 32kB
+;------------------------------------------------------------------------------
+.ifdef __24FJ32GA002
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x5800
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 208
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ32GA004
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x5800
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 209
+ .equ HAS_PPS, 1
+.endif
+
+
+;------------------------------------------------------------------------------
+; Devices PIC24F - 48kB
+;------------------------------------------------------------------------------
+.ifdef __24FJ48GA002
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x8400
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 210
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ48GA004
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x8400
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 211
+ .equ HAS_PPS, 1
+.endif
+
+
+;------------------------------------------------------------------------------
+; Devices PIC24F - 64kB
+;------------------------------------------------------------------------------
+.ifdef __24FJ64GA002
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0xAC00
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 212
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ64GA004
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0xAC00
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 213.
+ equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ64GA006
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0xAC00
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 214
+.endif
+
+.ifdef __24FJ64GA008
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0xAC00
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 215
+.endif
+
+.ifdef __24FJ64GA010
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0xAC00
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 216
+.endif
+
+.ifdef __24FJ64GB106
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0xAC00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 217
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ64GB108
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0xAC00
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 218
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ64GB110
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0xAC00
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 219
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ HAS_PPS, 1
+.endif
+
+
+;------------------------------------------------------------------------------
+; Devices PIC24F - 96kB
+;------------------------------------------------------------------------------
+.ifdef __24FJ96GA006
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x10000
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 220
+.endif
+
+.ifdef __24FJ96GA008
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x10000
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 221
+.endif
+
+.ifdef __24FJ96GA010
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x10000
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 222
+.endif
+
+
+;------------------------------------------------------------------------------
+; Devices PIC24F - 128kB
+;------------------------------------------------------------------------------
+.ifdef __24FJ128GA006
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x15800
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 223
+.endif
+
+.ifdef __24FJ128GA008
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x15800
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 224
+.endif
+
+.ifdef __24FJ128GA010
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x15800
+ .equ HAS_UART2, 1
+ .equ DEVICEID, 225
+.endif
+
+.ifdef __24FJ128GA106
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x15800
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 226
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ128GA108
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x15800
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 227
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ128GA110
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x15800
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 228
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ128GB106
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x15800
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 229
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ128GB108
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x15800
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 230
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ128GB110
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x15800
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 231
+ .equ HAS_PPS, 1
+.endif
+
+
+;------------------------------------------------------------------------------
+; Devices PIC24F - 192kB
+;------------------------------------------------------------------------------
+.ifdef __24FJ192GA106
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x20C00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 232
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ192GA108
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x20C00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 233
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ192GA110
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x20C00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 234
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ192GB106
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x20C00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 235
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ192GB108
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x20C00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 236
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ192GB110
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x20C00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 237
+ .equ HAS_PPS, 1
+.endif
+
+
+;------------------------------------------------------------------------------
+; Devices PIC24F - 256kB
+;------------------------------------------------------------------------------
+.ifdef __24FJ256GA106
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x2AC00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 238
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ256GA108
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x2AC00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 239
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ256GA110
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x2AC00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 240
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ256GB106
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x2AC00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 241
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ256GB108
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x2AC00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 242
+ .equ HAS_PPS, 1
+.endif
+
+.ifdef __24FJ256GB110
+ .equ VALID_DEV, 1
+ .equ FLASHSIZE, 0x2AC00
+ .equ HAS_UART2, 1
+ .equ HAS_UART3, 1
+ .equ HAS_UART4, 1
+ .equ DEVICEID, 243
+ .equ HAS_PPS, 1
+.endif
+
+
+
+;------------------------------------------------------------------------------
+;
+;------------------------------------------------------------------------------
+.ifndef VALID_DEV
+ .error "Unknown device specified"
+.endif
diff --git a/BPv3-bootloader/firmware-v4.5/ds30loader.X/nbproject/configurations.xml b/BPv3-bootloader/firmware-v4.5/ds30loader.X/nbproject/configurations.xml
new file mode 100644
index 00000000..b21b9d55
--- /dev/null
+++ b/BPv3-bootloader/firmware-v4.5/ds30loader.X/nbproject/configurations.xml
@@ -0,0 +1,491 @@
+
+
+
+
+ ../devices.inc
+ ../settings.inc
+
+
+ ../p24FJ64GA002.gld
+
+
+ ../ds30loader.s
+
+
+ Makefile
+
+
+
+ ..
+ ../src
+
+ Makefile
+
+
+
+ localhost
+ PIC24FJ64GA002
+
+
+ Simulator
+ XC16
+ 1.26
+ 4
+
+
+
+
+
+
+
+
+
+ false
+ false
+
+
+
+
+ false
+
+ false
+
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/BPv3-bootloader/firmware-v4.5/ds30loader.X/nbproject/project.xml b/BPv3-bootloader/firmware-v4.5/ds30loader.X/nbproject/project.xml
new file mode 100644
index 00000000..ec8501c1
--- /dev/null
+++ b/BPv3-bootloader/firmware-v4.5/ds30loader.X/nbproject/project.xml
@@ -0,0 +1,17 @@
+
+
+ com.microchip.mplab.nbide.embedded.makeproject
+
+
+ ds30loader
+ 56638f5c-bdc0-4c00-a106-d486861d9a16
+ 0
+
+
+
+ inc
+ UTF-8
+
+
+
+
diff --git a/BPv3-bootloader/firmware-v4.5/ds30loader.mcp b/BPv3-bootloader/firmware-v4.5/ds30loader.mcp
deleted file mode 100644
index 4e472e57..00000000
--- a/BPv3-bootloader/firmware-v4.5/ds30loader.mcp
+++ /dev/null
@@ -1,61 +0,0 @@
-[HEADER]
-magic_cookie={66E99B07-E706-4689-9E80-9B2582898A13}
-file_version=1.0
-device=PIC24FJ64GA002
-[PATH_INFO]
-BuildDirPolicy=BuildDirIsSourceDir
-dir_src=
-dir_bin=.\output
-dir_tmp=.\output
-dir_sin=
-dir_inc=
-dir_lib=
-dir_lkr=
-[CAT_FILTERS]
-filter_src=*.s
-filter_inc=*.inc
-filter_obj=*.o
-filter_lib=*.a
-filter_lkr=*.gld
-[CAT_SUBFOLDERS]
-subfolder_src=
-subfolder_inc=
-subfolder_obj=
-subfolder_lib=
-subfolder_lkr=
-[FILE_SUBFOLDERS]
-file_000=.
-file_001=.
-file_002=.
-file_003=.
-[GENERATED_FILES]
-file_000=no
-file_001=no
-file_002=no
-file_003=no
-[OTHER_FILES]
-file_000=no
-file_001=no
-file_002=no
-file_003=no
-[FILE_INFO]
-file_000=src\ds30loader.s
-file_001=src\settings.inc
-file_002=src\devices.inc
-file_003=C:\MC30\support\PIC24F\gld\p24FJ64GA002.gld
-[SUITE_INFO]
-suite_guid={F62E444C-B232-4066-9AB0-A6F4E5261396}
-suite_state=
-[TOOL_SETTINGS]
-TS{7D9C6ECE-785D-44CB-BA22-17BF2E119622}=-g
-TS{7DAC9A1D-4C45-45D6-B25A-D117C74E8F5A}=-Map="$(BINDIR_)$(TARGETBASE).map" -o"$(BINDIR_)$(TARGETBASE).$(TARGETSUFFIX)"
-TS{509E5861-1E2A-483B-8B6B-CA8DB7F2DD78}=
-[INSTRUMENTED_TRACE]
-enable=0
-transport=0
-format=0
-[CUSTOM_BUILD]
-Pre-Build=
-Pre-BuildEnabled=1
-Post-Build=
-Post-BuildEnabled=1
diff --git a/BPv3-bootloader/firmware-v4.5/ds30loader.mcw b/BPv3-bootloader/firmware-v4.5/ds30loader.mcw
deleted file mode 100644
index 8bb60b3e..00000000
Binary files a/BPv3-bootloader/firmware-v4.5/ds30loader.mcw and /dev/null differ
diff --git a/BPv3-bootloader/firmware-v4.5/src/ds30loader.s b/BPv3-bootloader/firmware-v4.5/ds30loader.s
similarity index 96%
rename from BPv3-bootloader/firmware-v4.5/src/ds30loader.s
rename to BPv3-bootloader/firmware-v4.5/ds30loader.s
index 81809c00..0231f748 100644
--- a/BPv3-bootloader/firmware-v4.5/src/ds30loader.s
+++ b/BPv3-bootloader/firmware-v4.5/ds30loader.s
@@ -1,615 +1,615 @@
-;------------------------------------------------------------------------------
-; Title: ds30 loader for PIC24FJ
-; Modified for Bus Pirate v2go, v3
-;
-; File description: Main firmwarefile
-;
-; Copyright: Copyright © 2009, Mikael Gustafsson
-;
-; Version 1.0.2 november 2009
-;
-; Webpage: http://mrmackey.no-ip.org/elektronik/ds30loader/
-;
-; History: 1.0.2 Erase is now made just before write to increase reliability
-; 1.0.1 Fixed baudrate error check
-; 1.0.0 Added flash verification
-; Removed PIC24FxxKAyyy stuff, se separate fw
-; Corrected buffer variable location to .bss
-; Buffer is now properly sized
-; 0.9.1 Removed initialization of stack limit register
-; BRG is rounded instead of truncated
-; Removed frc+pll option
-; Added pps code
-; Added baudrate error check
-; 0.9.0 First version released, based on the dsPIC33F version
-
-;------------------------------------------------------------------------------
-
-;-----------------------------------------------------------------------------
-; This file is part of ds30 Loader.
-;
-; ds30 Loader 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.
-;
-; ds30 Loader 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 ds30 Loader. If not, see .
-;------------------------------------------------------------------------------
-
-;------------------------------------------------------------------------------
-;
-; USAGE USAGE USAGE USAGE USAGE USAGE USAGE USAGE USAGE USAGE USAGE
-;
-;------------------------------------------------------------------------------
-;
-;
-; To use other chip and/or configuration you need to do:
-; * Select correct device in MPLAB IDE, menu Configure->Select Device
-; * Include correct linker script
-; * Search for xxx in settings.inc and check/alter those lines
-; * If your device has the PPS(peripheral pin select) feature you need to configure that, template below, search for xxx
-; * Put your own code in this file at designated areas, like i/o initialization etc. (optional)
-; * No device specific errata workarounds are implemented in the code below
-;
-; Tabsize used is 4
-;
-;------------------------------------------------------------------------------
-
-
-;------------------------------------------------------------------------------
-; Register usage
-;------------------------------------------------------------------------------
- ;.equ MIXED, W0 ;immediate
- .equ DOERASE, W1 ;flag indicated erase should be done before next write
- .equ WBUFPTR, W2 ;buffer pointer
- .equ WCNT, W3 ;loop counter
- .equ WADDR2, W4 ;memory pointer
- .equ WADDR, W5 ;memory pointer
- .equ PPSTEMP1, W6 ;used to restore pps register
- .equ PPSTEMP2, W7 ;used to restore pps register
- .equ WFWJUMP, W8 ;did we jump here from the firmware?
- ;.equ UNUSED, W9 ;
- .equ WDEL1, W10 ;delay outer
- .equ WDEL2, W11 ;delay inner
- ;.equ UNUSED, W12 ;
- .equ WCMD, W13 ;command
- .equ WCRC, W14 ;checksum
- .equ WSTPTR, W15 ;stack pointer
-
-
-;------------------------------------------------------------------------------
-; Includes
-;------------------------------------------------------------------------------
- .include "settings.inc"
-
-
-;-----------------------------------------------------------------------------
-; UARTs
-;------------------------------------------------------------------------------
- .ifndef USE_UART1
- .ifndef USE_UART2
- .ifndef USE_UART3
- .ifndef USE_UART4
- .error "No uart is specified"
- .endif
- .endif
- .endif
- .endif
-
- .ifdef USE_UART1
- .ifdef USE_UART2
- .error "Multiple uarts specified"
- .endif
- .ifdef USE_UART3
- .error "Multiple uarts specified"
- .endif
- .ifdef USE_UART4
- .error "Multiple uarts specified"
- .endif
-
- .equ UMODE, U1MODE ;uart mode
- .equ USTA, U1STA ;uart status
- .equ UBRG, U1BRG ;uart baudrate
- .equ UTXREG, U1TXREG ;uart transmit
- .equ URXREG, U1RXREG ;uart receive
- .equ UIFS, IFS0 ;uart interupt flag sfr
- .equ URXIF, U1RXIF ;uart received interupt flag
- .equ UTXIF, U1TXIF ;uart transmit interupt flag
- .endif
-
-;------------------------------------------------------------------------------
-; Constants, don´t change
-;------------------------------------------------------------------------------
- .equ VERMAJ, 1 /*firmware version major*/
- .equ VERMIN, 0 /*fimrware version minor*/
- .equ VERREV, 2 /*firmware version revision*/
-
- .equ HELLO, 0xC1
- .equ OK, 'K' /*erase/write ok*/
- .equ CHECKSUMERR,'N' /*checksum error*/
- .equ VERFAIL, 'V' /*verification failed*/
- .equ BLPROT, 'P' /*bl protection tripped*/
-
-
- .equ BLDELAY, ( BLTIME * (FCY / 1000) / (65536 * 7) ) /*delay berfore user application is loaded*/
- ;.equ UARTBR, ( (((FCY / BAUDRATE) / 8) - 1) / 2 ) /*baudrate*/
- /* issue 11 in errata for A3, optimal value causes reception to fail */
- /* autocalculate: 0x21, <2.5% error */
- /* working: 0x22, <3% error, same as main firmware */
- .equ UARTBR, 0x22;((FCY/(4*BAUDRATE))-1)
- .equ PAGESIZE, 512 /*words*/
- .equ ROWSIZE, 64 /*words*/
-; .equ STARTADDR, ( FLASHSIZE - 2*(PAGESIZE * 2) ) /*place bootloader in 2nd last program page*/
- .equ STARTADDR, ( FLASHSIZE - (2* (PAGESIZE)) ) /*place bootloader in last program page*/
- .equ BLCHECKST, ( STARTADDR - (ROWSIZE) ) /*precalculate the first row write position that would overwrite the bootloader*/
- .equ BLVERSION, 0x0405 ;bootloader version for Bus Pirate firmware (located at last instruction before flash config words)
-;------------------------------------------------------------------------------
-; Validate user settings
-;------------------------------------------------------------------------------
- ; Internal cycle clock
- .if FCY > 16000000
- .error "Fcy specified is out of range"
- .endif
-
- ; Baudrate error
- .equ REALBR, ( FCY / (4 * (UARTBR+1)) )
- .equ BAUDERR, ( (1000 * ( BAUDRATE - REALBR)) / BAUDRATE )
- .if ( BAUDERR > 30) || (BAUDERR < -30 )
- .error "Baudrate error is more than 3%. Remove this check or try another baudrate and/or clockspeed."
- .endif
-
- .if BLDELAY<1
- .error "Bootloader delay is 0"
- .endif
-
-
-;------------------------------------------------------------------------------
-; Global declarations
-;------------------------------------------------------------------------------
- .global __reset ;the label for the first line of code, needed by the linker script
-
-
-;------------------------------------------------------------------------------
-; Uninitialized variables in data memory
-;------------------------------------------------------------------------------
- .bss
-buffer: .space ( ROWSIZE * 3 + 1/*checksum*/ )
-
-
-;------------------------------------------------------------------------------
-; Send macro
-;------------------------------------------------------------------------------
- .macro SendL char
- mov #\char, W0
- mov W0, UTXREG
- .endm
-
-;------------------------------------------------------------------------------
-; variables at the end of the bootloader page
-;------------------------------------------------------------------------------
- .section *, code, address(STARTADDR+(PAGESIZE*2)-8)
-bljump: bra firmwarejump ;main program jump here to access bootloader
-blver: .word BLVERSION ;bootloader major and minor version
-
-
-;------------------------------------------------------------------------------
-; Start of code section in program memory
-;------------------------------------------------------------------------------
- .section *, code, address(STARTADDR-4)
-usrapp: nopr ;these two instructions will be replaced
- nopr ;with a goto to the user app. by the pc program
-
-
-;------------------------------------------------------------------------------
-; Reset vector
-;------------------------------------------------------------------------------
- .section *, code, address(STARTADDR)
-__reset:mov #__SP_init, WSTPTR ;initalize the Stack Pointer
-
-
-;------------------------------------------------------------------------------
-; User specific entry code go here, see also user exit code section at end of file
-;------------------------------------------------------------------------------
- bclr OSCCON, #SOSCEN
- bclr CLKDIV, #RCDIV0 ;set clock divider to 0
-waitPLL:btss OSCCON, #LOCK
- bra waitPLL ;wait for the PLL to lock
-
- mov #0xFFFF, W0 ;all pins to digital
- mov W0, AD1PCFG
-
-;jumper check test
- ;setup the jumper check
- ;enable input on PGx
- bclr LATB, #LATB1 ;rb1 low
- bset TRISB, #TRISB1 ;rb1 input
- bset CNPU1, #CN5PUE ;enable pullups on PGC/CN5/RB1
- ;ground/output on PGx
- bclr LATB, #RB0 ;rb0 low
- bclr TRISB, #TRISB0 ;rb0 output
- ;wait
- nop
- nop
- ;check for jumper
- btsc PORTB,#RB1 ;skip next instruction if RB1=0 (jumper)
- bra quit ;branch to the user application if RB1=0
-
- clr WFWJUMP ;we came from jumper and reset, not firmware jump
-
- ;----------------------------------------------------------------------
- ; UART pps config
- ;----------------------------------------------------------------------
-setup:
- .ifdef BUSPIRATEV2
- ; Backup, these are restored in exit code at end of file
- ; Changes needs to be done in exit, search for xxx
- mov RPINR18, PPSTEMP1 ;xxx
- mov RPOR2, PPSTEMP2 ;xxx
-
- ; Receive, map pin to uart (RP5 on 2/3, RP3 on v1a)
- bset RPINR18, #U1RXR0 ;xxx
- bclr RPINR18, #U1RXR1 ;xxx
- bset RPINR18, #U1RXR2 ;xxx
- bclr RPINR18, #U1RXR3 ;xxx
- bclr RPINR18, #U1RXR4 ;xxx
-
- ; Transmit, map uart to pin (RPOR2bits.RP4R = 3 on 2/3, RPOR1bits.RP2R=3 on v1a)
- bset RPOR2, #RP4R0 ;xxx
- bset RPOR2, #RP4R1 ;xxx
- bclr RPOR2, #RP4R2 ;xxx
- bclr RPOR2, #RP4R3 ;xxx
- bclr RPOR2, #RP4R4 ;xxx
-
- ;MODE LED on during bootload (A1 on 2/3, B4 on v1a)
- bset LATA, #LATA1 ;on
- bclr TRISA, #TRISA1 ;output
- .endif
-
-
- .ifdef BUSPIRATEV1A
- ; Backup, these are restored in exit code at end of file
- ; Changes needs to be done in exit, search for xxx
- mov RPINR18, PPSTEMP1 ;xxx
- mov RPOR1, PPSTEMP2 ;xxx
-
- ; Receive, map pin to uart (RP5 on 2/3, RP3 on v1a)
- bset RPINR18, #U1RXR0 ;xxx
- bset RPINR18, #U1RXR1 ;xxx
- bclr RPINR18, #U1RXR2 ;xxx
- bclr RPINR18, #U1RXR3 ;xxx
- bclr RPINR18, #U1RXR4 ;xxx
-
- ; Transmit, map uart to pin (RPOR2bits.RP4R = 3 on 2/3, RPOR1bits.RP2R=3 on v1a)
- bset RPOR1, #RP2R0 ;xxx
- bset RPOR1, #RP2R1 ;xxx
- bclr RPOR1, #RP2R2 ;xxx
- bclr RPOR1, #RP2R3 ;xxx
- bclr RPOR1, #RP2R4 ;xxx
-
- ;MODE LED on during bootload (A1 on 2/3, B4 on v1a)
- bset LATB, #LATB4 ;on
- bclr TRISB, #TRISB4 ;output
- .endif
-
-
-;------------------------------------------------------------------------------
-; Init
-;------------------------------------------------------------------------------
- clr DOERASE
-
- ;UART
- mov #UARTBR, W0 ;set
- mov W0, UBRG ; baudrate
- bset UMODE, #BRGH ;enable BRGH
- bset UMODE, #UARTEN ;enable UART
- bset USTA, #UTXEN ;enable TX
-
-
-;------------------------------------------------------------------------------
-; Receive hello
-;------------------------------------------------------------------------------
- rcall Receive
- sub #HELLO, W0 ;check
- bra z, helloOK ; prompt
- sub #'#', W0 ;check
- bra z, exit ; prompt
-
- SendL 'B'
- SendL 'L'
- SendL '4'
- SendL '+'
- bra checkexit
-
-
-;------------------------------------------------------------------------------
-; Send device id and firmware version
-;------------------------------------------------------------------------------
-helloOK:SendL DEVICEID
- SendL VERMAJ
- SendL (VERMIN*16 + VERREV)
-
-
-;------------------------------------------------------------------------------
-; Main
-;------------------------------------------------------------------------------
- ; Send ok
-Main: SendL OK
-
- ; Init checksum
-main1: clr WCRC
-
-
- ;----------------------------------------------------------------------
- ; Receive address
- ;----------------------------------------------------------------------
- ; Upper byte
- rcall Receive
- mov W0, TBLPAG
- ; High byte, use PR1 as temporary sfr
- rcall Receive
- mov.b WREG, PR1+1
- ; Low byte, use PR1 as temporary sfr
- rcall Receive
- mov.b WREG, PR1
- ;
- mov PR1, WREG
- mov W0, WADDR
- mov W0, WADDR2
-
-
- ;----------------------------------------------------------------------
- ; Receive command
- ;----------------------------------------------------------------------
- rcall Receive
- mov W0, WCMD
-
-
- ;----------------------------------------------------------------------
- ; Receive nr of data bytes that will follow
- ;----------------------------------------------------------------------
- rcall Receive
- mov W0, WCNT
-
-
- ;----------------------------------------------------------------------
- ; Receive data
- ;----------------------------------------------------------------------
- mov #buffer, WBUFPTR
-rcvdata:
- rcall Receive
- mov.b W0, [WBUFPTR++]
- dec WCNT, WCNT
- bra nz, rcvdata ;last byte received is checksum
-
-
- ;----------------------------------------------------------------------
- ; Check checksum
- ;----------------------------------------------------------------------
- cp0.b WCRC
- bra z, bladdrchk
- SendL CHECKSUMERR
- bra main1
-
-
-
-
- ;----------------------------------------------------------------------
- ; Check address
- ;----------------------------------------------------------------------
- ;check that write and erase range does not overlap the bootloader
- ;this is pretty specific to the bootloader being in the last page
- ;additional checks are needed if your bootloader is located elsewhere.
- ;TBLPAG is always = to 0 on this PIC, no need to verify (check if you have bigger than 64K flash)
-
- ;check the end address
- ;write row size is fixed, any writes at (bootloader start-63) are an error
- ;if write end address (W0) is <= bl start address (WCNT) then OK
- ;= is ok because we don't DEC after adding, write 10 bytes to 10 = end at 19
-bladdrchk:mov #BLCHECKST, WCNT ;last row write postion that won't overwrite the bootloader
- cp WADDR, WCNT ;compare end address, does it overlap?
- bra GTU, bladdrerror ;if greater unsigned then error
- ;protect the jump instruction
- ;check if this is row 0
- ;row 0 ends at 0x3f
- ;mov #0x003f, WCNT
- cp0 WADDR ;, WCNT ;compare address and end of first row,
- bra NZ, ptrinit ;if greater than unsigned, then OK
- ;insert the correct jump address
- ;4 00 a8 00 00 00
- mov #buffer, WBUFPTR
- mov.b #0x04, W0
- mov.b W0, [WBUFPTR++] ;upper byte
- mov.b #(0xff & STARTADDR), W0
- mov.b W0, [WBUFPTR++] ;low byte
- mov.b #(0xff & (STARTADDR>>8)), W0
- mov.b W0, [WBUFPTR++] ;high byte
- mov.b #0x00, W0
- mov.b W0, [WBUFPTR++] ;upper byte
- mov.b #(0xff & (STARTADDR>>16)), W0
- mov.b W0, [WBUFPTR++] ;low byte
- mov.b #0x00, W0
- mov.b W0, [WBUFPTR++] ;high byte
- bra ptrinit ;continue below
-
- ;handle the address error
-bladdrerror:clr DOERASE ;clear, just in case
- SendL BLPROT ;send bootloader protection error
- bra main1 ;
-
- ;----------------------------------------------------------------------
- ; Init pointer
- ;----------------------------------------------------------------------
-ptrinit:mov #buffer, WBUFPTR
-
- ;----------------------------------------------------------------------
- ; Check command
- ;----------------------------------------------------------------------
- ; Write row 0x00 02 00 - 0x02 AB FA
- btsc WCMD, #1
- bra erase
- ; Else erase page
- mov #0xffff, DOERASE
- bra Main
-
-
- ;----------------------------------------------------------------------
- ; Erase page
- ;----------------------------------------------------------------------
-erase: btss DOERASE, #0
- bra program
- tblwtl WADDR, [WADDR] ;"Set base address of erase block", equivalent to setting nvmadr/u in dsPIC30F?
- ; Erase
- mov #0x4042, W0
- rcall Write
- ; Erase finished
- clr DOERASE
-
-
- ;----------------------------------------------------------------------
- ; Write row
- ;----------------------------------------------------------------------
-program:mov #ROWSIZE, WCNT
- ; Load latches
-latlo: tblwth.b [WBUFPTR++], [WADDR] ;upper byte
- tblwtl.b [WBUFPTR++], [WADDR++] ;low byte
- tblwtl.b [WBUFPTR++], [WADDR++] ;high byte
- dec WCNT, WCNT
- bra nz, latlo
- ; Write flash row
- mov #0x4001, W0
- rcall Write
-
-
- ;----------------------------------------------------------------------
- ; Verify row
- ;----------------------------------------------------------------------
- mov #ROWSIZE, WCNT
- mov #buffer, WBUFPTR
- ; Verify upper byte
-verrow: tblrdh.b [WADDR2], W0
- cp.b W0, [WBUFPTR++]
- bra NZ, vfail
- ; Verify low byte
- tblrdl.b [WADDR2++], W0
- cp.b W0, [WBUFPTR++]
- bra NZ, vfail
- ; Verify high byte
- tblrdl.b [WADDR2++], W0
- cp.b W0, [WBUFPTR++]
- bra NZ, vfail
- ; Loop
- dec WCNT, WCNT
- bra nz, verrow
- ; Verify completed without errors
- bra Main
-
-
- ;----------------------------------------------------------------------
- ; Verify fail
- ;----------------------------------------------------------------------
-vfail: SendL VERFAIL
- bra main1
-
-
-;------------------------------------------------------------------------------
-; Write
-;------------------------------------------------------------------------------
-Write: mov W0, NVMCON
- mov #0x55, W0
- mov W0, NVMKEY
- mov #0xAA, W0
- mov W0, NVMKEY
- bset NVMCON, #WR
- nop
- nop
- ; Wait for erase/write to finish
-compl: btsc NVMCON, #WR
- bra compl
- return
-
-
-;------------------------------------------------------------------------------
-; Receive
-;------------------------------------------------------------------------------
- ; Init delay
-Receive:mov #BLDELAY, WDEL1
- ; Check for received byte
-rpt1: clr WDEL2
-rptc: clrwdt ;clear watchdog
- btss USTA, #URXDA
- bra notrcv
- mov URXREG, W0
- add WCRC, W0, WCRC ;add to checksum
- return
- ; Delay
-notrcv: dec WDEL2, WDEL2
- bra nz, rptc
- dec WDEL1, WDEL1
- bra nz, rpt1
- ; If we get here, uart receive timed out
- mov #__SP_init, WSTPTR ;reinitialize the Stack Pointer
-
-checkexit:
- btss WFWJUMP,#0x00 ; skip next if bit0 is 1 (= jumped from bp)
- btss PORTB,#RB1;if we time out and jumper still attached, go to setup
- bra setup
-
-;------------------------------------------------------------------------------
-; Exit point, clean up and load user application
-;------------------------------------------------------------------------------
-exit: bclr UIFS, #URXIF ;clear uart received interupt flag
- bclr UIFS, #UTXIF ;clear uart transmit interupt flag
- bclr USTA, #UTXEN ;disable uart transmit
- bclr UMODE, #UARTEN ;disable uart
- clr PR1 ;clear PR1 was used as temporary sfr
-
-;------------------------------------------------------------------------------
-; User specific exit code go here
-;------------------------------------------------------------------------------
- .ifdef BUSPIRATEV2
- ;MODE LED off
- bclr LATA, #LATA1 ;off
- bset TRISA, #TRISA1 ;input
- ;restore PPS
- mov PPSTEMP1, RPINR18 ;xxx restore
- mov PPSTEMP2, RPOR2 ;xxx pps settings
- .endif
-
- .ifdef BUSPIRATEV1A
- ;MODE LED off
- bclr LATB, #LATB4 ;off
- bset TRISB, #TRISB4 ;input
- ;restore PPS
- mov PPSTEMP1, RPINR18 ;xxx restore
- mov PPSTEMP2, RPOR1 ;xxx pps settings
- .endif
-
-quit: ;clean up from jumper test
- bclr CNPU1, #CN5PUE ;disable pullups on PGC/CN5/RB1
- bset TRISB, #TRISB0 ;rb0 back to input
- mov #0x0000, W0 ;clear pins to analog default
- mov W0, AD1PCFG
-
-;------------------------------------------------------------------------------
-; Load user application
-;------------------------------------------------------------------------------
- bra usrapp
-
-;------------------------------------------------------------------------------
-; firmware jump entry point (kind of like a function because it's never reached from the above code
-;------------------------------------------------------------------------------
-firmwarejump:
- mov #0xffff, WFWJUMP ;flag that we jumped from firmware
- bra setup ;jump to just after jumper check
-
-;------------------------------------------------------------------------------
-; End of code
-;------------------------------------------------------------------------------
- .end
-
-
+;------------------------------------------------------------------------------
+; Title: ds30 loader for PIC24FJ
+; Modified for Bus Pirate v2go, v3
+;
+; File description: Main firmwarefile
+;
+; Copyright: Copyright � 2009, Mikael Gustafsson
+;
+; Version 1.0.2 november 2009
+;
+; Webpage: http://mrmackey.no-ip.org/elektronik/ds30loader/
+;
+; History: 1.0.2 Erase is now made just before write to increase reliability
+; 1.0.1 Fixed baudrate error check
+; 1.0.0 Added flash verification
+; Removed PIC24FxxKAyyy stuff, se separate fw
+; Corrected buffer variable location to .bss
+; Buffer is now properly sized
+; 0.9.1 Removed initialization of stack limit register
+; BRG is rounded instead of truncated
+; Removed frc+pll option
+; Added pps code
+; Added baudrate error check
+; 0.9.0 First version released, based on the dsPIC33F version
+
+;------------------------------------------------------------------------------
+
+;-----------------------------------------------------------------------------
+; This file is part of ds30 Loader.
+;
+; ds30 Loader 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.
+;
+; ds30 Loader 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 ds30 Loader. If not, see .
+;------------------------------------------------------------------------------
+
+;------------------------------------------------------------------------------
+;
+; USAGE USAGE USAGE USAGE USAGE USAGE USAGE USAGE USAGE USAGE USAGE
+;
+;------------------------------------------------------------------------------
+;
+;
+; To use other chip and/or configuration you need to do:
+; * Select correct device in MPLAB IDE, menu Configure->Select Device
+; * Include correct linker script
+; * Search for xxx in settings.inc and check/alter those lines
+; * If your device has the PPS(peripheral pin select) feature you need to configure that, template below, search for xxx
+; * Put your own code in this file at designated areas, like i/o initialization etc. (optional)
+; * No device specific errata workarounds are implemented in the code below
+;
+; Tabsize used is 4
+;
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+; Register usage
+;------------------------------------------------------------------------------
+ ;.equ MIXED, W0 ;immediate
+ .equ DOERASE, W1 ;flag indicated erase should be done before next write
+ .equ WBUFPTR, W2 ;buffer pointer
+ .equ WCNT, W3 ;loop counter
+ .equ WADDR2, W4 ;memory pointer
+ .equ WADDR, W5 ;memory pointer
+ .equ PPSTEMP1, W6 ;used to restore pps register
+ .equ PPSTEMP2, W7 ;used to restore pps register
+ .equ WFWJUMP, W8 ;did we jump here from the firmware?
+ ;.equ UNUSED, W9 ;
+ .equ WDEL1, W10 ;delay outer
+ .equ WDEL2, W11 ;delay inner
+ ;.equ UNUSED, W12 ;
+ .equ WCMD, W13 ;command
+ .equ WCRC, W14 ;checksum
+ .equ WSTPTR, W15 ;stack pointer
+
+
+;------------------------------------------------------------------------------
+; Includes
+;------------------------------------------------------------------------------
+ .include "settings.inc"
+
+
+;-----------------------------------------------------------------------------
+; UARTs
+;------------------------------------------------------------------------------
+ .ifndef USE_UART1
+ .ifndef USE_UART2
+ .ifndef USE_UART3
+ .ifndef USE_UART4
+ .error "No uart is specified"
+ .endif
+ .endif
+ .endif
+ .endif
+
+ .ifdef USE_UART1
+ .ifdef USE_UART2
+ .error "Multiple uarts specified"
+ .endif
+ .ifdef USE_UART3
+ .error "Multiple uarts specified"
+ .endif
+ .ifdef USE_UART4
+ .error "Multiple uarts specified"
+ .endif
+
+ .equ UMODE, U1MODE ;uart mode
+ .equ USTA, U1STA ;uart status
+ .equ UBRG, U1BRG ;uart baudrate
+ .equ UTXREG, U1TXREG ;uart transmit
+ .equ URXREG, U1RXREG ;uart receive
+ .equ UIFS, IFS0 ;uart interupt flag sfr
+ .equ URXIF, U1RXIF ;uart received interupt flag
+ .equ UTXIF, U1TXIF ;uart transmit interupt flag
+ .endif
+
+;------------------------------------------------------------------------------
+; Constants, don�t change
+;------------------------------------------------------------------------------
+ .equ VERMAJ, 1 /*firmware version major*/
+ .equ VERMIN, 0 /*fimrware version minor*/
+ .equ VERREV, 2 /*firmware version revision*/
+
+ .equ HELLO, 0xC1
+ .equ OK, 'K' /*erase/write ok*/
+ .equ CHECKSUMERR,'N' /*checksum error*/
+ .equ VERFAIL, 'V' /*verification failed*/
+ .equ BLPROT, 'P' /*bl protection tripped*/
+
+
+ .equ BLDELAY, ( BLTIME * (FCY / 1000) / (65536 * 7) ) /*delay berfore user application is loaded*/
+ ;.equ UARTBR, ( (((FCY / BAUDRATE) / 8) - 1) / 2 ) /*baudrate*/
+ /* issue 11 in errata for A3, optimal value causes reception to fail */
+ /* autocalculate: 0x21, <2.5% error */
+ /* working: 0x22, <3% error, same as main firmware */
+ .equ UARTBR, 0x22;((FCY/(4*BAUDRATE))-1)
+ .equ PAGESIZE, 512 /*words*/
+ .equ ROWSIZE, 64 /*words*/
+; .equ STARTADDR, ( FLASHSIZE - 2*(PAGESIZE * 2) ) /*place bootloader in 2nd last program page*/
+ .equ STARTADDR, ( FLASHSIZE - (2* (PAGESIZE)) ) /*place bootloader in last program page*/
+ .equ BLCHECKST, ( STARTADDR - (ROWSIZE) ) /*precalculate the first row write position that would overwrite the bootloader*/
+ .equ BLVERSION, 0x0405 ;bootloader version for Bus Pirate firmware (located at last instruction before flash config words)
+;------------------------------------------------------------------------------
+; Validate user settings
+;------------------------------------------------------------------------------
+ ; Internal cycle clock
+ .if FCY > 16000000
+ .error "Fcy specified is out of range"
+ .endif
+
+ ; Baudrate error
+ .equ REALBR, ( FCY / (4 * (UARTBR+1)) )
+ .equ BAUDERR, ( (1000 * ( BAUDRATE - REALBR)) / BAUDRATE )
+ .if ( BAUDERR > 30) || (BAUDERR < -30 )
+ .error "Baudrate error is more than 3%. Remove this check or try another baudrate and/or clockspeed."
+ .endif
+
+ .if BLDELAY<1
+ .error "Bootloader delay is 0"
+ .endif
+
+
+;------------------------------------------------------------------------------
+; Global declarations
+;------------------------------------------------------------------------------
+ .global __reset ;the label for the first line of code, needed by the linker script
+
+
+;------------------------------------------------------------------------------
+; Uninitialized variables in data memory
+;------------------------------------------------------------------------------
+ .bss
+buffer: .space ( ROWSIZE * 3 + 1/*checksum*/ )
+
+
+;------------------------------------------------------------------------------
+; Send macro
+;------------------------------------------------------------------------------
+ .macro SendL char
+ mov #\char, W0
+ mov W0, UTXREG
+ .endm
+
+;------------------------------------------------------------------------------
+; variables at the end of the bootloader page
+;------------------------------------------------------------------------------
+ .section *, code, address(STARTADDR+(PAGESIZE*2)-8)
+bljump: bra firmwarejump ;main program jump here to access bootloader
+blver: .word BLVERSION ;bootloader major and minor version
+
+
+;------------------------------------------------------------------------------
+; Start of code section in program memory
+;------------------------------------------------------------------------------
+ .section *, code, address(STARTADDR-4)
+usrapp: nopr ;these two instructions will be replaced
+ nopr ;with a goto to the user app. by the pc program
+
+
+;------------------------------------------------------------------------------
+; Reset vector
+;------------------------------------------------------------------------------
+ .section *, code, address(STARTADDR)
+__reset:mov #__SP_init, WSTPTR ;initalize the Stack Pointer
+
+
+;------------------------------------------------------------------------------
+; User specific entry code go here, see also user exit code section at end of file
+;------------------------------------------------------------------------------
+ bclr OSCCON, #SOSCEN
+ bclr CLKDIV, #RCDIV0 ;set clock divider to 0
+waitPLL:btss OSCCON, #LOCK
+ bra waitPLL ;wait for the PLL to lock
+
+ mov #0xFFFF, W0 ;all pins to digital
+ mov W0, AD1PCFG
+
+;jumper check test
+ ;setup the jumper check
+ ;enable input on PGx
+ bclr LATB, #LATB1 ;rb1 low
+ bset TRISB, #TRISB1 ;rb1 input
+ bset CNPU1, #CN5PUE ;enable pullups on PGC/CN5/RB1
+ ;ground/output on PGx
+ bclr LATB, #RB0 ;rb0 low
+ bclr TRISB, #TRISB0 ;rb0 output
+ ;wait
+ nop
+ nop
+ ;check for jumper
+ btsc PORTB,#RB1 ;skip next instruction if RB1=0 (jumper)
+ bra quit ;branch to the user application if RB1=0
+
+ clr WFWJUMP ;we came from jumper and reset, not firmware jump
+
+ ;----------------------------------------------------------------------
+ ; UART pps config
+ ;----------------------------------------------------------------------
+setup:
+ .ifdef BUSPIRATEV2
+ ; Backup, these are restored in exit code at end of file
+ ; Changes needs to be done in exit, search for xxx
+ mov RPINR18, PPSTEMP1 ;xxx
+ mov RPOR2, PPSTEMP2 ;xxx
+
+ ; Receive, map pin to uart (RP5 on 2/3, RP3 on v1a)
+ bset RPINR18, #U1RXR0 ;xxx
+ bclr RPINR18, #U1RXR1 ;xxx
+ bset RPINR18, #U1RXR2 ;xxx
+ bclr RPINR18, #U1RXR3 ;xxx
+ bclr RPINR18, #U1RXR4 ;xxx
+
+ ; Transmit, map uart to pin (RPOR2bits.RP4R = 3 on 2/3, RPOR1bits.RP2R=3 on v1a)
+ bset RPOR2, #RP4R0 ;xxx
+ bset RPOR2, #RP4R1 ;xxx
+ bclr RPOR2, #RP4R2 ;xxx
+ bclr RPOR2, #RP4R3 ;xxx
+ bclr RPOR2, #RP4R4 ;xxx
+
+ ;MODE LED on during bootload (A1 on 2/3, B4 on v1a)
+ bset LATA, #LATA1 ;on
+ bclr TRISA, #TRISA1 ;output
+ .endif
+
+
+ .ifdef BUSPIRATEV1A
+ ; Backup, these are restored in exit code at end of file
+ ; Changes needs to be done in exit, search for xxx
+ mov RPINR18, PPSTEMP1 ;xxx
+ mov RPOR1, PPSTEMP2 ;xxx
+
+ ; Receive, map pin to uart (RP5 on 2/3, RP3 on v1a)
+ bset RPINR18, #U1RXR0 ;xxx
+ bset RPINR18, #U1RXR1 ;xxx
+ bclr RPINR18, #U1RXR2 ;xxx
+ bclr RPINR18, #U1RXR3 ;xxx
+ bclr RPINR18, #U1RXR4 ;xxx
+
+ ; Transmit, map uart to pin (RPOR2bits.RP4R = 3 on 2/3, RPOR1bits.RP2R=3 on v1a)
+ bset RPOR1, #RP2R0 ;xxx
+ bset RPOR1, #RP2R1 ;xxx
+ bclr RPOR1, #RP2R2 ;xxx
+ bclr RPOR1, #RP2R3 ;xxx
+ bclr RPOR1, #RP2R4 ;xxx
+
+ ;MODE LED on during bootload (A1 on 2/3, B4 on v1a)
+ bset LATB, #LATB4 ;on
+ bclr TRISB, #TRISB4 ;output
+ .endif
+
+
+;------------------------------------------------------------------------------
+; Init
+;------------------------------------------------------------------------------
+ clr DOERASE
+
+ ;UART
+ mov #UARTBR, W0 ;set
+ mov W0, UBRG ; baudrate
+ bset UMODE, #BRGH ;enable BRGH
+ bset UMODE, #UARTEN ;enable UART
+ bset USTA, #UTXEN ;enable TX
+
+
+;------------------------------------------------------------------------------
+; Receive hello
+;------------------------------------------------------------------------------
+ rcall Receive
+ sub #HELLO, W0 ;check
+ bra z, helloOK ; prompt
+ sub #'#', W0 ;check
+ bra z, exit ; prompt
+
+ SendL 'B'
+ SendL 'L'
+ SendL '4'
+ SendL '+'
+ bra checkexit
+
+
+;------------------------------------------------------------------------------
+; Send device id and firmware version
+;------------------------------------------------------------------------------
+helloOK:SendL DEVICEID
+ SendL VERMAJ
+ SendL (VERMIN*16 + VERREV)
+
+
+;------------------------------------------------------------------------------
+; Main
+;------------------------------------------------------------------------------
+ ; Send ok
+Main: SendL OK
+
+ ; Init checksum
+main1: clr WCRC
+
+
+ ;----------------------------------------------------------------------
+ ; Receive address
+ ;----------------------------------------------------------------------
+ ; Upper byte
+ rcall Receive
+ mov W0, TBLPAG
+ ; High byte, use PR1 as temporary sfr
+ rcall Receive
+ mov.b WREG, PR1+1
+ ; Low byte, use PR1 as temporary sfr
+ rcall Receive
+ mov.b WREG, PR1
+ ;
+ mov PR1, WREG
+ mov W0, WADDR
+ mov W0, WADDR2
+
+
+ ;----------------------------------------------------------------------
+ ; Receive command
+ ;----------------------------------------------------------------------
+ rcall Receive
+ mov W0, WCMD
+
+
+ ;----------------------------------------------------------------------
+ ; Receive nr of data bytes that will follow
+ ;----------------------------------------------------------------------
+ rcall Receive
+ mov W0, WCNT
+
+
+ ;----------------------------------------------------------------------
+ ; Receive data
+ ;----------------------------------------------------------------------
+ mov #buffer, WBUFPTR
+rcvdata:
+ rcall Receive
+ mov.b W0, [WBUFPTR++]
+ dec WCNT, WCNT
+ bra nz, rcvdata ;last byte received is checksum
+
+
+ ;----------------------------------------------------------------------
+ ; Check checksum
+ ;----------------------------------------------------------------------
+ cp0.b WCRC
+ bra z, bladdrchk
+ SendL CHECKSUMERR
+ bra main1
+
+
+
+
+ ;----------------------------------------------------------------------
+ ; Check address
+ ;----------------------------------------------------------------------
+ ;check that write and erase range does not overlap the bootloader
+ ;this is pretty specific to the bootloader being in the last page
+ ;additional checks are needed if your bootloader is located elsewhere.
+ ;TBLPAG is always = to 0 on this PIC, no need to verify (check if you have bigger than 64K flash)
+
+ ;check the end address
+ ;write row size is fixed, any writes at (bootloader start-63) are an error
+ ;if write end address (W0) is <= bl start address (WCNT) then OK
+ ;= is ok because we don't DEC after adding, write 10 bytes to 10 = end at 19
+bladdrchk:mov #BLCHECKST, WCNT ;last row write postion that won't overwrite the bootloader
+ cp WADDR, WCNT ;compare end address, does it overlap?
+ bra GTU, bladdrerror ;if greater unsigned then error
+ ;protect the jump instruction
+ ;check if this is row 0
+ ;row 0 ends at 0x3f
+ ;mov #0x003f, WCNT
+ cp0 WADDR ;, WCNT ;compare address and end of first row,
+ bra NZ, ptrinit ;if greater than unsigned, then OK
+ ;insert the correct jump address
+ ;4 00 a8 00 00 00
+ mov #buffer, WBUFPTR
+ mov.b #0x04, W0
+ mov.b W0, [WBUFPTR++] ;upper byte
+ mov.b #(0xff & STARTADDR), W0
+ mov.b W0, [WBUFPTR++] ;low byte
+ mov.b #(0xff & (STARTADDR>>8)), W0
+ mov.b W0, [WBUFPTR++] ;high byte
+ mov.b #0x00, W0
+ mov.b W0, [WBUFPTR++] ;upper byte
+ mov.b #(0xff & (STARTADDR>>16)), W0
+ mov.b W0, [WBUFPTR++] ;low byte
+ mov.b #0x00, W0
+ mov.b W0, [WBUFPTR++] ;high byte
+ bra ptrinit ;continue below
+
+ ;handle the address error
+bladdrerror:clr DOERASE ;clear, just in case
+ SendL BLPROT ;send bootloader protection error
+ bra main1 ;
+
+ ;----------------------------------------------------------------------
+ ; Init pointer
+ ;----------------------------------------------------------------------
+ptrinit:mov #buffer, WBUFPTR
+
+ ;----------------------------------------------------------------------
+ ; Check command
+ ;----------------------------------------------------------------------
+ ; Write row 0x00 02 00 - 0x02 AB FA
+ btsc WCMD, #1
+ bra erase
+ ; Else erase page
+ mov #0xffff, DOERASE
+ bra Main
+
+
+ ;----------------------------------------------------------------------
+ ; Erase page
+ ;----------------------------------------------------------------------
+erase: btss DOERASE, #0
+ bra program
+ tblwtl WADDR, [WADDR] ;"Set base address of erase block", equivalent to setting nvmadr/u in dsPIC30F?
+ ; Erase
+ mov #0x4042, W0
+ rcall Write
+ ; Erase finished
+ clr DOERASE
+
+
+ ;----------------------------------------------------------------------
+ ; Write row
+ ;----------------------------------------------------------------------
+program:mov #ROWSIZE, WCNT
+ ; Load latches
+latlo: tblwth.b [WBUFPTR++], [WADDR] ;upper byte
+ tblwtl.b [WBUFPTR++], [WADDR++] ;low byte
+ tblwtl.b [WBUFPTR++], [WADDR++] ;high byte
+ dec WCNT, WCNT
+ bra nz, latlo
+ ; Write flash row
+ mov #0x4001, W0
+ rcall Write
+
+
+ ;----------------------------------------------------------------------
+ ; Verify row
+ ;----------------------------------------------------------------------
+ mov #ROWSIZE, WCNT
+ mov #buffer, WBUFPTR
+ ; Verify upper byte
+verrow: tblrdh.b [WADDR2], W0
+ cp.b W0, [WBUFPTR++]
+ bra NZ, vfail
+ ; Verify low byte
+ tblrdl.b [WADDR2++], W0
+ cp.b W0, [WBUFPTR++]
+ bra NZ, vfail
+ ; Verify high byte
+ tblrdl.b [WADDR2++], W0
+ cp.b W0, [WBUFPTR++]
+ bra NZ, vfail
+ ; Loop
+ dec WCNT, WCNT
+ bra nz, verrow
+ ; Verify completed without errors
+ bra Main
+
+
+ ;----------------------------------------------------------------------
+ ; Verify fail
+ ;----------------------------------------------------------------------
+vfail: SendL VERFAIL
+ bra main1
+
+
+;------------------------------------------------------------------------------
+; Write
+;------------------------------------------------------------------------------
+Write: mov W0, NVMCON
+ mov #0x55, W0
+ mov W0, NVMKEY
+ mov #0xAA, W0
+ mov W0, NVMKEY
+ bset NVMCON, #WR
+ nop
+ nop
+ ; Wait for erase/write to finish
+compl: btsc NVMCON, #WR
+ bra compl
+ return
+
+
+;------------------------------------------------------------------------------
+; Receive
+;------------------------------------------------------------------------------
+ ; Init delay
+Receive:mov #BLDELAY, WDEL1
+ ; Check for received byte
+rpt1: clr WDEL2
+rptc: clrwdt ;clear watchdog
+ btss USTA, #URXDA
+ bra notrcv
+ mov URXREG, W0
+ add WCRC, W0, WCRC ;add to checksum
+ return
+ ; Delay
+notrcv: dec WDEL2, WDEL2
+ bra nz, rptc
+ dec WDEL1, WDEL1
+ bra nz, rpt1
+ ; If we get here, uart receive timed out
+ mov #__SP_init, WSTPTR ;reinitialize the Stack Pointer
+
+checkexit:
+ btss WFWJUMP,#0x00 ; skip next if bit0 is 1 (= jumped from bp)
+ btss PORTB,#RB1;if we time out and jumper still attached, go to setup
+ bra setup
+
+;------------------------------------------------------------------------------
+; Exit point, clean up and load user application
+;------------------------------------------------------------------------------
+exit: bclr UIFS, #URXIF ;clear uart received interupt flag
+ bclr UIFS, #UTXIF ;clear uart transmit interupt flag
+ bclr USTA, #UTXEN ;disable uart transmit
+ bclr UMODE, #UARTEN ;disable uart
+ clr PR1 ;clear PR1 was used as temporary sfr
+
+;------------------------------------------------------------------------------
+; User specific exit code go here
+;------------------------------------------------------------------------------
+ .ifdef BUSPIRATEV2
+ ;MODE LED off
+ bclr LATA, #LATA1 ;off
+ bset TRISA, #TRISA1 ;input
+ ;restore PPS
+ mov PPSTEMP1, RPINR18 ;xxx restore
+ mov PPSTEMP2, RPOR2 ;xxx pps settings
+ .endif
+
+ .ifdef BUSPIRATEV1A
+ ;MODE LED off
+ bclr LATB, #LATB4 ;off
+ bset TRISB, #TRISB4 ;input
+ ;restore PPS
+ mov PPSTEMP1, RPINR18 ;xxx restore
+ mov PPSTEMP2, RPOR1 ;xxx pps settings
+ .endif
+
+quit: ;clean up from jumper test
+ bclr CNPU1, #CN5PUE ;disable pullups on PGC/CN5/RB1
+ bset TRISB, #TRISB0 ;rb0 back to input
+ mov #0x0000, W0 ;clear pins to analog default
+ mov W0, AD1PCFG
+
+;------------------------------------------------------------------------------
+; Load user application
+;------------------------------------------------------------------------------
+ bra usrapp
+
+;------------------------------------------------------------------------------
+; firmware jump entry point (kind of like a function because it's never reached from the above code
+;------------------------------------------------------------------------------
+firmwarejump:
+ mov #0xffff, WFWJUMP ;flag that we jumped from firmware
+ bra setup ;jump to just after jumper check
+
+;------------------------------------------------------------------------------
+; End of code
+;------------------------------------------------------------------------------
+ .end
+
+
diff --git a/BPv3-bootloader/firmware-v4.5/p24FJ64GA002.gld b/BPv3-bootloader/firmware-v4.5/p24FJ64GA002.gld
new file mode 100644
index 00000000..af3f8cf3
--- /dev/null
+++ b/BPv3-bootloader/firmware-v4.5/p24FJ64GA002.gld
@@ -0,0 +1,1484 @@
+/*
+ * Linker script for PIC24FJ64GA002
+ * (c) Copyright 2013 Microchip Technology, Inc
+ * Part support version 1.26.A(19-Feb-2016)
+ *
+ * This software is developed by Microchip Technology Inc. and its
+ * subsidiaries ("Microchip").
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * 3. Microchip's name may not be used to endorse or promote products
+ * derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY MICROCHIP "AS IS" AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR PURPOSE ARE DISCLAIMED. IN NO EVENT
+ * SHALL MICROCHIP BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING BUT NOT LIMITED TO
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWSOEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+
+OUTPUT_ARCH("24FJ64GA002")
+CRT0_STARTUP(crt0_standard.o)
+CRT1_STARTUP(crt1_standard.o)
+
+OPTIONAL(-lpPIC24Fxxx)
+OPTIONAL(-lfx)
+
+/*
+** Memory Regions
+*/
+MEMORY
+{
+ data (a!xr) : ORIGIN = 0x800, LENGTH = 0x2000
+ reset : ORIGIN = 0x0, LENGTH = 0x4
+ ivt : ORIGIN = 0x4, LENGTH = 0xFC
+ _reserved : ORIGIN = 0x100, LENGTH = 0x4
+ aivt : ORIGIN = 0x104, LENGTH = 0xFC
+ program (xr) : ORIGIN = 0x200, LENGTH = 0xA5FC
+ CONFIG2 : ORIGIN = 0xABFC, LENGTH = 0x2
+ CONFIG1 : ORIGIN = 0xABFE, LENGTH = 0x2
+}
+
+__CONFIG2 = 0xABFC;
+__CONFIG1 = 0xABFE;
+__NO_HANDLES = 1; /* Suppress handles on this device */
+__CODE_BASE = 0x200;
+__CODE_LENGTH = 0xA5FE;
+__IVT_BASE = 0x4;
+__AIVT_BASE = 0x104;
+
+__DATA_BASE = 0x800;
+__DATA_LENGTH = 0x2000;
+
+
+/*
+** ==================== Section Map ======================
+*/
+SECTIONS
+{
+ /*
+ ** ========== Program Memory ==========
+ */
+
+
+#if !defined(__CORESIDENT) || defined(__DEFINE_RESET)
+ /*
+ ** Reset Instruction
+ */
+ .reset :
+ {
+ SHORT(ABSOLUTE(__reset));
+ SHORT(0x04);
+ SHORT((ABSOLUTE(__reset) >> 16) & 0x7F);
+ SHORT(0);
+ } >reset
+#endif
+
+
+ /*
+ ** Interrupt Vector Tables
+ **
+ ** The primary and alternate tables are loaded
+ ** here, between sections .reset and .text.
+ ** Vector table source code appears below.
+ */
+
+
+ /*
+ ** User Code and Library Code
+ **
+ ** This section must not be assigned to __CODE_BASE,
+ ** because CodeGuard(tm) sections may be located there.
+ **
+ ** Note that input sections *(.text) are not mapped here.
+ ** The best-fit allocator locates them, so that .text
+ ** may flow around PSV sections as needed.
+ */
+ .text :
+ {
+ *(.init);
+ *(.user_init);
+ KEEP (*(.handle));
+ KEEP (*(.isr*));
+ *(.libc) *(.libm) *(.libdsp); /* keep together in this order */
+ *(.lib*);
+ } >program
+
+
+ /*
+ ** User-Defined Section in Program Memory
+ **
+ ** note: can specify an address using
+ ** the following syntax:
+ **
+ ** usercode 0x1234 :
+ ** {
+ ** *(usercode);
+ ** } >program
+ */
+ usercode :
+ {
+ *(usercode);
+ } >program
+
+
+ /*
+ ** User-Defined Constants in Program Memory
+ **
+ ** For PSV type sections, the Load Memory Address (LMA)
+ ** should be specified as follows:
+ **
+ ** userconst : AT(0x1234)
+ ** {
+ ** *(userconst);
+ ** } >program
+ **
+ ** Note that mapping PSV sections in linker scripts
+ ** is not generally recommended.
+ **
+ ** Because of page alignment restrictions, memory is
+ ** often used more efficiently when PSV sections
+ ** do not appear in the linker script.
+ **
+ ** For more information on memory allocation,
+ ** please refer to chapter 10, 'Linker Processing'
+ ** in the Assembler, Linker manual (DS51317).
+ */
+
+
+ /*
+ ** Configuration Words
+ */
+ __CONFIG2 :
+ { KEEP (*(__CONFIG2.sec*)) } >CONFIG2
+ __CONFIG1 :
+ { KEEP (*(__CONFIG1.sec*)) } >CONFIG1
+
+
+
+
+
+
+ /*
+ ** =========== Data Memory ===========
+ */
+
+
+ /*
+ ** ICD Debug Exec
+ **
+ ** This section provides optional storage for
+ ** the ICD2 debugger. Define a global symbol
+ ** named __ICD2RAM to enable ICD2. This section
+ ** must be loaded at data address 0x800.
+ */
+ .icd __DATA_BASE (NOLOAD):
+ {
+ . += (DEFINED (__ICD2RAM) ? 0x50 : 0 );
+ } > data
+
+
+ /*
+ ** Other sections in data memory are not explicitly mapped.
+ ** Instead they are allocated according to their section
+ ** attributes, which is most efficient.
+ **
+ ** If a specific arrangement of sections is required
+ ** (other than what can be achieved using attributes)
+ ** additional sections may be defined here. See chapter
+ ** 10.5 in the MPLAB ASM30/LINK30 User's Guide (DS51317)
+ ** for more information.
+ */
+
+
+ /*
+ ** ========== Debug Info ==============
+ */
+
+ .comment 0 : { *(.comment) }
+
+ /*
+ ** DWARF-2
+ */
+ .debug_info 0 : { *(.debug_info) *(.gnu.linkonce.wi.*) }
+ .debug_abbrev 0 : { *(.debug_abbrev) }
+ .debug_line 0 : { *(.debug_line) }
+ .debug_frame 0 : { *(.debug_frame) }
+ .debug_str 0 : { *(.debug_str) }
+ .debug_loc 0 : { *(.debug_loc) }
+ .debug_macinfo 0 : { *(.debug_macinfo) }
+ .debug_pubnames 0 : { *(.debug_pubnames) }
+ .debug_ranges 0 : { *(.debug_ranges) }
+ .debug_aranges 0 : { *(.debug_aranges) }
+
+} /* SECTIONS */
+
+/*
+** ================= End of Section Map ================
+*/
+
+#if __XC16_VERSION < 1026
+/*
+** These definitions are not required for XC16 versions
+** later than XC16 v1.25 as the linker defines the addresses.
+**
+** These definitons will cause a link error on a newer compiler
+**
+*/
+/*
+** Section Map for Interrupt Vector Tables
+*/
+SECTIONS
+{
+
+/*
+** Interrupt Vector Table
+*/
+.ivt __IVT_BASE :
+ {
+ LONG( DEFINED(__ReservedTrap0) ? ABSOLUTE(__ReservedTrap0) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__OscillatorFail) ? ABSOLUTE(__OscillatorFail) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__AddressError) ? ABSOLUTE(__AddressError) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__StackError) ? ABSOLUTE(__StackError) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__MathError) ? ABSOLUTE(__MathError) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__ReservedTrap5) ? ABSOLUTE(__ReservedTrap5) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__ReservedTrap6) ? ABSOLUTE(__ReservedTrap6) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__ReservedTrap7) ? ABSOLUTE(__ReservedTrap7) :
+ ABSOLUTE(__DefaultInterrupt));
+
+ LONG( DEFINED(__INT0Interrupt) ? ABSOLUTE(__INT0Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__IC1Interrupt) ? ABSOLUTE(__IC1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__OC1Interrupt) ? ABSOLUTE(__OC1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__T1Interrupt) ? ABSOLUTE(__T1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt4) ? ABSOLUTE(__Interrupt4) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__IC2Interrupt) ? ABSOLUTE(__IC2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__OC2Interrupt) ? ABSOLUTE(__OC2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__T2Interrupt) ? ABSOLUTE(__T2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__T3Interrupt) ? ABSOLUTE(__T3Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__SPI1ErrInterrupt) ? ABSOLUTE(__SPI1ErrInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__SPI1Interrupt) ? ABSOLUTE(__SPI1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__U1RXInterrupt) ? ABSOLUTE(__U1RXInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__U1TXInterrupt) ? ABSOLUTE(__U1TXInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__ADC1Interrupt) ? ABSOLUTE(__ADC1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt14) ? ABSOLUTE(__Interrupt14) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt15) ? ABSOLUTE(__Interrupt15) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__SI2C1Interrupt) ? ABSOLUTE(__SI2C1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__MI2C1Interrupt) ? ABSOLUTE(__MI2C1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__CompInterrupt) ? ABSOLUTE(__CompInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__CNInterrupt) ? ABSOLUTE(__CNInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__INT1Interrupt) ? ABSOLUTE(__INT1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt21) ? ABSOLUTE(__Interrupt21) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt22) ? ABSOLUTE(__Interrupt22) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt23) ? ABSOLUTE(__Interrupt23) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt24) ? ABSOLUTE(__Interrupt24) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__OC3Interrupt) ? ABSOLUTE(__OC3Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__OC4Interrupt) ? ABSOLUTE(__OC4Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__T4Interrupt) ? ABSOLUTE(__T4Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__T5Interrupt) ? ABSOLUTE(__T5Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__INT2Interrupt) ? ABSOLUTE(__INT2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__U2RXInterrupt) ? ABSOLUTE(__U2RXInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__U2TXInterrupt) ? ABSOLUTE(__U2TXInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__SPI2ErrInterrupt) ? ABSOLUTE(__SPI2ErrInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__SPI2Interrupt) ? ABSOLUTE(__SPI2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt34) ? ABSOLUTE(__Interrupt34) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt35) ? ABSOLUTE(__Interrupt35) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt36) ? ABSOLUTE(__Interrupt36) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__IC3Interrupt) ? ABSOLUTE(__IC3Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__IC4Interrupt) ? ABSOLUTE(__IC4Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__IC5Interrupt) ? ABSOLUTE(__IC5Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt40) ? ABSOLUTE(__Interrupt40) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__OC5Interrupt) ? ABSOLUTE(__OC5Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt42) ? ABSOLUTE(__Interrupt42) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt43) ? ABSOLUTE(__Interrupt43) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt44) ? ABSOLUTE(__Interrupt44) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__PMPInterrupt) ? ABSOLUTE(__PMPInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt46) ? ABSOLUTE(__Interrupt46) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt47) ? ABSOLUTE(__Interrupt47) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt48) ? ABSOLUTE(__Interrupt48) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__SI2C2Interrupt) ? ABSOLUTE(__SI2C2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__MI2C2Interrupt) ? ABSOLUTE(__MI2C2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt51) ? ABSOLUTE(__Interrupt51) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt52) ? ABSOLUTE(__Interrupt52) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt53) ? ABSOLUTE(__Interrupt53) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt54) ? ABSOLUTE(__Interrupt54) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt55) ? ABSOLUTE(__Interrupt55) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt56) ? ABSOLUTE(__Interrupt56) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt57) ? ABSOLUTE(__Interrupt57) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt58) ? ABSOLUTE(__Interrupt58) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt59) ? ABSOLUTE(__Interrupt59) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt60) ? ABSOLUTE(__Interrupt60) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt61) ? ABSOLUTE(__Interrupt61) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__RTCCInterrupt) ? ABSOLUTE(__RTCCInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt63) ? ABSOLUTE(__Interrupt63) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt64) ? ABSOLUTE(__Interrupt64) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__U1ErrInterrupt) ? ABSOLUTE(__U1ErrInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__U2ErrInterrupt) ? ABSOLUTE(__U2ErrInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__CRCInterrupt) ? ABSOLUTE(__CRCInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt68) ? ABSOLUTE(__Interrupt68) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt69) ? ABSOLUTE(__Interrupt69) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt70) ? ABSOLUTE(__Interrupt70) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt71) ? ABSOLUTE(__Interrupt71) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__LVDInterrupt) ? ABSOLUTE(__LVDInterrupt) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt73) ? ABSOLUTE(__Interrupt73) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt74) ? ABSOLUTE(__Interrupt74) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt75) ? ABSOLUTE(__Interrupt75) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt76) ? ABSOLUTE(__Interrupt76) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt77) ? ABSOLUTE(__Interrupt77) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt78) ? ABSOLUTE(__Interrupt78) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt79) ? ABSOLUTE(__Interrupt79) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt80) ? ABSOLUTE(__Interrupt80) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt81) ? ABSOLUTE(__Interrupt81) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt82) ? ABSOLUTE(__Interrupt82) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt83) ? ABSOLUTE(__Interrupt83) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt84) ? ABSOLUTE(__Interrupt84) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt85) ? ABSOLUTE(__Interrupt85) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt86) ? ABSOLUTE(__Interrupt86) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt87) ? ABSOLUTE(__Interrupt87) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt88) ? ABSOLUTE(__Interrupt88) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt89) ? ABSOLUTE(__Interrupt89) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt90) ? ABSOLUTE(__Interrupt90) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt91) ? ABSOLUTE(__Interrupt91) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt92) ? ABSOLUTE(__Interrupt92) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt93) ? ABSOLUTE(__Interrupt93) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt94) ? ABSOLUTE(__Interrupt94) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt95) ? ABSOLUTE(__Interrupt95) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt96) ? ABSOLUTE(__Interrupt96) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt97) ? ABSOLUTE(__Interrupt97) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt98) ? ABSOLUTE(__Interrupt98) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt99) ? ABSOLUTE(__Interrupt99) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt100) ? ABSOLUTE(__Interrupt100) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt101) ? ABSOLUTE(__Interrupt101) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt102) ? ABSOLUTE(__Interrupt102) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt103) ? ABSOLUTE(__Interrupt103) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt104) ? ABSOLUTE(__Interrupt104) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt105) ? ABSOLUTE(__Interrupt105) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt106) ? ABSOLUTE(__Interrupt106) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt107) ? ABSOLUTE(__Interrupt107) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt108) ? ABSOLUTE(__Interrupt108) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt109) ? ABSOLUTE(__Interrupt109) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt110) ? ABSOLUTE(__Interrupt110) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt111) ? ABSOLUTE(__Interrupt111) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt112) ? ABSOLUTE(__Interrupt112) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt113) ? ABSOLUTE(__Interrupt113) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt114) ? ABSOLUTE(__Interrupt114) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt115) ? ABSOLUTE(__Interrupt115) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt116) ? ABSOLUTE(__Interrupt116) :
+ ABSOLUTE(__DefaultInterrupt));
+ LONG( DEFINED(__Interrupt117) ? ABSOLUTE(__Interrupt117) :
+ ABSOLUTE(__DefaultInterrupt));
+ } >ivt
+
+
+/*
+** Alternate Interrupt Vector Table
+*/
+.aivt __AIVT_BASE :
+ {
+ LONG( DEFINED(__AltReservedTrap0) ? ABSOLUTE(__AltReservedTrap0) :
+ (DEFINED(__ReservedTrap0) ? ABSOLUTE(__ReservedTrap0) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltOscillatorFail) ? ABSOLUTE(__AltOscillatorFail) :
+ (DEFINED(__OscillatorFail) ? ABSOLUTE(__OscillatorFail) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltAddressError) ? ABSOLUTE(__AltAddressError) :
+ (DEFINED(__AddressError) ? ABSOLUTE(__AddressError) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltStackError) ? ABSOLUTE(__AltStackError) :
+ (DEFINED(__StackError) ? ABSOLUTE(__StackError) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltMathError) ? ABSOLUTE(__AltMathError) :
+ (DEFINED(__MathError) ? ABSOLUTE(__MathError) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltReservedTrap5) ? ABSOLUTE(__AltReservedTrap5) :
+ (DEFINED(__ReservedTrap5) ? ABSOLUTE(__ReservedTrap5) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltReservedTrap6) ? ABSOLUTE(__AltReservedTrap6) :
+ (DEFINED(__ReservedTrap6) ? ABSOLUTE(__ReservedTrap6) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltReservedTrap7) ? ABSOLUTE(__AltReservedTrap7) :
+ (DEFINED(__ReservedTrap7) ? ABSOLUTE(__ReservedTrap7) :
+ ABSOLUTE(__DefaultInterrupt)));
+
+ LONG( DEFINED(__AltINT0Interrupt) ? ABSOLUTE(__AltINT0Interrupt) :
+ (DEFINED(__INT0Interrupt) ? ABSOLUTE(__INT0Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltIC1Interrupt) ? ABSOLUTE(__AltIC1Interrupt) :
+ (DEFINED(__IC1Interrupt) ? ABSOLUTE(__IC1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltOC1Interrupt) ? ABSOLUTE(__AltOC1Interrupt) :
+ (DEFINED(__OC1Interrupt) ? ABSOLUTE(__OC1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltT1Interrupt) ? ABSOLUTE(__AltT1Interrupt) :
+ (DEFINED(__T1Interrupt) ? ABSOLUTE(__T1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt4) ? ABSOLUTE(__AltInterrupt4) :
+ (DEFINED(__Interrupt4) ? ABSOLUTE(__Interrupt4) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltIC2Interrupt) ? ABSOLUTE(__AltIC2Interrupt) :
+ (DEFINED(__IC2Interrupt) ? ABSOLUTE(__IC2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltOC2Interrupt) ? ABSOLUTE(__AltOC2Interrupt) :
+ (DEFINED(__OC2Interrupt) ? ABSOLUTE(__OC2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltT2Interrupt) ? ABSOLUTE(__AltT2Interrupt) :
+ (DEFINED(__T2Interrupt) ? ABSOLUTE(__T2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltT3Interrupt) ? ABSOLUTE(__AltT3Interrupt) :
+ (DEFINED(__T3Interrupt) ? ABSOLUTE(__T3Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltSPI1ErrInterrupt) ? ABSOLUTE(__AltSPI1ErrInterrupt) :
+ (DEFINED(__SPI1ErrInterrupt) ? ABSOLUTE(__SPI1ErrInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltSPI1Interrupt) ? ABSOLUTE(__AltSPI1Interrupt) :
+ (DEFINED(__SPI1Interrupt) ? ABSOLUTE(__SPI1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltU1RXInterrupt) ? ABSOLUTE(__AltU1RXInterrupt) :
+ (DEFINED(__U1RXInterrupt) ? ABSOLUTE(__U1RXInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltU1TXInterrupt) ? ABSOLUTE(__AltU1TXInterrupt) :
+ (DEFINED(__U1TXInterrupt) ? ABSOLUTE(__U1TXInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltADC1Interrupt) ? ABSOLUTE(__AltADC1Interrupt) :
+ (DEFINED(__ADC1Interrupt) ? ABSOLUTE(__ADC1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt14) ? ABSOLUTE(__AltInterrupt14) :
+ (DEFINED(__Interrupt14) ? ABSOLUTE(__Interrupt14) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt15) ? ABSOLUTE(__AltInterrupt15) :
+ (DEFINED(__Interrupt15) ? ABSOLUTE(__Interrupt15) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltSI2C1Interrupt) ? ABSOLUTE(__AltSI2C1Interrupt) :
+ (DEFINED(__SI2C1Interrupt) ? ABSOLUTE(__SI2C1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltMI2C1Interrupt) ? ABSOLUTE(__AltMI2C1Interrupt) :
+ (DEFINED(__MI2C1Interrupt) ? ABSOLUTE(__MI2C1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltCompInterrupt) ? ABSOLUTE(__AltCompInterrupt) :
+ (DEFINED(__CompInterrupt) ? ABSOLUTE(__CompInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltCNInterrupt) ? ABSOLUTE(__AltCNInterrupt) :
+ (DEFINED(__CNInterrupt) ? ABSOLUTE(__CNInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltINT1Interrupt) ? ABSOLUTE(__AltINT1Interrupt) :
+ (DEFINED(__INT1Interrupt) ? ABSOLUTE(__INT1Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt21) ? ABSOLUTE(__AltInterrupt21) :
+ (DEFINED(__Interrupt21) ? ABSOLUTE(__Interrupt21) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt22) ? ABSOLUTE(__AltInterrupt22) :
+ (DEFINED(__Interrupt22) ? ABSOLUTE(__Interrupt22) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt23) ? ABSOLUTE(__AltInterrupt23) :
+ (DEFINED(__Interrupt23) ? ABSOLUTE(__Interrupt23) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt24) ? ABSOLUTE(__AltInterrupt24) :
+ (DEFINED(__Interrupt24) ? ABSOLUTE(__Interrupt24) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltOC3Interrupt) ? ABSOLUTE(__AltOC3Interrupt) :
+ (DEFINED(__OC3Interrupt) ? ABSOLUTE(__OC3Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltOC4Interrupt) ? ABSOLUTE(__AltOC4Interrupt) :
+ (DEFINED(__OC4Interrupt) ? ABSOLUTE(__OC4Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltT4Interrupt) ? ABSOLUTE(__AltT4Interrupt) :
+ (DEFINED(__T4Interrupt) ? ABSOLUTE(__T4Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltT5Interrupt) ? ABSOLUTE(__AltT5Interrupt) :
+ (DEFINED(__T5Interrupt) ? ABSOLUTE(__T5Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltINT2Interrupt) ? ABSOLUTE(__AltINT2Interrupt) :
+ (DEFINED(__INT2Interrupt) ? ABSOLUTE(__INT2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltU2RXInterrupt) ? ABSOLUTE(__AltU2RXInterrupt) :
+ (DEFINED(__U2RXInterrupt) ? ABSOLUTE(__U2RXInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltU2TXInterrupt) ? ABSOLUTE(__AltU2TXInterrupt) :
+ (DEFINED(__U2TXInterrupt) ? ABSOLUTE(__U2TXInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltSPI2ErrInterrupt) ? ABSOLUTE(__AltSPI2ErrInterrupt) :
+ (DEFINED(__SPI2ErrInterrupt) ? ABSOLUTE(__SPI2ErrInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltSPI2Interrupt) ? ABSOLUTE(__AltSPI2Interrupt) :
+ (DEFINED(__SPI2Interrupt) ? ABSOLUTE(__SPI2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt34) ? ABSOLUTE(__AltInterrupt34) :
+ (DEFINED(__Interrupt34) ? ABSOLUTE(__Interrupt34) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt35) ? ABSOLUTE(__AltInterrupt35) :
+ (DEFINED(__Interrupt35) ? ABSOLUTE(__Interrupt35) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt36) ? ABSOLUTE(__AltInterrupt36) :
+ (DEFINED(__Interrupt36) ? ABSOLUTE(__Interrupt36) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltIC3Interrupt) ? ABSOLUTE(__AltIC3Interrupt) :
+ (DEFINED(__IC3Interrupt) ? ABSOLUTE(__IC3Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltIC4Interrupt) ? ABSOLUTE(__AltIC4Interrupt) :
+ (DEFINED(__IC4Interrupt) ? ABSOLUTE(__IC4Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltIC5Interrupt) ? ABSOLUTE(__AltIC5Interrupt) :
+ (DEFINED(__IC5Interrupt) ? ABSOLUTE(__IC5Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt40) ? ABSOLUTE(__AltInterrupt40) :
+ (DEFINED(__Interrupt40) ? ABSOLUTE(__Interrupt40) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltOC5Interrupt) ? ABSOLUTE(__AltOC5Interrupt) :
+ (DEFINED(__OC5Interrupt) ? ABSOLUTE(__OC5Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt42) ? ABSOLUTE(__AltInterrupt42) :
+ (DEFINED(__Interrupt42) ? ABSOLUTE(__Interrupt42) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt43) ? ABSOLUTE(__AltInterrupt43) :
+ (DEFINED(__Interrupt43) ? ABSOLUTE(__Interrupt43) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt44) ? ABSOLUTE(__AltInterrupt44) :
+ (DEFINED(__Interrupt44) ? ABSOLUTE(__Interrupt44) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltPMPInterrupt) ? ABSOLUTE(__AltPMPInterrupt) :
+ (DEFINED(__PMPInterrupt) ? ABSOLUTE(__PMPInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt46) ? ABSOLUTE(__AltInterrupt46) :
+ (DEFINED(__Interrupt46) ? ABSOLUTE(__Interrupt46) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt47) ? ABSOLUTE(__AltInterrupt47) :
+ (DEFINED(__Interrupt47) ? ABSOLUTE(__Interrupt47) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt48) ? ABSOLUTE(__AltInterrupt48) :
+ (DEFINED(__Interrupt48) ? ABSOLUTE(__Interrupt48) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltSI2C2Interrupt) ? ABSOLUTE(__AltSI2C2Interrupt) :
+ (DEFINED(__SI2C2Interrupt) ? ABSOLUTE(__SI2C2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltMI2C2Interrupt) ? ABSOLUTE(__AltMI2C2Interrupt) :
+ (DEFINED(__MI2C2Interrupt) ? ABSOLUTE(__MI2C2Interrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt51) ? ABSOLUTE(__AltInterrupt51) :
+ (DEFINED(__Interrupt51) ? ABSOLUTE(__Interrupt51) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt52) ? ABSOLUTE(__AltInterrupt52) :
+ (DEFINED(__Interrupt52) ? ABSOLUTE(__Interrupt52) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt53) ? ABSOLUTE(__AltInterrupt53) :
+ (DEFINED(__Interrupt53) ? ABSOLUTE(__Interrupt53) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt54) ? ABSOLUTE(__AltInterrupt54) :
+ (DEFINED(__Interrupt54) ? ABSOLUTE(__Interrupt54) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt55) ? ABSOLUTE(__AltInterrupt55) :
+ (DEFINED(__Interrupt55) ? ABSOLUTE(__Interrupt55) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt56) ? ABSOLUTE(__AltInterrupt56) :
+ (DEFINED(__Interrupt56) ? ABSOLUTE(__Interrupt56) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt57) ? ABSOLUTE(__AltInterrupt57) :
+ (DEFINED(__Interrupt57) ? ABSOLUTE(__Interrupt57) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt58) ? ABSOLUTE(__AltInterrupt58) :
+ (DEFINED(__Interrupt58) ? ABSOLUTE(__Interrupt58) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt59) ? ABSOLUTE(__AltInterrupt59) :
+ (DEFINED(__Interrupt59) ? ABSOLUTE(__Interrupt59) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt60) ? ABSOLUTE(__AltInterrupt60) :
+ (DEFINED(__Interrupt60) ? ABSOLUTE(__Interrupt60) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt61) ? ABSOLUTE(__AltInterrupt61) :
+ (DEFINED(__Interrupt61) ? ABSOLUTE(__Interrupt61) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltRTCCInterrupt) ? ABSOLUTE(__AltRTCCInterrupt) :
+ (DEFINED(__RTCCInterrupt) ? ABSOLUTE(__RTCCInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt63) ? ABSOLUTE(__AltInterrupt63) :
+ (DEFINED(__Interrupt63) ? ABSOLUTE(__Interrupt63) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt64) ? ABSOLUTE(__AltInterrupt64) :
+ (DEFINED(__Interrupt64) ? ABSOLUTE(__Interrupt64) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltU1ErrInterrupt) ? ABSOLUTE(__AltU1ErrInterrupt) :
+ (DEFINED(__U1ErrInterrupt) ? ABSOLUTE(__U1ErrInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltU2ErrInterrupt) ? ABSOLUTE(__AltU2ErrInterrupt) :
+ (DEFINED(__U2ErrInterrupt) ? ABSOLUTE(__U2ErrInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltCRCInterrupt) ? ABSOLUTE(__AltCRCInterrupt) :
+ (DEFINED(__CRCInterrupt) ? ABSOLUTE(__CRCInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt68) ? ABSOLUTE(__AltInterrupt68) :
+ (DEFINED(__Interrupt68) ? ABSOLUTE(__Interrupt68) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt69) ? ABSOLUTE(__AltInterrupt69) :
+ (DEFINED(__Interrupt69) ? ABSOLUTE(__Interrupt69) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt70) ? ABSOLUTE(__AltInterrupt70) :
+ (DEFINED(__Interrupt70) ? ABSOLUTE(__Interrupt70) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt71) ? ABSOLUTE(__AltInterrupt71) :
+ (DEFINED(__Interrupt71) ? ABSOLUTE(__Interrupt71) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltLVDInterrupt) ? ABSOLUTE(__AltLVDInterrupt) :
+ (DEFINED(__LVDInterrupt) ? ABSOLUTE(__LVDInterrupt) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt73) ? ABSOLUTE(__AltInterrupt73) :
+ (DEFINED(__Interrupt73) ? ABSOLUTE(__Interrupt73) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt74) ? ABSOLUTE(__AltInterrupt74) :
+ (DEFINED(__Interrupt74) ? ABSOLUTE(__Interrupt74) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt75) ? ABSOLUTE(__AltInterrupt75) :
+ (DEFINED(__Interrupt75) ? ABSOLUTE(__Interrupt75) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt76) ? ABSOLUTE(__AltInterrupt76) :
+ (DEFINED(__Interrupt76) ? ABSOLUTE(__Interrupt76) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt77) ? ABSOLUTE(__AltInterrupt77) :
+ (DEFINED(__Interrupt77) ? ABSOLUTE(__Interrupt77) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt78) ? ABSOLUTE(__AltInterrupt78) :
+ (DEFINED(__Interrupt78) ? ABSOLUTE(__Interrupt78) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt79) ? ABSOLUTE(__AltInterrupt79) :
+ (DEFINED(__Interrupt79) ? ABSOLUTE(__Interrupt79) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt80) ? ABSOLUTE(__AltInterrupt80) :
+ (DEFINED(__Interrupt80) ? ABSOLUTE(__Interrupt80) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt81) ? ABSOLUTE(__AltInterrupt81) :
+ (DEFINED(__Interrupt81) ? ABSOLUTE(__Interrupt81) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt82) ? ABSOLUTE(__AltInterrupt82) :
+ (DEFINED(__Interrupt82) ? ABSOLUTE(__Interrupt82) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt83) ? ABSOLUTE(__AltInterrupt83) :
+ (DEFINED(__Interrupt83) ? ABSOLUTE(__Interrupt83) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt84) ? ABSOLUTE(__AltInterrupt84) :
+ (DEFINED(__Interrupt84) ? ABSOLUTE(__Interrupt84) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt85) ? ABSOLUTE(__AltInterrupt85) :
+ (DEFINED(__Interrupt85) ? ABSOLUTE(__Interrupt85) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt86) ? ABSOLUTE(__AltInterrupt86) :
+ (DEFINED(__Interrupt86) ? ABSOLUTE(__Interrupt86) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt87) ? ABSOLUTE(__AltInterrupt87) :
+ (DEFINED(__Interrupt87) ? ABSOLUTE(__Interrupt87) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt88) ? ABSOLUTE(__AltInterrupt88) :
+ (DEFINED(__Interrupt88) ? ABSOLUTE(__Interrupt88) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt89) ? ABSOLUTE(__AltInterrupt89) :
+ (DEFINED(__Interrupt89) ? ABSOLUTE(__Interrupt89) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt90) ? ABSOLUTE(__AltInterrupt90) :
+ (DEFINED(__Interrupt90) ? ABSOLUTE(__Interrupt90) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt91) ? ABSOLUTE(__AltInterrupt91) :
+ (DEFINED(__Interrupt91) ? ABSOLUTE(__Interrupt91) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt92) ? ABSOLUTE(__AltInterrupt92) :
+ (DEFINED(__Interrupt92) ? ABSOLUTE(__Interrupt92) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt93) ? ABSOLUTE(__AltInterrupt93) :
+ (DEFINED(__Interrupt93) ? ABSOLUTE(__Interrupt93) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt94) ? ABSOLUTE(__AltInterrupt94) :
+ (DEFINED(__Interrupt94) ? ABSOLUTE(__Interrupt94) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt95) ? ABSOLUTE(__AltInterrupt95) :
+ (DEFINED(__Interrupt95) ? ABSOLUTE(__Interrupt95) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt96) ? ABSOLUTE(__AltInterrupt96) :
+ (DEFINED(__Interrupt96) ? ABSOLUTE(__Interrupt96) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt97) ? ABSOLUTE(__AltInterrupt97) :
+ (DEFINED(__Interrupt97) ? ABSOLUTE(__Interrupt97) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt98) ? ABSOLUTE(__AltInterrupt98) :
+ (DEFINED(__Interrupt98) ? ABSOLUTE(__Interrupt98) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt99) ? ABSOLUTE(__AltInterrupt99) :
+ (DEFINED(__Interrupt99) ? ABSOLUTE(__Interrupt99) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt100) ? ABSOLUTE(__AltInterrupt100) :
+ (DEFINED(__Interrupt100) ? ABSOLUTE(__Interrupt100) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt101) ? ABSOLUTE(__AltInterrupt101) :
+ (DEFINED(__Interrupt101) ? ABSOLUTE(__Interrupt101) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt102) ? ABSOLUTE(__AltInterrupt102) :
+ (DEFINED(__Interrupt102) ? ABSOLUTE(__Interrupt102) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt103) ? ABSOLUTE(__AltInterrupt103) :
+ (DEFINED(__Interrupt103) ? ABSOLUTE(__Interrupt103) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt104) ? ABSOLUTE(__AltInterrupt104) :
+ (DEFINED(__Interrupt104) ? ABSOLUTE(__Interrupt104) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt105) ? ABSOLUTE(__AltInterrupt105) :
+ (DEFINED(__Interrupt105) ? ABSOLUTE(__Interrupt105) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt106) ? ABSOLUTE(__AltInterrupt106) :
+ (DEFINED(__Interrupt106) ? ABSOLUTE(__Interrupt106) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt107) ? ABSOLUTE(__AltInterrupt107) :
+ (DEFINED(__Interrupt107) ? ABSOLUTE(__Interrupt107) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt108) ? ABSOLUTE(__AltInterrupt108) :
+ (DEFINED(__Interrupt108) ? ABSOLUTE(__Interrupt108) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt109) ? ABSOLUTE(__AltInterrupt109) :
+ (DEFINED(__Interrupt109) ? ABSOLUTE(__Interrupt109) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt110) ? ABSOLUTE(__AltInterrupt110) :
+ (DEFINED(__Interrupt110) ? ABSOLUTE(__Interrupt110) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt111) ? ABSOLUTE(__AltInterrupt111) :
+ (DEFINED(__Interrupt111) ? ABSOLUTE(__Interrupt111) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt112) ? ABSOLUTE(__AltInterrupt112) :
+ (DEFINED(__Interrupt112) ? ABSOLUTE(__Interrupt112) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt113) ? ABSOLUTE(__AltInterrupt113) :
+ (DEFINED(__Interrupt113) ? ABSOLUTE(__Interrupt113) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt114) ? ABSOLUTE(__AltInterrupt114) :
+ (DEFINED(__Interrupt114) ? ABSOLUTE(__Interrupt114) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt115) ? ABSOLUTE(__AltInterrupt115) :
+ (DEFINED(__Interrupt115) ? ABSOLUTE(__Interrupt115) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt116) ? ABSOLUTE(__AltInterrupt116) :
+ (DEFINED(__Interrupt116) ? ABSOLUTE(__Interrupt116) :
+ ABSOLUTE(__DefaultInterrupt)));
+ LONG( DEFINED(__AltInterrupt117) ? ABSOLUTE(__AltInterrupt117) :
+ (DEFINED(__Interrupt117) ? ABSOLUTE(__Interrupt117) :
+ ABSOLUTE(__DefaultInterrupt)));
+ } >aivt
+} /* SECTIONS */
+#endif
+
+
+/*
+** ============== Equates for SFR Addresses =============
+*/
+
+ WREG0 = 0x0;
+_WREG0 = 0x0;
+ WREG1 = 0x2;
+_WREG1 = 0x2;
+ WREG2 = 0x4;
+_WREG2 = 0x4;
+ WREG3 = 0x6;
+_WREG3 = 0x6;
+ WREG4 = 0x8;
+_WREG4 = 0x8;
+ WREG5 = 0xA;
+_WREG5 = 0xA;
+ WREG6 = 0xC;
+_WREG6 = 0xC;
+ WREG7 = 0xE;
+_WREG7 = 0xE;
+ WREG8 = 0x10;
+_WREG8 = 0x10;
+ WREG9 = 0x12;
+_WREG9 = 0x12;
+ WREG10 = 0x14;
+_WREG10 = 0x14;
+ WREG11 = 0x16;
+_WREG11 = 0x16;
+ WREG12 = 0x18;
+_WREG12 = 0x18;
+ WREG13 = 0x1A;
+_WREG13 = 0x1A;
+ WREG14 = 0x1C;
+_WREG14 = 0x1C;
+ WREG15 = 0x1E;
+_WREG15 = 0x1E;
+ SPLIM = 0x20;
+_SPLIM = 0x20;
+ PCL = 0x2E;
+_PCL = 0x2E;
+ PCH = 0x30;
+_PCH = 0x30;
+ TBLPAG = 0x32;
+_TBLPAG = 0x32;
+ PSVPAG = 0x34;
+_PSVPAG = 0x34;
+ RCOUNT = 0x36;
+_RCOUNT = 0x36;
+ SR = 0x42;
+_SR = 0x42;
+_SRbits = 0x42;
+ CORCON = 0x44;
+_CORCON = 0x44;
+_CORCONbits = 0x44;
+ DISICNT = 0x52;
+_DISICNT = 0x52;
+ CNEN1 = 0x60;
+_CNEN1 = 0x60;
+_CNEN1bits = 0x60;
+ CNEN2 = 0x62;
+_CNEN2 = 0x62;
+_CNEN2bits = 0x62;
+ CNPU1 = 0x68;
+_CNPU1 = 0x68;
+_CNPU1bits = 0x68;
+ CNPU2 = 0x6A;
+_CNPU2 = 0x6A;
+_CNPU2bits = 0x6A;
+ INTCON1 = 0x80;
+_INTCON1 = 0x80;
+_INTCON1bits = 0x80;
+ INTCON2 = 0x82;
+_INTCON2 = 0x82;
+_INTCON2bits = 0x82;
+ IFS0 = 0x84;
+_IFS0 = 0x84;
+_IFS0bits = 0x84;
+ IFS1 = 0x86;
+_IFS1 = 0x86;
+_IFS1bits = 0x86;
+ IFS2 = 0x88;
+_IFS2 = 0x88;
+_IFS2bits = 0x88;
+ IFS3 = 0x8A;
+_IFS3 = 0x8A;
+_IFS3bits = 0x8A;
+ IFS4 = 0x8C;
+_IFS4 = 0x8C;
+_IFS4bits = 0x8C;
+ IEC0 = 0x94;
+_IEC0 = 0x94;
+_IEC0bits = 0x94;
+ IEC1 = 0x96;
+_IEC1 = 0x96;
+_IEC1bits = 0x96;
+ IEC2 = 0x98;
+_IEC2 = 0x98;
+_IEC2bits = 0x98;
+ IEC3 = 0x9A;
+_IEC3 = 0x9A;
+_IEC3bits = 0x9A;
+ IEC4 = 0x9C;
+_IEC4 = 0x9C;
+_IEC4bits = 0x9C;
+ IPC0 = 0xA4;
+_IPC0 = 0xA4;
+_IPC0bits = 0xA4;
+ IPC1 = 0xA6;
+_IPC1 = 0xA6;
+_IPC1bits = 0xA6;
+ IPC2 = 0xA8;
+_IPC2 = 0xA8;
+_IPC2bits = 0xA8;
+ IPC3 = 0xAA;
+_IPC3 = 0xAA;
+_IPC3bits = 0xAA;
+ IPC4 = 0xAC;
+_IPC4 = 0xAC;
+_IPC4bits = 0xAC;
+ IPC5 = 0xAE;
+_IPC5 = 0xAE;
+_IPC5bits = 0xAE;
+ IPC6 = 0xB0;
+_IPC6 = 0xB0;
+_IPC6bits = 0xB0;
+ IPC7 = 0xB2;
+_IPC7 = 0xB2;
+_IPC7bits = 0xB2;
+ IPC8 = 0xB4;
+_IPC8 = 0xB4;
+_IPC8bits = 0xB4;
+ IPC9 = 0xB6;
+_IPC9 = 0xB6;
+_IPC9bits = 0xB6;
+ IPC10 = 0xB8;
+_IPC10 = 0xB8;
+_IPC10bits = 0xB8;
+ IPC11 = 0xBA;
+_IPC11 = 0xBA;
+_IPC11bits = 0xBA;
+ IPC12 = 0xBC;
+_IPC12 = 0xBC;
+_IPC12bits = 0xBC;
+ IPC15 = 0xC2;
+_IPC15 = 0xC2;
+_IPC15bits = 0xC2;
+ IPC16 = 0xC4;
+_IPC16 = 0xC4;
+_IPC16bits = 0xC4;
+ IPC18 = 0xC8;
+_IPC18 = 0xC8;
+_IPC18bits = 0xC8;
+ TMR1 = 0x100;
+_TMR1 = 0x100;
+ PR1 = 0x102;
+_PR1 = 0x102;
+ T1CON = 0x104;
+_T1CON = 0x104;
+_T1CONbits = 0x104;
+ TMR2 = 0x106;
+_TMR2 = 0x106;
+ TMR3HLD = 0x108;
+_TMR3HLD = 0x108;
+ TMR3 = 0x10A;
+_TMR3 = 0x10A;
+ PR2 = 0x10C;
+_PR2 = 0x10C;
+ PR3 = 0x10E;
+_PR3 = 0x10E;
+ T2CON = 0x110;
+_T2CON = 0x110;
+_T2CONbits = 0x110;
+ T3CON = 0x112;
+_T3CON = 0x112;
+_T3CONbits = 0x112;
+ TMR4 = 0x114;
+_TMR4 = 0x114;
+ TMR5HLD = 0x116;
+_TMR5HLD = 0x116;
+ TMR5 = 0x118;
+_TMR5 = 0x118;
+ PR4 = 0x11A;
+_PR4 = 0x11A;
+ PR5 = 0x11C;
+_PR5 = 0x11C;
+ T4CON = 0x11E;
+_T4CON = 0x11E;
+_T4CONbits = 0x11E;
+ T5CON = 0x120;
+_T5CON = 0x120;
+_T5CONbits = 0x120;
+ IC1BUF = 0x140;
+_IC1BUF = 0x140;
+ IC1CON = 0x142;
+_IC1CON = 0x142;
+_IC1CONbits = 0x142;
+ IC2BUF = 0x144;
+_IC2BUF = 0x144;
+ IC2CON = 0x146;
+_IC2CON = 0x146;
+_IC2CONbits = 0x146;
+ IC3BUF = 0x148;
+_IC3BUF = 0x148;
+ IC3CON = 0x14A;
+_IC3CON = 0x14A;
+_IC3CONbits = 0x14A;
+ IC4BUF = 0x14C;
+_IC4BUF = 0x14C;
+ IC4CON = 0x14E;
+_IC4CON = 0x14E;
+_IC4CONbits = 0x14E;
+ IC5BUF = 0x150;
+_IC5BUF = 0x150;
+ IC5CON = 0x152;
+_IC5CON = 0x152;
+_IC5CONbits = 0x152;
+ OC1RS = 0x180;
+_OC1RS = 0x180;
+ OC1R = 0x182;
+_OC1R = 0x182;
+ OC1CON = 0x184;
+_OC1CON = 0x184;
+_OC1CONbits = 0x184;
+ OC2RS = 0x186;
+_OC2RS = 0x186;
+ OC2R = 0x188;
+_OC2R = 0x188;
+ OC2CON = 0x18A;
+_OC2CON = 0x18A;
+_OC2CONbits = 0x18A;
+ OC3RS = 0x18C;
+_OC3RS = 0x18C;
+ OC3R = 0x18E;
+_OC3R = 0x18E;
+ OC3CON = 0x190;
+_OC3CON = 0x190;
+_OC3CONbits = 0x190;
+ OC4RS = 0x192;
+_OC4RS = 0x192;
+ OC4R = 0x194;
+_OC4R = 0x194;
+ OC4CON = 0x196;
+_OC4CON = 0x196;
+_OC4CONbits = 0x196;
+ OC5RS = 0x198;
+_OC5RS = 0x198;
+ OC5R = 0x19A;
+_OC5R = 0x19A;
+ OC5CON = 0x19C;
+_OC5CON = 0x19C;
+_OC5CONbits = 0x19C;
+ I2C1RCV = 0x200;
+_I2C1RCV = 0x200;
+ I2C1TRN = 0x202;
+_I2C1TRN = 0x202;
+ I2C1BRG = 0x204;
+_I2C1BRG = 0x204;
+ I2C1CON = 0x206;
+_I2C1CON = 0x206;
+_I2C1CONbits = 0x206;
+ I2C1STAT = 0x208;
+_I2C1STAT = 0x208;
+_I2C1STATbits = 0x208;
+ I2C1ADD = 0x20A;
+_I2C1ADD = 0x20A;
+ I2C1MSK = 0x20C;
+_I2C1MSK = 0x20C;
+ I2C2RCV = 0x210;
+_I2C2RCV = 0x210;
+ I2C2TRN = 0x212;
+_I2C2TRN = 0x212;
+ I2C2BRG = 0x214;
+_I2C2BRG = 0x214;
+ I2C2CON = 0x216;
+_I2C2CON = 0x216;
+_I2C2CONbits = 0x216;
+ I2C2STAT = 0x218;
+_I2C2STAT = 0x218;
+_I2C2STATbits = 0x218;
+ I2C2ADD = 0x21A;
+_I2C2ADD = 0x21A;
+ I2C2MSK = 0x21C;
+_I2C2MSK = 0x21C;
+ U1MODE = 0x220;
+_U1MODE = 0x220;
+_U1MODEbits = 0x220;
+ U1STA = 0x222;
+_U1STA = 0x222;
+_U1STAbits = 0x222;
+ U1TXREG = 0x224;
+_U1TXREG = 0x224;
+ U1RXREG = 0x226;
+_U1RXREG = 0x226;
+ U1BRG = 0x228;
+_U1BRG = 0x228;
+ U2MODE = 0x230;
+_U2MODE = 0x230;
+_U2MODEbits = 0x230;
+ U2STA = 0x232;
+_U2STA = 0x232;
+_U2STAbits = 0x232;
+ U2TXREG = 0x234;
+_U2TXREG = 0x234;
+ U2RXREG = 0x236;
+_U2RXREG = 0x236;
+ U2BRG = 0x238;
+_U2BRG = 0x238;
+ SPI1STAT = 0x240;
+_SPI1STAT = 0x240;
+_SPI1STATbits = 0x240;
+ SPI1CON1 = 0x242;
+_SPI1CON1 = 0x242;
+_SPI1CON1bits = 0x242;
+ SPI1CON2 = 0x244;
+_SPI1CON2 = 0x244;
+_SPI1CON2bits = 0x244;
+ SPI1BUF = 0x248;
+_SPI1BUF = 0x248;
+ SPI2STAT = 0x260;
+_SPI2STAT = 0x260;
+_SPI2STATbits = 0x260;
+ SPI2CON1 = 0x262;
+_SPI2CON1 = 0x262;
+_SPI2CON1bits = 0x262;
+ SPI2CON2 = 0x264;
+_SPI2CON2 = 0x264;
+_SPI2CON2bits = 0x264;
+ SPI2BUF = 0x268;
+_SPI2BUF = 0x268;
+ TRISA = 0x2C0;
+_TRISA = 0x2C0;
+_TRISAbits = 0x2C0;
+ PORTA = 0x2C2;
+_PORTA = 0x2C2;
+_PORTAbits = 0x2C2;
+ LATA = 0x2C4;
+_LATA = 0x2C4;
+_LATAbits = 0x2C4;
+ ODCA = 0x2C6;
+_ODCA = 0x2C6;
+_ODCAbits = 0x2C6;
+ TRISB = 0x2C8;
+_TRISB = 0x2C8;
+_TRISBbits = 0x2C8;
+ PORTB = 0x2CA;
+_PORTB = 0x2CA;
+_PORTBbits = 0x2CA;
+ LATB = 0x2CC;
+_LATB = 0x2CC;
+_LATBbits = 0x2CC;
+ ODCB = 0x2CE;
+_ODCB = 0x2CE;
+_ODCBbits = 0x2CE;
+ PADCFG1 = 0x2FC;
+_PADCFG1 = 0x2FC;
+_PADCFG1bits = 0x2FC;
+ ADC1BUF0 = 0x300;
+_ADC1BUF0 = 0x300;
+ ADC1BUF1 = 0x302;
+_ADC1BUF1 = 0x302;
+ ADC1BUF2 = 0x304;
+_ADC1BUF2 = 0x304;
+ ADC1BUF3 = 0x306;
+_ADC1BUF3 = 0x306;
+ ADC1BUF4 = 0x308;
+_ADC1BUF4 = 0x308;
+ ADC1BUF5 = 0x30A;
+_ADC1BUF5 = 0x30A;
+ ADC1BUF6 = 0x30C;
+_ADC1BUF6 = 0x30C;
+ ADC1BUF7 = 0x30E;
+_ADC1BUF7 = 0x30E;
+ ADC1BUF8 = 0x310;
+_ADC1BUF8 = 0x310;
+ ADC1BUF9 = 0x312;
+_ADC1BUF9 = 0x312;
+ ADC1BUFA = 0x314;
+_ADC1BUFA = 0x314;
+ ADC1BUFB = 0x316;
+_ADC1BUFB = 0x316;
+ ADC1BUFC = 0x318;
+_ADC1BUFC = 0x318;
+ ADC1BUFD = 0x31A;
+_ADC1BUFD = 0x31A;
+ ADC1BUFE = 0x31C;
+_ADC1BUFE = 0x31C;
+ ADC1BUFF = 0x31E;
+_ADC1BUFF = 0x31E;
+ AD1CON1 = 0x320;
+_AD1CON1 = 0x320;
+_AD1CON1bits = 0x320;
+ AD1CON2 = 0x322;
+_AD1CON2 = 0x322;
+_AD1CON2bits = 0x322;
+ AD1CON3 = 0x324;
+_AD1CON3 = 0x324;
+_AD1CON3bits = 0x324;
+ AD1CHS = 0x328;
+_AD1CHS = 0x328;
+_AD1CHSbits = 0x328;
+ AD1PCFG = 0x32C;
+_AD1PCFG = 0x32C;
+_AD1PCFGbits = 0x32C;
+ AD1CSSL = 0x330;
+_AD1CSSL = 0x330;
+_AD1CSSLbits = 0x330;
+ PMCON = 0x600;
+_PMCON = 0x600;
+_PMCONbits = 0x600;
+ PMMODE = 0x602;
+_PMMODE = 0x602;
+_PMMODEbits = 0x602;
+ PMADDR = 0x604;
+_PMADDR = 0x604;
+_PMADDRbits = 0x604;
+ PMDOUT1 = 0x604;
+_PMDOUT1 = 0x604;
+_PMDOUT1bits = 0x604;
+ PMDOUT2 = 0x606;
+_PMDOUT2 = 0x606;
+ PMDIN1 = 0x608;
+_PMDIN1 = 0x608;
+ PMDIN2 = 0x60A;
+_PMDIN2 = 0x60A;
+ PMAEN = 0x60C;
+_PMAEN = 0x60C;
+_PMAENbits = 0x60C;
+ PMSTAT = 0x60E;
+_PMSTAT = 0x60E;
+_PMSTATbits = 0x60E;
+ ALRMVAL = 0x620;
+_ALRMVAL = 0x620;
+ ALCFGRPT = 0x622;
+_ALCFGRPT = 0x622;
+_ALCFGRPTbits = 0x622;
+ RTCVAL = 0x624;
+_RTCVAL = 0x624;
+ RCFGCAL = 0x626;
+_RCFGCAL = 0x626;
+_RCFGCALbits = 0x626;
+ CMCON = 0x630;
+_CMCON = 0x630;
+_CMCONbits = 0x630;
+ CVRCON = 0x632;
+_CVRCON = 0x632;
+_CVRCONbits = 0x632;
+ CRCCON = 0x640;
+_CRCCON = 0x640;
+_CRCCONbits = 0x640;
+ CRCXOR = 0x642;
+_CRCXOR = 0x642;
+_CRCXORbits = 0x642;
+ CRCDAT = 0x644;
+_CRCDAT = 0x644;
+ CRCWDAT = 0x646;
+_CRCWDAT = 0x646;
+ RPINR0 = 0x680;
+_RPINR0 = 0x680;
+_RPINR0bits = 0x680;
+ RPINR1 = 0x682;
+_RPINR1 = 0x682;
+_RPINR1bits = 0x682;
+ RPINR3 = 0x686;
+_RPINR3 = 0x686;
+_RPINR3bits = 0x686;
+ RPINR4 = 0x688;
+_RPINR4 = 0x688;
+_RPINR4bits = 0x688;
+ RPINR7 = 0x68E;
+_RPINR7 = 0x68E;
+_RPINR7bits = 0x68E;
+ RPINR8 = 0x690;
+_RPINR8 = 0x690;
+_RPINR8bits = 0x690;
+ RPINR9 = 0x692;
+_RPINR9 = 0x692;
+_RPINR9bits = 0x692;
+ RPINR11 = 0x696;
+_RPINR11 = 0x696;
+_RPINR11bits = 0x696;
+ RPINR18 = 0x6A4;
+_RPINR18 = 0x6A4;
+_RPINR18bits = 0x6A4;
+ RPINR19 = 0x6A6;
+_RPINR19 = 0x6A6;
+_RPINR19bits = 0x6A6;
+ RPINR20 = 0x6A8;
+_RPINR20 = 0x6A8;
+_RPINR20bits = 0x6A8;
+ RPINR21 = 0x6AA;
+_RPINR21 = 0x6AA;
+_RPINR21bits = 0x6AA;
+ RPINR22 = 0x6AC;
+_RPINR22 = 0x6AC;
+_RPINR22bits = 0x6AC;
+ RPINR23 = 0x6AE;
+_RPINR23 = 0x6AE;
+_RPINR23bits = 0x6AE;
+ RPOR0 = 0x6C0;
+_RPOR0 = 0x6C0;
+_RPOR0bits = 0x6C0;
+ RPOR1 = 0x6C2;
+_RPOR1 = 0x6C2;
+_RPOR1bits = 0x6C2;
+ RPOR2 = 0x6C4;
+_RPOR2 = 0x6C4;
+_RPOR2bits = 0x6C4;
+ RPOR3 = 0x6C6;
+_RPOR3 = 0x6C6;
+_RPOR3bits = 0x6C6;
+ RPOR4 = 0x6C8;
+_RPOR4 = 0x6C8;
+_RPOR4bits = 0x6C8;
+ RPOR5 = 0x6CA;
+_RPOR5 = 0x6CA;
+_RPOR5bits = 0x6CA;
+ RPOR6 = 0x6CC;
+_RPOR6 = 0x6CC;
+_RPOR6bits = 0x6CC;
+ RPOR7 = 0x6CE;
+_RPOR7 = 0x6CE;
+_RPOR7bits = 0x6CE;
+ RCON = 0x740;
+_RCON = 0x740;
+_RCONbits = 0x740;
+ OSCCON = 0x742;
+_OSCCON = 0x742;
+_OSCCONbits = 0x742;
+ OSCCONL = 0x742;
+_OSCCONL = 0x742;
+ OSCCONH = 0x743;
+_OSCCONH = 0x743;
+ CLKDIV = 0x744;
+_CLKDIV = 0x744;
+_CLKDIVbits = 0x744;
+ OSCTUN = 0x748;
+_OSCTUN = 0x748;
+_OSCTUNbits = 0x748;
+ NVMCON = 0x760;
+_NVMCON = 0x760;
+_NVMCONbits = 0x760;
+ NVMKEY = 0x766;
+_NVMKEY = 0x766;
+ PMD1 = 0x770;
+_PMD1 = 0x770;
+_PMD1bits = 0x770;
+ PMD2 = 0x772;
+_PMD2 = 0x772;
+_PMD2bits = 0x772;
+ PMD3 = 0x774;
+_PMD3 = 0x774;
+_PMD3bits = 0x774;
+/*
+** ======= Base Addresses for Various Peripherals and ACC ======
+*/
+
+ IC1 = 0x140;
+_IC1 = 0x140;
+ IC2 = 0x144;
+_IC2 = 0x144;
+ IC3 = 0x148;
+_IC3 = 0x148;
+ IC4 = 0x14C;
+_IC4 = 0x14C;
+ IC5 = 0x150;
+_IC5 = 0x150;
+ OC1 = 0x180;
+_OC1 = 0x180;
+ OC2 = 0x186;
+_OC2 = 0x186;
+ OC3 = 0x18C;
+_OC3 = 0x18C;
+ OC4 = 0x192;
+_OC4 = 0x192;
+ OC5 = 0x198;
+_OC5 = 0x198;
+ SPI1 = 0x240;
+_SPI1 = 0x240;
+ SPI2 = 0x260;
+_SPI2 = 0x260;
+ UART1 = 0x220;
+_UART1 = 0x220;
+ UART2 = 0x230;
+_UART2 = 0x230;
diff --git a/BPv3-bootloader/firmware-v4.5/src/settings.inc b/BPv3-bootloader/firmware-v4.5/settings.inc
similarity index 96%
rename from BPv3-bootloader/firmware-v4.5/src/settings.inc
rename to BPv3-bootloader/firmware-v4.5/settings.inc
index 8b634422..d453dbc2 100644
--- a/BPv3-bootloader/firmware-v4.5/src/settings.inc
+++ b/BPv3-bootloader/firmware-v4.5/settings.inc
@@ -1,72 +1,72 @@
-;------------------------------------------------------------------------------
-;
-; Title: ds30 loader for PIC24FJ
-;
-; File description: user settings and configuration bits
-;
-; Copyright: Copyright © 2009, Mikael Gustafsson
-;
-; Webpage: http://mrmackey.no-ip.org/elektronik/ds30loader/
-;
-; History: 1.0.1 -
-; 1.0.0 Removed PIC24FxxKAyyy stuff, se separate fw
-; 0.9.1 Only one clock option in this file
-; 0.9.0 First version of this file
-;
-;------------------------------------------------------------------------------
-
-;-----------------------------------------------------------------------------
-; This file is part of ds30 Loader.
-;
-; ds30 Loader 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.
-;
-; ds30 Loader 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 ds30 Loader. If not, see .
-;------------------------------------------------------------------------------
-
-
-;------------------------------------------------------------------------------
-; Device
-;------------------------------------------------------------------------------
- .equ __24FJ64GA002, 1 ;xxx
- .equ BUSPIRATEV2, 1 ;use pin config for v2go/v3
- ;.equ BUSPIRATEV1A, 1 ;use pin config for v1a
-
-;------------------------------------------------------------------------------
-; Includes
-;------------------------------------------------------------------------------
- .include "devices.inc"
- .include "p24fxxxx.inc"
-
-
-;------------------------------------------------------------------------------
-; User preferences
-;------------------------------------------------------------------------------
- .equ FCY, 16000000 ;xxx speed of internal cycle clock[Hz], used to calculate uart brg and delay
- .equ BAUDRATE, 115200 ;xxx baudrate
- .equ BLTIME, 500 ;xxx time in ms before bootloader loads the user application
- .equ USE_UART1, 1 ;xxx uncomment to use uart1
- ;.equ USE_UART2, 1 ;xxx uncomment to use uart2
- ;.equ USE_UART3, 1 ;xxx uncomment to use uart3
- ;.equ USE_UART4, 1 ;xxx uncomment to use uart4
-
-;------------------------------------------------------------------------------
-; Configuration bits, these macros can be found at the end of the inc-files located in
-; c:\Program files\Microchip\MPLAB ASM30 Suite\Support\dsPIC24x\inc
-;
-; These can also be set in MPLAB IDE instead, they are found in Configure->Configuration bits...
-;------------------------------------------------------------------------------
- ;use identical Bus Pirate config fuses
- config __CONFIG2, FNOSC_FRCPLL & OSCIOFNC_ON &POSCMOD_NONE & I2C1SEL_PRI
- config __CONFIG1, JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx1
-
- ;config __CONFIG1, JTAGEN_OFF/*JTAG*/ & GCP_OFF/*code protect*/ & GWRP_OFF/*write protect*/ & BKBUG_OFF/*background debugger*/ & COE_OFF/*clip-on emulation mode*/ & ICS_PGx1/*icd pins select*/ & FWDTEN_OFF/*watchdog timer*/ & WINDIS_OFF/*windowed wdt*/ & FWPSA_PR32/*watchdog prescalar*/ & WDTPS_PS1/*watchdog postscalar*/
- ;config __CONFIG2, IESO_OFF/*two-speed startup*/ & FNOSC_FRC/*oscillator selection*/ & FCKSM_CSDCMD/*clock switching and clock monitor*/ & OSCIOFNC_OFF/*OSC0/RC15 function*/ & POSCMOD_XT/*oscillator selection*/
- ;config __CONFIG3, WPEND_WPSTARTMEM/*write protect range selection*/ & WPCFG_WPCFGDIS/*write protection config page*/ & WPDIS_WPEN/*write protection*/ & WPFP_WPFP8/*Write Protection Flash Page*/
+;------------------------------------------------------------------------------
+;
+; Title: ds30 loader for PIC24FJ
+;
+; File description: user settings and configuration bits
+;
+; Copyright: Copyright � 2009, Mikael Gustafsson
+;
+; Webpage: http://mrmackey.no-ip.org/elektronik/ds30loader/
+;
+; History: 1.0.1 -
+; 1.0.0 Removed PIC24FxxKAyyy stuff, se separate fw
+; 0.9.1 Only one clock option in this file
+; 0.9.0 First version of this file
+;
+;------------------------------------------------------------------------------
+
+;-----------------------------------------------------------------------------
+; This file is part of ds30 Loader.
+;
+; ds30 Loader 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.
+;
+; ds30 Loader 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 ds30 Loader. If not, see .
+;------------------------------------------------------------------------------
+
+
+;------------------------------------------------------------------------------
+; Device
+;------------------------------------------------------------------------------
+ .equ __24FJ64GA002, 1 ;xxx
+ .equ BUSPIRATEV2, 1 ;use pin config for v2go/v3
+ ;.equ BUSPIRATEV1A, 1 ;use pin config for v1a
+
+;------------------------------------------------------------------------------
+; Includes
+;------------------------------------------------------------------------------
+ .include "devices.inc"
+ .include "p24fxxxx.inc"
+
+
+;------------------------------------------------------------------------------
+; User preferences
+;------------------------------------------------------------------------------
+ .equ FCY, 16000000 ;xxx speed of internal cycle clock[Hz], used to calculate uart brg and delay
+ .equ BAUDRATE, 115200 ;xxx baudrate
+ .equ BLTIME, 500 ;xxx time in ms before bootloader loads the user application
+ .equ USE_UART1, 1 ;xxx uncomment to use uart1
+ ;.equ USE_UART2, 1 ;xxx uncomment to use uart2
+ ;.equ USE_UART3, 1 ;xxx uncomment to use uart3
+ ;.equ USE_UART4, 1 ;xxx uncomment to use uart4
+
+;------------------------------------------------------------------------------
+; Configuration bits, these macros can be found at the end of the inc-files located in
+; c:\Program files\Microchip\MPLAB ASM30 Suite\Support\dsPIC24x\inc
+;
+; These can also be set in MPLAB IDE instead, they are found in Configure->Configuration bits...
+;------------------------------------------------------------------------------
+ ;use identical Bus Pirate config fuses
+ config __CONFIG2, FNOSC_FRCPLL & OSCIOFNC_ON &POSCMOD_NONE & I2C1SEL_PRI
+ config __CONFIG1, JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF & ICS_PGx1
+
+ ;config __CONFIG1, JTAGEN_OFF/*JTAG*/ & GCP_OFF/*code protect*/ & GWRP_OFF/*write protect*/ & BKBUG_OFF/*background debugger*/ & COE_OFF/*clip-on emulation mode*/ & ICS_PGx1/*icd pins select*/ & FWDTEN_OFF/*watchdog timer*/ & WINDIS_OFF/*windowed wdt*/ & FWPSA_PR32/*watchdog prescalar*/ & WDTPS_PS1/*watchdog postscalar*/
+ ;config __CONFIG2, IESO_OFF/*two-speed startup*/ & FNOSC_FRC/*oscillator selection*/ & FCKSM_CSDCMD/*clock switching and clock monitor*/ & OSCIOFNC_OFF/*OSC0/RC15 function*/ & POSCMOD_XT/*oscillator selection*/
+ ;config __CONFIG3, WPEND_WPSTARTMEM/*write protect range selection*/ & WPCFG_WPCFGDIS/*write protection config page*/ & WPDIS_WPEN/*write protection*/ & WPFP_WPFP8/*Write Protection Flash Page*/