From 02e24f0f533fe904c3a5275c4060c10c38d7c17a Mon Sep 17 00:00:00 2001 From: Ján Sučan Date: Wed, 10 May 2017 15:13:29 +0200 Subject: Uvodny commit, subory su rovnake ako na CD prilozenom k vytlacenemu texu bakalarskej prace, naviac je pridany len subor LICENCIA --- CMakeLists.txt | 100 ++ ExitCodes.hpp | 12 + ExitException.cpp | 13 + ExitException.hpp | 19 + HelpMessage.txt | 56 + LICENCIA | 54 + Logger.cpp | 73 + Logger.hpp | 23 + Mcu.cpp | 422 +++++ Mcu.hpp | 37 + McuSpecifics.hpp | 26 + McuSt10f168/CMakeLists.txt | 26 + McuSt10f168/McuSt10f168.cpp | 173 ++ McuSt10f168/McuSt10f168.hpp | 27 + McuSt10f269/CMakeLists.txt | 26 + McuSt10f269/McuSt10f269.cpp | 102 ++ McuSt10f269/McuSt10f269.hpp | 25 + SerialPort/CMakeLists.txt | 19 + SerialPort/SerialPort.cpp | 157 ++ SerialPort/SerialPort.hpp | 37 + SerialPort/SerialPortFactory.cpp | 21 + SerialPort/SerialPortFactory.hpp | 13 + SerialPort/SerialPortUnix.cpp | 285 ++++ SerialPort/SerialPortUnix.hpp | 35 + SerialPort/SerialPortWin32.cpp | 238 +++ SerialPort/SerialPortWin32.hpp | 49 + UserConfig.cpp | 375 +++++ UserConfig.hpp | 67 + firmware/ident/Objects/ident.SBR | Bin 0 -> 73 bytes firmware/ident/Objects/ident.bin | Bin 0 -> 222 bytes firmware/ident/ident.a66 | 27 + firmware/ident/ident.uvgui.jan | 1360 ++++++++++++++++ firmware/ident/ident.uvopt | 262 ++++ firmware/ident/ident.uvproj | 314 ++++ firmware/include/COMMON.INC | 30 + firmware/include/SHELL.INC | 51 + firmware/include/SUBROUTINES.INC | 177 +++ firmware/main.uvmpw | 31 + firmware/main.uvmpw.uvgui.jan | 1306 ++++++++++++++++ firmware/st10f168/Objects/st10f168.SBR | Bin 0 -> 67 bytes firmware/st10f168/Objects/st10f168.bin | Bin 0 -> 2042 bytes firmware/st10f168/st10f168.a66 | 273 ++++ firmware/st10f168/st10f168.uvgui.jan | 1360 ++++++++++++++++ firmware/st10f168/st10f168.uvopt | 262 ++++ firmware/st10f168/st10f168.uvproj | 314 ++++ firmware/st10f269/Objects/st10f269.SBR | Bin 0 -> 67 bytes firmware/st10f269/Objects/st10f269.bin | Bin 0 -> 2048 bytes firmware/st10f269/st10f269.a66 | 422 +++++ firmware/st10f269/st10f269.uvgui.jan | 1360 ++++++++++++++++ firmware/st10f269/st10f269.uvopt | 262 ++++ firmware/st10f269/st10f269.uvproj | 314 ++++ firmware/stage_1/Objects/stage_1.SBR | Bin 0 -> 66 bytes firmware/stage_1/Objects/stage_1.bin | Bin 0 -> 28 bytes firmware/stage_1/stage_1.a66 | 43 + firmware/stage_1/stage_1.uvgui.jan | 2601 +++++++++++++++++++++++++++++++ firmware/stage_1/stage_1.uvopt | 269 ++++ firmware/stage_1/stage_1.uvproj | 314 ++++ main.cpp | 219 +++ tests/CMakeLists.txt | 41 + tests/erase.cmake | 15 + tests/functions.cmake | 78 + tests/other_operations.cmake | 5 + tests/read.cmake | 12 + tests/st10f168/CMakeLists.txt | 46 + tests/st10f168/erase/ok_b023_erased | 1 + tests/st10f168/erase/ok_b0_erased | 1 + tests/st10f168/erase/ok_b1_erased | Bin 0 -> 262144 bytes tests/st10f168/erase/ok_b2_erased | Bin 0 -> 262144 bytes tests/st10f168/erase/ok_b3_erased | Bin 0 -> 262144 bytes tests/st10f168/erase/ok_ones | 1 + tests/st10f168/erase/zeros | Bin 0 -> 262144 bytes tests/st10f168/read/ok_100003B | Bin 0 -> 100003 bytes tests/st10f168/read/ok_1B | 1 + tests/st10f168/read/ok_262144B | Bin 0 -> 262144 bytes tests/st10f168/read/random | Bin 0 -> 262144 bytes tests/st10f168/write/0B | 0 tests/st10f168/write/160K | Bin 0 -> 163840 bytes tests/st10f168/write/160K_1B | Bin 0 -> 163841 bytes tests/st10f168/write/16K | Bin 0 -> 16384 bytes tests/st10f168/write/16K_1B | Bin 0 -> 16385 bytes tests/st10f168/write/1B | 1 + tests/st10f168/write/256K_1B | Bin 0 -> 262145 bytes tests/st10f168/write/64K | Bin 0 -> 65536 bytes tests/st10f168/write/64K_1B | Bin 0 -> 65537 bytes tests/st10f168/write/ok_160K | Bin 0 -> 262144 bytes tests/st10f168/write/ok_160K_1B | Bin 0 -> 262144 bytes tests/st10f168/write/ok_16K | Bin 0 -> 262144 bytes tests/st10f168/write/ok_16K_1B | Bin 0 -> 262144 bytes tests/st10f168/write/ok_1B | 1 + tests/st10f168/write/ok_64K | Bin 0 -> 262144 bytes tests/st10f168/write/ok_64K_1B | Bin 0 -> 262144 bytes tests/st10f168/write/ok_ones | 1 + tests/st10f168/write/random | Bin 0 -> 262144 bytes tests/st10f168/write/zeros | Bin 0 -> 262144 bytes tests/st10f269/CMakeLists.txt | 53 + tests/st10f269/erase/ok_b0_erased | 1 + tests/st10f269/erase/ok_b1246_erased | Bin 0 -> 262144 bytes tests/st10f269/erase/ok_b1_erased | Bin 0 -> 262144 bytes tests/st10f269/erase/ok_b2_erased | Bin 0 -> 262144 bytes tests/st10f269/erase/ok_b3_erased | Bin 0 -> 262144 bytes tests/st10f269/erase/ok_b4_erased | Bin 0 -> 262144 bytes tests/st10f269/erase/ok_b5_erased | Bin 0 -> 262144 bytes tests/st10f269/erase/ok_b6_erased | Bin 0 -> 262144 bytes tests/st10f269/erase/ok_ones | 1 + tests/st10f269/erase/zeros | Bin 0 -> 262144 bytes tests/st10f269/read/ok_100003B | Bin 0 -> 100003 bytes tests/st10f269/read/ok_1B | 1 + tests/st10f269/read/ok_262144B | Bin 0 -> 262144 bytes tests/st10f269/read/random | Bin 0 -> 262144 bytes tests/st10f269/write/0B | 0 tests/st10f269/write/128K | Bin 0 -> 131072 bytes tests/st10f269/write/128K_1B | Bin 0 -> 131073 bytes tests/st10f269/write/16K | Bin 0 -> 16384 bytes tests/st10f269/write/16K_1B | Bin 0 -> 16385 bytes tests/st10f269/write/192K | Bin 0 -> 196608 bytes tests/st10f269/write/192K_1B | Bin 0 -> 196609 bytes tests/st10f269/write/1B | 1 + tests/st10f269/write/24K | Bin 0 -> 24576 bytes tests/st10f269/write/24K_1B | Bin 0 -> 24577 bytes tests/st10f269/write/256K_1B | Bin 0 -> 262145 bytes tests/st10f269/write/32K | Bin 0 -> 32768 bytes tests/st10f269/write/32K_1B | Bin 0 -> 32769 bytes tests/st10f269/write/64K | Bin 0 -> 65536 bytes tests/st10f269/write/64K_1B | Bin 0 -> 65537 bytes tests/st10f269/write/mod/backup/128K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/backup/16K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/backup/192K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/backup/24K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/backup/32K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/backup/64K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/ok/ok_128K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/ok/ok_16K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/ok/ok_192K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/ok/ok_24K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/ok/ok_32K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/ok/ok_64K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/mod/r.bin | Bin 0 -> 262144 bytes tests/st10f269/write/ok_128K | Bin 0 -> 262144 bytes tests/st10f269/write/ok_128K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/ok_16K | Bin 0 -> 262144 bytes tests/st10f269/write/ok_16K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/ok_192K | Bin 0 -> 262144 bytes tests/st10f269/write/ok_192K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/ok_1B | 1 + tests/st10f269/write/ok_24K | Bin 0 -> 262144 bytes tests/st10f269/write/ok_24K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/ok_32K | Bin 0 -> 262144 bytes tests/st10f269/write/ok_32K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/ok_64K | Bin 0 -> 262144 bytes tests/st10f269/write/ok_64K_1B | Bin 0 -> 262144 bytes tests/st10f269/write/ok_ones | 1 + tests/st10f269/write/random | Bin 0 -> 262144 bytes tests/st10f269/write/zeros | Bin 0 -> 262144 bytes tests/write.cmake | 11 + utils/xd/CMakeLists.txt | 5 + utils/xd/xd.c | 542 +++++++ 156 files changed, 14902 insertions(+) create mode 100755 CMakeLists.txt create mode 100755 ExitCodes.hpp create mode 100755 ExitException.cpp create mode 100755 ExitException.hpp create mode 100755 HelpMessage.txt create mode 100644 LICENCIA create mode 100755 Logger.cpp create mode 100755 Logger.hpp create mode 100755 Mcu.cpp create mode 100755 Mcu.hpp create mode 100755 McuSpecifics.hpp create mode 100755 McuSt10f168/CMakeLists.txt create mode 100755 McuSt10f168/McuSt10f168.cpp create mode 100755 McuSt10f168/McuSt10f168.hpp create mode 100755 McuSt10f269/CMakeLists.txt create mode 100755 McuSt10f269/McuSt10f269.cpp create mode 100755 McuSt10f269/McuSt10f269.hpp create mode 100755 SerialPort/CMakeLists.txt create mode 100755 SerialPort/SerialPort.cpp create mode 100755 SerialPort/SerialPort.hpp create mode 100755 SerialPort/SerialPortFactory.cpp create mode 100755 SerialPort/SerialPortFactory.hpp create mode 100755 SerialPort/SerialPortUnix.cpp create mode 100755 SerialPort/SerialPortUnix.hpp create mode 100755 SerialPort/SerialPortWin32.cpp create mode 100755 SerialPort/SerialPortWin32.hpp create mode 100755 UserConfig.cpp create mode 100755 UserConfig.hpp create mode 100755 firmware/ident/Objects/ident.SBR create mode 100755 firmware/ident/Objects/ident.bin create mode 100755 firmware/ident/ident.a66 create mode 100755 firmware/ident/ident.uvgui.jan create mode 100755 firmware/ident/ident.uvopt create mode 100755 firmware/ident/ident.uvproj create mode 100755 firmware/include/COMMON.INC create mode 100755 firmware/include/SHELL.INC create mode 100755 firmware/include/SUBROUTINES.INC create mode 100755 firmware/main.uvmpw create mode 100755 firmware/main.uvmpw.uvgui.jan create mode 100755 firmware/st10f168/Objects/st10f168.SBR create mode 100755 firmware/st10f168/Objects/st10f168.bin create mode 100755 firmware/st10f168/st10f168.a66 create mode 100755 firmware/st10f168/st10f168.uvgui.jan create mode 100755 firmware/st10f168/st10f168.uvopt create mode 100755 firmware/st10f168/st10f168.uvproj create mode 100755 firmware/st10f269/Objects/st10f269.SBR create mode 100755 firmware/st10f269/Objects/st10f269.bin create mode 100755 firmware/st10f269/st10f269.a66 create mode 100755 firmware/st10f269/st10f269.uvgui.jan create mode 100755 firmware/st10f269/st10f269.uvopt create mode 100755 firmware/st10f269/st10f269.uvproj create mode 100755 firmware/stage_1/Objects/stage_1.SBR create mode 100755 firmware/stage_1/Objects/stage_1.bin create mode 100755 firmware/stage_1/stage_1.a66 create mode 100755 firmware/stage_1/stage_1.uvgui.jan create mode 100755 firmware/stage_1/stage_1.uvopt create mode 100755 firmware/stage_1/stage_1.uvproj create mode 100755 main.cpp create mode 100755 tests/CMakeLists.txt create mode 100755 tests/erase.cmake create mode 100755 tests/functions.cmake create mode 100755 tests/other_operations.cmake create mode 100755 tests/read.cmake create mode 100755 tests/st10f168/CMakeLists.txt create mode 100755 tests/st10f168/erase/ok_b023_erased create mode 100755 tests/st10f168/erase/ok_b0_erased create mode 100755 tests/st10f168/erase/ok_b1_erased create mode 100755 tests/st10f168/erase/ok_b2_erased create mode 100755 tests/st10f168/erase/ok_b3_erased create mode 100755 tests/st10f168/erase/ok_ones create mode 100755 tests/st10f168/erase/zeros create mode 100755 tests/st10f168/read/ok_100003B create mode 100755 tests/st10f168/read/ok_1B create mode 100755 tests/st10f168/read/ok_262144B create mode 100755 tests/st10f168/read/random create mode 100755 tests/st10f168/write/0B create mode 100755 tests/st10f168/write/160K create mode 100755 tests/st10f168/write/160K_1B create mode 100755 tests/st10f168/write/16K create mode 100755 tests/st10f168/write/16K_1B create mode 100755 tests/st10f168/write/1B create mode 100755 tests/st10f168/write/256K_1B create mode 100755 tests/st10f168/write/64K create mode 100755 tests/st10f168/write/64K_1B create mode 100755 tests/st10f168/write/ok_160K create mode 100755 tests/st10f168/write/ok_160K_1B create mode 100755 tests/st10f168/write/ok_16K create mode 100755 tests/st10f168/write/ok_16K_1B create mode 100755 tests/st10f168/write/ok_1B create mode 100755 tests/st10f168/write/ok_64K create mode 100755 tests/st10f168/write/ok_64K_1B create mode 100755 tests/st10f168/write/ok_ones create mode 100755 tests/st10f168/write/random create mode 100755 tests/st10f168/write/zeros create mode 100755 tests/st10f269/CMakeLists.txt create mode 100755 tests/st10f269/erase/ok_b0_erased create mode 100755 tests/st10f269/erase/ok_b1246_erased create mode 100755 tests/st10f269/erase/ok_b1_erased create mode 100755 tests/st10f269/erase/ok_b2_erased create mode 100755 tests/st10f269/erase/ok_b3_erased create mode 100755 tests/st10f269/erase/ok_b4_erased create mode 100755 tests/st10f269/erase/ok_b5_erased create mode 100755 tests/st10f269/erase/ok_b6_erased create mode 100755 tests/st10f269/erase/ok_ones create mode 100755 tests/st10f269/erase/zeros create mode 100755 tests/st10f269/read/ok_100003B create mode 100755 tests/st10f269/read/ok_1B create mode 100755 tests/st10f269/read/ok_262144B create mode 100755 tests/st10f269/read/random create mode 100755 tests/st10f269/write/0B create mode 100755 tests/st10f269/write/128K create mode 100755 tests/st10f269/write/128K_1B create mode 100755 tests/st10f269/write/16K create mode 100755 tests/st10f269/write/16K_1B create mode 100755 tests/st10f269/write/192K create mode 100755 tests/st10f269/write/192K_1B create mode 100755 tests/st10f269/write/1B create mode 100755 tests/st10f269/write/24K create mode 100755 tests/st10f269/write/24K_1B create mode 100755 tests/st10f269/write/256K_1B create mode 100755 tests/st10f269/write/32K create mode 100755 tests/st10f269/write/32K_1B create mode 100755 tests/st10f269/write/64K create mode 100755 tests/st10f269/write/64K_1B create mode 100755 tests/st10f269/write/mod/backup/128K_1B create mode 100755 tests/st10f269/write/mod/backup/16K_1B create mode 100755 tests/st10f269/write/mod/backup/192K_1B create mode 100755 tests/st10f269/write/mod/backup/24K_1B create mode 100755 tests/st10f269/write/mod/backup/32K_1B create mode 100755 tests/st10f269/write/mod/backup/64K_1B create mode 100755 tests/st10f269/write/mod/ok/ok_128K_1B create mode 100755 tests/st10f269/write/mod/ok/ok_16K_1B create mode 100755 tests/st10f269/write/mod/ok/ok_192K_1B create mode 100755 tests/st10f269/write/mod/ok/ok_24K_1B create mode 100755 tests/st10f269/write/mod/ok/ok_32K_1B create mode 100755 tests/st10f269/write/mod/ok/ok_64K_1B create mode 100755 tests/st10f269/write/mod/r.bin create mode 100755 tests/st10f269/write/ok_128K create mode 100755 tests/st10f269/write/ok_128K_1B create mode 100755 tests/st10f269/write/ok_16K create mode 100755 tests/st10f269/write/ok_16K_1B create mode 100755 tests/st10f269/write/ok_192K create mode 100755 tests/st10f269/write/ok_192K_1B create mode 100755 tests/st10f269/write/ok_1B create mode 100755 tests/st10f269/write/ok_24K create mode 100755 tests/st10f269/write/ok_24K_1B create mode 100755 tests/st10f269/write/ok_32K create mode 100755 tests/st10f269/write/ok_32K_1B create mode 100755 tests/st10f269/write/ok_64K create mode 100755 tests/st10f269/write/ok_64K_1B create mode 100755 tests/st10f269/write/ok_ones create mode 100755 tests/st10f269/write/random create mode 100755 tests/st10f269/write/zeros create mode 100755 tests/write.cmake create mode 100755 utils/xd/CMakeLists.txt create mode 100755 utils/xd/xd.c diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100755 index 0000000..31e971d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,100 @@ +cmake_minimum_required (VERSION 3.3) +project (Main VERSION 1.0.0) + +add_compile_options (-Wall -Werror -pedantic -g) + +# Path to common firmware binary files +set (FwPrefix ${CMAKE_CURRENT_SOURCE_DIR}/firmware) +set (FwCommonPrefix ${FwPrefix}) +set(FwCommon + ${FwCommonPrefix}/stage_1/Objects/stage_1.bin + ${FwCommonPrefix}/ident/Objects/ident.bin +) + +# Define program name and version +add_definitions (-DPROGRAM_NAME="${CMAKE_PROJECT_NAME}") +add_definitions (-DPROGRAM_VERSION="${PROJECT_VERSION}") + +# Platform specific options +if (WIN32) + add_definitions (-DWIN32) + set (DefaultSerialPortName COM1) +else() + add_definitions (-DUNIX) + set (DefaultSerialPortName /dev/ttyUSB0) +endif() +add_definitions(-DDEFAULT_SERIAL_PORT_NAME="${DefaultSerialPortName}") + +# Utility, to dump binary file as a C declaration +add_subdirectory (${CMAKE_CURRENT_SOURCE_DIR}/utils/xd) + +# Generate firmware header files +include_directories (${CMAKE_CURRENT_BINARY_DIR}) + +# Function generates header files containing arrays with binary +# files data. Name transformation is: .bin -> fw_.hpp +# +# Arguments: +# GenCmd - path to the generator command +# NameSpc - namespace for C++ definitions in the header file +# FwList - list of binary files +# OutDir - directory where the header files will be placed +function (generate_headers_from_binaries GenCmd NameSpc FwList OutDir) + foreach (FILE ${FwList}) + get_filename_component(NAME "${FILE}" NAME_WE) + set (OutHeader ${OutDir}/fw_${NAME}.hpp) + # set (NameSpc FwCommon) + add_custom_command ( + OUTPUT ${OutHeader} + COMMAND ${GenCmd} -dfw_${NAME} -p${NameSpc} ${FILE} ${OutHeader} + DEPENDS ${GenCmd} ${FILE} + ) + endforeach() +endfunction() + +generate_headers_from_binaries ( + "$" + FwCommon + "${FwCommon}" + "${CMAKE_CURRENT_BINARY_DIR}" +) + +# Generate header with help message +add_custom_command ( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/help_message.hpp + COMMAND $ -thelp_message -pHelpMessage ${CMAKE_SOURCE_DIR}/HelpMessage.txt ${CMAKE_CURRENT_BINARY_DIR}/help_message.hpp + DEPENDS $ ${CMAKE_SOURCE_DIR}/HelpMessage.txt + ) + +include_directories ( + ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/McuSt10f269 + ${CMAKE_CURRENT_SOURCE_DIR}/McuSt10f168 + ${CMAKE_CURRENT_SOURCE_DIR}/SerialPort + ) +add_subdirectory (McuSt10f269) +add_subdirectory (McuSt10f168) +add_subdirectory (SerialPort) +add_executable (main + ExitException.cpp + Logger.cpp + UserConfig.cpp + Mcu.cpp + main.cpp + ${CMAKE_CURRENT_BINARY_DIR}/fw_stage_1.hpp + ${CMAKE_CURRENT_BINARY_DIR}/fw_ident.hpp + ${CMAKE_CURRENT_BINARY_DIR}/help_message.hpp + ) +target_link_libraries (main McuSt10f269 McuSt10f168 SerialPort) + +set_target_properties (main PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS OFF + ) + +# Tests +enable_testing () + +include (${CMAKE_SOURCE_DIR}/tests/st10f168/CMakeLists.txt) +include (${CMAKE_SOURCE_DIR}/tests/st10f269/CMakeLists.txt) diff --git a/ExitCodes.hpp b/ExitCodes.hpp new file mode 100755 index 0000000..6c903d3 --- /dev/null +++ b/ExitCodes.hpp @@ -0,0 +1,12 @@ +#ifndef EXIT_CODES_HPP +#define EXIT_CODES_HPP 1 + +#define EXIT_MAIN_NOOP 1 +#define EXIT_USER_CONFIG 2 +#define EXIT_MAIN_FILE_INOUT 3 +#define EXIT_MAIN_PROG_VERIFY 4 +#define EXIT_MAIN_SIGNAL 5 +#define EXIT_MCU 6 +#define EXIT_SERIAL_PORT 7 + +#endif diff --git a/ExitException.cpp b/ExitException.cpp new file mode 100755 index 0000000..d890bba --- /dev/null +++ b/ExitException.cpp @@ -0,0 +1,13 @@ +#include "ExitException.hpp" + +CExitException::CExitException(const string & whatArg, int returnValue) : + runtime_error(whatArg), mReturnValue(returnValue) +{ + ; +} + +int +CExitException::getReturnValue() +{ + return mReturnValue; +} diff --git a/ExitException.hpp b/ExitException.hpp new file mode 100755 index 0000000..ca21bd1 --- /dev/null +++ b/ExitException.hpp @@ -0,0 +1,19 @@ +#ifndef EXIT_EXCEPTION_HPP +#define EXIT_EXCEPTION_HPP 1 + +#include +#include + +using std::runtime_error; +using std::string; + +class CExitException : public runtime_error +{ +private: + int mReturnValue; +public: + CExitException(const string & whatArg, int returnValue); + int getReturnValue(); +}; + +#endif diff --git a/HelpMessage.txt b/HelpMessage.txt new file mode 100755 index 0000000..8ecb927 --- /dev/null +++ b/HelpMessage.txt @@ -0,0 +1,56 @@ +Usage: %ARG% OPERATION OPARGS + + OPERATION Can be one of these: help, version, speeds, ident, erase, + read, write. + + OPARGS Are arguments for selected operation. Note that the same + argument can have a different meaning when used with + different OPERATION. + +Common options: + -p PORTNAME Name of a serial port device to use. + + -s SPEED Serial line communication speed in Bd. Note that the + SPEED is a number without 'Bd' suffix. Default SPEED + is 19200. + + -v Be more verbose. + + -f FREQ CPU frequency in MHz. Real number with dot as a decimal + separator. This is used only by ST10F168 MCU and is + mandatory for it. + + -g Print progress for read and write operations. + +Operations: + help + Print this help message. + + version + Print name and version information of this program. + + speeds + Print list of serial line speeds available. + + ident + Print name of supported MCU connected. + + erase [-b n[,n]...] + -b n[,n]... Numbers of sectors to erase. Without this option whole + FLASH memory is erased. + + read [-n COUNT] FILE + -n COUNT Read only COUNT bytes from address 0 instead of whole memory. + + FILE Name of a file where to write content of memory. + + write [-e,-c] FILE + -e Erase whole FLASH memory before writing data. Without this + option only blocks which are going to be programmed are + erased. + + -c Check written data by reading it back and comparing with FILE + data. Without this option result of write operation is + checked only by MCU FLASH memory controller. + + FILE Name of a file containing data to write to MCU FLASH memory. diff --git a/LICENCIA b/LICENCIA new file mode 100644 index 0000000..e63ddb0 --- /dev/null +++ b/LICENCIA @@ -0,0 +1,54 @@ +Slovenský, český a anglický text licencie je prevzatý zo súboru +FITthesis.cls v archíve vzorových LaTeX šablón FIT ČVUT, ktoré som +používal pri tvorbe mojej bakalárskej práce: + +https://edux.fit.cvut.cz/_media/szz/ +priloha2-smernice_dekana_pro_szz-latex-sablony-160505.zip + +V texte mojej bakalárskej práce som zvolil text prehlásenia číslo 5: +"zcela volné užití pro každého". Text tejto licencie v slovenskom, +českom a anglickom jazyku citujem: + +„Prehlasujem, že som predloženú prácu vypracoval(a) samostatne a že +som uviedol(uviedla) všetky informačné zdroje v súlade s Metodickým +pokynom o etickej príprave vysokoškolských záverečných prác. +Beriem na vedomie, že sa na moju prácu vzťahujú práva a povinnosti +vyplývajúce zo zákona č. 121/2000 Sb., autorského zákona, v znení +neskorších predpisov. V súlade s ustanovením § 46 odst. 6 tohoto +zákona týmto udeľujem bezvýhradné oprávnenie (licenciu) k užívaniu +tejto mojej práce, a to vrátane všetkých počítačových programov ktoré +sú jej súčasťou alebo prílohou a tiež všetkej ich dokumentácie (ďalej +len „Dielo“), a to všetkým osobám, ktoré si prajú Dielo užívať. Tieto +osoby sú oprávnené Dielo používať akýmkoľvek spôsobom, ktorý neznižuje +hodnotu Diela (vrátane komerčného využitia). Toto oprávnenie je +časovo, územne a množstevne neobmedzené.“ + +„Prohlašuji, že jsem předloženou práci vypracoval(a) samostatně a že +jsem uvedl(a) veškeré použité informační zdroje v souladu s Metodickým +pokynem o etické přípravě vysokoškolských závěrečných prací. +Beru na vědomí, že se na moji práci vztahují práva a povinnosti +vyplývající ze zákona č. 121/2000 Sb., autorského zákona, ve znění +pozdějších předpisů. V souladu s ust. § 46 odst. 6 tohoto zákona +tímto uděluji nevýhradní oprávnění (licenci) k užití této mojí práce, +a to včetně všech počítačových programů, jež jsou její součástí či +přílohou a veškeré jejich dokumentace (dále souhrnně jen „Dílo“), a to +všem osobám, které si přejí Dílo užít. Tyto osoby jsou oprávněny Dílo +užít jakýmkoli způsobem, který nesnižuje hodnotu Díla a za jakýmkoli +účelem (včetně užití k výdělečným účelům). Toto oprávnění je časově, +teritoriálně i množstevně neomezené.“ + +“I hereby declare that the presented thesis is my own work and that I +have cited all sources of information in accordance with the Guideline +for adhering to ethical principles when elaborating an academic final +thesis. +I acknowledge that my thesis is subject to the rights and obligations +stipulated by the Act No. 121/2000 Coll., the Copyright Act, as +amended. In accordance with Article 46(6) of the Act, I hereby grant a +nonexclusive authorization (license) to utilize this thesis, +including any and all computer programs incorporated therein or +attached thereto and all corresponding documentation (hereinafter +collectively referred to as the “Work”), to any and all persons that +wish to utilize the Work. Such persons are entitled to use the Work in +any way (including for-profit purposes) that does not detract from its +value. This authorization is not limited in terms of time, location +and quantity.” diff --git a/Logger.cpp b/Logger.cpp new file mode 100755 index 0000000..142442e --- /dev/null +++ b/Logger.cpp @@ -0,0 +1,73 @@ +#include "Logger.hpp" +#include "ExitException.hpp" +#include + +using std::endl; +using std::cout; +using std::cerr; +using std::flush; +using std::hex; +using std::uppercase; +using std::ostringstream; + +bool CLogger::mLogInfo = false; +int CLogger::mProgressLastPercent = -1; + +void +CLogger::error(const string & msg, int returnValue) +{ + cerr << "ERROR: " << msg << endl; + throw CExitException(msg, returnValue); +} + +void +CLogger::warning(const string & msg) +{ + cerr << "WARNING: " << msg << endl; +} + +void +CLogger::info(const string & msg) +{ + if (!CLogger::mLogInfo) + return; + cout << "INFO: " << msg << endl; +} + +void +CLogger::progress(uint32_t b, uint32_t n) +{ + if (b > n) + b = n; + + double d = n; + int p = (int) (b / (d / 100.0)); + if ((p == 100) && (b != n)) + p = 99; + else if (p > 100) + p = 100; + + if (((p == 0) && (p != mProgressLastPercent)) + || ((p == 100) && (p != mProgressLastPercent)) + || ((p - mProgressLastPercent) >= LOGGER_PROGRESS_UNIT)) { + cout << p << "% (" << b << " B / " << n << " B)" << endl; + mProgressLastPercent = p; + } + + if (p == 100) + mProgressLastPercent = -1; +} + +void +CLogger::setLogInfo(bool b) +{ + mLogInfo = b; +} + +string +CLogger::decToHex(int dec) +{ + ostringstream os; + os << "0x" << hex << uppercase << dec; + return os.str(); +} diff --git a/Logger.hpp b/Logger.hpp new file mode 100755 index 0000000..0925b69 --- /dev/null +++ b/Logger.hpp @@ -0,0 +1,23 @@ +#ifndef LOGGER_HPP +#define LOGGER_HPP 1 + +#include + +using std::string; + +#define LOGGER_PROGRESS_UNIT 3 // % + +class CLogger { +private: + static bool mLogInfo; + static int mProgressLastPercent; +public: + static void error(const string & msg, int returnValue); + static void warning(const string & msg); + static void info(const string & msg); + static void progress(uint32_t b, uint32_t n); + static void setLogInfo(bool b); + static string decToHex(int dec); +}; + +#endif diff --git a/Mcu.cpp b/Mcu.cpp new file mode 100755 index 0000000..16a0383 --- /dev/null +++ b/Mcu.cpp @@ -0,0 +1,422 @@ +#include + +#include "fw_stage_1.hpp" +#include "fw_ident.hpp" +#include "ExitCodes.hpp" +#include "Logger.hpp" +#include "ExitException.hpp" +#include "McuSt10f269.hpp" +#include "McuSt10f168.hpp" + +#include + +using FwCommon::fw_stage_1; +using FwCommon::fw_stage_1_length; +using FwCommon::fw_ident; +using FwCommon::fw_ident_length; +using std::ostringstream; +using std::nothrow; + +#define FW_1_MAX_LENGTH 32 +#define FW_MAX_LENGTH 2048 +#define BOOTSTRAP_ACK 0xD5 +#define SHELL_ACK 0xAB + +#define PAD_BYTE 0xFF + +#define CMD_PING 0x00 +#define CMD_ERASE_BLOCKS 0x01 +#define CMD_READ 0x02 +#define CMD_WRITE 0x03 +#define CMD_IDENTIFY 0x04 +#define CMD_ERASE_CHIP 0x05 + +#define RET_SERIAL_OVERRUN 0x20 +#define RET_BAD_ECHO 0x21 + +#define JUNK_BYTE_COUNT 128 + + +CMcu::CMcu(CSerialPort & serialPort, float mcuFrequency) + : mSerialPort(serialPort), mMcuFrequency(mcuFrequency) +{ + // Check in which mode MCU is + CLogger::info("Sending zero byte"); + uint8_t ack = CMD_PING; + // Send zero byte + mSerialPort.write(&ack, 1, 1); + // Read response + mSerialPort.read(&ack, 1); + + // If some unknown data were received, try to read out junk bytes from + // previous operations without collected return status + for (int i = 0; (ack != BOOTSTRAP_ACK) && (ack != SHELL_ACK) && (i < JUNK_BYTE_COUNT); ++i) { + mSerialPort.read(&ack, 1); + } + + uint16_t idchip, idmanuf; + uint8_t data[4]; + + if (ack == SHELL_ACK) { + CLogger::info("Received stage 2 firmware ACK byte " + CLogger::decToHex(ack)); + CLogger::info("Skipping MCU initialization, NOT LOADING stage 2 firmware"); + + // Get IDCHIP and IDMANUF registers using Ident command for initialized MCU + CLogger::info("Getting IDMAUNF and IDCHIP registers of already initialized MCU"); + + mSerialPort.sendSafeByte(CMD_IDENTIFY); + mSerialPort.read(data, 4); + decodeIdentData(data, idchip, idmanuf); + + setMcuSpecificsById(idchip, idmanuf); + } else if (ack == BOOTSTRAP_ACK) { + // Ziskame identifikaciu a nahrame shell mcuSpecfics + CLogger::info("Received bootstrap loader ACK byte " + CLogger::decToHex(ack)); + + // Write the first stage loader + CLogger::info("Writing stage 1 firmware"); + mSerialPort.write(fw_stage_1, fw_stage_1_length, FW_1_MAX_LENGTH); + + // Get identification + CLogger::info("Getting IDMAUNF and IDCHIP registers"); + mSerialPort.write(fw_ident, fw_ident_length, FW_MAX_LENGTH); + mSerialPort.read(data, 4); + + decodeIdentData(data, idchip, idmanuf); + setMcuSpecificsById(idchip, idmanuf); + + // Load stage 2 firmware + CLogger::info("Writing stage 2 firmware"); + mSerialPort.write(mMcuSpecifics->getFirmware(), + mMcuSpecifics->getFirmwareLength(), FW_MAX_LENGTH); + // Wait for initialization end + uint16_t r = mSerialPort.readWord(); + if (r != 0x00) { + CLogger::error("Cannot initialize MCU: " + getMessageForRetCode(r), EXIT_MCU); + } + } else { + CLogger::error("Received unknown ack byte " + CLogger::decToHex(ack) + + ", expected " + CLogger::decToHex(BOOTSTRAP_ACK) + + " or " + CLogger::decToHex(SHELL_ACK), EXIT_MCU); + } +} + +void +CMcu::decodeIdentData(uint8_t data[4], uint16_t & idmanuf, uint16_t & idchip) +{ + idmanuf = 0; + idmanuf |= data[0]; + idmanuf |= (data[1]) << 8; + + idchip = 0; + idchip |= data[2]; + idchip |= (data[3]) << 8; +} + + +string +CMcu::getMessageForRetCode(uint16_t ret) +{ + string s; + + switch (ret) { + case RET_SERIAL_OVERRUN: + s = "MCU serial receiver buffer overrun, use lower serial speed"; + break; + case RET_BAD_ECHO: + s = "MCU received corrupted double word value"; + break; + default: + if (mMcuSpecifics == 0 || (s = mMcuSpecifics->getMessageForRetCode(ret)).empty()) + s = "Unknown MCU return code: " + CLogger::decToHex(ret); + break; + } + + return s; +} + +void +CMcu::setMcuSpecificsById(uint16_t idmanuf, uint16_t idchip) +{ + if (CMcuSt10f269::hasThisId(idmanuf, idchip)) { + CLogger::info("ST10F269 MCU found"); + mMcuSpecifics.reset(new CMcuSt10f269()); + } else if (CMcuSt10f168::hasThisId(idmanuf, idchip)) { + CLogger::info("ST10F168 MCU found"); + mMcuSpecifics.reset(new CMcuSt10f168()); + } else { + ostringstream os; + os << "Received unknown MCU identification registers values: "; + os << "IDMANUF=" << CLogger::decToHex(idmanuf); + os << " IDCHIP=" << CLogger::decToHex(idchip); + CLogger::error(os.str(), EXIT_MCU); + } +} + +// ----------------------------------------------------------------------------- +// Operacie +// ----------------------------------------------------------------------------- + +void +CMcu::sendShellCommand(uint8_t cmd) +{ + // Check needed frequency + if ((mMcuSpecifics->getName() != "ST10F168") && (mMcuFrequency > 0)) + CLogger::info("Ignoring -f option for this MCU"); + if ((mMcuSpecifics->getName() == "ST10F168") && (mMcuFrequency == 0)) + CLogger::error("Missing -f option for MCU " + mMcuSpecifics->getName(), EXIT_MCU); + + mSerialPort.sendSafeByte(cmd); + // Write configuration data + list d = mMcuSpecifics->getConfigData(mMcuFrequency); + list::const_iterator it; + for (it = d.begin(); it != d.end(); ++it) + mSerialPort.sendSafeWord(*it); +} + +string +CMcu::ident() +{ + return mMcuSpecifics->getName(); +} + +void +CMcu::erase() +{ + uint16_t r; + + sendShellCommand(CMD_ERASE_CHIP); + // Wait for return status of erase operation + mSerialPort.setReadTimeout(mMcuSpecifics->getEraseTimeout()); + r = mSerialPort.readWord(); + mSerialPort.setDefaultTimeout(); + + if (r != 0) + CLogger::error(getMessageForRetCode(r), EXIT_MCU); +} + +void +CMcu::erase(uint32_t startAddr, uint32_t endAddr) +{ + list bs = mMcuSpecifics->getBlockSizes(); + + // Block address space + typedef struct { + uint32_t a; + uint32_t b; + } range_t; + + unique_ptr ba(new(nothrow) range_t[bs.size()]); + + if (!ba) + CLogger::error("Cannot allocate memory", EXIT_MCU); + + list::const_iterator it; + unsigned int i; + uint32_t a = 0; + for (i = 0, it = bs.begin(); it != bs.end(); ++it, ++i) { + ba[i].a = a; + a = (*it * 1024); + ba[i].b = ba[i].a + a - 1; + a = ba[i].a + a; + } + + uint32_t lastValidAddr = mMcuSpecifics->getFlashSize() - 1; + + if (startAddr > lastValidAddr) { + ostringstream os; + os << "Start erase address " << startAddr << " is out of range [0," << lastValidAddr << "]"; + CLogger::error(os.str(), EXIT_MCU); + } + + if (endAddr > lastValidAddr) { + ostringstream os; + os << "End erase address " << endAddr << " is out of range [0," << lastValidAddr << "]"; + CLogger::error(os.str(), EXIT_MCU); + } + + if (startAddr > endAddr) { + ostringstream os; + os << "Start erase address " << startAddr << " is greater than end erase address " << endAddr; + CLogger::error(os.str(), EXIT_MCU); + } + + // Construct block list + list l; + // Find block containing startAddr + for (i = 0; i < bs.size(); ++i) { + if (startAddr >= ba[i].a && startAddr <= ba[i].b) + break; + } + // Find blocks up to the block containing endAddr + for ( ; i < bs.size(); ++i) { + l.push_back(i); + if (endAddr >= ba[i].a && endAddr <= ba[i].b) + break; + } + + // Erase blocks covering the range + erase(l); +} + +void +CMcu::erase(list blockList) +{ + // Construct mask + uint16_t mask = 0; + list::const_iterator it; + unsigned int bc = mMcuSpecifics->getBlockSizes().size(); + + for (it = blockList.begin(); it != blockList.end(); ++it) { + if (*it >= bc) { + ostringstream os; + os << "Block number " << *it << " is out of range [0," << (bc - 1) << "]"; + CLogger::error(os.str(), EXIT_MCU); + } + mask |= 1 << *it; + } + ostringstream os; + os << "Erasing blocks: "; + for (it = blockList.begin(); it != blockList.end(); ++it) { + if (it != blockList.begin()) + os << ","; + os << *it; + } + os << " (mask = " << CLogger::decToHex(mask) << ")"; + CLogger::info(os.str()); + + // Erase blocks + sendShellCommand(CMD_ERASE_BLOCKS); + mSerialPort.sendSafeWord(mask); + // Read status + mSerialPort.setReadTimeout(mMcuSpecifics->getEraseTimeout()); + uint16_t r = mSerialPort.readWord(); + + if (r != 0x00) + CLogger::error(getMessageForRetCode(r), EXIT_MCU); + + mSerialPort.setDefaultTimeout(); +} + +void +CMcu::write(vector data, bool printProgress) +{ + if ((data.size() < 1) || (data.size() > mMcuSpecifics->getFlashSize())) { + ostringstream os; + os << "Data length " << data.size() << " to write is not in range "; + os << "[1-" << mMcuSpecifics->getFlashSize() << "]"; + CLogger::error(os.str(), EXIT_MCU); + } + // Number of bytes to be written + uint32_t bw = ((data.size() % 2) == 1) ? data.size() + 1 : data.size(); + ostringstream os; + os << "Writing " << data.size() << " bytes"; + if (bw != data.size()) + os << " + 1 byte pad"; + CLogger::info(os.str()); + // Write command + sendShellCommand(CMD_WRITE); + // Write number of bytes to read + mSerialPort.sendSafeDoubleWord(bw); + // Write by 1024 blocks and read return status after each one + uint32_t i = 0; + + if (printProgress) + CLogger::progress(i, data.size()); + + while (i < bw) { + uint32_t s = ((bw - i) > 1024) ? 1024 : (bw - i); + if (((i + s) >= bw) && (bw != data.size())) { + // Going to write last block of size increased by pad + mSerialPort.write(data.data() + i, s - 1, s - 1); + uint8_t b = PAD_BYTE; + mSerialPort.write(&b, 1, 1); + } else { + mSerialPort.write(data.data() + i, s, s); + } + i += s; + + if (printProgress) + CLogger::progress(i, data.size()); + + // Read status + uint16_t r = mSerialPort.readWord(); + if (r == 0) { + // Read position + uint32_t u = mSerialPort.readDoubleWord(); + // Check position + if ((bw - u) != i) { + ostringstream os; + os << "Serial communication error: position status mismatch, expected " << i << ", have " << (bw - u); + CLogger::error(os.str(), EXIT_MCU); + } + } else { + CLogger::error(getMessageForRetCode(r), EXIT_MCU); + } + } +} + +vector +CMcu::read(bool printProgress) +{ + return read(mMcuSpecifics->getFlashSize(), printProgress); +} + +vector +CMcu::read(uint32_t size, bool printProgress) +{ + uint32_t r; + + if ((size < 1) || (size > mMcuSpecifics->getFlashSize())) { + ostringstream os; + os << "Data length " << size << " to read is outside address range "; + os << "[1-" << mMcuSpecifics->getFlashSize() << "]"; + CLogger::error(os.str(), EXIT_MCU); + } + + // Check if size is odd or even number + r = size; + if ((size % 2) == 1) + r++; + // Write command + sendShellCommand(CMD_READ); + // Write number of bytes to read + mSerialPort.sendSafeDoubleWord(r); + // Get data from FLASH memory by 1024 byte blocks + uint32_t i = 0; + if (printProgress) + CLogger::progress(i, size); + + vector data; + + while (i < r) { + uint32_t s = ((r - i) > 1024) ? 1024 : (r - i); + // Read data + data.resize(data.size() + s); + mSerialPort.read(data.data() + i , s); + i += s; + + if (printProgress) + CLogger::progress(i, size); + + // Read status + uint16_t t = mSerialPort.readWord(); + if (t == 0) { + // Read position + uint32_t u = mSerialPort.readDoubleWord(); + // Check position + if ((r - u) != i) { + ostringstream os; + os << "Serial communication error: position status mismatch"; + os << ", expected " << i << " has " << (r - u); + CLogger::error(os.str(), EXIT_MCU); + } + } else { + CLogger::error(getMessageForRetCode(r), EXIT_MCU); + } + } + + // Discard possible rounding/pad byte + data.resize(size); + return data; +} diff --git a/Mcu.hpp b/Mcu.hpp new file mode 100755 index 0000000..a05dafe --- /dev/null +++ b/Mcu.hpp @@ -0,0 +1,37 @@ +#ifndef MCU_HPP +#define MCU_HPP 1 + +#include "SerialPort.hpp" +#include "McuSpecifics.hpp" + +#include +#include +#include + +using std::vector; +using std::unique_ptr; + +class CMcu { +private: + CSerialPort & mSerialPort; + unique_ptr mMcuSpecifics; + float mMcuFrequency; + + void decodeIdentData(uint8_t data[4], uint16_t & idmanuf, uint16_t & idchip); + void setMcuSpecificsById(uint16_t idmanuf, uint16_t idchip); + string getMessageForRetCode(uint16_t ret); + void sendShellCommand(uint8_t cmd); + +public: + CMcu(CSerialPort & serialPort, float mcuFrequency); + + void erase(); + void erase(list blockList); + void erase(uint32_t startAddr, uint32_t endAddr); + void write(vector data, bool printProgress); + vector read(bool printProgress); + vector read(uint32_t size, bool printProgress); + string ident(); +}; + +#endif diff --git a/McuSpecifics.hpp b/McuSpecifics.hpp new file mode 100755 index 0000000..9dac153 --- /dev/null +++ b/McuSpecifics.hpp @@ -0,0 +1,26 @@ +#ifndef MCU_SPECIFICS_HPP +#define MCU_SPECIFICS_HPP 1 + +#include "SerialPort.hpp" +#include "McuSpecifics.hpp" + +#include +#include + +using std::list; + +class IMcuSpecifics { +public: + virtual ~IMcuSpecifics() {}; + + virtual string getName() = 0; + virtual uint8_t *getFirmware() = 0; + virtual int getFirmwareLength() = 0; + virtual const list getBlockSizes() = 0; + virtual uint32_t getFlashSize() = 0; + virtual int getEraseTimeout() = 0; + virtual string getMessageForRetCode(uint16_t ret) = 0; + virtual const list getConfigData(float mcuFrequency) = 0; +}; + +#endif diff --git a/McuSt10f168/CMakeLists.txt b/McuSt10f168/CMakeLists.txt new file mode 100755 index 0000000..786a909 --- /dev/null +++ b/McuSt10f168/CMakeLists.txt @@ -0,0 +1,26 @@ +# Path to firmware binary files for ST10F168 +set (FwSt10f168Prefix ${FwPrefix}) +set(FwSt10f168 + ${FwSt10f168Prefix}/st10f168/Objects/st10f168.bin + ) + +# Generate firmware header files +include_directories (${CMAKE_CURRENT_BINARY_DIR}) + +generate_headers_from_binaries ( + "$" + FwSt10f168 + "${FwSt10f168}" + "${CMAKE_CURRENT_BINARY_DIR}" + ) + +add_library (McuSt10f168 STATIC + McuSt10f168.cpp + ${CMAKE_CURRENT_BINARY_DIR}/fw_st10f168.hpp +) + +set_target_properties (McuSt10f168 PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS OFF +) diff --git a/McuSt10f168/McuSt10f168.cpp b/McuSt10f168/McuSt10f168.cpp new file mode 100755 index 0000000..6d60a21 --- /dev/null +++ b/McuSt10f168/McuSt10f168.cpp @@ -0,0 +1,173 @@ +#include "Logger.hpp" +#include "ExitCodes.hpp" +#include "McuSt10f168.hpp" +#include "fw_st10f168.hpp" + +#include + +using FwSt10f168::fw_st10f168; +using FwSt10f168::fw_st10f168_length; + +#define ST10F168_FLASH_SIZE (256 * 1024) +#define ST10F168_IDMANUF 0x0400 +#define ST10F168_IDCHIP 0x0A80 +#define ST10F168_ERASE_TIMEOUT 15000 // Ms +#define ST10F168_MIN_PERIOD 30 // ns +#define ST10F168_MAX_PERIOD 199 // ns +#define ST10F168_MAX_FREQ 25 // MHz + +using std::ostringstream; + +bool +CMcuSt10f168::hasThisId(uint16_t idmanuf, uint16_t idchip) +{ + // Mask out revision bits 3 - 0 from idchip value + return ((idmanuf == ST10F168_IDMANUF) + && ((idchip & 0xfff0) == ST10F168_IDCHIP)); +} + +CMcuSt10f168::CMcuSt10f168() +{ + mBlockSizes.push_back(16); + mBlockSizes.push_back(48); + mBlockSizes.push_back(96); + mBlockSizes.push_back(96); +} + +CMcuSt10f168::~CMcuSt10f168() +{ + ; +} + +string +CMcuSt10f168::getName() +{ + return string("ST10F168"); +} + +uint8_t * +CMcuSt10f168::getFirmware() +{ + return fw_st10f168; +} + +int +CMcuSt10f168::getFirmwareLength() +{ + return fw_st10f168_length; +} + +const list +CMcuSt10f168::getBlockSizes() +{ + return mBlockSizes; +} + +uint32_t +CMcuSt10f168::getFlashSize() +{ + return ST10F168_FLASH_SIZE; +} + +int +CMcuSt10f168::getEraseTimeout() +{ + return ST10F168_ERASE_TIMEOUT; +} + +string +CMcuSt10f168::getMessageForRetCode(uint16_t ret) +{ + string s; + + switch (ret) { + case 0x00: + s = "Operation was successful"; + break; + case 0x01: + s = "Flash Protection is active"; + break; + case 0x02: + s = "Vpp voltage not present"; + break; + case 0x03: + s = "Programming operation failed"; + break; + case 0x04: + s = "Address value (R1) incorrect; not in Flash address area or odd"; + break; + case 0x05: + s = "CPU period out of range (must be between 30 ns and 199 ns)"; + break; + case 0x06: + s = "Not enough free space on system stack for proper operation"; + break; + case 0x07: + s = "Incorrect bank number (R2,R3) specified"; + break; + case 0x08: + s = "Erase operation failed (phase 1)"; + break; + case 0x09: + s = "Bad source address for Multiple Word programming command"; + break; + case 0x0A: + s = "Bad number of words to be copied in Multiple Word programming command; one destination will be out of FLASH"; + break; + case 0x0B: + s = "PLL Unlocked or Oscilator watchdog overflow occured during programming or erasing the FLASH"; + break; + case 0x0C: + s = "Erase operation failed (phase 2)"; + break; + case 0x0D: + s = "MCU serial buffer overrun, use lower serial speed"; + break; + case 0xFF: + s = "Unknown or bad command"; + break; + default: + s = ""; + break; + } + + return s; +} + +const list +CMcuSt10f168::getConfigData(float mcuFrequency) +{ + list ret; + ret.push_back(get2TclConst(mcuFrequency)); + return ret; +} + +uint16_t +CMcuSt10f168::get2TclConst(float mcuFrequency) +{ + if (mcuFrequency > ST10F168_MAX_FREQ) { + ostringstream os; + os << "User-entered CPU frequency " << mcuFrequency << " MHz is outside range "; + os << "(0, " << ST10F168_MAX_FREQ << "]"; + CLogger::error(os.str(), EXIT_MCU); + } + uint16_t t = ((uint16_t) (1000.0 / mcuFrequency)) + 1; + if (t > 200) { + ostringstream os; + os << "For user-entered CPU frequency " << mcuFrequency << "MHz"; + os << " the period is " << t << " ns which is greater than maximal allowed "; + os << "period " << ST10F168_MAX_PERIOD << " ns. Setting period to "; + os << ST10F168_MAX_PERIOD << " ns"; + CLogger::warning(os.str()); + t = ST10F168_MAX_PERIOD; + } else if (t < 30) { + ostringstream os; + os << "For user-entered CPU frequency " << mcuFrequency << "MHz"; + os << " the period is " << t << " ns which is lower than minmal allowed "; + os << "period " << ST10F168_MIN_PERIOD << " ns. Setting period to "; + os << ST10F168_MIN_PERIOD << " ns"; + CLogger::warning(os.str()); + t = ST10F168_MIN_PERIOD; + } + return t; +} diff --git a/McuSt10f168/McuSt10f168.hpp b/McuSt10f168/McuSt10f168.hpp new file mode 100755 index 0000000..0f98620 --- /dev/null +++ b/McuSt10f168/McuSt10f168.hpp @@ -0,0 +1,27 @@ +#ifndef MCU_ST10F168_HPP +#define MCU_ST10F168_HPP + +#include "McuSpecifics.hpp" + +class CMcuSt10f168 : public IMcuSpecifics { +private: + list mBlockSizes; + + uint16_t get2TclConst(float mcuFrequency); +public: + static bool hasThisId(uint16_t idmanuf, uint16_t idchip); + + CMcuSt10f168(); + ~CMcuSt10f168(); + + string getName(); + uint8_t *getFirmware(); + int getFirmwareLength(); + const list getBlockSizes(); + uint32_t getFlashSize(); + int getEraseTimeout(); + string getMessageForRetCode(uint16_t ret); + const list getConfigData(float mcuFrequency); +}; + +#endif diff --git a/McuSt10f269/CMakeLists.txt b/McuSt10f269/CMakeLists.txt new file mode 100755 index 0000000..b67a62f --- /dev/null +++ b/McuSt10f269/CMakeLists.txt @@ -0,0 +1,26 @@ +# Path to firmware binary files for ST10F269 +set (FwSt10f269Prefix ${FwPrefix}) +set(FwSt10f269 + ${FwSt10f269Prefix}/st10f269/Objects/st10f269.bin + ) + +# Generate firmware header files +include_directories (${CMAKE_CURRENT_BINARY_DIR}) + +generate_headers_from_binaries ( + "$" + FwSt10f269 + "${FwSt10f269}" + "${CMAKE_CURRENT_BINARY_DIR}" +) + +add_library (McuSt10f269 STATIC + McuSt10f269.cpp + ${CMAKE_CURRENT_BINARY_DIR}/fw_st10f269.hpp +) + +set_target_properties (McuSt10f269 PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS OFF +) diff --git a/McuSt10f269/McuSt10f269.cpp b/McuSt10f269/McuSt10f269.cpp new file mode 100755 index 0000000..99c578d --- /dev/null +++ b/McuSt10f269/McuSt10f269.cpp @@ -0,0 +1,102 @@ +#include "Logger.hpp" +#include "McuSt10f269.hpp" +#include "fw_st10f269.hpp" + +using FwSt10f269::fw_st10f269; +using FwSt10f269::fw_st10f269_length; + +#define ST10F269_FLASH_SIZE (256 * 1024) +#define ST10F269_IDMANUF 0x0401 +#define ST10F269_IDCHIP 0x10D0 +#define ST10F269_ERASE_TIMEOUT 15000 // Ms + +#define RET_ERASE_ERROR 0x030 +#define RET_WRITE_ERROR 0x031 + +bool +CMcuSt10f269::hasThisId(uint16_t idmanuf, uint16_t idchip) +{ + // Mask out revision bits 3 - 0 from idchip value + return ((idmanuf == ST10F269_IDMANUF) + && ((idchip & 0xfff0) == ST10F269_IDCHIP)); +} + +CMcuSt10f269::CMcuSt10f269() +{ + mBlockSizes.push_back(16); + mBlockSizes.push_back(8); + mBlockSizes.push_back(8); + mBlockSizes.push_back(32); + mBlockSizes.push_back(64); + mBlockSizes.push_back(64); + mBlockSizes.push_back(64); +} + +CMcuSt10f269::~CMcuSt10f269() +{ + ; +} + +string +CMcuSt10f269::getName() +{ + return string("ST10F269"); +} + +uint8_t * +CMcuSt10f269::getFirmware() +{ + return fw_st10f269; +} + +int +CMcuSt10f269::getFirmwareLength() +{ + return fw_st10f269_length; +} + +const list +CMcuSt10f269::getBlockSizes() +{ + return mBlockSizes; +} + +uint32_t +CMcuSt10f269::getFlashSize() +{ + return ST10F269_FLASH_SIZE; +} + +int +CMcuSt10f269::getEraseTimeout() +{ + return ST10F269_ERASE_TIMEOUT; +} + +string +CMcuSt10f269::getMessageForRetCode(uint16_t ret) +{ + string s; + + switch (ret) { + case RET_ERASE_ERROR: + s = "Error while erasing memory"; + break; + case RET_WRITE_ERROR: + s = "Error while writing memory"; + break; + default: + s = ""; + break; + } + + return s; +} + +const list +CMcuSt10f269::getConfigData(float mcuFrequency) +{ + list ret; + ret.push_back(0x00); // Any byte value + return ret; +} diff --git a/McuSt10f269/McuSt10f269.hpp b/McuSt10f269/McuSt10f269.hpp new file mode 100755 index 0000000..01063d6 --- /dev/null +++ b/McuSt10f269/McuSt10f269.hpp @@ -0,0 +1,25 @@ +#ifndef MCU_ST10F269_HPP +#define MCU_ST10F269_HPP + +#include "McuSpecifics.hpp" + +class CMcuSt10f269 : public IMcuSpecifics { +private: + list mBlockSizes; +public: + static bool hasThisId(uint16_t idmanuf, uint16_t idchip); + + CMcuSt10f269(); + ~CMcuSt10f269(); + + string getName(); + uint8_t *getFirmware(); + int getFirmwareLength(); + const list getBlockSizes(); + uint32_t getFlashSize(); + int getEraseTimeout(); + string getMessageForRetCode(uint16_t ret); + const list getConfigData(float mcuFrequency); +}; + +#endif diff --git a/SerialPort/CMakeLists.txt b/SerialPort/CMakeLists.txt new file mode 100755 index 0000000..dc7aa6b --- /dev/null +++ b/SerialPort/CMakeLists.txt @@ -0,0 +1,19 @@ +if (WIN32) + add_library (SerialPort STATIC + SerialPortFactory.cpp + SerialPort.cpp + SerialPortWin32.cpp + ) +else() + add_library (SerialPort STATIC + SerialPortFactory.cpp + SerialPort.cpp + SerialPortUnix.cpp + ) +endif() + +set_target_properties (SerialPort PROPERTIES + CXX_STANDARD 11 + CXX_STANDARD_REQUIRED ON + CXX_EXTENSIONS OFF +) diff --git a/SerialPort/SerialPort.cpp b/SerialPort/SerialPort.cpp new file mode 100755 index 0000000..93e9d20 --- /dev/null +++ b/SerialPort/SerialPort.cpp @@ -0,0 +1,157 @@ +#include "SerialPort.hpp" +#include "Logger.hpp" +#include "ExitException.hpp" +#include "ExitCodes.hpp" +#include +#include + +using std::ostringstream; + +#define READ_DEFAULT_TIMEOUT 3000 // ms + +void +CSerialPort::writeWord(uint16_t w) +{ + uint8_t b; + + b = (w & 0xff); + this->write(&b, 1, 1); + + b = (w & 0xff00) >> 8; + this->write(&b, 1, 1); +} + +uint16_t +CSerialPort::readWord() +{ + uint8_t b; + uint16_t w; + + w = 0; + + this->read(&b, 1); + w |= ((uint16_t) b); + + this->read(&b, 1); + w |= ((uint16_t) b) << 8; + + return w; +} + +uint32_t +CSerialPort::readDoubleWord() +{ + uint8_t b; + uint32_t dw; + + dw = 0; + + this->read(&b, 1); + dw |= ((uint32_t) b); + + this->read(&b, 1); + dw |= ((uint32_t) b) << 8; + + this->read(&b, 1); + dw |= ((uint32_t) b) << 16; + + this->read(&b, 1); + dw |= ((uint32_t) b) << 24; + + return dw; +} + +void +CSerialPort::setReadTimeout(int timetout) +{ + mReadTimeoutMs = timetout; +} + +void +CSerialPort::setDefaultTimeout() +{ + mReadTimeoutMs = READ_DEFAULT_TIMEOUT; +} + +void +CSerialPort::write(uint8_t *data, int data_length, int padd_to) +{ + // Write data + for (int i = 0; i < data_length; ) + i += writeSingle(data, data_length); + // Write pad + // TODO: odkial brat hodnotu pad byte?? + uint8_t p[512]; + memset(p, 0xFF, 512); + + for (padd_to -= data_length; padd_to > 0; ) { + int w = 512; + if (padd_to < 512) + w = padd_to; + padd_to -= writeSingle(p, w); + } +} + +void +CSerialPort::read(uint8_t *data, int data_length) +{ + for (int i = 0; i < data_length; ) { + int old_i = i; + i += readSingle(data + i, data_length - i); + // TODO: pre Win32, pretoze tam nedetekujeme timeout a moze vracat 0 bajtov precitanych + if (i == old_i) { + CLogger::error("Timeout occured while reading data from serial port", EXIT_SERIAL_PORT); + } + } +} + +void +CSerialPort::sendSafeByte(uint8_t b) +{ + uint8_t r; + + this->write(&b, 1, 1); + this->read(&r, 1); + if (r != b) { + ostringstream os; + os << "Bad echo when sending byte safely, expected " << CLogger::decToHex(b); + os << " received " << CLogger::decToHex(r); + CLogger::error(os.str(), EXIT_SERIAL_PORT); + } + this->write(&b, 1, 1); + this->read(&r, 1); + if (r != 0x00) { + ostringstream os; + os << "Cannot send byte safely, expected 0x00 received " << CLogger::decToHex(r); + CLogger::error(os.str(), EXIT_SERIAL_PORT); + } +} + +void +CSerialPort::sendSafeWord(uint16_t w) +{ + this->writeWord(w); + uint16_t r = this->readWord(); + if (r != w) { + ostringstream os; + os << "Bad echo when sending word safely, expected " << CLogger::decToHex(w); + os << " received " << CLogger::decToHex(r); + CLogger::error(os.str(), EXIT_SERIAL_PORT); + } + this->writeWord(w); + r = this->readWord(); + if (r != 0x00) { + ostringstream os; + os << "Cannot send word safely, expected 0x0000 received " << CLogger::decToHex(r); + CLogger::error(os.str(), EXIT_SERIAL_PORT); + } +} + +void +CSerialPort::sendSafeDoubleWord(uint32_t w) +{ + // Send low word + sendSafeWord(w & 0x0000FFFF); + // Send high word + sendSafeWord((w & 0xFFFF0000) >> 16); +} diff --git a/SerialPort/SerialPort.hpp b/SerialPort/SerialPort.hpp new file mode 100755 index 0000000..90bb87f --- /dev/null +++ b/SerialPort/SerialPort.hpp @@ -0,0 +1,37 @@ +#ifndef SERIAL_PORT_H +#define SERIAL_PORT_H 1 + +#include +#include + +using std::string; + +class CSerialPort { +protected: + int mReadTimeoutMs; // Miliseconds + + virtual ssize_t readSingle(uint8_t *data, int data_length) = 0; + virtual ssize_t writeSingle(uint8_t *data, int data_length) = 0; +public: + virtual ~CSerialPort() { ; }; + + virtual void open(string portName, string speed) = 0; + virtual string getSpeeds(string portName) = 0; + + virtual void close() = 0; + + void setReadTimeout(int ms); + void setDefaultTimeout(); + + void writeWord(uint16_t w); + uint16_t readWord(); + uint32_t readDoubleWord(); + void read(uint8_t *data, int data_length); + void write(uint8_t *data, int data_length, int padd); + void sendSafeByte(uint8_t b); + void sendSafeWord(uint16_t w); + void sendSafeDoubleWord(uint32_t w); + +}; + +#endif diff --git a/SerialPort/SerialPortFactory.cpp b/SerialPort/SerialPortFactory.cpp new file mode 100755 index 0000000..a7e8e9f --- /dev/null +++ b/SerialPort/SerialPortFactory.cpp @@ -0,0 +1,21 @@ +#include "SerialPortFactory.hpp" + +#ifdef WIN32 +#include "SerialPortWin32.hpp" +#else +#include "SerialPortUnix.hpp" +#endif + +std::unique_ptr +CSerialPortFactory::getSerialPort() +{ + std::unique_ptr sp; + +#ifdef WIN32 + sp.reset(new CSerialPortWin32()); +#else + sp.reset(new CSerialPortUnix()); +#endif + + return sp; +} diff --git a/SerialPort/SerialPortFactory.hpp b/SerialPort/SerialPortFactory.hpp new file mode 100755 index 0000000..7cecc8c --- /dev/null +++ b/SerialPort/SerialPortFactory.hpp @@ -0,0 +1,13 @@ +#ifndef SERIAL_PORT_FACTORY_HPP +#define SERIAL_PORT_FACTORY_HPP 1 + +#include + +#include "SerialPort.hpp" + +class CSerialPortFactory { +public: + std::unique_ptr getSerialPort(); +}; + +#endif diff --git a/SerialPort/SerialPortUnix.cpp b/SerialPort/SerialPortUnix.cpp new file mode 100755 index 0000000..20fba2e --- /dev/null +++ b/SerialPort/SerialPortUnix.cpp @@ -0,0 +1,285 @@ +#include +#include /* String function definitions */ +#include /* UNIX standard function definitions */ +#include /* File control definitions */ +#include /* Error number definitions */ +#include +#include +#include + +#include +#include +#include + +using std::ostringstream; +using std::endl; +using std::setw; +using std::right; + +#include "ExitCodes.hpp" +#include "SerialPortUnix.hpp" +#include "Logger.hpp" +#include "ExitException.hpp" + +#define DEFAULT_SERIAL_SPEED "19200" + +CSerialPortUnix::CSerialPortUnix() +{ + mSerialPortFd = -1; + mPortName = ""; + // Construct vector of available system baudrates +#ifdef B50 + mBaudrates.push_back(pair("50", B50)); +#endif +#ifdef B75 + mBaudrates.push_back(pair("75", B75)); +#endif +#ifdef B110 + mBaudrates.push_back(pair("110", B110)); +#endif +#ifdef B134 + mBaudrates.push_back(pair("134", B134)); +#endif +#ifdef B150 + mBaudrates.push_back(pair("150", B150)); +#endif +#ifdef B200 + mBaudrates.push_back(pair("200", B200)); +#endif +#ifdef B300 + mBaudrates.push_back(pair("300", B300)); +#endif +#ifdef B600 + mBaudrates.push_back(pair("600", B600)); +#endif +#ifdef B1200 + mBaudrates.push_back(pair("1200", B1200)); +#endif +#ifdef B1800 + mBaudrates.push_back(pair("1800", B1800)); +#endif +#ifdef B2400 + mBaudrates.push_back(pair("2400", B2400)); +#endif +#ifdef B4800 + mBaudrates.push_back(pair("4800", B4800)); +#endif +#ifdef B9600 + mBaudrates.push_back(pair("9600", B9600)); +#endif +#ifdef B19200 + mBaudrates.push_back(pair("19200", B19200)); +#endif +#ifdef B38400 + mBaudrates.push_back(pair("38400", B38400)); +#endif +#ifdef B57600 + mBaudrates.push_back(pair("57600", B57600)); +#endif +#ifdef B115200 + mBaudrates.push_back(pair("115200", B115200)); +#endif +#ifdef B230400 + mBaudrates.push_back(pair("230400", B230400)); +#endif +} + +CSerialPortUnix::~CSerialPortUnix() +{ + ; +} + +void +CSerialPortUnix::openPort(string portName) +{ + if (mSerialPortFd == -1) { + mSerialPortFd = ::open(portName.c_str(), O_RDWR | O_NOCTTY | O_NDELAY); + if (mSerialPortFd == -1) + CLogger::error("Cannot open serial port " + portName, EXIT_SERIAL_PORT); + mPortName = portName; + } +} + +void +CSerialPortUnix::open(string portName, string speed) +{ + this->setDefaultTimeout(); + + openPort(portName); + // Set parameters of serial communication + pair s = findSpeed(speed, getDeviceSpeeds()); + setSpeed(s); + + struct termios options; + + tcgetattr(mSerialPortFd, &options); + // Control options + options.c_cflag |= (CLOCAL | CREAD); + options.c_cflag &= ~PARENB; + options.c_cflag &= ~CSTOPB; + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS8; + // Turn off hardware flow controll + options.c_cflag &= ~CRTSCTS; + // Input Options - Turn off software flow controll, and CR <-> LF mapping + options.c_iflag &= ~(IXON | IXOFF | IXANY | INLCR | ICRNL); + // Line options - Raw input + options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); + // Raw output + options.c_oflag &= ~OPOST; + tcsetattr(mSerialPortFd, TCSANOW, &options); + // Blocking read + fcntl(mSerialPortFd, F_SETFL, 0); + + CLogger::info("Serial port " + mPortName + " opened at speed " + s.first + " Bd"); +} + +void +CSerialPortUnix::close() +{ + // Close only valid descriptor + if (mSerialPortFd != -1) { + if (::close(mSerialPortFd) == -1) + CLogger::error("Cannot close serial port", EXIT_SERIAL_PORT); + mSerialPortFd = -1; + mPortName = ""; + } +} + +vector> +CSerialPortUnix::getDeviceSpeeds() +{ + vector> ds; + vector>::const_iterator it; + + // Test which baudrates are supported by underlying device + for (it = mBaudrates.begin(); it != mBaudrates.end(); ++it) { + // Try to set the baudrate + struct termios options; + + if (tcgetattr(mSerialPortFd, &options) != 0) + CLogger::error("Cannot get attributes of serial port " + mPortName, EXIT_SERIAL_PORT); + + if (!cfsetispeed(&options, it->second) + && !cfsetospeed(&options, it->second) + && !tcsetattr(mSerialPortFd, TCSANOW, &options)) { + ds.push_back(*it); + } + } + + return ds; +} + +string +CSerialPortUnix::getSpeeds(string portName) +{ + ostringstream os; + int c; + vector> s; + vector>::const_iterator it; + + openPort(portName); + s = getDeviceSpeeds(); + for (c = 0, it = s.begin(); it != s.end(); ++c, ++it) + os << setw(7) << right << it->first << " Bd" << endl; + // Close serial port + close(); + + if (c == 0) + CLogger::error("Serial port device does not support any baudrates", EXIT_SERIAL_PORT); + + return os.str(); +} + +pair +CSerialPortUnix::findSpeed(string speed, const vector> & list) +{ + vector>::const_iterator it; + vector>::const_iterator defit; + bool foundDef = false; + + for (it = list.begin(); it != list.end(); ++it) { + if (!(it->first).compare(speed)) + return *it; // Exact match + else if (!(it->first).compare(DEFAULT_SERIAL_SPEED)) { + defit = it; // We have found default serial speed + foundDef = true; + } + } + + if (foundDef) + // We have not found exact speed and default speed. Choose + // highest supported. + return *defit; + + return *(it - 1); +} + +void +CSerialPortUnix::setSpeed(pair speed) +{ + struct termios options; + + if (tcgetattr(mSerialPortFd, &options) + || cfsetispeed(&options, speed.second) + || cfsetospeed(&options, speed.second) + || tcsetattr(mSerialPortFd, TCSANOW, &options)) { + CLogger::error("Cannot set serial speed: " + speed.first + ": " + strerror(errno), EXIT_SERIAL_PORT); + } +} + + +ssize_t +CSerialPortUnix::writeSingle(uint8_t *data, int data_length) +{ + ssize_t r = ::write(mSerialPortFd, data, data_length); + + if (r <= 0) { + ostringstream os; + os << "Cannot write to serial port"; + if (r < 0) + os << ": " << string(strerror(errno)); + CLogger::error(os.str(), EXIT_SERIAL_PORT); + } + + return r; +} + +ssize_t +CSerialPortUnix::readSingle(uint8_t *data, int data_length) +{ + ssize_t r = 0; + int s; + fd_set read_fds, write_fds, except_fds; + struct timeval timeout; + + // Renew file descriptor sets + FD_ZERO(&read_fds); + FD_ZERO(&write_fds); + FD_ZERO(&except_fds); + FD_SET(mSerialPortFd, &read_fds); + // Set timeout + timeout.tv_sec = mReadTimeoutMs / 1000; + timeout.tv_usec = 0; + // Wait for event + s = select(mSerialPortFd + 1, &read_fds, &write_fds, &except_fds, &timeout); + if (s == 1) { + // One descriptor changed, ready to read + r = ::read(mSerialPortFd, data, data_length); + } else if (s == 0) { + // Timeout occured + CLogger::error("Timeout occured while reading data from serial port", EXIT_SERIAL_PORT); + } + + if ((s < 0) || (r <= 0)) { + // Error occured in select or read + ostringstream os; + os << "Cannot read from serial port"; + if (r < 0) { + os << ": " << strerror(errno); + CLogger::error(os.str(), EXIT_SERIAL_PORT); + } + } + + return r; +} diff --git a/SerialPort/SerialPortUnix.hpp b/SerialPort/SerialPortUnix.hpp new file mode 100755 index 0000000..db1ae73 --- /dev/null +++ b/SerialPort/SerialPortUnix.hpp @@ -0,0 +1,35 @@ +#ifndef SERIAL_PORT_UNIX_H +#define SERIAL_PORT_UNIX_H 1 + +#include + +#include +#include "SerialPort.hpp" + +using std::vector; +using std::pair; + +class CSerialPortUnix : public CSerialPort { +private: + int mSerialPortFd; + string mPortName; + vector< pair > mBaudrates; + + vector> getDeviceSpeeds(); + pair findSpeed(string speed, const vector> & list); + void setSpeed(pair speed); + void openPort(string portName); + + ssize_t readSingle(uint8_t *data, int data_length); + ssize_t writeSingle(uint8_t *data, int data_length); +public: + CSerialPortUnix(); + ~CSerialPortUnix(); + + void open(string portName, string speed); + string getSpeeds(string portName); + + void close(); +}; + +#endif diff --git a/SerialPort/SerialPortWin32.cpp b/SerialPort/SerialPortWin32.cpp new file mode 100755 index 0000000..15316d2 --- /dev/null +++ b/SerialPort/SerialPortWin32.cpp @@ -0,0 +1,238 @@ +#include +#include + +#include "ExitCodes.hpp" +#include "SerialPortWin32.hpp" +#include "Logger.hpp" + +using std::ostringstream; +using std::istringstream; + +//Returns the last Win32 error, in string format. Returns an empty string if there is no error. +string +CSerialPortWin32::getLastErrorAsString() +{ + DWORD e = GetLastError(); + if (e == 0) + return string(); + + LPSTR msgBuff = nullptr; + size_t size = FormatMessageA( + FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + e, + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR) &msgBuff, + 0, + NULL); + + string m(msgBuff, size); + + LocalFree(msgBuff); + + return m; +} + + + + +CSerialPortWin32::CSerialPortWin32() +{ + mSerialPortH = INVALID_HANDLE_VALUE; + + mMaxBaudrates.push_back(s_speed("User defined", BAUD_USER, 0)); + mMaxBaudrates.push_back(s_speed("75", BAUD_075, 75)); + mMaxBaudrates.push_back(s_speed("110", BAUD_110, 110)); + mMaxBaudrates.push_back(s_speed("134.5", BAUD_134_5, 134)); + mMaxBaudrates.push_back(s_speed("150", BAUD_150, 150)); + mMaxBaudrates.push_back(s_speed("300", BAUD_300, 300)); + mMaxBaudrates.push_back(s_speed("600", BAUD_600, 600)); + mMaxBaudrates.push_back(s_speed("1200", BAUD_1200, 1200)); + mMaxBaudrates.push_back(s_speed("1800", BAUD_1800, 1800)); + mMaxBaudrates.push_back(s_speed("2400", BAUD_2400, 2400)); + mMaxBaudrates.push_back(s_speed("4800", BAUD_4800, 4800)); + mMaxBaudrates.push_back(s_speed("7200", BAUD_7200, 7200)); + mMaxBaudrates.push_back(s_speed("9600", BAUD_9600, 9600)); + mMaxBaudrates.push_back(s_speed("14400", BAUD_14400, 14400)); + mMaxBaudrates.push_back(s_speed("19200", BAUD_19200, 19200)); + mMaxBaudrates.push_back(s_speed("38400", BAUD_38400, 38400)); + mMaxBaudrates.push_back(s_speed("56000", BAUD_56K, 56000)); + mMaxBaudrates.push_back(s_speed("57600", BAUD_57600, 576000)); + mMaxBaudrates.push_back(s_speed("115200", BAUD_115200, 115200)); + mMaxBaudrates.push_back(s_speed("128000", BAUD_128K, 128000)); +} + +CSerialPortWin32::~CSerialPortWin32() +{ + ; +} + +void +CSerialPortWin32::openPort(string portName) +{ + if (mSerialPortH == INVALID_HANDLE_VALUE) { + // Construct Windows serial port name + ostringstream sn; + sn << "\\\\.\\" << portName; + // Open serial port + mSerialPortH = CreateFile(sn.str().c_str(), // Port name + GENERIC_READ | GENERIC_WRITE, // Read/Write + 0, // No Sharing + NULL, // No Security + OPEN_EXISTING,// Open existing port only + 0, // Non Overlapped I/O + NULL); // Null for Comm Devices + + if (mSerialPortH == INVALID_HANDLE_VALUE) { + CLogger::error("Cannot open port " + portName + ": " + getLastErrorAsString(), + EXIT_SERIAL_PORT); + } + } +} + +void +CSerialPortWin32::open(string portName, string speed) +{ + this->setDefaultTimeout(); + + openPort(portName); + + DWORD ms = getMaxSpeed(portName).value; + + // Konfiguracia + DCB dcbSerialParams = { 0 }; + dcbSerialParams.DCBlength = sizeof(dcbSerialParams); + + if (GetCommState(mSerialPortH, &dcbSerialParams) == 0) { + CLogger::error("Cannot get state for port " + portName + ": " + getLastErrorAsString(), + EXIT_SERIAL_PORT); + } + // Set speed + istringstream is(speed); + DWORD n; + is >> n; + if (n == 0) { + // User has requested default baudrate + n = ((ms == 0) || (19200 <= ms)) ? 19200 : ms; + } else if ((ms != 0) && (n > ms)) { + ostringstream os; + os << "Baudrate " << n << " Bd is higher than max. baudrate " << ms << " Bd supported by " << portName; + CLogger::error(os.str(), EXIT_SERIAL_PORT); + } + + dcbSerialParams.BaudRate = n; + dcbSerialParams.ByteSize = 8; // Setting ByteSize = 8 + dcbSerialParams.StopBits = ONESTOPBIT;// Setting StopBits = 1 + dcbSerialParams.Parity = NOPARITY; // Setting Parity = None + + if (SetCommState(mSerialPortH, &dcbSerialParams) == 0) { + CLogger::error("Cannot set state for port " + portName + ": " + getLastErrorAsString(), + EXIT_SERIAL_PORT); + } + + ostringstream os; + os << n; + CLogger::info("Serial port " + portName + " opened at speed " + os.str() + " Bd"); +} + +CSerialPortWin32::s_speed +CSerialPortWin32::getMaxSpeed(string portName) +{ + COMMPROP cp; + + if (GetCommProperties(mSerialPortH, &cp) == 0) { + CLogger::error("Cannot get properties of " + portName + " port: " + getLastErrorAsString(), + EXIT_SERIAL_PORT); + } + + // Convert key to baudrate value + list::const_iterator it; + + for (it = mMaxBaudrates.begin(); it != mMaxBaudrates.end(); ++it) { + if (it->key == cp.dwMaxBaud) + break; + } + + return *it; +} + +string +CSerialPortWin32::getSpeeds(string portName) +{ + openPort(portName); + + s_speed m = getMaxSpeed(portName); + + ostringstream os; + os << "User defined baudrate"; + if (m.key != BAUD_USER) + os << " up to the " << m.name << " Bd"; + + close(); + return os.str(); +} + +void +CSerialPortWin32::close() +{ + if (mSerialPortH != INVALID_HANDLE_VALUE) { + if (CloseHandle(mSerialPortH) == 0) { + CLogger::error("Cannot close serial port: " + getLastErrorAsString(), + EXIT_SERIAL_PORT); + } + mSerialPortH = INVALID_HANDLE_VALUE; + } +} + +void +CSerialPortWin32::setTimeouts(int ms) +{ + COMMTIMEOUTS timeouts; + + if (!GetCommTimeouts(mSerialPortH, &timeouts)) { + CLogger::error("Cannot get timeouts for serial port: " + getLastErrorAsString(), + EXIT_SERIAL_PORT); + } + + timeouts.ReadIntervalTimeout = ms; + timeouts.ReadTotalTimeoutMultiplier = ms; + timeouts.ReadTotalTimeoutConstant = 0; + + timeouts.WriteTotalTimeoutMultiplier = ms; + timeouts.WriteTotalTimeoutConstant = 0; + + if (!SetCommTimeouts(mSerialPortH, &timeouts)) { + CLogger::error("Cannot set timeouts for port: " + getLastErrorAsString(), + EXIT_SERIAL_PORT); + } +} + +ssize_t +CSerialPortWin32::writeSingle(uint8_t *data, int data_length) +{ + DWORD written = 0; + + setTimeouts(mReadTimeoutMs); + // TODO: Rozlisovat medzi timeoutom a chybou + if (!WriteFile(mSerialPortH, data, data_length, &written, NULL)) { + CLogger::error("Cannot write data to the serial port: " + getLastErrorAsString(), + EXIT_SERIAL_PORT); + } + + return written; +} + +ssize_t +CSerialPortWin32::readSingle(uint8_t *data, int data_length) +{ + DWORD read; + + setTimeouts(mReadTimeoutMs); + + if (!ReadFile(mSerialPortH, data, data_length, &read, NULL)) { + CLogger::error("Cannot read data from serial port: " + getLastErrorAsString(), + EXIT_SERIAL_PORT); + } + + return read; +} diff --git a/SerialPort/SerialPortWin32.hpp b/SerialPort/SerialPortWin32.hpp new file mode 100755 index 0000000..2cba0f7 --- /dev/null +++ b/SerialPort/SerialPortWin32.hpp @@ -0,0 +1,49 @@ +#ifndef SERIAL_PORT_WIN32_H +#define SERIAL_PORT_WIN32_H 1 + +#include +#include +#include "SerialPort.hpp" + +using std::pair; +using std::list; + +class CSerialPortWin32 : public CSerialPort { +private: + HANDLE mSerialPortH; + + struct s_speed { + string name; + DWORD key; + DWORD value; + + s_speed(string n, DWORD k, DWORD v) { + name = n; + key = k; + value = v; + } + }; + + list mMaxBaudrates; + + + void openPort(string portName); + s_speed getMaxSpeed(string portName); + void setTimeouts(int ms); + string getLastErrorAsString(); + + ssize_t readSingle(uint8_t *data, int data_length); + ssize_t writeSingle(uint8_t *data, int data_length); +public: + CSerialPortWin32(); + ~CSerialPortWin32(); + + void open(string portName, string speed); + string getSpeeds(string portName); + + void close(); + void write(uint8_t *data, int data_length, int padd_to); + void read(uint8_t *data, int data_length); +}; + +#endif diff --git a/UserConfig.cpp b/UserConfig.cpp new file mode 100755 index 0000000..dbfa88e --- /dev/null +++ b/UserConfig.cpp @@ -0,0 +1,375 @@ +#include +#include +#include "ExitCodes.hpp" +#include "UserConfig.hpp" +#include "Logger.hpp" +#include "help_message.hpp" + +using std::ostringstream; +using std::istringstream; +using std::endl; +using std::noskipws; + + +#define OPERATION_SPEEDS "speeds" +#define OPERATION_ERASE "erase" +#define OPERATION_READ "read" +#define OPERATION_WRITE "write" +#define OPERATION_HELP "help" +#define OPERATION_VERSION "version" +#define OPERATION_IDENT "ident" + + +// Common options +#define OPTION_SERIAL_PORT "-p" +#define OPTION_VERBOSE_MODE "-v" +#define OPTION_SERIAL_SPEED "-s" +#define OPTION_FREQUENCY "-f" +#define OPTION_PRINT_PROGRESS "-g" +// Options specific for an operation +#define OPTION_B "-b" +#define OPTION_C "-c" +#define OPTION_E "-e" +#define OPTION_N "-n" + + +CUserConfig::CUserConfig(int argc, char **argv) +{ + mSerialPortName = DEFAULT_SERIAL_PORT_NAME; + mSerialSpeed = "0"; // Default serial speed for given device + mVerboseMode = false; + mSpeeds = false; + mHelp = false; + mVersion = false; + mIdent = false; + mErase = false; + mRead = false; + mReadOutputFilename = ""; + mReadLength = -1; + mWrite = false; + mWriteInputFilename = ""; + mWriteEraseWholeMemory = false; + mWriteCheckByRead = false; + mMcuFrequency = 0; + mPrintProgress = false; + + vector args; + + for (int i = 1; i < argc; ++i) + args.push_back(argv[i]); + + parseCommandLine(args); +} + +const string +CUserConfig::getHelpMessage(const string & execName) const +{ + return HelpMessage::getText(execName); +} + +void +CUserConfig::parseCommandLine(vector & args) +{ + // Process options common for all operations. Create custom + // argument vector without processed common options. + vector::iterator it = args.begin(); + // Skip operation name from processing + if (it != args.end()) + ++it; + // Start at the second argument, first is the name of an + // operation. + while (it != args.end()) { + string a = *it; + bool processed = false; + bool with_argument = false; + + if (!a.compare(OPTION_SERIAL_PORT)) { + mSerialPortName = getArgument(it, args.end()); + processed = true; + with_argument = true; + } else if (!a.compare(OPTION_SERIAL_SPEED)) { + mSerialSpeed = getArgument(it, args.end()); + processed = true; + with_argument = true; + } else if (!a.compare(OPTION_VERBOSE_MODE)) { + mVerboseMode = true; + processed = true; + } else if (!a.compare(OPTION_PRINT_PROGRESS)) { + mPrintProgress = true; + processed = true; + } else if (!a.compare(OPTION_FREQUENCY)) { + istringstream is(getArgument(it, args.end())); + string s = is.str(); + float f; + is >> noskipws >> f; + bool a = (is.fail() || (f <= 0)); + bool b = (is.peek() != EOF); + if (a || b) { + ostringstream os; + os << "Argument for -f option '" << s << "' is not a positive real number"; + CLogger::error(os.str(), EXIT_USER_CONFIG); + } + mMcuFrequency = f; + processed = true; + with_argument = true; + } + + if (processed) { + it = args.erase(it); + if (with_argument) // Urcite bude platne, to mame osetrene getArgument() + it = args.erase(it); + } else { + ++it; + } + } + + it = args.begin(); + if (it != args.end()) { + it = args.begin(); + // Resolve operation name + string a = *it; + + if (!a.compare(OPERATION_SPEEDS)) { + mSpeeds = true; + } else if (!a.compare(OPERATION_ERASE)) { + mErase = true; + parseEraseArguments(++it, args.end()); + } else if (!a.compare(OPERATION_READ)) { + mRead = true; + parseReadArguments(++it, args.end()); + } else if (!a.compare(OPERATION_WRITE)) { + mWrite = true; + parseWriteArguments(++it, args.end()); + } else if (!a.compare(OPERATION_HELP)) { + mHelp = true; + } else if (!a.compare(OPERATION_VERSION)) { + mVersion = true; + } else if (!a.compare(OPERATION_IDENT)) { + mIdent = true; + } else { + CLogger::error("Unknown operation requested: " + a, EXIT_USER_CONFIG); + } + } +} + +void +CUserConfig::parseEraseArguments(vector::const_iterator args, + vector::const_iterator end) +{ + while (args != end) { + string a = *args; + if (!a.compare(OPTION_B)) { + // Prepend comma for unified parsing + istringstream is("," + getArgument(args, end)); + // Parse block numbers list + bool e = false; + for (;;) { + // Get comma + int c = is.get(); + if (is.eof()) { + break; + } else if (c != ',') { + e = true; + break; + } + // Get number + int n; + is >> n; + if (is.fail()) { + e = true; + break; + } + mEraseBlockList.push_back(n); + } + if (e || mEraseBlockList.size() == 0) + CLogger::error("Argument for -b option must be in format N[,N]...", EXIT_USER_CONFIG); + ++args; + ++args; + } else { + string s = *args; + CLogger::error("Unknown argument '" + s + "' for erase operation", EXIT_USER_CONFIG); + } + } +} + +void +CUserConfig::parseReadArguments(vector::const_iterator args, + vector::const_iterator end) +{ + while (args != end) { + string a = *args; + if (!a.compare(OPTION_N)) { + istringstream n(getArgument(args, end)); + string s = n.str(); + n >> noskipws >> mReadLength; + bool a = (n.fail() || (mReadLength < 0)); + bool b = (n.peek() != EOF); + if (a || b) { + ostringstream os; + os << "Argument for -n option '" << s << "' is not 0 or a positive number"; + CLogger::error(os.str(), EXIT_USER_CONFIG); + } + ++args; + ++args; + } else { + // First occurence of this is the name of output file + if (mReadOutputFilename.length() == 0) { + mReadOutputFilename = a; + ++args; + } else { + string s = *args; + CLogger::error("Unknown argument '" + s + "' for read operation", EXIT_USER_CONFIG); + } + } + } + // Must have at least filename where to write output + if (mReadOutputFilename.length() == 0) + CLogger::error("Missing output filename for read operation", EXIT_USER_CONFIG); +} + +void +CUserConfig::parseWriteArguments(vector::const_iterator args, + vector::const_iterator end) +{ + while (args != end) { + string a = *args; + if (!a.compare(OPTION_E)) { + mWriteEraseWholeMemory = true; + ++args; + } else if (!a.compare(OPTION_C)) { + mWriteCheckByRead = true; + ++args; + } else { + // First occurence of this is the name of output file + if (mWriteInputFilename.length() == 0) { + mWriteInputFilename = a; + ++args; + } else { + string s = *args; + CLogger::error("Unknown argument '" + s + "' for write operation", EXIT_USER_CONFIG); + } + } + } + // Must have at least filename where to write output + if (mWriteInputFilename.length() == 0) + CLogger::error("Missing input filename for write operation", EXIT_USER_CONFIG); +} + +string +CUserConfig::getArgument(vector::const_iterator args, + vector::const_iterator end) +{ + if (++args == end) { + string s(*(--args)); + CLogger::error("Missing argument for option '" + s + "'", EXIT_USER_CONFIG); + } + return string(*args); +} + +bool +CUserConfig::isEraseSet() +{ + return mErase; +} + +list +CUserConfig::getEraseBlockList() +{ + return mEraseBlockList; +} + +bool +CUserConfig::isReadSet() +{ + return mRead; +} + +bool +CUserConfig::isWriteSet() +{ + return mWrite; +} + +bool +CUserConfig::isVerboseModeSet() +{ + return mVerboseMode; +} + +bool +CUserConfig::isPrintProgressSet() +{ + return mPrintProgress; +} + +bool +CUserConfig::isHelpSet() +{ + return mHelp; +} + +bool +CUserConfig::isVersionSet() +{ + return mVersion; +} + +bool +CUserConfig::isIdentSet() +{ + return mIdent; +} + +string & +CUserConfig::getSerialPortName() +{ + return mSerialPortName; +} + +string & +CUserConfig::getSerialSpeed() +{ + return mSerialSpeed; +} + +string & +CUserConfig::getReadOutputFname() +{ + return mReadOutputFilename; +} + +string & +CUserConfig::getWriteInputFname() +{ + return mWriteInputFilename; +} + +int +CUserConfig::getReadLength() +{ + return mReadLength; +} + +bool +CUserConfig::getWriteEraseWholeMemory() +{ + return mWriteEraseWholeMemory; +} + +bool +CUserConfig::getWriteCheckByRead() +{ + return mWriteCheckByRead; +} + +bool +CUserConfig::isSpeedsSet() +{ + return mSpeeds; +} + +float +CUserConfig::getMcuFrequency() +{ + return mMcuFrequency; +} diff --git a/UserConfig.hpp b/UserConfig.hpp new file mode 100755 index 0000000..4d3d6b3 --- /dev/null +++ b/UserConfig.hpp @@ -0,0 +1,67 @@ +#ifndef USER_CONFIG_HPP +#define USER_CONFIG_HPP 1 + +#include +#include +#include + +using std::string; +using std::list; +using std::vector; + +class CUserConfig { +private: + string mSerialPortName; + string mSerialSpeed; + bool mVerboseMode; + bool mHelp; + bool mVersion; + bool mIdent; + bool mSpeeds; + float mMcuFrequency; + bool mPrintProgress; + // Erase + bool mErase; + list mEraseBlockList; + // Read + bool mRead; + string mReadOutputFilename; + int mReadLength; + // Write + bool mWrite; + bool mWriteEraseWholeMemory; + string mWriteInputFilename; + bool mWriteCheckByRead; + + string getArgument(vector::const_iterator args, vector::const_iterator end); + void parseEraseArguments(vector::const_iterator args, vector::const_iterator end); + void parseReadArguments(vector::const_iterator args, vector::const_iterator end); + void parseWriteArguments(vector::const_iterator args, vector::const_iterator end); + void parseCommandLine(vector & args); + +public: + CUserConfig(int argc, char **argv); + + const string getHelpMessage(const string & execName) const; + + string & getSerialPortName(); + string & getSerialSpeed(); + bool isSpeedsSet(); + bool isVerboseModeSet(); + bool isPrintProgressSet(); + bool isHelpSet(); + bool isVersionSet(); + bool isIdentSet(); + bool isEraseSet(); + list getEraseBlockList(); + bool isReadSet(); + string & getReadOutputFname(); + bool isWriteSet(); + string & getWriteInputFname(); + int getReadLength(); + bool getWriteEraseWholeMemory(); + bool getWriteCheckByRead(); + float getMcuFrequency(); +}; + +#endif diff --git a/firmware/ident/Objects/ident.SBR b/firmware/ident/Objects/ident.SBR new file mode 100755 index 0000000..301c7d7 Binary files /dev/null and b/firmware/ident/Objects/ident.SBR differ diff --git a/firmware/ident/Objects/ident.bin b/firmware/ident/Objects/ident.bin new file mode 100755 index 0000000..3abc090 Binary files /dev/null and b/firmware/ident/Objects/ident.bin differ diff --git a/firmware/ident/ident.a66 b/firmware/ident/ident.a66 new file mode 100755 index 0000000..737d1fb --- /dev/null +++ b/firmware/ident/ident.a66 @@ -0,0 +1,27 @@ +$MOD167 +$SEGMENTED + +$INCLUDE (REG167.INC) +$INCLUDE (COMMON.INC) + +NAME FIRMWARE_IDENTIFICATION +ASSUME DPP3: SYSTEM + +FW_IDENT SECTION CODE AT FW2BASE +MAIN PROC + ; Odosleme identifikaciu vyrobcu + CALL IDENTIFY + ; Vratime sa na firmware prvej urovne a tam pockame na nahratie + ; firmwaru pre vykonavanie operacii s FLASH + JMP FW1START +MAIN ENDP + +$INCLUDE (SUBROUTINES.INC) + +FW_IDENT ENDS + +FW_S1 SECTION CODE AT FW1BASE +FW1START: +FW_S1 ENDS + +END \ No newline at end of file diff --git a/firmware/ident/ident.uvgui.jan b/firmware/ident/ident.uvgui.jan new file mode 100755 index 0000000..83e0e39 --- /dev/null +++ b/firmware/ident/ident.uvgui.jan @@ -0,0 +1,1360 @@ + + + + -5.1 + +
### uVision Project, (C) Keil Software
+ + + + + + 38003 + Registers + 115 184 + + + 346 + Code Coverage + 442 160 + + + 204 + Performance Analyzer + 602 + + + + + + 1506 + Symbols + + 133 133 133 + + + 1936 + Watch 1 + + 133 133 133 + + + 1937 + Watch 2 + + 133 133 133 + + + 1935 + Call Stack + Locals + + 133 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 0 + 3 + + -1 + -1 + + + -1684 + -4 + + + 89 + -1243 + -322 + 869 + + + + 0 + + 381 + 010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000001000000020000000000000001000000495A3A5C686F6D655C6A616E5C746D705C736B6F6C615C42505C746578745C5553425F464C4153485C7372635C696D706C5C6669726D776172655C6964656E745C6964656E742E61363600000000096964656E742E61363600000000BECEA100FFFFFFFF4F5A3A5C686F6D655C6A616E5C746D705C736B6F6C615C42505C746578745C5553425F464C4153485C7372635C696D706C5C6669726D776172655C73743130663236395C73743130663236392E613636000000000C73743130663236392E61363600000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000A9FAFFFF5E00000000000000E8030000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 940100004B000000F8030000B4000000 + + + 16 + 04FBFFFF5E00000068FDFFFFC7000000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000650000008D0100004F030000 + + + 16 + 040000001700000094010000A7010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000650000008D0100004F030000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000650000008D0100004F030000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000650000008D0100004F030000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000008303000090060000D5030000 + + + 16 + 04000000170000000002000080000000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000007A010000F8030000FA010000 + + + 16 + 04000000170000000002000080000000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000008603000013040000BC030000 + + + 16 + 04000000170000000002000080000000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000650000008D01000058020000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000008603000013040000BC030000 + + + 16 + 04000000170000000002000080000000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000008603000013040000BC030000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 882 + 0 + 8192 + 0 + + 16 + 00000000000000007D0300001A000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000D503000090060000E8030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 439 + 0 + 8192 + 1 + + 16 + 000000001A000000C201000034000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 572 + 0 + 8192 + 2 + + 16 + 0000000034000000470200004E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2619 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFF94010000B4000000F8030000B8000000000000000100000004000000010000000000000000000000FFFFFFFF06000000CB00000057010000CC000000F08B00005A01000079070000FFFF02000B004354616262656450616E65002000000000000004FBFFFF5E00000068FDFFFFC7000000940100004B000000F8030000B40000000000000040280046060000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF640200004B000000680200008D010000000000000200000004000000010000000000000000000000FFFFFFFF17000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000001800040000000000000D8FBFFFF5E00000068FDFFFFA0010000680200004B000000F80300008D0100000000000040410046170000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF900100004B0000009401000068030000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C4000000739400000180001000000100000070F9FFFF5E00000000FBFFFF84020000000000004B00000090010000680300000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000076010000F80300007A01000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0E0000008F070000930700009407000095070000960700009007000091070000B5010000B8010000B9050000BA050000BB050000BC050000CB0900000180008000000000000070F9FFFF8D01000068FDFFFF0D020000000000007A010000F8030000FA01000000000000404100460E0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFFC0100007A01000000020000FA01000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF0000000068030000900600006C030000010000000100001004000000010000000000000000000000FFFFFFFF04000000C5000000C7000000B4010000779400000180008000000100000070F9FFFF8802000086FDFFFFF1020000000000006C03000090060000D50300000000000040820056040000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2030 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000025235960000000000000003000252350370726506304646383448000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020000001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C6572030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 678 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E00000000000000000000000000000000010000000100000001809E8A0000000000001F0000000000000000000000000000000001000000010000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000004002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008546172676574203196000000000000000100085461726765742031000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000004004E00000000000000000000000000000000010000000100000001807202000000000400530000000000000000000000000000000001000000010000000180BE010000000004005000000000000000000000000000000000010000000100000000000000054275696C64B7010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2220 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000002001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000000000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F7200000000000000000100000000000000010000000000000000000000010000000000000000000544656275673C020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1366 + 768 + + + + + + 1 + 0 + + 100 + 0 + + <1>.\ident.a66 + 9 + 1 + 10 + 1 + + 0 + + + + +
diff --git a/firmware/ident/ident.uvopt b/firmware/ident/ident.uvopt new file mode 100755 index 0000000..cb41179 --- /dev/null +++ b/firmware/ident/ident.uvopt @@ -0,0 +1,262 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + Target 1 + 0x2 + 166/167 + + + 40000000 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0xe800 + 0x800 + + + 1 + 0x0 + 0x40000 + + + 0 + 0xc000 + 0x2000 + + + 0 + 0xf600 + 0x800 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\ST\ST10F269_DS.PDF + + + 1 + Programming Manual + DATASHTS\ST\ST10_PM.PDF + + + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + -1 + + + + + + + + + + + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + + + + + ident + 1 + 0 + 0 + 0 + + 1 + 1 + 2 + 1 + 0 + 0 + 0 + .\ident.a66 + ident.a66 + 0 + 0 + + + +
diff --git a/firmware/ident/ident.uvproj b/firmware/ident/ident.uvproj new file mode 100755 index 0000000..a54ef24 --- /dev/null +++ b/firmware/ident/ident.uvproj @@ -0,0 +1,314 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x2 + 166/167 + + + ST10F269 + STMicroelectronics + IRAM (0xF600 - 0xFDFF) XRAM (0xC000-0xDFFF) XRAM2(0xE000-0xE7FF) IROM(0-0x3FFFF) ICAN(0xE800-0xEFFF) CLOCK(40000000) MOD167 + + "LIB\START167.A66" ("C16x/ST10 Startup Code") + + 3236 + REGST10F269.H + + + + + + + + + + + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + ident + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + Z:\mnt\shared-ntfs\bin\win\hex2bin.exe Z:\mnt\shared-ntfs\sw\firmware\ident\Objects\ident.H86 + + 0 + 0 + 2 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + S166.DLL + -cEXTMAC + D167.DLL + -p269 + S166.DLL + -cEXTMAC + T167.DLL + -p269 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + -1 + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + 0 + -1 + + 0 + + + + + + + 0 + + + + 1 + 0 + 6 + 65535 + 65535 + 65535 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 6 + 1 + 0 + 0 + 2 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + + MOD167 + + + + + + + 2 + 0 + + + + + + + + + 1 + 0 + + MOD167 + + + ..\..\firmware\include + + + + 0 + + 0 + 1 + 0 + 2 + 1 + + + + + 2 + + + + + + + + + + + + + ident + + + ident.a66 + 2 + .\ident.a66 + + + + + + + +
diff --git a/firmware/include/COMMON.INC b/firmware/include/COMMON.INC new file mode 100755 index 0000000..fbad655 --- /dev/null +++ b/firmware/include/COMMON.INC @@ -0,0 +1,30 @@ +IDMANUF DEFR 0F07Eh +IDCHIP DEFR 0F07Ch +XPERCON EQU 0F024h + +FW2BASE EQU 0E000h ; 0F600h 0E000h +FW2END EQU 0E7FFh ; 0F9FFh 0E7FFh +FW2DATA EQU (FW2END + 1 - 42) + +FW1BASE EQU 0FA40h + +STACK_TOP EQU 0FC00h +STACK_BOTTOM EQU (STACK_TOP - 256d) ; 256 bytes + +REGBANK0 EQU STACK_TOP +REGBANK1 EQU (REGBANK0 + 32d) + +CMD_PING EQU 00h +CMD_ERASE_BLOCKS EQU 01h +CMD_READ EQU 02h +CMD_WRITE EQU 03h +CMD_IDENTIFY EQU 04h +CMD_ERASE_CHIP EQU 05h + +SHELL_ACK EQU 0ABh + +RET_SERIAL_OVERRUN EQU 20h +RET_BAD_ECHO EQU 21h +RET_ERASE_ERROR EQU 30h +RET_WRITE_ERROR EQU 31h + diff --git a/firmware/include/SHELL.INC b/firmware/include/SHELL.INC new file mode 100755 index 0000000..f951a7f --- /dev/null +++ b/firmware/include/SHELL.INC @@ -0,0 +1,51 @@ +CMDLOOP: + ; Receive command safely, EXCEPT zero word + CALL REC_BYTE + CMP R14,#0 + JMPR CC_NE,CMDLOOP_ERROR + CMP R15,#CMD_PING + JMPR CC_NE,CMDLOOP_NO_PING + ; Respond to ping + MOV R15,#SHELL_ACK + CALL SEND_BYTE + JMP CMDLOOP +CMDLOOP_NO_PING: + MOV R13,#SEND_BYTE + MOV R12,#REC_BYTE + CALL ACK_DATA + CMP R14,#0 + JMPR CC_EQ,CMDLOOP_OK +CMDLOOP_ERROR: + MOV R15,R14 + CALL SEND_BYTE + JMP CMDLOOP +CMDLOOP_OK: + PUSH R15 + MOV R15,#0 + CALL SEND_BYTE ; Send zero byte + POP R15 ; Restore command number + + CMP R15,#CMD_ERASE_BLOCKS + JMPR CC_NE,CMDLOOP_1 + CALL ERASE_BLOCKS + JMP CMDLOOP +CMDLOOP_1: + CMP R15,#CMD_READ + JMPR CC_NE,CMDLOOP_2 + CALL READ + JMP CMDLOOP +CMDLOOP_2: + CMP R15,#CMD_WRITE + JMPR CC_NE,CMDLOOP_3 + CALL WRITE + JMP CMDLOOP +CMDLOOP_3: + CMP R15,#CMD_IDENTIFY + JMPR CC_NE,CMDLOOP_4 + CALL IDENTIFY + JMP CMDLOOP +CMDLOOP_4: + CMP R15,#CMD_ERASE_CHIP + JMPR CC_NE,CMDLOOP + CALL ERASE_CHIP + JMP CMDLOOP diff --git a/firmware/include/SUBROUTINES.INC b/firmware/include/SUBROUTINES.INC new file mode 100755 index 0000000..65d5f55 --- /dev/null +++ b/firmware/include/SUBROUTINES.INC @@ -0,0 +1,177 @@ +IDENTIFY PROC NEAR + MOV R15,IDMANUF + CALL SEND + MOV R15,IDCHIP + CALL SEND + RET +IDENTIFY ENDP + + +; Vstup: R8:R7 global counter, R10 block counter +; Vystup: R14 navratovy kod (0 pokracuje sa, 1 ukoncit spracovanie) +CHECK_COUNT PROC NEAR + ; Defaultny navratovy kod je "pokracovat" + MOV R14,#0 + ; Dekrementujeme globalny citac + SUB R7,#2 + SUBC R8,#0 + CMP R8,#0 + JMPR CC_NE,CHECK_COUNT_BLOCK + CMP R7,#0 + JMPR CC_NE,CHECK_COUNT_BLOCK + ; Uspesne koncime, mame precitany potrebny pocet bajtov + MOV R14,#1 + JMP CHECK_RET_SEND +CHECK_COUNT_BLOCK: + ; Dekrementujeme citac 1024 bajtoveho bloku + SUB R10,#2 + CMP R10,#0 + JMPR CC_NE,CHECK_RET +CHECK_RET_SEND: + ; Odosleme nulu + MOV R15,#0 + CALL SEND + ; Resetujeme citac 1024 bajtoveho bloku + MOV R10,#1024 + ; Posleme hodnotu globalneho citaca + MOV R15,R7 + CALL SEND + MOV R15,R8 + CALL SEND +CHECK_RET: + RET +CHECK_COUNT ENDP + +;------------------------------------------------------------------------------- +; Safe receive +;------------------------------------------------------------------------------- +; !! Posiela do PC kod chyby +REC_SAFE PROC NEAR + ; Vystup: R14 navratovy kod, R15 data (slovo) + CALL REC + CMP R14,#0 + JMPR CC_NE,REC_SAFE_RETURN_NO_SEND + CALL ACK_WORD + ; Send result of safe receiving +REC_SAFE_RETURN: + PUSH R15 + MOV R15,R14 + CALL SEND + POP R15 +REC_SAFE_RETURN_NO_SEND: + RET +REC_SAFE ENDP + + +REC_DWORD_SAFE PROC NEAR + ; Vystup: R14 navratovy kod, R8:R7 data (dvojslovo) + PUSH R15 + CALL REC_SAFE + CMP R14,#0 + JMPR CC_NE,REC_DWORD_ERROR + MOV R7,R15 + CALL REC_SAFE + CMP R14,#0 + JMPR CC_NE,REC_DWORD_ERROR + MOV R8,R15 +REC_DWORD_ERROR: + POP R15 + RET +REC_DWORD_SAFE ENDP + + +ACK_WORD PROC NEAR + PUSH R12 + PUSH R13 + MOV R13,#SEND + MOV R12,#REC + CALL ACK_DATA + POP R13 + POP R12 + RET +ACK_WORD ENDP + + +ACK_DATA PROC NEAR + ; Vstup: R15 data (slovo), R13 (pointer na SEND), R12 (pointer na REC) + ; Vystup: R14 navratovy kod, R15 data (slovo) + PUSH R0 + PUSH R15 + MOV R14,#RET_BAD_ECHO + MOV R0,R15 + CALL [R13] ; SEND + CALL [R12] ; RECEIVE + ; Serial buffer overrun? + CMP R14,#0 + JMPR CC_NE,ACK_DATA_RETURN ; Return code is already in R14 + ; Good echo from PC? + CMP R15,R0 + JMPR CC_NE,ACK_DATA_RETURN ; Return code is already in R14 + ; Everything is OK + MOV R14,#0 +ACK_DATA_RETURN: + POP R15 + POP R0 + RET +ACK_DATA ENDP + +;------------------------------------------------------------------------------- +; Send and receive +;------------------------------------------------------------------------------- +SEND PROC NEAR + ; Posle slovo. + ; Vstup: R15 + ; Zachovava: R15 + PUSH R15 + CALL SEND_BYTE + SHR R15,#8 + CALL SEND_BYTE + POP R15 + RET +SEND ENDP + + +SEND_BYTE PROC NEAR + ; Posle nizsi bajt zo slova. + ; Vstup: R15 + ; Zachovava: R15 +SEND_BYTE_1: + JNB S0TIC.7,SEND_BYTE_1 + BCLR S0TIC.7 + MOV S0TBUF,R15 ; bity 9 az 15 su nevyznamne + RET +SEND_BYTE ENDP + + +REC PROC NEAR + ; Vystup: R15 data, R14 navratovy kod + PUSH R0 + CALL REC_BYTE ; Receive low byte + CMP R14,#0 + JMPR CC_NE,REC_OK + MOV R0,R15 ; high byte bude vzdy 0 + CALL REC_BYTE + SHL R15,#8 + OR R15,R0 +REC_OK: + POP R0 + RET +REC ENDP + + +REC_BYTE PROC NEAR + ; Vystup: R15 data (low byte), R14 navratovy kod +REC_BYTE_1: + JNB S0RIC.7,REC_BYTE_1 + JB S0CON.10,REC_BYTE_ERR + MOV R15,S0RBUF ; nevyznamne bity pre dany operacny rezim serioveho rozhrania budu precitane ako 0 + BCLR S0RIC.7 + ; Successfully received word + MOV R14,#0 + JMP REC_BYTE_OK +REC_BYTE_ERR: + BCLR S0CON.10 + MOV R14,#RET_SERIAL_OVERRUN +REC_BYTE_OK: + RET +REC_BYTE ENDP diff --git a/firmware/main.uvmpw b/firmware/main.uvmpw new file mode 100755 index 0000000..62fb37e --- /dev/null +++ b/firmware/main.uvmpw @@ -0,0 +1,31 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + WorkSpace + + + .\ident\ident.uvproj + 1 + + + + .\stage_1\stage_1.uvproj + 1 + + + + .\st10f168\st10f168.uvproj + 1 + + + + .\st10f269\st10f269.uvproj + 1 + 1 + + +
diff --git a/firmware/main.uvmpw.uvgui.jan b/firmware/main.uvmpw.uvgui.jan new file mode 100755 index 0000000..c3f94d7 --- /dev/null +++ b/firmware/main.uvmpw.uvgui.jan @@ -0,0 +1,1306 @@ + + + + -5.1 + +
### uVision Project, (C) Keil Software
+ + + + + 44 + 0 + 3 + + -1 + -1 + + + -1684 + -4 + + + 89 + -1243 + -322 + 869 + + + + 0 + + 381 + 010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000001000000020000000000000001000000495A3A5C686F6D655C6A616E5C746D705C736B6F6C615C42505C746578745C5553425F464C4153485C7372635C696D706C5C6669726D776172655C6964656E745C6964656E742E61363600000000096964656E742E61363600000000BECEA100FFFFFFFF4F5A3A5C686F6D655C6A616E5C746D705C736B6F6C615C42505C746578745C5553425F464C4153485C7372635C696D706C5C6669726D776172655C73743130663236395C73743130663236392E613636000000000C73743130663236392E61363600000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000A9FAFFFF5E00000000000000E8030000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 940100004B000000F8030000B4000000 + + + 16 + 04FBFFFF5E00000068FDFFFFC7000000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000320100007E020000 + + + 16 + 040000001700000094010000A7010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000320100007E020000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000320100007E020000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000320100007E020000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 00000000B202000035010000D5030000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000007A010000F8030000FA010000 + + + 16 + 04000000170000000002000080000000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000B50200003201000044040000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000006500000032010000F6010000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000B50200003201000044040000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000B50200003201000044040000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 882 + 0 + 8192 + 0 + + 16 + 00000000000000007D0300001A000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000D503000090060000E8030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 439 + 0 + 8192 + 1 + + 16 + 000000001A000000C201000034000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 572 + 0 + 8192 + 2 + + 16 + 0000000034000000470200004E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2611 + 000000000A000000000000000020000000000000FFFFFFFFFFFFFFFF94010000B4000000F8030000B8000000000000000100000004000000010000000000000000000000FFFFFFFF06000000CB00000057010000CC000000F08B00005A01000079070000FFFF02000B004354616262656450616E65002000000000000004FBFFFF5E00000068FDFFFFC7000000940100004B000000F8030000B40000000000000040280046060000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF640200004B000000680200008D010000000000000200000004000000010000000000000000000000FFFFFFFF17000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000001800040000000000000D8FBFFFF5E00000068FDFFFFA0010000680200004B000000F80300008D0100000000000040410046170000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF350100004B00000039010000D50300000100000002000010040000000100000023FFFFFFA902000000000000000000000000000001000000FFFFFFFF05000000ED0300006D000000C3000000C4000000739400000180001000000100000070F9FFFF5E000000A5FAFFFF22020000000000004B00000035010000970200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFF04000000C5000000C7000000B4010000779400000180001000000100000070F9FFFF26020000A5FAFFFFE8030000000000009B02000035010000D50300000000000040820056040000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF000000000000000002000000000000000100000002000000FFFFFFFF0000000097020000350100009B020000010000000100001004000000000000003EFEFFFFC001000000000000000000000000000002000000FFFFFFFFED030000FFFFFFFFC500000001000000FFFFFFFFC500000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000076010000F80300007A01000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0E0000008F070000930700009407000095070000960700009007000091070000B5010000B8010000B9050000BA050000BB050000BC050000CB0900000180008000000000000070F9FFFF8D01000068FDFFFF0D020000000000007A010000F8030000FA01000000000000404100460E0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFFC0100007A01000000020000FA01000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000000000000000000 + + + 59392 + File + + 2204 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE8030000000000000000000000000000000000000000000000010000000100000096000000020020500000000005434F4E53549600000000000000130005434F4E53540445585453085245435F534146450F5245545F57524954455F4552524F520252300A5245435F434F4E464947035231330841434B5F574F52440352313504454E445009534358542043502C52055265736574013209524541445F444F4E4503464152025235037072650630464638344802523400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020000001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C6572030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 678 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E00000000000000000000000000000000010000000100000001809E8A0000000000001F0000000000000000000000000000000001000000010000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000004002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008546172676574203196000000000000000100085461726765742031000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000000240000000000000000000000000000000001000000010000000180A8010000000004004E00000000000000000000000000000000010000000100000001807202000000000400530000000000000000000000000000000001000000010000000180BE010000000004005000000000000000000000000000000000010000000100000000000000054275696C64B7010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2220 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000002001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000000000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F7201000000000000000100000000000000010000000000000000000000010000000000000000000544656275673C020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1366 + 768 + + + + + + 1 + 0 + + 100 + 0 + + <1>.\ident.a66 + 0 + 1 + 1 + 0 + + 0 + + + <4>.\st10f269.a66 + 0 + 72 + 123 + 0 + + 0 + + + + +
diff --git a/firmware/st10f168/Objects/st10f168.SBR b/firmware/st10f168/Objects/st10f168.SBR new file mode 100755 index 0000000..5ce35c3 Binary files /dev/null and b/firmware/st10f168/Objects/st10f168.SBR differ diff --git a/firmware/st10f168/Objects/st10f168.bin b/firmware/st10f168/Objects/st10f168.bin new file mode 100755 index 0000000..bdde05c Binary files /dev/null and b/firmware/st10f168/Objects/st10f168.bin differ diff --git a/firmware/st10f168/st10f168.a66 b/firmware/st10f168/st10f168.a66 new file mode 100755 index 0000000..0ae78af --- /dev/null +++ b/firmware/st10f168/st10f168.a66 @@ -0,0 +1,273 @@ +$MOD167 +$SEGMENTED + +$INCLUDE (REG167.INC) +$INCLUDE (COMMON.INC) + +CONST_2TCL EQU (REGBANK1 + 32d) ; premenna + +NAME FIRMWARE_ST10F168 +ASSUME DPP3: SYSTEM + +FW_DATA SECTION DATA WORD AT FW2DATA + ; Control array of structures {segment, address, length in words} for read and write operations + FLASH_MAPPING: + DW 0,0,(32*1024)/2 + DW 1,8000h,(32*1024)/2 + DW 2,0000h,(64*1024)/2 + DW 3,0000h,(32*1024)/2 + DW 3,8000h,(32*1024)/2 + DW 4,0000h,(64*1024)/2 ; Length is not needed +FW_DATA ENDS + +FW_ST10F168 SECTION CODE AT FW2BASE +;------------------------------------------------------------------------------- +; Main procedure +; +; Caka na slovo prikazu, odosle ho naspat pre potvrdenie a to iste musi znovu +; prijat. +;------------------------------------------------------------------------------- +MAIN PROC + ; Default register bank + MOV CP,#REGBANK0 + ; Zapneme serial buffer overrun detection + BSET S0CON.7 + ; Init stack, size = 128 words, 256 bytes + MOV R0,SYSCON + AND R0,#3FFFh + OR R0,#2000h + MOV SYSCON,R0 + + MOV STKUN, #STACK_TOP + MOV STKOV, #STACK_BOTTOM + MOV SP, #STACK_TOP + + NOP + NOP + + MOV DPP0,#0 + MOV DPP1,#1 + MOV DPP2,#2 + MOV DPP3,#3 + + ; Signalize successful initialization + MOV R15,#0 + CALL SEND +;----------------------------------------------------------------------- +; Command loop +;----------------------------------------------------------------------- +$INCLUDE (SHELL.INC) + +MAIN ENDP + +;------------------------------------------------------------------------------- +; Receive config information (1 word) +;------------------------------------------------------------------------------- +REC_CONFIG PROC NEAR + ; Get 2TCL constant + CALL REC_SAFE + CMP R14,#0 + JMPR CC_NE,REC_CONFIG_ERROR + MOV CONST_2TCL,R15 +REC_CONFIG_ERROR: + RET +REC_CONFIG ENDP + +;------------------------------------------------------------------------------- +; Erase chip +;------------------------------------------------------------------------------- +ERASE_CHIP PROC NEAR + SCXT CP,#REGBANK1 + ; Receive 2TCL constant for R4 STEAK + CALL REC_CONFIG + CMP R14,#0 + JMPR CC_NE,ERASE_CHIP_ERROR + MOV R13,#0Fh ; Erase all blocks + JMP ERASE_BLOCKS_MASK_OK +ERASE_CHIP_ERROR: + POP CP + RET +ERASE_CHIP ENDP + +;------------------------------------------------------------------------------- +; Erase blocks +;------------------------------------------------------------------------------- +ERASE_BLOCKS PROC NEAR + SCXT CP,#REGBANK1 + ; Receive 2TCL constant for R4 STEAK + CALL REC_CONFIG + CMP R14,#0 + JMPR CC_NE,ERASE_BLOCKS_ERROR + ; Receive mask of blocks going to be erased + CALL REC_SAFE + ; Store mask + MOV R13,R15 + ; Exit if there was an error + CMP R14,#0 + JMPR CC_EQ,ERASE_BLOCKS_MASK_OK +ERASE_BLOCKS_ERROR: + POP CP + RET + +ERASE_BLOCKS_MASK_OK: + ; Erase blocks command + MOV R0,#0EEEEh + MOV R1,#5555h + MOV R2,#0 ; Block counter + ; V R13 mame masku +ERASE_BLOCKS_LOOP: + ROR R13,#1 + JNB PSW.1,ERASE_BLOCKS_NEXT + MOV R3,R2 + CALL UNLOCK_SEQUENCE + ; Check return code + CMP R14,#0 + JMPR CC_NE,ERASE_BLOCKS_DONE +ERASE_BLOCKS_NEXT: + CMPI1 R2,#2 + JMPR CC_UGT,ERASE_BLOCKS_DONE + JMP ERASE_BLOCKS_LOOP +ERASE_BLOCKS_DONE: + MOV R15,R14 + CALL SEND + POP CP + RET +ERASE_BLOCKS ENDP + +;------------------------------------------------------------------------------- +; Read +;------------------------------------------------------------------------------- +READ PROC NEAR + SCXT CP,#REGBANK1 + ; Receive 2TCL constant for R4 STEAK + CALL REC_CONFIG + CMP R14,#0 + JMPR CC_NE,READ_ERROR + ; Prijmeme pocet bajtov pre precitanie + CALL REC_DWORD_SAFE + CMP R14,#0 + JMPR CC_NE,READ_ERROR + ; Pocitadlo velkosti 1024 bajtoveho bloku + MOV R10,#1024 + ; Base of the control table + MOV R11,#DPP3:FLASH_MAPPING + +READ_START: + MOV R0,[R11] ; Get segment, R0 + ADD R11,#2 + MOV R1,[R11] ; Get start address, R1 + ADD R11,#2 + MOV R2,[R11] ; Get data length to read, R2 + ADD R11,#2 +READ_LOOP: + ; Read word + EXTS R0,#1 + MOV R15,[R1] + CALL SEND + CALL CHECK_COUNT + CMP R14,#1 + JMPR CC_EQ,READ_DONE + ADD R1,#2 ; Set address of the next word + SUB R2,#1 ; Decrement word counter + JMPR CC_NZ,READ_LOOP + JMP READ_START + +READ_ERROR: +READ_DONE: + POP CP + RET +READ ENDP + +;------------------------------------------------------------------------------- +; Write +;------------------------------------------------------------------------------- +WRITE PROC NEAR + SCXT CP,#REGBANK1 + ; Receive 2TCL constant for R4 STEAK + CALL REC_CONFIG + CMP R14,#0 + JMPR CC_NE,WRITE_ERROR + ; Prijmeme pocet bajtov pre zapis + CALL REC_DWORD_SAFE + CMP R14,#0 + JMPR CC_NE,WRITE_ERROR + ; Pocitadlo velkosti 1024 bajtoveho bloku + MOV R10,#1024 + ; Base of the control table + MOV R11,#DPP3:FLASH_MAPPING +WRITE_START: + MOV R0,[R11] ; Get segment number, R0 + AND R0,#000Fh ; Skonstruujeme prikaz + OR R0,#55A0h + ADD R11,#2 + MOV R1,[R11] ; Get start address, R1 + ADD R11,#2 + MOV R5,[R11] ; Get data length to write, R5 + ADD R11,#2 +WRITE_LOOP: + CALL REC + CMP R14,#0 + JMPR CC_NE,WRITE_SEND_ERROR + MOV R2,R15 + ; Write word + CALL UNLOCK_SEQUENCE + CMP R14,#0 + JMPR CC_NE,WRITE_SEND_ERROR + CALL CHECK_COUNT + CMP R14,#1 + JMPR CC_EQ,WRITE_DONE + ADD R1,#2 + SUB R5,#1 + JMPR CC_NZ,WRITE_LOOP + JMP WRITE_START + +WRITE_SEND_ERROR: + MOV R15,R14 + CALL SEND +WRITE_ERROR: +WRITE_DONE: + POP CP + RET +WRITE ENDP + +;------------------------------------------------------------------------------- +; Helper subroutines +;------------------------------------------------------------------------------- +$INCLUDE (SUBROUTINES.INC) + +; Vstup: R0, R1, R2, R3, R4 +; Vystup: R14 navratovy kod +; Zachovava: R0, R1, R2, R3, R4 +UNLOCK_SEQUENCE PROC NEAR + PUSH R0 + PUSH R1 + PUSH R2 + PUSH R3 + PUSH R6 + + MOV R4,CONST_2TCL ; Perioda hodinoveho signalu v ns + ; Unlock sequence + MOV R6,#8000h + + EXTS #1,#2 + MOV 8000h,R6 + MOV [R6],R6 + NOP + NOP + MOV R14,R0 + + POP R6 + POP R3 + POP R2 + POP R1 + POP R0 + RET +UNLOCK_SEQUENCE ENDP +;------------------------------------------------------------------------------- +; End of helper subroutines +;------------------------------------------------------------------------------- + +FW_ST10F168 ENDS + + +END \ No newline at end of file diff --git a/firmware/st10f168/st10f168.uvgui.jan b/firmware/st10f168/st10f168.uvgui.jan new file mode 100755 index 0000000..e4d3aee --- /dev/null +++ b/firmware/st10f168/st10f168.uvgui.jan @@ -0,0 +1,1360 @@ + + + + -5.1 + +
### uVision Project, (C) Keil Software
+ + + + + + 38003 + Registers + 115 184 + + + 346 + Code Coverage + 442 160 + + + 204 + Performance Analyzer + 602 + + + + + + 1506 + Symbols + + 133 133 133 + + + 1936 + Watch 1 + + 133 133 133 + + + 1937 + Watch 2 + + 133 133 133 + + + 1935 + Call Stack + Locals + + 133 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 0 + 3 + + -1 + -1 + + + -1684 + -4 + + + 89 + -1243 + -322 + 869 + + + + 0 + + 381 + 010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000001000000020000000000000001000000495A3A5C686F6D655C6A616E5C746D705C736B6F6C615C42505C746578745C5553425F464C4153485C7372635C696D706C5C6669726D776172655C6964656E745C6964656E742E61363600000000096964656E742E61363600000000BECEA100FFFFFFFF4F5A3A5C686F6D655C6A616E5C746D705C736B6F6C615C42505C746578745C5553425F464C4153485C7372635C696D706C5C6669726D776172655C73743130663236395C73743130663236392E613636000000000C73743130663236392E61363600000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000A9FAFFFF5E00000000000000E8030000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 940100004B000000F8030000B4000000 + + + 16 + 56FDFFFF50010000BAFFFFFFB9010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000650000008D0100007B010000 + + + 16 + 040000001700000094010000A7010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000650000008D0100007B010000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000650000008D0100007B010000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000650000008D0100007B010000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 00000000AF01000090010000DE020000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000007A010000F8030000FA010000 + + + 16 + 04000000170000000002000080000000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000B20100008D010000C5020000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000650000008D0100007B010000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000B20100008D010000C5020000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000B20100008D010000C5020000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 882 + 0 + 8192 + 0 + + 16 + 00000000000000007D0300001A000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000DE02000016040000F1020000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 439 + 0 + 8192 + 1 + + 16 + 000000001A000000C201000034000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 572 + 0 + 8192 + 2 + + 16 + 0000000034000000470200004E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2611 + 000000000A000000000000000020000000000000FFFFFFFFFFFFFFFF94010000B4000000F8030000B8000000000000000100000004000000010000000000000000000000FFFFFFFF06000000CB00000057010000CC000000F08B00005A01000079070000FFFF02000B004354616262656450616E65002000000000000056FDFFFF50010000BAFFFFFFB9010000940100004B000000F8030000B40000000000000040280046060000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF640200004B000000680200008D010000000000000200000004000000010000000000000000000000FFFFFFFF17000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C0000018000400000000000002AFEFFFF50010000BAFFFFFF92020000680200004B000000F80300008D0100000000000040410046170000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFF900100004B00000094010000DE02000001000000020000100400000001000000000000000000000000000000000000000000000001000000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000C2FBFFFF5001000052FDFFFF99020000000000004B00000090010000940100000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFF04000000C5000000C7000000B40100007794000001800010000001000000C2FBFFFF9D02000052FDFFFFE3030000000000009801000090010000DE0200000000000040820056040000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF000000000000000002000000000000000100000002000000FFFFFFFF0000000094010000900100009801000001000000010000100400000000000000CCFDFFFF4E01000000000000000000000000000002000000FFFFFFFFED030000FFFFFFFFC500000001000000FFFFFFFFC500000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000076010000F80300007A01000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0E0000008F070000930700009407000095070000960700009007000091070000B5010000B8010000B9050000BA050000BB050000BC050000CB09000001800080000000000000C2FBFFFF7F020000BAFFFFFFFF020000000000007A010000F8030000FA01000000000000404100460E0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFFC0100007A01000000020000FA01000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000000000000000000 + + + 59392 + File + + 2030 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000025235960000000000000003000252350370726506304646383448000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020000001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C6572030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 678 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E00000000000000000000000000000000010000000100000001809E8A0000000000001F0000000000000000000000000000000001000000010000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000004002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008546172676574203196000000000000000100085461726765742031000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000004004E00000000000000000000000000000000010000000100000001807202000000000400530000000000000000000000000000000001000000010000000180BE010000000004005000000000000000000000000000000000010000000100000000000000054275696C64B7010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2220 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000002001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000000000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F7201000000000000000100000000000000010000000000000000000000010000000000000000000544656275673C020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1366 + 768 + + + + + + 1 + 0 + + 100 + 0 + + Z:\home\jan\tmp\skola\BP\firmware\ident\st10f168.a66 + 16 + 2 + 5 + 1 + + 0 + + + + +
diff --git a/firmware/st10f168/st10f168.uvopt b/firmware/st10f168/st10f168.uvopt new file mode 100755 index 0000000..4b708ed --- /dev/null +++ b/firmware/st10f168/st10f168.uvopt @@ -0,0 +1,262 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + Target 1 + 0x2 + 166/167 + + + 25000000 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0xe800 + 0x800 + + + 1 + 0x0 + 0x40000 + + + 0 + 0xd000 + 0x1800 + + + 0 + 0xf600 + 0x800 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\ST\ST10F168_DS.PDF + + + 1 + Programming Manual + DATASHTS\ST\ST10_PM.PDF + + + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + -1 + + + + + + + + + + + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + + + + + st10f168 + 1 + 0 + 0 + 0 + + 1 + 1 + 2 + 1 + 0 + 0 + 0 + .\st10f168.a66 + st10f168.a66 + 0 + 0 + + + +
diff --git a/firmware/st10f168/st10f168.uvproj b/firmware/st10f168/st10f168.uvproj new file mode 100755 index 0000000..7516ae4 --- /dev/null +++ b/firmware/st10f168/st10f168.uvproj @@ -0,0 +1,314 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x2 + 166/167 + + + ST10F168 + STMicroelectronics + IRAM (0xF600 - 0xFDFF) XRAM(0xD000-0xE7FF) IROM(0-0x3FFFF) ICAN(0xE800-0xEFFF) CLOCK(25000000) MOD167 + + "LIB\START167.A66" ("C16x/ST10 Startup Code") + + 3184 + REG168.H + + + + + + + + + + + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + st10f168 + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + Z:\mnt\shared-ntfs\bin\win\hex2bin.exe Z:\mnt\shared-ntfs\sw\firmware\st10f168\Objects\st10f168.H86 + + 0 + 0 + 2 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + S166.DLL + + D167.DLL + -p168 + S166.DLL + + T167.DLL + -p168 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + -1 + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + 0 + -1 + + 0 + + + + + + + 0 + + + + 1 + 0 + 6 + 65535 + 65535 + 65535 + 1 + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 6 + 1 + 0 + 0 + 2 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + + MOD167 + + + + + + + 2 + 0 + + + + + + + + + 1 + 0 + + MOD167 + + + ..\..\firmware\include + + + + 0 + + 0 + 1 + 0 + 2 + 1 + + + + + 2 + + + + + + + + + + + + + st10f168 + + + st10f168.a66 + 2 + .\st10f168.a66 + + + + + + + +
diff --git a/firmware/st10f269/Objects/st10f269.SBR b/firmware/st10f269/Objects/st10f269.SBR new file mode 100755 index 0000000..a85bcd0 Binary files /dev/null and b/firmware/st10f269/Objects/st10f269.SBR differ diff --git a/firmware/st10f269/Objects/st10f269.bin b/firmware/st10f269/Objects/st10f269.bin new file mode 100755 index 0000000..d9253d7 Binary files /dev/null and b/firmware/st10f269/Objects/st10f269.bin differ diff --git a/firmware/st10f269/st10f269.a66 b/firmware/st10f269/st10f269.a66 new file mode 100755 index 0000000..6bd03d7 --- /dev/null +++ b/firmware/st10f269/st10f269.a66 @@ -0,0 +1,422 @@ +$MOD167 +$SEGMENTED + +$INCLUDE (REG167.INC) +$INCLUDE (COMMON.INC) + +NAME FIRMWARE_ST10F269 +ASSUME DPP3: SYSTEM + + +FW_DATA SECTION DATA WORD AT FW2DATA + ; Control array of structures {segment, address, length in words} for read and write operations + FLASH_MAPPING: + DW 1,0000h,(16*1024)/2 + DW 1,4000h,(8*1024)/2 + DW 1,6000h,(8*1024)/2 + DW 1,8000h,(32*1024)/2 + DW 2,0000h,(64*1024)/2 + DW 3,0000h,(64*1024)/2 ; Length is not needed + DW 4,0000h,(64*1024)/2 ; Length is not needed +FW_DATA ENDS + +FW_ST10F269 SECTION CODE AT FW2BASE +;------------------------------------------------------------------------------- +; Main procedure +; +; Caka na slovo prikazu, odosle ho naspat pre potvrdenie a to iste musi znovu +; prijat. +;------------------------------------------------------------------------------- +MAIN PROC + ; REMAP flash to segment 1 !!! Because of BUG. + BSET ROMS1 + ; Default register bank + MOV CP,#REGBANK0 + ; Zapneme serial buffer overrun detection + BSET S0CON.7 + ; Init stack, size = 128 words, 256 bytes + MOV R0,SYSCON + AND R0,#3FFFh + OR R0,#2000h + MOV SYSCON,R0 + + MOV STKUN, #STACK_TOP + MOV STKOV, #STACK_BOTTOM + MOV SP, #STACK_TOP + + NOP + NOP + + MOV DPP0,#0 + MOV DPP1,#1 + MOV DPP2,#2 + MOV DPP3,#3 + + ; Signalize successful initialization + MOV R15,#0 + CALL SEND +;----------------------------------------------------------------------- +; Command loop +;----------------------------------------------------------------------- +$INCLUDE (SHELL.INC) + +MAIN ENDP + +;------------------------------------------------------------------------------- +; Receive config information (1 word) +;------------------------------------------------------------------------------- +REC_CONFIG PROC NEAR + CALL REC_SAFE + RET +REC_CONFIG ENDP + +;------------------------------------------------------------------------------- +; Erase chip +;------------------------------------------------------------------------------- +ERASE_CHIP PROC NEAR + SCXT CP,#REGBANK1 + ; Receive config information + CALL REC_CONFIG + CMP R14,#0 + JMPR CC_NE,ERASE_CHIP_ERROR + + MOV R0,#1554h + MOV R1,#2AA8h + MOV R2,#0A8h + MOV R3,#54h + MOV R4,#80h + MOV R5,#10h + + ; Command cycles + EXTS #1,#3 + MOV [R0],R2 ; [1554h], 0A80h + MOV [R1],R3 ; [2AA8h], 54h + MOV [R0],R4 ; [1554h], 80h + EXTS #1,#3 + MOV [R0],R2 ; [1554h], 0A80h + MOV [R1],R3 ; [2AA8h], 54h + MOV [R0],R5 ; [1554h], 10h + + NOP ; For BUG: Last command cycle + NOP + + ; Pockame na dokoncenie zmazania chipu a detekujeme chyby + MOV R0,#1 + MOV R1,#0000h + CALL OP_WAIT + MOV R15,R14 + CALL SEND +ERASE_CHIP_ERROR: + POP CP + RET +ERASE_CHIP ENDP + +;------------------------------------------------------------------------------- +; Erase blocks +;------------------------------------------------------------------------------- +ERASE_BLOCKS PROC NEAR + SCXT CP,#REGBANK1 + ; Receive config information + CALL REC_CONFIG + CMP R14,#0 + JMPR CC_NE,ERASE_BLOCKS_ERROR + ; Receive mask of blocks going to be erased + CALL REC_SAFE + ; Store mask + MOV R13,R15 + ; Exit if there was an error + CMP R14,#0 + JMPR CC_NE,ERASE_BLOCKS_ERROR + +ERASE_BLOCKS_START: + ; Base address of the control structure + MOV R11,#DPP3:FLASH_MAPPING + + MOV R0,#1554h + MOV R1,#2AA8h + MOV R2,#0A8h + MOV R3,#54h + MOV R4,#80h + + ; Command cycles + EXTS #1,#3 + MOV [R0],R2 ; [1554h], 0A8h + MOV [R1],R3 ; [2AA8h], 54h + MOV [R0],R4 ; [1554h], 80h + EXTS #1,#2 + MOV [R0],R2 ; [1554h], 0A8h + MOV [R1],R3 ; [2AA8h], 54h + + MOV R2,#0 ; Block counter + ; V R13 mame masku + +ERASE_BLOCKS_LOOP: + MOV R0,[R11] ; Get segment, R0 + ADD R11,#2 + MOV R1,[R11] ; Get start address, R1 + ADD R11,#4 ; Skip size + + ROR R13,#1 + JNB PSW.1,ERASE_BLOCKS_NEXT + ; Add command for given block + MOV R4,#30h + EXTS R0,#1 + MOV [R1],R4 +ERASE_BLOCKS_NEXT: + CMPI1 R2,#5 + JMPR CC_UGT,ERASE_BLOCKS_WAIT + JMP ERASE_BLOCKS_LOOP +ERASE_BLOCKS_WAIT: + NOP ; For BUG: Last command cycle + NOP + ; Pockame na dokoncenie zmazania chipu a detekujeme chyby + ; V R0 a R1 mame segment a adresu platnu pre posledny mazany blok + CALL OP_WAIT + MOV R15,R14 + CALL SEND +ERASE_BLOCKS_ERROR: + POP CP + RET +ERASE_BLOCKS ENDP + +;------------------------------------------------------------------------------- +; Read +;------------------------------------------------------------------------------- +READ PROC NEAR + SCXT CP,#REGBANK1 + ; Receive config information + CALL REC_CONFIG + CMP R14,#0 + JMPR CC_NE,READ_ERROR + ; Prijmeme pocet bajtov pre precitanie + CALL REC_DWORD_SAFE + CMP R14,#0 + JMPR CC_NE,READ_ERROR + ; Pocitadlo velkosti 1024 bajtoveho bloku + MOV R10,#1024 + ; Base of the control table + MOV R11,#DPP3:FLASH_MAPPING + ; Read/Reset command + MOV R0,#0000h + MOV R1,#00F0h + EXTS #1,#1 + MOV [R0],R1 ; zapiseme na lubovolnu adresu + +READ_START: + MOV R0,[R11] ; Get segment, R0 + ADD R11,#2 + MOV R1,[R11] ; Get start address, R1 + ADD R11,#2 + MOV R2,[R11] ; Get data length to read, R2 + ADD R11,#2 +READ_LOOP: + ; Read word + EXTS R0,#1 + MOV R15,[R1] + CALL SEND + CALL CHECK_COUNT + CMP R14,#1 + JMPR CC_EQ,READ_DONE + ADD R1,#2 ; Set address of the next word + SUB R2,#1 ; Decrement word counter + JMPR CC_NZ,READ_LOOP + JMP READ_START + +READ_ERROR: +READ_DONE: + POP CP + RET + +READ ENDP +;------------------------------------------------------------------------------- +; Write +;------------------------------------------------------------------------------- +WRITE PROC NEAR + SCXT CP,#REGBANK1 + ; Receive config information + CALL REC_CONFIG + CMP R14,#0 + JMPR CC_NE,WRITE_ERROR + ; Prijmeme pocet bajtov pre zapis + CALL REC_DWORD_SAFE + CMP R14,#0 + JMPR CC_NE,WRITE_ERROR + ; Pocitadlo velkosti 1024 bajtoveho bloku + MOV R10,#1024 + ; Base of the control table + MOV R11,#DPP3:FLASH_MAPPING +WRITE_START: + MOV R0,[R11] ; Get segment, R0 + ADD R11,#2 + MOV R1,[R11] ; Get start address, R1 + ADD R11,#2 + MOV R3,[R11] ; Get data length to write, R3 + ADD R11,#2 +WRITE_LOOP: + CALL REC + CMP R14,#0 + JMPR CC_NE,WRITE_SEND_ERROR + ; Write word in R15 to the FLASH + MOV R5,#1554h + MOV R6,#2AA8h + MOV R2,#0A8h + MOV R12,#54h + MOV R9,#0A0h + ; Command cycles + EXTS #1,#3 + MOV [R5],R2 ; [1554h], 0A8h + MOV [R6],R12 ; [2AA8h], 54h + MOV [R5],R9 ; [1554h], 0A0h + ; 4. cyklus - zapiseme data na cielovu adresu + EXTS R0,#1 + MOV [R1],R15 + + NOP ; For BUG: Last command cycle + NOP + ; Pockame na dokoncenie zmazania chipu a detekujeme chyby + ; V R0 a R1 mame segment a adresu platnu pre posledny mazany blok + ; V R2 mame zapisovane slovo + MOV R2,R15 + CALL OP_WAIT + CMP R14,#0 + JMPR CC_NE,WRITE_SEND_ERROR + ; End of Write word + CALL CHECK_COUNT + CMP R14,#1 + JMPR CC_EQ,WRITE_DONE + ADD R1,#2 + SUB R3,#1 + JMPR CC_NZ,WRITE_LOOP + JMP WRITE_START + +WRITE_SEND_ERROR: + MOV R15,R14 + CALL SEND +WRITE_ERROR: +WRITE_DONE: + POP CP + RET + +WRITE ENDP + +;------------------------------------------------------------------------------- +; Helper subroutines +;------------------------------------------------------------------------------- +$INCLUDE (SUBROUTINES.INC) + +;OP_WAIT_ERASE PROC NEAR + + ;; Vstup: R0 segment, R1 adresa + ;; Vystup: R14 navratovy kod + ;PUSH R0 + ;PUSH R1 + ;PUSH R2 + ;PUSH R3 + ;PUSH R4 + ;MOV R14,#0 ; Defaultny navratovy kod +;OP_WAIT_ERASE_LOOP: + ;EXTS R0,#1 + ;MOV R3,[R1] + ;MOV R4,R3 ; Make a copy for error bit checking + ;; Is operation complete? + ;EXTS R0,#1 + ;MOV R3,[R1] + ;XOR R3,R4 + ;JNB R3.6,OP_WAIT_ERASE_RETURN + ;; Has error occured? + ;JB R4.5,OP_WAIT_ERASE_ERROR + ;JMP OP_WAIT_ERASE_LOOP +;OP_WAIT_ERASE_ERROR: + ;; Error, run Read/Reset command, this also resets the error bit .5 + ;MOV R14,#RET_ERASE_ERROR + ;MOV R2,#0F0h + ;EXTS R0,#1 + ;MOV [R1],R2 +;OP_WAIT_ERASE_RETURN: + ;POP R4 + ;POP R3 + ;POP R2 + ;POP R1 + ;POP R0 + ;RET +;OP_WAIT_ERASE ENDP + +OP_WAIT PROC NEAR + ; Vstup: R0 segment, R1 adresa, R2 bit 7 (hodnota, ktora znaci ukoncenie operacie) + ; Vystup: R14 navratovy kod + PUSH R0 + PUSH R1 + PUSH R2 + PUSH R3 + PUSH R4 + MOV R14,#0 ; Defaultny navratovy kod +OP_WAIT_LOOP: + EXTS R0,#1 + MOV R3,[R1] + MOV R4,R3 ; Make a copy for error bit checking + ; Is operation complete? + EXTS R0,#1 + MOV R3,[R1] + XOR R3,R4 + JNB R3.6,OP_WAIT_RETURN + ; Has error occured? + JB R4.5,OP_WAIT_ERROR + JMP OP_WAIT_LOOP +OP_WAIT_ERROR: + ; Error, run Read/Reset command, this also resets the error bit .5 + MOV R14,#RET_WRITE_ERROR + MOV R2,#0F0h + EXTS R0,#1 + MOV [R1],R2 +OP_WAIT_RETURN: + POP R4 + POP R3 + POP R2 + POP R1 + POP R0 + RET +OP_WAIT ENDP +;--------------- + + +;OP_DP_WAIT PROC NEAR + ;; Vstup: R0 segment, R1 adresa, R2 bit 7 (hodnota, ktora znaci ukoncenie operacie) + ;; Vystup: R14 navratovy kod + ;PUSH R0 + ;PUSH R1 + ;PUSH R2 + ;PUSH R3 + ;PUSH R4 + ;MOV R2,#0FFh + ;MOV R14,#0 ; Defaultny navratovy kod +;OP_DP_WAIT_LOOP: + ;EXTS R0,#1 + ;MOV R3,[R1] + ;MOV R4,R3 ; Make a copy for error bit checking + ;; Is operation complete? + ;XOR R3,R2 + ;JNB R3.7,OP_DP_WAIT_RETURN + ;; Has error occured? + ;JB R4.5,OP_DP_WAIT_ERROR + ;JMP OP_DP_WAIT_LOOP +;OP_DP_WAIT_ERROR: + ;; Error, run Read/Reset command, this also resets the error bit .5 + ;MOV R14,#RET_WRITE_ERROR + ;MOV R2,#0F0h + ;EXTS R0,#1 + ;MOV [R1],R2 +;OP_DP_WAIT_RETURN: + ;POP R4 + ;POP R3 + ;POP R2 + ;POP R1 + ;POP R0 + ;RET +;OP_DP_WAIT ENDP +;------------------------------------------------------------------------------- +; End of helper subroutines +;------------------------------------------------------------------------------- + +FW_ST10F269 ENDS + +END \ No newline at end of file diff --git a/firmware/st10f269/st10f269.uvgui.jan b/firmware/st10f269/st10f269.uvgui.jan new file mode 100755 index 0000000..727bfc8 --- /dev/null +++ b/firmware/st10f269/st10f269.uvgui.jan @@ -0,0 +1,1360 @@ + + + + -5.1 + +
### uVision Project, (C) Keil Software
+ + + + + + 38003 + Registers + 115 184 + + + 346 + Code Coverage + 442 160 + + + 204 + Performance Analyzer + 602 + + + + + + 1506 + Symbols + + 133 133 133 + + + 1936 + Watch 1 + + 133 133 133 + + + 1937 + Watch 2 + + 133 133 133 + + + 1935 + Call Stack + Locals + + 133 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 0 + 3 + + -1 + -1 + + + -1684 + -4 + + + 89 + -1243 + -322 + 869 + + + + 0 + + 381 + 010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000001000000020000000000000001000000495A3A5C686F6D655C6A616E5C746D705C736B6F6C615C42505C746578745C5553425F464C4153485C7372635C696D706C5C6669726D776172655C6964656E745C6964656E742E61363600000000096964656E742E61363600000000BECEA100FFFFFFFF4F5A3A5C686F6D655C6A616E5C746D705C736B6F6C615C42505C746578745C5553425F464C4153485C7372635C696D706C5C6669726D776172655C73743130663236395C73743130663236392E613636000000000C73743130663236392E61363600000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000A9FAFFFF5E00000000000000E8030000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 940100004B000000F8030000B4000000 + + + 16 + 79FDFFFFE4000000DDFFFFFF4D010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000ED010000F6010000 + + + 16 + 040000001700000094010000A7010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000ED010000F6010000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000ED010000F6010000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000ED010000F6010000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000002A020000F0010000D5030000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000007A010000F8030000FA010000 + + + 16 + 04000000170000000002000080000000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000002D020000BF00000040030000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000BF0000007B010000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000002D020000BF00000040030000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000002D020000BF00000040030000 + + + 16 + 70F9FFFF1802000000000000C3020000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 882 + 0 + 8192 + 0 + + 16 + 00000000000000007D0300001A000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000D503000090060000E8030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 439 + 0 + 8192 + 1 + + 16 + 000000001A000000C201000034000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 572 + 0 + 8192 + 2 + + 16 + 0000000034000000470200004E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2611 + 000000000A000000000000000020000000000000FFFFFFFFFFFFFFFF94010000B4000000F8030000B8000000000000000100000004000000010000000000000000000000FFFFFFFF06000000CB00000057010000CC000000F08B00005A01000079070000FFFF02000B004354616262656450616E65002000000000000079FDFFFFE4000000DDFFFFFF4D010000940100004B000000F8030000B40000000000000040280046060000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF640200004B000000680200008D010000000000000200000004000000010000000000000000000000FFFFFFFF17000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C0000018000400000000000004DFEFFFFE4000000DDFFFFFF26020000680200004B000000F80300008D0100000000000040410046170000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF00100004B000000F4010000D50300000100000002000010040000000100000040FFFFFFC505000000000000000000000000000001000000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000E5FBFFFFE4000000A7FCFFFF2D020000000000004B000000F00100000F0200000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF0000000000000000FFFFFFFF04000000C5000000C7000000B40100007794000001800010000001000000E5FBFFFF31020000A7FCFFFF770300000000000013020000F0010000D50300000000000040820056040000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF000000000000000002000000000000000100000002000000FFFFFFFF000000000F020000F00100001302000001000000010000100400000000000000CCFDFFFF4E01000000000000000000000000000002000000FFFFFFFFED030000FFFFFFFFC500000001000000FFFFFFFFC500000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000076010000F80300007A01000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0E0000008F070000930700009407000095070000960700009007000091070000B5010000B8010000B9050000BA050000BB050000BC050000CB09000001800080000000000000E5FBFFFF13020000DDFFFFFF93020000000000007A010000F8030000FA01000000000000404100460E0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFFC0100007A01000000020000FA01000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000000000000000000 + + + 59392 + File + + 2030 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000025235960000000000000003000252350370726506304646383448000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020000001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C6572030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 678 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E00000000000000000000000000000000010000000100000001809E8A0000000000001F0000000000000000000000000000000001000000010000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000004002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008546172676574203196000000000000000100085461726765742031000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000004004E00000000000000000000000000000000010000000100000001807202000000000400530000000000000000000000000000000001000000010000000180BE010000000004005000000000000000000000000000000000010000000100000000000000054275696C64B7010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2220 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000002001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000000000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F7200000000000000000100000000000000010000000000000000000000010000000000000000000544656275673C020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1366 + 768 + + + + + + 1 + 0 + + 100 + 0 + + Z:\home\jan\tmp\skola\BP\firmware\ident\st10f269.a66 + 22 + 1 + 7 + 1 + + 0 + + + + +
diff --git a/firmware/st10f269/st10f269.uvopt b/firmware/st10f269/st10f269.uvopt new file mode 100755 index 0000000..a2d9a9e --- /dev/null +++ b/firmware/st10f269/st10f269.uvopt @@ -0,0 +1,262 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + Target 1 + 0x2 + 166/167 + + + 40000000 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0xe800 + 0x800 + + + 1 + 0x0 + 0x40000 + + + 0 + 0xc000 + 0x2000 + + + 0 + 0xf600 + 0x800 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\ST\ST10F269_DS.PDF + + + 1 + Programming Manual + DATASHTS\ST\ST10_PM.PDF + + + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + -1 + + + + + + + + + + + + + + + 0 + + + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + + + + + st10f269 + 1 + 0 + 0 + 0 + + 1 + 1 + 2 + 1 + 0 + 0 + 0 + .\st10f269.a66 + st10f269.a66 + 0 + 0 + + + +
diff --git a/firmware/st10f269/st10f269.uvproj b/firmware/st10f269/st10f269.uvproj new file mode 100755 index 0000000..3d2e222 --- /dev/null +++ b/firmware/st10f269/st10f269.uvproj @@ -0,0 +1,314 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x2 + 166/167 + + + ST10F269 + STMicroelectronics + IRAM (0xF600 - 0xFDFF) XRAM (0xC000-0xDFFF) XRAM2(0xE000-0xE7FF) IROM(0-0x3FFFF) ICAN(0xE800-0xEFFF) CLOCK(40000000) MOD167 + + "LIB\START167.A66" ("C16x/ST10 Startup Code") + + 3236 + REGST10F269.H + + + + + + + + + + + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + st10f269 + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + Z:\mnt\shared-ntfs\bin\win\hex2bin.exe Z:\mnt\shared-ntfs\sw\firmware\st10f269\Objects\st10f269.H86 + + 0 + 0 + 2 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + S166.DLL + -cEXTMAC + D167.DLL + -p269 + S166.DLL + -cEXTMAC + T167.DLL + -p269 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + -1 + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + 0 + -1 + + 0 + + + + + + + 0 + + + + 1 + 0 + 6 + 65535 + 65535 + 65535 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 6 + 1 + 0 + 0 + 2 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + + MOD167 + + + + + + + 2 + 0 + + + + + + + + + 1 + 0 + + MOD167 + + + ..\..\firmware\include + + + + 0 + + 0 + 1 + 0 + 2 + 1 + + + + + 2 + + + + + + + + + + + + + st10f269 + + + st10f269.a66 + 2 + .\st10f269.a66 + + + + + + + +
diff --git a/firmware/stage_1/Objects/stage_1.SBR b/firmware/stage_1/Objects/stage_1.SBR new file mode 100755 index 0000000..9c773c8 Binary files /dev/null and b/firmware/stage_1/Objects/stage_1.SBR differ diff --git a/firmware/stage_1/Objects/stage_1.bin b/firmware/stage_1/Objects/stage_1.bin new file mode 100755 index 0000000..817c262 Binary files /dev/null and b/firmware/stage_1/Objects/stage_1.bin differ diff --git a/firmware/stage_1/stage_1.a66 b/firmware/stage_1/stage_1.a66 new file mode 100755 index 0000000..f1b4b60 --- /dev/null +++ b/firmware/stage_1/stage_1.a66 @@ -0,0 +1,43 @@ +$MOD167 +$SEGMENTED + +$INCLUDE (REG167.INC) +$INCLUDE (COMMON.INC) + +NAME FIRMWARE_STAGE_1 +ASSUME DPP3: SYSTEM + +; Firmware prvej urovne - First stage firmware +; +; Musi mat 32 bajtov. Nahra do IRAM kod, pre vykonavanie operacii +; s FLASH pamatou. +; Ten kod je firmware druhej urovne (second stage firmware) +; a moze mat maximalne 1024 bajtov. Bude zavedeny do IRAM na adresu 0xF600. +; Po nahrani do RAM, skoci na adresu 0xF600 a zacne vykonavat second +; stage firmware. +FW_STAGE_1 SECTION CODE AT FW1BASE + +; Typ Task nemoze byt, pretoze nam kompilator kod umiestni na adresu 0000h +MAIN PROC + ; Enable XRAM1 where firmware will be stored + BSET SYSCON.2 ; XPEN = 1 + BSET XPERCON.2 ; XRAM1EN = 1 + ; Load the firmware base address in XRAM1 + MOV R0,#FW2BASE + ; Receive firmware +REC: JNB S0RIC.7,REC ; cakame na bajt zo serioveho rozhrania + MOVB [R0],S0RBUF ; zapiseme ho do RAM + BCLR S0RIC.7 ; zhodime priznak prijatia ramca zo serioveho rozhrania + CMPI1 R0,#FW2END ; najprv sa porovnava, az potom inkrementuje + JMPR CC_ULT,REC + ; Enter the firmware + JMP FW2START +MAIN ENDP + +FW_STAGE_1 ENDS + +FW_S2 SECTION CODE AT FW2BASE +FW2START: +FW_S2 ENDS + +END \ No newline at end of file diff --git a/firmware/stage_1/stage_1.uvgui.jan b/firmware/stage_1/stage_1.uvgui.jan new file mode 100755 index 0000000..a24e09a --- /dev/null +++ b/firmware/stage_1/stage_1.uvgui.jan @@ -0,0 +1,2601 @@ + + + + -5.1 + +
### uVision Project, (C) Keil Software
+ + + + + + 38003 + Registers + 115 184 + + + 346 + Code Coverage + 442 160 + + + 204 + Performance Analyzer + 602 + + + + + + 1506 + Symbols + + 133 133 133 + + + 1936 + Watch 1 + + 133 133 133 + + + 1937 + Watch 2 + + 133 133 133 + + + 1935 + Call Stack + Locals + + 133 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 0 + 3 + + -1 + -1 + + + -1684 + -4 + + + 89 + -1243 + -322 + 869 + + + + 0 + + 381 + 010000000400000001000000010000000100000001000000000000000200000000000000010000000100000000000000280000002800000001000000020000000000000001000000495A3A5C686F6D655C6A616E5C746D705C736B6F6C615C42505C746578745C5553425F464C4153485C7372635C696D706C5C6669726D776172655C6964656E745C6964656E742E61363600000000096964656E742E61363600000000BECEA100FFFFFFFF4F5A3A5C686F6D655C6A616E5C746D705C736B6F6C615C42505C746578745C5553425F464C4153485C7372635C696D706C5C6669726D776172655C73743130663236395C73743130663236392E613636000000000C73743130663236392E61363600000000FFDC7800FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000A9FAFFFF5E00000000000000E8030000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 940100004B000000F8030000B4000000 + + + 16 + A4FBFFFF1A01000008FEFFFF83010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000E1000000F3020000 + + + 16 + 040000001700000094010000A7010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000E1000000F3020000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000E1000000F3020000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000E1000000F3020000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000002703000090060000D5030000 + + + 16 + 04000000170000000002000080000000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000007A010000F8030000FA010000 + + + 16 + 04000000170000000002000080000000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002A03000013040000BC030000 + + + 16 + 04000000170000000002000080000000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 04000000170000000002000080000000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 9701000065000000F50300009B000000 + + + 16 + 04000000170000000002000080000000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 6B02000065000000F503000074010000 + + + 16 + 040000001700000094010000A7010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000065000000E1000000EE020000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002A03000013040000BC030000 + + + 16 + 04000000170000000002000080000000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000002A03000013040000BC030000 + + + 16 + 0400000017000000CF000000BB010000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000094010000F5030000E1010000 + + + 16 + 040000001700000094010000A7010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 882 + 0 + 8192 + 0 + + 16 + 00000000000000007D0300001A000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000D503000090060000E8030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 439 + 0 + 8192 + 1 + + 16 + 000000001A000000C201000034000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 572 + 0 + 8192 + 2 + + 16 + 0000000034000000470200004E000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2619 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFF94010000B4000000F8030000B8000000000000000100000004000000010000000000000000000000FFFFFFFF06000000CB00000057010000CC000000F08B00005A01000079070000FFFF02000B004354616262656450616E650020000000000000A4FBFFFF1A01000008FEFFFF83010000940100004B000000F8030000B40000000000000040280046060000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF640200004B000000680200008D010000000000000200000004000000010000000000000000000000FFFFFFFF17000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C00000180004000000000000078FCFFFF1A01000008FEFFFF5C020000680200004B000000F80300008D0100000000000040410046170000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFE40000004B000000E80000000C0300000100000002000010040000000100000072FEFFFF7D020000FFFFFFFF05000000ED0300006D000000C3000000C4000000739400000180001000000100000010FAFFFF1A010000F4FAFFFFD6030000000000004B000000E40000000C0300000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000076010000F80300007A01000000000000010000000400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0E0000008F070000930700009407000095070000960700009007000091070000B5010000B8010000B9050000BA050000BB050000BC050000CB0900000180008000000000000010FAFFFF4902000008FEFFFFC9020000000000007A010000F8030000FA01000000000000404100460E0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFFC0100007A01000000020000FA01000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF000000000C030000900600001003000001000000010000100400000001000000EDFCFFFF67000000FFFFFFFF04000000C5000000C7000000B4010000779400000180008000000100000010FAFFFFDA03000026FEFFFF9F040000000000001003000090060000D50300000000000040820056040000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2030 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000025235960000000000000003000252350370726506304646383448000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020000001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C6572030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 678 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E00000000000000000000000000000000010000000100000001809E8A0000000000001F0000000000000000000000000000000001000000010000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000004002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA000000000000000000000000000000000000000000000000010000000100000096000000030020500000000008546172676574203196000000000000000100085461726765742031000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000004004E00000000000000000000000000000000010000000100000001807202000000000400530000000000000000000000000000000001000000010000000180BE010000000004005000000000000000000000000000000000010000000100000000000000054275696C64B7010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2220 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000002001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000000000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F7200000000000000000100000000000000010000000000000000000000010000000000000000000544656275673C020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1366 + 768 + + + + 1 + Debug + + -1 + -1 + 1 + 1 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0005000097010000900600001A030000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 1005 + 1005 + 1 + 1 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000AE0100008D01000001030000 + + + 16 + 5A0800001F000000EA090000EA020000 + + + + 109 + 109 + 0 + 1 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000AE0100008D01000049040000 + + + 16 + 5A0800001F000000EA090000EA020000 + + + + 1465 + 1465 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000F302000028010000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000F302000028010000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000F302000028010000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000F302000028010000 + + + + 1506 + 1506 + 1 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 00050000AB010000900600001A030000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 97010000660000008D0600008E010000 + + + 16 + 850000009B000000F302000028010000 + + + + 1935 + 1935 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000150200002B020000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000150200002B020000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000150200002B020000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000F302000028010000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000F302000028010000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000F302000028010000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000F302000028010000 + + + + 195 + 195 + 0 + 1 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000AE0100008D01000049040000 + + + 16 + 5A0800001F000000EA090000EA020000 + + + + 196 + 196 + 0 + 1 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000AE0100008D01000049040000 + + + 16 + 5A0800001F000000EA090000EA020000 + + + + 197 + 197 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000003A020000D904000097020000 + + + 16 + 850000009B000000F302000028010000 + + + + 198 + 198 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000005B020000A2010000D3030000 + + + 16 + 850000009B000000F302000028010000 + + + + 199 + 199 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000D904000097020000 + + + 16 + 850000009B000000F302000028010000 + + + + 203 + 203 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 480300004F00000090060000D3030000 + + + 16 + AC0400002702000058080000A2040000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 97010000660000008D0600008E010000 + + + 16 + 850000009B000000F302000028010000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000F302000028010000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 97010000660000008D0600008E010000 + + + 16 + 850000009B000000F302000028010000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 97010000660000008D0600008E010000 + + + 16 + 850000009B000000F302000028010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 97010000660000008D0600008E010000 + + + 16 + 850000009B000000F302000028010000 + + + + 35885 + 35885 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35886 + 35886 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35887 + 35887 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35888 + 35888 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35889 + 35889 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35890 + 35890 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35891 + 35891 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35892 + 35892 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35893 + 35893 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35894 + 35894 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35895 + 35895 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35896 + 35896 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35897 + 35897 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35898 + 35898 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35899 + 35899 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35900 + 35900 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35901 + 35901 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35902 + 35902 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35903 + 35903 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35904 + 35904 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 35905 + 35905 + 0 + 1 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + 03050000AE0100008D06000049040000 + + + 16 + AB0600001C0000003B080000E7020000 + + + + 38003 + 38003 + 1 + 1 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000AE0100008D01000001030000 + + + 16 + 5A0800001F000000EA090000EA020000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000D904000097020000 + + + 16 + 850000009B000000F302000028010000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000003A020000D904000097020000 + + + 16 + 850000009B0000007D010000D1020000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000150200002B020000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A90100007202000041030000BA030000 + + + 16 + 850000009B000000150200002B020000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 940 + 0 + 8192 + 0 + + 16 + 0000000000000000B70300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000D303000090060000E6030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 0 + 0 + 0 + 0 + 463 + 0 + 8192 + 1 + + 16 + 000000001C000000DA01000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 1 + 0 + 0 + 0 + 612 + 0 + 8192 + 2 + + 16 + 000000001C0000006F02000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2652 + 0000000009000000000000000020000000000000FFFFFFFFFFFFFFFF94010000A701000090060000AB01000000000000010000000400000001000000F9FEFFFFCD010000FFFFFFFF0500000057010000CC000000F08B00005A01000079070000FFFF02000B004354616262656450616E650020000000000000940100006500000090060000BD010000940100004F00000090060000A701000000000000402800460500000014506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFF5701000001000000FFFFFFFF57010000000000000080000001000000FFFFFFFFFFFFFFFF0000000057020000440300005B020000010000000100001004000000010000003AFDFFFF5000000000000000000000000000000001000000C6000000FFFFFFFF0E0000008F070000930700009407000095070000960700009007000091070000B5010000B8010000B9050000BA050000BB050000BC050000CB09000001800080000001000000A60100007102000044030000E9030000A60100005B02000044030000D303000000000000404100560E0000001343616C6C20537461636B202B204C6F63616C73010000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF084D656D6F7279203101000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFF000000000000000001000000000000000100000001000000FFFFFFFFA20100005B020000A6010000D303000001000000020000100400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000000000000FFFFFFFFFFFFFFFF000000001F020000DC04000023020000000000000100000004000000010000000000000000000000FFFFFFFF04000000C5000000C7000000B401000077940000018000800000000000000000000039020000DC040000C60200000000000023020000DC040000B00200000000000040820046040000000C4275696C64204F757470757400000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657300000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF0642726F777365000000007794000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000040000001000000FFFFFFFFFFFFFFFF440300004F00000048030000D303000001000000020000100400000001000000000000000000000000000000000000000000000001000000CB000000000000000000000000000000000000000000000001000000CB00000001000000CB00000002000000FFFF02001200434D756C746950616E654672616D65576E64000100945A0800001F000000EA090000EA02000001000000000000000200000000000000FFFFFFFF05000000ED0300006D000000C3000000C400000073940000018000400000010000005A0800001F000000EA090000EA0200000000000097010000900100001A0300000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73000000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7300000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657300000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273010000007394000001000000FFFFFFFFFFFFFFFF04000000000000000000000000000000000000000000000001000000FFFFFFFFED030000058000010094AB0600001C0000003B080000E702000001000000000000000200000000000000FFFFFFFF17000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000001800040000001000000AB0600001C0000003B080000E70200000005000097010000900600001A0300000000000040410056170000000753796D626F6C7301000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFE20500000000000000000000 + + + 59392 + File + + 2015 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000004000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000004000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE803000000000000000000000000000000000000000000000001000000010000009600000002002050000000000443414C4C960000000000000001000443414C4C00000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000020001001500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000400160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000000180C8880000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E4C010000020001001A0000000F50726F6A6563742057696E646F7773000000000000000000000000010000000100000000000000000000000100000008002880DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002880DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002880E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002880E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000288018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000028800000000000000400FFFFFFFF00000000000000000001000000000000000100000000000000000000000100000000002880D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002880E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65AC030000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 657 + 00200000000000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E00000000000000000000000000000000010000000100000001809E8A0000000000001F0000000000000000000000000000000001000000010000000180D17F0000000000002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050FFFFFFFF00960000000000000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000000240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64CF010000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2220 + 00200000010000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000004002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000004002A00000000000000000000000000000000010000000100000001801C800000000004002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000020001002D0000000000000000000000000000000001000000010000000180F07F0000020001002E0000000000000000000000000000000001000000010000000180E8880000020001003700000000000000000000000000000000010000000100000001803B010000020001002F0000000000000000000000000000000001000000010000000180BB8A00000200010030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000002000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000002001380D88B000000000000310000000757617463682031000000000000000000000000010000000100000000000000000000000100000000001380D98B0000000000003100000007576174636820320000000000000000000000000100000001000000000000000000000001000000000013800F01000002000100320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000084D656D6F72792031000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000084D656D6F72792032000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000084D656D6F72792033000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000084D656D6F727920340000000000000000000000000100000001000000000000000000000001000000000013801001000002000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000755415254202331000000000000000000000000010000000100000000000000000000000100000000001380940700000000000033000000075541525420233200000000000000000000000001000000010000000000000000000000010000000000138095070000000000003300000007554152542023330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000000E49544D2F525441205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000020000003400000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380658A000000000000340000000E4C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E00000014506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000D436F646520436F76657261676500000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720000000000000000010000000000000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720000000000000000010000000000000001000000000000000000000001000000000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000138001890000020000003600000007546F6F6C626F7800000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730000000000000000010000000000000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000010000000000000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F72000000000000000001000000000000000100000000000000000000000100000000000000000005446562756764020000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1680 + 1050 + + + + + + 1 + 0 + + 100 + 0 + + Z:\home\jan\tmp\skola\BP\firmware\ident\stage_1.a66 + 10 + 4 + 38 + 0 + + 0 + + + + +
diff --git a/firmware/stage_1/stage_1.uvopt b/firmware/stage_1/stage_1.uvopt new file mode 100755 index 0000000..29191e8 --- /dev/null +++ b/firmware/stage_1/stage_1.uvopt @@ -0,0 +1,269 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + Target 1 + 0x2 + 166/167 + + + 40000000 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0xe800 + 0x800 + + + 1 + 0x0 + 0x40000 + + + 0 + 0xc000 + 0x2000 + + + 0 + 0xf600 + 0x800 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 1 + 1 + 1 + 0 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 120 + 65 + 8 + .\Listings\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 255 + + + 0 + Data Sheet + DATASHTS\ST\ST10F269_DS.PDF + + + 1 + Programming Manual + DATASHTS\ST\ST10_PM.PDF + + + + 1 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + -1 + + + + + + + + + + + + + + + 0 + DLGD167 + (103=-1,-1,-1,-1,0)(3005=-1,-1,-1,-1,0)(108=-1,-1,-1,-1,0)(3004=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(82=-1,-1,-1,-1,0)(83=-1,-1,-1,-1,0)(84=-1,-1,-1,-1,0)(85=-1,-1,-1,-1,0)(3008=-1,-1,-1,-1,0)(3009=-1,-1,-1,-1,0)(88=-1,-1,-1,-1,0)(89=-1,-1,-1,-1,0)(90=-1,-1,-1,-1,0)(93=-1,-1,-1,-1,0)(94=-1,-1,-1,-1,0)(95=-1,-1,-1,-1,0)(96=-1,-1,-1,-1,0)(97=-1,-1,-1,-1,0)(91=-1,-1,-1,-1,0)(92=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(98=-1,-1,-1,-1,0)(105=-1,-1,-1,-1,0)(104=-1,-1,-1,-1,0)(80=-1,-1,-1,-1,0)(3007=-1,-1,-1,-1,0)(3000=-1,-1,-1,-1,0)(3003=-1,-1,-1,-1,0)(3034=-1,-1,-1,-1,0)(3012=-1,-1,-1,-1,0) + + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + + + + + stage_1 + 1 + 0 + 0 + 0 + + 1 + 1 + 2 + 1 + 0 + 0 + 0 + .\stage_1.a66 + stage_1.a66 + 0 + 0 + + + +
diff --git a/firmware/stage_1/stage_1.uvproj b/firmware/stage_1/stage_1.uvproj new file mode 100755 index 0000000..8e95cad --- /dev/null +++ b/firmware/stage_1/stage_1.uvproj @@ -0,0 +1,314 @@ + + + + 1.1 + +
### uVision Project, (C) Keil Software
+ + + + Target 1 + 0x2 + 166/167 + + + ST10F269 + STMicroelectronics + IRAM (0xF600 - 0xFDFF) XRAM (0xC000-0xDFFF) XRAM2(0xE000-0xE7FF) IROM(0-0x3FFFF) ICAN(0xE800-0xEFFF) CLOCK(40000000) MOD167 + + "LIB\START167.A66" ("C16x/ST10 Startup Code") + + 3236 + REGST10F269.H + + + + + + + + + + + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\Objects\ + stage_1 + 1 + 0 + 1 + 1 + 1 + .\Listings\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 1 + 0 + Z:\mnt\shared-ntfs\bin\win\hex2bin.exe Z:\mnt\shared-ntfs\sw\firmware\stage_1\Objects\stage_1.H86 + + 0 + 0 + 2 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 1 + + + S166.DLL + -cEXTMAC + D167.DLL + -p269 + S166.DLL + -cEXTMAC + T167.DLL + -p269 + + + + 1 + 0 + 0 + 0 + 16 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + + + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + + 0 + -1 + + + + + + + + + + + + + + + + + + + 0 + 0 + 0 + 0 + 0 + -1 + + 0 + + + + + + + 0 + + + + 1 + 0 + 6 + 65535 + 65535 + 65535 + 1 + 0 + 1 + 1 + 1 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + + + 6 + 1 + 0 + 0 + 2 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + + MOD167 + + + + + + + 2 + 0 + + + + + + + + + 1 + 0 + + MOD167 + + + ..\..\firmware\include + + + + 0 + + 0 + 1 + 0 + 2 + 1 + + + + + 2 + + + + + + + + + + + + + stage_1 + + + stage_1.a66 + 2 + .\stage_1.a66 + + + + + + + +
diff --git a/main.cpp b/main.cpp new file mode 100755 index 0000000..2d25318 --- /dev/null +++ b/main.cpp @@ -0,0 +1,219 @@ +#include +#include +#include +#include /* strerror() */ +#include + +#include +#include +#include +#include +#include +#include + +#include "ExitCodes.hpp" +#include "Logger.hpp" +#include "ExitException.hpp" +#include "UserConfig.hpp" +#include "SerialPortFactory.hpp" +#include "SerialPort.hpp" +#include "Mcu.hpp" + +using std::cout; +using std::endl; +using std::string; +using std::ostringstream; +using std::vector; +using std::unique_ptr; + +void opSpeeds(CUserConfig & uc); +void opRead(CUserConfig & uc, CMcu & mcu); +void opErase(CUserConfig & uc, CMcu & mcu); +void opWrite(CUserConfig & uc, CMcu & mcu); + +vector readDataFile(const string fpath); +void writeDataFile(const string fpath, vector data); + +// Global variable to be accessed in signal handler +unique_ptr sp; + +// Uvolnime zdroje pri ukonceni na signal +void +signalHandler(int dummy) +{ + CLogger::info("Exiting on signal"); + sp->close(); + exit(EXIT_MAIN_SIGNAL); +} + +int +main(int argc, char **argv) +{ + // Set signal handler + signal(SIGINT, signalHandler); + + CSerialPortFactory serialPortFactory; + sp = serialPortFactory.getSerialPort(); + + try { + // Parse user command line configuration + CUserConfig uc(argc, argv); + // Configure logging + if (uc.isVerboseModeSet()) + CLogger::setLogInfo(true); + // Execute selected operation + if (uc.isHelpSet()) { + cout << uc.getHelpMessage(string(argv[0])); + } else if (uc.isVersionSet()) { + cout << PROGRAM_NAME << " " << PROGRAM_VERSION << endl; + } else if (uc.isSpeedsSet()) { + opSpeeds(uc); + } else if (uc.isIdentSet() || uc.isEraseSet() || uc.isReadSet() || uc.isWriteSet()) { + // Open serial port + sp->open(uc.getSerialPortName(), uc.getSerialSpeed()); + // Get MCU model + unique_ptr mcu(new CMcu(*sp, uc.getMcuFrequency())); + // Execute requested operation + if (!uc.isIdentSet()) { + if (uc.isReadSet()) + opRead(uc, *mcu); + else if (uc.isEraseSet()) + opErase(uc, *mcu); + else if (uc.isWriteSet()) + opWrite(uc, *mcu); + } else { + cout << mcu->ident() << endl; + } + } else { + CLogger::error("No operation requested. To get help type: " + string(argv[0]) + " help" , EXIT_MAIN_NOOP); + } + + sp->close(); + return 0; + } catch (CExitException & e) { + return e.getReturnValue(); + } +} + +void +opSpeeds(CUserConfig & uc) +{ + + string s = sp->getSpeeds(uc.getSerialPortName()); + cout << "Baudrates supported by serial port " << uc.getSerialPortName() << ":" << endl; + cout << s; +} + +void +opRead(CUserConfig & uc, CMcu & mcu) +{ + CLogger::info("Reading memory"); + + int rl = uc.getReadLength(); + vector r; + + if (rl == -1) + r = mcu.read(uc.isPrintProgressSet()); + else + r = mcu.read(rl, uc.isPrintProgressSet()); + // Write data file musi dostat spravnu hodnotu + writeDataFile(uc.getReadOutputFname(), r); +} + +void +opErase(CUserConfig & uc, CMcu & mcu) +{ + if (uc.getEraseBlockList().size() != 0) { + CLogger::info("Erasing memory by blocks"); + mcu.erase(uc.getEraseBlockList()); + } else { + CLogger::info("Erasing whole memory"); + mcu.erase(); + } +} + +void +opWrite(CUserConfig & uc, CMcu & mcu) +{ + vector data; + + data = readDataFile(uc.getWriteInputFname()); + + if (uc.getWriteEraseWholeMemory()) { + CLogger::info("Erasing whole memory"); + mcu.erase(); + } else { + CLogger::info("Erasing memory by blocks"); + mcu.erase(0, data.size() - 1); + } + + CLogger::info("Writing memory"); + mcu.write(data, uc.isPrintProgressSet()); + + if (uc.getWriteCheckByRead()) { + CLogger::info("Checking result of write operation by reading"); + + vector rdata = mcu.read(data.size()); + for (size_t i = 0; i < data.size(); i++) { + if (rdata[i] != data[i]) + CLogger::error("Write operation unsucessful", EXIT_MAIN_PROG_VERIFY); + } + + CLogger::info("Write operation was successful"); + } +} + + +vector +readDataFile(const string fpath) +{ + FILE *f; + size_t size; +#ifdef UNIX + char mode[3] = "r"; +#else + char mode[3] = "rb"; +#endif + + if ((f = fopen(fpath.c_str(), mode)) == NULL) + CLogger::error("Cannot open file for reading: " + fpath, EXIT_MAIN_FILE_INOUT); + + // Determine file size + fseek(f, 0, SEEK_END); + size = ftell(f); + fseek(f, 0, SEEK_SET); + + vector data; + data.resize(size); + + size_t r = fread(data.data(), sizeof(uint8_t), size, f); + fclose(f); + + if (r != size) + CLogger::error("Cannot read from file: " + fpath, EXIT_MAIN_FILE_INOUT); + + return data; +} + +void +writeDataFile(const string fpath, vector data) +{ + FILE *out; +#ifdef UNIX + char mode[3] = "w"; +#else + char mode[3] = "wb"; +#endif + + if ((out = fopen(fpath.c_str(), mode)) == NULL) { + ostringstream os; + os << "Cannot open file for writing: " << fpath << ": " << strerror(errno); + CLogger::error(os.str(), EXIT_MAIN_FILE_INOUT); + } + + size_t r = fwrite(data.data(), sizeof(uint8_t), data.size(), out); + fclose(out); + + if (r != data.size()) + CLogger::error("Cannot write to file: " + fpath, EXIT_MAIN_FILE_INOUT); +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100755 index 0000000..a457b14 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,41 @@ +set (TestDataDir "${CMAKE_SOURCE_DIR}/tests") + +add_without_config_test (NoOperation "" 1) +add_normal_test (IdentifyMcu "ident" 0) +# Frequency option format. Budeme testovat len format, ostatne nemame +# ako automaticky, pretoze sa to testuje len pri nahravani firmwaru. +add_normal_test (FrequencyFormat1 "ident -f a" 2) +add_normal_test (FrequencyFormat2 "ident -f 2a" 2) +add_normal_test (FrequencyFormat3 "ident -f 2-2" 2) +add_normal_test (FrequencyFormat4 "ident -f 22" 0) +add_normal_test (FrequencyFormat5 "ident -f 22.2" 0) +add_normal_test (FrequencyFormat6 "ident -f 2a2,2" 2) +add_normal_test (FrequencyFormat7 "ident -f 2a2.2" 2) +add_normal_test (FrequencyFormat8 "ident -f -33" 2) +add_normal_test (FrequencyFormat9 "ident -f 0" 2) + +add_normal_test (UnknownOperation "XUnknownOperationX" 2) +add_write_test (MissingInputFile "" 2 "" "") +add_read_test (MissingOutputFile "" 2 "") +add_erase_test (UnknownEraseOption "-?" 2 "" "") +add_read_test (UnknownReadOption "-? read.bin" 2 "") +add_write_test (UnknownWriteOption "-? write.bin" 2 "" "") +add_erase_test (MissingValueForOption1 "-p" 2 "" "") +add_erase_test (MissingValueForOption2 "-s" 2 "" "") +add_erase_test (MissingValueForOption3 "-b" 2 "" "") +add_read_test (ReadOptionFormat "-n -1" 2 "") +add_normal_test (ReadMultipleOutputFilenames "read read.bin read2.bin" 2) +add_normal_test (WriteMultipleInputFilenames "write random.bin random2.bin" 2) +add_read_test (NonExistentSerialPort "-p XNonExistentSerialPortNameX" 7 "read.bin") +add_write_test (CanNotOpenInputFile "" 3 "" "XNonExistentInputFileX") + +# Try to open directory instead of unreadable file +add_normal_test (CanNotOpenOutputFile "read -n 1 SerialPort" 3) +add_erase_test (EraseOptionFormat1 "-b a" 2 "" "") +add_erase_test (EraseOptionFormat2 "-b 1.2" 2 "" "") +add_erase_test (EraseOptionFormat3 "-b 1,a" 2 "" "") +add_erase_test (EraseOptionFormat4 "-b ,1,2" 2 "" "") +add_erase_test (EraseOptionFormat5 "-b 1,2," 2 "" "") +add_erase_test (EraseOptionFormat6 "-b 1,,2" 2 "" "") +add_erase_test (EraseOptionFormat7 "-b -1,2,4,5,-1654" 6 "" "") +add_erase_test (EraseOptionFormat8 "-b 1a" 2 "" "") diff --git a/tests/erase.cmake b/tests/erase.cmake new file mode 100755 index 0000000..1c27cfd --- /dev/null +++ b/tests/erase.cmake @@ -0,0 +1,15 @@ +include (${TestFunctions}) + +if (NOT "${TestFile}" STREQUAL "") + set (WriteArgs "write ${TestConfigOptions} ${TestFile}") + exec_test ("${WriteArgs}" 0) +endif () + +set (TestArgs "erase ${TestConfigOptions} ${TestArgs}") +exec_test ("${TestArgs}" ${TestExitCode}) + +if (NOT "${TestFile}" STREQUAL "" AND NOT "${TestBlessedFile}" STREQUAL "") + set (ReadArgs "read ${TestConfigOptions} erase_read.bin") + exec_test ("${ReadArgs}" 0) + compare_files (erase_read.bin ${TestBlessedFile}) +endif () diff --git a/tests/functions.cmake b/tests/functions.cmake new file mode 100755 index 0000000..e902fa6 --- /dev/null +++ b/tests/functions.cmake @@ -0,0 +1,78 @@ +macro (M_SET_CONFIG_OPTIONS) + if (${SerialPortSpeed}) + set (CONFIG_OPTIONS "${CONFIG_OPTIONS} -s ${SerialPortSpeed}") + endif () + if (${DefaultSerialPortName}) + set (CONFIG_OPTIONS "${CONFIG_OPTIONS} -p ${DefaultSerialPortName}") + endif () + if (NOT "${McuCpuFrequency}" STREQUAL "") + set (CONFIG_OPTIONS "${CONFIG_OPTIONS} -f ${McuCpuFrequency}") + endif () +endmacro () + +macro (M_ADD_TEST SCRIPT) + add_test(NAME ${TestNamespace}${NAME} + CONFIGURATIONS ${TestConfigurations} + COMMAND ${CMAKE_COMMAND} + -DTestFunctions=${CMAKE_SOURCE_DIR}/tests/functions.cmake + -DTestArgs=${ARGS} + -DTestConfigOptions=${CONFIG_OPTIONS} + -DTestExitCode=${EXITCODE} + -DTestBlessedFile=${BLESSEDFILE} + -DTestFile=${FILE} + -P ${SCRIPT} + ) +endmacro () + + +function (ADD_WITHOUT_CONFIG_TEST NAME ARGS EXITCODE) + m_add_test (${CMAKE_SOURCE_DIR}/tests/other_operations.cmake) +endfunction () + +function (ADD_NORMAL_TEST NAME ARGS EXITCODE) + m_set_config_options () + m_add_test (${CMAKE_SOURCE_DIR}/tests/other_operations.cmake) +endfunction () + +function (ADD_ERASE_TEST NAME ARGS EXITCODE BLESSEDFILE FILE) + m_set_config_options () + m_add_test (${CMAKE_SOURCE_DIR}/tests/erase.cmake) +endfunction () + +function (ADD_WRITE_TEST NAME ARGS EXITCODE BLESSEDFILE FILE) + m_set_config_options () + m_add_test (${CMAKE_SOURCE_DIR}/tests/write.cmake) +endfunction () + +function (ADD_READ_TEST NAME ARGS EXITCODE FILE) + m_set_config_options () + m_add_test (${CMAKE_SOURCE_DIR}/tests/read.cmake) +endfunction () + + +# ------------------------------------------------------- + + +function (EXEC_TEST ARGS EXITCODE) + string (REPLACE " " ";" ARGS_LIST "${ARGS}") + execute_process ( + COMMAND ${CMAKE_BINARY_DIR}/main ${ARGS_LIST} + RESULT_VARIABLE MAIN_RESULT + TIMEOUT 120 + ) + if (NOT ${MAIN_RESULT} EQUAL ${EXITCODE}) + message(FATAL_ERROR "Unexpected exit code ${MAIN_RESULT}, expected ${EXITCODE}") + endif() + set (RETVAL ${MAIN_RESULT} PARENT_SCOPE) +endfunction () + + +function(COMPARE_FILES F1 F2) + execute_process ( + COMMAND ${CMAKE_COMMAND} -E compare_files ${F1} ${F2} + RESULT_VARIABLE CMP_RESULT + ) + if(CMP_RESULT) + message(FATAL_ERROR "Files do not match: ${F1} ${F2}") + endif() +endfunction() diff --git a/tests/other_operations.cmake b/tests/other_operations.cmake new file mode 100755 index 0000000..6c47577 --- /dev/null +++ b/tests/other_operations.cmake @@ -0,0 +1,5 @@ +include (${TestFunctions}) + +set (TestArgs "${TestArgs} ${TestConfigOptions}") + +exec_test ("${TestArgs}" ${TestExitCode}) diff --git a/tests/read.cmake b/tests/read.cmake new file mode 100755 index 0000000..4f24101 --- /dev/null +++ b/tests/read.cmake @@ -0,0 +1,12 @@ +include (${TestFunctions}) + +set (TestArgs "read ${TestConfigOptions} ${TestArgs}") +if (NOT "${TestFile}" STREQUAL "") + set (TestArgs "${TestArgs} read.bin") +endif () + +exec_test ("${TestArgs}" ${TestExitCode}) + +if (NOT "${TestFile}" STREQUAL "" AND ${RETVAL} EQUAL 0) + compare_files (read.bin ${TestFile}) +endif () diff --git a/tests/st10f168/CMakeLists.txt b/tests/st10f168/CMakeLists.txt new file mode 100755 index 0000000..aefd7c2 --- /dev/null +++ b/tests/st10f168/CMakeLists.txt @@ -0,0 +1,46 @@ +include (${CMAKE_SOURCE_DIR}/tests/functions.cmake) + +set (TestConfigurations st10f168) +set (SerialPortSpeed 57600) +set (McuCpuFrequency 22.1) +set (TestNamespace 168_) + +add_without_config_test (MissingFrequencyOptionForIdent "ident -s ${SerialPortSpeed}" 0) +add_without_config_test (MissingFrequencyOption "erase -s ${SerialPortSpeed}" 6) + +include (${CMAKE_SOURCE_DIR}/tests/CMakeLists.txt) + +set (TestDataDir "${CMAKE_SOURCE_DIR}/tests/st10f168/erase") + +add_erase_test (EraseWhole "" 0 ${TestDataDir}/ok_ones ${TestDataDir}/zeros) +add_erase_test (EraseBlock0 "-b 0" 0 ${TestDataDir}/ok_b0_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlock1 "-b 1" 0 ${TestDataDir}/ok_b1_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlock2 "-b 2" 0 ${TestDataDir}/ok_b2_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlock3 "-b 3" 0 ${TestDataDir}/ok_b3_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlocks023 "-b 3,0,2" 0 ${TestDataDir}/ok_b023_erased ${TestDataDir}/zeros) + +set (TestDataDir "${CMAKE_SOURCE_DIR}/tests/st10f168/write") + +add_write_test (WriteWhole1 "" 0 ${TestDataDir}/random ${TestDataDir}/random) +add_write_test (WriteZeros "" 0 ${TestDataDir}/zeros ${TestDataDir}/zeros) +add_write_test (Write0B "-e" 6 ${TestDataDir}/ok_ones ${TestDataDir}/0B) +add_write_test (Write1B "" 0 ${TestDataDir}/ok_1B ${TestDataDir}/1B) +# Tests of automatic block erasing +add_write_test (WriteZeros2 "" 0 ${TestDataDir}/zeros ${TestDataDir}/zeros) +add_write_test (Write16K+Progress "-g" 0 ${TestDataDir}/ok_16K ${TestDataDir}/16K) +add_write_test (Write16K_1B "" 0 ${TestDataDir}/ok_16K_1B ${TestDataDir}/16K_1B) +add_write_test (Write64K "" 0 ${TestDataDir}/ok_64K ${TestDataDir}/64K) +add_write_test (Write64K_1B "" 0 ${TestDataDir}/ok_64K_1B ${TestDataDir}/64K_1B) +add_write_test (Write160K "" 0 ${TestDataDir}/ok_160K ${TestDataDir}/160K) +add_write_test (Write160K_1B+Progress "-g" 0 ${TestDataDir}/ok_160K_1B ${TestDataDir}/160K_1B) +# Test of write over size and erasing blocks with mas 0x00 (no block) +add_write_test (Write256K_1B "" 6 ${TestDataDir}/ok_160K_1B ${TestDataDir}/256K_1B) + +set (TestDataDir "${CMAKE_SOURCE_DIR}/tests/st10f168/read") + +add_write_test (ReadWriteRandom "" 0 ${TestDataDir}/random ${TestDataDir}/random) +add_read_test (Read0B "-n 0" 6 "X") +add_read_test (Read256K_1B "-n 262145" 6 "X") +add_read_test (Read1B+Progress "-g -n 1" 0 ${TestDataDir}/ok_1B) +add_read_test (Read100003B "-n 100003" 0 ${TestDataDir}/ok_100003B) +add_read_test (Read262144B+Progress "-g -n 262144" 0 ${TestDataDir}/ok_262144B) diff --git a/tests/st10f168/erase/ok_b023_erased b/tests/st10f168/erase/ok_b023_erased new file mode 100755 index 0000000..d96179f --- /dev/null +++ b/tests/st10f168/erase/ok_b023_erased @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f168/erase/ok_b0_erased b/tests/st10f168/erase/ok_b0_erased new file mode 100755 index 0000000..95e0f78 --- /dev/null +++ b/tests/st10f168/erase/ok_b0_erased @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f168/erase/ok_b1_erased b/tests/st10f168/erase/ok_b1_erased new file mode 100755 index 0000000..7f23cd4 Binary files /dev/null and b/tests/st10f168/erase/ok_b1_erased differ diff --git a/tests/st10f168/erase/ok_b2_erased b/tests/st10f168/erase/ok_b2_erased new file mode 100755 index 0000000..37b9128 Binary files /dev/null and b/tests/st10f168/erase/ok_b2_erased differ diff --git a/tests/st10f168/erase/ok_b3_erased b/tests/st10f168/erase/ok_b3_erased new file mode 100755 index 0000000..252a4b1 Binary files /dev/null and b/tests/st10f168/erase/ok_b3_erased differ diff --git a/tests/st10f168/erase/ok_ones b/tests/st10f168/erase/ok_ones new file mode 100755 index 0000000..7145947 --- /dev/null +++ b/tests/st10f168/erase/ok_ones @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f168/erase/zeros b/tests/st10f168/erase/zeros new file mode 100755 index 0000000..6d23118 Binary files /dev/null and b/tests/st10f168/erase/zeros differ diff --git a/tests/st10f168/read/ok_100003B b/tests/st10f168/read/ok_100003B new file mode 100755 index 0000000..23885fd Binary files /dev/null and b/tests/st10f168/read/ok_100003B differ diff --git a/tests/st10f168/read/ok_1B b/tests/st10f168/read/ok_1B new file mode 100755 index 0000000..080c324 --- /dev/null +++ b/tests/st10f168/read/ok_1B @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f168/read/ok_262144B b/tests/st10f168/read/ok_262144B new file mode 100755 index 0000000..2f8fd38 Binary files /dev/null and b/tests/st10f168/read/ok_262144B differ diff --git a/tests/st10f168/read/random b/tests/st10f168/read/random new file mode 100755 index 0000000..2f8fd38 Binary files /dev/null and b/tests/st10f168/read/random differ diff --git a/tests/st10f168/write/0B b/tests/st10f168/write/0B new file mode 100755 index 0000000..e69de29 diff --git a/tests/st10f168/write/160K b/tests/st10f168/write/160K new file mode 100755 index 0000000..9f1ca19 Binary files /dev/null and b/tests/st10f168/write/160K differ diff --git a/tests/st10f168/write/160K_1B b/tests/st10f168/write/160K_1B new file mode 100755 index 0000000..897a312 Binary files /dev/null and b/tests/st10f168/write/160K_1B differ diff --git a/tests/st10f168/write/16K b/tests/st10f168/write/16K new file mode 100755 index 0000000..8642f9c Binary files /dev/null and b/tests/st10f168/write/16K differ diff --git a/tests/st10f168/write/16K_1B b/tests/st10f168/write/16K_1B new file mode 100755 index 0000000..bd3999a Binary files /dev/null and b/tests/st10f168/write/16K_1B differ diff --git a/tests/st10f168/write/1B b/tests/st10f168/write/1B new file mode 100755 index 0000000..79b7e4b --- /dev/null +++ b/tests/st10f168/write/1B @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f168/write/256K_1B b/tests/st10f168/write/256K_1B new file mode 100755 index 0000000..a17fc91 Binary files /dev/null and b/tests/st10f168/write/256K_1B differ diff --git a/tests/st10f168/write/64K b/tests/st10f168/write/64K new file mode 100755 index 0000000..6121083 Binary files /dev/null and b/tests/st10f168/write/64K differ diff --git a/tests/st10f168/write/64K_1B b/tests/st10f168/write/64K_1B new file mode 100755 index 0000000..c7a82fc Binary files /dev/null and b/tests/st10f168/write/64K_1B differ diff --git a/tests/st10f168/write/ok_160K b/tests/st10f168/write/ok_160K new file mode 100755 index 0000000..45973ac Binary files /dev/null and b/tests/st10f168/write/ok_160K differ diff --git a/tests/st10f168/write/ok_160K_1B b/tests/st10f168/write/ok_160K_1B new file mode 100755 index 0000000..16380d7 Binary files /dev/null and b/tests/st10f168/write/ok_160K_1B differ diff --git a/tests/st10f168/write/ok_16K b/tests/st10f168/write/ok_16K new file mode 100755 index 0000000..045c3b2 Binary files /dev/null and b/tests/st10f168/write/ok_16K differ diff --git a/tests/st10f168/write/ok_16K_1B b/tests/st10f168/write/ok_16K_1B new file mode 100755 index 0000000..6494471 Binary files /dev/null and b/tests/st10f168/write/ok_16K_1B differ diff --git a/tests/st10f168/write/ok_1B b/tests/st10f168/write/ok_1B new file mode 100755 index 0000000..6b839e2 --- /dev/null +++ b/tests/st10f168/write/ok_1B @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f168/write/ok_64K b/tests/st10f168/write/ok_64K new file mode 100755 index 0000000..d27151e Binary files /dev/null and b/tests/st10f168/write/ok_64K differ diff --git a/tests/st10f168/write/ok_64K_1B b/tests/st10f168/write/ok_64K_1B new file mode 100755 index 0000000..7ea0894 Binary files /dev/null and b/tests/st10f168/write/ok_64K_1B differ diff --git a/tests/st10f168/write/ok_ones b/tests/st10f168/write/ok_ones new file mode 100755 index 0000000..7145947 --- /dev/null +++ b/tests/st10f168/write/ok_ones @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f168/write/random b/tests/st10f168/write/random new file mode 100755 index 0000000..c362624 Binary files /dev/null and b/tests/st10f168/write/random differ diff --git a/tests/st10f168/write/zeros b/tests/st10f168/write/zeros new file mode 100755 index 0000000..6d23118 Binary files /dev/null and b/tests/st10f168/write/zeros differ diff --git a/tests/st10f269/CMakeLists.txt b/tests/st10f269/CMakeLists.txt new file mode 100755 index 0000000..677259c --- /dev/null +++ b/tests/st10f269/CMakeLists.txt @@ -0,0 +1,53 @@ +include (${CMAKE_SOURCE_DIR}/tests/functions.cmake) + +set (TestConfigurations st10f269) +set (SerialPortSpeed 230400) +set (TestNamespace 269_) + +include (${CMAKE_SOURCE_DIR}/tests/CMakeLists.txt) + +set (TestDataDir "${CMAKE_SOURCE_DIR}/tests/st10f269/erase") + +add_normal_test (IgnoreFrequencyOpt "ident -f 22.1" 0) + +add_erase_test (EraseWhole "" 0 ${TestDataDir}/ok_ones ${TestDataDir}/zeros) +add_erase_test (EraseBlock0 "-b 0" 0 ${TestDataDir}/ok_b0_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlock1 "-b 1" 0 ${TestDataDir}/ok_b1_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlock2 "-b 2" 0 ${TestDataDir}/ok_b2_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlock3 "-b 3" 0 ${TestDataDir}/ok_b3_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlock4 "-b 4" 0 ${TestDataDir}/ok_b4_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlock5 "-b 5" 0 ${TestDataDir}/ok_b5_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlock6 "-b 6" 0 ${TestDataDir}/ok_b6_erased ${TestDataDir}/zeros) +add_erase_test (EraseBlocks1246 "-b 2,4,1,6" 0 ${TestDataDir}/ok_b1246_erased ${TestDataDir}/zeros) + +set (TestDataDir "${CMAKE_SOURCE_DIR}/tests/st10f269/write") + +add_write_test (WriteWhole1 "" 0 ${TestDataDir}/random ${TestDataDir}/random) +add_write_test (WriteZeros "" 0 ${TestDataDir}/zeros ${TestDataDir}/zeros) +add_write_test (Write0B "-e" 6 ${TestDataDir}/ok_ones ${TestDataDir}/0B) +add_write_test (Write1B "" 0 ${TestDataDir}/ok_1B ${TestDataDir}/1B) +# Tests of automatic block erasing +add_write_test (WriteZeros2 "" 0 ${TestDataDir}/zeros ${TestDataDir}/zeros) +add_write_test (Write16K "" 0 ${TestDataDir}/ok_16K ${TestDataDir}/16K) +add_write_test (Write16K_1B "" 0 ${TestDataDir}/ok_16K_1B ${TestDataDir}/16K_1B) +add_write_test (Write24K "" 0 ${TestDataDir}/ok_24K ${TestDataDir}/24K) +add_write_test (Write24K_1B "" 0 ${TestDataDir}/ok_24K_1B ${TestDataDir}/24K_1B) +add_write_test (Write32K+Progress "-g" 0 ${TestDataDir}/ok_32K ${TestDataDir}/32K) +add_write_test (Write32K_1B "" 0 ${TestDataDir}/ok_32K_1B ${TestDataDir}/32K_1B) +add_write_test (Write64K "" 0 ${TestDataDir}/ok_64K ${TestDataDir}/64K) +add_write_test (Write64K_1B "" 0 ${TestDataDir}/ok_64K_1B ${TestDataDir}/64K_1B) +add_write_test (Write128K "" 0 ${TestDataDir}/ok_128K ${TestDataDir}/128K) +add_write_test (Write128K_1B+Progress "-g" 0 ${TestDataDir}/ok_128K_1B ${TestDataDir}/128K_1B) +add_write_test (Write192K "" 0 ${TestDataDir}/ok_192K ${TestDataDir}/192K) +add_write_test (Write192K_1B "" 0 ${TestDataDir}/ok_192K_1B ${TestDataDir}/192K_1B) +# Test of write over size and erasing blocks with mas 0x00 (no block) +add_write_test (Write256K_1B "" 6 ${TestDataDir}/ok_192K_1B ${TestDataDir}/256K_1B) + +set (TestDataDir "${CMAKE_SOURCE_DIR}/tests/st10f269/read") + +add_write_test (ReadWriteRandom "" 0 ${TestDataDir}/random ${TestDataDir}/random) +add_read_test (Read0B "-n 0" 6 "X") +add_read_test (Read256K_1B "-n 262145" 6 "X") +add_read_test (Read1B+Progress "-g -n 1" 0 ${TestDataDir}/ok_1B) +add_read_test (Read100003B "-n 100003" 0 ${TestDataDir}/ok_100003B) +add_read_test (Read262144B+Progress "-g -n 262144" 0 ${TestDataDir}/ok_262144B) diff --git a/tests/st10f269/erase/ok_b0_erased b/tests/st10f269/erase/ok_b0_erased new file mode 100755 index 0000000..95e0f78 --- /dev/null +++ b/tests/st10f269/erase/ok_b0_erased @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f269/erase/ok_b1246_erased b/tests/st10f269/erase/ok_b1246_erased new file mode 100755 index 0000000..0c7ec6e Binary files /dev/null and b/tests/st10f269/erase/ok_b1246_erased differ diff --git a/tests/st10f269/erase/ok_b1_erased b/tests/st10f269/erase/ok_b1_erased new file mode 100755 index 0000000..d19e238 Binary files /dev/null and b/tests/st10f269/erase/ok_b1_erased differ diff --git a/tests/st10f269/erase/ok_b2_erased b/tests/st10f269/erase/ok_b2_erased new file mode 100755 index 0000000..c6dced9 Binary files /dev/null and b/tests/st10f269/erase/ok_b2_erased differ diff --git a/tests/st10f269/erase/ok_b3_erased b/tests/st10f269/erase/ok_b3_erased new file mode 100755 index 0000000..19fccaf Binary files /dev/null and b/tests/st10f269/erase/ok_b3_erased differ diff --git a/tests/st10f269/erase/ok_b4_erased b/tests/st10f269/erase/ok_b4_erased new file mode 100755 index 0000000..ef74ce9 Binary files /dev/null and b/tests/st10f269/erase/ok_b4_erased differ diff --git a/tests/st10f269/erase/ok_b5_erased b/tests/st10f269/erase/ok_b5_erased new file mode 100755 index 0000000..354977e Binary files /dev/null and b/tests/st10f269/erase/ok_b5_erased differ diff --git a/tests/st10f269/erase/ok_b6_erased b/tests/st10f269/erase/ok_b6_erased new file mode 100755 index 0000000..8299aa6 Binary files /dev/null and b/tests/st10f269/erase/ok_b6_erased differ diff --git a/tests/st10f269/erase/ok_ones b/tests/st10f269/erase/ok_ones new file mode 100755 index 0000000..7145947 --- /dev/null +++ b/tests/st10f269/erase/ok_ones @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f269/erase/zeros b/tests/st10f269/erase/zeros new file mode 100755 index 0000000..6d23118 Binary files /dev/null and b/tests/st10f269/erase/zeros differ diff --git a/tests/st10f269/read/ok_100003B b/tests/st10f269/read/ok_100003B new file mode 100755 index 0000000..23885fd Binary files /dev/null and b/tests/st10f269/read/ok_100003B differ diff --git a/tests/st10f269/read/ok_1B b/tests/st10f269/read/ok_1B new file mode 100755 index 0000000..080c324 --- /dev/null +++ b/tests/st10f269/read/ok_1B @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f269/read/ok_262144B b/tests/st10f269/read/ok_262144B new file mode 100755 index 0000000..2f8fd38 Binary files /dev/null and b/tests/st10f269/read/ok_262144B differ diff --git a/tests/st10f269/read/random b/tests/st10f269/read/random new file mode 100755 index 0000000..2f8fd38 Binary files /dev/null and b/tests/st10f269/read/random differ diff --git a/tests/st10f269/write/0B b/tests/st10f269/write/0B new file mode 100755 index 0000000..e69de29 diff --git a/tests/st10f269/write/128K b/tests/st10f269/write/128K new file mode 100755 index 0000000..296125e Binary files /dev/null and b/tests/st10f269/write/128K differ diff --git a/tests/st10f269/write/128K_1B b/tests/st10f269/write/128K_1B new file mode 100755 index 0000000..c240692 Binary files /dev/null and b/tests/st10f269/write/128K_1B differ diff --git a/tests/st10f269/write/16K b/tests/st10f269/write/16K new file mode 100755 index 0000000..eb86315 Binary files /dev/null and b/tests/st10f269/write/16K differ diff --git a/tests/st10f269/write/16K_1B b/tests/st10f269/write/16K_1B new file mode 100755 index 0000000..3e2e673 Binary files /dev/null and b/tests/st10f269/write/16K_1B differ diff --git a/tests/st10f269/write/192K b/tests/st10f269/write/192K new file mode 100755 index 0000000..aeaad4e Binary files /dev/null and b/tests/st10f269/write/192K differ diff --git a/tests/st10f269/write/192K_1B b/tests/st10f269/write/192K_1B new file mode 100755 index 0000000..6530b32 Binary files /dev/null and b/tests/st10f269/write/192K_1B differ diff --git a/tests/st10f269/write/1B b/tests/st10f269/write/1B new file mode 100755 index 0000000..79b7e4b --- /dev/null +++ b/tests/st10f269/write/1B @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f269/write/24K b/tests/st10f269/write/24K new file mode 100755 index 0000000..085be42 Binary files /dev/null and b/tests/st10f269/write/24K differ diff --git a/tests/st10f269/write/24K_1B b/tests/st10f269/write/24K_1B new file mode 100755 index 0000000..56d5125 Binary files /dev/null and b/tests/st10f269/write/24K_1B differ diff --git a/tests/st10f269/write/256K_1B b/tests/st10f269/write/256K_1B new file mode 100755 index 0000000..a17fc91 Binary files /dev/null and b/tests/st10f269/write/256K_1B differ diff --git a/tests/st10f269/write/32K b/tests/st10f269/write/32K new file mode 100755 index 0000000..bf94e24 Binary files /dev/null and b/tests/st10f269/write/32K differ diff --git a/tests/st10f269/write/32K_1B b/tests/st10f269/write/32K_1B new file mode 100755 index 0000000..29353a3 Binary files /dev/null and b/tests/st10f269/write/32K_1B differ diff --git a/tests/st10f269/write/64K b/tests/st10f269/write/64K new file mode 100755 index 0000000..a658eda Binary files /dev/null and b/tests/st10f269/write/64K differ diff --git a/tests/st10f269/write/64K_1B b/tests/st10f269/write/64K_1B new file mode 100755 index 0000000..8eed060 Binary files /dev/null and b/tests/st10f269/write/64K_1B differ diff --git a/tests/st10f269/write/mod/backup/128K_1B b/tests/st10f269/write/mod/backup/128K_1B new file mode 100755 index 0000000..492a243 Binary files /dev/null and b/tests/st10f269/write/mod/backup/128K_1B differ diff --git a/tests/st10f269/write/mod/backup/16K_1B b/tests/st10f269/write/mod/backup/16K_1B new file mode 100755 index 0000000..7e46f7f Binary files /dev/null and b/tests/st10f269/write/mod/backup/16K_1B differ diff --git a/tests/st10f269/write/mod/backup/192K_1B b/tests/st10f269/write/mod/backup/192K_1B new file mode 100755 index 0000000..def4d66 Binary files /dev/null and b/tests/st10f269/write/mod/backup/192K_1B differ diff --git a/tests/st10f269/write/mod/backup/24K_1B b/tests/st10f269/write/mod/backup/24K_1B new file mode 100755 index 0000000..4dcd1ad Binary files /dev/null and b/tests/st10f269/write/mod/backup/24K_1B differ diff --git a/tests/st10f269/write/mod/backup/32K_1B b/tests/st10f269/write/mod/backup/32K_1B new file mode 100755 index 0000000..65d9f6d Binary files /dev/null and b/tests/st10f269/write/mod/backup/32K_1B differ diff --git a/tests/st10f269/write/mod/backup/64K_1B b/tests/st10f269/write/mod/backup/64K_1B new file mode 100755 index 0000000..1a1e997 Binary files /dev/null and b/tests/st10f269/write/mod/backup/64K_1B differ diff --git a/tests/st10f269/write/mod/ok/ok_128K_1B b/tests/st10f269/write/mod/ok/ok_128K_1B new file mode 100755 index 0000000..2e6b6e5 Binary files /dev/null and b/tests/st10f269/write/mod/ok/ok_128K_1B differ diff --git a/tests/st10f269/write/mod/ok/ok_16K_1B b/tests/st10f269/write/mod/ok/ok_16K_1B new file mode 100755 index 0000000..af32479 Binary files /dev/null and b/tests/st10f269/write/mod/ok/ok_16K_1B differ diff --git a/tests/st10f269/write/mod/ok/ok_192K_1B b/tests/st10f269/write/mod/ok/ok_192K_1B new file mode 100755 index 0000000..f732165 Binary files /dev/null and b/tests/st10f269/write/mod/ok/ok_192K_1B differ diff --git a/tests/st10f269/write/mod/ok/ok_24K_1B b/tests/st10f269/write/mod/ok/ok_24K_1B new file mode 100755 index 0000000..883e4d5 Binary files /dev/null and b/tests/st10f269/write/mod/ok/ok_24K_1B differ diff --git a/tests/st10f269/write/mod/ok/ok_32K_1B b/tests/st10f269/write/mod/ok/ok_32K_1B new file mode 100755 index 0000000..a6415e4 Binary files /dev/null and b/tests/st10f269/write/mod/ok/ok_32K_1B differ diff --git a/tests/st10f269/write/mod/ok/ok_64K_1B b/tests/st10f269/write/mod/ok/ok_64K_1B new file mode 100755 index 0000000..e7f7433 Binary files /dev/null and b/tests/st10f269/write/mod/ok/ok_64K_1B differ diff --git a/tests/st10f269/write/mod/r.bin b/tests/st10f269/write/mod/r.bin new file mode 100755 index 0000000..0a11c71 Binary files /dev/null and b/tests/st10f269/write/mod/r.bin differ diff --git a/tests/st10f269/write/ok_128K b/tests/st10f269/write/ok_128K new file mode 100755 index 0000000..4b32c68 Binary files /dev/null and b/tests/st10f269/write/ok_128K differ diff --git a/tests/st10f269/write/ok_128K_1B b/tests/st10f269/write/ok_128K_1B new file mode 100755 index 0000000..2e6b6e5 Binary files /dev/null and b/tests/st10f269/write/ok_128K_1B differ diff --git a/tests/st10f269/write/ok_16K b/tests/st10f269/write/ok_16K new file mode 100755 index 0000000..247e716 Binary files /dev/null and b/tests/st10f269/write/ok_16K differ diff --git a/tests/st10f269/write/ok_16K_1B b/tests/st10f269/write/ok_16K_1B new file mode 100755 index 0000000..af32479 Binary files /dev/null and b/tests/st10f269/write/ok_16K_1B differ diff --git a/tests/st10f269/write/ok_192K b/tests/st10f269/write/ok_192K new file mode 100755 index 0000000..fcd454b Binary files /dev/null and b/tests/st10f269/write/ok_192K differ diff --git a/tests/st10f269/write/ok_192K_1B b/tests/st10f269/write/ok_192K_1B new file mode 100755 index 0000000..f732165 Binary files /dev/null and b/tests/st10f269/write/ok_192K_1B differ diff --git a/tests/st10f269/write/ok_1B b/tests/st10f269/write/ok_1B new file mode 100755 index 0000000..6b839e2 --- /dev/null +++ b/tests/st10f269/write/ok_1B @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f269/write/ok_24K b/tests/st10f269/write/ok_24K new file mode 100755 index 0000000..96bf91e Binary files /dev/null and b/tests/st10f269/write/ok_24K differ diff --git a/tests/st10f269/write/ok_24K_1B b/tests/st10f269/write/ok_24K_1B new file mode 100755 index 0000000..883e4d5 Binary files /dev/null and b/tests/st10f269/write/ok_24K_1B differ diff --git a/tests/st10f269/write/ok_32K b/tests/st10f269/write/ok_32K new file mode 100755 index 0000000..acec7cb Binary files /dev/null and b/tests/st10f269/write/ok_32K differ diff --git a/tests/st10f269/write/ok_32K_1B b/tests/st10f269/write/ok_32K_1B new file mode 100755 index 0000000..a6415e4 Binary files /dev/null and b/tests/st10f269/write/ok_32K_1B differ diff --git a/tests/st10f269/write/ok_64K b/tests/st10f269/write/ok_64K new file mode 100755 index 0000000..a8453c3 Binary files /dev/null and b/tests/st10f269/write/ok_64K differ diff --git a/tests/st10f269/write/ok_64K_1B b/tests/st10f269/write/ok_64K_1B new file mode 100755 index 0000000..e7f7433 Binary files /dev/null and b/tests/st10f269/write/ok_64K_1B differ diff --git a/tests/st10f269/write/ok_ones b/tests/st10f269/write/ok_ones new file mode 100755 index 0000000..7145947 --- /dev/null +++ b/tests/st10f269/write/ok_ones @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/st10f269/write/random b/tests/st10f269/write/random new file mode 100755 index 0000000..c362624 Binary files /dev/null and b/tests/st10f269/write/random differ diff --git a/tests/st10f269/write/zeros b/tests/st10f269/write/zeros new file mode 100755 index 0000000..6d23118 Binary files /dev/null and b/tests/st10f269/write/zeros differ diff --git a/tests/write.cmake b/tests/write.cmake new file mode 100755 index 0000000..0a164f5 --- /dev/null +++ b/tests/write.cmake @@ -0,0 +1,11 @@ +include (${TestFunctions}) + +set (TestArgs "write ${TestConfigOptions} ${TestArgs} ${TestFile}") +set (ReadArgs "read ${TestConfigOptions} write_read.bin") + +exec_test ("${TestArgs}" ${TestExitCode}) + +if (NOT "${TestFile}" STREQUAL "" AND NOT "${TestBlessedFile}" STREQUAL "") + exec_test ("${ReadArgs}" 0) + compare_files (write_read.bin ${TestBlessedFile}) +endif () diff --git a/utils/xd/CMakeLists.txt b/utils/xd/CMakeLists.txt new file mode 100755 index 0000000..83a6de9 --- /dev/null +++ b/utils/xd/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required (VERSION 3.3) +project (xd) + +add_compile_options (-Wall -Werror -pedantic -g) +add_executable (xd xd.c) diff --git a/utils/xd/xd.c b/utils/xd/xd.c new file mode 100755 index 0000000..5089e30 --- /dev/null +++ b/utils/xd/xd.c @@ -0,0 +1,542 @@ +/* + + Extended dump and load utility + + by John Walker + http://www.fourmilab.ch/ + + This program is in the public domain. + +*/ + +#define Version \ + "1.3 -- September 2000" + + +#include +#include +#include +#ifdef _WIN32 +#include +#include +#endif + +#define FALSE 0 +#define TRUE 1 +#define UPPERCASE_LABEL_LENGTH 128 + +#define EOS '\0' + +static char addrformat[80] = "%6X"; +static char scanaddr[80] = "%lx%c"; + +static char dataformat1[80] = "%02X"; +static char scandata[80] = "%x%n%c"; + +static int bytesperline = 16, doublechar = FALSE, + dflen = 2, loading = FALSE, streaming = FALSE; +static unsigned long fileaddr; +static unsigned char lineecho[32]; + +/* OUTLINE -- Edit a line of binary data into the selected output + format. */ + +static void outline(out, dat, len) + FILE *out; + unsigned char *dat; + int len; +{ + char oline[132]; + int i; + + sprintf(oline, addrformat, fileaddr); + strcat(oline, ":"); + for (i = 0; i < len; i++) { + char outedit[80]; + + sprintf(outedit, dataformat1, dat[i]); + strcat(oline, (i == (bytesperline / 2)) ? " " : " "); + strcat(oline, outedit); + } + + if (doublechar) { + char oc[2]; + int shortfall = ((bytesperline - len) * (dflen + 1)) + + (len <= (bytesperline / 2) ? 1 : 0); + + while (shortfall-- > 0) { + strcat(oline, " "); + } + oc[1] = EOS; + strcat(oline, " | "); + for (i = 0; i < len; i++) { + int b = dat[i]; + + /* Map non-printing characters to "." according to the + definitions for ISO 8859/1 Latin-1. */ + + if ((b < ' ') || (b > '~' && b < 160)) { + b = '.'; + } + + /* Many existing systems which support Latin-1 lack + a definition for character 160, the non-breaking + space. Translate this to a space to avoid + confusion. */ + + if (b == 160) { + b = ' '; + } + oc[0] = (char) b; + strcat(oline, oc); + } + } + strcat(oline, "\n"); + fputs(oline, out); +} + +/* INTERPLINE -- Interpret a line of input. */ + +static int interpline(line, lineno, out) + char *line; + int lineno; + FILE *out; +{ + char *cp = line; + char c; + unsigned long lfaddr; + int gfaddr = FALSE; + + /* Scan the line for a possible alternative format information + following a vertical bar and delete it. */ + + while ((c = *cp++) != EOS) { + if (c == '|') { + cp[-1] = EOS; + break; + } + } + + /* Scan the line for a file address terminated by a colon. Save + the file address. */ + + cp = line; + + while ((c = *cp++) != EOS) { + if (c == ':') { + int sa; + char tchar; + + cp[-1] = EOS; + sa = sscanf(line, scanaddr, &lfaddr, &tchar); + if (sa == 0 || (sa > 1 && tchar != EOS)) { + fprintf(stderr, + "Bad file address \"%s\" on line %d:\n", + line, lineno); + return FALSE; + } + gfaddr = TRUE; + cp[-1] = ':'; + break; + } + } + if (!gfaddr) { + cp = line; + } + if (!streaming) { + if (!gfaddr) { + fprintf(stderr, "File address missing on line %d:\n", lineno); + fprintf(stderr, "%s\n", line); + return FALSE; + } + if (lfaddr != fileaddr) { + fprintf(stderr, "File address sequence error on line %d.\n", + lineno); + fprintf(stderr, " Expected "); + fprintf(stderr, addrformat, fileaddr); + fprintf(stderr, ", received "); + fprintf(stderr, addrformat, lfaddr); + fprintf(stderr, ".\n"); + fprintf(stderr, "%s\n", line); + return FALSE; + } + } + + while ((c = *cp++) != EOS) { + if (!isspace(c)) { + int scanl, nscan, dvalue; + char termchar; + + if (((scanl = sscanf(cp - 1, scandata, &dvalue, &nscan, &termchar)) == 0) || + (dvalue < 0) || (dvalue > 255) || + (scanl == 2 && !isspace(termchar))) { + fprintf(stderr, "Improper value, \"%s\" on line %d:\n", + cp - 1, lineno); + fprintf(stderr, "%s\n", line); + fprintf(stderr, "Bytes must be specified as digits separated by white space.\n"); + return FALSE; + } + putc((char) dvalue, out); + fileaddr++; + cp += nscan; + } + } + return TRUE; +} + +void +start_header(FILE *out, char *label, char *cppNameSpace) +{ + int i, j; + char uppercase_label[UPPERCASE_LABEL_LENGTH]; + /* Uppercase label plus "_HPP" */ + char include_guard_label[UPPERCASE_LABEL_LENGTH + 4]; + + if (cppNameSpace[0] == EOS) + cppNameSpace = "UnknownNameSpace"; + + /* Construct upper case label from -d option argument. */ + for (i = strlen(label), j = 0; (j < UPPERCASE_LABEL_LENGTH) && \ + (i >= 0); i--, j++) { + uppercase_label[j] = isalpha(label[j]) ? toupper(label[j]) : label[j]; + } + if (j >= UPPERCASE_LABEL_LENGTH) + j--; + uppercase_label[j] = '\0'; + /* Construct include guard label */ + i = strlen(uppercase_label); + strcpy(include_guard_label, uppercase_label); + strcpy(include_guard_label + i, "_HPP"); + /* Print include guard to the output */ + fprintf(out, "#ifndef %s\n", include_guard_label); + fprintf(out, "#define %s 1\n\n", include_guard_label); + /* Start namespace */ + fprintf(out, "namespace %s {\n\n", cppNameSpace); +} + +void +end_header(FILE *out) +{ + fprintf(out, "}\n\n"); + fprintf(out, "#endif\n"); +} + +/* Main program */ + +int main(argc, argv) + int argc; char *argv[]; +{ + int i, b, bp, cdata = FALSE, tdata = FALSE, f = 0; + char *cp, *clabel, *tlabel, *cppNameSpace, opt; + FILE *in = stdin, *out = stdout; + + if (argc > 1) { + i = strlen(argv[1]); + clabel = argv[1] + i; + tlabel = cppNameSpace = clabel; + } + + for (i = 1; i < argc; i++) { + cp = argv[i]; + if (*cp == '-') { + opt = *(++cp); + if (islower(opt)) { + opt = (char) toupper(opt); + } + switch (opt) { + + case 'A': /* -Af -- Set address format */ + opt = cp[1]; + if (islower(opt)) { + opt = (char) toupper(opt); + } + switch (opt) { + case 'D': + strcpy(addrformat, "%8d"); + strcpy(scanaddr, "%ld%c"); + break; + + case 'H': + case 'X': + strcpy(addrformat, "%6X"); + strcpy(scanaddr, "%lx%c"); + break; + + case 'O': + strcpy(addrformat, "%8o"); + strcpy(scanaddr, "%lo%c"); + break; + + default: + fprintf(stderr, + "Invalid address format '%c'. Must be D, H, or O.\n", cp[1]); + return 2; + } + break; + + case 'C': + doublechar = TRUE; + break; + + case 'D': + cdata = TRUE; + clabel = cp + 1; + break; + + case 'T': + tdata = TRUE; + tlabel = cp + 1; + break; + + case 'P': + cppNameSpace = cp + 1; + break; + + case 'L': + loading = TRUE; + break; + + case 'N': /* -Nf -- Set numeric dump format */ + opt = cp[1]; + if (islower(opt)) { + opt = (char) toupper(opt); + } + switch (opt) { + case 'D': + strcpy(dataformat1, "%3d"); + strcpy(scandata, "%d%n%c"); + break; + + case 'H': + case 'X': + strcpy(dataformat1, "%02X"); + strcpy(scandata, "%x%n%c"); + break; + + case 'O': + strcpy(dataformat1, "%03o"); + strcpy(scandata, "%o%n%c"); + break; + + default: + fprintf(stderr, + "Invalid numeric dump format '%c'. Must be D, H, or O.\n", cp[1]); + return 2; + } + break; + + case 'S': + streaming = TRUE; + break; + + case '?': + case 'H': + case 'U': + fprintf(stderr, "XD -- Extended dump. Call with xd [input [output]]\n"); + fprintf(stderr, "\n"); + fprintf(stderr, " Options:\n"); + fprintf(stderr, " -af Print addresses in f = Decimal, Hex, or Octal\n"); + fprintf(stderr, " -c Dump as ISO characters\n"); + fprintf(stderr, " -dlabel Dump as a C++ header file data declaration\n"); + fprintf(stderr, " -tlabel Dump as a C++ header containing C++ function that\n"); + fprintf(stderr, " receives string argument and returns string. Each\n"); + fprintf(stderr, " line of input file is scanned for a string %%ARG%% which\n"); + fprintf(stderr, " will be replaced by the function argument. String returned"); + fprintf(stderr, " holds text content of the input file."); + fprintf(stderr, " -pname Name of C++ namespace of header file content\n"); + fprintf(stderr, " -l Load file from hex dump\n"); + fprintf(stderr, " -nf Numeric dump in f = Decimal, Hex, or Octal\n"); + fprintf(stderr, " -s Stream load (don't check file addresses)\n"); + fprintf(stderr, " -u Print this message\n"); + fprintf(stderr, "\nBy John Walker, http://www.fourmilab.ch/\n"); + fprintf(stderr, "\nModified by Jan Sucan, \n"); + fprintf(stderr,"Version %s_mod\n", Version); + return 0; + } + } else { + switch (f) { + case 0: + + /** Warning! On systems which distinguish text mode and + binary I/O (MS-DOS, Macintosh, etc.) the modes in these + open statements will have to be made conditional based + upon whether an encode or decode is being done, which + will have to be specified earlier. But it's worse: if + input or output is from standard input or output, the + mode will have to be changed on the fly, which is + generally system and compiler dependent. 'Twasn't me + who couldn't conform to Unix CR/LF convention, so + don't ask me to write the code to work around + Apple and Microsoft's incompatible standards. + + This file contains code, conditional on _WIN32, which + sets binary mode using the method prescribed by + Microsoft Visual C 1.52 ("Monkey C"); this may + require modification if you're using a different + compiler or release of Monkey C. */ + + if ((in = fopen(cp, loading ? "r" : "rb")) == NULL) { + fprintf(stderr, "Cannot open input file %s\n", cp); + return 2; + } + f++; + break; + + case 1: + if ((out = fopen(cp, loading ? "wb" : "w")) == NULL) { + fprintf(stderr, "Cannot open output file %s\n", cp); + return 2; + } + f++; + break; + + default: + fprintf(stderr, "Too many file names specified.\n"); + } + } + } + +#ifdef _WIN32 + + /* If input is from standard input and we aren't loading + from a dump file, set the input file mode to binary. */ + + if ((in == stdin) && (!loading)) { + _setmode(_fileno(in), _O_BINARY); + } + + /* If output is to standard output and we're loading a + binary file from a dump, set the output file mode to + binary. */ + + if ((out == stdout) && (loading)) { + _setmode(_fileno(out), _O_BINARY); + } +#endif + + bp = 0; + fileaddr = 0; + + if (loading) { + char in_line[256]; + int lineno = 0; + + while (fgets(in_line, (sizeof in_line) - 2, in)) { + lineno++; + if (!interpline(in_line, lineno, out)) { + fclose(out); + return 2; + } + } + } else { + if (cdata) { + char cout[80]; + int byte_count = 0; + char *label = (clabel[0] == EOS) ? "xd_data" : clabel; + + start_header (out, label, cppNameSpace); + + fprintf(out, "uint8_t %s[] = {\n", label); + strcpy(cout, " "); + + while ((b = getc(in)) != EOF) { + if (strlen(cout) > 72) { + fprintf(out, "%s\n", cout); + strcpy(cout, " "); + } + sprintf(cout + strlen(cout), "%d,", b); + byte_count++; + } + if (strlen(cout) > 4) { + cout[strlen(cout) - 1] = EOS; /* Strip trailing comma */ + fprintf(out, "%s\n", cout); + } + fprintf(out, "};\n\n"); + fprintf(out, "const size_t %s_length = %d;\n\n", label, byte_count); + /* Close namespace */ + end_header(out); + fclose(out); + } else if (tdata) { + int b, c; + char *label = (tlabel[0] == EOS) ? "xd_text" : tlabel; + int lineStarted = FALSE; + int buf_i = 0; + char buf[6]; /* Buffer for scanning for %ARG% string */ + + start_header (out, label, cppNameSpace); + + fprintf(out, "std::string\n"); + fprintf(out, "getText(const std::string & arg)\n"); + fprintf(out, "{\n"); + fprintf(out, " std::ostringstream os;\n\n"); + + while ((b = getc(in)) != EOF) { + if (!lineStarted) { + fprintf(out, " os << \""); + lineStarted = TRUE; + } + + if ((b != '\r') && (b != '\n')) { + /* Printable character */ + if ((b == '%') && (buf_i == 0)) { + buf[buf_i++] = b; + } else if ((b == '%') && (buf_i >= 4)) { + buf[buf_i] = '\0'; + if (!strcmp(buf, "%ARG")) { + /* We have %ARG% string on the line */ + fprintf(out, "\" << arg << \""); + } else { + /* We do not have the string */ + fprintf(out, "%s%c", buf, b); + } + buf_i = 0; + } else if (buf_i > 0) { + buf[buf_i++] = b; + if (buf_i >= 5) { + buf[buf_i] = '\0'; + fprintf(out, "%s", buf); + buf_i = 0; + } + } else { + fprintf(out, "%c", b); + } + } else { + /* End of line on first occurence of CR or LF */ + if (buf_i > 0) { + buf[buf_i] = '\0'; + fprintf(out, "%s", buf); + buf_i = 0; + } + fprintf(out, "\" << std::endl;\n"); + c = getc(in); + if (!((b == '\r') && (c == '\n')) && !((b == '\n') && (c == '\r'))) + ungetc(c, in); + lineStarted = FALSE; + } + } + /* Empty buffer, if there are some cached characters */ + if (buf_i > 0) { + buf[buf_i] = '\0'; + fprintf(out, "%s", buf); + } + fprintf(out, "\n return os.str();\n}\n\n"); + /* Close namespace */ + end_header(out); + fclose(out); + } else { + while ((b = getc(in)) != EOF) { + if (bp >= bytesperline) { + outline(out, lineecho, bp); + bp = 0; + fileaddr += bytesperline; + } + lineecho[bp++] = (char) b; + } + + if (bp > 0) { + outline(out, lineecho, bp); + } + } + } + return 0; +} -- cgit v1.2.3