diff --git a/.travis.yml b/.travis.yml index 53af9c24..0c75d2be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,27 +11,33 @@ notifications: - "Change view : %{compare_url}" - "Build details : %{build_url}" # TODO: The "build_number.1" in this URL is almost certainly wrong, but correct value not available from Travis? - - "Firmware download : https://portapack-h1-builds.s3.amazonaws.com/%{repository_slug}/%{build_number}/%{build_number}.1/firmware/portapack-h1-firmware-%{commit}.tar.bz2" + - "Firmware download : https://portapack-h1-builds.s3.amazonaws.com/%{repository_slug}/%{build_number}/%{build_number}.1/build/firmware/portapack-h1-firmware-%{commit}.tar.bz2" before_script: - - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2016-q1-update/+download/gcc-arm-none-eabi-5_3-2016q1-20160330-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 + - wget https://launchpad.net/gcc-arm-embedded/5.0/5-2016-q2-update/+download/gcc-arm-none-eabi-5_4-2016q2-20160622-linux.tar.bz2 -O /tmp/gcc-arm.tar.bz2 - tar -xf /tmp/gcc-arm.tar.bz2 - - export PATH=$PWD/gcc-arm-none-eabi-5_3-2016q1/bin:$PATH + - export PATH=$PWD/gcc-arm-none-eabi-5_4-2016q2/bin:$PATH - export CC="arm-none-eabi-gcc" - export CXX="arm-none-eabi-g++" script: # TODO: Introduce top-level Makefile, this is lame. - - pushd firmware/ + - mkdir build/ + - pushd build/ + - cmake .. - make release - popd addons: - apt_packages: - - lib32bz2-1.0 - - lib32ncurses5 - - lib32z1 + apt: + packages: + - lib32bz2-1.0 + - lib32ncurses5 + - lib32z1 + - cmake + sources: + - kalakris-cmake artifacts: paths: - - $(ls firmware/portapack-h1-firmware-*.tar.bz2 | tr "\n" ":") - - $(ls firmware/portapack-h1-firmware-*.zip | tr "\n" ":") + - $(ls build/firmware/portapack-h1-firmware-*.tar.bz2 | tr "\n" ":") + - $(ls build/firmware/portapack-h1-firmware-*.zip | tr "\n" ":") diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..371e26d3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,43 @@ +# Copyright 2016 Jared Boone +# +# This file is part of PortaPack. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +cmake_minimum_required(VERSION 2.8.9) +set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/firmware/toolchain-arm-cortex-m.cmake) + +project(portapack-h1) + +execute_process( + COMMAND git log -n 1 --format=%h + WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR} + RESULT_VARIABLE GIT_REVISION_FOUND + ERROR_QUIET + OUTPUT_VARIABLE GIT_REVISION + OUTPUT_STRIP_TRAILING_WHITESPACE +) +if (GIT_REVISION_FOUND) + set(VERSION "unknown") +else (GIT_REVISION_FOUND) + set(VERSION ${GIT_REVISION}) +endif (GIT_REVISION_FOUND) + +set(LICENSE_PATH ${CMAKE_CURRENT_LIST_DIR}/LICENSE) +set(HARDWARE_PATH ${CMAKE_CURRENT_LIST_DIR}/hardware) + +add_subdirectory(firmware) diff --git a/firmware/CMakeLists.txt b/firmware/CMakeLists.txt new file mode 100644 index 00000000..9a7bb2d1 --- /dev/null +++ b/firmware/CMakeLists.txt @@ -0,0 +1,83 @@ +# Copyright 2016 Jared Boone +# +# This file is part of PortaPack. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +project(firmware) + +set(COMMON ${PROJECT_SOURCE_DIR}/common) +set(CHIBIOS ${PROJECT_SOURCE_DIR}/chibios) +set(CHIBIOS_PORTAPACK ${PROJECT_SOURCE_DIR}/chibios-portapack) + +set(HACKRF_FIRMWARE_FILENAME hackrf_one_usb_ram.dfu) +set(HACKRF_FIRMWARE_IMAGE ${PROJECT_SOURCE_DIR}/${HACKRF_FIRMWARE_FILENAME}) + +set(HACKRF_CPLD_SVF_FILENAME hackrf_cpld_default.svf) +set(HACKRF_CPLD_SVF_PATH ${PROJECT_SOURCE_DIR}/${HACKRF_CPLD_SVF_FILENAME}) + +set(EXTRACT_CPLD_DATA ${PROJECT_SOURCE_DIR}/tools/extract_cpld_data.py) +set(EXTRACT_SVF_DATA_XC2C64A ${PROJECT_SOURCE_DIR}/tools/extract_svf_data_xc2c64a.py) +set(STRIP_DFU ${PROJECT_SOURCE_DIR}/tools/strip_dfu.py) +set(MAKE_SPI_IMAGE ${PROJECT_SOURCE_DIR}/tools/make_spi_image.py) +set(MAKE_IMAGE_CHUNK ${PROJECT_SOURCE_DIR}/tools/make_image_chunk.py) + +set(FIRMWARE_NAME portapack-h1-firmware) +set(FIRMWARE_FILENAME ${FIRMWARE_NAME}.bin) + +add_subdirectory(application) +add_subdirectory(baseband) +add_subdirectory(bootstrap) + +# NOTE: Dependencies break if the .bin files aren't included in DEPENDS. WTF, CMake? +add_custom_command( + OUTPUT ${FIRMWARE_FILENAME} + COMMAND ${MAKE_SPI_IMAGE} ${bootstrap_BINARY_DIR}/bootstrap.bin ${baseband_BINARY_DIR}/baseband.img ${application_BINARY_DIR}/application.bin ${FIRMWARE_FILENAME} + DEPENDS bootstrap baseband application ${MAKE_SPI_IMAGE} + ${bootstrap_BINARY_DIR}/bootstrap.bin ${baseband_BINARY_DIR}/baseband.img ${application_BINARY_DIR}/application.bin + VERBATIM +) + +add_custom_target( + firmware + DEPENDS ${FIRMWARE_FILENAME} +) + +add_custom_target( + program + COMMAND dfu-util --device 1fc9:000c --download ${HACKRF_FIRMWARE_IMAGE} --reset + COMMAND sleep 1s + COMMAND hackrf_spiflash -w ${FIRMWARE_FILENAME} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${FIRMWARE_FILENAME} +) + +# TODO: Bad hack to fix location of LICENSE file for tar. +add_custom_command( + OUTPUT ${FIRMWARE_NAME}-${GIT_REVISION}.tar.bz2 ${FIRMWARE_NAME}-${GIT_REVISION}.zip + COMMAND cp ${LICENSE_PATH} LICENSE + COMMAND cp ${HACKRF_FIRMWARE_IMAGE} ${HACKRF_FIRMWARE_FILENAME} + COMMAND tar -c -j -f ${FIRMWARE_NAME}-${GIT_REVISION}.tar.bz2 ${FIRMWARE_FILENAME} ${HACKRF_FIRMWARE_FILENAME} LICENSE + COMMAND zip -9 -q ${FIRMWARE_NAME}-${GIT_REVISION}.zip ${FIRMWARE_FILENAME} ${HACKRF_FIRMWARE_FILENAME} LICENSE + COMMAND rm -f LICENSE ${HACKRF_FIRMWARE_FILENAME} + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${FIRMWARE_FILENAME} ${LICENSE_PATH} ${HACKRF_FIRMWARE_IMAGE} + VERBATIM +) + +add_custom_target( + release + DEPENDS ${FIRMWARE_NAME}-${GIT_REVISION}.tar.bz2 ${FIRMWARE_NAME}-${GIT_REVISION}.zip +) diff --git a/firmware/application/CMakeLists.txt b/firmware/application/CMakeLists.txt new file mode 100644 index 00000000..f4190523 --- /dev/null +++ b/firmware/application/CMakeLists.txt @@ -0,0 +1,334 @@ +# +# Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. +# +# This file is part of PortaPack. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +############################################################################## +# Build global options +# NOTE: Can be overridden externally. +# + +enable_language(C CXX ASM) + +project(application) + +# Compiler options here. +set(USE_OPT "-Os --specs=nano.specs") + +# C specific options here (added to USE_OPT). +set(USE_COPT "-std=gnu99") + +# C++ specific options here (added to USE_OPT). +set(USE_CPPOPT "-std=c++11 -fno-rtti -fno-exceptions") + +# Enable this if you want the linker to remove unused code and data +set(USE_LINK_GC yes) + +# Linker extra options here. +set(USE_LDOPT) + +# Enable this if you want link time optimizations (LTO) +set(USE_LTO no) + +# If enabled, this option allows to compile the application in THUMB mode. +set(USE_THUMB yes) + +# Enable this if you want to see the full log while compiling. +set(USE_VERBOSE_COMPILE no) + +# +# Build global options +############################################################################## + +############################################################################## +# Architecture or project specific options +# + +# Enables the use of FPU on Cortex-M4 (no, softfp, hard). +set(USE_FPU no) + +# +# Architecture or project specific options +############################################################################## + +############################################################################## +# Project, sources and paths +# + +set(CPLD_SVF_PATH ${HARDWARE_PATH}/portapack_h1/cpld/output_files/portapack_h1_cpld.svf) +set(CPLD_DATA_CPP ${CMAKE_CURRENT_BINARY_DIR}/portapack_cpld_data.cpp) + +set(HACKRF_CPLD_DATA_HPP ${CMAKE_CURRENT_BINARY_DIR}/hackrf_cpld_data.hpp) +set(HACKRF_CPLD_DATA_CPP ${CMAKE_CURRENT_BINARY_DIR}/hackrf_cpld_data.cpp) + +# Imported source files and paths +include(${CHIBIOS_PORTAPACK}/boards/GSG_HACKRF_ONE/board.cmake) +include(${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx_M0/platform.cmake) +include(${CHIBIOS}/os/hal/hal.cmake) +include(${CHIBIOS_PORTAPACK}/os/ports/GCC/ARMCMx/LPC43xx_M0/port.cmake) +include(${CHIBIOS}/os/kernel/kernel.cmake) +include(${CHIBIOS_PORTAPACK}/os/various/fatfs_bindings/fatfs.cmake) +include(${CHIBIOS}/test/test.cmake) + +# Define linker script file here +set(LDSCRIPT ${PORTLD}/LPC43xx_M0.ld) + +# C sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +set(CSRC + ${PORTSRC} + ${KERNSRC} + ${TESTSRC} + ${HALSRC} + ${PLATFORMSRC} + ${BOARDSRC} + ${FATFSSRC} +) + +# C++ sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +set(CPPSRC + main.cpp + irq_lcd_frame.cpp + irq_controls.cpp + irq_rtc.cpp + ${COMMON}/event.cpp + event_m0.cpp + ${COMMON}/message_queue.cpp + ${COMMON}/hackrf_hal.cpp + portapack.cpp + ${COMMON}/portapack_shared_memory.cpp + baseband_api.cpp + ${COMMON}/portapack_persistent_memory.cpp + ${COMMON}/portapack_io.cpp + ${COMMON}/i2c_pp.cpp + spi_pp.cpp + clock_manager.cpp + si5351.cpp + ${COMMON}/wm8731.cpp + radio.cpp + baseband_cpld.cpp + tuning.cpp + rf_path.cpp + rffc507x.cpp + rffc507x_spi.cpp + max2837.cpp + max5864.cpp + debounce.cpp + touch.cpp + touch_adc.cpp + encoder.cpp + audio.cpp + ${COMMON}/lcd_ili9341.cpp + ${COMMON}/ui.cpp + ${COMMON}/ui_text.cpp + ${COMMON}/ui_widget.cpp + ${COMMON}/ui_painter.cpp + ${COMMON}/ui_focus.cpp + ui_navigation.cpp + ui_menu.cpp + ui_rssi.cpp + ui_channel.cpp + ui_audio.cpp + ui_font_fixed_8x16.cpp + ui_setup.cpp + ui_debug.cpp + ui_baseband_stats_view.cpp + ui_sd_card_status_view.cpp + ui_sd_card_debug.cpp + ui_console.cpp + ui_receiver.cpp + ui_record_view.cpp + ui_spectrum.cpp + recent_entries.cpp + receiver_model.cpp + spectrum_color_lut.cpp + analog_audio_app.cpp + ${COMMON}/ais_baseband.cpp + ${COMMON}/ais_packet.cpp + ais_app.cpp + tpms_app.cpp + ${COMMON}/tpms_packet.cpp + ert_app.cpp + ${COMMON}/ert_packet.cpp + capture_app.cpp + sd_card.cpp + time.cpp + file.cpp + log_file.cpp + ${COMMON}/png_writer.cpp + capture_thread.cpp + ${COMMON}/manchester.cpp + string_format.cpp + temperature_logger.cpp + ${COMMON}/utility.cpp + ${COMMON}/chibios_cpp.cpp + ${COMMON}/debug.cpp + ${COMMON}/gcc.cpp + ${COMMON}/lfsr_random.cpp + core_control.cpp + ${COMMON}/cpld_max5.cpp + ${COMMON}/cpld_xilinx.cpp + ${COMMON}/jtag.cpp + ${COMMON}/jtag_tap.cpp + cpld_update.cpp + ${CPLD_DATA_CPP} + ${HACKRF_CPLD_DATA_CPP} +) + +# C sources to be compiled in ARM mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +set(ACSRC) + +# C++ sources to be compiled in ARM mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +set(ACPPSRC) + +# C sources to be compiled in THUMB mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +set(TCSRC) + +# C sources to be compiled in THUMB mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +set(TCPPSRC) + +# List ASM source files here +set(ASMSRC ${PORTASM}) + +set(INCDIR ${CMAKE_CURRENT_BINARY_DIR} ${COMMON} ${PORTINC} ${KERNINC} ${TESTINC} + ${HALINC} ${PLATFORMINC} ${BOARDINC} + ${FATFSINC} + ${CHIBIOS}/os/various +) + +# +# Project, sources and paths +############################################################################## + +############################################################################## +# Compiler settings +# + +# TODO: Entertain using MCU=cortex-m0.small-multiply for LPC43xx M0 core. +# However, on GCC-ARM-Embedded 4.9 2015q2, it seems to produce non-functional +# binaries. +set(MCU cortex-m0) + +# ARM-specific options here +set(AOPT) + +# THUMB-specific options here +set(TOPT "-mthumb -DTHUMB") + +# Define C warning options here +set(CWARN "-Wall -Wextra -Wstrict-prototypes") + +# Define C++ warning options here +set(CPPWARN "-Wall -Wextra") + +# +# Compiler settings +############################################################################## + +############################################################################## +# Start of default section +# + +# List all default C defines here, like -D_DEBUG=1 +# TODO: Switch -DCRT0_INIT_DATA depending on load from RAM or SPIFI? +# NOTE: _RANDOM_TCC to kill a GCC 4.9.3 error with std::max argument types +set(DDEFS -DLPC43XX -DLPC43XX_M0 -D__NEWLIB__ -DHACKRF_ONE -DTOOLCHAIN_GCC -DTOOLCHAIN_GCC_ARM -D_RANDOM_TCC=0 -DGIT_REVISION=\"${GIT_REVISION}\") + +# List all default ASM defines here, like -D_DEBUG=1 +set(DADEFS) + +# List all default directories to look for include files here +set(DINCDIR) + +# List the default directory to look for the libraries here +set(DLIBDIR) + +# List all default libraries here +set(DLIBS) + +# +# End of default section +############################################################################## + +############################################################################## +# Start of user section +# + +# List all user C define here, like -D_DEBUG=1 +set(UDEFS) + +# Define ASM defines here +set(UADEFS) + +# List all user directories here +set(UINCDIR) + +# List the user directory to look for the libraries here +set(ULIBDIR) + +# List all user libraries here +set(ULIBS) + +# +# End of user defines +############################################################################## + +set(RULESPATH ${CHIBIOS}/os/ports/GCC/ARMCMx) +include(${RULESPATH}/rules.cmake) + +############################################################################## + +add_custom_command( + OUTPUT ${CPLD_DATA_CPP} + COMMAND ${EXTRACT_CPLD_DATA} ${CPLD_SVF_PATH} >${CPLD_DATA_CPP} + DEPENDS ${EXTRACT_CPLD_DATA} ${CPLD_SVF_PATH} +) + +add_custom_command( + OUTPUT ${HACKRF_CPLD_DATA_HPP} ${HACKRF_CPLD_DATA_CPP} + COMMAND ${EXTRACT_SVF_DATA_XC2C64A} ${HACKRF_CPLD_SVF_PATH} hackrf::one::cpld::verify_blocks ${HACKRF_CPLD_DATA_HPP} ${HACKRF_CPLD_DATA_CPP} + DEPENDS ${EXTRACT_SVF_DATA_XC2C64A} ${HACKRF_CPLD_SVF_PATH} +) + +add_executable(${PROJECT_NAME}.elf ${CSRC} ${CPPSRC} ${ASMSRC}) +set_target_properties(${PROJECT_NAME}.elf PROPERTIES LINK_DEPENDS ${LDSCRIPT}) +add_definitions(${DEFS}) +include_directories(. ${INCDIR}) +link_directories(${LLIBDIR}) +target_link_libraries(${PROJECT_NAME}.elf ${LIBS}) + +add_custom_command( + OUTPUT ${PROJECT_NAME}.bin + COMMAND ${CMAKE_OBJCOPY} -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin + DEPENDS ${PROJECT_NAME}.elf +) + +add_custom_target( + ${PROJECT_NAME} + DEPENDS ${PROJECT_NAME}.bin +) diff --git a/firmware/application/ais_app.cpp b/firmware/application/ais_app.cpp index a6508c91..543e5553 100644 --- a/firmware/application/ais_app.cpp +++ b/firmware/application/ais_app.cpp @@ -21,8 +21,6 @@ #include "ais_app.hpp" -#include "event_m0.hpp" - #include "string_format.hpp" #include "baseband_api.hpp" @@ -128,25 +126,17 @@ static std::string true_heading(const TrueHeading value) { } /* namespace format */ } /* namespace ais */ -AISLogger::AISLogger( - const std::string& file_path -) : log_file { file_path } -{ -} - void AISLogger::on_packet(const ais::Packet& packet) { // TODO: Unstuff here, not in baseband! - if( log_file.is_open() ) { - std::string entry; - entry.reserve((packet.length() + 3) / 4); + std::string entry; + entry.reserve((packet.length() + 3) / 4); - for(size_t i=0; i= 10) ? ('W' + nibble) : ('0' + nibble); - } - - log_file.write_entry(packet.received_at(), entry); + for(size_t i=0; i= 10) ? ('W' + nibble) : ('0' + nibble); } + + log_file.write_entry(packet.received_at(), entry); } void AISRecentEntry::update(const ais::Packet& packet) { @@ -296,6 +286,8 @@ void AISRecentEntryDetailView::set_entry(const AISRecentEntry& entry) { } AISAppView::AISAppView(NavigationView&) { + baseband::run_image(portapack::spi_flash::image_tag_ais); + add_children({ { &label_channel, &options_channel, @@ -305,16 +297,6 @@ AISAppView::AISAppView(NavigationView&) { recent_entry_detail_view.hidden(true); - EventDispatcher::message_map().register_handler(Message::ID::AISPacket, - [this](Message* const p) { - const auto message = static_cast(p); - const ais::Packet packet { message->packet }; - if( packet.is_valid() ) { - this->on_packet(packet); - } - } - ); - target_frequency_ = initial_target_frequency; radio::enable({ @@ -326,12 +308,6 @@ AISAppView::AISAppView(NavigationView&) { 1, }); - baseband::start({ - .mode = 3, - .sampling_rate = sampling_rate, - .decimation_factor = 1, - }); - options_channel.on_change = [this](size_t, OptionsField::value_t v) { this->on_frequency_changed(v); }; @@ -344,14 +320,16 @@ AISAppView::AISAppView(NavigationView&) { this->on_show_list(); }; - logger = std::make_unique("ais.txt"); + logger = std::make_unique(); + if( logger ) { + logger->append("ais.txt"); + } } AISAppView::~AISAppView() { - baseband::stop(); radio::disable(); - EventDispatcher::message_map().unregister_handler(Message::ID::AISPacket); + baseband::shutdown(); } void AISAppView::focus() { diff --git a/firmware/application/ais_app.hpp b/firmware/application/ais_app.hpp index f0f81c91..19286e6d 100644 --- a/firmware/application/ais_app.hpp +++ b/firmware/application/ais_app.hpp @@ -25,6 +25,8 @@ #include "ui_widget.hpp" #include "ui_navigation.hpp" +#include "event_m0.hpp" + #include "log_file.hpp" #include "ais_packet.hpp" @@ -90,8 +92,10 @@ using AISRecentEntries = RecentEntries; class AISLogger { public: - AISLogger(const std::string& file_path); - + Optional append(const std::string& filename) { + return log_file.append(filename); + } + void on_packet(const ais::Packet& packet); private: @@ -173,6 +177,17 @@ private: } }; + MessageHandlerRegistration message_handler_packet { + Message::ID::AISPacket, + [this](Message* const p) { + const auto message = static_cast(p); + const ais::Packet packet { message->packet }; + if( packet.is_valid() ) { + this->on_packet(packet); + } + } + }; + uint32_t target_frequency_ = initial_target_frequency; void on_packet(const ais::Packet& packet); diff --git a/firmware/application/analog_audio_app.cpp b/firmware/application/analog_audio_app.cpp index 948e6d5a..872a57c2 100644 --- a/firmware/application/analog_audio_app.cpp +++ b/firmware/application/analog_audio_app.cpp @@ -21,6 +21,8 @@ #include "analog_audio_app.hpp" +#include "baseband_api.hpp" + #include "portapack.hpp" #include "portapack_persistent_memory.hpp" using namespace portapack; @@ -108,19 +110,10 @@ AnalogAudioView::AnalogAudioView( this->on_show_options_frequency(); }; - field_lna.set_value(receiver_model.lna()); - field_lna.on_change = [this](int32_t v) { - this->on_lna_changed(v); - }; - field_lna.on_show_options = [this]() { this->on_show_options_rf_gain(); }; - field_vga.set_value(receiver_model.vga()); - field_vga.on_change = [this](int32_t v_db) { - this->on_vga_changed(v_db); - }; field_vga.on_show_options = [this]() { this->on_show_options_rf_gain(); }; @@ -139,6 +132,10 @@ AnalogAudioView::AnalogAudioView( this->on_headphone_volume_changed(v); }; + record_view.on_error = [&nav](std::string message) { + nav.display_modal("Error", message); + }; + audio::output::start(); update_modulation(static_cast(modulation)); @@ -150,6 +147,8 @@ AnalogAudioView::~AnalogAudioView() { audio::output::stop(); receiver_model.disable(); + + baseband::shutdown(); } void AnalogAudioView::on_hide() { @@ -178,18 +177,6 @@ void AnalogAudioView::on_baseband_bandwidth_changed(uint32_t bandwidth_hz) { receiver_model.set_baseband_bandwidth(bandwidth_hz); } -void AnalogAudioView::on_rf_amp_changed(bool v) { - receiver_model.set_rf_amp(v); -} - -void AnalogAudioView::on_lna_changed(int32_t v_db) { - receiver_model.set_lna(v_db); -} - -void AnalogAudioView::on_vga_changed(int32_t v_db) { - receiver_model.set_vga(v_db); -} - void AnalogAudioView::on_modulation_changed(const ReceiverModel::Mode modulation) { // TODO: Terrible kludge because widget system doesn't notify Waterfall that // it's being shown or hidden. @@ -215,8 +202,11 @@ void AnalogAudioView::set_options_widget(std::unique_ptr new_widget) { if( new_widget ) { options_widget = std::move(new_widget); - add_child(options_widget.get()); + } else { + // TODO: Lame hack to hide options view due to my bad paint/damage algorithm. + options_widget = std::make_unique(options_view_rect, style_options_group.background); } + add_child(options_widget.get()); } void AnalogAudioView::on_show_options_frequency() { @@ -238,11 +228,6 @@ void AnalogAudioView::on_show_options_frequency() { void AnalogAudioView::on_show_options_rf_gain() { auto widget = std::make_unique(options_view_rect, &style_options_group); - widget->set_rf_amp(receiver_model.rf_amp()); - widget->on_change_rf_amp = [this](bool enable) { - this->on_rf_amp_changed(enable); - }; - set_options_widget(std::move(widget)); field_lna.set_style(&style_options_group); } @@ -286,6 +271,20 @@ void AnalogAudioView::update_modulation(const ReceiverModel::Mode modulation) { audio::output::mute(); record_view.stop(); + baseband::shutdown(); + + portapack::spi_flash::image_tag_t image_tag; + switch(modulation) { + case ReceiverModel::Mode::AMAudio: image_tag = portapack::spi_flash::image_tag_am_audio; break; + case ReceiverModel::Mode::NarrowbandFMAudio: image_tag = portapack::spi_flash::image_tag_nfm_audio; break; + case ReceiverModel::Mode::WidebandFMAudio: image_tag = portapack::spi_flash::image_tag_wfm_audio; break; + case ReceiverModel::Mode::SpectrumAnalysis: image_tag = portapack::spi_flash::image_tag_wideband_spectrum; break; + default: + return; + } + + baseband::run_image(image_tag); + const auto is_wideband_spectrum_mode = (modulation == ReceiverModel::Mode::SpectrumAnalysis); receiver_model.set_baseband_configuration({ .mode = toUType(modulation), diff --git a/firmware/application/analog_audio_app.hpp b/firmware/application/analog_audio_app.hpp index ebef06e3..a91e8059 100644 --- a/firmware/application/analog_audio_app.hpp +++ b/firmware/application/analog_audio_app.hpp @@ -143,16 +143,13 @@ private: RecordView record_view { { 0 * 8, 2 * 16, 30 * 8, 1 * 16 }, - "AUD_????", RecordView::FileType::WAV, 12, 2, + "AUD_????", RecordView::FileType::WAV, 4096, 4 }; spectrum::WaterfallWidget waterfall; void on_tuning_frequency_changed(rf::Frequency f); void on_baseband_bandwidth_changed(uint32_t bandwidth_hz); - void on_rf_amp_changed(bool v); - void on_lna_changed(int32_t v_db); - void on_vga_changed(int32_t v_db); void on_modulation_changed(const ReceiverModel::Mode modulation); void on_show_options_frequency(); void on_show_options_rf_gain(); diff --git a/firmware/application/baseband_api.cpp b/firmware/application/baseband_api.cpp index cc9939dd..102d7407 100644 --- a/firmware/application/baseband_api.cpp +++ b/firmware/application/baseband_api.cpp @@ -26,8 +26,18 @@ #include "portapack_shared_memory.hpp" +#include "core_control.hpp" + namespace baseband { +static void send_message(const Message* const message) { + // If message is only sent by this function via one thread, no need to check if + // another message is present before setting new message. + shared_memory.baseband_message = message; + creg::m0apptxevent::assert(); + while(shared_memory.baseband_message); +} + void AMConfig::apply() const { const AMConfigureMessage message { taps_6k0_decim_0, @@ -37,7 +47,7 @@ void AMConfig::apply() const { modulation, audio_12k_hpf_300hz_config }; - shared_memory.baseband_queue.push(message); + send_message(&message); audio::set_rate(audio::Rate::Hz_12000); } @@ -51,7 +61,7 @@ void NBFMConfig::apply() const { audio_24k_hpf_300hz_config, audio_24k_deemph_300_6_config }; - shared_memory.baseband_queue.push(message); + send_message(&message); audio::set_rate(audio::Rate::Hz_24000); } @@ -64,26 +74,38 @@ void WFMConfig::apply() const { audio_48k_hpf_30hz_config, audio_48k_deemph_2122_6_config }; - shared_memory.baseband_queue.push(message); + send_message(&message); audio::set_rate(audio::Rate::Hz_48000); } -void start(BasebandConfiguration configuration) { - BasebandConfigurationMessage message { configuration }; - shared_memory.baseband_queue.push(message); -} +static bool baseband_image_running = false; -void stop() { - shared_memory.baseband_queue.push_and_wait( - BasebandConfigurationMessage { - .configuration = { }, - } - ); +void run_image(const portapack::spi_flash::image_tag_t image_tag) { + if( baseband_image_running ) { + chDbgPanic("BBRunning"); + } + + creg::m4txevent::clear(); + + m4_init(image_tag, portapack::memory::map::m4_code); + baseband_image_running = true; + + creg::m4txevent::enable(); } void shutdown() { - ShutdownMessage shutdown_message; - shared_memory.baseband_queue.push(shutdown_message); + if( !baseband_image_running ) { + return; + } + + creg::m4txevent::disable(); + + ShutdownMessage message; + send_message(&message); + + shared_memory.application_queue.reset(); + + baseband_image_running = false; } void spectrum_streaming_start(size_t decimation_factor) { @@ -96,19 +118,27 @@ void spectrum_streaming_start(size_t decimation_factor) { } void spectrum_streaming_start() { - shared_memory.baseband_queue.push_and_wait( - SpectrumStreamingConfigMessage { - SpectrumStreamingConfigMessage::Mode::Running - } - ); + SpectrumStreamingConfigMessage message { + SpectrumStreamingConfigMessage::Mode::Running + }; + send_message(&message); } void spectrum_streaming_stop() { - shared_memory.baseband_queue.push_and_wait( - SpectrumStreamingConfigMessage { - SpectrumStreamingConfigMessage::Mode::Stopped - } - ); + SpectrumStreamingConfigMessage message { + SpectrumStreamingConfigMessage::Mode::Stopped + }; + send_message(&message); +} + +void capture_start(CaptureConfig* const config) { + CaptureConfigMessage message { config }; + send_message(&message); +} + +void capture_stop() { + CaptureConfigMessage message { nullptr }; + send_message(&message); } } /* namespace baseband */ diff --git a/firmware/application/baseband_api.hpp b/firmware/application/baseband_api.hpp index 3fc9115f..d6993ba1 100644 --- a/firmware/application/baseband_api.hpp +++ b/firmware/application/baseband_api.hpp @@ -26,6 +26,8 @@ #include "dsp_fir_taps.hpp" +#include "spi_image.hpp" + #include namespace baseband { @@ -50,15 +52,16 @@ struct WFMConfig { void apply() const; }; -void start(BasebandConfiguration configuration); -void stop(); - +void run_image(const portapack::spi_flash::image_tag_t image_tag); void shutdown(); void spectrum_streaming_start(size_t decimation_factor); void spectrum_streaming_start(); void spectrum_streaming_stop(); +void capture_start(CaptureConfig* const config); +void capture_stop(); + } /* namespace baseband */ #endif/*__BASEBAND_API_H__*/ diff --git a/firmware/application/capture_app.cpp b/firmware/application/capture_app.cpp index e03d9476..87d40114 100644 --- a/firmware/application/capture_app.cpp +++ b/firmware/application/capture_app.cpp @@ -21,59 +21,72 @@ #include "capture_app.hpp" +#include "baseband_api.hpp" + #include "portapack.hpp" using namespace portapack; +#include "portapack_persistent_memory.hpp" +using namespace portapack; + namespace ui { CaptureAppView::CaptureAppView(NavigationView& nav) { + baseband::run_image(portapack::spi_flash::image_tag_capture); + add_children({ { &rssi, &channel, &field_frequency, + &field_frequency_step, + &field_rf_amp, &field_lna, &field_vga, &record_view, &waterfall, } }); - field_frequency.set_value(receiver_model.tuning_frequency()); + field_frequency.set_value(target_frequency()); field_frequency.set_step(receiver_model.frequency_step()); field_frequency.on_change = [this](rf::Frequency f) { - this->on_tuning_frequency_changed(f); + this->on_target_frequency_changed(f); }; field_frequency.on_edit = [this, &nav]() { // TODO: Provide separate modal method/scheme? - auto new_view = nav.push(receiver_model.tuning_frequency()); + auto new_view = nav.push(this->target_frequency()); new_view->on_changed = [this](rf::Frequency f) { - this->on_tuning_frequency_changed(f); + this->on_target_frequency_changed(f); this->field_frequency.set_value(f); }; }; - field_lna.set_value(receiver_model.lna()); - field_lna.on_change = [this](int32_t v) { - this->on_lna_changed(v); + field_frequency_step.set_by_value(receiver_model.frequency_step()); + field_frequency_step.on_change = [this](size_t, OptionsField::value_t v) { + receiver_model.set_frequency_step(v); + this->field_frequency.set_step(v); }; - field_vga.set_value(receiver_model.vga()); - field_vga.on_change = [this](int32_t v_db) { - this->on_vga_changed(v_db); - }; - - receiver_model.set_baseband_configuration({ - .mode = toUType(ReceiverModel::Mode::Capture), - .sampling_rate = sampling_rate, - .decimation_factor = 1, + radio::enable({ + tuning_frequency(), + sampling_rate, + baseband_bandwidth, + rf::Direction::Receive, + receiver_model.rf_amp(), + static_cast(receiver_model.lna()), + static_cast(receiver_model.vga()), + 1, }); - receiver_model.set_baseband_bandwidth(baseband_bandwidth); - receiver_model.enable(); record_view.set_sampling_rate(sampling_rate / 8); + record_view.on_error = [&nav](std::string message) { + nav.display_modal("Error", message); + }; } CaptureAppView::~CaptureAppView() { - receiver_model.disable(); + radio::disable(); + + baseband::shutdown(); } void CaptureAppView::on_hide() { @@ -94,16 +107,21 @@ void CaptureAppView::focus() { record_view.focus(); } -void CaptureAppView::on_tuning_frequency_changed(rf::Frequency f) { - receiver_model.set_tuning_frequency(f); +void CaptureAppView::on_target_frequency_changed(rf::Frequency f) { + set_target_frequency(f); } -void CaptureAppView::on_lna_changed(int32_t v_db) { - receiver_model.set_lna(v_db); +void CaptureAppView::set_target_frequency(const rf::Frequency new_value) { + persistent_memory::set_tuned_frequency(new_value);; + radio::set_tuning_frequency(tuning_frequency()); } -void CaptureAppView::on_vga_changed(int32_t v_db) { - receiver_model.set_vga(v_db); +rf::Frequency CaptureAppView::target_frequency() const { + return persistent_memory::tuned_frequency(); +} + +rf::Frequency CaptureAppView::tuning_frequency() const { + return target_frequency() - (sampling_rate / 4); } } /* namespace ui */ diff --git a/firmware/application/capture_app.hpp b/firmware/application/capture_app.hpp index bc896f9e..a7d04859 100644 --- a/firmware/application/capture_app.hpp +++ b/firmware/application/capture_app.hpp @@ -47,38 +47,49 @@ public: std::string title() const override { return "Capture"; }; private: - static constexpr ui::Dim header_height = 3 * 16; + static constexpr ui::Dim header_height = 2 * 16; static constexpr uint32_t sampling_rate = 4000000; static constexpr uint32_t baseband_bandwidth = 2500000; - void on_tuning_frequency_changed(rf::Frequency f); - void on_lna_changed(int32_t v_db); - void on_vga_changed(int32_t v_db); + void on_target_frequency_changed(rf::Frequency f); + + rf::Frequency target_frequency() const; + void set_target_frequency(const rf::Frequency new_value); + + rf::Frequency tuning_frequency() const; RSSI rssi { - { 21 * 8, 0, 6 * 8, 4 }, + { 24 * 8, 0, 6 * 8, 4 }, }; Channel channel { - { 21 * 8, 5, 6 * 8, 4 }, + { 24 * 8, 5, 6 * 8, 4 }, }; FrequencyField field_frequency { - { 5 * 8, 0 * 16 }, + { 0 * 8, 0 * 16 }, + }; + + FrequencyStepView field_frequency_step { + { 10 * 8, 0 * 16 }, + }; + + RFAmpField field_rf_amp { + { 16 * 8, 0 * 16 } }; LNAGainField field_lna { - { 15 * 8, 0 * 16 } - }; - - VGAGainField field_vga { { 18 * 8, 0 * 16 } }; + VGAGainField field_vga { + { 21 * 8, 0 * 16 } + }; + RecordView record_view { - { 0 * 8, 2 * 16, 30 * 8, 1 * 16 }, - "BBD_????", RecordView::FileType::RawS16, 14, 1, + { 0 * 8, 1 * 16, 30 * 8, 1 * 16 }, + "BBD_????", RecordView::FileType::RawS16, 16384, 3 }; spectrum::WaterfallWidget waterfall; diff --git a/firmware/application/capture_thread.cpp b/firmware/application/capture_thread.cpp index 6bccea57..4de5cd53 100644 --- a/firmware/application/capture_thread.cpp +++ b/firmware/application/capture_thread.cpp @@ -21,7 +21,7 @@ #include "capture_thread.hpp" -#include "portapack_shared_memory.hpp" +#include "baseband_api.hpp" // StreamOutput /////////////////////////////////////////////////////////// @@ -31,36 +31,43 @@ public: ~StreamOutput(); size_t available() { - return fifo->len(); + return fifo_buffers_full->len(); } - size_t read(void* const data, const size_t length) { - return fifo->out(reinterpret_cast(data), length); + StreamBuffer* get_buffer() { + StreamBuffer* p { nullptr }; + fifo_buffers_full->out(p); + return p; } - static FIFO* fifo; + bool release_buffer(StreamBuffer* const p) { + p->empty(); + return fifo_buffers_empty->in(p); + } + + static FIFO* fifo_buffers_empty; + static FIFO* fifo_buffers_full; private: CaptureConfig* const config; }; -FIFO* StreamOutput::fifo = nullptr; +FIFO* StreamOutput::fifo_buffers_empty = nullptr; +FIFO* StreamOutput::fifo_buffers_full = nullptr; StreamOutput::StreamOutput( CaptureConfig* const config ) : config { config } { - shared_memory.baseband_queue.push_and_wait( - CaptureConfigMessage { config } - ); - fifo = config->fifo; + baseband::capture_start(config); + fifo_buffers_empty = config->fifo_buffers_empty; + fifo_buffers_full = config->fifo_buffers_full; } StreamOutput::~StreamOutput() { - fifo = nullptr; - shared_memory.baseband_queue.push_and_wait( - CaptureConfigMessage { nullptr } - ); + fifo_buffers_full = nullptr; + fifo_buffers_empty = nullptr; + baseband::capture_stop(); } // CaptureThread ////////////////////////////////////////////////////////// @@ -69,10 +76,14 @@ Thread* CaptureThread::thread = nullptr; CaptureThread::CaptureThread( std::unique_ptr writer, - size_t write_size_log2, - size_t buffer_count_log2 -) : config { write_size_log2, buffer_count_log2 }, - writer { std::move(writer) } + size_t write_size, + size_t buffer_count, + std::function success_callback, + std::function error_callback +) : config { write_size, buffer_count }, + writer { std::move(writer) }, + success_callback { std::move(success_callback) }, + error_callback { std::move(error_callback) } { // Need significant stack for FATFS thread = chThdCreateFromHeap(NULL, 1024, NORMALPRIO + 10, CaptureThread::static_fn, this); @@ -81,7 +92,7 @@ CaptureThread::CaptureThread( CaptureThread::~CaptureThread() { if( thread ) { chThdTerminate(thread); - chEvtSignal(thread, EVT_MASK_CAPTURE_THREAD); + chEvtSignal(thread, event_mask_loop_wake); chThdWait(thread); thread = nullptr; } @@ -90,33 +101,42 @@ CaptureThread::~CaptureThread() { void CaptureThread::check_fifo_isr() { // TODO: Prevent over-signalling by transmitting a set of // flags from the baseband core. - const auto fifo = StreamOutput::fifo; + const auto fifo = StreamOutput::fifo_buffers_full; if( fifo ) { - chEvtSignalI(thread, EVT_MASK_CAPTURE_THREAD); + if( !fifo->is_empty() ) { + chEvtSignalI(thread, event_mask_loop_wake); + } } } -msg_t CaptureThread::run() { - const size_t write_size = 1U << config.write_size_log2; - const auto write_buffer = std::make_unique(write_size); - if( !write_buffer ) { - return false; +msg_t CaptureThread::static_fn(void* arg) { + auto obj = static_cast(arg); + const auto error = obj->run(); + if( error.is_valid() && obj->error_callback ) { + obj->error_callback(error.value()); + } else { + if( obj->success_callback ) { + obj->success_callback(); + } } + return 0; +} +Optional CaptureThread::run() { StreamOutput stream { &config }; while( !chThdShouldTerminate() ) { - if( stream.available() >= write_size ) { - if( stream.read(write_buffer.get(), write_size) != write_size ) { - return false; - } - if( !writer->write(write_buffer.get(), write_size) ) { - return false; + if( stream.available() ) { + auto buffer = stream.get_buffer(); + auto write_result = writer->write(buffer->data(), buffer->size()); + if( write_result.is_error() ) { + return write_result.error(); } + stream.release_buffer(buffer); } else { - chEvtWaitAny(EVT_MASK_CAPTURE_THREAD); + chEvtWaitAny(event_mask_loop_wake); } } - return true; + return { }; } diff --git a/firmware/application/capture_thread.hpp b/firmware/application/capture_thread.hpp index c4bdbb1c..849a3131 100644 --- a/firmware/application/capture_thread.hpp +++ b/firmware/application/capture_thread.hpp @@ -26,13 +26,16 @@ #include "event_m0.hpp" +#include "file.hpp" +#include "optional.hpp" + #include #include #include class Writer { public: - virtual bool write(const void* const buffer, const size_t bytes) = 0; + virtual File::Result write(const void* const buffer, const size_t bytes) = 0; virtual ~Writer() = default; }; @@ -40,8 +43,10 @@ class CaptureThread { public: CaptureThread( std::unique_ptr writer, - size_t write_size_log2, - size_t buffer_count_log2 + size_t write_size, + size_t buffer_count, + std::function success_callback, + std::function error_callback ); ~CaptureThread(); @@ -52,16 +57,17 @@ public: static void check_fifo_isr(); private: + static constexpr auto event_mask_loop_wake = EVENT_MASK(0); + CaptureConfig config; std::unique_ptr writer; + std::function success_callback; + std::function error_callback; static Thread* thread; - static msg_t static_fn(void* arg) { - auto obj = static_cast(arg); - return obj->run(); - } + static msg_t static_fn(void* arg); - msg_t run(); + Optional run(); }; #endif/*__CAPTURE_THREAD_H__*/ diff --git a/firmware/application/core_control.cpp b/firmware/application/core_control.cpp index 531cdb38..f881be16 100644 --- a/firmware/application/core_control.cpp +++ b/firmware/application/core_control.cpp @@ -41,17 +41,27 @@ char * modhash; * I suppose I could force M4MEMMAP to an invalid memory reason which would * cause an exception and effectively halt the M4. But that feels gross. */ -void m4_init(const portapack::spi_flash::region_t from, const portapack::memory::region_t to) { - /* Initialize M4 code RAM */ - std::memcpy(reinterpret_cast(to.base()), from.base(), from.size); +void m4_init(const portapack::spi_flash::image_tag_t image_tag, const portapack::memory::region_t to) { + const portapack::spi_flash::chunk_t* chunk = reinterpret_cast(portapack::spi_flash::images.base()); + while(chunk->tag) { + if( chunk->tag == image_tag ) { + /* Initialize M4 code RAM */ + std::memcpy(reinterpret_cast(to.base()), &chunk->data[0], chunk->length); - /* M4 core is assumed to be sleeping with interrupts off, so we can mess - * with its address space and RAM without concern. - */ - LPC_CREG->M4MEMMAP = to.base(); + /* M4 core is assumed to be sleeping with interrupts off, so we can mess + * with its address space and RAM without concern. + */ + LPC_CREG->M4MEMMAP = to.base(); - /* Reset M4 core */ - LPC_RGU->RESET_CTRL[0] = (1 << 13); + /* Reset M4 core */ + LPC_RGU->RESET_CTRL[0] = (1 << 13); + + return; + } + chunk = chunk->next(); + } + + chDbgPanic("NoImg"); } void m4_request_shutdown() { diff --git a/firmware/application/core_control.hpp b/firmware/application/core_control.hpp index e8f71bb4..4d5b9cd8 100644 --- a/firmware/application/core_control.hpp +++ b/firmware/application/core_control.hpp @@ -29,7 +29,7 @@ #include "spi_image.hpp" #include "ui_navigation.hpp" -void m4_init(const portapack::spi_flash::region_t from, const portapack::memory::region_t to); +void m4_init(const portapack::spi_flash::image_tag_t image_tag, const portapack::memory::region_t to); void m4_request_shutdown(); void m4_switch(const char * hash); int m4_load_image(void); diff --git a/firmware/application/cpld_update.cpp b/firmware/application/cpld_update.cpp index 6207c69e..cafa81cb 100644 --- a/firmware/application/cpld_update.cpp +++ b/firmware/application/cpld_update.cpp @@ -21,11 +21,14 @@ #include "cpld_update.hpp" +#include "hackrf_gpio.hpp" #include "portapack_hal.hpp" #include "jtag_target_gpio.hpp" #include "cpld_max5.hpp" +#include "cpld_xilinx.hpp" #include "portapack_cpld_data.hpp" +#include "hackrf_cpld_data.hpp" bool cpld_update_if_necessary() { jtag::GPIOTarget target { @@ -82,3 +85,38 @@ bool cpld_update_if_necessary() { return ok; } + +static jtag::GPIOTarget jtag_target_hackrf() { + return { + hackrf::one::gpio_cpld_tck, + hackrf::one::gpio_cpld_tms, + hackrf::one::gpio_cpld_tdi, + hackrf::one::gpio_cpld_tdo, + }; +} + +bool cpld_hackrf_load_sram() { + auto jtag_target_hackrf_cpld = jtag_target_hackrf(); + cpld::xilinx::XC2C64A hackrf_cpld { jtag_target_hackrf_cpld }; + + hackrf_cpld.write_sram(hackrf::one::cpld::verify_blocks); + const auto ok = hackrf_cpld.verify_sram(hackrf::one::cpld::verify_blocks); + + return ok; +} + +bool cpld_hackrf_verify_eeprom() { + auto jtag_target_hackrf_cpld = jtag_target_hackrf(); + cpld::xilinx::XC2C64A hackrf_cpld { jtag_target_hackrf_cpld }; + + const auto ok = hackrf_cpld.verify_eeprom(hackrf::one::cpld::verify_blocks); + + return ok; +} + +void cpld_hackrf_init_from_eeprom() { + auto jtag_target_hackrf_cpld = jtag_target_hackrf(); + cpld::xilinx::XC2C64A hackrf_cpld { jtag_target_hackrf_cpld }; + + hackrf_cpld.init_from_eeprom(); +} diff --git a/firmware/application/cpld_update.hpp b/firmware/application/cpld_update.hpp index 236b2fe0..17c42bd5 100644 --- a/firmware/application/cpld_update.hpp +++ b/firmware/application/cpld_update.hpp @@ -24,4 +24,8 @@ bool cpld_update_if_necessary(); +bool cpld_hackrf_load_sram(); +bool cpld_hackrf_verify_eeprom(); +void cpld_hackrf_init_from_eeprom(); + #endif/*__CPLD_UPDATE_H__*/ diff --git a/firmware/application/ert_app.cpp b/firmware/application/ert_app.cpp index bbdf5848..269b1096 100644 --- a/firmware/application/ert_app.cpp +++ b/firmware/application/ert_app.cpp @@ -21,8 +21,6 @@ #include "ert_app.hpp" -#include "event_m0.hpp" - #include "baseband_api.hpp" #include "manchester.hpp" @@ -59,17 +57,9 @@ std::string commodity_type(CommodityType value) { } /* namespace ert */ -ERTLogger::ERTLogger( - const std::string& file_path -) : log_file { file_path } -{ -} - void ERTLogger::on_packet(const ert::Packet& packet) { - if( log_file.is_open() ) { - const auto formatted = packet.symbols_formatted(); - log_file.write_entry(packet.received_at(), formatted.data + "/" + formatted.errors); - } + const auto formatted = packet.symbols_formatted(); + log_file.write_entry(packet.received_at(), formatted.data + "/" + formatted.errors); } const ERTRecentEntry::Key ERTRecentEntry::invalid_key { }; @@ -131,18 +121,12 @@ void RecentEntriesView::draw( } ERTAppView::ERTAppView(NavigationView&) { + baseband::run_image(portapack::spi_flash::image_tag_ert); + add_children({ { &recent_entries_view, } }); - EventDispatcher::message_map().register_handler(Message::ID::ERTPacket, - [this](Message* const p) { - const auto message = static_cast(p); - const ert::Packet packet { message->type, message->packet }; - this->on_packet(packet); - } - ); - radio::enable({ initial_target_frequency, sampling_rate, @@ -152,20 +136,16 @@ ERTAppView::ERTAppView(NavigationView&) { 1, }); - baseband::start({ - .mode = 6, - .sampling_rate = sampling_rate, - .decimation_factor = 1, - }); - - logger = std::make_unique("ert.txt"); + logger = std::make_unique(); + if( logger ) { + logger->append("ert.txt"); + } } ERTAppView::~ERTAppView() { - baseband::stop(); radio::disable(); - EventDispatcher::message_map().unregister_handler(Message::ID::ERTPacket); + baseband::shutdown(); } void ERTAppView::focus() { diff --git a/firmware/application/ert_app.hpp b/firmware/application/ert_app.hpp index e280f379..b74d599e 100644 --- a/firmware/application/ert_app.hpp +++ b/firmware/application/ert_app.hpp @@ -24,6 +24,8 @@ #include "ui_navigation.hpp" +#include "event_m0.hpp" + #include "log_file.hpp" #include "ert_packet.hpp" @@ -85,8 +87,10 @@ struct ERTRecentEntry { class ERTLogger { public: - ERTLogger(const std::string& file_path); - + Optional append(const std::string& filename) { + return log_file.append(filename); + } + void on_packet(const ert::Packet& packet); private: @@ -124,6 +128,15 @@ private: ERTRecentEntriesView recent_entries_view { recent }; + MessageHandlerRegistration message_handler_packet { + Message::ID::ERTPacket, + [this](Message* const p) { + const auto message = static_cast(p); + const ert::Packet packet { message->type, message->packet }; + this->on_packet(packet); + } + }; + void on_packet(const ert::Packet& packet); void on_show_list(); }; diff --git a/firmware/application/event_m0.cpp b/firmware/application/event_m0.cpp index 86670f80..5eb980f6 100644 --- a/firmware/application/event_m0.cpp +++ b/firmware/application/event_m0.cpp @@ -22,8 +22,6 @@ #include "event_m0.hpp" #include "portapack.hpp" -#include "portapack_shared_memory.hpp" -#include "portapack_persistent_memory.hpp" #include "sd_card.hpp" #include "time.hpp" @@ -42,6 +40,8 @@ using namespace lpc43xx; #include +#include "ui_font_fixed_8x16.hpp" + extern "C" { CH_IRQ_HANDLER(M4Core_IRQHandler) { @@ -59,34 +59,60 @@ CH_IRQ_HANDLER(M4Core_IRQHandler) { } -MessageHandlerMap EventDispatcher::message_map_; +class MessageHandlerMap { +public: + using MessageHandler = std::function; + + void register_handler(const Message::ID id, MessageHandler&& handler) { + if( map_[toUType(id)] != nullptr ) { + chDbgPanic("MsgDblReg"); + } + map_[toUType(id)] = std::move(handler); + } + + void unregister_handler(const Message::ID id) { + map_[toUType(id)] = nullptr; + } + + void send(Message* const message) { + if( message->id < Message::ID::MAX ) { + auto& fn = map_[toUType(message->id)]; + if( fn ) { + fn(message); + } + } + } + +private: + using MapType = std::array; + MapType map_; +}; + +static MessageHandlerMap message_map; Thread* EventDispatcher::thread_event_loop = nullptr; +bool EventDispatcher::is_running = false; EventDispatcher::EventDispatcher( ui::Widget* const top_widget, - ui::Painter& painter, ui::Context& context ) : top_widget { top_widget }, - painter(painter), + painter { }, context(context) { init_message_queues(); thread_event_loop = chThdSelf(); + is_running = true; touch_manager.on_event = [this](const ui::TouchEvent event) { this->on_touch_event(event); }; } void EventDispatcher::run() { - creg::m4txevent::enable(); - while(is_running) { const auto events = wait(); dispatch(events); } - - creg::m4txevent::disable(); } void EventDispatcher::request_stop() { @@ -100,7 +126,6 @@ void EventDispatcher::set_display_sleep(const bool sleep) { portapack::io.lcd_backlight(false); portapack::display.sleep(); } else { - portapack::bl_tick_counter = 0; portapack::display.wake(); portapack::io.lcd_backlight(true); } @@ -112,10 +137,48 @@ eventmask_t EventDispatcher::wait() { } void EventDispatcher::dispatch(const eventmask_t events) { + if( shared_memory.m4_panic_msg[0] != 0 ) { + halt = true; + } + + if( halt ) { + if( shared_memory.m4_panic_msg[0] != 0 ) { + painter.fill_rectangle( + { 0, 0, portapack::display.width(), portapack::display.height() }, + ui::Color::red() + ); + + constexpr int border = 8; + painter.fill_rectangle( + { border, border, portapack::display.width() - (border * 2), portapack::display.height() - (border * 2) }, + ui::Color::black() + ); + + painter.draw_string({ 48, 24 }, top_widget->style(), "M4 Guru Meditation"); + + shared_memory.m4_panic_msg[sizeof(shared_memory.m4_panic_msg) - 1] = 0; + const std::string message = shared_memory.m4_panic_msg; + const int x_offset = (portapack::display.width() - (message.size() * 8)) / 2; + constexpr int y_offset = (portapack::display.height() - 16) / 2; + painter.draw_string( + { x_offset, y_offset }, + top_widget->style(), + message + ); + + shared_memory.m4_panic_msg[0] = 0; + } + return; + } + if( events & EVT_MASK_APPLICATION ) { handle_application_queue(); } + if( events & EVT_MASK_LOCAL ) { + handle_local_queue(); + } + if( events & EVT_MASK_RTC_TICK ) { handle_rtc_tick(); } @@ -123,16 +186,16 @@ void EventDispatcher::dispatch(const eventmask_t events) { if( events & EVT_MASK_SWITCHES ) { handle_switches(); } - - if( events & EVT_MASK_ENCODER ) { - handle_encoder(); - } if( !display_sleep ) { if( events & EVT_MASK_LCD_FRAME_SYNC ) { handle_lcd_frame_sync(); } + if( events & EVT_MASK_ENCODER ) { + handle_encoder(); + } + if( events & EVT_MASK_TOUCH ) { handle_touch(); } @@ -141,7 +204,13 @@ void EventDispatcher::dispatch(const eventmask_t events) { void EventDispatcher::handle_application_queue() { shared_memory.application_queue.handle([](Message* const message) { - message_map().send(message); + message_map.send(message); + }); +} + +void EventDispatcher::handle_local_queue() { + shared_memory.app_local_queue.handle([](Message* const message) { + message_map.send(message); }); } @@ -170,7 +239,6 @@ ui::Widget* EventDispatcher::touch_widget(ui::Widget* const w, ui::TouchEvent ev for(const auto child : w->children()) { const auto touched_widget = touch_widget(child, event); if( touched_widget ) { - portapack::bl_tick_counter = 0; return touched_widget; } } @@ -179,7 +247,6 @@ ui::Widget* EventDispatcher::touch_widget(ui::Widget* const w, ui::TouchEvent ev if( r.contains(event.point) ) { if( w->on_touch(event) ) { // This widget responded. Return it up the call stack. - portapack::bl_tick_counter = 0; return w; } } @@ -209,7 +276,7 @@ void EventDispatcher::on_touch_event(ui::TouchEvent event) { void EventDispatcher::handle_lcd_frame_sync() { DisplayFrameSyncMessage message; - message_map().send(&message); + message_map.send(&message); painter.paint_widget_tree(top_widget); } @@ -275,11 +342,17 @@ void EventDispatcher::event_bubble_encoder(const ui::EncoderEvent event) { } void EventDispatcher::init_message_queues() { - new (&shared_memory.baseband_queue) MessageQueue( - shared_memory.baseband_queue_data, SharedMemory::baseband_queue_k - ); - new (&shared_memory.application_queue) MessageQueue( - shared_memory.application_queue_data, SharedMemory::application_queue_k - ); - + new (&shared_memory) SharedMemory; +} + +MessageHandlerRegistration::MessageHandlerRegistration( + const Message::ID message_id, + MessageHandlerMap::MessageHandler&& callback +) : message_id { message_id } +{ + message_map.register_handler(message_id, std::move(callback)); +} + +MessageHandlerRegistration::~MessageHandlerRegistration() { + message_map.unregister_handler(message_id); } diff --git a/firmware/application/event_m0.hpp b/firmware/application/event_m0.hpp index f793eaf7..f89f0b75 100644 --- a/firmware/application/event_m0.hpp +++ b/firmware/application/event_m0.hpp @@ -38,24 +38,19 @@ #include -constexpr auto EVT_MASK_RTC_TICK = EVENT_MASK(0); -constexpr auto EVT_MASK_LCD_FRAME_SYNC = EVENT_MASK(1); constexpr auto EVT_MASK_SWITCHES = EVENT_MASK(3); constexpr auto EVT_MASK_ENCODER = EVENT_MASK(4); constexpr auto EVT_MASK_TOUCH = EVENT_MASK(5); -constexpr auto EVT_MASK_APPLICATION = EVENT_MASK(6); -constexpr auto EVT_MASK_CAPTURE_THREAD = EVENT_MASK(7); class EventDispatcher { public: EventDispatcher( ui::Widget* const top_widget, - ui::Painter& painter, ui::Context& context ); void run(); - void request_stop(); + static void request_stop(); void set_display_sleep(const bool sleep); @@ -65,6 +60,14 @@ public: } } + static inline void event_isr_rtc_tick() { + events_flag_isr(EVT_MASK_RTC_TICK); + } + + static inline void event_isr_lcd_frame_sync() { + events_flag_isr(EVT_MASK_LCD_FRAME_SYNC); + } + static inline void events_flag(const eventmask_t events) { if( thread_event_loop ) { chEvtSignal(thread_event_loop, events); @@ -77,27 +80,35 @@ public: } } - static MessageHandlerMap& message_map() { - return message_map_; + template + static void send_message(T& message) { + shared_memory.app_local_queue.push(message); + events_flag(EVT_MASK_LOCAL); } private: - static MessageHandlerMap message_map_; + static constexpr auto EVT_MASK_RTC_TICK = EVENT_MASK(0); + static constexpr auto EVT_MASK_LCD_FRAME_SYNC = EVENT_MASK(1); + static constexpr auto EVT_MASK_APPLICATION = EVENT_MASK(6); + static constexpr auto EVT_MASK_LOCAL = EVENT_MASK(7); + static Thread* thread_event_loop; touch::Manager touch_manager; ui::Widget* const top_widget; - ui::Painter& painter; + ui::Painter painter; ui::Context& context; uint32_t encoder_last = 0; - bool is_running = true; + static bool is_running; bool sd_card_present = false; bool display_sleep = false; + bool halt = false; eventmask_t wait(); void dispatch(const eventmask_t events); void handle_application_queue(); + void handle_local_queue(); void handle_rtc_tick(); static ui::Widget* touch_widget(ui::Widget* const w, ui::TouchEvent event); @@ -117,4 +128,17 @@ private: void init_message_queues(); }; +class MessageHandlerRegistration { +public: + MessageHandlerRegistration( + const Message::ID message_id, + std::function&& callback + ); + + ~MessageHandlerRegistration(); + +private: + const Message::ID message_id; +}; + #endif/*__EVENT_M0_H__*/ diff --git a/firmware/application/file.cpp b/firmware/application/file.cpp index 18e75005..f4415452 100644 --- a/firmware/application/file.cpp +++ b/firmware/application/file.cpp @@ -23,65 +23,105 @@ #include -File::File(const std::string& filename, openmode mode) { - BYTE fatfs_mode = 0; - if( mode & openmode::in ) { - fatfs_mode |= FA_READ; - } - if( mode & openmode::out ) { - fatfs_mode |= FA_WRITE; - } - if( mode & openmode::trunc ) { - fatfs_mode |= FA_CREATE_ALWAYS; - } - if( mode & openmode::ate ) { - fatfs_mode |= FA_OPEN_ALWAYS; - } +/* Values added to FatFs FRESULT enum, values outside the FRESULT data type */ +static_assert(sizeof(FIL::err) == 1, "FatFs FIL::err size not expected."); +#define FR_DISK_FULL (0x100) +#define FR_EOF (0x101) +#define FR_BAD_SEEK (0x102) +#define FR_UNEXPECTED (0x103) - if( f_open(&f, filename.c_str(), fatfs_mode) == FR_OK ) { - if( mode & openmode::ate ) { - if( f_lseek(&f, f_size(&f)) != FR_OK ) { +Optional File::open_fatfs(const std::string& filename, BYTE mode) { + auto result = f_open(&f, filename.c_str(), mode); + if( result == FR_OK ) { + if( mode & FA_OPEN_ALWAYS ) { + const auto result = f_lseek(&f, f_size(&f)); + if( result != FR_OK ) { f_close(&f); } } } + + if( result == FR_OK ) { + return { }; + } else { + return { result }; + } +} + +Optional File::open(const std::string& filename) { + return open_fatfs(filename, FA_READ); +} + +Optional File::append(const std::string& filename) { + return open_fatfs(filename, FA_WRITE | FA_OPEN_ALWAYS); +} + +Optional File::create(const std::string& filename) { + return open_fatfs(filename, FA_WRITE | FA_CREATE_ALWAYS); } File::~File() { f_close(&f); } -bool File::read(void* const data, const size_t bytes_to_read) { +File::Result File::read(void* const data, const size_t bytes_to_read) { UINT bytes_read = 0; const auto result = f_read(&f, data, bytes_to_read, &bytes_read); - return (result == FR_OK) && (bytes_read == bytes_to_read); + if( result == FR_OK ) { + return { static_cast(bytes_read) }; + } else { + return { static_cast(result) }; + } } -bool File::write(const void* const data, const size_t bytes_to_write) { +File::Result File::write(const void* const data, const size_t bytes_to_write) { UINT bytes_written = 0; const auto result = f_write(&f, data, bytes_to_write, &bytes_written); - return (result == FR_OK) && (bytes_written == bytes_to_write); + if( result == FR_OK ) { + if( bytes_to_write == bytes_written ) { + return { static_cast(bytes_written) }; + } else { + return Error { FR_DISK_FULL }; + } + } else { + return { static_cast(result) }; + } } -uint64_t File::seek(const uint64_t new_position) { +File::Result File::seek(const uint64_t new_position) { + /* NOTE: Returns *old* position, not new position */ const auto old_position = f_tell(&f); - if( f_lseek(&f, new_position) != FR_OK ) { - f_close(&f); + const auto result = f_lseek(&f, new_position); + if( result != FR_OK ) { + return { static_cast(result) }; } if( f_tell(&f) != new_position ) { - f_close(&f); + return { static_cast(FR_BAD_SEEK) }; } - return old_position; + return { static_cast(old_position) }; } -bool File::puts(const std::string& string) { - const auto result = f_puts(string.c_str(), &f); - return (result >= 0); +Optional File::write_line(const std::string& s) { + const auto result_s = write(s.c_str(), s.size()); + if( result_s.is_error() ) { + return { result_s.error() }; + } + + const auto result_crlf = write("\r\n", 2); + if( result_crlf.is_error() ) { + return { result_crlf.error() }; + } + + return { }; } -bool File::sync() { +Optional File::sync() { const auto result = f_sync(&f); - return (result == FR_OK); + if( result == FR_OK ) { + return { }; + } else { + return { result }; + } } static std::string find_last_file_matching_pattern(const std::string& pattern) { @@ -140,6 +180,36 @@ std::string next_filename_stem_matching_pattern(const std::string& filename_stem namespace std { namespace filesystem { +std::string filesystem_error::what() const { + switch(err) { + case FR_OK: return "ok"; + case FR_DISK_ERR: return "disk error"; + case FR_INT_ERR: return "insanity detected"; + case FR_NOT_READY: return "not ready"; + case FR_NO_FILE: return "no file"; + case FR_NO_PATH: return "no path"; + case FR_INVALID_NAME: return "invalid name"; + case FR_DENIED: return "denied"; + case FR_EXIST: return "exists"; + case FR_INVALID_OBJECT: return "invalid object"; + case FR_WRITE_PROTECTED: return "write protected"; + case FR_INVALID_DRIVE: return "invalid drive"; + case FR_NOT_ENABLED: return "not enabled"; + case FR_NO_FILESYSTEM: return "no filesystem"; + case FR_MKFS_ABORTED: return "mkfs aborted"; + case FR_TIMEOUT: return "timeout"; + case FR_LOCKED: return "locked"; + case FR_NOT_ENOUGH_CORE: return "not enough core"; + case FR_TOO_MANY_OPEN_FILES: return "too many open files"; + case FR_INVALID_PARAMETER: return "invalid parameter"; + case FR_EOF: return "end of file"; + case FR_DISK_FULL: return "disk full"; + case FR_BAD_SEEK: return "bad seek"; + case FR_UNEXPECTED: return "unexpected"; + default: return "unknown"; + } +} + directory_iterator::directory_iterator( const char* path, const char* wild @@ -164,5 +234,24 @@ bool is_regular_file(const file_status s) { return !(s & AM_DIR); } +space_info space(const path& p) { + DWORD free_clusters { 0 }; + FATFS* fs; + if( f_getfree(p.c_str(), &free_clusters, &fs) == FR_OK ) { +#if _MAX_SS != _MIN_SS + static_assert(false, "FatFs not configured for fixed sector size"); +#else + const std::uintmax_t cluster_bytes = fs->csize * _MIN_SS; + return { + (fs->n_fatent - 2) * cluster_bytes, + free_clusters * cluster_bytes, + free_clusters * cluster_bytes, + }; +#endif + } else { + return { 0, 0, 0 }; + } +} + } /* namespace filesystem */ } /* namespace std */ diff --git a/firmware/application/file.hpp b/firmware/application/file.hpp index 6be0f9dd..f3739317 100644 --- a/firmware/application/file.hpp +++ b/firmware/application/file.hpp @@ -24,59 +24,59 @@ #include "ff.h" +#include "optional.hpp" + #include +#include #include #include #include #include -class File { -public: - enum openmode { - app = 0x100, - binary = 0x200, - in = FA_READ, - out = FA_WRITE, - trunc = FA_CREATE_ALWAYS, - ate = FA_OPEN_ALWAYS, - }; - - File(const std::string& filename, openmode mode); - ~File(); - - bool is_open() const { - return f_error(&f) == 0; - } - - bool read(void* const data, const size_t bytes_to_read); - bool write(const void* const data, const size_t bytes_to_write); - - uint64_t seek(const uint64_t new_position); - - template - bool write(const std::array& data) { - return write(data.data(), N); - } - - bool puts(const std::string& string); - - bool sync(); - -private: - FIL f; -}; - -inline constexpr File::openmode operator|(File::openmode a, File::openmode b) { - return File::openmode(static_cast(a) | static_cast(b)); -} - std::string next_filename_stem_matching_pattern(const std::string& filename_stem_pattern); namespace std { namespace filesystem { +struct filesystem_error { + constexpr filesystem_error( + ) : err { FR_OK } + { + } + + constexpr filesystem_error( + FRESULT fatfs_error + ) : err { fatfs_error } + { + } + + constexpr filesystem_error( + unsigned int other_error + ) : err { other_error } + { + } + + uint32_t code() const { + return err; + } + + std::string what() const; + +private: + uint32_t err; +}; + +using path = std::string; using file_status = BYTE; +struct space_info { + static_assert(sizeof(std::uintmax_t) >= 8, "std::uintmax_t too small ( + struct Result { + enum class Type { + Success, + Error, + } type; + union { + T value_; + Error error_; + }; + + bool is_ok() const { + return type == Type::Success; + } + + bool is_error() const { + return type == Type::Error; + } + + const T& value() const { + return value_; + } + + Error error() const { + return error_; + } + + Result() = delete; + + constexpr Result( + T value + ) : type { Type::Success }, + value_ { value } + { + } + + constexpr Result( + Error error + ) : type { Type::Error }, + error_ { error } + { + } + + ~Result() { + if( type == Type::Success ) { + value_.~T(); + } + } + }; + + File() { }; + ~File(); + + /* Prevent copies */ + File(const File&) = delete; + File& operator=(const File&) = delete; + + // TODO: Return Result<>. + Optional open(const std::string& filename); + Optional append(const std::string& filename); + Optional create(const std::string& filename); + + Result read(void* const data, const size_t bytes_to_read); + Result write(const void* const data, const size_t bytes_to_write); + + Result seek(const uint64_t new_position); + + template + Result write(const std::array& data) { + return write(data.data(), N); + } + + Optional write_line(const std::string& s); + + // TODO: Return Result<>. + Optional sync(); + +private: + FIL f; + + Optional open_fatfs(const std::string& filename, BYTE mode); +}; + #endif/*__FILE_H__*/ diff --git a/firmware/application/irq_controls.cpp b/firmware/application/irq_controls.cpp index 5a789721..cb6a2df5 100644 --- a/firmware/application/irq_controls.cpp +++ b/firmware/application/irq_controls.cpp @@ -168,8 +168,6 @@ void timer0_callback(GPTDriver* const) { EventDispatcher::events_flag_isr(event_mask); chSysUnlockFromIsr(); } - - touch::adc::start(); } /* TODO: Refactor some/all of this to appropriate shared headers? */ @@ -187,6 +185,8 @@ static GPTConfig timer0_config { }; void controls_init() { + touch::adc::start(); + /* GPT timer 0 is used to scan user interface controls -- touch screen, * navigation switches. */ diff --git a/firmware/application/irq_lcd_frame.cpp b/firmware/application/irq_lcd_frame.cpp index 585feb1f..d6a1c1bd 100644 --- a/firmware/application/irq_lcd_frame.cpp +++ b/firmware/application/irq_lcd_frame.cpp @@ -54,7 +54,7 @@ CH_IRQ_HANDLER(PIN_INT4_IRQHandler) { CH_IRQ_PROLOGUE(); chSysLockFromIsr(); - EventDispatcher::events_flag_isr(EVT_MASK_LCD_FRAME_SYNC); + EventDispatcher::event_isr_lcd_frame_sync(); chSysUnlockFromIsr(); LPC_GPIO_INT->IST = (1U << 4); diff --git a/firmware/application/irq_rtc.cpp b/firmware/application/irq_rtc.cpp index 332f1b3e..f9c047bf 100644 --- a/firmware/application/irq_rtc.cpp +++ b/firmware/application/irq_rtc.cpp @@ -39,7 +39,7 @@ CH_IRQ_HANDLER(RTC_IRQHandler) { CH_IRQ_PROLOGUE(); chSysLockFromIsr(); - EventDispatcher::events_flag_isr(EVT_MASK_RTC_TICK); + EventDispatcher::event_isr_rtc_tick(); chSysUnlockFromIsr(); rtc::interrupt::clear_all(); diff --git a/firmware/application/log_file.cpp b/firmware/application/log_file.cpp index 06e56246..fa82f4b1 100644 --- a/firmware/application/log_file.cpp +++ b/firmware/application/log_file.cpp @@ -23,21 +23,15 @@ #include "string_format.hpp" -LogFile::LogFile( - const std::string& file_path -) : file { file_path, File::openmode::out | File::openmode::ate } -{ -} - -bool LogFile::is_open() const { - return file.is_open(); -} - -bool LogFile::write_entry(const rtc::RTC& datetime, const std::string& entry) { +Optional LogFile::write_entry(const rtc::RTC& datetime, const std::string& entry) { std::string timestamp = to_string_timestamp(datetime); - return write(timestamp + " " + entry + "\r\n"); + return write_line(timestamp + " " + entry); } -bool LogFile::write(const std::string& message) { - return file.puts(message) && file.sync(); +Optional LogFile::write_line(const std::string& message) { + auto error = file.write_line(message); + if( !error.is_valid() ) { + file.sync(); + } + return error; } diff --git a/firmware/application/log_file.hpp b/firmware/application/log_file.hpp index 70a1651c..1e1f667a 100644 --- a/firmware/application/log_file.hpp +++ b/firmware/application/log_file.hpp @@ -31,16 +31,16 @@ using namespace lpc43xx; class LogFile { public: - LogFile(const std::string& file_path); + Optional append(const std::string& filename) { + return file.append(filename); + } - bool is_open() const; - - bool write_entry(const rtc::RTC& datetime, const std::string& entry); + Optional write_entry(const rtc::RTC& datetime, const std::string& entry); private: File file; - bool write(const std::string& message); + Optional write_line(const std::string& message); }; #endif/*__LOG_FILE_H__*/ diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index 80423118..9fb4f63a 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -59,8 +59,6 @@ #include "portapack.hpp" #include "portapack_shared_memory.hpp" -#include "cpld_update.hpp" - #include "message_queue.hpp" #include "ui.hpp" @@ -86,50 +84,43 @@ #include +static void event_loop() { + ui::Context context; + ui::SystemView system_view { + context, + portapack::display.screen_rect() + }; + + EventDispatcher event_dispatcher { &system_view, context }; + MessageHandlerRegistration message_handler_display_sleep { + Message::ID::DisplaySleep, + [&event_dispatcher](const Message* const) { + event_dispatcher.set_display_sleep(true); + } + }; + + event_dispatcher.run(); +} + int main(void) { portapack::init(); - if( !cpld_update_if_necessary() ) { - chSysHalt(); - } - portapack::io.init(); portapack::display.init(); sdcStart(&SDCD1, nullptr); - ui::Context context; - ui::SystemView system_view { - context, - portapack::display.screen_rect() - }; - ui::Painter painter; - EventDispatcher event_dispatcher { &system_view, painter, context }; - - EventDispatcher::message_map().register_handler(Message::ID::Shutdown, - [&event_dispatcher](const Message* const) { - event_dispatcher.request_stop(); - } - ); - EventDispatcher::message_map().register_handler(Message::ID::DisplaySleep, - [&event_dispatcher](const Message* const) { - event_dispatcher.set_display_sleep(true); - } - ); - - m4_init(portapack::spi_flash::baseband, portapack::memory::map::m4_code); - controls_init(); lcd_frame_sync_configure(); rtc_interrupt_enable(); - event_dispatcher.run(); + event_loop(); sdcDisconnect(&SDCD1); sdcStop(&SDCD1); portapack::shutdown(); - m4_init(portapack::spi_flash::hackrf, portapack::memory::map::m4_code_hackrf); + m4_init(portapack::spi_flash::image_tag_hackrf, portapack::memory::map::m4_code_hackrf); m0_halt(); return 0; diff --git a/firmware/application/portapack.cpp b/firmware/application/portapack.cpp index 2d3b2cf1..248bf09e 100644 --- a/firmware/application/portapack.cpp +++ b/firmware/application/portapack.cpp @@ -32,6 +32,8 @@ using namespace hackrf::one; #include "touch_adc.hpp" #include "audio.hpp" +#include "cpld_update.hpp" + namespace portapack { portapack::IO io { @@ -153,6 +155,14 @@ void init() { radio::init(); touch::adc::init(); + + if( !cpld_update_if_necessary() ) { + chSysHalt(); + } + + if( !cpld_hackrf_load_sram() ) { + chSysHalt(); + } } void shutdown() { @@ -160,6 +170,9 @@ void shutdown() { radio::disable(); audio::shutdown(); + + cpld_hackrf_init_from_eeprom(); + clock_manager.shutdown(); power.shutdown(); diff --git a/firmware/application/receiver_model.cpp b/firmware/application/receiver_model.cpp index e6195dba..655161eb 100644 --- a/firmware/application/receiver_model.cpp +++ b/firmware/application/receiver_model.cpp @@ -154,7 +154,6 @@ void ReceiverModel::enable() { void ReceiverModel::disable() { enabled_ = false; update_antenna_bias(); - baseband::stop(); // TODO: Responsibility for enabling/disabling the radio is muddy. // Some happens in ReceiverModel, some inside radio namespace. @@ -225,13 +224,9 @@ void ReceiverModel::update_baseband_configuration() { // protocols that need quick RX/TX turn-around. // Disabling baseband while changing sampling rates seems like a good idea... - baseband::stop(); - radio::set_baseband_rate(sampling_rate() * baseband_oversampling()); update_tuning_frequency(); radio::set_baseband_decimation_by(baseband_oversampling()); - - baseband::start(baseband_configuration); } void ReceiverModel::update_headphone_volume() { diff --git a/firmware/application/receiver_model.hpp b/firmware/application/receiver_model.hpp index 3448f369..34f32ecd 100644 --- a/firmware/application/receiver_model.hpp +++ b/firmware/application/receiver_model.hpp @@ -30,6 +30,27 @@ #include "max2837.hpp" #include "volume.hpp" +struct BasebandConfiguration { + int32_t mode; + uint32_t sampling_rate; + size_t decimation_factor; + + constexpr BasebandConfiguration( + int32_t mode, + uint32_t sampling_rate, + size_t decimation_factor = 1 + ) : mode { mode }, + sampling_rate { sampling_rate }, + decimation_factor { decimation_factor } + { + } + + constexpr BasebandConfiguration( + ) : BasebandConfiguration { -1, 0, 1 } + { + } +}; + class ReceiverModel { public: enum class Mode : int32_t { diff --git a/firmware/application/touch_adc.cpp b/firmware/application/touch_adc.cpp index 0808f9fc..be731282 100644 --- a/firmware/application/touch_adc.cpp +++ b/firmware/application/touch_adc.cpp @@ -70,26 +70,15 @@ void start() { // static constexpr bool monitor_overruns_and_not_dones = false; Samples get() { - const auto& frame = shared_memory.touch_adc_frame; - const auto xp = frame.dr[portapack::adc0_touch_xp_input]; - const auto xn = frame.dr[portapack::adc0_touch_xn_input]; - const auto yp = frame.dr[portapack::adc0_touch_yp_input]; - const auto yn = frame.dr[portapack::adc0_touch_yn_input]; - - // if( monitor_overruns_and_not_dones ) { - // const auto dr_and = xp & xn & yp & yn; - // const auto dr_or = xp | xn | yp | yn; - // const bool done = (dr_and >> 31) & 1; - // const bool overrun = (dr_or >> 30) & 1; - // led_tx.write(overrun); - // led_rx.write(!done); - // } - + const auto xp_reg = LPC_ADC0->DR[portapack::adc0_touch_xp_input]; + const auto xn_reg = LPC_ADC0->DR[portapack::adc0_touch_xn_input]; + const auto yp_reg = LPC_ADC0->DR[portapack::adc0_touch_yp_input]; + const auto yn_reg = LPC_ADC0->DR[portapack::adc0_touch_yn_input]; return { - (xp >> 6) & 0x3ff, - (xn >> 6) & 0x3ff, - (yp >> 6) & 0x3ff, - (yn >> 6) & 0x3ff, + (xp_reg >> 6) & 0x3ff, + (xn_reg >> 6) & 0x3ff, + (yp_reg >> 6) & 0x3ff, + (yn_reg >> 6) & 0x3ff, }; } diff --git a/firmware/application/tpms_app.cpp b/firmware/application/tpms_app.cpp index abe27450..0c96971c 100644 --- a/firmware/application/tpms_app.cpp +++ b/firmware/application/tpms_app.cpp @@ -21,10 +21,11 @@ #include "tpms_app.hpp" -#include "event_m0.hpp" - #include "baseband_api.hpp" +#include "portapack.hpp" +using namespace portapack; + #include "string_format.hpp" #include "utility.hpp" @@ -49,26 +50,31 @@ std::string temperature(Temperature temperature) { return to_string_dec_int(temperature.celsius(), 3); } +std::string flags(Flags flags) { + return to_string_hex(flags, 2); +} + +static std::string signal_type(SignalType signal_type) { + switch(signal_type) { + case SignalType::FSK_19k2_Schrader: return "FSK 38400 19200 Schrader"; + case SignalType::OOK_8k192_Schrader: return "OOK - 8192 Schrader"; + case SignalType::OOK_8k4_Schrader: return "OOK - 8400 Schrader"; + default: return "- - - -"; + } +} + } /* namespace format */ } /* namespace tpms */ -TPMSLogger::TPMSLogger( - const std::string& file_path -) : log_file { file_path } -{ -} - void TPMSLogger::on_packet(const tpms::Packet& packet, const uint32_t target_frequency) { const auto hex_formatted = packet.symbols_formatted(); - if( log_file.is_open() ) { - // TODO: function doesn't take uint64_t, so when >= 1<<32, weirdness will ensue! - const auto tuning_frequency_str = to_string_dec_uint(target_frequency, 10); + // TODO: function doesn't take uint64_t, so when >= 1<<32, weirdness will ensue! + const auto tuning_frequency_str = to_string_dec_uint(target_frequency, 10); - std::string entry = tuning_frequency_str + " FSK 38.4 19.2 " + hex_formatted.data + "/" + hex_formatted.errors; - log_file.write_entry(packet.received_at(), entry); - } + std::string entry = tuning_frequency_str + " " + tpms::format::signal_type(packet.signal_type()) + " " + hex_formatted.data + "/" + hex_formatted.errors; + log_file.write_entry(packet.received_at(), entry); } const TPMSRecentEntry::Key TPMSRecentEntry::invalid_key = { tpms::Reading::Type::None, 0 }; @@ -82,16 +88,20 @@ void TPMSRecentEntry::update(const tpms::Reading& reading) { if( reading.temperature().is_valid() ) { last_temperature = reading.temperature(); } + if( reading.flags().is_valid() ) { + last_flags = reading.flags(); + } } namespace ui { -static const std::array, 5> tpms_columns { { +static const std::array, 6> tpms_columns { { { "Tp", 2 }, { "ID", 8 }, { "kPa", 3 }, { "C", 3 }, { "Cnt", 3 }, + { "Fl", 2 }, } }; template<> @@ -143,63 +153,72 @@ void RecentEntriesView::draw( line += " " + to_string_dec_uint(entry.received_count, 3); } + if( entry.last_flags.is_valid() ) { + line += " " + tpms::format::flags(entry.last_flags.value()); + } else { + line += " " " "; + } + line.resize(target_rect.width() / 8, ' '); painter.draw_string(target_rect.pos, draw_style, line); } TPMSAppView::TPMSAppView(NavigationView&) { + baseband::run_image(portapack::spi_flash::image_tag_tpms); + add_children({ { + &rssi, + &channel, + &options_band, + &field_rf_amp, + &field_lna, + &field_vga, &recent_entries_view, } }); - EventDispatcher::message_map().register_handler(Message::ID::TPMSPacket, - [this](Message* const p) { - const auto message = static_cast(p); - const tpms::Packet packet { message->packet }; - this->on_packet(message->signal_type, packet); - } - ); - radio::enable({ tuning_frequency(), sampling_rate, baseband_bandwidth, rf::Direction::Receive, - false, 32, 32, + false, + static_cast(receiver_model.lna()), + static_cast(receiver_model.vga()), 1, }); - baseband::start({ - .mode = 5, - .sampling_rate = sampling_rate, - .decimation_factor = 1, - }); + options_band.on_change = [this](size_t, OptionsField::value_t v) { + this->on_band_changed(v); + }; + options_band.set_by_value(target_frequency()); - logger = std::make_unique("tpms.txt"); + logger = std::make_unique(); + if( logger ) { + logger->append("tpms.txt"); + } } TPMSAppView::~TPMSAppView() { - baseband::stop(); radio::disable(); - EventDispatcher::message_map().unregister_handler(Message::ID::TPMSPacket); + baseband::shutdown(); } void TPMSAppView::focus() { - recent_entries_view.focus(); + options_band.focus(); } void TPMSAppView::set_parent_rect(const Rect new_parent_rect) { View::set_parent_rect(new_parent_rect); - recent_entries_view.set_parent_rect({ 0, 0, new_parent_rect.width(), new_parent_rect.height() }); + recent_entries_view.set_parent_rect({ 0, header_height, new_parent_rect.width(), new_parent_rect.height() - header_height }); } -void TPMSAppView::on_packet(const tpms::SignalType signal_type, const tpms::Packet& packet) { +void TPMSAppView::on_packet(const tpms::Packet& packet) { if( logger ) { logger->on_packet(packet, target_frequency()); } - const auto reading_opt = packet.reading(signal_type); + const auto reading_opt = packet.reading(); if( reading_opt.is_valid() ) { const auto reading = reading_opt.value(); recent.on_packet({ reading.type(), reading.id() }, reading); @@ -212,8 +231,17 @@ void TPMSAppView::on_show_list() { recent_entries_view.focus(); } +void TPMSAppView::on_band_changed(const uint32_t new_band_frequency) { + set_target_frequency(new_band_frequency); +} + +void TPMSAppView::set_target_frequency(const uint32_t new_value) { + target_frequency_ = new_value; + radio::set_tuning_frequency(tuning_frequency()); +} + uint32_t TPMSAppView::target_frequency() const { - return initial_target_frequency; + return target_frequency_; } uint32_t TPMSAppView::tuning_frequency() const { diff --git a/firmware/application/tpms_app.hpp b/firmware/application/tpms_app.hpp index 24516908..84aacd61 100644 --- a/firmware/application/tpms_app.hpp +++ b/firmware/application/tpms_app.hpp @@ -24,6 +24,11 @@ #include "ui_widget.hpp" #include "ui_navigation.hpp" +#include "ui_receiver.hpp" +#include "ui_rssi.hpp" +#include "ui_channel.hpp" + +#include "event_m0.hpp" #include "log_file.hpp" @@ -51,6 +56,7 @@ struct TPMSRecentEntry { Optional last_pressure; Optional last_temperature; + Optional last_flags; TPMSRecentEntry( const Key& key @@ -70,7 +76,9 @@ using TPMSRecentEntries = RecentEntries; class TPMSLogger { public: - TPMSLogger(const std::string& file_path); + Optional append(const std::string& filename) { + return log_file.append(filename); + } void on_packet(const tpms::Packet& packet, const uint32_t target_frequency); @@ -102,15 +110,61 @@ private: static constexpr uint32_t sampling_rate = 2457600; static constexpr uint32_t baseband_bandwidth = 1750000; + MessageHandlerRegistration message_handler_packet { + Message::ID::TPMSPacket, + [this](Message* const p) { + const auto message = static_cast(p); + const tpms::Packet packet { message->packet, message->signal_type }; + this->on_packet(packet); + } + }; + + static constexpr ui::Dim header_height = 2 * 16; + + RSSI rssi { + { 21 * 8, 0, 6 * 8, 4 }, + }; + + Channel channel { + { 21 * 8, 5, 6 * 8, 4 }, + }; + + OptionsField options_band { + { 0 * 8, 0 * 16 }, + 3, + { + { "315", 315000000 }, + { "434", 433920000 }, + } + }; + + RFAmpField field_rf_amp { + { 13 * 8, 0 * 16 } + }; + + LNAGainField field_lna { + { 15 * 8, 0 * 16 } + }; + + VGAGainField field_vga { + { 18 * 8, 0 * 16 } + }; + TPMSRecentEntries recent; std::unique_ptr logger; TPMSRecentEntriesView recent_entries_view { recent }; - void on_packet(const tpms::SignalType signal_type, const tpms::Packet& packet); + uint32_t target_frequency_ = initial_target_frequency; + + void on_packet(const tpms::Packet& packet); void on_show_list(); + void on_band_changed(const uint32_t new_band_frequency); + uint32_t target_frequency() const; + void set_target_frequency(const uint32_t new_value); + uint32_t tuning_frequency() const; }; diff --git a/firmware/application/ui_audio.cpp b/firmware/application/ui_audio.cpp index 65fd3832..389a65e1 100644 --- a/firmware/application/ui_audio.cpp +++ b/firmware/application/ui_audio.cpp @@ -21,26 +21,12 @@ #include "ui_audio.hpp" -#include "event_m0.hpp" - #include "utility.hpp" #include namespace ui { -void Audio::on_show() { - EventDispatcher::message_map().register_handler(Message::ID::AudioStatistics, - [this](const Message* const p) { - this->on_statistics_update(static_cast(p)->statistics); - } - ); -} - -void Audio::on_hide() { - EventDispatcher::message_map().unregister_handler(Message::ID::AudioStatistics); -} - void Audio::paint(Painter& painter) { const auto r = screen_rect(); diff --git a/firmware/application/ui_audio.hpp b/firmware/application/ui_audio.hpp index 00d7f908..e1ae5ad7 100644 --- a/firmware/application/ui_audio.hpp +++ b/firmware/application/ui_audio.hpp @@ -26,6 +26,8 @@ #include "ui_widget.hpp" #include "ui_painter.hpp" +#include "event_m0.hpp" + #include "message.hpp" #include @@ -42,15 +44,19 @@ public: { } - void on_show() override; - void on_hide() override; - void paint(Painter& painter) override; private: int32_t rms_db_; int32_t max_db_; + MessageHandlerRegistration message_handler_statistics { + Message::ID::AudioStatistics, + [this](const Message* const p) { + this->on_statistics_update(static_cast(p)->statistics); + } + }; + void on_statistics_update(const AudioStatistics& statistics); }; diff --git a/firmware/application/ui_baseband_stats_view.cpp b/firmware/application/ui_baseband_stats_view.cpp index 0d576e81..44774465 100644 --- a/firmware/application/ui_baseband_stats_view.cpp +++ b/firmware/application/ui_baseband_stats_view.cpp @@ -21,8 +21,6 @@ #include "ui_baseband_stats_view.hpp" -#include "event_m0.hpp" - #include #include @@ -41,19 +39,6 @@ BasebandStatsView::BasebandStatsView() { } }); } -void BasebandStatsView::on_show() { - EventDispatcher::message_map().register_handler(Message::ID::BasebandStatistics, - [this](const Message* const p) { - this->on_statistics_update(static_cast(p)->statistics); - } - ); -} - -void BasebandStatsView::on_hide() { - EventDispatcher::message_map().unregister_handler(Message::ID::BasebandStatistics); -} - - static std::string ticks_to_percent_string(const uint32_t ticks) { constexpr size_t decimal_digits = 1; constexpr size_t decimal_factor = decimal_digits * 10; diff --git a/firmware/application/ui_baseband_stats_view.hpp b/firmware/application/ui_baseband_stats_view.hpp index 70026618..2c07c20b 100644 --- a/firmware/application/ui_baseband_stats_view.hpp +++ b/firmware/application/ui_baseband_stats_view.hpp @@ -23,6 +23,9 @@ #define __UI_BASEBAND_STATS_VIEW_H__ #include "ui_widget.hpp" + +#include "event_m0.hpp" + #include "message.hpp" namespace ui { @@ -31,15 +34,19 @@ class BasebandStatsView : public View { public: BasebandStatsView(); - void on_show() override; - void on_hide() override; - private: Text text_stats { { 0 * 8, 0, (4 * 4 + 3) * 8, 1 * 16 }, "", }; + MessageHandlerRegistration message_handler_stats { + Message::ID::BasebandStatistics, + [this](const Message* const p) { + this->on_statistics_update(static_cast(p)->statistics); + } + }; + void on_statistics_update(const BasebandStatistics& statistics); }; diff --git a/firmware/application/ui_channel.cpp b/firmware/application/ui_channel.cpp index 62f1b49a..3d21e535 100644 --- a/firmware/application/ui_channel.cpp +++ b/firmware/application/ui_channel.cpp @@ -21,26 +21,12 @@ #include "ui_channel.hpp" -#include "event_m0.hpp" - #include "utility.hpp" #include namespace ui { -void Channel::on_show() { - EventDispatcher::message_map().register_handler(Message::ID::ChannelStatistics, - [this](const Message* const p) { - this->on_statistics_update(static_cast(p)->statistics); - } - ); -} - -void Channel::on_hide() { - EventDispatcher::message_map().unregister_handler(Message::ID::ChannelStatistics); -} - void Channel::paint(Painter& painter) { const auto r = screen_rect(); diff --git a/firmware/application/ui_channel.hpp b/firmware/application/ui_channel.hpp index 3b7f4969..bf8e832e 100644 --- a/firmware/application/ui_channel.hpp +++ b/firmware/application/ui_channel.hpp @@ -26,6 +26,8 @@ #include "ui_widget.hpp" #include "ui_painter.hpp" +#include "event_m0.hpp" + #include "message.hpp" #include @@ -41,14 +43,18 @@ public: { } - void on_show() override; - void on_hide() override; - void paint(Painter& painter) override; private: int32_t max_db_; + MessageHandlerRegistration message_handler_stats { + Message::ID::ChannelStatistics, + [this](const Message* const p) { + this->on_statistics_update(static_cast(p)->statistics); + } + }; + void on_statistics_update(const ChannelStatistics& statistics); }; diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index d47956bc..29a5dc32 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -88,7 +88,7 @@ SystemStatusView::SystemStatusView() { button_sleep.on_select = [this](ImageButton&) { DisplaySleepMessage message; - EventDispatcher::message_map().send(&message); + EventDispatcher::send_message(message); }; } @@ -123,7 +123,11 @@ void SystemStatusView::on_camera() { return; } - PNGWriter png { filename_stem + ".PNG" }; + PNGWriter png; + auto create_error = png.create(filename_stem + ".PNG"); + if( create_error.is_valid() ) { + return; + } for(int i=0; i<320; i++) { std::array row; @@ -150,6 +154,10 @@ View* NavigationView::push_view(std::unique_ptr new_view) { } void NavigationView::pop() { + if( view() == modal_view ) { + modal_view = nullptr; + } + // Can't pop last item from stack. if( view_stack.size() > 1 ) { free_view(); @@ -160,6 +168,16 @@ void NavigationView::pop() { } } +void NavigationView::display_modal( + const std::string& title, + const std::string& message +) { + /* If a modal view is already visible, don't display another */ + if( !modal_view ) { + modal_view = push(title, message); + } +} + void NavigationView::free_view() { remove_child(view()); } @@ -306,8 +324,8 @@ Context& SystemView::context() const { /* HackRFFirmwareView ****************************************************/ HackRFFirmwareView::HackRFFirmwareView(NavigationView& nav) { - button_yes.on_select = [&nav](Button&){ - m4_request_shutdown(); + button_yes.on_select = [](Button&){ + EventDispatcher::request_stop(); }; button_no.on_select = [&nav](Button&){ @@ -404,4 +422,34 @@ void NotImplementedView::focus() { button_done.focus(); } +/* ModalMessageView ******************************************************/ + +ModalMessageView::ModalMessageView( + NavigationView& nav, + const std::string& title, + const std::string& message +) : title_ { title } +{ + button_done.on_select = [&nav](Button&){ + nav.pop(); + }; + + add_children({ { + &text_message, + &button_done, + } }); + + text_message.set(message); + + const int text_message_width = message.size() * 8; + text_message.set_parent_rect({ + (240 - text_message_width) / 2, 7 * 16, + text_message_width, 16 + }); +} + +void ModalMessageView::focus() { + button_done.focus(); +} + } /* namespace ui */ diff --git a/firmware/application/ui_navigation.hpp b/firmware/application/ui_navigation.hpp index 3947dc38..40c3e060 100644 --- a/firmware/application/ui_navigation.hpp +++ b/firmware/application/ui_navigation.hpp @@ -112,10 +112,13 @@ public: void pop(); + void display_modal(const std::string& title, const std::string& message); + void focus() override; private: std::vector> view_stack; + Widget* modal_view { nullptr }; Widget* view() const; @@ -256,6 +259,29 @@ private: }; }; +class ModalMessageView : public View { +public: + ModalMessageView( + NavigationView& nav, + const std::string& title, + const std::string& message + ); + + void focus() override; + + std::string title() const override { return title_; }; + +private: + const std::string title_; + + Text text_message { }; + + Button button_done { + { 10 * 8, 13 * 16, 10 * 8, 24 }, + "OK", + }; +}; + } /* namespace ui */ #endif/*__UI_NAVIGATION_H__*/ diff --git a/firmware/application/ui_receiver.cpp b/firmware/application/ui_receiver.cpp index 0494d47c..18a5c613 100644 --- a/firmware/application/ui_receiver.cpp +++ b/firmware/application/ui_receiver.cpp @@ -232,7 +232,7 @@ FrequencyOptionsView::FrequencyOptionsView( { set_style(style); - options_step.on_change = [this](size_t n, OptionsField::value_t v) { + field_step.on_change = [this](size_t n, OptionsField::value_t v) { (void)n; this->on_step_changed(v); }; @@ -243,14 +243,14 @@ FrequencyOptionsView::FrequencyOptionsView( add_children({ { &text_step, - &options_step, + &field_step, &field_ppm, &text_ppm, } }); } void FrequencyOptionsView::set_step(rf::Frequency f) { - options_step.set_by_value(f); + field_step.set_by_value(f); } void FrequencyOptionsView::set_reference_ppm_correction(int32_t v) { @@ -269,6 +269,25 @@ void FrequencyOptionsView::on_reference_ppm_correction_changed(int32_t v) { } } +/* RFAmpField ************************************************************/ + +RFAmpField::RFAmpField( + Point parent_pos +) : NumberField { + parent_pos, + 1, + { 0, 1 }, + 1, + ' ', + } +{ + set_value(receiver_model.rf_amp()); + + on_change = [](int32_t v) { + receiver_model.set_rf_amp(v); + }; +} + /* RadioGainOptionsView **************************************************/ RadioGainOptionsView::RadioGainOptionsView( @@ -282,20 +301,6 @@ RadioGainOptionsView::RadioGainOptionsView( &label_rf_amp, &field_rf_amp, } }); - - field_rf_amp.on_change = [this](int32_t v) { - this->on_rf_amp_changed(v); - }; -} - -void RadioGainOptionsView::set_rf_amp(int32_t v_db) { - field_rf_amp.set_value(v_db); -} - -void RadioGainOptionsView::on_rf_amp_changed(bool enable) { - if( on_change_rf_amp ) { - on_change_rf_amp(enable); - } } /* LNAGainField **********************************************************/ @@ -309,6 +314,11 @@ LNAGainField::LNAGainField( ' ', } { + set_value(receiver_model.lna()); + + on_change = [](int32_t v) { + receiver_model.set_lna(v); + }; } void LNAGainField::on_focus() { @@ -329,6 +339,11 @@ VGAGainField::VGAGainField( ' ', } { + set_value(receiver_model.vga()); + + on_change = [](int32_t v) { + receiver_model.set_vga(v); + }; } void VGAGainField::on_focus() { diff --git a/firmware/application/ui_receiver.hpp b/firmware/application/ui_receiver.hpp index 6aff9dda..1d4cb6d3 100644 --- a/firmware/application/ui_receiver.hpp +++ b/firmware/application/ui_receiver.hpp @@ -229,6 +229,32 @@ private: void update_text(); }; +class FrequencyStepView : public OptionsField { +public: + FrequencyStepView( + Point parent_pos + ) : OptionsField { + parent_pos, + 5, + { + { " 100", 100 }, + { " 1k ", 1000 }, + { " 3k ", 3000 }, /* Approximate SSB bandwidth */ + { " 5k ", 5000 }, + { " 6k3", 6250 }, + { " 9k ", 9000 }, /* channel spacing for LF, MF in some regions */ + { " 10k ", 10000 }, + { " 12k5", 12500 }, + { " 25k ", 25000 }, + { "100k ", 100000 }, + { " 1M ", 1000000 }, + { " 10M ", 10000000 }, + } + } + { + } +}; + class FrequencyOptionsView : public View { public: std::function on_change_step; @@ -245,23 +271,8 @@ private: "Step" }; - OptionsField options_step { + FrequencyStepView field_step { { 5 * 8, 0 * 16 }, - 5, - { - { " 100", 100 }, - { " 1k ", 1000 }, - { " 3k ", 3000 }, /* Approximate SSB bandwidth */ - { " 5k ", 5000 }, - { " 6k3", 6250 }, - { " 9k ", 9000 }, /* channel spacing for LF, MF in some regions */ - { " 10k ", 10000 }, - { " 12k5", 12500 }, - { " 25k ", 25000 }, - { "100k ", 100000 }, - { " 1M ", 1000000 }, - { " 10M ", 10000000 }, - } }; void on_step_changed(rf::Frequency v); @@ -281,29 +292,24 @@ private: }; }; +class RFAmpField : public NumberField { +public: + RFAmpField(Point parent_pos); +}; + class RadioGainOptionsView : public View { public: - std::function on_change_rf_amp; - RadioGainOptionsView(const Rect parent_rect, const Style* const style); - void set_rf_amp(int32_t v_db); - private: Text label_rf_amp { { 0 * 8, 0 * 16, 3 * 8, 1 * 16 }, "Amp" }; - NumberField field_rf_amp { + RFAmpField field_rf_amp { { 4 * 8, 0 * 16}, - 1, - { 0, 1 }, - 1, - ' ', }; - - void on_rf_amp_changed(bool enable); }; class LNAGainField : public NumberField { diff --git a/firmware/application/ui_record_view.cpp b/firmware/application/ui_record_view.cpp index 3f905f06..695a454d 100644 --- a/firmware/application/ui_record_view.cpp +++ b/firmware/application/ui_record_view.cpp @@ -32,43 +32,61 @@ using namespace portapack; #include -class RawFileWriter : public Writer { +class FileWriter : public Writer { public: - RawFileWriter( - const std::string& filename - ) : file { filename, File::openmode::out | File::openmode::binary | File::openmode::trunc } - { + FileWriter() = default; + + FileWriter(const FileWriter&) = delete; + FileWriter& operator=(const FileWriter&) = delete; + FileWriter(FileWriter&& file) = delete; + FileWriter& operator=(FileWriter&&) = delete; + + Optional create(const std::string& filename) { + return file.create(filename); } - bool write(const void* const buffer, const size_t bytes) override { - return file.write(buffer, bytes); + File::Result write(const void* const buffer, const size_t bytes) override { + auto write_result = file.write(buffer, bytes) ; + if( write_result.is_ok() ) { + bytes_written += write_result.value(); + } + return write_result; } -private: +protected: File file; + uint64_t bytes_written { 0 }; }; -class WAVFileWriter : public Writer { +using RawFileWriter = FileWriter; + +class WAVFileWriter : public FileWriter { public: WAVFileWriter( - const std::string& filename, size_t sampling_rate - ) : file { filename, File::openmode::out | File::openmode::binary | File::openmode::trunc }, - header { sampling_rate } + ) : header { sampling_rate } { - update_header(); } + + WAVFileWriter(const WAVFileWriter&) = delete; + WAVFileWriter& operator=(const WAVFileWriter&) = delete; + WAVFileWriter(WAVFileWriter&&) = delete; + WAVFileWriter& operator=(WAVFileWriter&&) = delete; + ~WAVFileWriter() { update_header(); } - bool write(const void* const buffer, const size_t bytes) override { - const auto success = file.write(buffer, bytes) ; - if( success ) { - bytes_written += bytes; + Optional create( + const std::string& filename + ) { + const auto create_error = FileWriter::create(filename); + if( create_error.is_valid() ) { + return create_error; + } else { + return update_header(); } - return success; } private: @@ -121,15 +139,24 @@ private: data_t data; }; - File file; header_t header; - uint64_t bytes_written { 0 }; - void update_header() { + Optional update_header() { header.set_data_size(bytes_written); - const auto old_position = file.seek(0); - file.write(&header, sizeof(header)); - file.seek(old_position); + const auto seek_0_result = file.seek(0); + if( seek_0_result.is_error() ) { + return seek_0_result.error(); + } + const auto old_position = seek_0_result.value(); + const auto write_result = file.write(&header, sizeof(header)); + if( write_result.is_error() ) { + return write_result.error(); + } + const auto seek_old_result = file.seek(old_position); + if( seek_old_result.is_error() ) { + return seek_old_result.error(); + } + return { }; } }; @@ -139,20 +166,24 @@ RecordView::RecordView( const Rect parent_rect, std::string filename_stem_pattern, const FileType file_type, - const size_t buffer_size_k, - const size_t buffer_count_k + const size_t write_size, + const size_t buffer_count ) : View { parent_rect }, filename_stem_pattern { filename_stem_pattern }, file_type { file_type }, - buffer_size_k { buffer_size_k }, - buffer_count_k { buffer_count_k } + write_size { write_size }, + buffer_count { buffer_count } { add_children({ { + &rect_background, &button_record, &text_record_filename, &text_record_dropped, + &text_time_available, } }); + rect_background.set_parent_rect({ { 0, 0 }, size() }); + button_record.on_select = [this](ImageButton&) { this->toggle(); }; @@ -170,6 +201,21 @@ void RecordView::focus() { button_record.focus(); } +void RecordView::set_sampling_rate(const size_t new_sampling_rate) { + if( new_sampling_rate != sampling_rate ) { + stop(); + sampling_rate = new_sampling_rate; + + button_record.hidden(sampling_rate == 0); + text_record_filename.hidden(sampling_rate == 0); + text_record_dropped.hidden(sampling_rate == 0); + text_time_available.hidden(sampling_rate == 0); + rect_background.hidden(sampling_rate != 0); + + update_status_display(); + } +} + bool RecordView::is_active() const { return (bool)capture_thread; } @@ -200,17 +246,39 @@ void RecordView::start() { std::unique_ptr writer; switch(file_type) { case FileType::WAV: - writer = std::make_unique( - filename_stem + ".WAV", - sampling_rate - ); + { + auto p = std::make_unique( + sampling_rate + ); + auto create_error = p->create( + filename_stem + ".WAV" + ); + if( create_error.is_valid() ) { + handle_error(create_error.value()); + } else { + writer = std::move(p); + } + } break; case FileType::RawS16: - write_metadata_file(filename_stem + ".TXT"); - writer = std::make_unique( - filename_stem + ".C16" - ); + { + const auto metadata_file_error = write_metadata_file(filename_stem + ".TXT"); + if( metadata_file_error.is_valid() ) { + handle_error(metadata_file_error.value()); + return; + } + + auto p = std::make_unique(); + auto create_error = p->create( + filename_stem + ".C16" + ); + if( create_error.is_valid() ) { + handle_error(create_error.value()); + } else { + writer = std::move(p); + } + } break; default: @@ -222,9 +290,19 @@ void RecordView::start() { button_record.set_bitmap(&bitmap_stop); capture_thread = std::make_unique( std::move(writer), - buffer_size_k, buffer_count_k + write_size, buffer_count, + []() { + CaptureThreadDoneMessage message { }; + EventDispatcher::send_message(message); + }, + [](File::Error error) { + CaptureThreadDoneMessage message { error.code() }; + EventDispatcher::send_message(message); + } ); } + + update_status_display(); } void RecordView::stop() { @@ -232,20 +310,66 @@ void RecordView::stop() { capture_thread.reset(); button_record.set_bitmap(&bitmap_record); } + + update_status_display(); } -void RecordView::write_metadata_file(const std::string& filename) { - File file { filename, File::openmode::out | File::openmode::trunc }; - file.puts("sample_rate=" + to_string_dec_uint(sampling_rate) + "\n"); - file.puts("center_frequency=" + to_string_dec_uint(receiver_model.tuning_frequency()) + "\n"); +Optional RecordView::write_metadata_file(const std::string& filename) { + File file; + const auto create_error = file.create(filename); + if( create_error.is_valid() ) { + return create_error; + } else { + const auto error_line1 = file.write_line("sample_rate=" + to_string_dec_uint(sampling_rate)); + if( error_line1.is_valid() ) { + return error_line1; + } + const auto error_line2 = file.write_line("center_frequency=" + to_string_dec_uint(receiver_model.tuning_frequency())); + if( error_line2.is_valid() ) { + return error_line2; + } + return { }; + } } void RecordView::on_tick_second() { + update_status_display(); +} + +void RecordView::update_status_display() { if( is_active() ) { const auto dropped_percent = std::min(99U, capture_thread->state().dropped_percent()); const auto s = to_string_dec_uint(dropped_percent, 2, ' ') + "\%"; text_record_dropped.set(s); } + + if( sampling_rate ) { + const auto space_info = std::filesystem::space(""); + const uint32_t bytes_per_second = file_type == FileType::WAV ? (sampling_rate * 2) : (sampling_rate * 4); + const uint32_t available_seconds = space_info.free / bytes_per_second; + const uint32_t seconds = available_seconds % 60; + const uint32_t available_minutes = available_seconds / 60; + const uint32_t minutes = available_minutes % 60; + const uint32_t hours = available_minutes / 60; + const std::string available_time = + to_string_dec_uint(hours, 3, ' ') + ":" + + to_string_dec_uint(minutes, 2, '0') + ":" + + to_string_dec_uint(seconds, 2, '0'); + text_time_available.set(available_time); + } +} + +void RecordView::handle_capture_thread_done(const File::Error error) { + stop(); + if( error.code() ) { + handle_error(error); + } +} + +void RecordView::handle_error(const File::Error error) { + if( on_error ) { + on_error(error.what()); + } } } /* namespace ui */ diff --git a/firmware/application/ui_record_view.hpp b/firmware/application/ui_record_view.hpp index 0c8c24bb..023fb0d5 100644 --- a/firmware/application/ui_record_view.hpp +++ b/firmware/application/ui_record_view.hpp @@ -37,6 +37,8 @@ namespace ui { class RecordView : public View { public: + std::function on_error; + enum FileType { RawS16 = 2, WAV = 3, @@ -46,19 +48,14 @@ public: const Rect parent_rect, std::string filename_stem_pattern, FileType file_type, - const size_t buffer_size_k, - const size_t buffer_count_k + const size_t write_size, + const size_t buffer_count ); ~RecordView(); void focus() override; - void set_sampling_rate(const size_t new_sampling_rate) { - if( new_sampling_rate != sampling_rate ) { - stop(); - sampling_rate = new_sampling_rate; - } - } + void set_sampling_rate(const size_t new_sampling_rate); void start(); void stop(); @@ -67,17 +64,25 @@ public: private: void toggle(); - void write_metadata_file(const std::string& filename); + Optional write_metadata_file(const std::string& filename); void on_tick_second(); + void update_status_display(); + + void handle_capture_thread_done(const File::Error error); + void handle_error(const File::Error error); const std::string filename_stem_pattern; const FileType file_type; - const size_t buffer_size_k; - const size_t buffer_count_k; + const size_t write_size; + const size_t buffer_count; size_t sampling_rate { 0 }; SignalToken signal_token_tick_second; + Rectangle rect_background { + Color::black() + }; + ImageButton button_record { { 0 * 8, 0 * 16, 2 * 8, 1 * 16 }, &bitmap_record, @@ -95,7 +100,20 @@ private: "", }; + Text text_time_available { + { 21 * 8, 0 * 16, 9 * 8, 16 }, + "", + }; + std::unique_ptr capture_thread; + + MessageHandlerRegistration message_handler_capture_thread_error { + Message::ID::CaptureThreadDone, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + this->handle_capture_thread_done(message.error); + } + }; }; } /* namespace ui */ diff --git a/firmware/application/ui_rssi.cpp b/firmware/application/ui_rssi.cpp index a5646863..ab506906 100644 --- a/firmware/application/ui_rssi.cpp +++ b/firmware/application/ui_rssi.cpp @@ -21,26 +21,12 @@ #include "ui_rssi.hpp" -#include "event_m0.hpp" - #include "utility.hpp" #include namespace ui { -void RSSI::on_show() { - EventDispatcher::message_map().register_handler(Message::ID::RSSIStatistics, - [this](const Message* const p) { - this->on_statistics_update(static_cast(p)->statistics); - } - ); -} - -void RSSI::on_hide() { - EventDispatcher::message_map().unregister_handler(Message::ID::RSSIStatistics); -} - void RSSI::paint(Painter& painter) { const auto r = screen_rect(); diff --git a/firmware/application/ui_rssi.hpp b/firmware/application/ui_rssi.hpp index 5c457039..08eeadcb 100644 --- a/firmware/application/ui_rssi.hpp +++ b/firmware/application/ui_rssi.hpp @@ -26,6 +26,8 @@ #include "ui_widget.hpp" #include "ui_painter.hpp" +#include "event_m0.hpp" + #include "message.hpp" #include @@ -43,9 +45,6 @@ public: { } - void on_show() override; - void on_hide() override; - void paint(Painter& painter) override; private: @@ -53,6 +52,13 @@ private: int32_t avg_; int32_t max_; + MessageHandlerRegistration message_handler_stats { + Message::ID::RSSIStatistics, + [this](const Message* const p) { + this->on_statistics_update(static_cast(p)->statistics); + } + }; + void on_statistics_update(const RSSIStatistics& statistics); }; diff --git a/firmware/application/ui_sd_card_debug.cpp b/firmware/application/ui_sd_card_debug.cpp index 28d164e2..eac201ea 100644 --- a/firmware/application/ui_sd_card_debug.cpp +++ b/firmware/application/ui_sd_card_debug.cpp @@ -27,6 +27,7 @@ #include "lfsr_random.hpp" #include "ff.h" +#include "diskio.h" #include "ch.h" #include "hal.h" @@ -133,22 +134,24 @@ private: return Result::FailHeap; } - File file { filename, File::openmode::out | File::openmode::binary | File::openmode::trunc }; - if( !file.is_open() ) { + File file; + auto file_create_error = file.create(filename); + if( file_create_error.is_valid() ) { return Result::FailFileOpenWrite; } lfsr_word_t v = 1; const halrtcnt_t test_start = halGetCounterValue(); - while( !chThdShouldTerminate() && file.is_open() && (_stats.write_bytes < bytes_to_write) ) { + while( !chThdShouldTerminate() && (_stats.write_bytes < bytes_to_write) ) { lfsr_fill(v, reinterpret_cast(buffer->data()), sizeof(*buffer.get()) / sizeof(lfsr_word_t) ); const halrtcnt_t write_start = halGetCounterValue(); - if( !file.write(buffer->data(), buffer->size()) ) { + const auto result_write = file.write(buffer->data(), buffer->size()); + if( result_write.is_error() ) { break; } const halrtcnt_t write_end = halGetCounterValue(); @@ -178,17 +181,19 @@ private: return Result::FailHeap; } - File file { filename, File::openmode::in | File::openmode::binary }; - if( !file.is_open() ) { + File file; + auto file_open_error = file.open(filename); + if( file_open_error.is_valid() ) { return Result::FailFileOpenRead; } lfsr_word_t v = 1; const halrtcnt_t test_start = halGetCounterValue(); - while( !chThdShouldTerminate() && file.is_open() && (_stats.read_bytes < bytes_to_read) ) { + while( !chThdShouldTerminate() && (_stats.read_bytes < bytes_to_read) ) { const halrtcnt_t read_start = halGetCounterValue(); - if( !file.read(buffer->data(), buffer->size()) ) { + const auto result_read = file.read(buffer->data(), buffer->size()); + if( result_read.is_error() ) { break; } const halrtcnt_t read_end = halGetCounterValue(); @@ -227,14 +232,15 @@ namespace ui { SDCardDebugView::SDCardDebugView(NavigationView& nav) { add_children({ { &text_title, - &text_detected_title, - &text_detected_value, + &text_csd_title, + &text_csd_value_3, + &text_csd_value_2, + &text_csd_value_1, + &text_csd_value_0, &text_bus_width_title, &text_bus_width_value, - &text_card_mode_title, - &text_card_mode_value, - // &text_csd_title, - // &text_csd_value, + &text_card_type_title, + &text_card_type_value, &text_block_size_title, &text_block_size_value, &text_block_count_title, @@ -272,10 +278,33 @@ void SDCardDebugView::focus() { button_ok.focus(); } +static std::string format_3dot3_string(const uint32_t value_in_thousandths) { + if( value_in_thousandths < 1000000U ) { + const uint32_t thousandths_part = value_in_thousandths % 1000; + const uint32_t integer_part = value_in_thousandths / 1000U; + return to_string_dec_uint(integer_part, 3) + "." + to_string_dec_uint(thousandths_part, 3, '0'); + } else { + return "HHH.HHH"; + } +} + +static std::string format_bytes_size_string(uint64_t value) { + static const std::array suffix { { ' ', 'K', 'M', 'G', 'T' } }; + size_t suffix_index = 1; + while( (value >= 1000000U) && (suffix_index < suffix.size()) ) { + value /= 1000U; + suffix_index++; + } + return format_3dot3_string(value) + " " + suffix[suffix_index] + "B"; +} + void SDCardDebugView::on_status(const sd_card::Status) { text_bus_width_value.set(""); - text_card_mode_value.set(""); - // text_csd_value.set(""); + text_card_type_value.set(""); + text_csd_value_0.set(""); + text_csd_value_1.set(""); + text_csd_value_2.set(""); + text_csd_value_3.set(""); text_block_size_value.set(""); text_block_count_value.set(""); text_capacity_value.set(""); @@ -285,8 +314,6 @@ void SDCardDebugView::on_status(const sd_card::Status) { text_test_read_rate_value.set(""); const bool is_inserted = sdcIsCardInserted(&SDCD1); - text_detected_value.set(is_inserted ? "Yes" : " No"); - if( is_inserted ) { const auto card_width_flags = LPC_SDMMC->CTYPE & 0x10001; size_t card_width = 0; @@ -298,56 +325,50 @@ void SDCardDebugView::on_status(const sd_card::Status) { } text_bus_width_value.set(card_width ? to_string_dec_uint(card_width, 1) : "X"); - text_card_mode_value.set("0x" + to_string_hex(SDCD1.cardmode, 8)); - // text_csd_value.set("0x" + to_string_hex(SDCD1.csd, 8)); + + // TODO: Implement Text class right-justify! + BYTE card_type; + disk_ioctl(0, MMC_GET_TYPE, &card_type); + + std::string formatted_card_type; + switch(card_type & SDC_MODE_CARDTYPE_MASK) { + case SDC_MODE_CARDTYPE_SDV11: formatted_card_type = "SD V1.1"; break; + case SDC_MODE_CARDTYPE_SDV20: formatted_card_type = "SD V2.0"; break; + case SDC_MODE_CARDTYPE_MMC: formatted_card_type = "MMC"; break; + default: formatted_card_type = "???"; break; + } + + if( card_type & SDC_MODE_HIGH_CAPACITY ) { + formatted_card_type += ", SDHC"; + } + text_card_type_value.set(formatted_card_type); + + std::array csd; + disk_ioctl(0, MMC_GET_CSD, csd.data()); + text_csd_value_3.set(to_string_hex(csd[3], 8)); + text_csd_value_2.set(to_string_hex(csd[2], 8)); + text_csd_value_1.set(to_string_hex(csd[1], 8)); + text_csd_value_0.set(to_string_hex(csd[0], 8)); BlockDeviceInfo block_device_info; if( sdcGetInfo(&SDCD1, &block_device_info) == CH_SUCCESS ) { text_block_size_value.set(to_string_dec_uint(block_device_info.blk_size, 5)); text_block_count_value.set(to_string_dec_uint(block_device_info.blk_num, 9)); const uint64_t capacity = block_device_info.blk_size * uint64_t(block_device_info.blk_num); - if( capacity >= 1000000000 ) { - const uint32_t capacity_mb = capacity / 1000000U; - const uint32_t fraction_gb = capacity_mb % 1000; - const uint32_t capacity_gb = capacity_mb / 1000U; - text_capacity_value.set( - to_string_dec_uint(capacity_gb, 3) + "." + - to_string_dec_uint(fraction_gb, 3, '0') + " GB" - ); - } else { - const uint32_t capacity_kb = capacity / 1000U; - const uint32_t fraction_mb = capacity_kb % 1000; - const uint32_t capacity_mb = capacity_kb / 1000U; - text_capacity_value.set( - to_string_dec_uint(capacity_mb, 3) + "." + - to_string_dec_uint(fraction_mb, 3, '0') + " MB" - ); - } + text_capacity_value.set(format_bytes_size_string(capacity)); } } } static std::string format_ticks_as_ms(const halrtcnt_t value) { const uint32_t us = uint64_t(value) * 1000000U / halGetCounterFrequency(); - const uint32_t ms_frac = us % 1000U; - const uint32_t ms_int = us / 1000U; - if( ms_int < 1000 ) { - return to_string_dec_uint(ms_int, 3) + "." + to_string_dec_uint(ms_frac, 3, '0'); - } else { - return "HHH.HHH"; - } + return format_3dot3_string(us); } static std::string format_bytes_per_ticks_as_mib(const size_t bytes, const halrtcnt_t ticks) { const uint32_t bps = uint64_t(bytes) * halGetCounterFrequency() / ticks; const uint32_t kbps = bps / 1000U; - const uint32_t mbps_frac = kbps % 1000U; - const uint32_t mbps_int = kbps / 1000U; - if( mbps_int < 1000 ) { - return to_string_dec_uint(mbps_int, 3) + "." + to_string_dec_uint(mbps_frac, 3, '0'); - } else { - return "HHH.HHH"; - } + return format_3dot3_string(kbps); } void SDCardDebugView::on_test() { diff --git a/firmware/application/ui_sd_card_debug.hpp b/firmware/application/ui_sd_card_debug.hpp index a573f3a1..d051fd3c 100644 --- a/firmware/application/ui_sd_card_debug.hpp +++ b/firmware/application/ui_sd_card_debug.hpp @@ -49,15 +49,28 @@ private: "SD Card", }; - static constexpr size_t detected_characters = 3; - - Text text_detected_title { + Text text_csd_title { { 0, 3 * 16, (8 * 8), 16 }, - "Detected", + "CSD", }; - Text text_detected_value { - { 240 - (detected_characters * 8), 3 * 16, (detected_characters * 8), 16 }, + Text text_csd_value_3 { + { 240 - ((8 + 1 + 8) * 8), 3 * 16, (8 * 8), 16 }, + "", + }; + + Text text_csd_value_2 { + { 240 - (8 * 8), 3 * 16, (8 * 8), 16 }, + "", + }; + + Text text_csd_value_1 { + { 240 - ((8 + 1 + 8) * 8), 4 * 16, (8 * 8), 16 }, + "", + }; + + Text text_csd_value_0 { + { 240 - (8 * 8), 4 * 16, (8 * 8), 16 }, "", }; @@ -73,30 +86,18 @@ private: "", }; - static constexpr size_t card_mode_characters = 10; + static constexpr size_t card_type_characters = 13; - Text text_card_mode_title { + Text text_card_type_title { { 0, 6 * 16, (9 * 8), 16 }, - "Card mode", + "Card type", }; - Text text_card_mode_value { - { 240 - (card_mode_characters * 8), 6 * 16, (card_mode_characters * 8), 16 }, + Text text_card_type_value { + { 240 - (card_type_characters * 8), 6 * 16, (card_type_characters * 8), 16 }, "", }; - // static constexpr size_t csd_characters = 10; - - // Text text_csd_title { - // { 0, 7 * 16, (3 * 8), 16 }, - // "CSD", - // }; - - // Text text_csd_value { - // { 240 - (csd_characters * 8), 7 * 16, (csd_characters * 8), 16 }, - // "", - // }; - static constexpr size_t block_size_characters = 5; Text text_block_size_title { diff --git a/firmware/application/ui_setup.cpp b/firmware/application/ui_setup.cpp index 57b1c3a7..a44602eb 100644 --- a/firmware/application/ui_setup.cpp +++ b/firmware/application/ui_setup.cpp @@ -20,16 +20,15 @@ */ #include "ui_setup.hpp" -#include "string_format.hpp" -#include "portapack_persistent_memory.hpp" -#include "ui_font_fixed_8x16.hpp" +#include "portapack_persistent_memory.hpp" #include "lpc43xx_cpp.hpp" using namespace lpc43xx; #include "portapack.hpp" using portapack::receiver_model; -using namespace portapack; + +#include "cpld_update.hpp" namespace ui { @@ -170,15 +169,26 @@ void AntennaBiasSetupView::focus() { button_done.focus(); } -SetTouchCalibView::SetTouchCalibView(NavigationView& nav) { - add_children({{ +AboutView::AboutView(NavigationView& nav) { + add_children({ { &text_title, - &text_debugx, - &text_debugy, - &button_ok - }}); + &text_firmware, + &text_cpld_hackrf, + &text_cpld_hackrf_status, + &button_ok, + } }); button_ok.on_select = [&nav](Button&){ nav.pop(); }; + + if( cpld_hackrf_verify_eeprom() ) { + text_cpld_hackrf_status.set(" OK"); + } else { + text_cpld_hackrf_status.set("BAD"); + } +} + +void AboutView::focus() { + button_ok.focus(); } void SetTouchCalibView::focus() { diff --git a/firmware/application/ui_setup.hpp b/firmware/application/ui_setup.hpp index ba116e1b..12acb0df 100644 --- a/firmware/application/ui_setup.hpp +++ b/firmware/application/ui_setup.hpp @@ -25,7 +25,6 @@ #include "ui_widget.hpp" #include "ui_menu.hpp" #include "ui_navigation.hpp" -#include "ff.h" #include @@ -247,6 +246,39 @@ private: }; }; +class AboutView : public View { +public: + AboutView(NavigationView& nav); + + void focus() override; + +private: + Text text_title { + { 100, 96, 40, 16 }, + "About", + }; + + Text text_firmware { + { 0, 128, 240, 16 }, + "Git Commit Hash " GIT_REVISION, + }; + + Text text_cpld_hackrf { + { 0, 144, 11*8, 16 }, + "HackRF CPLD", + }; + + Text text_cpld_hackrf_status { + { 240 - 3*8, 144, 3*8, 16 }, + "???" + }; + + Button button_ok { + { 72, 192, 96, 24 }, + "OK" + }; +}; + class SetUIView : public View { public: SetUIView(NavigationView& nav); diff --git a/firmware/application/ui_spectrum.cpp b/firmware/application/ui_spectrum.cpp index a3b7c896..448e0766 100644 --- a/firmware/application/ui_spectrum.cpp +++ b/firmware/application/ui_spectrum.cpp @@ -21,8 +21,6 @@ #include "ui_spectrum.hpp" -#include "event_m0.hpp" - #include "spectrum_color_lut.hpp" #include "portapack.hpp" @@ -236,31 +234,11 @@ WaterfallWidget::WaterfallWidget() { } void WaterfallWidget::on_show() { - EventDispatcher::message_map().register_handler(Message::ID::ChannelSpectrumConfig, - [this](const Message* const p) { - const auto message = *reinterpret_cast(p); - this->fifo = message.fifo; - } - ); - EventDispatcher::message_map().register_handler(Message::ID::DisplayFrameSync, - [this](const Message* const) { - if( this->fifo ) { - ChannelSpectrum channel_spectrum; - while( fifo->out(channel_spectrum) ) { - this->on_channel_spectrum(channel_spectrum); - } - } - } - ); - baseband::spectrum_streaming_start(); } void WaterfallWidget::on_hide() { baseband::spectrum_streaming_stop(); - - EventDispatcher::message_map().unregister_handler(Message::ID::DisplayFrameSync); - EventDispatcher::message_map().unregister_handler(Message::ID::ChannelSpectrumConfig); } void WaterfallWidget::set_parent_rect(const Rect new_parent_rect) { diff --git a/firmware/application/ui_spectrum.hpp b/firmware/application/ui_spectrum.hpp index 8b0381f4..70fe83d5 100644 --- a/firmware/application/ui_spectrum.hpp +++ b/firmware/application/ui_spectrum.hpp @@ -25,6 +25,8 @@ #include "ui.hpp" #include "ui_widget.hpp" +#include "event_m0.hpp" + #include "message.hpp" #include @@ -86,6 +88,25 @@ private: FrequencyScale frequency_scale; ChannelSpectrumFIFO* fifo { nullptr }; + MessageHandlerRegistration message_handler_spectrum_config { + Message::ID::ChannelSpectrumConfig, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + this->fifo = message.fifo; + } + }; + MessageHandlerRegistration message_handler_frame_sync { + Message::ID::DisplayFrameSync, + [this](const Message* const) { + if( this->fifo ) { + ChannelSpectrum channel_spectrum; + while( fifo->out(channel_spectrum) ) { + this->on_channel_spectrum(channel_spectrum); + } + } + } + }; + void on_channel_spectrum(const ChannelSpectrum& spectrum); }; diff --git a/firmware/baseband/CMakeLists.txt b/firmware/baseband/CMakeLists.txt new file mode 100644 index 00000000..54010d73 --- /dev/null +++ b/firmware/baseband/CMakeLists.txt @@ -0,0 +1,366 @@ +# +# Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. +# +# This file is part of PortaPack. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +############################################################################## +# Build global options +# NOTE: Can be overridden externally. +# + +enable_language(C CXX ASM) + +project(baseband_shared) + +# Compiler options here. +set(USE_OPT "-O3 -falign-functions=16 -fno-math-errno --specs=nano.specs") + +# C specific options here (added to USE_OPT). +set(USE_COPT "-std=gnu99") + +# C++ specific options here (added to USE_OPT). +set(USE_CPPOPT "-std=c++11 -fno-rtti -fno-exceptions") + +# Enable this if you want the linker to remove unused code and data +set(USE_LINK_GC yes) + +# Linker extra options here. +set(USE_LDOPT) + +# Enable this if you want link time optimizations (LTO) +set(USE_LTO no) + +# If enabled, this option allows to compile the application in THUMB mode. +set(USE_THUMB yes) + +# Enable this if you want to see the full log while compiling. +set(USE_VERBOSE_COMPILE no) + +# +# Build global options +############################################################################## + +############################################################################## +# Architecture or project specific options +# + +# Enables the use of FPU on Cortex-M4 (no, softfp, hard). +set(USE_FPU hard) + +# +# Architecture or project specific options +############################################################################## + +############################################################################## +# Project, sources and paths +# + +# Imported source files and paths +include(${CHIBIOS_PORTAPACK}/boards/GSG_HACKRF_ONE/board.cmake) +include(${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx_M4/platform.cmake) +include(${CHIBIOS}/os/hal/hal.cmake) +include(${CHIBIOS_PORTAPACK}/os/ports/GCC/ARMCMx/LPC43xx_M4/port.cmake) +include(${CHIBIOS}/os/kernel/kernel.cmake) + +include(${CHIBIOS}/test/test.cmake) + +# Define linker script file here +set(LDSCRIPT ${PORTLD}/LPC43xx_M4.ld) + +# C sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +set(CSRC + ${PORTSRC} + ${KERNSRC} + ${TESTSRC} + ${HALSRC} + ${PLATFORMSRC} + ${BOARDSRC} +) + +# C++ sources that can be compiled in ARM or THUMB mode depending on the global +# setting. +set(CPPSRC + baseband.cpp + ${COMMON}/message_queue.cpp + ${COMMON}/event.cpp + event_m4.cpp + ${COMMON}/thread_wait.cpp + ${COMMON}/gpdma.cpp + baseband_dma.cpp + ${COMMON}/baseband_sgpio.cpp + ${COMMON}/portapack_shared_memory.cpp + baseband_thread.cpp + baseband_processor.cpp + baseband_stats_collector.cpp + dsp_decimate.cpp + dsp_demodulate.cpp + matched_filter.cpp + spectrum_collector.cpp + stream_input.cpp + dsp_squelch.cpp + clock_recovery.cpp + packet_builder.cpp + ${COMMON}/dsp_fft.cpp + ${COMMON}/dsp_fir_taps.cpp + ${COMMON}/dsp_iir.cpp + fxpt_atan2.cpp + rssi.cpp + rssi_dma.cpp + rssi_thread.cpp + audio_compressor.cpp + audio_output.cpp + audio_dma.cpp + audio_stats_collector.cpp + ${COMMON}/utility.cpp + ${COMMON}/chibios_cpp.cpp + ${COMMON}/debug.cpp + ${COMMON}/gcc.cpp +) + +# C sources to be compiled in ARM mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +set(ACSRC) + +# C++ sources to be compiled in ARM mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +set(ACPPSRC) + +# C sources to be compiled in THUMB mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +set(TCSRC) + +# C sources to be compiled in THUMB mode regardless of the global setting. +# NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler +# option that results in lower performance and larger code size. +set(TCPPSRC) + +# List ASM source files here +set(ASMSRC ${PORTASM}) + +set(INCDIR ${COMMON} ${PORTINC} ${KERNINC} ${TESTINC} + ${HALINC} ${PLATFORMINC} ${BOARDINC} + ${CHIBIOS}/os/various +) + +# +# Project, sources and paths +############################################################################## + +############################################################################## +# Compiler settings +# + +set(MCU cortex-m4) + +# ARM-specific options here +set(AOPT) + +# THUMB-specific options here +set(TOPT "-mthumb -DTHUMB") + +# Define C warning options here +set(CWARN "-Wall -Wextra -Wstrict-prototypes") + +# Define C++ warning options here +set(CPPWARN "-Wall -Wextra") + +# +# Compiler settings +############################################################################## + +############################################################################## +# Start of default section +# + +# List all default C defines here, like -D_DEBUG=1 +# TODO: Switch -DCRT0_INIT_DATA depending on load from RAM or SPIFI? +# NOTE: _RANDOM_TCC to kill a GCC 4.9.3 error with std::max argument types +set(DDEFS -DLPC43XX -DLPC43XX_M4 -D__NEWLIB__ -DHACKRF_ONE -DTOOLCHAIN_GCC -DTOOLCHAIN_GCC_ARM -D_RANDOM_TCC=0 -DGIT_REVISION=\"${GIT_REVISION}\") + +# List all default ASM defines here, like -D_DEBUG=1 +set(DADEFS) + +# List all default directories to look for include files here +set(DINCDIR) + +# List the default directory to look for the libraries here +set(DLIBDIR) + +# List all default libraries here +set(DLIBS) + +# +# End of default section +############################################################################## + +############################################################################## +# Start of user section +# + +# List all user C define here, like -D_DEBUG=1 +set(UDEFS) + +# Define ASM defines here +set(UADEFS) + +# List all user directories here +set(UINCDIR) + +# List the user directory to look for the libraries here +set(ULIBDIR) + +# List all user libraries here +set(ULIBS) + +# +# End of user defines +############################################################################## + +set(RULESPATH ${CHIBIOS}/os/ports/GCC/ARMCMx) +include(${RULESPATH}/rules.cmake) + +####################################################################### + +add_library(${PROJECT_NAME} OBJECT ${CSRC} ${CPPSRC} ${ASMSRC}) +include_directories(. ${INCDIR}) + +####################################################################### + +set(BASEBAND_IMAGES) + +macro(DeclareTargets chunk_tag name) + project("baseband_${name}") + + include(${RULESPATH}/rules.cmake) + add_executable(${PROJECT_NAME}.elf $ ${MODE_CPPSRC}) + set_target_properties(${PROJECT_NAME}.elf PROPERTIES LINK_DEPENDS ${LDSCRIPT}) + add_definitions(${DEFS}) + include_directories(. ${INCDIR}) + link_directories(${LLIBDIR}) + target_link_libraries(${PROJECT_NAME}.elf ${LIBS}) + + add_custom_command( + OUTPUT ${PROJECT_NAME}.bin ${PROJECT_NAME}.img + COMMAND ${CMAKE_OBJCOPY} -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin + COMMAND ${MAKE_IMAGE_CHUNK} ${PROJECT_NAME}.bin ${chunk_tag} ${PROJECT_NAME}.img + DEPENDS ${PROJECT_NAME}.elf ${MAKE_IMAGE_CHUNK} + VERBATIM + ) + + set(BASEBAND_IMAGES ${BASEBAND_IMAGES} ${PROJECT_NAME}.img) +endmacro() + +### AIS + +set(MODE_CPPSRC + proc_ais.cpp +) +DeclareTargets(PAIS ais) + +### AM Audio + +set(MODE_CPPSRC + proc_am_audio.cpp +) +DeclareTargets(PAMA am_audio) + +### Capture + +set(MODE_CPPSRC + proc_capture.cpp +) +DeclareTargets(PCAP capture) + +### ERT + +set(MODE_CPPSRC + proc_ert.cpp +) +DeclareTargets(PERT ert) + +### NFM Audio + +set(MODE_CPPSRC + proc_nfm_audio.cpp +) +DeclareTargets(PNFM nfm_audio) + +### TPMS + +set(MODE_CPPSRC + proc_tpms.cpp +) +DeclareTargets(PTPM tpms) + +### WFM Audio + +set(MODE_CPPSRC + proc_wfm_audio.cpp +) +DeclareTargets(PWFM wfm_audio) + +### Wideband Spectrum + +set(MODE_CPPSRC + proc_wideband_spectrum.cpp +) +DeclareTargets(PSPE wideband_spectrum) + +### HackRF "factory" firmware + +add_custom_command( + OUTPUT hackrf.bin hackrf.img + COMMAND ${STRIP_DFU} ${HACKRF_FIRMWARE_IMAGE} hackrf.bin + COMMAND ${MAKE_IMAGE_CHUNK} hackrf.bin HRF1 hackrf.img + DEPENDS ${HACKRF_FIRMWARE_IMAGE} ${STRIP_DFU} ${MAKE_IMAGE_CHUNK} + VERBATIM +) + +set(BASEBAND_IMAGES ${BASEBAND_IMAGES} hackrf.img) + +### Terminator image + +add_custom_command( + OUTPUT terminator.img + COMMAND ${MAKE_IMAGE_CHUNK} terminator.img + DEPENDS ${MAKE_IMAGE_CHUNK} + VERBATIM +) + +set(BASEBAND_IMAGES ${BASEBAND_IMAGES} terminator.img) + +####################################################################### + +project(baseband) + +add_custom_command( + OUTPUT ${PROJECT_NAME}.img + COMMAND cat ${BASEBAND_IMAGES} > ${PROJECT_NAME}.img + DEPENDS ${BASEBAND_IMAGES} + VERBATIM +) + +add_custom_target( + ${PROJECT_NAME} + DEPENDS ${PROJECT_NAME}.img +) diff --git a/firmware/baseband/main.cpp b/firmware/baseband/baseband.cpp old mode 100755 new mode 100644 similarity index 78% rename from firmware/baseband/main.cpp rename to firmware/baseband/baseband.cpp index 5f8a7da0..284b9471 --- a/firmware/baseband/main.cpp +++ b/firmware/baseband/baseband.cpp @@ -28,27 +28,24 @@ #include "gpdma.hpp" -#include "event_m4.hpp" - -#include "touch_dma.hpp" - -#include "baseband_thread.hpp" -#include "rssi_thread.hpp" -#include "baseband_processor.hpp" - -#include "message_queue.hpp" - -#include "utility.hpp" - -#include "debug.hpp" - #include "audio_dma.hpp" -#include "gcc.hpp" +static void init() { + audio::dma::init(); + audio::dma::configure(); + audio::dma::enable(); -#include -#include -#include + LPC_CREG->DMAMUX = portapack::gpdma_mux; + gpdma::controller.enable(); + nvicEnableVector(DMA_IRQn, CORTEX_PRIORITY_MASK(LPC_DMA_IRQ_PRIORITY)); +} + +static void halt() { + port_disable(); + while(true) { + port_wait_for_interrupt(); + } +} extern "C" { @@ -67,32 +64,12 @@ void __late_init(void) { * require the heap. */ chSysInit(); + + /* Baseband initialization */ + init(); } -} - -static void init() { - audio::dma::init(); - audio::dma::configure(); - audio::dma::enable(); - - LPC_CREG->DMAMUX = portapack::gpdma_mux; - gpdma::controller.enable(); - nvicEnableVector(DMA_IRQn, CORTEX_PRIORITY_MASK(LPC_DMA_IRQ_PRIORITY)); - - touch::dma::init(); - touch::dma::allocate(); - touch::dma::enable(); -} - -static void halt() { - port_disable(); - while(true) { - port_wait_for_interrupt(); - } -} - -static void shutdown() { +void _default_exit(void) { // TODO: Is this complete? nvicDisableVector(DMA_IRQn); @@ -104,18 +81,9 @@ static void shutdown() { ShutdownMessage shutdown_message; shared_memory.application_queue.push(shutdown_message); + shared_memory.baseband_message = nullptr; + halt(); } -int main(void) { - init(); - - /* TODO: Ensure DMAs are configured to point at first LLI in chain. */ - - EventDispatcher event_dispatcher; - event_dispatcher.run(); - - shutdown(); - - return 0; } diff --git a/firmware/baseband/baseband_dma.cpp b/firmware/baseband/baseband_dma.cpp index f5dcca1e..d86bef72 100644 --- a/firmware/baseband/baseband_dma.cpp +++ b/firmware/baseband/baseband_dma.cpp @@ -115,9 +115,16 @@ static void dma_error() { void init() { gpdma_channel_sgpio.set_handlers(transfer_complete, dma_error); - - // LPC_GPDMA->SYNC |= (1 << gpdma_src_peripheral); - // LPC_GPDMA->SYNC |= (1 << gpdma_dest_peripheral); +#if defined(PORTAPACK_BASEBAND_DMA_NO_SYNC) + /* Disable synchronization logic to improve(?) DMA response time. + * SGPIO (peripheral) must be on same clock as GPDMA peripheral. + * SGPIO runs from BASE_PERIPH_CLK, which is set to PLL1 in normal + * operation, same as the M4 and M0 cores. Memory, of course, is + * running from the same clock as the cores. + */ + LPC_GPDMA->SYNC |= (1 << gpdma_src_peripheral); + LPC_GPDMA->SYNC |= (1 << gpdma_dest_peripheral); +#endif } void configure( diff --git a/firmware/baseband/baseband_dma.hpp b/firmware/baseband/baseband_dma.hpp index cc41a751..94827d4b 100644 --- a/firmware/baseband/baseband_dma.hpp +++ b/firmware/baseband/baseband_dma.hpp @@ -31,8 +31,6 @@ namespace baseband { namespace dma { -using Handler = void (*)(); - void init(); void configure( baseband::sample_t* const buffer_base, diff --git a/firmware/baseband/baseband_thread.cpp b/firmware/baseband/baseband_thread.cpp index 54fda4fa..e61fd968 100644 --- a/firmware/baseband/baseband_thread.cpp +++ b/firmware/baseband/baseband_thread.cpp @@ -31,15 +31,14 @@ #include "rssi.hpp" #include "i2s.hpp" -#include "proc_am_audio.hpp" +/*#include "proc_am_audio.hpp" #include "proc_nfm_audio.hpp" #include "proc_wfm_audio.hpp" #include "proc_ais.hpp" #include "proc_wideband_spectrum.hpp" -#include "proc_closecall.hpp" #include "proc_tpms.hpp" #include "proc_ert.hpp" -#include "proc_capture.hpp" +#include "proc_capture.hpp"*/ #include "portapack_shared_memory.hpp" @@ -49,38 +48,25 @@ static baseband::SGPIO baseband_sgpio; WORKING_AREA(baseband_thread_wa, 4096); -Thread* BasebandThread::start(const tprio_t priority) { - return chThdCreateStatic(baseband_thread_wa, sizeof(baseband_thread_wa), +Thread* BasebandThread::thread = nullptr; + +BasebandThread::BasebandThread( + uint32_t sampling_rate, + BasebandProcessor* const baseband_processor, + const tprio_t priority +) : baseband_processor { baseband_processor }, + sampling_rate { sampling_rate } +{ + thread = chThdCreateStatic(baseband_thread_wa, sizeof(baseband_thread_wa), priority, ThreadBase::fn, this ); } -void BasebandThread::set_configuration(const BasebandConfiguration& new_configuration) { - if( new_configuration.mode != baseband_configuration.mode ) { - disable(); - - // TODO: Timing problem around disabling DMA and nulling and deleting old processor - auto old_p = baseband_processor; - baseband_processor = nullptr; - delete old_p; - - baseband_processor = create_processor(new_configuration.mode); - - enable(); - } - - baseband_configuration = new_configuration; -} - -void BasebandThread::on_message(const Message* const message) { - if( message->id == Message::ID::BasebandConfiguration ) { - set_configuration(reinterpret_cast(message)->configuration); - } else { - if( baseband_processor ) { - baseband_processor->on_message(message); - } - } +BasebandThread::~BasebandThread() { + chThdTerminate(thread); + chThdWait(thread); + thread = nullptr; } void BasebandThread::run() { @@ -94,35 +80,29 @@ void BasebandThread::run() { ); //baseband::dma::allocate(4, 2048); - BasebandStatsCollector stats { - chSysGetIdleThread(), - thread_main, - thread_rssi, - chThdSelf() - }; + baseband_sgpio.configure(direction()); + baseband::dma::enable(direction()); + baseband_sgpio.streaming_enable(); - while(true) { + while( !chThdShouldTerminate() ) { // TODO: Place correct sampling rate into buffer returned here: const auto buffer_tmp = baseband::dma::wait_for_rx_buffer(); if( buffer_tmp ) { buffer_c8_t buffer { - buffer_tmp.p, buffer_tmp.count, baseband_configuration.sampling_rate + buffer_tmp.p, buffer_tmp.count, sampling_rate }; if( baseband_processor ) { baseband_processor->execute(buffer); } - - stats.process(buffer, - [](const BasebandStatistics& statistics) { - const BasebandStatisticsMessage message { statistics }; - shared_memory.application_queue.push(message); - } - ); } } -} + i2s::i2s0::tx_mute(); + baseband::dma::disable(); + baseband_sgpio.streaming_disable(); +} +/* BasebandProcessor* BasebandThread::create_processor(const int32_t mode) { switch(mode) { case 0: return new NarrowbandAMAudio(); @@ -133,7 +113,6 @@ BasebandProcessor* BasebandThread::create_processor(const int32_t mode) { case 5: return new TPMSProcessor(); case 6: return new ERTProcessor(); case 7: return new CaptureProcessor(); - case 10: return new CloseCallProcessor(); default: return nullptr; } } @@ -157,3 +136,4 @@ void BasebandThread::enable() { baseband_sgpio.streaming_enable(); } } +*/ diff --git a/firmware/baseband/baseband_thread.hpp b/firmware/baseband/baseband_thread.hpp index e30de422..3263b4f1 100644 --- a/firmware/baseband/baseband_thread.hpp +++ b/firmware/baseband/baseband_thread.hpp @@ -30,9 +30,12 @@ class BasebandThread : public ThreadBase { public: - Thread* start(const tprio_t priority); - - void on_message(const Message* const message); + BasebandThread( + uint32_t sampling_rate, + BasebandProcessor* const baseband_processor, + const tprio_t priority + ); + ~BasebandThread(); // This getter should die, it's just here to leak information to code that // isn't in the right place to begin with. @@ -40,24 +43,13 @@ public: return baseband::Direction::Receive; } - void wait_for_switch(void); - - Thread* thread_main { nullptr }; - Thread* thread_rssi { nullptr }; - private: - BasebandProcessor* baseband_processor { nullptr }; + static Thread* thread; - BasebandConfiguration baseband_configuration; + BasebandProcessor* baseband_processor { nullptr }; + uint32_t sampling_rate; void run() override; - - BasebandProcessor* create_processor(const int32_t mode); - - void disable(); - void enable(); - - void set_configuration(const BasebandConfiguration& new_configuration); }; #endif/*__BASEBAND_THREAD_H__*/ diff --git a/firmware/baseband/event_m4.cpp b/firmware/baseband/event_m4.cpp index 797ef5cb..c1b395b2 100644 --- a/firmware/baseband/event_m4.cpp +++ b/firmware/baseband/event_m4.cpp @@ -51,13 +51,16 @@ CH_IRQ_HANDLER(MAPP_IRQHandler) { Thread* EventDispatcher::thread_event_loop = nullptr; +EventDispatcher::EventDispatcher( + std::unique_ptr baseband_processor +) : baseband_processor { std::move(baseband_processor) } +{ +} + void EventDispatcher::run() { thread_event_loop = chThdSelf(); - lpc43xx::creg::m0apptxevent::enable(); - baseband_thread.thread_main = chThdSelf(); - baseband_thread.thread_rssi = rssi_thread.start(NORMALPRIO + 10); - baseband_thread.start(NORMALPRIO + 20); + lpc43xx::creg::m0apptxevent::enable(); while(is_running) { const auto events = wait(); @@ -86,9 +89,10 @@ void EventDispatcher::dispatch(const eventmask_t events) { } void EventDispatcher::handle_baseband_queue() { - shared_memory.baseband_queue.handle([this](Message* const message) { - this->on_message(message); - }); + const auto message = shared_memory.baseband_message; + if( message ) { + on_message(message); + } } void EventDispatcher::on_message(const Message* const message) { @@ -99,6 +103,7 @@ void EventDispatcher::on_message(const Message* const message) { default: on_message_default(message); + shared_memory.baseband_message = nullptr; break; } } @@ -108,10 +113,10 @@ void EventDispatcher::on_message_shutdown(const ShutdownMessage&) { } void EventDispatcher::on_message_default(const Message* const message) { - baseband_thread.on_message(message); + baseband_processor->on_message(message); } void EventDispatcher::handle_spectrum() { const UpdateSpectrumMessage message; - baseband_thread.on_message(&message); + baseband_processor->on_message(&message); } diff --git a/firmware/baseband/event_m4.hpp b/firmware/baseband/event_m4.hpp index ad9871d1..42b5d3b9 100644 --- a/firmware/baseband/event_m4.hpp +++ b/firmware/baseband/event_m4.hpp @@ -36,26 +36,23 @@ constexpr auto EVT_MASK_SPECTRUM = EVENT_MASK(1); class EventDispatcher { public: + EventDispatcher(std::unique_ptr baseband_processor); + void run(); void request_stop(); static inline void events_flag(const eventmask_t events) { - if( thread_event_loop ) { - chEvtSignal(thread_event_loop, events); - } + chEvtSignal(thread_event_loop, events); } static inline void events_flag_isr(const eventmask_t events) { - if( thread_event_loop ) { - chEvtSignalI(thread_event_loop, events); - } + chEvtSignalI(thread_event_loop, events); } private: static Thread* thread_event_loop; - BasebandThread baseband_thread; - RSSIThread rssi_thread; + std::unique_ptr baseband_processor; bool is_running = true; diff --git a/firmware/baseband/ook.hpp b/firmware/baseband/ook.hpp index 27333922..2453f2f4 100644 --- a/firmware/baseband/ook.hpp +++ b/firmware/baseband/ook.hpp @@ -70,6 +70,7 @@ public: constexpr OOKClockRecovery( const float samples_per_symbol ) : symbol_phase_inc_nominal { static_cast(std::round((1ULL << 32) / samples_per_symbol)) }, + symbol_phase_inc_k { symbol_phase_inc_nominal * (2.0f / 8.0f) / samples_per_symbol }, phase_detector { samples_per_symbol }, phase_accumulator { symbol_phase_inc_nominal } { @@ -79,13 +80,14 @@ public: void operator()(const uint32_t slicer_history, SymbolHandler symbol_handler) { if( phase_accumulator() ) { const auto detector_result = phase_detector(slicer_history); - phase_accumulator.set_inc(symbol_phase_inc_nominal + detector_result.error * (symbol_phase_inc_nominal >> 3)); + phase_accumulator.set_inc(symbol_phase_inc_nominal + detector_result.error * symbol_phase_inc_k); symbol_handler(detector_result.symbol); } } private: const uint32_t symbol_phase_inc_nominal; + const uint32_t symbol_phase_inc_k; PhaseDetectorEarlyLateGate phase_detector; PhaseAccumulator phase_accumulator; }; diff --git a/firmware/baseband/phase_detector.hpp b/firmware/baseband/phase_detector.hpp index 89cf4b5c..4e6f0d34 100644 --- a/firmware/baseband/phase_detector.hpp +++ b/firmware/baseband/phase_detector.hpp @@ -39,30 +39,32 @@ public: }; constexpr PhaseDetectorEarlyLateGate( - const float samples_per_symbol - ) : late_mask { (1U << static_cast(std::ceil(samples_per_symbol / 2))) - 1 }, - early_mask { late_mask << static_cast(std::floor(samples_per_symbol / 2)) }, - sample_bit { static_cast(std::floor(samples_per_symbol / 2)) } + const size_t samples_per_symbol + ) : sample_threshold { samples_per_symbol / 2 }, + late_mask { (1UL << sample_threshold) - 1UL }, + early_mask { late_mask << sample_threshold } { } result_t operator()(const history_t symbol_history) const { + static_assert(sizeof(history_t) == sizeof(unsigned long), "popcountl size mismatch"); + // history = ...0111, early // history = ...1110, late - const symbol_t symbol = (symbol_history >> sample_bit) & 1; - const int late_side = __builtin_popcount(symbol_history & late_mask); - const int early_side = __builtin_popcount(symbol_history & early_mask); - const int lateness = late_side - early_side; - const int direction = lateness; //std::min(std::max(lateness, -1), 1); - const error_t error = direction; + const size_t late_side = __builtin_popcountl(symbol_history & late_mask); + const size_t early_side = __builtin_popcountl(symbol_history & early_mask); + const size_t total_count = late_side + early_side; + const auto lateness = static_cast(late_side) - static_cast(early_side); + const symbol_t symbol = (total_count >= sample_threshold); + const error_t error = symbol ? -lateness : lateness; return { symbol, error }; } private: + const size_t sample_threshold; const history_t late_mask; const history_t early_mask; - const size_t sample_bit; }; #endif/*__PHASE_DETECTOR_HPP__*/ diff --git a/firmware/baseband/proc_ais.cpp b/firmware/baseband/proc_ais.cpp index 80452dd0..8cef6893 100644 --- a/firmware/baseband/proc_ais.cpp +++ b/firmware/baseband/proc_ais.cpp @@ -25,6 +25,8 @@ #include "dsp_fir_taps.hpp" +#include "event_m4.hpp" + AISProcessor::AISProcessor() { decim_0.configure(taps_11k0_decim_0.taps, 33554432); decim_1.configure(taps_11k0_decim_1.taps, 131072); @@ -62,3 +64,9 @@ void AISProcessor::payload_handler( const AISPacketMessage message { packet }; shared_memory.application_queue.push(message); } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband/proc_ais.hpp b/firmware/baseband/proc_ais.hpp index 966d739a..7fa0d40c 100644 --- a/firmware/baseband/proc_ais.hpp +++ b/firmware/baseband/proc_ais.hpp @@ -23,6 +23,7 @@ #define __PROC_AIS_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" #include "channel_decimator.hpp" #include "matched_filter.hpp" @@ -47,6 +48,10 @@ public: void execute(const buffer_c8_t& buffer) override; private: + static constexpr size_t baseband_fs = 2457600; + + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + std::array dst; const buffer_c16_t dst_buffer { dst.data(), diff --git a/firmware/baseband/proc_am_audio.cpp b/firmware/baseband/proc_am_audio.cpp index f4cb2fac..6444a9fe 100644 --- a/firmware/baseband/proc_am_audio.cpp +++ b/firmware/baseband/proc_am_audio.cpp @@ -23,6 +23,8 @@ #include "audio_output.hpp" +#include "event_m4.hpp" + #include void NarrowbandAMAudio::execute(const buffer_c8_t& buffer) { @@ -105,3 +107,9 @@ void NarrowbandAMAudio::capture_config(const CaptureConfigMessage& message) { audio_output.set_stream(nullptr); } } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband/proc_am_audio.hpp b/firmware/baseband/proc_am_audio.hpp index 051f1703..08cca3e5 100644 --- a/firmware/baseband/proc_am_audio.hpp +++ b/firmware/baseband/proc_am_audio.hpp @@ -23,6 +23,8 @@ #define __PROC_AM_AUDIO_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" +#include "rssi_thread.hpp" #include "dsp_decimate.hpp" #include "dsp_demodulate.hpp" @@ -44,6 +46,9 @@ private: static constexpr size_t decim_2_decimation_factor = 4; static constexpr size_t channel_filter_decimation_factor = 1; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + RSSIThread rssi_thread { NORMALPRIO + 10 }; + std::array dst; const buffer_c16_t dst_buffer { dst.data(), diff --git a/firmware/baseband/proc_capture.cpp b/firmware/baseband/proc_capture.cpp index 56f6a948..daa958d9 100644 --- a/firmware/baseband/proc_capture.cpp +++ b/firmware/baseband/proc_capture.cpp @@ -23,6 +23,8 @@ #include "dsp_fir_taps.hpp" +#include "event_m4.hpp" + #include "utility.hpp" CaptureProcessor::CaptureProcessor() { @@ -90,3 +92,9 @@ void CaptureProcessor::capture_config(const CaptureConfigMessage& message) { stream.reset(); } } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband/proc_capture.hpp b/firmware/baseband/proc_capture.hpp index e975d99c..c2b48b0c 100644 --- a/firmware/baseband/proc_capture.hpp +++ b/firmware/baseband/proc_capture.hpp @@ -23,6 +23,9 @@ #define __PROC_CAPTURE_HPP__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" +#include "rssi_thread.hpp" + #include "dsp_decimate.hpp" #include "spectrum_collector.hpp" @@ -45,6 +48,9 @@ private: static constexpr size_t baseband_fs = 4000000; static constexpr auto spectrum_rate_hz = 50.0f; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + RSSIThread rssi_thread { NORMALPRIO + 10 }; + std::array dst; const buffer_c16_t dst_buffer { dst.data(), diff --git a/firmware/baseband/proc_ert.cpp b/firmware/baseband/proc_ert.cpp index e6ae439c..9997704b 100644 --- a/firmware/baseband/proc_ert.cpp +++ b/firmware/baseband/proc_ert.cpp @@ -23,6 +23,8 @@ #include "portapack_shared_memory.hpp" +#include "event_m4.hpp" + float ERTProcessor::abs(const complex8_t& v) { // const int16_t r = v.real() - offset_i; // const int16_t i = v.imag() - offset_q; @@ -101,3 +103,9 @@ void ERTProcessor::idm_handler( const ERTPacketMessage message { ert::Packet::Type::IDM, packet }; shared_memory.application_queue.push(message); } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband/proc_ert.hpp b/firmware/baseband/proc_ert.hpp index 9c0663c9..dc0a9ecc 100644 --- a/firmware/baseband/proc_ert.hpp +++ b/firmware/baseband/proc_ert.hpp @@ -23,6 +23,7 @@ #define __PROC_ERT_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" #include "channel_decimator.hpp" @@ -61,6 +62,8 @@ private: const size_t samples_per_symbol = channel_sampling_rate / symbol_rate; const float clock_recovery_rate = symbol_rate * 2; + BasebandThread baseband_thread { baseband_sampling_rate, this, NORMALPRIO + 20 }; + clock_recovery::ClockRecovery clock_recovery { clock_recovery_rate, symbol_rate, { 1.0f / 18.0f }, [this](const float symbol) { this->consume_symbol(symbol); } diff --git a/firmware/baseband/proc_nfm_audio.cpp b/firmware/baseband/proc_nfm_audio.cpp index 88d6bfd8..5020d8da 100644 --- a/firmware/baseband/proc_nfm_audio.cpp +++ b/firmware/baseband/proc_nfm_audio.cpp @@ -23,6 +23,8 @@ #include "audio_output.hpp" +#include "event_m4.hpp" + #include #include @@ -93,3 +95,9 @@ void NarrowbandFMAudio::capture_config(const CaptureConfigMessage& message) { audio_output.set_stream(nullptr); } } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband/proc_nfm_audio.hpp b/firmware/baseband/proc_nfm_audio.hpp index 164e0b45..f4529a73 100644 --- a/firmware/baseband/proc_nfm_audio.hpp +++ b/firmware/baseband/proc_nfm_audio.hpp @@ -23,6 +23,8 @@ #define __PROC_NFM_AUDIO_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" +#include "rssi_thread.hpp" #include "dsp_decimate.hpp" #include "dsp_demodulate.hpp" @@ -41,6 +43,9 @@ public: private: static constexpr size_t baseband_fs = 3072000; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + RSSIThread rssi_thread { NORMALPRIO + 10 }; + std::array dst; const buffer_c16_t dst_buffer { dst.data(), diff --git a/firmware/baseband/proc_tpms.cpp b/firmware/baseband/proc_tpms.cpp index 9d401a1c..c9224c3c 100644 --- a/firmware/baseband/proc_tpms.cpp +++ b/firmware/baseband/proc_tpms.cpp @@ -23,6 +23,8 @@ #include "dsp_fir_taps.hpp" +#include "event_m4.hpp" + TPMSProcessor::TPMSProcessor() { decim_0.configure(taps_200k_decim_0.taps, 33554432); decim_1.configure(taps_200k_decim_1.taps, 131072); @@ -32,41 +34,32 @@ void TPMSProcessor::execute(const buffer_c8_t& buffer) { /* 2.4576MHz, 2048 samples */ const auto decim_0_out = decim_0.execute(buffer, dst_buffer); - const auto decim_1_out = decim_1.execute(decim_0_out, dst_buffer); - const auto decimator_out = decim_1_out; + const auto decimator_out = decim_1.execute(decim_0_out, dst_buffer); /* 307.2kHz, 256 samples */ feed_channel_stats(decimator_out); for(size_t i=0; ipacket_builder_ook_subaru.execute(symbol); + clock_recovery_ook_8k192(slicer_history, [this](const bool symbol) { + this->packet_builder_ook_8k192_schrader.execute(symbol); }); - ook_clock_recovery_gmc(slicer_history, [this](const bool symbol) { - this->packet_builder_ook_gmc.execute(symbol); + clock_recovery_ook_8k4(slicer_history, [this](const bool symbol) { + this->packet_builder_ook_8k4_schrader.execute(symbol); }); } } -void TPMSProcessor::consume_symbol( - const float raw_symbol -) { - const uint_fast8_t sliced_symbol = (raw_symbol >= 0.0f) ? 1 : 0; - packet_builder.execute(sliced_symbol); -} - -void TPMSProcessor::payload_handler( - const baseband::Packet& packet -) { - const TPMSPacketMessage message { tpms::SignalType::FLM, packet }; - shared_memory.application_queue.push(message); +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; } diff --git a/firmware/baseband/proc_tpms.hpp b/firmware/baseband/proc_tpms.hpp index 759f7383..bc1c0b3f 100644 --- a/firmware/baseband/proc_tpms.hpp +++ b/firmware/baseband/proc_tpms.hpp @@ -23,6 +23,8 @@ #define __PROC_TPMS_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" +#include "rssi_thread.hpp" #include "channel_decimator.hpp" #include "matched_filter.hpp" @@ -44,7 +46,7 @@ // Translate+rectangular filter // sample=307.2k, deviation=38400, symbol=19200 // Length: 16 taps, 1 symbols, 2 cycles of sinusoid -constexpr std::array, 16> rect_taps_307k2_1t_p { { +constexpr std::array, 16> rect_taps_307k2_38k4_1t_19k2_p { { { 6.2500000000e-02f, 0.0000000000e+00f }, { 4.4194173824e-02f, 4.4194173824e-02f }, { 0.0000000000e+00f, 6.2500000000e-02f }, { -4.4194173824e-02f, 4.4194173824e-02f }, { -6.2500000000e-02f, 0.0000000000e+00f }, { -4.4194173824e-02f, -4.4194173824e-02f }, @@ -62,6 +64,11 @@ public: void execute(const buffer_c8_t& buffer) override; private: + static constexpr size_t baseband_fs = 2457600; + + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + RSSIThread rssi_thread { NORMALPRIO + 10 }; + std::array dst; const buffer_c16_t dst_buffer { dst.data(), @@ -71,55 +78,66 @@ private: dsp::decimate::FIRC8xR16x24FS4Decim4 decim_0; dsp::decimate::FIRC16xR16x16Decim2 decim_1; - dsp::matched_filter::MatchedFilter mf { rect_taps_307k2_1t_p, 8 }; + dsp::matched_filter::MatchedFilter mf_38k4_1t_19k2 { rect_taps_307k2_38k4_1t_19k2_p, 8 }; - clock_recovery::ClockRecovery clock_recovery { + clock_recovery::ClockRecovery clock_recovery_fsk_19k2 { 38400, 19200, { 0.0555f }, - [this](const float symbol) { this->consume_symbol(symbol); } + [this](const float raw_symbol) { + const uint_fast8_t sliced_symbol = (raw_symbol >= 0.0f) ? 1 : 0; + this->packet_builder_fsk_19k2_schrader.execute(sliced_symbol); + } }; - PacketBuilder packet_builder { + PacketBuilder packet_builder_fsk_19k2_schrader { { 0b010101010101010101010101010110, 30, 1 }, { }, - { 256 }, + { 160 }, [this](const baseband::Packet& packet) { - this->payload_handler(packet); + const TPMSPacketMessage message { tpms::SignalType::FSK_19k2_Schrader, packet }; + shared_memory.application_queue.push(message); } }; static constexpr float channel_rate_in = 307200.0f; static constexpr size_t channel_decimation = 8; static constexpr float channel_sample_rate = channel_rate_in / channel_decimation; - OOKSlicerMagSquaredInt ook_slicer_5sps { 5 }; + OOKSlicerMagSquaredInt ook_slicer_5sps { channel_sample_rate / 8400 + 1}; uint32_t slicer_history { 0 }; - OOKClockRecovery ook_clock_recovery_subaru { + OOKClockRecovery clock_recovery_ook_8k192 { channel_sample_rate / 8192.0f }; - PacketBuilder packet_builder_ook_subaru { + PacketBuilder packet_builder_ook_8k192_schrader { + /* Preamble: 11*2, 01*14, 11, 10 + * Payload: 37 Manchester-encoded bits + * Bit rate: 4096 Hz + */ { 0b010101010101010101011110, 24, 0 }, { }, - { 80 }, + { 37 * 2 }, [](const baseband::Packet& packet) { - const TPMSPacketMessage message { tpms::SignalType::Subaru, packet }; + const TPMSPacketMessage message { tpms::SignalType::OOK_8k192_Schrader, packet }; shared_memory.application_queue.push(message); } }; - OOKClockRecovery ook_clock_recovery_gmc { + + OOKClockRecovery clock_recovery_ook_8k4 { channel_sample_rate / 8400.0f }; - PacketBuilder packet_builder_ook_gmc { + PacketBuilder packet_builder_ook_8k4_schrader { + /* Preamble: 01*40, 01, 10, 01, 01 + * Payload: 76 Manchester-encoded bits + * Bit rate: 4200 Hz + */ { 0b01010101010101010101010101100101, 32, 0 }, { }, - { 192 }, + { 76 * 2 }, [](const baseband::Packet& packet) { - const TPMSPacketMessage message { tpms::SignalType::GMC, packet }; + const TPMSPacketMessage message { tpms::SignalType::OOK_8k4_Schrader, packet }; shared_memory.application_queue.push(message); } }; - void consume_symbol(const float symbol); - void payload_handler(const baseband::Packet& packet); }; #endif/*__PROC_TPMS_H__*/ diff --git a/firmware/baseband/proc_wfm_audio.cpp b/firmware/baseband/proc_wfm_audio.cpp index 98de47b8..2e553a7d 100644 --- a/firmware/baseband/proc_wfm_audio.cpp +++ b/firmware/baseband/proc_wfm_audio.cpp @@ -23,6 +23,8 @@ #include "audio_output.hpp" +#include "event_m4.hpp" + #include void WidebandFMAudio::execute(const buffer_c8_t& buffer) { @@ -122,3 +124,9 @@ void WidebandFMAudio::capture_config(const CaptureConfigMessage& message) { audio_output.set_stream(nullptr); } } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband/proc_wfm_audio.hpp b/firmware/baseband/proc_wfm_audio.hpp index 9752f90a..446990f5 100644 --- a/firmware/baseband/proc_wfm_audio.hpp +++ b/firmware/baseband/proc_wfm_audio.hpp @@ -23,6 +23,8 @@ #define __PROC_WFM_AUDIO_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" +#include "rssi_thread.hpp" #include "dsp_decimate.hpp" #include "dsp_demodulate.hpp" @@ -40,6 +42,9 @@ private: static constexpr size_t baseband_fs = 3072000; static constexpr auto spectrum_rate_hz = 50.0f; + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + RSSIThread rssi_thread { NORMALPRIO + 10 }; + std::array dst; const buffer_c16_t dst_buffer { dst.data(), diff --git a/firmware/baseband/proc_wideband_spectrum.cpp b/firmware/baseband/proc_wideband_spectrum.cpp index 399cf626..76d627c2 100644 --- a/firmware/baseband/proc_wideband_spectrum.cpp +++ b/firmware/baseband/proc_wideband_spectrum.cpp @@ -72,3 +72,9 @@ void WidebandSpectrum::on_message(const Message* const message) { break; } } + +int main() { + EventDispatcher event_dispatcher { std::make_unique() }; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband/proc_wideband_spectrum.hpp b/firmware/baseband/proc_wideband_spectrum.hpp index 5a875735..7a650ee0 100644 --- a/firmware/baseband/proc_wideband_spectrum.hpp +++ b/firmware/baseband/proc_wideband_spectrum.hpp @@ -23,6 +23,9 @@ #define __PROC_WIDEBAND_SPECTRUM_H__ #include "baseband_processor.hpp" +#include "baseband_thread.hpp" +#include "rssi_thread.hpp" + #include "spectrum_collector.hpp" #include "message.hpp" @@ -38,6 +41,11 @@ public: void on_message(const Message* const message) override; private: + static constexpr size_t baseband_fs = 20000000; + + BasebandThread baseband_thread { baseband_fs, this, NORMALPRIO + 20 }; + RSSIThread rssi_thread { NORMALPRIO + 10 }; + SpectrumCollector channel_spectrum; std::array spectrum; diff --git a/firmware/baseband/rssi_dma.hpp b/firmware/baseband/rssi_dma.hpp index e543dcf6..263dcfcf 100644 --- a/firmware/baseband/rssi_dma.hpp +++ b/firmware/baseband/rssi_dma.hpp @@ -30,8 +30,6 @@ namespace rf { namespace rssi { namespace dma { -using Handler = void (*)(); - void init(); void allocate(size_t buffer_count, size_t items_per_buffer); diff --git a/firmware/baseband/rssi_thread.cpp b/firmware/baseband/rssi_thread.cpp index 0bf15334..81be13ec 100644 --- a/firmware/baseband/rssi_thread.cpp +++ b/firmware/baseband/rssi_thread.cpp @@ -30,20 +30,30 @@ WORKING_AREA(rssi_thread_wa, 128); -Thread* RSSIThread::start(const tprio_t priority) { - return chThdCreateStatic(rssi_thread_wa, sizeof(rssi_thread_wa), +Thread* RSSIThread::thread = nullptr; + +RSSIThread::RSSIThread(const tprio_t priority) { + thread = chThdCreateStatic(rssi_thread_wa, sizeof(rssi_thread_wa), priority, ThreadBase::fn, this ); } +RSSIThread::~RSSIThread() { + chThdTerminate(thread); + chThdWait(thread); + thread = nullptr; +} + void RSSIThread::run() { rf::rssi::init(); rf::rssi::dma::allocate(4, 400); RSSIStatisticsCollector stats; - while(true) { + rf::rssi::start(); + + while( !chThdShouldTerminate() ) { // TODO: Place correct sampling rate into buffer returned here: const auto buffer_tmp = rf::rssi::dma::wait_for_buffer(); const rf::rssi::buffer_t buffer { @@ -59,5 +69,6 @@ void RSSIThread::run() { ); } + rf::rssi::stop(); rf::rssi::dma::free(); } diff --git a/firmware/baseband/rssi_thread.hpp b/firmware/baseband/rssi_thread.hpp index 5233ddd5..46a0031b 100644 --- a/firmware/baseband/rssi_thread.hpp +++ b/firmware/baseband/rssi_thread.hpp @@ -30,11 +30,14 @@ class RSSIThread : public ThreadBase { public: - Thread* start(const tprio_t priority); + RSSIThread(const tprio_t priority); + ~RSSIThread(); private: void run() override; + static Thread* thread; + const uint32_t sampling_rate { 400000 }; }; diff --git a/firmware/baseband/stream_input.cpp b/firmware/baseband/stream_input.cpp new file mode 100644 index 00000000..f383be9c --- /dev/null +++ b/firmware/baseband/stream_input.cpp @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "stream_input.hpp" + +#include "lpc43xx_cpp.hpp" +using namespace lpc43xx; + +StreamInput::StreamInput(CaptureConfig* const config) : + fifo_buffers_empty { buffers_empty.data(), buffer_count_max_log2 }, + fifo_buffers_full { buffers_full.data(), buffer_count_max_log2 }, + config { config }, + data { std::make_unique(config->write_size * config->buffer_count) } +{ + config->fifo_buffers_empty = &fifo_buffers_empty; + config->fifo_buffers_full = &fifo_buffers_full; + + for(size_t i=0; ibuffer_count; i++) { + buffers[i] = { &(data.get()[i * config->write_size]), config->write_size }; + fifo_buffers_empty.in(&buffers[i]); + } +} + +size_t StreamInput::write(const void* const data, const size_t length) { + const uint8_t* p = static_cast(data); + size_t written = 0; + + while( written < length ) { + if( !active_buffer ) { + // We need an empty buffer... + if( !fifo_buffers_empty.out(active_buffer) ) { + // ...but none are available. Samples were dropped. + break; + } + } + + const auto remaining = length - written; + written += active_buffer->write(&p[written], remaining); + + if( active_buffer->is_full() ) { + if( !fifo_buffers_full.in(active_buffer) ) { + // FIFO is fuil of buffers, there's no place for this one. + // Bail out of the loop, and try submitting the buffer in the + // next pass. + // This should never happen if the number of buffers is less + // than the capacity of the FIFO. + break; + } + active_buffer = nullptr; + creg::m4txevent::assert(); + } + } + + config->baseband_bytes_received += length; + config->baseband_bytes_dropped += (length - written); + + return written; +} diff --git a/firmware/baseband/stream_input.hpp b/firmware/baseband/stream_input.hpp index cb4bbe4e..ce4a29a4 100644 --- a/firmware/baseband/stream_input.hpp +++ b/firmware/baseband/stream_input.hpp @@ -25,46 +25,29 @@ #include "message.hpp" #include "fifo.hpp" -#include "lpc43xx_cpp.hpp" -using namespace lpc43xx; - #include #include +#include #include class StreamInput { public: - StreamInput(CaptureConfig* const config) : - config { config }, - K { config->write_size_log2 + config->buffer_count_log2 }, - event_bytes_mask { (1UL << config->write_size_log2) - 1 }, - data { std::make_unique(1UL << K) }, - fifo { data.get(), K } - { - config->fifo = &fifo; - } + StreamInput(CaptureConfig* const config); - size_t write(const void* const data, const size_t length) { - const auto written = fifo.in(reinterpret_cast(data), length); - - const auto last_bytes_written = bytes_written; - bytes_written += written; - if( (bytes_written & event_bytes_mask) < (last_bytes_written & event_bytes_mask) ) { - creg::m4txevent::assert(); - } - config->baseband_bytes_received += length; - config->baseband_bytes_dropped = config->baseband_bytes_received - bytes_written; - - return written; - } + size_t write(const void* const data, const size_t length); private: - CaptureConfig* const config; - const size_t K; - const uint64_t event_bytes_mask; - uint64_t bytes_written = 0; + static constexpr size_t buffer_count_max_log2 = 3; + static constexpr size_t buffer_count_max = 1U << buffer_count_max_log2; + + FIFO fifo_buffers_empty; + FIFO fifo_buffers_full; + std::array buffers; + std::array buffers_empty; + std::array buffers_full; + StreamBuffer* active_buffer { nullptr }; + CaptureConfig* const config { nullptr }; std::unique_ptr data; - FIFO fifo; }; #endif/*__STREAM_INPUT_H__*/ diff --git a/firmware/baseband/touch_dma.hpp b/firmware/baseband/touch_dma.hpp index 777230e4..13c92b21 100644 --- a/firmware/baseband/touch_dma.hpp +++ b/firmware/baseband/touch_dma.hpp @@ -32,8 +32,6 @@ namespace dma { using sample_t = uint32_t; using buffer_t = buffer_t; -using Handler = void (*)(); - void init(); void allocate(); diff --git a/firmware/baseband/Makefile b/firmware/bootstrap/CMakeLists.txt old mode 100755 new mode 100644 similarity index 53% rename from firmware/baseband/Makefile rename to firmware/bootstrap/CMakeLists.txt index 6c4ec717..3e48bc42 --- a/firmware/baseband/Makefile +++ b/firmware/bootstrap/CMakeLists.txt @@ -1,4 +1,3 @@ - # # Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. # @@ -25,53 +24,33 @@ # NOTE: Can be overridden externally. # +enable_language(C CXX ASM) + +project(bootstrap) + # Compiler options here. -ifeq ($(USE_OPT),) - USE_OPT = -mthumb \ - -O3 -ggdb3 \ - -ffunction-sections \ - -fdata-sections \ - -fno-builtin \ - -falign-functions=16 \ - -fno-math-errno \ - --specs=nano.specs - #-fomit-frame-pointer -endif +set(USE_OPT "-Os -falign-functions=16 -fno-math-errno --specs=nano.specs") # C specific options here (added to USE_OPT). -ifeq ($(USE_COPT),) - USE_COPT = -std=gnu99 -endif +set(USE_COPT "-std=gnu99") # C++ specific options here (added to USE_OPT). -ifeq ($(USE_CPPOPT),) - USE_CPPOPT = -std=c++11 -fno-rtti -fno-exceptions -endif +set(USE_CPPOPT "-std=c++11 -fno-rtti -fno-exceptions") # Enable this if you want the linker to remove unused code and data -ifeq ($(USE_LINK_GC),) - USE_LINK_GC = yes -endif +set(USE_LINK_GC yes) # Linker extra options here. -ifeq ($(USE_LDOPT),) - USE_LDOPT = -endif +set(USE_LDOPT) # Enable this if you want link time optimizations (LTO) -ifeq ($(USE_LTO),) - USE_LTO = no -endif +set(USE_LTO no) # If enabled, this option allows to compile the application in THUMB mode. -ifeq ($(USE_THUMB),) - USE_THUMB = yes -endif +set(USE_THUMB yes) # Enable this if you want to see the full log while compiling. -ifeq ($(USE_VERBOSE_COMPILE),) - USE_VERBOSE_COMPILE = no -endif +set(USE_VERBOSE_COMPILE no) # # Build global options @@ -82,9 +61,7 @@ endif # # Enables the use of FPU on Cortex-M4 (no, softfp, hard). -ifeq ($(USE_FPU),) - USE_FPU = hard -endif +set(USE_FPU no) # # Architecture or project specific options @@ -94,106 +71,48 @@ endif # Project, sources and paths # -# Define project name here -PROJECT = baseband - -# Imported source files and paths -CHIBIOS = ../chibios -CHIBIOS_PORTAPACK = ../chibios-portapack -include $(CHIBIOS_PORTAPACK)/boards/GSG_HACKRF_ONE/board.mk -include $(CHIBIOS_PORTAPACK)/os/hal/platforms/LPC43xx_M4/platform.mk -include $(CHIBIOS)/os/hal/hal.mk -include $(CHIBIOS_PORTAPACK)/os/ports/GCC/ARMCMx/LPC43xx_M4/port.mk -include $(CHIBIOS)/os/kernel/kernel.mk - -include $(CHIBIOS)/test/test.mk - # Define linker script file here -LDSCRIPT= $(PORTLD)/LPC43xx_M4.ld +set(LDSCRIPT ${CMAKE_CURRENT_SOURCE_DIR}/m4.ld) # C sources that can be compiled in ARM or THUMB mode depending on the global # setting. -CSRC = $(PORTSRC) \ - $(KERNSRC) \ - $(TESTSRC) \ - $(HALSRC) \ - $(PLATFORMSRC) \ - $(BOARDSRC) - +set(CSRC + bootstrap.c +) # C++ sources that can be compiled in ARM or THUMB mode depending on the global # setting. -CPPSRC = main.cpp \ - message_queue.cpp \ - event.cpp \ - event_m4.cpp \ - thread_wait.cpp \ - gpdma.cpp \ - baseband_dma.cpp \ - baseband_sgpio.cpp \ - portapack_shared_memory.cpp \ - baseband_thread.cpp \ - baseband_processor.cpp \ - baseband_stats_collector.cpp \ - dsp_decimate.cpp \ - dsp_demodulate.cpp \ - matched_filter.cpp \ - proc_am_audio.cpp \ - proc_nfm_audio.cpp \ - spectrum_collector.cpp \ - proc_wfm_audio.cpp \ - proc_ais.cpp \ - proc_wideband_spectrum.cpp \ - proc_closecall.cpp \ - proc_tpms.cpp \ - proc_ert.cpp \ - proc_capture.cpp \ - dsp_squelch.cpp \ - clock_recovery.cpp \ - packet_builder.cpp \ - dsp_fft.cpp \ - dsp_fir_taps.cpp \ - dsp_iir.cpp \ - fxpt_atan2.cpp \ - rssi.cpp \ - rssi_dma.cpp \ - rssi_thread.cpp \ - audio_compressor.cpp \ - audio_output.cpp \ - audio_dma.cpp \ - audio_stats_collector.cpp \ - touch_dma.cpp \ - ../common/utility.cpp \ - ../common/chibios_cpp.cpp \ - ../common/debug.cpp \ - ../common/gcc.cpp +set(CPPSRC) # C sources to be compiled in ARM mode regardless of the global setting. # NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler # option that results in lower performance and larger code size. -ACSRC = +set(ACSRC) # C++ sources to be compiled in ARM mode regardless of the global setting. # NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler # option that results in lower performance and larger code size. -ACPPSRC = +set(ACPPSRC) # C sources to be compiled in THUMB mode regardless of the global setting. # NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler # option that results in lower performance and larger code size. -TCSRC = +set(TCSRC) # C sources to be compiled in THUMB mode regardless of the global setting. # NOTE: Mixing ARM and THUMB mode enables the -mthumb-interwork compiler # option that results in lower performance and larger code size. -TCPPSRC = +set(TCPPSRC) # List ASM source files here -ASMSRC = $(PORTASM) +set(ASMSRC startup_ARMCM4.S) -INCDIR = ../common $(PORTINC) $(KERNINC) $(TESTINC) \ - $(HALINC) $(PLATFORMINC) $(BOARDINC) \ - $(CHIBIOS)/os/various +set(INCDIR + ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include + ${CHIBIOS}/os/ports/common/ARMCMx + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx_M4 +) # # Project, sources and paths @@ -203,35 +122,19 @@ INCDIR = ../common $(PORTINC) $(KERNINC) $(TESTINC) \ # Compiler settings # -MCU = cortex-m4 - -#TRGT = arm-elf- -TRGT = /usr/local/gcc-arm-none-eabi-5_2-2015q4/bin/arm-none-eabi- -CC = $(TRGT)gcc -CPPC = $(TRGT)g++ -# Enable loading with g++ only if you need C++ runtime support. -# NOTE: You can use C++ even without C++ support if you are careful. C++ -# runtime support makes code size explode. -#LD = $(TRGT)gcc -LD = $(TRGT)g++ -CP = $(TRGT)objcopy -AS = $(TRGT)gcc -x assembler-with-cpp -OD = $(TRGT)objdump -SZ = $(TRGT)size -HEX = $(CP) -O ihex -BIN = $(CP) -O binary +set(MCU cortex-m4) # ARM-specific options here -AOPT = +set(AOPT) # THUMB-specific options here -TOPT = -mthumb -DTHUMB +set(TOPT "-mthumb -DTHUMB") # Define C warning options here -CWARN = -Wall -Wextra -Wstrict-prototypes +set(CWARN "-Wall -Wextra -Wstrict-prototypes") # Define C++ warning options here -CPPWARN = -Wall -Wextra +set(CPPWARN "-Wall -Wextra") # # Compiler settings @@ -244,21 +147,19 @@ CPPWARN = -Wall -Wextra # List all default C defines here, like -D_DEBUG=1 # TODO: Switch -DCRT0_INIT_DATA depending on load from RAM or SPIFI? # NOTE: _RANDOM_TCC to kill a GCC 4.9.3 error with std::max argument types -DDEFS = -DLPC43XX -DLPC43XX_M4 -D__NEWLIB__ -DHACKRF_ONE \ - -DTOOLCHAIN_GCC -DTOOLCHAIN_GCC_ARM -D_RANDOM_TCC=0 \ - -DGIT_REVISION=\"$(GIT_REVISION)\" +set(DDEFS -DLPC43XX -DLPC43XX_M4 -D__START=main -DGIT_REVISION=\"${GIT_REVISION}\") # List all default ASM defines here, like -D_DEBUG=1 -DADEFS = +set(DADEFS) # List all default directories to look for include files here -DINCDIR = +set(DINCDIR) # List the default directory to look for the libraries here -DLIBDIR = +set(DLIBDIR) # List all default libraries here -DLIBS = +set(DLIBS) # # End of default section @@ -269,23 +170,43 @@ DLIBS = # # List all user C define here, like -D_DEBUG=1 -UDEFS = +set(UDEFS) # Define ASM defines here -UADEFS = +set(UADEFS) # List all user directories here -UINCDIR = +set(UINCDIR) # List the user directory to look for the libraries here -ULIBDIR = +set(ULIBDIR) # List all user libraries here -ULIBS = +set(ULIBS) # # End of user defines ############################################################################## -RULESPATH = $(CHIBIOS)/os/ports/GCC/ARMCMx -include $(RULESPATH)/rules.mk +set(RULESPATH ${CHIBIOS}/os/ports/GCC/ARMCMx) +include(${RULESPATH}/rules.cmake) + +############################################################################## + +add_executable(${PROJECT_NAME}.elf ${CSRC} ${CPPSRC} ${ASMSRC}) +set_target_properties(${PROJECT_NAME}.elf PROPERTIES LINK_DEPENDS ${LDSCRIPT}) +add_definitions(${DEFS}) +include_directories(. ${INCDIR}) +link_directories(${LLIBDIR}) +target_link_libraries(${PROJECT_NAME}.elf ${LIBS}) + +add_custom_command( + OUTPUT ${PROJECT_NAME}.bin + COMMAND ${CMAKE_OBJCOPY} -O binary ${PROJECT_NAME}.elf ${PROJECT_NAME}.bin + DEPENDS ${PROJECT_NAME}.elf +) + +add_custom_target( + bootstrap + DEPENDS ${PROJECT_NAME}.bin +) diff --git a/firmware/bootstrap/Makefile b/firmware/bootstrap/Makefile deleted file mode 100644 index 85d3c738..00000000 --- a/firmware/bootstrap/Makefile +++ /dev/null @@ -1,65 +0,0 @@ -# -# Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. -# -# This file is part of PortaPack. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; see the file COPYING. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, -# Boston, MA 02110-1301, USA. -# - -TARGET=bootstrap - -CC=arm-none-eabi-gcc -LD=arm-none-eabi-gcc -CP=arm-none-eabi-objcopy -OBJDUMP=arm-none-eabi-objdump - -CHIBIOS_PORTAPACK=../chibios-portapack -CHIBIOS=../chibios -INCLUDE=-I $(CHIBIOS)/os/ports/common/ARMCMx/CMSIS/include \ - -I $(CHIBIOS)/os/ports/common/ARMCMx \ - -I $(CHIBIOS_PORTAPACK)/os/hal/platforms/LPC43xx \ - -I $(CHIBIOS_PORTAPACK)/os/hal/platforms/LPC43xx_M4 -MCPU=cortex-m4 -CPUFLAGS=-mcpu=$(MCPU) -mthumb -mno-thumb-interwork -DTHUMB -DTHUMB_PRESENT -DTHUMB_NO_INTERWORKING - -COPT=-std=gnu99 \ - -Wall -Wextra -Wstrict-prototypes \ - $(CPUFLAGS) \ - -DLPC43XX -DLPC43XX_M4 \ - -DGIT_REVISION=\"$(GIT_REVISION)\" \ - -Os \ - -ffunction-sections \ - -fdata-sections \ - -fno-builtin --specs=nano.specs - -LDOPT=-nostartfiles \ - $(CPUFLAGS) \ - -D__START=main \ - -Wl,-Map=$(TARGET).map,--cref,--no-warn-mismatch,--library-path=.,--script=m4.ld,--gc-sections - -all: $(TARGET).elf - -$(TARGET).lst: $(TARGET).elf - $(OBJDUMP) -S $(TARGET).elf >$(TARGET).lst - -$(TARGET).elf: $(TARGET).o startup_ARMCM4.S - $(LD) $(LDOPT) $(LIB) -o $(TARGET).elf $(TARGET).o startup_ARMCM4.S - -$(TARGET).o: $(TARGET).c - $(CC) $(COPT) $(INCLUDE) -c -o $(TARGET).o $(TARGET).c - -clean: - rm -f $(TARGET).o $(TARGET).elf $(TARGET).bin $(TARGET).lst $(TARGET).map diff --git a/firmware/chibios-portapack/boards/GSG_HACKRF_ONE/board.cmake b/firmware/chibios-portapack/boards/GSG_HACKRF_ONE/board.cmake new file mode 100644 index 00000000..5befc3f1 --- /dev/null +++ b/firmware/chibios-portapack/boards/GSG_HACKRF_ONE/board.cmake @@ -0,0 +1,9 @@ +# List of all the board related files. +set(BOARDSRC + ${CHIBIOS_PORTAPACK}/boards/GSG_HACKRF_ONE/board.c +) + +# Required include directories +set(BOARDINC + ${CHIBIOS_PORTAPACK}/boards/GSG_HACKRF_ONE +) diff --git a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c index 5e31b6b6..d42b7149 100644 --- a/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c +++ b/firmware/chibios-portapack/os/hal/platforms/LPC43xx/sdc_lld.c @@ -200,8 +200,14 @@ static void sdio_cclk_set_400khz(void) { } static void sdio_cclk_set_fast(void) { +#if defined(PORTAPACK_FAST_SDIO) + /* 200MHz / (2 * 2) = 50MHz */ + /* TODO: Adjust SCU pin configurations: pull-up/down, slew, glitch filter? */ + sdio_cclk_set(2); +#else /* 200MHz / (2 * 4) = 25MHz */ sdio_cclk_set(4); +#endif } static void sdio_width_set_1bit(void) { diff --git a/firmware/chibios-portapack/os/hal/platforms/LPC43xx_M0/platform.cmake b/firmware/chibios-portapack/os/hal/platforms/LPC43xx_M0/platform.cmake new file mode 100644 index 00000000..d1566907 --- /dev/null +++ b/firmware/chibios-portapack/os/hal/platforms/LPC43xx_M0/platform.cmake @@ -0,0 +1,17 @@ +# List of all the LPC43xx M0 platform files. +set(PLATFORMSRC + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx_M0/hal_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/gpt_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/i2c_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/pal_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/rtc_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/sdc_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/serial_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/spi_lld.c +) + +# Required include directories +set(PLATFORMINC + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx_M0 + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx +) diff --git a/firmware/chibios-portapack/os/hal/platforms/LPC43xx_M4/platform.cmake b/firmware/chibios-portapack/os/hal/platforms/LPC43xx_M4/platform.cmake new file mode 100644 index 00000000..20952c85 --- /dev/null +++ b/firmware/chibios-portapack/os/hal/platforms/LPC43xx_M4/platform.cmake @@ -0,0 +1,17 @@ +# List of all the LPC43xx M4 platform files. +set(PLATFORMSRC + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx_M4/hal_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/gpt_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/i2c_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/pal_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/rtc_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/sdc_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/serial_lld.c + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx/spi_lld.c +) + +# Required include directories +set(PLATFORMINC + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx_M4 + ${CHIBIOS_PORTAPACK}/os/hal/platforms/LPC43xx +) diff --git a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/port.cmake b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/port.cmake new file mode 100644 index 00000000..336f9102 --- /dev/null +++ b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M0/port.cmake @@ -0,0 +1,21 @@ +# List of the ChibiOS/RT Cortex-M0 LPC43xx port files. +set(PORTSRC + ${CHIBIOS}/os/ports/GCC/ARMCMx/crt0.c + ${CHIBIOS_PORTAPACK}/os/ports/GCC/ARMCMx/LPC43xx_M0/vectors.c + ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c + ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v6m.c + ${CHIBIOS}/os/ports/common/ARMCMx/nvic.c +) + +set(PORTASM) + +set(PORTINC + ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include + ${CHIBIOS}/os/ports/common/ARMCMx + ${CHIBIOS}/os/ports/GCC/ARMCMx + ${CHIBIOS_PORTAPACK}/os/ports/GCC/ARMCMx/LPC43xx_M0 +) + +set(PORTLD + ${CHIBIOS_PORTAPACK}/os/ports/GCC/ARMCMx/LPC43xx_M0/ld +) diff --git a/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/port.cmake b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/port.cmake new file mode 100644 index 00000000..482e107b --- /dev/null +++ b/firmware/chibios-portapack/os/ports/GCC/ARMCMx/LPC43xx_M4/port.cmake @@ -0,0 +1,21 @@ +# List of the ChibiOS/RT Cortex-M4 LPC43xx port files. +set(PORTSRC + ${CHIBIOS}/os/ports/GCC/ARMCMx/crt0.c + ${CHIBIOS_PORTAPACK}/os/ports/GCC/ARMCMx/LPC43xx_M4/vectors.c + ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore.c + ${CHIBIOS}/os/ports/GCC/ARMCMx/chcore_v7m.c + ${CHIBIOS}/os/ports/common/ARMCMx/nvic.c +) + +set(PORTASM) + +set(PORTINC + ${CHIBIOS}/os/ports/common/ARMCMx/CMSIS/include + ${CHIBIOS}/os/ports/common/ARMCMx + ${CHIBIOS}/os/ports/GCC/ARMCMx + ${CHIBIOS_PORTAPACK}/os/ports/GCC/ARMCMx/LPC43xx_M4 +) + +set(PORTLD + ${CHIBIOS_PORTAPACK}/os/ports/GCC/ARMCMx/LPC43xx_M4/ld +) diff --git a/firmware/chibios-portapack/os/various/fatfs_bindings/fatfs.cmake b/firmware/chibios-portapack/os/various/fatfs_bindings/fatfs.cmake new file mode 100644 index 00000000..389f5d14 --- /dev/null +++ b/firmware/chibios-portapack/os/various/fatfs_bindings/fatfs.cmake @@ -0,0 +1,10 @@ +# FATFS files. +set(FATFSSRC + ${CHIBIOS_PORTAPACK}/os/various/fatfs_bindings/fatfs_diskio.c + ${CHIBIOS_PORTAPACK}/os/various/fatfs_bindings/fatfs_syscall.c + ${CHIBIOS_PORTAPACK}/ext/fatfs/src/ff.c +) + +set(FATFSINC + ${CHIBIOS_PORTAPACK}/ext/fatfs/src +) diff --git a/firmware/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c b/firmware/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c index 6adcdc20..d6cd3b1f 100755 --- a/firmware/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c +++ b/firmware/chibios-portapack/os/various/fatfs_bindings/fatfs_diskio.c @@ -10,6 +10,8 @@ #include "ch.h" #include "hal.h" +#include + #include "diskio.h" #if HAL_USE_MMC_SPI && HAL_USE_SDC @@ -212,6 +214,12 @@ DRESULT disk_ioctl ( case GET_SECTOR_SIZE: *((WORD *)buff) = MMCSD_BLOCK_SIZE; return RES_OK; + case MMC_GET_TYPE: + *((BYTE *)buff) = SDCD1.cardmode; + return RES_OK; + case MMC_GET_CSD: + memcpy(buff, &SDCD1.csd, sizeof(SDCD1.csd)); + return RES_OK; #if _USE_ERASE case CTRL_ERASE_SECTOR: mmcErase(&MMCD1, *((DWORD *)buff), *((DWORD *)buff + 1)); @@ -232,7 +240,13 @@ DRESULT disk_ioctl ( *((WORD *)buff) = MMCSD_BLOCK_SIZE; return RES_OK; case GET_BLOCK_SIZE: - *((DWORD *)buff) = 256; /* 512b blocks in one erase block */ + *((DWORD *)buff) = 1; /* Unknown, TODO: implement? */ + return RES_OK; + case MMC_GET_TYPE: + *((BYTE *)buff) = SDCD1.cardmode; + return RES_OK; + case MMC_GET_CSD: + memcpy(buff, &SDCD1.csd, sizeof(SDCD1.csd)); return RES_OK; #if _USE_ERASE case CTRL_ERASE_SECTOR: diff --git a/firmware/chibios/os/hal/hal.cmake b/firmware/chibios/os/hal/hal.cmake new file mode 100644 index 00000000..07440d15 --- /dev/null +++ b/firmware/chibios/os/hal/hal.cmake @@ -0,0 +1,29 @@ +# List of all the ChibiOS/RT HAL files, there is no need to remove the files +# from this list, you can disable parts of the HAL by editing halconf.h. +set(HALSRC + ${CHIBIOS}/os/hal/src/hal.c + ${CHIBIOS}/os/hal/src/adc.c + ${CHIBIOS}/os/hal/src/can.c + ${CHIBIOS}/os/hal/src/ext.c + ${CHIBIOS}/os/hal/src/gpt.c + ${CHIBIOS}/os/hal/src/i2c.c + ${CHIBIOS}/os/hal/src/icu.c + ${CHIBIOS}/os/hal/src/mac.c + ${CHIBIOS}/os/hal/src/mmc_spi.c + ${CHIBIOS}/os/hal/src/mmcsd.c + ${CHIBIOS}/os/hal/src/pal.c + ${CHIBIOS}/os/hal/src/pwm.c + ${CHIBIOS}/os/hal/src/rtc.c + ${CHIBIOS}/os/hal/src/sdc.c + ${CHIBIOS}/os/hal/src/serial.c + ${CHIBIOS}/os/hal/src/serial_usb.c + ${CHIBIOS}/os/hal/src/spi.c + ${CHIBIOS}/os/hal/src/tm.c + ${CHIBIOS}/os/hal/src/uart.c + ${CHIBIOS}/os/hal/src/usb.c +) + +# Required include directories +set(HALINC + ${CHIBIOS}/os/hal/include +) diff --git a/firmware/chibios/os/kernel/kernel.cmake b/firmware/chibios/os/kernel/kernel.cmake new file mode 100644 index 00000000..f3c629e0 --- /dev/null +++ b/firmware/chibios/os/kernel/kernel.cmake @@ -0,0 +1,27 @@ +# List of all the ChibiOS/RT kernel files, there is no need to remove the files +# from this list, you can disable parts of the kernel by editing chconf.h. +set(KERNSRC + ${CHIBIOS}/os/kernel/src/chsys.c + ${CHIBIOS}/os/kernel/src/chdebug.c + ${CHIBIOS}/os/kernel/src/chlists.c + ${CHIBIOS}/os/kernel/src/chvt.c + ${CHIBIOS}/os/kernel/src/chschd.c + ${CHIBIOS}/os/kernel/src/chthreads.c + ${CHIBIOS}/os/kernel/src/chdynamic.c + ${CHIBIOS}/os/kernel/src/chregistry.c + ${CHIBIOS}/os/kernel/src/chsem.c + ${CHIBIOS}/os/kernel/src/chmtx.c + ${CHIBIOS}/os/kernel/src/chcond.c + ${CHIBIOS}/os/kernel/src/chevents.c + ${CHIBIOS}/os/kernel/src/chmsg.c + ${CHIBIOS}/os/kernel/src/chmboxes.c + ${CHIBIOS}/os/kernel/src/chqueues.c + ${CHIBIOS}/os/kernel/src/chmemcore.c + ${CHIBIOS}/os/kernel/src/chheap.c + ${CHIBIOS}/os/kernel/src/chmempools.c +) + +# Required include directories +set(KERNINC + ${CHIBIOS}/os/kernel/include +) diff --git a/firmware/chibios/os/ports/GCC/ARMCMx/rules.cmake b/firmware/chibios/os/ports/GCC/ARMCMx/rules.cmake new file mode 100644 index 00000000..2e20d853 --- /dev/null +++ b/firmware/chibios/os/ports/GCC/ARMCMx/rules.cmake @@ -0,0 +1,107 @@ +# ARM Cortex-Mx common makefile scripts and rules. + +############################################################################## +# Processing options coming from the upper Makefile. +# + +# Compiler options +set(OPT ${USE_OPT}) +set(COPT ${USE_COPT}) +set(CPPOPT ${USE_CPPOPT}) + +# Garbage collection +if(USE_LINK_GC STREQUAL "yes") + set(OPT "${OPT} -ffunction-sections -fdata-sections -fno-common") + set(LDOPT ",--gc-sections") +else() + set(LDOPT) +endif() + +# Linker extra options +if(DEFINED USE_LDOPT) + set(LDOPT "${LDOPT},${USE_LDOPT}") +endif() + +# Link time optimizations +if(USE_LTO STREQUAL "yes") + set(OPT "${OPT} -flto") +endif() + +# FPU-related options +if(NOT DEFINED USE_FPU) + set(USE_FPU no) +endif() +if(NOT USE_FPU STREQUAL "no") + set(OPT "${OPT} -mfloat-abi=${USE_FPU} -mfpu=fpv4-sp-d16 -fsingle-precision-constant") + set(DDEFS ${DDEFS} -DCORTEX_USE_FPU=TRUE) + set(DADEFS ${DADEFS} -DCORTEX_USE_FPU=TRUE) +else() + set(DDEFS ${DDEFS} -DCORTEX_USE_FPU=FALSE) + set(DADEFS ${DADEFS} -DCORTEX_USE_FPU=FALSE) +endif() + +# Source files groups and paths +if(USE_THUMB STREQUAL "yes") + set(TCSRC ${TCSRC} ${CSRC}) + set(TCPPSRC ${TCPPSRC} ${CPPSRC}) +else() + set(ACSRC ${ACSRC} ${CSRC}) + set(ACPPSRC ${ACPPSRC} ${CPPSRC}) +endif() +set(ASRC ${ACSRC} ${ACPPSRC}) +set(TSRC ${TCSRC} ${TCPPSRC}) + +# Paths +set(IINCDIR ${INCDIR} ${DINCDIR} ${UINCDIR}) +set(LLIBDIR ${DLIBDIR} ${ULIBDIR}) + +# Macros +set(DEFS ${DDEFS} ${UDEFS}) +set(ADEFS ${DADEFS} ${UADEFS}) + +# Libs +set(LIBS ${DLIBS} ${ULIBS}) + +# Various settings +set(MCFLAGS -mcpu=${MCU}) +set(ODFLAGS "-x --syms") +set(ASFLAGS "${MCFLAGS} ${ADEFS}") +set(ASXFLAGS "${MCFLAGS} ${ADEFS}") +set(CFLAGS "${MCFLAGS} ${OPT} ${COPT} ${CWARN}") +set(CPPFLAGS "${MCFLAGS} ${OPT} ${CPPOPT} ${CPPWARN}") +set(LDFLAGS "-nostartfiles -Wl,--library-path=${RULESPATH},--script=${LDSCRIPT}${LDOPT}") + +# Thumb interwork enabled only if needed because it kills performance. +if(DEFINED TSRC) + set(CFLAGS "${CFLAGS}") + set(CPPFLAGS "${CPPFLAGS}") + set(ASFLAGS "${ASFLAGS}") + set(DEFS ${DEFS} -DTHUMB_PRESENT) + set(ADEFS ${ADEFS} -DTHUMB_PRESENT) + if(DEFINED ASRC) + # Mixed ARM and THUMB mode. + set(CFLAGS "${CFLAGS} -mthumb-interwork") + set(CPPFLAGS "${CPPFLAGS} -mthumb-interwork") + set(ASFLAGS "${ASFLAGS} -mthumb-interwork") + set(LDFLAGS "${LDFLAGS} -mthumb-interwork") + else() + # Pure THUMB mode, THUMB C code cannot be called by ARM asm code directly. + set(CFLAGS "${CFLAGS} -mno-thumb-interwork") + set(CPPFLAGS "${CPPFLAGS} -mno-thumb-interwork") + set(ASFLAGS "${ASFLAGS} -mno-thumb-interwork -mthumb") + set(LDFLAGS "${LDFLAGS} -mno-thumb-interwork -mthumb") + set(DEFS ${DEFS} -DTHUMB_NO_INTERWORKING) + set(ADEFS ${ADEFS} -DTHUMB_NO_INTERWORKING) + endif() +else() + # Pure ARM mode + set(CFLAGS "${CFLAGS} -mno-thumb-interwork") + set(CPPFLAGS "${CPPFLAGS} -mno-thumb-interwork") + set(ASFLAGS "${ASFLAGS} -mno-thumb-interwork") + set(LDFLAGS "${LDFLAGS} -mno-thumb-interwork") +endif() + +set(CMAKE_C_FLAGS "${CFLAGS} ${TOPT}") +set(CMAKE_CXX_FLAGS "${CPPFLAGS} ${TOPT}") +set(CMAKE_AS_FLAGS "${ASFLAGS} ${TOPT}") +set(CMAKE_EXE_LINKER_FLAGS "${LDFLAGS}") diff --git a/firmware/chibios/test/test.cmake b/firmware/chibios/test/test.cmake new file mode 100644 index 00000000..ddfa74e1 --- /dev/null +++ b/firmware/chibios/test/test.cmake @@ -0,0 +1,20 @@ +# List of all the ChibiOS/RT test files. +set(TESTSRC + ${CHIBIOS}/test/test.c + ${CHIBIOS}/test/testthd.c + ${CHIBIOS}/test/testsem.c + ${CHIBIOS}/test/testmtx.c + ${CHIBIOS}/test/testmsg.c + ${CHIBIOS}/test/testmbox.c + ${CHIBIOS}/test/testevt.c + ${CHIBIOS}/test/testheap.c + ${CHIBIOS}/test/testpools.c + ${CHIBIOS}/test/testdyn.c + ${CHIBIOS}/test/testqueues.c + ${CHIBIOS}/test/testbmk.c +) + +# Required include directories +set(TESTINC + ${CHIBIOS}/test +) diff --git a/firmware/common/cpld_max5.cpp b/firmware/common/cpld_max5.cpp index b6c4f6c5..f0c13d68 100644 --- a/firmware/common/cpld_max5.cpp +++ b/firmware/common/cpld_max5.cpp @@ -114,6 +114,13 @@ bool CPLD::verify( return block_0_success && block_1_success; } +uint32_t CPLD::crc() { + crc_t crc { 0x04c11db7, 0xffffffff, 0xffffffff }; + block_crc(0, 3328, crc); + block_crc(1, 512, crc); + return crc.checksum(); +} + void CPLD::sector_select(const uint16_t id) { shift_ir(0x203); // Sector select jtag.runtest_tck(93); // 5us @@ -219,6 +226,17 @@ bool CPLD::is_blank_block(const uint16_t id, const size_t count) { return success; } +void CPLD::block_crc(const uint16_t id, const size_t count, crc_t& crc) { + sector_select(id); + shift_ir(0x205); // Read + jtag.runtest_tck(93); // 5us + + for(size_t i=0; i #include @@ -75,6 +76,8 @@ public: bool is_blank(); + uint32_t crc(); + std::pair boundary_scan(); enum class Instruction { @@ -91,11 +94,6 @@ public: shift_ir(static_cast(instruction)); } - template - void shift_dr(std::bitset& bits) { - jtag.shift_dr(bits); - } - private: jtag::JTAG& jtag; @@ -135,6 +133,9 @@ private: bool is_blank_block(const uint16_t id, const size_t count); + using crc_t = CRC<32, true, true>; + void block_crc(const uint16_t id, const size_t count, crc_t& crc); + const uint32_t IDCODE = 0b00000010000010100101000011011101; const size_t IR_LENGTH = 10; diff --git a/firmware/common/cpld_xilinx.cpp b/firmware/common/cpld_xilinx.cpp new file mode 100644 index 00000000..4690f665 --- /dev/null +++ b/firmware/common/cpld_xilinx.cpp @@ -0,0 +1,179 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "cpld_xilinx.hpp" + +namespace cpld { +namespace xilinx { + +void XC2C64A::write_sram(const verify_blocks_t& blocks) { + tap.set_repeat(0); + tap.set_end_ir(state_t::run_test_idle); + tap.set_end_dr(state_t::run_test_idle); + + reset(); + enable(); + + shift_ir(instruction_t::ISC_WRITE); + for(const auto& block : blocks) { + tap.state(state_t::shift_dr); + tap.shift({ block.data.data(), block_length }, false); + tap.shift({ &block.id, block_id_length }, true); + tap.state(state_t::run_test_idle); + } + + disable(); + bypass(); + + tap.state(state_t::test_logic_reset); +} + +bool XC2C64A::verify_sram(const verify_blocks_t& blocks) { + tap.set_repeat(0); + tap.set_end_ir(state_t::run_test_idle); + tap.set_end_dr(state_t::run_test_idle); + + reset(); + enable(); + + shift_ir(instruction_t::ISC_SRAM_READ); + + // Prime the operation with a read of an empty row. + const jtag::tap::bits_t empty_row { block_length }; + + tap.state(state_t::shift_dr); + tap.shift(empty_row, false); + + auto error = false; + for(const auto& block : blocks) { + tap.shift({ &block.id, block_id_length }, true); + tap.state(state_t::run_test_idle); + + tap.state(state_t::shift_dr); + error |= tap.shift(empty_row, { block.data.data(), block_length }, { block.mask.data(), block_length }, false); + } + // Redundant operation to finish the row. + tap.shift({ &blocks[0].id, block_id_length }, true); + tap.state(state_t::run_test_idle); + tap.set_end_dr(state_t::run_test_idle); + + disable(); + bypass(); + + tap.state(state_t::test_logic_reset); + + return !error; +} + +bool XC2C64A::verify_eeprom(const verify_blocks_t& blocks) { + tap.set_repeat(0); + tap.set_end_ir(state_t::run_test_idle); + tap.set_end_dr(state_t::run_test_idle); + + reset(); + bypass(); + enable(); + + shift_ir(instruction_t::ISC_READ); + + const jtag::tap::bits_t empty_row { block_length }; + + auto error = false; + for(const auto& block : blocks) { + tap.set_end_dr(state_t::pause_dr); + tap.shift_dr({ &block.id, block_id_length }); + tap.set_end_ir(state_t::run_test_idle); + tap.wait(state_t::pause_dr, state_t::pause_dr, 20); + tap.set_end_ir(state_t::run_test_idle); + tap.wait(state_t::run_test_idle, state_t::run_test_idle, 100); + error |= tap.shift_dr(empty_row, { block.data.data(), block_length }, { block.mask.data(), block_length }); + tap.wait(state_t::run_test_idle, state_t::run_test_idle, 100); + } + + disable(); + bypass(); + + tap.state(state_t::test_logic_reset); + + return !error; +} + +void XC2C64A::init_from_eeprom() { + tap.set_repeat(0); + tap.set_end_ir(state_t::run_test_idle); + tap.set_end_dr(state_t::run_test_idle); + + reset(); + enable(); + + discharge(); + init(); + + disable(); + bypass(); + + tap.state(state_t::test_logic_reset); +} + +bool XC2C64A::shift_ir(const instruction_t instruction) { + const ir_t ir_buffer = toUType(instruction); + const jtag::tap::bits_t bits { &ir_buffer, ir_length }; + return tap.shift_ir(bits); +} + +void XC2C64A::reset() { + tap.state(state_t::test_logic_reset); + tap.state(state_t::run_test_idle); +} + +void XC2C64A::enable() { + shift_ir(instruction_t::ISC_ENABLE); + tap.wait(state_t::run_test_idle, state_t::run_test_idle, 800); +} + +void XC2C64A::enable_otf() { + shift_ir(instruction_t::ISC_ENABLE_OTF); +} + +void XC2C64A::discharge() { + shift_ir(instruction_t::ISC_INIT); + tap.wait(state_t::run_test_idle, state_t::run_test_idle, 20); +} + +void XC2C64A::init() { + tap.set_end_ir(state_t::update_ir); + shift_ir(instruction_t::ISC_INIT); + tap.set_end_ir(state_t::run_test_idle); + tap.state(state_t::capture_dr); + tap.wait(state_t::run_test_idle, state_t::run_test_idle, 800); +} + +void XC2C64A::disable() { + shift_ir(instruction_t::ISC_DISABLE); + tap.wait(state_t::run_test_idle, state_t::run_test_idle, 100); +} + +bool XC2C64A::bypass() { + return shift_ir(instruction_t::BYPASS); +} + +} /* namespace xilinx */ +} /* namespace cpld */ diff --git a/firmware/common/cpld_xilinx.hpp b/firmware/common/cpld_xilinx.hpp new file mode 100644 index 00000000..ce702042 --- /dev/null +++ b/firmware/common/cpld_xilinx.hpp @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __CPLD_XILINX_H__ +#define __CPLD_XILINX_H__ + +#include "jtag_tap.hpp" + +#include "utility.hpp" + +#include +#include +#include + +namespace cpld { +namespace xilinx { + +using jtag::tap::state_t; + +class XC2C64A { +public: + using block_id_t = uint8_t; + + static constexpr size_t block_length = 274; + static constexpr size_t blocks_count = 98; + + static constexpr size_t block_bytes = (block_length + 7) >> 3; + + struct verify_block_t { + block_id_t id; + std::array data; + std::array mask; + }; + + struct program_block_t { + block_id_t id; + std::array data; + }; + + using verify_blocks_t = std::array; + + constexpr XC2C64A( + jtag::Target& jtag_interface + ) : tap { jtag_interface } + { + } + + void write_sram(const verify_blocks_t& blocks); + bool verify_sram(const verify_blocks_t& blocks); + + bool verify_eeprom(const verify_blocks_t& blocks); + void init_from_eeprom(); + +private: + static constexpr size_t idcode_length = 32; + using idcode_t = uint32_t; + + static constexpr size_t ir_length = 8; + static constexpr size_t block_id_length = 7; + + static constexpr idcode_t idcode = 0x06e58093; + static constexpr idcode_t idcode_mask = 0x0fff8fff; + + using ir_t = uint8_t; + + jtag::tap::TAPMachine tap; + + enum class instruction_t : ir_t { + INTEST = 0b00000010, // -> boundary-scan + BYPASS = 0b11111111, // -> bypass + SAMPLE = 0b00000011, // -> boundary-scan + EXTEST = 0b00000000, // -> boundary-scan + IDCODE = 0b00000001, // -> device ID + USERCODE = 0b11111101, // -> device ID + HIGHZ = 0b11111100, // -> bypass + ISC_ENABLE_CLAMP = 0b11101001, // -> ISC shift + ISC_ENABLE_OTF = 0b11100100, // -> ISC shift + ISC_ENABLE = 0b11101000, // -> ISC shift + ISC_SRAM_READ = 0b11100111, // -> ISC shift + ISC_WRITE = 0b11100110, // -> ISC shift, alias ISC_SRAM_WRITE + ISC_ERASE = 0b11101101, // -> ISC shift + ISC_PROGRAM = 0b11101010, // -> ISC shift + ISC_READ = 0b11101110, // -> ISC shift, alias ISC_VERIFY + ISC_INIT = 0b11110000, // -> ISC shift + ISC_DISABLE = 0b11000000, // -> ISC shift + TEST_ENABLE = 0b00010001, // alias Private1 + BULKPROG = 0b00010010, // alias Private2 + ERASE_ALL = 0b00010100, // alias Private4 + MVERIFY = 0b00010011, // alias Private3 + TEST_DISABLE = 0b00010101, // alias Private5 + ISC_NOOP = 0b11100000, // -> bypass + }; + + bool shift_ir(const instruction_t instruction); + + void reset(); + void enable(); + void enable_otf(); + void discharge(); + void init(); + void disable(); + bool bypass(); +}; + +} /* namespace xilinx */ +} /* namespace cpld */ + +#endif/*__CPLD_XILINX_H__*/ diff --git a/firmware/common/crc.hpp b/firmware/common/crc.hpp index cc56597c..fab78a6b 100644 --- a/firmware/common/crc.hpp +++ b/firmware/common/crc.hpp @@ -78,27 +78,15 @@ public: } void process_bits(value_type bits, size_t bit_count) { - constexpr auto digits = std::numeric_limits::digits; - constexpr auto mask = static_cast(1) << (digits - 1); - - bits <<= (std::numeric_limits::digits - bit_count); - for(size_t i=bit_count; i>0; --i, bits <<= 1) { - process_bit(static_cast(bits & mask)); - } - } - - void process_bits_lsb_first(value_type bits, size_t bit_count) { - for(size_t i=bit_count; i>0; --i, bits >>= 1) { - process_bit(static_cast(bits & 0x01)); + if( RevIn ) { + process_bits_lsb_first(bits, bit_count); + } else { + process_bits_msb_first(bits, bit_count); } } void process_byte(const uint8_t byte) { - if( RevIn ) { - process_bits_lsb_first(byte, 8); - } else { - process_bits(byte, 8); - } + process_bits(byte, 8); } void process_bytes(const void* const data, const size_t length) { @@ -147,6 +135,22 @@ private: } return reflection; } + + void process_bits_msb_first(value_type bits, size_t bit_count) { + constexpr auto digits = std::numeric_limits::digits; + constexpr auto mask = static_cast(1) << (digits - 1); + + bits <<= (std::numeric_limits::digits - bit_count); + for(size_t i=bit_count; i>0; --i, bits <<= 1) { + process_bit(static_cast(bits & mask)); + } + } + + void process_bits_lsb_first(value_type bits, size_t bit_count) { + for(size_t i=bit_count; i>0; --i, bits >>= 1) { + process_bit(static_cast(bits & 0x01)); + } + } }; class Adler32 { diff --git a/firmware/common/debug.cpp b/firmware/common/debug.cpp index 886abeaf..218bf236 100644 --- a/firmware/common/debug.cpp +++ b/firmware/common/debug.cpp @@ -24,6 +24,8 @@ #include #include +#include "portapack_shared_memory.hpp" + #if defined(LPC43XX_M0) static void debug_indicate_error_init() { // TODO: Get knowledge of LED GPIO port/bit from shared place. @@ -75,6 +77,16 @@ void __early_init(void) { } void port_halt(void) { + // Copy debug panic message to M0 region. + const auto* p = dbg_panic_msg; + for(size_t i=0; i gpios_baseband_decimation { }; constexpr GPIO gpio_baseband_q_invert = gpio[GPIO0_13]; +constexpr GPIO gpio_cpld_tdo = gpio[GPIO5_18]; +constexpr GPIO gpio_cpld_tck = gpio[GPIO3_0]; +constexpr GPIO gpio_cpld_tms = gpio[GPIO3_4]; +constexpr GPIO gpio_cpld_tdi = gpio[GPIO3_1]; + /* LEDs */ constexpr LED led_usb { gpio_led_usb }; diff --git a/firmware/common/jtag.hpp b/firmware/common/jtag.hpp index 67677f19..d0f72035 100644 --- a/firmware/common/jtag.hpp +++ b/firmware/common/jtag.hpp @@ -22,6 +22,8 @@ #ifndef __JTAG_H__ #define __JTAG_H__ +#include "jtag_target.hpp" + #include #include @@ -29,20 +31,6 @@ namespace jtag { -class Target { -public: - using bit_t = uint_fast8_t; - - virtual ~Target() { - } - - virtual void delay(const size_t n) = 0; - virtual jtag::Target::bit_t clock( - const jtag::Target::bit_t tms_value, - const jtag::Target::bit_t tdi_value - ) = 0; -}; - class JTAG { public: constexpr JTAG( @@ -102,27 +90,6 @@ public: return result; } - template - void shift_dr(std::bitset& bits) { - /* Run-Test/Idle -> Select-DR-Scan */ - target.clock(1, 0); - /* Scan -> Capture -> Shift */ - target.clock(0, 0); - target.clock(0, 0); - - for(size_t i=0; i Update */ - target.clock(1, 0); - /* Update -> Run-Test/Idle */ - target.clock(0, 0); - } - private: Target& target; diff --git a/firmware/common/jtag_tap.cpp b/firmware/common/jtag_tap.cpp new file mode 100644 index 00000000..57541b85 --- /dev/null +++ b/firmware/common/jtag_tap.cpp @@ -0,0 +1,266 @@ +/* + * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#include "jtag_tap.hpp" + +#include "utility.hpp" + +#include + +namespace jtag { +namespace tap { + +size_t bits_t::length() const { + return count; +} + +bits_t::operator bool() const { + return (count > 0); +} + +bool bits_t::operator[](const size_t index) const { + if( p && (index < count) ) { + const auto n = bytes() * 8 - index - 1; + const auto byte = n >> 3; + const auto bit = (n ^ 7) & 7; + return (p[byte] >> bit) & 1; + } else { + return default_value; + } +} + +size_t bits_t::bytes() const { + return (count + 7) >> 3; +} + +#if JTAG_TAP_DEBUG +static char nibble_to_hex_char(const uint8_t v) { + if( v < 0xa ) { + return 0x30 + v; + } else { + return 0x57 + v; + } +} + +std::string to_string(const bits_t& bits) { + std::string s { std::to_string(bits.length()) + "/0x" }; + for(size_t i=0; i> 4) & 0xf); + s += nibble_to_hex_char((bits.p[i] >> 0) & 0xf); + } + return s; +} +#endif + +namespace { + +using route_t = uint16_t; + +struct entry_t { + state_t tms[2]; + route_t route; +}; +static_assert(sizeof(entry_t) == 4, "Unexpected size of entry_t"); + +using table_t = std::array; +static_assert(sizeof(table_t) == (16 * 4), "Unexpected size of table_t"); + +const table_t table { { + { state_t::run_test_idle, state_t::test_logic_reset, 0b0000000000000001 }, // test_logic_reset test_logic_reset => 1, others => 0 + { state_t::run_test_idle, state_t::select_dr_scan, 0b1111111111111101 }, // run_test_idle run_test_idle => 0, others => 1 + { state_t::capture_dr, state_t::select_ir_scan, 0b1111111000000001 }, // select_dr_scan run_test_idle..update_dr => 0, others => 1 + { state_t::shift_dr, state_t::exit1_dr, 0b1111111111101111 }, // capture_dr shift_dr => 0, others => 1 + { state_t::shift_dr, state_t::exit1_dr, 0b1111111111101111 }, // shift_dr shift_dr => 0, others => 1 + { state_t::pause_dr, state_t::update_dr, 0b1111111100111111 }, // exit1_dr pause_dr, exit2_dr => 0, others => 1 + { state_t::pause_dr, state_t::exit2_dr, 0b1111111110111111 }, // pause_dr pause_dr => 0, others => 1 + { state_t::shift_dr, state_t::update_dr, 0b1111111111101111 }, // exit2_dr shift_dr => 0, others => 1 + { state_t::run_test_idle, state_t::select_dr_scan, 0b1111111111111101 }, // update_dr run_test_idle => 0, others => 1 + { state_t::capture_ir, state_t::test_logic_reset, 0b0000000000000001 }, // select_ir_scan test_logic_reset => 1, others => 0 + { state_t::shift_ir, state_t::exit1_ir, 0b1111011111111111 }, // capture_ir shift_ir => 0, others => 1 + { state_t::shift_ir, state_t::exit1_ir, 0b1111011111111111 }, // shift_ir shift_ir => 0, others => 1 + { state_t::pause_ir, state_t::update_ir, 0b1001111111111111 }, // exit1_ir pause_ir, exit2_ir => 0, others => 1 + { state_t::pause_ir, state_t::exit2_ir, 0b1101111111111111 }, // pause_ir pause_ir => 0, others => 1 + { state_t::shift_ir, state_t::update_ir, 0b1111011111111111 }, // exit2_ir shift_ir => 0, others => 1 + { state_t::run_test_idle, state_t::select_dr_scan, 0b1111111111111101 }, // update_ir run_test_idle => 0, others => 1 +} }; + +const std::array state_name { { + "test_logic_reset", + "run_test_idle", + "select_dr_scan", + "capture_dr", + "shift_dr", + "exit1_dr", + "pause_dr", + "exit2_dr", + "update_dr", + "select_ir_scan", + "capture_ir", + "shift_ir", + "exit1_ir", + "pause_ir", + "exit2_ir", + "update_ir", +} }; + +const std::array state_long_name { { + "Test-Logic-Reset", + "Run-Test/Idle", + "Select-DR-Scan", + "Capture-DR", + "Shift-DR", + "Exit1-DR", + "Pause-DR", + "Exit2-DR", + "Update-DR", + "Select-IR-Scan", + "Capture-IR", + "Shift-IR", + "Exit1-IR", + "Pause-IR", + "Exit2-IR", + "Update-IR", +} }; + +const entry_t& entry(const state_t state) { + return table[toUType(state)]; +} + +} /* namespace */ + +const char* c_str(const state_t state) { + return state_name[toUType(state)]; +} + +/* TAPState **************************************************************/ + +state_t TAPState::state() const { + return _state; +} + +void TAPState::advance(const bool tms) { + _state = entry(_state).tms[tms]; +} + +bool TAPState::advance_toward(const state_t desired_state) const { + return (entry(_state).route >> toUType(desired_state)) & 1; +} + +/* TAPMachine ************************************************************/ + +void TAPMachine::set_run_test(const uint32_t value) { + _run_test = value; +} + +void TAPMachine::set_repeat(const uint8_t value) { + _repeat = value; +} + +void TAPMachine::set_end_ir(const state_t state) { + _end_ir = state; +} + +void TAPMachine::set_end_dr(const state_t state) { + _end_dr = state; +} + +bool TAPMachine::shift_ir(const bits_t& tdi_value, const bits_t& tdo_expected, const bits_t& tdo_mask) { + return shift_data(tdi_value, tdo_expected, tdo_mask, state_t::shift_ir, _end_ir, _run_test); +} + +bool TAPMachine::shift_dr(const bits_t& tdi_value, const bits_t& tdo_expected, const bits_t& tdo_mask) { + return shift_data(tdi_value, tdo_expected, tdo_mask, state_t::shift_dr, _end_dr, _run_test); +} + +void TAPMachine::state(const state_t state) { + if( state == state_t::test_logic_reset ) { + for(int i=0; i<5; i++) { + clock(1); + } + } else { + advance_to_state(state); + } +} + +void TAPMachine::wait(const state_t wait_state, const state_t end_state, const uint32_t wait_time) { + advance_to_state(wait_state); + delay_us(wait_time); + advance_to_state(end_state); +} + +bool TAPMachine::clock(const bool tms, const bool tdi) { + tap.advance(tms); + return target.clock(tms, tdi); +} + +void TAPMachine::advance_to_state(const state_t desired_state) { + while( tap.state() != desired_state ) { + const auto tms = tap.advance_toward(desired_state); + clock(tms); + } +} + +void TAPMachine::delay_us(const uint32_t microseconds) { + target.delay(microseconds); +} + +void TAPMachine::shift_start(const state_t state) { + advance_to_state(state); +} + +bool TAPMachine::shift(const bits_t& tdi, const bits_t& tdo_expected, const bits_t& tdo_mask, const bool end_tms) { + if( tdo_expected.length() != tdo_mask.length() ) { + return false; + } + if( tdo_expected && (tdi.length() != tdo_expected.length()) ) { + return false; + } + + auto tdo_error = false; + for(uint32_t i=0; i +#include + +namespace jtag { +namespace tap { + +class bits_t { +public: + constexpr bits_t( + ) : p { nullptr }, + count { 0 } + { + } + + constexpr bits_t( + const size_t count, + const bool default_value = true + ) : p { nullptr }, + count { count }, + default_value { default_value } + { + } + + constexpr bits_t( + const uint8_t* const p, + const size_t count + ) : p { p }, + count { count } + { + } + + size_t length() const; + + explicit operator bool() const; + + bool operator[](const size_t index) const; + +private: + const uint8_t* p { nullptr }; + size_t count { 0 }; + bool default_value { false }; + + size_t bytes() const; +}; + +enum class state_t : uint8_t { + /* Ordinal values are important for "routes" values, and to match XSVF definitions. */ + test_logic_reset = 0, + run_test_idle = 1, + select_dr_scan = 2, + capture_dr = 3, + shift_dr = 4, + exit1_dr = 5, + pause_dr = 6, + exit2_dr = 7, + update_dr = 8, + select_ir_scan = 9, + capture_ir = 10, + shift_ir = 11, + exit1_ir = 12, + pause_ir = 13, + exit2_ir = 14, + update_ir = 15, +}; + +class TAPState { +public: + constexpr TAPState( + ) : _state { state_t::test_logic_reset } + { + } + + state_t state() const; + void advance(const bool tms); + bool advance_toward(const state_t desired_state) const; + +private: + state_t _state; +}; + +class TAPMachine { +public: + constexpr TAPMachine( + jtag::Target& target + ) : target { target } + { + } + + void set_run_test(const uint32_t value); + void set_repeat(const uint8_t value); + void set_end_ir(const state_t state); + void set_end_dr(const state_t state); + + bool shift(const bits_t& tdi, const bool end_tms) { + return shift(tdi, {}, {}, end_tms); + } + + bool shift(const bits_t& tdi, const bits_t& tdo_expected, const bits_t& tdo_mask, const bool end_tms); + + bool shift_ir(const bits_t& tdi_value, const bits_t& tdo_expected = {}, const bits_t& tdo_mask = {}); + bool shift_dr(const bits_t& tdi_value, const bits_t& tdo_expected = {}, const bits_t& tdo_mask = {}); + + void state(const state_t state); + + void wait(const state_t wait_state, const state_t end_state, const uint32_t wait_time); + +private: + jtag::Target& target; + TAPState tap { }; + + uint32_t _run_test { 0 }; + uint8_t _repeat { 0 }; + state_t _end_ir { }; + state_t _end_dr { }; + + bool clock(const bool tms, const bool tdi=false); + void advance_to_state(const state_t desired_state); + void delay_us(const uint32_t microseconds); + + void shift_start(const state_t state); + void shift_end(const state_t end_state, const uint32_t end_delay); + + bool shift_data(const bits_t& tdi, const bits_t& tdo_expected, const bits_t& tdo_mask, const state_t state, const state_t end_state, const uint32_t end_delay); +}; + +} /* namespace tap */ +} /* namespace jtag */ + +#endif/*__JTAG_TAP_H__*/ diff --git a/firmware/common/jtag_target.hpp b/firmware/common/jtag_target.hpp new file mode 100644 index 00000000..455ae281 --- /dev/null +++ b/firmware/common/jtag_target.hpp @@ -0,0 +1,46 @@ +/* + * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * + * This file is part of PortaPack. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __JTAG_TARGET_H__ +#define __JTAG_TARGET_H__ + +#include +#include + +namespace jtag { + +class Target { +public: + using bit_t = uint_fast8_t; + + virtual ~Target() { + } + + virtual void delay(const size_t n) = 0; + virtual bit_t clock( + const bit_t tms_value, + const bit_t tdi_value + ) = 0; +}; + +} /* namespace jtag */ + +#endif/*__JTAG_TARGET_H__*/ diff --git a/firmware/common/jtag_target_gpio.hpp b/firmware/common/jtag_target_gpio.hpp index 0b26a6f5..180f4d04 100644 --- a/firmware/common/jtag_target_gpio.hpp +++ b/firmware/common/jtag_target_gpio.hpp @@ -22,7 +22,7 @@ #ifndef __JTAG_TARGET_GPIO_H__ #define __JTAG_TARGET_GPIO_H__ -#include "jtag.hpp" +#include "jtag_target.hpp" #include diff --git a/firmware/common/manchester.cpp b/firmware/common/manchester.cpp index 3862facc..15196191 100644 --- a/firmware/common/manchester.cpp +++ b/firmware/common/manchester.cpp @@ -23,7 +23,7 @@ #include "string_format.hpp" -ManchesterDecoder::DecodedSymbol ManchesterDecoder::operator[](const size_t index) const { +DecodedSymbol ManchesterDecoder::operator[](const size_t index) const { const size_t encoded_index = index * 2; if( (encoded_index + 1) < packet.size() ) { const auto value = packet[encoded_index + sense]; @@ -38,7 +38,7 @@ size_t ManchesterDecoder::symbols_count() const { return packet.size() / 2; } -ManchesterFormatted format_manchester( +FormattedSymbols format_symbols( const ManchesterDecoder& decoder ) { const size_t payload_length_decoded = decoder.symbols_count(); diff --git a/firmware/common/manchester.hpp b/firmware/common/manchester.hpp index 50cae73f..6a2376a9 100644 --- a/firmware/common/manchester.hpp +++ b/firmware/common/manchester.hpp @@ -29,13 +29,13 @@ #include "baseband_packet.hpp" +struct DecodedSymbol { + uint_fast8_t value; + uint_fast8_t error; +}; + class ManchesterDecoder { public: - struct DecodedSymbol { - uint_fast8_t value; - uint_fast8_t error; - }; - constexpr ManchesterDecoder( const baseband::Packet& packet, const size_t sense = 0 @@ -54,16 +54,16 @@ private: }; template -T operator|(const T& l, const ManchesterDecoder::DecodedSymbol& r) { +T operator|(const T& l, const DecodedSymbol& r) { return l | r.value; } -struct ManchesterFormatted { +struct FormattedSymbols { const std::string data; const std::string errors; }; -ManchesterFormatted format_manchester( +FormattedSymbols format_symbols( const ManchesterDecoder& decoder ); diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index 92a7041c..7850b5d1 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -50,7 +51,6 @@ public: ChannelStatistics = 2, DisplayFrameSync = 3, AudioStatistics = 4, - BasebandConfiguration = 5, TPMSPacket = 6, Shutdown = 8, AISPacket = 7, @@ -63,7 +63,8 @@ public: SpectrumStreamingConfig = 15, DisplaySleep = 16, CaptureConfig = 17, - + CaptureThreadDone = 18, + TXDone = 20, Retune = 21, ReadyForSwitch = 22, @@ -198,65 +199,21 @@ public: AudioStatistics statistics; }; -struct BasebandConfiguration { - int32_t mode; - uint32_t sampling_rate; - size_t decimation_factor; - - constexpr BasebandConfiguration( - int32_t mode, - uint32_t sampling_rate, - size_t decimation_factor = 1 - ) : mode { mode }, - sampling_rate { sampling_rate }, - decimation_factor { decimation_factor } - { - } - - constexpr BasebandConfiguration( - ) : BasebandConfiguration { -1, 0, 1 } - { - } -}; - -class BasebandConfigurationMessage : public Message { -public: - constexpr BasebandConfigurationMessage( - const BasebandConfiguration& configuration - ) : Message { ID::BasebandConfiguration }, - configuration { configuration } - { - } - - BasebandConfiguration configuration; -}; - class SpectrumStreamingConfigMessage : public Message { public: enum class Mode : uint32_t { Stopped = 0, Running = 1, }; - + constexpr SpectrumStreamingConfigMessage( Mode mode ) : Message { ID::SpectrumStreamingConfig }, - mode { mode }, - decimation_factor { 1 } - { - } - - constexpr SpectrumStreamingConfigMessage( - Mode mode, - size_t decimation_factor - ) : Message { ID::SpectrumStreamingConfig }, - mode { mode }, - decimation_factor { decimation_factor } + mode { mode } { } Mode mode { Mode::Stopped }; - size_t decimation_factor = 1; }; struct ChannelSpectrum { @@ -430,21 +387,63 @@ public: const iir_biquad_config_t audio_hpf_config; }; +// TODO: Put this somewhere else, or at least the implementation part. +class StreamBuffer { + uint8_t* data_; + size_t used_; + size_t capacity_; + +public: + constexpr StreamBuffer( + void* const data = nullptr, + const size_t capacity = 0 + ) : data_ { static_cast(data) }, + used_ { 0 }, + capacity_ { capacity } + { + } + + size_t write(const void* p, const size_t count) { + const auto copy_size = std::min(capacity_ - used_, count); + memcpy(&data_[used_], p, copy_size); + used_ += copy_size; + return copy_size; + } + + bool is_full() const { + return used_ >= capacity_; + } + + const void* data() const { + return data_; + } + + size_t size() const { + return used_; + } + + void empty() { + used_ = 0; + } +}; + struct CaptureConfig { - const size_t write_size_log2; - const size_t buffer_count_log2; + const size_t write_size; + const size_t buffer_count; uint64_t baseband_bytes_received; uint64_t baseband_bytes_dropped; - FIFO* fifo; + FIFO* fifo_buffers_empty; + FIFO* fifo_buffers_full; constexpr CaptureConfig( - const size_t write_size_log2, - const size_t buffer_count_log2 - ) : write_size_log2 { write_size_log2 }, - buffer_count_log2 { buffer_count_log2 }, + const size_t write_size, + const size_t buffer_count + ) : write_size { write_size }, + buffer_count { buffer_count }, baseband_bytes_received { 0 }, baseband_bytes_dropped { 0 }, - fifo { nullptr } + fifo_buffers_empty { nullptr }, + fifo_buffers_full { nullptr } { } @@ -539,33 +538,16 @@ public: int8_t * data; }; -class MessageHandlerMap { +class CaptureThreadDoneMessage : public Message { public: - using MessageHandler = std::function; - - void register_handler(const Message::ID id, MessageHandler&& handler) { - if( map_[toUType(id)] != nullptr ) { - chDbgPanic("MsgDblReg"); - } - map_[toUType(id)] = std::move(handler); + constexpr CaptureThreadDoneMessage( + uint32_t error = 0 + ) : Message { ID::CaptureThreadDone }, + error { error } + { } - void unregister_handler(const Message::ID id) { - map_[toUType(id)] = nullptr; - } - - void send(Message* const message) { - if( message->id < Message::ID::MAX ) { - auto& fn = map_[toUType(message->id)]; - if( fn ) { - fn(message); - } - } - } - -private: - using MapType = std::array; - MapType map_; + uint32_t error; }; #endif/*__MESSAGE_H__*/ diff --git a/firmware/common/message_queue.hpp b/firmware/common/message_queue.hpp index 3e0a1cbb..84bbaa9c 100644 --- a/firmware/common/message_queue.hpp +++ b/firmware/common/message_queue.hpp @@ -74,6 +74,10 @@ public: return fifo.is_empty(); } + void reset() { + fifo.reset(); + } + private: FIFO fifo; Mutex mutex_write; diff --git a/firmware/common/png_writer.cpp b/firmware/common/png_writer.cpp index c1d59244..e1667f14 100644 --- a/firmware/common/png_writer.cpp +++ b/firmware/common/png_writer.cpp @@ -49,10 +49,14 @@ static constexpr std::array png_iend { { 0xae, 0x42, 0x60, 0x82, // CRC } }; -PNGWriter::PNGWriter( +Optional PNGWriter::create( const std::string& filename -) : file { filename, File::openmode::out | File::openmode::binary | File::openmode::trunc } -{ +) { + const auto create_error = file.create(filename); + if( create_error.is_valid() ) { + return create_error; + } + file.write(png_file_header); file.write(png_ihdr_screen_capture); @@ -63,6 +67,8 @@ PNGWriter::PNGWriter( constexpr std::array zlib_header { 0x78, 0x01 }; // Zlib CM, CINFO, FLG. write_chunk_content(zlib_header); + + return { }; } PNGWriter::~PNGWriter() { diff --git a/firmware/common/png_writer.hpp b/firmware/common/png_writer.hpp index 90fc2086..37bede47 100644 --- a/firmware/common/png_writer.hpp +++ b/firmware/common/png_writer.hpp @@ -33,9 +33,10 @@ class PNGWriter { public: - explicit PNGWriter(const std::string& filename); ~PNGWriter(); + Optional create(const std::string& filename); + void write_scanline(const std::array& scanline); private: diff --git a/firmware/common/portapack_cpld_data.cpp b/firmware/common/portapack_cpld_data.cpp deleted file mode 100644 index 08697da0..00000000 --- a/firmware/common/portapack_cpld_data.cpp +++ /dev/null @@ -1,519 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * - * This file is part of PortaPack. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, - * Boston, MA 02110-1301, USA. - */ - -#include "portapack_cpld_data.hpp" - -#include -#include - -namespace portapack { -namespace cpld { - -/* 2015 Aug 21 12:12 PT */ - -const std::array block_0 { { - 0x7fff, 0xffff, 0xbffc, 0xf9e7, 0x79ff, 0xfffe, 0xaf9e, 0x7cff, - 0x7fff, 0xfbe7, 0xb3f7, 0xffff, 0x7f3f, 0x7dfb, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbff7, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x67ff, 0xffff, 0xbfff, 0xfefd, 0x7fff, 0xff7f, 0xbfff, 0xe7f9, - 0x723f, 0xfff9, 0xb77f, 0xcccf, 0x7fff, 0xb99f, 0xbccc, 0xcffe, - 0x6fff, 0xffff, 0xbfff, 0xffeb, 0x77f3, 0xffff, 0xbfe6, 0xffff, - 0x7bff, 0xffff, 0xbfff, 0xffff, 0x7fbf, 0xffff, 0xbfff, 0xfbfe, - 0x7fff, 0xffff, 0xbfff, 0xfffe, 0x6fff, 0xffff, 0xbfef, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffe, - 0x6fff, 0xffff, 0xbfff, 0xffdb, 0x7fff, 0xffff, 0xbff7, 0xffff, - 0x7dff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ff5, 0xffff, 0xbffd, 0xffff, - 0x7eff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x6fff, 0xffff, 0xbfff, 0xfdbb, 0x77ef, 0xbfff, 0xbfff, 0xf7ff, - 0x7eef, 0xefff, 0xbfff, 0xffff, 0x7dff, 0xffff, 0xbfff, 0xffff, - 0x7bff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbffd, 0xffff, - 0x7dff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xff7f, 0x77ff, 0xffff, 0xbfff, 0xf7ff, - 0x7dff, 0xefff, 0xbfff, 0xffff, 0x7dff, 0xffff, 0xbfff, 0xfffe, - 0x7fff, 0xffff, 0xbfff, 0xfef7, 0x7ff7, 0xbfff, 0xbffd, 0xffff, - 0x7ef7, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffe, - 0x6fff, 0xffff, 0xbffe, 0xffdf, 0x7fff, 0xffbf, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xb7ff, 0xffff, 0x7eff, 0xffff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfeff, - 0x7fff, 0xffff, 0xb5fd, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xadff, 0xffbf, 0x7ffe, 0xffff, 0xbfef, 0xff5f, - 0x7fff, 0xffff, 0xbfff, 0xffef, 0x7fff, 0xffdf, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7dff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7ff7, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xf6ff, 0xbbcb, 0xffff, - 0x77ff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7ff7, 0xffdf, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xfaff, 0xbfd5, 0xffff, - 0x77ff, 0xffff, 0xa55f, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fdf, 0xdeef, 0xbfff, 0xfdff, - 0x7fff, 0xffff, 0xafff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ffd, 0xffff, 0xbffb, 0xffeb, - 0x6bff, 0xffff, 0xb55f, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbdff, 0xdff5, - 0x77ff, 0xffff, 0xbabf, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ffb, 0xf9bf, 0xbafe, 0xefff, - 0x6fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ffe, 0xffde, 0xbfdf, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ff7, 0xdfff, 0xbffd, 0x35ff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fd2, 0xffff, 0xbfbc, 0xc7ff, - 0x7fff, 0xffff, 0xb7af, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xddee, 0xb9ff, 0xbdff, - 0x7bff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ffd, 0xea9f, 0xbefb, 0x7bff, - 0x7fff, 0xffff, 0xbeaf, 0xffff, 0x7fdf, 0xffff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0x7fff, 0x7ffd, 0x0ddf, 0xb598, 0x5e74, - 0x7fff, 0xffff, 0xb65f, 0xffff, 0x7fbf, 0xffff, 0xbfff, 0xffdf, - 0x7fff, 0xffff, 0xbffe, 0xffff, 0x7ffc, 0x0ddd, 0xbd99, 0x1e6a, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7f08, 0x388f, 0xb89e, 0x887f, - 0x7bff, 0xffff, 0xb6f7, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7f0c, 0x388f, 0xb89f, 0x983b, - 0x67ff, 0xffff, 0xbfff, 0x3333, 0x63e6, 0x6667, 0xb333, 0x31f3, - 0x6666, 0x7ccc, 0xb98f, 0x9999, 0x73e8, 0xc445, 0xb938, 0x88ff, - 0x7fff, 0xffff, 0xb7ff, 0x7777, 0x6957, 0x7777, 0xb777, 0x74ab, - 0x7777, 0x7ddd, 0xbba5, 0x5ddd, 0x7bcd, 0xdcca, 0xb19d, 0xddfb, - 0x7bff, 0xffff, 0xbdf7, 0xffff, 0x7fdf, 0xffff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0x7fff, 0x7fff, 0xe66f, 0xb37f, 0xffde, - 0x7fff, 0xffff, 0xbffe, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffd, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7feb, 0xeedf, 0xbfdf, 0xfcff, - 0x7fff, 0xffff, 0xbfff, 0xeeee, 0x7ffb, 0xfbbf, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7dfd, 0xffff, 0xbffd, 0xdfff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffd, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ffa, 0xefdf, 0xbfff, 0xdfff, - 0x7fff, 0xffff, 0xbbfe, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fef, 0xfeff, 0xbfdd, 0xfd7a, - 0x77ff, 0xffff, 0xbebe, 0xfff7, 0x7fff, 0xfb7f, 0xbf9f, 0xefff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfef, 0xfffb, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbaff, 0xfffd, - 0x7fff, 0xfdff, 0xbfff, 0xdfde, 0x7ffb, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xb7fd, 0xfff7, 0x7fff, 0xfdfb, 0xb7ff, 0xdfff, - 0x7fff, 0xedff, 0xbfff, 0xffff, 0x7ffe, 0xffff, 0xbff3, 0xbbf7, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xff7f, 0xbeaf, 0xfffe, - 0x7fff, 0xffff, 0xbfff, 0xbfbe, 0x7ffb, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbdee, 0xb7f7, 0x7fff, 0xfbef, 0xbfff, 0xffff, - 0x7fff, 0xfbfe, 0xbfff, 0xfedf, 0x6dff, 0xffff, 0xbfff, 0xffdf, - 0x7fff, 0xffff, 0xb7ff, 0xefdf, 0x7fef, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xfff7, 0xadbf, 0xffef, 0x7fff, 0xffff, 0xbfff, 0xfffb, - 0x7fff, 0xffff, 0xbffd, 0xdfff, 0x7ff7, 0xfdff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffd7, 0x6eff, 0xffff, 0xbfff, 0xffdf, - 0x7fff, 0xffff, 0xbadf, 0x7bd7, 0x7fff, 0xffef, 0xbfff, 0xffff, - 0x7fff, 0xfbf9, 0xb3ff, 0xfeff, 0x7fff, 0xffff, 0xbfff, 0xfffb, - 0x7fff, 0xffff, 0xbe5f, 0xff77, 0x7fff, 0xfefd, 0xbfff, 0xffff, - 0x7fff, 0xfeee, 0xbfbf, 0xfb3b, 0x77ff, 0xffff, 0xbfff, 0xffea, - 0x7fff, 0xffff, 0xbbff, 0xffff, 0x6fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xd7ff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7bff, 0xffff, 0xbbaf, 0xffff, 0x7ff7, 0x7fff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbbff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfff4, - 0x7fff, 0xffff, 0xbdaf, 0x7bff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xf7ba, 0xb37f, 0xeeff, 0x6fff, 0xffff, 0xbfff, 0xffff, - 0x7bff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xfeff, 0xbfbf, 0xfff3, 0x7eff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7f7f, 0xf7ff, 0xbfff, 0xffff, - 0x7fff, 0xf76f, 0xbfff, 0xffb7, 0x6eff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xff7f, 0x7fff, 0xfffd, 0xbfff, 0xffff, - 0x7fff, 0xfcde, 0xbdbf, 0xdf8d, 0x7aff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xb5af, 0xbfff, 0x6ff7, 0x6f7f, 0xbfff, 0xffff, - 0x7fff, 0xfbad, 0xbfdf, 0xf77b, 0x7fff, 0xffff, 0xbfff, 0xffee, - 0x77ff, 0xffff, 0xbfff, 0xfbf7, 0x7f7f, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xf77b, 0xb37f, 0xecf6, 0x6dff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfaf, 0x3000, 0x67c0, 0x061f, 0xbfff, 0xffef, - 0x7fff, 0xfccd, 0xbbb7, 0x7f99, 0x7cff, 0xffff, 0xb7ff, 0xfff5, - 0x6bff, 0xffff, 0xb7ff, 0x3000, 0x66e0, 0x0601, 0xbfff, 0xffdf, - 0x7fff, 0xfccd, 0xbbbe, 0xd519, 0x7cff, 0xffff, 0xafff, 0xffff, - 0x7dff, 0xffff, 0xbd5f, 0x3000, 0x67e0, 0x061f, 0xbfff, 0xffff, - 0x7fff, 0xfcc8, 0xb11f, 0xcc99, 0x78ff, 0xffff, 0xbfff, 0xfff5, - 0x6bff, 0xffff, 0xbbff, 0x3000, 0x67e0, 0x0601, 0xbfff, 0xffff, - 0x7fff, 0xf698, 0xb11f, 0x8033, 0x6eff, 0xffff, 0xbfff, 0xffff, - 0x77ff, 0xffff, 0xbff7, 0xbbbb, 0x73ee, 0x6ee7, 0xb333, 0x31f3, - 0x6666, 0x78c6, 0xaccf, 0xb318, 0x7bcc, 0xccc7, 0xb999, 0x99ff, - 0x7fff, 0xffff, 0xb7ff, 0x3333, 0x6546, 0x6667, 0xb777, 0x74ab, - 0x7777, 0x7d9c, 0xb995, 0x19cd, 0x79dd, 0xddd2, 0xb5dd, 0xddff, - 0x7bff, 0xffff, 0xbffb, 0xfddd, 0x7fdd, 0xdfdf, 0xbfff, 0xffef, - 0x7fff, 0xfff6, 0xacff, 0x337f, 0x7fff, 0xffff, 0xb7ff, 0xffff, - 0x7fff, 0xffff, 0xbffd, 0x5fff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbbdf, 0xddff, 0x7bbf, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xfddf, 0xbfff, 0xffdd, 0x6fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbffe, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfbf, 0xffdd, 0x6fff, 0xffff, 0xbfff, 0xffff, - 0x7dff, 0xffff, 0xbbff, 0x5fff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xfedf, 0xbbff, 0xbdff, 0x77bf, 0xffff, 0xbfff, 0xffef, - 0x7dff, 0xffff, 0xbfbf, 0xffef, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7ffd, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ffb, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7ff7, 0xffbf, 0xbfff, 0xfdff, - 0x7fff, 0xffff, 0xbff7, 0xffdf, 0x7ffe, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xeeff, 0xbfff, 0xffff, 0x7ff7, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ffd, 0xffff, 0xbfff, 0xffff, - 0x7ffd, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffbf, 0xbfff, 0xfdff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffd, - 0x7bff, 0xffff, 0xb77f, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfbf, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffd, - 0x79ff, 0xffff, 0xb7bf, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x75ff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbebf, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffe, - 0x77ff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xa59f, 0xffff, 0x7fdf, 0xffff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0x7fff, 0x7fff, 0xffff, 0xb7ff, 0xfff5, - 0x69ff, 0xffff, 0xab7f, 0xffff, 0x7fbf, 0xffff, 0xbfff, 0xffdf, - 0x7fff, 0xffff, 0xbffe, 0xffff, 0x7fff, 0xffff, 0xafff, 0xffff, - 0x7dff, 0xffff, 0xbddf, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfff5, - 0x6bff, 0xffff, 0xbabf, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0x3333, 0x63e6, 0x6667, 0xb333, 0x31f3, - 0x6666, 0x7ccc, 0xb98f, 0x9999, 0x73cc, 0xccc7, 0xb999, 0x99ff, - 0x7fff, 0xffff, 0xb7bf, 0x7777, 0x6957, 0x7777, 0xb777, 0x74ab, - 0x7777, 0x7ddd, 0xbba5, 0x5ddd, 0x7bdd, 0xddd2, 0xb5dd, 0xddff, - 0x7fff, 0xffff, 0xbdff, 0xffff, 0x7fdf, 0xffff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0x7fff, 0x7fff, 0xffff, 0xb7ff, 0xffff, - 0x7fff, 0xffff, 0xbffd, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xf7ff, 0x7fff, 0xfbff, 0xbfff, 0xf7ff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbffe, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xfbff, 0xbfff, 0xffff, - 0x7dff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xefff, 0x7fff, 0xffff, 0xbfff, 0xf7ff, - 0x7dff, 0xffff, 0xbbbf, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xdfff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbeff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffbf, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xfbff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbff7, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xf7ff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xff7f, 0x7fff, 0xffff, 0xbfff, 0xefff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbeff, 0xffff, - 0x7fff, 0xffff, 0xbdff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffbf, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffb, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffd, - 0x7fff, 0xffff, 0xbeff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffbf, - 0x7fff, 0xffff, 0xad5f, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfff5, - 0x69ff, 0xffff, 0xabff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7dff, 0xffff, 0xbd9f, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfff5, - 0x69ff, 0xffff, 0xb6bf, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffe, - 0x75ff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfaf, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfff5, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xb6af, 0xffff, 0x7fdf, 0xffff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0x7fff, 0x7fff, 0xffff, 0xb7ff, 0xfffe, - 0x7bff, 0xffff, 0xb9ff, 0xffff, 0x7fbf, 0xffff, 0xbfff, 0xffdf, - 0x7fff, 0xffff, 0xbffe, 0xffff, 0x7fff, 0xffff, 0xafff, 0xffeb, - 0x7fff, 0xffff, 0xbf5f, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffe, - 0x77ff, 0xffff, 0xbe9f, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0x3333, 0x63e6, 0x6667, 0xb333, 0x31f3, - 0x6666, 0x7ccc, 0xb98f, 0x9999, 0x73cc, 0xccc7, 0xb999, 0x99ff, - 0x7fff, 0xffff, 0xbfbf, 0x7777, 0x6957, 0x7777, 0xb777, 0x74ab, - 0x7777, 0x7ddd, 0xbba5, 0x5ddd, 0x7bdd, 0xddd2, 0xb5dd, 0xddff, - 0x7fff, 0xffff, 0xbedf, 0xffff, 0x7fdf, 0xffff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0x7fff, 0x7fff, 0xffff, 0xb7ff, 0xfff7, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbefd, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xfffe, 0x7ff7, 0xffbf, 0xbeff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbeff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xff5f, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbffe, 0xffff, - 0x7fff, 0xffff, 0xbf7f, 0xffff, 0x6ff7, 0xffff, 0xbf7f, 0xfeff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbdff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xff7f, 0xbfff, 0xffff, - 0x77ff, 0xffff, 0xbffb, 0xff7f, 0x7fff, 0xbbf7, 0xbfff, 0xbfff, - 0x7fff, 0xffff, 0xbfff, 0xfffb, 0x7fff, 0xffff, 0xbfff, 0xffbf, - 0x77ff, 0xffff, 0xbffe, 0xfffd, 0x6fff, 0xffff, 0xbffe, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbdfd, 0xffff, 0x6fff, 0xdff7, 0xbfff, 0x7fff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffbd, 0x7fff, 0xfdff, 0xbffe, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xfffb, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfea, 0x75ff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffdf, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ff7, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbffd, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfdb, 0xb5ff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffbf, - 0x7fff, 0xffff, 0xb6af, 0xefff, 0x7fff, 0x7fff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfff5, - 0x6bff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7dff, 0xffff, 0xb7af, 0xfdff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfff5, - 0x6bff, 0xffff, 0xbdaf, 0xffff, 0x7ff7, 0xffdf, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffea, - 0x77ff, 0xffff, 0xbbff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xffff, 0x4fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xdeff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbaff, 0xffff, 0x77ff, 0xffbf, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffee, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fef, 0x7fff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xa55f, 0xfebf, 0x67c6, 0x1ebf, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0x9fff, 0x7fff, 0x5fff, 0xffff, 0xb7ff, 0xfff5, - 0x67ff, 0xffff, 0xafff, 0xc2bf, 0x47a6, 0x1ebf, 0xbfff, 0xffdf, - 0x7fff, 0xffff, 0xbffe, 0xffff, 0x7fff, 0xffff, 0xafff, 0xffff, - 0x5fff, 0xffff, 0xb55f, 0xfe7f, 0x67e6, 0x1f3f, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfff5, - 0x67ff, 0xffff, 0x9fff, 0xc27f, 0x47e6, 0x1f3f, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0x3bb3, 0x73ee, 0xe6e7, 0xb333, 0x31f3, - 0x4666, 0x7ccc, 0xb98f, 0x9999, 0x73cc, 0xccc7, 0xb999, 0x99ff, - 0x7fff, 0xffff, 0xbfff, 0x7337, 0x4546, 0x7677, 0xb777, 0x74ab, - 0x7777, 0x7ddd, 0xbba5, 0x5ddd, 0x7bdd, 0xddd2, 0xb5dd, 0xddff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x7fdf, 0xdfff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0x7fff, 0x7fff, 0xffff, 0xb7ff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x77ff, 0xffff, 0xbfff, 0xefff, - 0x7fff, 0xffff, 0xbf7f, 0xfff7, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xfffd, 0x7ff7, 0xffff, 0xbfff, 0xffff, - 0x7fdf, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xff7f, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x8fff, 0xfffd, 0x4ff7, 0xffff, 0xbfff, 0xffff, - 0x7fbf, 0xffff, 0xbfff, 0xffef, 0x7fff, 0xff7f, 0x9fff, 0xffff, - 0x5dff, 0xffff, 0xafff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xefff, - 0x7fff, 0xffff, 0x9f7f, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7dff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffb, - 0x77ff, 0xffff, 0x9fff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xdfff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x77ee, 0xffff, 0xbfff, 0xdfff, - 0x7fff, 0xefff, 0x9fff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xefff, 0x9fff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xa55f, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xfffd, - 0x7bff, 0xffff, 0xafff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xa55f, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffd, - 0x7bff, 0xffff, 0xaaff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfffb, - 0x77ff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbaff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffee, - 0x77ff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x855f, 0xffff, 0x5fdf, 0xffff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0x7fff, 0x7fff, 0xffff, 0x97ff, 0xfff5, - 0x4bff, 0xffff, 0xafff, 0xffff, 0x7fbf, 0xffff, 0xbfff, 0xffdf, - 0x7fff, 0xffff, 0xbffe, 0xffff, 0x7fff, 0xffff, 0xafff, 0xffff, - 0x7fff, 0xffff, 0xb55f, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xfff5, - 0x6bff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0x3333, 0x43e6, 0x6667, 0xb333, 0x31f3, - 0x6666, 0x7ccc, 0xb98f, 0x9999, 0x73cc, 0xccc7, 0xb999, 0x99ff, - 0x7fff, 0xffff, 0xbfff, 0x7777, 0x6957, 0x7777, 0xb777, 0x74ab, - 0x7777, 0x7ddd, 0xbba5, 0x5ddd, 0x7bdd, 0xddd2, 0xb5dd, 0xddff, - 0x7fff, 0xffff, 0x9fff, 0xffff, 0x5fdf, 0xffff, 0xbfff, 0xffef, - 0x7fff, 0xffff, 0xbfff, 0x7fff, 0x7fff, 0xffff, 0xb7ff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xfeff, 0x7fff, 0xbfff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xfff7, - 0x7fff, 0xffff, 0xafff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7dff, 0xffff, 0xafff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7dff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xf7ff, - 0x7fff, 0xffff, 0xbfbf, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffef, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x5fff, 0xefff, 0xbfff, 0xffef, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xf7ff, - 0x7fff, 0xefff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfdf, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fef, 0xffff, 0x9fff, 0xefff, - 0x5fff, 0xefff, 0xbfff, 0xdfff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffbd, 0x7fff, 0xbdff, 0xbfff, 0xf7ff, - 0x7fff, 0xefff, 0x9fff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7ff7, 0xfdff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xdfff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xff7e, 0x7fff, 0xdfff, 0xbfff, 0xdbff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffef, 0x7ffd, 0xdfff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xefff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xfffb, 0x77ef, 0xffff, 0xbfdd, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xfffe, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xffef, 0x5ffd, 0xbfff, 0xbfef, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xefff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xfef1, 0x67e7, 0xbfff, 0x9fed, 0xeffd, - 0x53ff, 0xfff9, 0xb77f, 0xffff, 0x7fff, 0xb99f, 0xbccf, 0xffff, - 0x7fff, 0xffff, 0x9fff, 0xffff, 0x5fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbffc, 0xffff, 0x7ff3, 0xfffe, 0xaf9e, 0x7cff, - 0x7fff, 0xffe7, 0x93e7, 0xffff, 0x5f3e, 0x79f3, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0x9fff, 0xffff, - 0x5fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, - 0x7fff, 0xffff, 0xbfff, 0xffff, 0x7fff, 0xffff, 0xbfff, 0xffff, -} }; - -const std::array block_1 { { - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, - 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, -} }; - -} /* namespace cpld */ -} /* namespace portapack */ diff --git a/firmware/common/portapack_shared_memory.hpp b/firmware/common/portapack_shared_memory.hpp index 7ab097f7..0bb9e530 100644 --- a/firmware/common/portapack_shared_memory.hpp +++ b/firmware/common/portapack_shared_memory.hpp @@ -27,10 +27,6 @@ #include "message_queue.hpp" -struct TouchADCFrame { - uint32_t dr[8]; -}; - struct JammerRange { bool active; int64_t center; @@ -40,19 +36,16 @@ struct JammerRange { /* NOTE: These structures must be located in the same location in both M4 and M0 binaries */ struct SharedMemory { - static constexpr size_t baseband_queue_k = 12; static constexpr size_t application_queue_k = 11; + static constexpr size_t app_local_queue_k = 11; - MessageQueue baseband_queue; - uint8_t baseband_queue_data[1 << baseband_queue_k]; - MessageQueue application_queue; - uint8_t application_queue_data[1 << application_queue_k]; + uint8_t application_queue_data[1 << application_queue_k] { 0 }; + uint8_t app_local_queue_data[1 << app_local_queue_k] { 0 }; + const Message* volatile baseband_message { nullptr }; + MessageQueue application_queue { application_queue_data, application_queue_k }; + MessageQueue app_local_queue { app_local_queue_data, app_local_queue_k }; - // TODO: M0 should directly configure and control DMA channel that is - // acquiring ADC samples. - TouchADCFrame touch_adc_frame; - - int test; + char m4_panic_msg[32] { 0 }; uint8_t radio_data[256]; size_t bit_length; diff --git a/firmware/common/spi_image.hpp b/firmware/common/spi_image.hpp index f8e71d62..e1143712 100644 --- a/firmware/common/spi_image.hpp +++ b/firmware/common/spi_image.hpp @@ -30,6 +30,58 @@ namespace portapack { namespace spi_flash { +struct image_tag_t { + constexpr image_tag_t( + ) : c { 0, 0, 0, 0 } + { + } + + constexpr image_tag_t( + char c0, char c1, char c2, char c3 + ) : c { c0, c1, c2, c3 } + { + } + + image_tag_t& operator=(const image_tag_t& other) { + c[0] = other.c[0]; + c[1] = other.c[1]; + c[2] = other.c[2]; + c[3] = other.c[3]; + return *this; + } + + bool operator==(const image_tag_t& other) const { + return (c[0] == other.c[0]) && (c[1] == other.c[1]) && (c[2] == other.c[2]) && (c[3] == other.c[3]); + } + + operator bool() const { + return (c[0] != 0) || (c[1] != 0) || (c[2] != 0) || (c[3] != 0); + } + +private: + char c[4]; +}; + +constexpr image_tag_t image_tag_ais { 'P', 'A', 'I', 'S' }; +constexpr image_tag_t image_tag_am_audio { 'P', 'A', 'M', 'A' }; +constexpr image_tag_t image_tag_capture { 'P', 'C', 'A', 'P' }; +constexpr image_tag_t image_tag_ert { 'P', 'E', 'R', 'T' }; +constexpr image_tag_t image_tag_nfm_audio { 'P', 'N', 'F', 'M' }; +constexpr image_tag_t image_tag_tpms { 'P', 'T', 'P', 'M' }; +constexpr image_tag_t image_tag_wfm_audio { 'P', 'W', 'F', 'M' }; +constexpr image_tag_t image_tag_wideband_spectrum { 'P', 'S', 'P', 'E' }; +constexpr image_tag_t image_tag_hackrf { 'H', 'R', 'F', '1' }; + +struct chunk_t { + const image_tag_t tag; + const uint32_t length; + const uint8_t data[]; + + const chunk_t* next() const { + return reinterpret_cast(&data[length]); + } +}; + struct region_t { const size_t offset; const size_t size; @@ -44,14 +96,9 @@ constexpr region_t bootstrap { .size = 0x10000, }; -constexpr region_t hackrf { +constexpr region_t images { .offset = 0x10000, - .size = 0x8000, -}; - -constexpr region_t baseband { - .offset = 0x20000, - .size = 0x8000, + .size = 0x30000, }; constexpr region_t application { diff --git a/firmware/common/tpms_packet.cpp b/firmware/common/tpms_packet.cpp index 7b18622b..0bc3064b 100644 --- a/firmware/common/tpms_packet.cpp +++ b/firmware/common/tpms_packet.cpp @@ -29,61 +29,115 @@ Timestamp Packet::received_at() const { return packet_.timestamp(); } -ManchesterFormatted Packet::symbols_formatted() const { - return format_manchester(decoder_); +FormattedSymbols Packet::symbols_formatted() const { + return format_symbols(decoder_); } -Optional Packet::reading(const SignalType signal_type) const { - if( signal_type == SignalType::FLM ) { - const auto length = crc_valid_length(); +Optional Packet::reading_fsk_19k2_schrader() const { + const auto length = crc_valid_length(); - switch(length) { - case 64: - return Reading { - Reading::Type::FLM_64, - reader_.read(0, 32), - Pressure { static_cast(reader_.read(32, 8)) * 4 / 3 }, - Temperature { static_cast(reader_.read(40, 8) & 0x7f) - 50 } - }; - - case 72: - return Reading { - Reading::Type::FLM_72, - reader_.read(0, 32), - Pressure { static_cast(reader_.read(40, 8)) * 4 / 3 }, - Temperature { static_cast(reader_.read(48, 8)) - 50 } - }; - - case 80: - return Reading { - Reading::Type::FLM_80, - reader_.read(8, 32), - Pressure { static_cast(reader_.read(48, 8)) * 4 / 3 }, - Temperature { static_cast(reader_.read(56, 8)) - 50 } - }; - - default: - return { }; - } - } - - if( signal_type == SignalType::Subaru ) { + switch(length) { + case 64: return Reading { - Reading::Type::SUB_35, - reader_.read(3, 25), - Pressure { static_cast(reader_.read(28, 8)) } + Reading::Type::FLM_64, + reader_.read(0, 32), + Pressure { static_cast(reader_.read(32, 8)) * 4 / 3 }, + Temperature { static_cast(reader_.read(40, 8) & 0x7f) - 50 } }; + + case 72: + return Reading { + Reading::Type::FLM_72, + reader_.read(0, 32), + Pressure { static_cast(reader_.read(40, 8)) * 4 / 3 }, + Temperature { static_cast(reader_.read(48, 8)) - 50 } + }; + + case 80: + return Reading { + Reading::Type::FLM_80, + reader_.read(8, 32), + Pressure { static_cast(reader_.read(48, 8)) * 4 / 3 }, + Temperature { static_cast(reader_.read(56, 8)) - 50 } + }; + + default: + return { }; + } +} + +Optional Packet::reading_ook_8k192_schrader() const { + /* + * Preamble: 11*2, 01*14, 11, 10 + * Function code: 3 Manchester symbols + * ID: 24 Manchester symbols (one variant seen with 21 symbols?) + * Pressure: 8 Manchester symbols + * Checksum: 2 Manchester symbols (2 LSBs of sum incl this field == 3) + */ + const auto flags = reader_.read(0, 3); + const auto checksum = reader_.read(35, 2); + + uint32_t checksum_calculated = reader_.read(0, 1); + for(size_t i=1; i<37; i+=2) { + checksum_calculated += reader_.read(i, 2); } - if( signal_type == SignalType::GMC ) { + if( (checksum_calculated & 3) == 3 ) { + return Reading { + Reading::Type::Schrader, + reader_.read(3, 24), + Pressure { static_cast(reader_.read(27, 8)) * 4 / 3 }, + { }, + Flags { (flags << 4) | checksum } + }; + } else { + return { }; + } +} + +Optional Packet::reading_ook_8k4_schrader() const { + /* + * Preamble: 01*40 + * System ID: 01100101, ??*20 (not really sure what this data is) + * ID: 32 Manchester symbols + * Value: 8 Manchester symbols (temperature?) + * Value: 8 Manchester symbols (pressure?) + * Checksum: 8 Manchester symbols (uint8_t sum of bytes starting with system ID) + */ + /* NOTE: First four bits of packet are consumed in preamble detection. + * Those bits assumed to be 0b0100", which may not be entirely true... + */ + constexpr uint8_t first_nibble = 0x4; + const auto system_id = (first_nibble << 20) | reader_.read(0, 20); + const auto id = reader_.read(20, 32); + const auto value_0 = reader_.read(52, 8); + const auto value_1 = reader_.read(60, 8); + const auto checksum = reader_.read(68, 8); + + uint8_t checksum_calculated = (first_nibble << 4) | reader_.read(0, 4); + for(size_t i=4; i<68; i+=8) { + checksum_calculated += reader_.read(i, 8); + } + + if( checksum_calculated == checksum ) { return Reading { Reading::Type::GMC_96, - reader_.read(20, 32), - Pressure { static_cast(reader_.read(52, 8)) } + id, + Pressure { static_cast(value_1) * 4 / 3 }, + Temperature { static_cast(value_0) - 50 } }; + } else { + return { }; } +} - return { }; +Optional Packet::reading() const { + switch( signal_type() ) { + case SignalType::FSK_19k2_Schrader: return reading_fsk_19k2_schrader(); + case SignalType::OOK_8k192_Schrader: return reading_ook_8k192_schrader(); + case SignalType::OOK_8k4_Schrader: return reading_ook_8k4_schrader(); + default: return { }; + } } size_t Packet::crc_valid_length() const { diff --git a/firmware/common/tpms_packet.hpp b/firmware/common/tpms_packet.hpp index ab9ecf4f..5ee3e02a 100644 --- a/firmware/common/tpms_packet.hpp +++ b/firmware/common/tpms_packet.hpp @@ -37,10 +37,12 @@ using units::Pressure; namespace tpms { +using Flags = uint8_t; + enum SignalType : uint32_t { - FLM = 1, - Subaru = 2, - GMC = 3, + FSK_19k2_Schrader = 1, + OOK_8k192_Schrader = 2, + OOK_8k4_Schrader = 3, }; class TransponderID { @@ -71,7 +73,7 @@ public: FLM_64 = 1, FLM_72 = 2, FLM_80 = 3, - SUB_35 = 4, + Schrader = 4, GMC_96 = 5, }; @@ -92,11 +94,13 @@ public: Type type, TransponderID id, Optional pressure = { }, - Optional temperature = { } + Optional temperature = { }, + Optional flags = { } ) : type_ { type }, id_ { id }, pressure_ { pressure }, - temperature_ { temperature } + temperature_ { temperature }, + flags_ { flags } { } @@ -116,37 +120,50 @@ public: return temperature_; } + Optional flags() const { + return flags_; + } + private: Type type_ { Type::None }; TransponderID id_ { 0 }; Optional pressure_ { }; Optional temperature_ { }; + Optional flags_ { }; }; class Packet { public: constexpr Packet( - const baseband::Packet& packet + const baseband::Packet& packet, + const SignalType signal_type ) : packet_ { packet }, + signal_type_ { signal_type }, decoder_ { packet_, 0 }, reader_ { decoder_ } { } + SignalType signal_type() const { return signal_type_; } Timestamp received_at() const; - ManchesterFormatted symbols_formatted() const; + FormattedSymbols symbols_formatted() const; - Optional reading(const SignalType signal_type) const; + Optional reading() const; private: using Reader = FieldReader; const baseband::Packet packet_; + const SignalType signal_type_; const ManchesterDecoder decoder_; const Reader reader_; + Optional reading_fsk_19k2_schrader() const; + Optional reading_ook_8k192_schrader() const; + Optional reading_ook_8k4_schrader() const; + size_t crc_valid_length() const; }; diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index ef161f34..e93e420e 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -238,6 +238,13 @@ std::string View::title() const { /* Rectangle *************************************************************/ +Rectangle::Rectangle( + Color c +) : Widget { }, + color { c } +{ +} + Rectangle::Rectangle( Rect parent_rect, Color c diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index 11e931f2..cb1331a9 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -171,6 +171,7 @@ protected: class Rectangle : public Widget { public: + Rectangle(Color c); Rectangle(Rect parent_rect, Color c); void paint(Painter& painter) override; diff --git a/firmware/hackrf_cpld_default.svf b/firmware/hackrf_cpld_default.svf new file mode 100644 index 00000000..d35ff4b1 --- /dev/null +++ b/firmware/hackrf_cpld_default.svf @@ -0,0 +1,1144 @@ +// Created using Xilinx Cse Software [ISE - 14.7] +// Date: Fri Jul 15 12:29:50 2016 + +TRST OFF; +ENDIR IDLE; +ENDDR IDLE; +STATE RESET; +STATE IDLE; +FREQUENCY 1E6 HZ; +//Operation: Program -p 0 -e -v +TIR 0 ; +HIR 0 ; +TDR 0 ; +HDR 0 ; +TIR 0 ; +HIR 0 ; +HDR 0 ; +TDR 0 ; +//Loading device with 'idcode' instruction. +SIR 8 TDI (01) SMASK (ff) ; +SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f6e5f093) MASK (0fff8fff) ; +//Check for Read/Write Protect. +SIR 8 TDI (ff) TDO (01) MASK (03) ; +//Boundary Scan Chain Contents +//Position 1: xc2c64a +TIR 0 ; +HIR 0 ; +TDR 0 ; +HDR 0 ; +TIR 0 ; +HIR 0 ; +TDR 0 ; +HDR 0 ; +TIR 0 ; +HIR 0 ; +HDR 0 ; +TDR 0 ; +//Loading device with 'idcode' instruction. +SIR 8 TDI (01) ; +SDR 32 TDI (00000000) TDO (f6e5f093) ; +//Check for Read/Write Protect. +SIR 8 TDI (ff) TDO (01) MASK (03) ; +TIR 0 ; +HIR 0 ; +HDR 0 ; +TDR 0 ; +// Loading devices with 'enable' or 'bypass' instruction. +SIR 8 TDI (e8) ; +// Loading devices with 'erase' or 'bypass' instruction. +ENDIR IRPAUSE; +SIR 8 TDI (ed) SMASK (ff) ; +ENDIR IDLE; +STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRPAUSE; +RUNTEST DRPAUSE 20 TCK; +STATE IDLE; +RUNTEST IDLE 100000 TCK; +STATE DRPAUSE; +RUNTEST DRPAUSE 5000 TCK; +RUNTEST IDLE 1 TCK; +// Loading devices with 'init' or 'bypass' instruction. +ENDIR IRPAUSE; +SIR 8 TDI (f0) SMASK (ff) ; +STATE IDLE; +RUNTEST IDLE 20 TCK; +// Loading devices with 'init' or 'bypass' instruction. +ENDIR IRPAUSE; +SIR 8 TDI (f0) SMASK (ff) ; +STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRUPDATE IDLE; +RUNTEST 800 TCK; +ENDIR IDLE; +// Loading devices with 'conld' or 'bypass' instruction. +SIR 8 TDI (c0) ; +RUNTEST 100 TCK; +// Loading devices with 'conld' or 'bypass' instruction. +SIR 8 TDI (c0) ; +RUNTEST 100 TCK; +// Loading devices with 'enable' or 'bypass' instruction. +SIR 8 TDI (e8) ; +// Programming. +// Loading devices with 'program' instruction. +ENDIR IRPAUSE; +SIR 8 TDI (ea) ; +SDR 281 TDI (0003c1fff37ffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe0f) SMASK (01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +ENDIR IDLE; +RUNTEST 10000 TCK; +SDR 281 TDI (0103f9d37f777ffffffffffffffffffffffdde6efffffffffffffffffffffff3fffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0180f93dbfd53fffffffffffffffefffffe9de7fffffffffffffffffffffffff3ffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0083c1ffffffffffffffffffffffffffffffff777efbfffffffffffffffffeeeeeeeee0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00c3f9fffffffffffffffffffffffffffffddf7ffffffffffffffffffffffffff3fffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01c0f9ffffffd7fffffffffffffffffffff99e7fffffffffffffffffffffffbbbbbbba7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0143c1ff7f52fffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0043f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0060f9edf3777ffffffffffffffffffffffdde6effffffffffffffffffffffbbbbbbba7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0163c1fffffffffffffffffffffffffffffddf7ffffffffffffffffffffffffffff3fe4f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01e3f9fffffffffffffffffffffffffffffd7f7fffffffffffffffffffffffffffff3e7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00e0f96bf5dcfffffffffffffffffffffffafefffffffffffffffffffffffffffffffe03) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00a3c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01a3f97f7ffffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0120f9fffffffffffffffffffffffffffffd7f7fffffffffffffffffffffff3fffffff83) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0023c1fffffffffffffffffffffffffffff5ff7fffffffffffffffffffffffbbbbbbba4f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0033f9fffffffffffffffffffffffffffffd7f7ffffffffffffffffffffffffffffff27c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0130f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01b3c1ffffffefffffffffffffffeffffffbbefffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00b3f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00f0f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01f3c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffebffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0173f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffff4bffffe1d) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0070f9ffffffffffffffffffffffffffffffe587fffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0053c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5fffe4f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0153f9ffffffd7ffffffffffffffffffffffffffffffffffffffffffffffffffff4bfe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01d0f9ffffd57fffffffffffffffffffffffffffffffffffffffffffffffffffffff4b83) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00d3c1552afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0093f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7d) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0190f9ffffadfffffffffffffffffffffff8de7fffffffffffffffffffffffffff3ffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0113c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0013f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0018f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83) ; +RUNTEST 10000 TCK; +SDR 281 TDI (011bc1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (019b99fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (009af9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00dbc1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01db99fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (015afdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83) ; +RUNTEST 10000 TCK; +SDR 281 TDI (005bc9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (007bddfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0178f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01fbc9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00fbddfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00b8ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01bbc9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (013bd9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0038f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) ; +RUNTEST 10000 TCK; +SDR 281 TDI (002bc9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0128d9dffffffffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe1d) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01ab0133ffffffffffffffffffffffffffebfefffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00abc1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00eae1ffffcffffffffffffffffffffffffbeefffffffffffffffffffffffffffffffe1d) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01e8f92dfbfffffffffffffffffffffffffbbefffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (016bc9dffffffffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0068e1f5fffffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe1d) ; +RUNTEST 10000 TCK; +SDR 281 TDI (004bc7dffffffffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (014bc1ff3ffffffffffffffffffffffffffbeefffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01cae1ff36ccccccfffffffffffffffffffffeeefffffffffffffffffffffffffffffe1d) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00c8f9ffffffcffffffffffffffffffffffbeefffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (008bc9fffffcfffffffffffffffffffffffbeefffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0188e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d) ; +RUNTEST 10000 TCK; +SDR 281 TDI (010bc7fff6fffffffffffffffffffffffffbeefffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (000bc1ffffffffcffffffffffffffffffffbbefffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (000ee1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d) ; +RUNTEST 10000 TCK; +SDR 281 TDI (010cf9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (018fc9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (008ce1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00cfc6abfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01cfc1febffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (014ee1ffeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d) ; +RUNTEST 10000 TCK; +SDR 281 TDI (004cf9fffffffffafffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (006fc9ffffad7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (016ce1fffffffffffffffffffffffffffffff9fffffffffffffffffffffffffffffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01efc7ffffffd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00efc9fffffffad7fffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00ace1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01afc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (012fc1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (002ee1fffffffcfffffffffffffffffffffbbefffffffffffffffffffffffffffffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (003cf9fffffffffb7ffffffffffffffffffbbefffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (013fc1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01bee1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00bcf9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00ffc1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01fff9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (017cf9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (007fc9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (005ce0bffffffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (015fc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (01dfc9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (00dce1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (009fc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (019fc9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (011ce1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) ; +RUNTEST 10000 TCK; +SDR 281 TDI (001fc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0017ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 10000 TCK; +SDR 281 TDI (0117ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 10000 TCK; +// Loading devices with 'init' or 'bypass' instruction. +ENDIR IRPAUSE; +SIR 8 TDI (f0) SMASK (ff) ; +STATE IDLE; +RUNTEST IDLE 20 TCK; +// Loading devices with 'init' or 'bypass' instruction. +ENDIR IRPAUSE; +SIR 8 TDI (f0) SMASK (ff) ; +STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRUPDATE IDLE; +RUNTEST 800 TCK; +ENDIR IDLE; +// Loading devices with 'conld' or 'bypass' instruction. +SIR 8 TDI (c0) ; +RUNTEST 100 TCK; +// Loading devices with 'conld' or 'bypass' instruction. +SIR 8 TDI (c0) ; +RUNTEST 100 TCK; +TIR 0 ; +HIR 0 ; +HDR 0 ; +TDR 0 ; +//Loading device with 'enable' instruction. +SIR 8 TDI (e8) ; +//Loading device with 'enable' instruction. +SIR 8 TDI (e8) ; +// Verification. +// Loading device with a 'verify' instruction. +ENDIR IRPAUSE; +SIR 8 TDI (ee) ; +ENDDR DRPAUSE; +SDR 7 TDI (00) SMASK (7f) ; +ENDIR IDLE; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fff37ffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (40) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9d37f777ffffffffffffffffffffffdde6efffffffffffffffffffffff3fffffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (60) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f93dbfd53fffffffffffffffefffffe9de7fffffffffffffffffffffffff3ffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (20) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffffffffffffffffffffffffffffffff777efbfffffffffffffffffeeeeeeeee0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (30) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffddf7ffffffffffffffffffffffffff3fffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (70) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffd7fffffffffffffffffffff99e7fffffffffffffffffffffffbbbbbbba7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (50) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ff7f52fffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (10) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (18) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9edf3777ffffffffffffffffffffffdde6effffffffffffffffffffffbbbbbbba7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (58) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffddf7ffffffffffffffffffffffffffff3fe4f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (78) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffd7f7fffffffffffffffffffffffffffff3e7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (38) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f96bf5dcfffffffffffffffffffffffafefffffffffffffffffffffffffffffffe03) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (28) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (68) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f97f7ffffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (48) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffd7f7fffffffffffffffffffffff3fffffff83) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (08) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffff5ff7fffffffffffffffffffffffbbbbbbba4f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (0c) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffd7f7ffffffffffffffffffffffffffffff27c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (4c) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (6c) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffffffefffffffffffffffeffffffbbefffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (2c) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (3c) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (7c) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffebffffffe0f) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (5c) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffff4bffffe1d) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (1c) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffffffffffffffe587fffffffffffffffffffffffffffffe7c) MASK ( +03fffffffffffffffffffffffffffffe001ff801ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (14) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5fffe4f) MASK ( +03fffffffffffffffffffffffffffffe001f8001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (54) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9ffffffd7ffffffffffffffffffffffffffffffffffffffffffffffffffff4bfe7c) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (74) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffd57fffffffffffffffffffffffffffffffffffffffffffffffffffffff4b83) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (34) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1552afffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (24) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7d) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (64) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffadfffffffffffffffffffffff8de7fffffffffffffffffffffffffff3ffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (44) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (04) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (06) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (46) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (66) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0399fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (26) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (36) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (76) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (0399fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (56) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (16) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (1e) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03ddfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (5e) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (7e) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (3e) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03ddfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (2e) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (6e) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe4f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (4e) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03d9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (0e) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (0a) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (4a) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00d9dffffffffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe1d) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (6a) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (030133ffffffffffffffffffffffffffebfefffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (2a) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (3a) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1ffffcffffffffffffffffffffffffbeefffffffffffffffffffffffffffffffe1d) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (7a) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f92dfbfffffffffffffffffffffffffbbefffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (5a) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9dffffffffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (1a) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00e1f5fffffffffffffffffffffffffffffefebffffffffffffffffffffffffffffe1d) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (12) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c7dffffffffffffffffffffffffffffffeeefffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (52) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ff3ffffffffffffffffffffffffffbeefffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (72) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1ff36ccccccfffffffffffffffffffffeeefffffffffffffffffffffffffffffe1d) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (32) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9ffffffcffffffffffffffffffffffbeefffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (22) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffcfffffffffffffffffffffffbeefffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (62) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (42) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c7fff6fffffffffffffffffffffffffbeefffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (02) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1ffffffffcffffffffffffffffffffbbefffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (03) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (43) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (63) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (23) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (33) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c6abfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (73) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1febffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (53) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1ffeefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1d) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (13) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffafffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (1b) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9ffffad7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (5b) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00e1fffffffffffffffffffffffffffffff9fffffffffffffffffffffffffffffffe7f) MASK ( +03fffffffffffffffffffffffffffffe00078001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (7b) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c7ffffffd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (3b) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffad7fffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03fffffffffffffffffffffffffffffe00000001ffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (2b) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (6b) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (4b) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (0b) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1fffffffcfffffffffffffffffffffbbefffffffffffffffffffffffffffffffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (0f) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffb7ffffffffffffffffffbbefffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (4f) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (6f) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (02e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (2f) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (3f) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (7f) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (5f) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00f9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (1f) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (17) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00e0bffffffffffffffffffffffffffffafefffffffffffffffffffffffffffffffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (57) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (77) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (37) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (27) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (67) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c9fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (47) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (00e1fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7f) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (07) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe7c) MASK ( +03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (05) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) MASK ( +0000000000000000000000000000000000000000000000000000000000000000000000) ; +RUNTEST 100 TCK; +ENDDR DRPAUSE; +SDR 7 TDI (45) SMASK (7f) ; +RUNTEST DRPAUSE 20 TCK; +ENDDR IDLE; +RUNTEST IDLE 100 TCK; +// masking lower UES bits. +SDR 274 TDI (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) TDO (03ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) MASK ( +0000000000000000000000000000000000000000000000000000000000000000000000) ; +RUNTEST 100 TCK; +SIR 8 TDI (f0) SMASK (ff) ; +STATE IDLE; +RUNTEST IDLE 20 TCK; +ENDIR IRPAUSE; +SIR 8 TDI (f0) SMASK (ff) ; +STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRUPDATE IDLE; +RUNTEST 800 TCK; +ENDIR IDLE; +//Loading device with 'conld' instruction. +SIR 8 TDI (c0) ; +RUNTEST IDLE 100 TCK; +//Loading device with 'enable' instruction. +SIR 8 TDI (e8) ; +// Setting Done bit ... +// Loading device with a 'program' instruction. +ENDIR IRPAUSE; +SIR 8 TDI (ea) ; +SDR 281 TDI (0017fdffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) SMASK (01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) ; +ENDIR IDLE; +RUNTEST 10000 TCK; +SIR 8 TDI (f0) SMASK (ff) ; +STATE IDLE; +RUNTEST IDLE 20 TCK; +ENDIR IRPAUSE; +SIR 8 TDI (f0) SMASK (ff) ; +STATE IREXIT2 IRUPDATE DRSELECT DRCAPTURE DREXIT1 DRUPDATE IDLE; +RUNTEST 800 TCK; +ENDIR IDLE; +//Loading device with 'conld' instruction. +SIR 8 TDI (c0) ; +RUNTEST IDLE 100 TCK; +//Loading device with 'idcode' instruction. +SIR 8 TDI (01) ; +SDR 32 TDI (00000000) SMASK (ffffffff) TDO (f6e5f093) MASK (0fff8fff) ; +//Check for Done bit. +SIR 8 TDI (ff) TDO (05) MASK (07) ; +TIR 0 ; +HIR 0 ; +HDR 0 ; +TDR 0 ; +TIR 0 ; +HIR 0 ; +HDR 0 ; +TDR 0 ; +TIR 0 ; +HIR 0 ; +TDR 0 ; +HDR 0 ; +SIR 8 TDI (ff) ; +SDR 1 TDI (00) SMASK (01) ; diff --git a/firmware/toolchain-arm-cortex-m.cmake b/firmware/toolchain-arm-cortex-m.cmake new file mode 100644 index 00000000..033fb185 --- /dev/null +++ b/firmware/toolchain-arm-cortex-m.cmake @@ -0,0 +1,55 @@ +# Copyright 2014 Jared Boone +# +# This file is part of PortaPack. +# This file was borrowed from HackRF. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_SYSTEM_VERSION 1) +set(CMAKE_SYSTEM_PROCESSOR arm) + +include(CMakeForceCompiler) + +CMAKE_FORCE_C_COMPILER(arm-none-eabi-gcc GNU) +CMAKE_FORCE_CXX_COMPILER(arm-none-eabi-g++ GNU) + +execute_process( + COMMAND ${CMAKE_C_COMPILER} -print-file-name=libc.a + OUTPUT_VARIABLE CMAKE_INSTALL_PREFIX + OUTPUT_STRIP_TRAILING_WHITESPACE +) +get_filename_component(CMAKE_INSTALL_PREFIX + "${CMAKE_INSTALL_PREFIX}" PATH +) +get_filename_component(CMAKE_INSTALL_PREFIX + "${CMAKE_INSTALL_PREFIX}/.." REALPATH +) +set(CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} CACHE FILEPATH + "Install path prefix, prepended onto install directories.") + +message(STATUS "Cross-compiling with the gcc-arm-embedded toolchain") +message(STATUS "Toolchain prefix: ${CMAKE_INSTALL_PREFIX}") + +set(CMAKE_ASM_COMPILER ${CMAKE_C_COMPILER}) +#set(CMAKE_LD ${CMAKE_INSTALL_PREFIX}/bin/ld CACHE INTERNAL "ld tool") +set(CMAKE_OBJCOPY ${CMAKE_INSTALL_PREFIX}/bin/objcopy CACHE INTERNAL "objcopy tool") + +set(CMAKE_FIND_ROOT_PATH ${CMAKE_INSTALL_PREFIX}) +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) diff --git a/firmware/tools/extract_cpld_data.py b/firmware/tools/extract_cpld_data.py new file mode 100755 index 00000000..c4405854 --- /dev/null +++ b/firmware/tools/extract_cpld_data.py @@ -0,0 +1,124 @@ +#!/usr/bin/env python + +# +# Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. +# +# This file is part of PortaPack. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +# Very fragile code to extract data from Altera MAX V CPLD SVF + +import sys + +if len(sys.argv) != 2: + print('Usage: ') + sys.exit(-1) + +f = open(sys.argv[1], 'r') + +calculate_crc = False + +# !PROGRAM +# SIR 10 TDI (203); +# RUNTEST 93 TCK; +# SDR 13 TDI (0000); +# SIR 10 TDI (2F4); +# RUNTEST 93 TCK; +# while: + # SDR 16 TDI (7FFF); + # RUNTEST 1800 TCK; +# SIR 10 TDI (203); +# RUNTEST 93 TCK; +# SDR 13 TDI (0001); +# SIR 10 TDI (2F4); +# RUNTEST 93 TCK; + +phase = None + +block_0 = [] +block_1 = [] +current_block = None + +for line in f: + line = line.strip().upper() + + if line == '!PROGRAM': + phase = 'block_0' + current_block = block_0 + elif line == '!VERIFY': + phase = 'verify' + current_block = None + + if phase == 'block_0': + if line == 'SDR 13 TDI (0001);': + phase = 'block_1' + current_block = block_1 + + if phase == 'block_0' or phase == 'block_1': + if line.startswith('SDR 16 TDI ('): + sdr_value = int(line.split('(', 1)[1][:4], 16) + #print('0x%04x,' % sdr_value) + current_block.append(sdr_value) + +def print_block(block): + for n in range(0, len(block), 8): + chunk = block[n:n+8] + line = ['0x%04x,' % v for v in chunk] + print('\t%s' % ' '.join(line)) + +def crc32(blocks): + import zlib + + crc_bytes = [] + for block in blocks: + for word in block: + crc_bytes.append((word >> 0) & 0xff) + crc_bytes.append((word >> 8) & 0xff) + return zlib.crc32(bytearray(crc_bytes)) & 0xffffffff + +print("""#include "portapack_cpld_data.hpp" + +#include +#include + +namespace portapack { +namespace cpld { +""") + +print('const std::array block_0 { {' % len(block_0)) +print_block(block_0) + +print("""} }; +""") + +print('const std::array block_1 { {' % len(block_1)) +print_block(block_1) + +print("""} }; + +} /* namespace cpld */ +} /* namespace portapack */ +""") + +if calculate_crc: + # Apply post-programming modification to make post-programming CRC correct: + programmed_block_0 = block_0[:] + programmed_block_0[0] &= 0xfbff + + crc = crc32((programmed_block_0, block_1)) + print('%08x' % crc) diff --git a/firmware/tools/extract_svf_data_xc2c64a.py b/firmware/tools/extract_svf_data_xc2c64a.py new file mode 100755 index 00000000..1c1b8c1b --- /dev/null +++ b/firmware/tools/extract_svf_data_xc2c64a.py @@ -0,0 +1,341 @@ +#!/usr/bin/env python + +# +# Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. +# +# This file is part of PortaPack. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +# Very fragile code to extract data from Xilinx XC2C64A CPLD SVF + +import sys +import re +import os.path +import argparse + +def crack_variable_path(variable_path): + tmp = args.variable_path.split('::') + namespaces, variable_name = tmp[:-1], tmp[-1] + return namespaces, variable_name + +parser = argparse.ArgumentParser() +parser.add_argument('input_file_path', type=str) +parser.add_argument('variable_path', type=str) +parser.add_argument('header_file_path', type=str) +parser.add_argument('data_file_path', type=str) +args = parser.parse_args() + +f = open(args.input_file_path, 'r') +namespaces, variable_name = crack_variable_path(args.variable_path) + +def to_hex(value, length_bits): + return ('%x' % value).zfill((length_bits + 3) >> 2) + +def long_int_to_bytes(n, bit_count): + byte_count = (bit_count + 7) >> 3 + h = ('%x' % n).zfill(byte_count * 2) + return [int(h[n:n+2], 16) for n in range(0, len(h), 2)] + +re_sdr = re.compile(r'^(?P\d+)\s*TDI\s*\((?P[0-9A-F]+)\)(|\s*SMASK\s*\((?P[0-9A-F]+)\))(|\s*TDO\s*\((?P[0-9A-F]+)\))(|\s*MASK\s*\((?P[0-9A-F]+)\))\s*;$') +re_sir = re_sdr + +class SIR_or_SDR(object): + def __init__(self, name, s): + self.name = name + match = re_sdr.match(s) + self.length = int(match.group('length')) + self.tdi = self._bits(match.group('tdi')) + self.smask = self._optional_bits(match.group('smask')) + self.tdo = self._optional_bits(match.group('tdo')) + self.mask = self._optional_bits(match.group('mask')) + + def __repr__(self): + result = [self.name, str(self.length)] + result.append('TDI (%s)' % to_hex(self.tdi, self.length)) + if self.smask: + result.append('SMASK (%s)' % to_hex(self.smask, self.length)) + if self.tdo: + result.append('TDO (%s)' % to_hex(self.tdo, self.length)) + if self.mask: + result.append('MASK (%s)' % to_hex(self.mask, self.length)) + result.append(';') + return ' '.join(result) + + def _bits(self, matched): + return int(matched, 16) + + def _optional_bits(self, matched): + return self._bits(matched) if matched else None + +class SDR(SIR_or_SDR): + def __init__(self, s): + SIR_or_SDR.__init__(self, 'SDR', s) + +class SIR(SIR_or_SDR): + def __init__(self, s): + SIR_or_SDR.__init__(self, 'SIR', s) + +class SVFParser(object): + instruction_parsers = { + 'SIR': SIR, + 'SDR': SDR, + } + + def parse(self, f, instruction_handler_map): + complete_line = '' + for line in f: + line = line.strip().upper() + if line.startswith('//'): + continue + + complete_line += line + if not line.endswith(';'): + continue + + instruction_name, args_string = complete_line.split(None, 1) + instruction = self.instruction_parser(instruction_name, args_string) + if instruction: + instruction_type = type(instruction) + if instruction_type in instruction_handler_map: + instruction_handler_map[instruction_type](instruction) + + if complete_line.endswith(';'): + complete_line = '' + + def instruction_parser(self, instruction_name, args_string): + if instruction_name in self.instruction_parsers: + parser = self.instruction_parsers[instruction_name] + return parser(args_string) + else: + return None + +class ProgramExtractor(object): + idcode = int('0bXXXX0110111001011XXX000010010011'.replace('X', '0'), 2) + idcode_mask = None + id_bits = 7 + block_bits = 274 + block_ordinals = frozenset(list(range(64)) + list(range(80, 82)) + list(range(96, 128))) + block_count = len(block_ordinals) + + def __init__(self): + self.tap_instruction = None + self.program_data = [] + self.verify_data = [] + self.sdr_smask = None + self.sdr_mask = None + + def map(self): + return { + SIR: self.on_sir, + SDR: self.on_sdr, + } + + def on_sir(self, o): + assert(o.length == 8) + + if o.tdi == 0x01: + self.tap_instruction = 'idcode' + elif o.tdi == 0xea: + self.tap_instruction = 'program' + self.program_data.append([]) + elif o.tdi == 0xee: + self.tap_instruction = 'verify' + self.verify_data.append([]) + self.verify_block_id = None + else: + self.tap_instruction = None + + def on_sdr(self, o): + if o.smask: + self.sdr_smask = o.smask + if o.mask: + self.sdr_mask = o.mask + + if self.tap_instruction == 'idcode': + assert(o.length == 32) + assert(self.sdr_smask == 0xffffffff) + assert((o.tdo & self.sdr_mask) == self.idcode) + if self.idcode_mask is None: + self.idcode_mask = self.sdr_mask + else: + assert(self.idcode_mask == self.sdr_mask) + + elif self.tap_instruction == 'program': + assert(o.length == (self.id_bits + self.block_bits)) + assert(self.sdr_smask == ((1 << o.length) - 1)) + assert(o.tdo is None) + assert(o.mask is None) + block_id = o.tdi >> (o.length - 7) + mask = (1 << (o.length - 7)) - 1 + self.program_data[-1].append({ + 'id': block_id, + 'tdi': o.tdi & mask, + 'length': o.length - 7, + }) + elif self.tap_instruction == 'verify': + assert(o.length in (self.id_bits, self.block_bits)) + + if o.length == self.id_bits: + assert(o.smask == ((1 << self.id_bits) - 1)) + assert(o.tdo is None) + assert(o.mask is None) + self.verify_block_id = o.tdi + + elif o.length == self.block_bits: + assert(o.tdi == (1 << o.length) - 1) + assert(o.smask == (1 << o.length) - 1) + self.verify_data[-1].append({ + 'id': self.verify_block_id, + 'tdo': o.tdo, + 'mask': o.mask, + 'length': o.length, + }) + self.verify_block_id = None + +program_extractor = ProgramExtractor() + +parser = SVFParser() +parser.parse(f, program_extractor.map()) + +def has_all_blocks(blocks): + ordinals = set() + + for block in blocks: + ordinal = int(bin(block['id'])[2:].zfill(7)[::-1], 2) + ordinals.add(ordinal) + + return ordinals == program_extractor.block_ordinals + +def is_verify_blank(blocks): + for block in blocks: + length = block['length'] + mask = (1 << length) - 1 + if block['tdo'] != mask: + return False + if block['mask'] != mask: + return False + return True + +def deduplicate(passes): + result = [passes[0]] + for this_pass in passes[1:]: + if this_pass != result[0]: + result.append(this_pass) + return result + +def program_and_verify_match(program, verify): + for program_block, verify_block in zip(program, verify): + if program_block['tdi'] != verify_block['tdo']: + return False + return True + +program_passes = [blocks for blocks in program_extractor.program_data if has_all_blocks(blocks)] +program_done = [blocks for blocks in program_extractor.program_data if len(blocks) == 1][0] +if len(program_passes) == 0: + raise RuntimeError('no complete program passes') +if len(program_passes) > 1: + raise RuntimeError('too many program passes') +program = program_passes[0] + +verify_passes = [blocks for blocks in program_extractor.verify_data if has_all_blocks(blocks) and not is_verify_blank(blocks)] +verify_passes = deduplicate(verify_passes) +if len(verify_passes) == 0: + raise RuntimeError('no complete verify passes') +if len(verify_passes) > 1: + raise RuntimeError('too many verify passes') +verify = verify_passes[0] + +if not program_and_verify_match(program, verify): + raise RuntimeError('program and verify data do not match') + +class FileGen(object): + def comment_header(self): + return ['/*' , ' * WARNING: Auto-generated file. Do not edit.', '*/'] + + def includes(self, filenames): + return ['#include "%s"' % filename for filename in filenames] + + def _namespaces(self, ns_list, line_format): + return [line_format % ns for ns in ns_list] + + def namespaces_start(self, ns_list): + return self._namespaces(ns_list, 'namespace %s {') + + def namespaces_end(self, ns_list): + return self._namespaces(ns_list, '} /* namespace %s */') + + def verify_block(self, block): + tdo_bytes = long_int_to_bytes(block['tdo'], block['length']) + mask_bytes = long_int_to_bytes(block['mask'], block['length']) + tdo_cpp_s = ', '.join(['0x%02x' % b for b in tdo_bytes]); + mask_cpp_s = ', '.join(['0x%02x' % b for b in mask_bytes]); + return '\t{ 0x%02x, { { %s } }, { { %s } } },' % (block['id'], tdo_cpp_s, mask_cpp_s) + + def verify_blocks_declaration(self, type_name, variable_name): + return ['extern const %s %s;' % (type_name, variable_name)] + + def verify_blocks_definition(self, type_name, variable_name, blocks): + return ['const %s %s { {' % (type_name, variable_name)] \ + + [self.verify_block(block) for block in blocks] \ + + ['} };'] + + # def cpp_program_t(block): + # tdi_bytes = long_int_to_bytes(block['tdi'], block['length']) + # tdi_cpp_s = ', '.join(['0x%02x' % b for b in tdi_bytes]); + # return '0x%02x, { { %s } }' % (block['id'], tdi_cpp_s) + + def __repr__(self): + return '\n'.join(self.lines) + + def to_file(self, file_path): + f = open(file_path, 'w') + f.write(str(self)) + f.close() + +class HeaderGen(FileGen): + def __init__(self, includes, namespaces, type_name, variable_name): + self.lines = self.comment_header() \ + + self.includes(includes) \ + + self.namespaces_start(namespaces) \ + + self.verify_blocks_declaration(type_name, variable_name) \ + + self.namespaces_end(namespaces) \ + + [''] + +class DataGen(FileGen): + def __init__(self, includes, namespaces, type_name, variable_name, verify_blocks): + self.lines = self.comment_header() \ + + self.includes(includes) \ + + self.namespaces_start(namespaces) \ + + self.verify_blocks_definition(type_name, variable_name, verify_blocks) \ + + self.namespaces_end(namespaces) \ + + [''] + +# Tricky (a.k.a. "brittle") code to set DONE bit +for block in verify: + if block['id'] == 0x05: + block['tdo'] = program_done[0]['tdi'] + +header_file_name = os.path.split(args.header_file_path)[1] + +header_includes = ('cpld_xilinx.hpp',) +data_includes = (header_file_name,) + +type_name = '::cpld::xilinx::XC2C64A::verify_blocks_t' + +HeaderGen(header_includes, namespaces, type_name, variable_name).to_file(args.header_file_path) +DataGen(data_includes, namespaces, type_name, variable_name, verify).to_file(args.data_file_path) diff --git a/firmware/tools/make_image_chunk.py b/firmware/tools/make_image_chunk.py new file mode 100755 index 00000000..ed3463bc --- /dev/null +++ b/firmware/tools/make_image_chunk.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python + +# +# Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. +# +# This file is part of PortaPack. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +import sys +import struct + +usage_message = """ +PortaPack image chunk writer + +Usage: +""" + +def read_image(path): + f = open(path, 'rb') + data = f.read() + f.close() + return data + +def write_image(data, path): + f = open(path, 'wb') + f.write(data) + f.close() + +if len(sys.argv) == 4: + input_image = read_image(sys.argv[1]) + tag = tuple(map(ord, sys.argv[2])) + output_path = sys.argv[3] +elif len(sys.argv) == 2: + input_image = bytearray() + tag = (0, 0, 0, 0) + output_path = sys.argv[1] +else: + print(usage_message) + sys.exit(-1) + +if len(tag) != 4: + print(usage_message) + sys.exit(-2) + +input_image_max_length = 32768 +if len(input_image) > input_image_max_length: + raise RuntimeError('image size of %d exceeds device size of %d bytes' % (len(input_image), input_image_max_length)) +if (len(input_image) & 3) != 0: + raise RuntimeError('image size of %d is not multiple of four' % (len(input_image,))) + +output_image = bytearray() +output_image += struct.pack('<4BI', tag[0], tag[1], tag[2], tag[3], len(input_image)) +output_image += input_image + +write_image(output_image, output_path) diff --git a/firmware/tools/make_spi_image.py b/firmware/tools/make_spi_image.py index 646fa59e..d5d98328 100755 --- a/firmware/tools/make_spi_image.py +++ b/firmware/tools/make_spi_image.py @@ -26,7 +26,7 @@ import sys usage_message = """ PortaPack SPI flash image generator -Usage: +Usage: Where paths refer to the .bin files for each component project. """ @@ -36,25 +36,19 @@ def read_image(path): f.close() return data -def read_image_from_dfu(path): - data = read_image(path) - # Strip DFU header from file to get binary image. - return data[16:] - def write_image(data, path): f = open(path, 'wb') f.write(data) f.close() -if len(sys.argv) != 6: +if len(sys.argv) != 5: print(usage_message) sys.exit(-1) bootstrap_image = read_image(sys.argv[1]) -hackrf_image = read_image_from_dfu(sys.argv[2]) -baseband_image = read_image(sys.argv[3]) -application_image = read_image(sys.argv[4]) -output_path = sys.argv[5] +baseband_image = read_image(sys.argv[2]) +application_image = read_image(sys.argv[3]) +output_path = sys.argv[4] spi_size = 1048576 @@ -64,15 +58,10 @@ images = ( 'data': bootstrap_image, 'size': 0x10000, }, - { - 'name': 'hackrf', - 'data': hackrf_image, - 'size': 0x10000, - }, { 'name': 'baseband', 'data': baseband_image, - 'size': 0x20000, + 'size': 0x30000, }, { 'name': 'application', diff --git a/firmware/tools/strip_dfu.py b/firmware/tools/strip_dfu.py new file mode 100755 index 00000000..d3a9d8eb --- /dev/null +++ b/firmware/tools/strip_dfu.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +# +# Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. +# +# This file is part of PortaPack. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not, write to +# the Free Software Foundation, Inc., 51 Franklin Street, +# Boston, MA 02110-1301, USA. +# + +import sys + +usage_message = """ +PortaPack DFU header stripper + +Usage: +""" + +def read_image(path): + f = open(path, 'rb') + data = f.read() + f.close() + return data + +def read_image_from_dfu(path): + data = read_image(path) + # Strip DFU header from file to get binary image. + return data[16:] + +def write_image(data, path): + f = open(path, 'wb') + f.write(data) + f.close() + +if len(sys.argv) != 3: + print(usage_message) + sys.exit(-1) + +dfu_image = read_image_from_dfu(sys.argv[1]) +output_path = sys.argv[2] + +write_image(dfu_image, output_path) diff --git a/hardware/.gitignore b/hardware/.gitignore new file mode 100644 index 00000000..ddc0d214 --- /dev/null +++ b/hardware/.gitignore @@ -0,0 +1,19 @@ +# Common +*.bak + +# CPLD tool +*.bsd +*.rpt +tb2_ie_info.xml +**/cpld/db/ +**/cpld/incremental_db/ +**/cpld/output_files/*.done +**/cpld/output_files/*.smsg +**/cpld/output_files/*.summary +**/cpld/output_files/*.jdi +**/cpld/output_files/*.pin +**/cpld/output_files/*.pof +**/cpld/simulation/ + +# KiCad +*.kicad_pcb-bak diff --git a/hardware/portapack_h1/cpld/output_files/portapack_h1_cpld.svf b/hardware/portapack_h1/cpld/output_files/portapack_h1_cpld.svf new file mode 100644 index 00000000..c039e066 --- /dev/null +++ b/hardware/portapack_h1/cpld/output_files/portapack_h1_cpld.svf @@ -0,0 +1,11646 @@ +!Copyright (C) 1991-2014 Altera Corporation. All rights reserved. +!Your use of Altera Corporation's design tools, logic functions +!and other software and tools, and its AMPP partner logic +!functions, and any output files from any of the foregoing +!(including device programming or simulation files), and any +!associated documentation or information are expressly subject +!to the terms and conditions of the Altera Program License +!Subscription Agreement, the Altera Quartus II License Agreement, +!the Altera MegaCore Function License Agreement, or other +!applicable license agreement, including, without limitation, +!that your use is for the sole purpose of programming logic +!devices manufactured by Altera and sold by Altera or its +!authorized distributors. Please refer to the applicable +!agreement for further details. +! +!Quartus II SVF converter 14.1 +! +!Device #1: 5M40Z - /mnt/hgfs/src/portapack-hackrf/hardware/portapack_h1/cpld/output_files/portapack_h1_cpld.pof Fri Aug 21 12:12:34 2015 +! +!NOTE "USERCODE" "0018AF0E"; +! +!NOTE "CHECKSUM" "0018B286"; +! +! +! +FREQUENCY 1.80E+07 HZ; +! +! +! +TRST ABSENT; +ENDDR IDLE; +ENDIR IRPAUSE; +STATE IDLE; +SIR 10 TDI (2CC); +RUNTEST IDLE 18003 TCK ENDSTATE IDLE; +! +! +! +!CHECKING SILICON ID +! +! +! +SIR 10 TDI (203); +RUNTEST 93 TCK; +SDR 13 TDI (0089); +SIR 10 TDI (205); +RUNTEST 93 TCK; +SDR 16 TDI (FFFF) TDO (8232) MASK (FFFF); +SDR 16 TDI (FFFF) TDO (2AA2); +SDR 16 TDI (FFFF) TDO (4A82); +SDR 16 TDI (FFFF) TDO (8C0C); +SDR 16 TDI (FFFF) TDO (0000); +! +! +! +!BULK ERASE +! +! +! +SIR 10 TDI (203); +RUNTEST 93 TCK; +SDR 13 TDI (0011); +SIR 10 TDI (2F2); +RUNTEST 9000003 TCK; +SIR 10 TDI (203); +RUNTEST 93 TCK; +SDR 13 TDI (0001); +SIR 10 TDI (2F2); +RUNTEST 9000003 TCK; +SIR 10 TDI (203); +RUNTEST 93 TCK; +SDR 13 TDI (0000); +SIR 10 TDI (2F2); +RUNTEST 9000003 TCK; +! +! +! +!PROGRAM +! +! +! +SIR 10 TDI (203); +RUNTEST 93 TCK; +SDR 13 TDI (0000); +SIR 10 TDI (2F4); +RUNTEST 93 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFC); +RUNTEST 1800 TCK; +SDR 16 TDI (F9E7); +RUNTEST 1800 TCK; +SDR 16 TDI (79FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (AF9E); +RUNTEST 1800 TCK; +SDR 16 TDI (7CFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBE7); +RUNTEST 1800 TCK; +SDR 16 TDI (B3F7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7F3F); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFB); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (67FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (E7F9); +RUNTEST 1800 TCK; +SDR 16 TDI (723F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF9); +RUNTEST 1800 TCK; +SDR 16 TDI (B77F); +RUNTEST 1800 TCK; +SDR 16 TDI (CCCF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B99F); +RUNTEST 1800 TCK; +SDR 16 TDI (BCCC); +RUNTEST 1800 TCK; +SDR 16 TDI (CFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEB); +RUNTEST 1800 TCK; +SDR 16 TDI (77F3); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFE6); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFE); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDB); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF5); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7EFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDBB); +RUNTEST 1800 TCK; +SDR 16 TDI (77EF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7EEF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEF7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7EF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7EFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B5FD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (ADFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF5F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F6FF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBCB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FAFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFD5); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (A55F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (DEEF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEB); +RUNTEST 1800 TCK; +SDR 16 TDI (6BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B55F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BABF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFB); +RUNTEST 1800 TCK; +SDR 16 TDI (F9BF); +RUNTEST 1800 TCK; +SDR 16 TDI (BAFE); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDE); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (35FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FD2); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBC); +RUNTEST 1800 TCK; +SDR 16 TDI (C7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7AF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DDEE); +RUNTEST 1800 TCK; +SDR 16 TDI (B9FF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFD); +RUNTEST 1800 TCK; +SDR 16 TDI (EA9F); +RUNTEST 1800 TCK; +SDR 16 TDI (BEFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEAF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFD); +RUNTEST 1800 TCK; +SDR 16 TDI (0DDF); +RUNTEST 1800 TCK; +SDR 16 TDI (B598); +RUNTEST 1800 TCK; +SDR 16 TDI (5E74); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B65F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFC); +RUNTEST 1800 TCK; +SDR 16 TDI (0DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (BD99); +RUNTEST 1800 TCK; +SDR 16 TDI (1E6A); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7F08); +RUNTEST 1800 TCK; +SDR 16 TDI (388F); +RUNTEST 1800 TCK; +SDR 16 TDI (B89E); +RUNTEST 1800 TCK; +SDR 16 TDI (887F); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B6F7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7F0C); +RUNTEST 1800 TCK; +SDR 16 TDI (388F); +RUNTEST 1800 TCK; +SDR 16 TDI (B89F); +RUNTEST 1800 TCK; +SDR 16 TDI (983B); +RUNTEST 1800 TCK; +SDR 16 TDI (67FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (3333); +RUNTEST 1800 TCK; +SDR 16 TDI (63E6); +RUNTEST 1800 TCK; +SDR 16 TDI (6667); +RUNTEST 1800 TCK; +SDR 16 TDI (B333); +RUNTEST 1800 TCK; +SDR 16 TDI (31F3); +RUNTEST 1800 TCK; +SDR 16 TDI (6666); +RUNTEST 1800 TCK; +SDR 16 TDI (7CCC); +RUNTEST 1800 TCK; +SDR 16 TDI (B98F); +RUNTEST 1800 TCK; +SDR 16 TDI (9999); +RUNTEST 1800 TCK; +SDR 16 TDI (73E8); +RUNTEST 1800 TCK; +SDR 16 TDI (C445); +RUNTEST 1800 TCK; +SDR 16 TDI (B938); +RUNTEST 1800 TCK; +SDR 16 TDI (88FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (6957); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (B777); +RUNTEST 1800 TCK; +SDR 16 TDI (74AB); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (7DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (BBA5); +RUNTEST 1800 TCK; +SDR 16 TDI (5DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (7BCD); +RUNTEST 1800 TCK; +SDR 16 TDI (DCCA); +RUNTEST 1800 TCK; +SDR 16 TDI (B19D); +RUNTEST 1800 TCK; +SDR 16 TDI (DDFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (E66F); +RUNTEST 1800 TCK; +SDR 16 TDI (B37F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDE); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FEB); +RUNTEST 1800 TCK; +SDR 16 TDI (EEDF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FCFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EEEE); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FBBF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFA); +RUNTEST 1800 TCK; +SDR 16 TDI (EFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDD); +RUNTEST 1800 TCK; +SDR 16 TDI (FD7A); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEBE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FB7F); +RUNTEST 1800 TCK; +SDR 16 TDI (BF9F); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BAFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFDE); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFB); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFF3); +RUNTEST 1800 TCK; +SDR 16 TDI (BBF7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (BEAF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBE); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDEE); +RUNTEST 1800 TCK; +SDR 16 TDI (B7F7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBEF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFE); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEDF); +RUNTEST 1800 TCK; +SDR 16 TDI (6DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (ADBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFD7); +RUNTEST 1800 TCK; +SDR 16 TDI (6EFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BADF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BD7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBF9); +RUNTEST 1800 TCK; +SDR 16 TDI (B3FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BE5F); +RUNTEST 1800 TCK; +SDR 16 TDI (FF77); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFD); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEEE); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FB3B); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEA); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (D7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBAF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF4); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDAF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7BA); +RUNTEST 1800 TCK; +SDR 16 TDI (B37F); +RUNTEST 1800 TCK; +SDR 16 TDI (EEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF3); +RUNTEST 1800 TCK; +SDR 16 TDI (7EFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7F7F); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F76F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFB7); +RUNTEST 1800 TCK; +SDR 16 TDI (6EFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FCDE); +RUNTEST 1800 TCK; +SDR 16 TDI (BDBF); +RUNTEST 1800 TCK; +SDR 16 TDI (DF8D); +RUNTEST 1800 TCK; +SDR 16 TDI (7AFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B5AF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (6F7F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBAD); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (F77B); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEE); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBF7); +RUNTEST 1800 TCK; +SDR 16 TDI (7F7F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F77B); +RUNTEST 1800 TCK; +SDR 16 TDI (B37F); +RUNTEST 1800 TCK; +SDR 16 TDI (ECF6); +RUNTEST 1800 TCK; +SDR 16 TDI (6DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFAF); +RUNTEST 1800 TCK; +SDR 16 TDI (3000); +RUNTEST 1800 TCK; +SDR 16 TDI (67C0); +RUNTEST 1800 TCK; +SDR 16 TDI (061F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FCCD); +RUNTEST 1800 TCK; +SDR 16 TDI (BBB7); +RUNTEST 1800 TCK; +SDR 16 TDI (7F99); +RUNTEST 1800 TCK; +SDR 16 TDI (7CFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (6BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (3000); +RUNTEST 1800 TCK; +SDR 16 TDI (66E0); +RUNTEST 1800 TCK; +SDR 16 TDI (0601); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FCCD); +RUNTEST 1800 TCK; +SDR 16 TDI (BBBE); +RUNTEST 1800 TCK; +SDR 16 TDI (D519); +RUNTEST 1800 TCK; +SDR 16 TDI (7CFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BD5F); +RUNTEST 1800 TCK; +SDR 16 TDI (3000); +RUNTEST 1800 TCK; +SDR 16 TDI (67E0); +RUNTEST 1800 TCK; +SDR 16 TDI (061F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FCC8); +RUNTEST 1800 TCK; +SDR 16 TDI (B11F); +RUNTEST 1800 TCK; +SDR 16 TDI (CC99); +RUNTEST 1800 TCK; +SDR 16 TDI (78FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (6BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (3000); +RUNTEST 1800 TCK; +SDR 16 TDI (67E0); +RUNTEST 1800 TCK; +SDR 16 TDI (0601); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F698); +RUNTEST 1800 TCK; +SDR 16 TDI (B11F); +RUNTEST 1800 TCK; +SDR 16 TDI (8033); +RUNTEST 1800 TCK; +SDR 16 TDI (6EFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (BBBB); +RUNTEST 1800 TCK; +SDR 16 TDI (73EE); +RUNTEST 1800 TCK; +SDR 16 TDI (6EE7); +RUNTEST 1800 TCK; +SDR 16 TDI (B333); +RUNTEST 1800 TCK; +SDR 16 TDI (31F3); +RUNTEST 1800 TCK; +SDR 16 TDI (6666); +RUNTEST 1800 TCK; +SDR 16 TDI (78C6); +RUNTEST 1800 TCK; +SDR 16 TDI (ACCF); +RUNTEST 1800 TCK; +SDR 16 TDI (B318); +RUNTEST 1800 TCK; +SDR 16 TDI (7BCC); +RUNTEST 1800 TCK; +SDR 16 TDI (CCC7); +RUNTEST 1800 TCK; +SDR 16 TDI (B999); +RUNTEST 1800 TCK; +SDR 16 TDI (99FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (3333); +RUNTEST 1800 TCK; +SDR 16 TDI (6546); +RUNTEST 1800 TCK; +SDR 16 TDI (6667); +RUNTEST 1800 TCK; +SDR 16 TDI (B777); +RUNTEST 1800 TCK; +SDR 16 TDI (74AB); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (7D9C); +RUNTEST 1800 TCK; +SDR 16 TDI (B995); +RUNTEST 1800 TCK; +SDR 16 TDI (19CD); +RUNTEST 1800 TCK; +SDR 16 TDI (79DD); +RUNTEST 1800 TCK; +SDR 16 TDI (DDD2); +RUNTEST 1800 TCK; +SDR 16 TDI (B5DD); +RUNTEST 1800 TCK; +SDR 16 TDI (DDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FDDD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDD); +RUNTEST 1800 TCK; +SDR 16 TDI (DFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF6); +RUNTEST 1800 TCK; +SDR 16 TDI (ACFF); +RUNTEST 1800 TCK; +SDR 16 TDI (337F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBDF); +RUNTEST 1800 TCK; +SDR 16 TDI (DDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDDF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDD); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDD); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEDF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (77BF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B77F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (79FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7BF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (75FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (A59F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (69FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AB7F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (6BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BABF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (3333); +RUNTEST 1800 TCK; +SDR 16 TDI (63E6); +RUNTEST 1800 TCK; +SDR 16 TDI (6667); +RUNTEST 1800 TCK; +SDR 16 TDI (B333); +RUNTEST 1800 TCK; +SDR 16 TDI (31F3); +RUNTEST 1800 TCK; +SDR 16 TDI (6666); +RUNTEST 1800 TCK; +SDR 16 TDI (7CCC); +RUNTEST 1800 TCK; +SDR 16 TDI (B98F); +RUNTEST 1800 TCK; +SDR 16 TDI (9999); +RUNTEST 1800 TCK; +SDR 16 TDI (73CC); +RUNTEST 1800 TCK; +SDR 16 TDI (CCC7); +RUNTEST 1800 TCK; +SDR 16 TDI (B999); +RUNTEST 1800 TCK; +SDR 16 TDI (99FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7BF); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (6957); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (B777); +RUNTEST 1800 TCK; +SDR 16 TDI (74AB); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (7DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (BBA5); +RUNTEST 1800 TCK; +SDR 16 TDI (5DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (7BDD); +RUNTEST 1800 TCK; +SDR 16 TDI (DDD2); +RUNTEST 1800 TCK; +SDR 16 TDI (B5DD); +RUNTEST 1800 TCK; +SDR 16 TDI (DDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AD5F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (69FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (ABFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BD9F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (69FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B6BF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (75FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFAF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B6AF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B9FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEB); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BF5F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BE9F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (3333); +RUNTEST 1800 TCK; +SDR 16 TDI (63E6); +RUNTEST 1800 TCK; +SDR 16 TDI (6667); +RUNTEST 1800 TCK; +SDR 16 TDI (B333); +RUNTEST 1800 TCK; +SDR 16 TDI (31F3); +RUNTEST 1800 TCK; +SDR 16 TDI (6666); +RUNTEST 1800 TCK; +SDR 16 TDI (7CCC); +RUNTEST 1800 TCK; +SDR 16 TDI (B98F); +RUNTEST 1800 TCK; +SDR 16 TDI (9999); +RUNTEST 1800 TCK; +SDR 16 TDI (73CC); +RUNTEST 1800 TCK; +SDR 16 TDI (CCC7); +RUNTEST 1800 TCK; +SDR 16 TDI (B999); +RUNTEST 1800 TCK; +SDR 16 TDI (99FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (6957); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (B777); +RUNTEST 1800 TCK; +SDR 16 TDI (74AB); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (7DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (BBA5); +RUNTEST 1800 TCK; +SDR 16 TDI (5DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (7BDD); +RUNTEST 1800 TCK; +SDR 16 TDI (DDD2); +RUNTEST 1800 TCK; +SDR 16 TDI (B5DD); +RUNTEST 1800 TCK; +SDR 16 TDI (DDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF5F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBF7); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFEA); +RUNTEST 1800 TCK; +SDR 16 TDI (75FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDB); +RUNTEST 1800 TCK; +SDR 16 TDI (B5FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B6AF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (6BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7AF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (6BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDAF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEA); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (4FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BAFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEE); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (A55F); +RUNTEST 1800 TCK; +SDR 16 TDI (FEBF); +RUNTEST 1800 TCK; +SDR 16 TDI (67C6); +RUNTEST 1800 TCK; +SDR 16 TDI (1EBF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (67FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (C2BF); +RUNTEST 1800 TCK; +SDR 16 TDI (47A6); +RUNTEST 1800 TCK; +SDR 16 TDI (1EBF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B55F); +RUNTEST 1800 TCK; +SDR 16 TDI (FE7F); +RUNTEST 1800 TCK; +SDR 16 TDI (67E6); +RUNTEST 1800 TCK; +SDR 16 TDI (1F3F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (67FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (C27F); +RUNTEST 1800 TCK; +SDR 16 TDI (47E6); +RUNTEST 1800 TCK; +SDR 16 TDI (1F3F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (3BB3); +RUNTEST 1800 TCK; +SDR 16 TDI (73EE); +RUNTEST 1800 TCK; +SDR 16 TDI (E6E7); +RUNTEST 1800 TCK; +SDR 16 TDI (B333); +RUNTEST 1800 TCK; +SDR 16 TDI (31F3); +RUNTEST 1800 TCK; +SDR 16 TDI (4666); +RUNTEST 1800 TCK; +SDR 16 TDI (7CCC); +RUNTEST 1800 TCK; +SDR 16 TDI (B98F); +RUNTEST 1800 TCK; +SDR 16 TDI (9999); +RUNTEST 1800 TCK; +SDR 16 TDI (73CC); +RUNTEST 1800 TCK; +SDR 16 TDI (CCC7); +RUNTEST 1800 TCK; +SDR 16 TDI (B999); +RUNTEST 1800 TCK; +SDR 16 TDI (99FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7337); +RUNTEST 1800 TCK; +SDR 16 TDI (4546); +RUNTEST 1800 TCK; +SDR 16 TDI (7677); +RUNTEST 1800 TCK; +SDR 16 TDI (B777); +RUNTEST 1800 TCK; +SDR 16 TDI (74AB); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (7DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (BBA5); +RUNTEST 1800 TCK; +SDR 16 TDI (5DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (7BDD); +RUNTEST 1800 TCK; +SDR 16 TDI (DDD2); +RUNTEST 1800 TCK; +SDR 16 TDI (B5DD); +RUNTEST 1800 TCK; +SDR 16 TDI (DDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (8FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (4FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9F7F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (77EE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (A55F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (A55F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AAFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BAFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEE); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (855F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (97FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (4BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B55F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (6BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (3333); +RUNTEST 1800 TCK; +SDR 16 TDI (43E6); +RUNTEST 1800 TCK; +SDR 16 TDI (6667); +RUNTEST 1800 TCK; +SDR 16 TDI (B333); +RUNTEST 1800 TCK; +SDR 16 TDI (31F3); +RUNTEST 1800 TCK; +SDR 16 TDI (6666); +RUNTEST 1800 TCK; +SDR 16 TDI (7CCC); +RUNTEST 1800 TCK; +SDR 16 TDI (B98F); +RUNTEST 1800 TCK; +SDR 16 TDI (9999); +RUNTEST 1800 TCK; +SDR 16 TDI (73CC); +RUNTEST 1800 TCK; +SDR 16 TDI (CCC7); +RUNTEST 1800 TCK; +SDR 16 TDI (B999); +RUNTEST 1800 TCK; +SDR 16 TDI (99FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (6957); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (B777); +RUNTEST 1800 TCK; +SDR 16 TDI (74AB); +RUNTEST 1800 TCK; +SDR 16 TDI (7777); +RUNTEST 1800 TCK; +SDR 16 TDI (7DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (BBA5); +RUNTEST 1800 TCK; +SDR 16 TDI (5DDD); +RUNTEST 1800 TCK; +SDR 16 TDI (7BDD); +RUNTEST 1800 TCK; +SDR 16 TDI (DDD2); +RUNTEST 1800 TCK; +SDR 16 TDI (B5DD); +RUNTEST 1800 TCK; +SDR 16 TDI (DDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7E); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFD); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (77EF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFD); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEF1); +RUNTEST 1800 TCK; +SDR 16 TDI (67E7); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FED); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (53FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF9); +RUNTEST 1800 TCK; +SDR 16 TDI (B77F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B99F); +RUNTEST 1800 TCK; +SDR 16 TDI (BCCF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFC); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF3); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (AF9E); +RUNTEST 1800 TCK; +SDR 16 TDI (7CFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE7); +RUNTEST 1800 TCK; +SDR 16 TDI (93E7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5F3E); +RUNTEST 1800 TCK; +SDR 16 TDI (79F3); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SIR 10 TDI (203); +RUNTEST 93 TCK; +SDR 13 TDI (0001); +SIR 10 TDI (2F4); +RUNTEST 93 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +! +! +! +!VERIFY +! +! +! +SIR 10 TDI (203); +RUNTEST 93 TCK; +SDR 13 TDI (0000); +SIR 10 TDI (205); +RUNTEST 93 TCK; +SDR 16 TDI (FFFF) TDO (7FFF) MASK (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFC); +SDR 16 TDI (FFFF) TDO (F9E7); +SDR 16 TDI (FFFF) TDO (79FF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (AF9E); +SDR 16 TDI (FFFF) TDO (7CFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBE7); +SDR 16 TDI (FFFF) TDO (B3F7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7F3F); +SDR 16 TDI (FFFF) TDO (7DFB); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (67FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FEFD); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (E7F9); +SDR 16 TDI (FFFF) TDO (723F); +SDR 16 TDI (FFFF) TDO (FFF9); +SDR 16 TDI (FFFF) TDO (B77F); +SDR 16 TDI (FFFF) TDO (CCCF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (B99F); +SDR 16 TDI (FFFF) TDO (BCCC); +SDR 16 TDI (FFFF) TDO (CFFE); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEB); +SDR 16 TDI (FFFF) TDO (77F3); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFE6); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FBFE); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFEF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDB); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF5); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7EFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FDBB); +SDR 16 TDI (FFFF) TDO (77EF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7EEF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FEF7); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7EF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7EFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FEFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B5FD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (ADFF); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (7FFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFEF); +SDR 16 TDI (FFFF) TDO (FF5F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (F6FF); +SDR 16 TDI (FFFF) TDO (BBCB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FAFF); +SDR 16 TDI (FFFF) TDO (BFD5); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (A55F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (DEEF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFB); +SDR 16 TDI (FFFF) TDO (FFEB); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B55F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (DFF5); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BABF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFB); +SDR 16 TDI (FFFF) TDO (F9BF); +SDR 16 TDI (FFFF) TDO (BAFE); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFE); +SDR 16 TDI (FFFF) TDO (FFDE); +SDR 16 TDI (FFFF) TDO (BFDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (35FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FD2); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFBC); +SDR 16 TDI (FFFF) TDO (C7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7AF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (DDEE); +SDR 16 TDI (FFFF) TDO (B9FF); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFD); +SDR 16 TDI (FFFF) TDO (EA9F); +SDR 16 TDI (FFFF) TDO (BEFB); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEAF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFD); +SDR 16 TDI (FFFF) TDO (0DDF); +SDR 16 TDI (FFFF) TDO (B598); +SDR 16 TDI (FFFF) TDO (5E74); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B65F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFC); +SDR 16 TDI (FFFF) TDO (0DDD); +SDR 16 TDI (FFFF) TDO (BD99); +SDR 16 TDI (FFFF) TDO (1E6A); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7F08); +SDR 16 TDI (FFFF) TDO (388F); +SDR 16 TDI (FFFF) TDO (B89E); +SDR 16 TDI (FFFF) TDO (887F); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B6F7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7F0C); +SDR 16 TDI (FFFF) TDO (388F); +SDR 16 TDI (FFFF) TDO (B89F); +SDR 16 TDI (FFFF) TDO (983B); +SDR 16 TDI (FFFF) TDO (67FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (3333); +SDR 16 TDI (FFFF) TDO (63E6); +SDR 16 TDI (FFFF) TDO (6667); +SDR 16 TDI (FFFF) TDO (B333); +SDR 16 TDI (FFFF) TDO (31F3); +SDR 16 TDI (FFFF) TDO (6666); +SDR 16 TDI (FFFF) TDO (7CCC); +SDR 16 TDI (FFFF) TDO (B98F); +SDR 16 TDI (FFFF) TDO (9999); +SDR 16 TDI (FFFF) TDO (73E8); +SDR 16 TDI (FFFF) TDO (C445); +SDR 16 TDI (FFFF) TDO (B938); +SDR 16 TDI (FFFF) TDO (88FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (6957); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (B777); +SDR 16 TDI (FFFF) TDO (74AB); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (7DDD); +SDR 16 TDI (FFFF) TDO (BBA5); +SDR 16 TDI (FFFF) TDO (5DDD); +SDR 16 TDI (FFFF) TDO (7BCD); +SDR 16 TDI (FFFF) TDO (DCCA); +SDR 16 TDI (FFFF) TDO (B19D); +SDR 16 TDI (FFFF) TDO (DDFB); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (E66F); +SDR 16 TDI (FFFF) TDO (B37F); +SDR 16 TDI (FFFF) TDO (FFDE); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FEB); +SDR 16 TDI (FFFF) TDO (EEDF); +SDR 16 TDI (FFFF) TDO (BFDF); +SDR 16 TDI (FFFF) TDO (FCFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (EEEE); +SDR 16 TDI (FFFF) TDO (7FFB); +SDR 16 TDI (FFFF) TDO (FBBF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFA); +SDR 16 TDI (FFFF) TDO (EFDF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FEF); +SDR 16 TDI (FFFF) TDO (FEFF); +SDR 16 TDI (FFFF) TDO (BFDD); +SDR 16 TDI (FFFF) TDO (FD7A); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEBE); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FB7F); +SDR 16 TDI (FFFF) TDO (BF9F); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFEF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BAFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DFDE); +SDR 16 TDI (FFFF) TDO (7FFB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FD); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FDFB); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EDFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFF3); +SDR 16 TDI (FFFF) TDO (BBF7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (BEAF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (BFBE); +SDR 16 TDI (FFFF) TDO (7FFB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDEE); +SDR 16 TDI (FFFF) TDO (B7F7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBEF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBFE); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FEDF); +SDR 16 TDI (FFFF) TDO (6DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (EFDF); +SDR 16 TDI (FFFF) TDO (7FEF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (ADBF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFD7); +SDR 16 TDI (FFFF) TDO (6EFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BADF); +SDR 16 TDI (FFFF) TDO (7BD7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBF9); +SDR 16 TDI (FFFF) TDO (B3FF); +SDR 16 TDI (FFFF) TDO (FEFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BE5F); +SDR 16 TDI (FFFF) TDO (FF77); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FEFD); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FEEE); +SDR 16 TDI (FFFF) TDO (BFBF); +SDR 16 TDI (FFFF) TDO (FB3B); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEA); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (D7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBAF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF4); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDAF); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (F7BA); +SDR 16 TDI (FFFF) TDO (B37F); +SDR 16 TDI (FFFF) TDO (EEFF); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FEFF); +SDR 16 TDI (FFFF) TDO (BFBF); +SDR 16 TDI (FFFF) TDO (FFF3); +SDR 16 TDI (FFFF) TDO (7EFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7F7F); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (F76F); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFB7); +SDR 16 TDI (FFFF) TDO (6EFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FCDE); +SDR 16 TDI (FFFF) TDO (BDBF); +SDR 16 TDI (FFFF) TDO (DF8D); +SDR 16 TDI (FFFF) TDO (7AFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B5AF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (6FF7); +SDR 16 TDI (FFFF) TDO (6F7F); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBAD); +SDR 16 TDI (FFFF) TDO (BFDF); +SDR 16 TDI (FFFF) TDO (F77B); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEE); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FBF7); +SDR 16 TDI (FFFF) TDO (7F7F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (F77B); +SDR 16 TDI (FFFF) TDO (B37F); +SDR 16 TDI (FFFF) TDO (ECF6); +SDR 16 TDI (FFFF) TDO (6DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFAF); +SDR 16 TDI (FFFF) TDO (3000); +SDR 16 TDI (FFFF) TDO (67C0); +SDR 16 TDI (FFFF) TDO (061F); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FCCD); +SDR 16 TDI (FFFF) TDO (BBB7); +SDR 16 TDI (FFFF) TDO (7F99); +SDR 16 TDI (FFFF) TDO (7CFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (3000); +SDR 16 TDI (FFFF) TDO (66E0); +SDR 16 TDI (FFFF) TDO (0601); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FCCD); +SDR 16 TDI (FFFF) TDO (BBBE); +SDR 16 TDI (FFFF) TDO (D519); +SDR 16 TDI (FFFF) TDO (7CFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BD5F); +SDR 16 TDI (FFFF) TDO (3000); +SDR 16 TDI (FFFF) TDO (67E0); +SDR 16 TDI (FFFF) TDO (061F); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FCC8); +SDR 16 TDI (FFFF) TDO (B11F); +SDR 16 TDI (FFFF) TDO (CC99); +SDR 16 TDI (FFFF) TDO (78FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBFF); +SDR 16 TDI (FFFF) TDO (3000); +SDR 16 TDI (FFFF) TDO (67E0); +SDR 16 TDI (FFFF) TDO (0601); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (F698); +SDR 16 TDI (FFFF) TDO (B11F); +SDR 16 TDI (FFFF) TDO (8033); +SDR 16 TDI (FFFF) TDO (6EFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFF7); +SDR 16 TDI (FFFF) TDO (BBBB); +SDR 16 TDI (FFFF) TDO (73EE); +SDR 16 TDI (FFFF) TDO (6EE7); +SDR 16 TDI (FFFF) TDO (B333); +SDR 16 TDI (FFFF) TDO (31F3); +SDR 16 TDI (FFFF) TDO (6666); +SDR 16 TDI (FFFF) TDO (78C6); +SDR 16 TDI (FFFF) TDO (ACCF); +SDR 16 TDI (FFFF) TDO (B318); +SDR 16 TDI (FFFF) TDO (7BCC); +SDR 16 TDI (FFFF) TDO (CCC7); +SDR 16 TDI (FFFF) TDO (B999); +SDR 16 TDI (FFFF) TDO (99FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (3333); +SDR 16 TDI (FFFF) TDO (6546); +SDR 16 TDI (FFFF) TDO (6667); +SDR 16 TDI (FFFF) TDO (B777); +SDR 16 TDI (FFFF) TDO (74AB); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (7D9C); +SDR 16 TDI (FFFF) TDO (B995); +SDR 16 TDI (FFFF) TDO (19CD); +SDR 16 TDI (FFFF) TDO (79DD); +SDR 16 TDI (FFFF) TDO (DDD2); +SDR 16 TDI (FFFF) TDO (B5DD); +SDR 16 TDI (FFFF) TDO (DDFF); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFB); +SDR 16 TDI (FFFF) TDO (FDDD); +SDR 16 TDI (FFFF) TDO (7FDD); +SDR 16 TDI (FFFF) TDO (DFDF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFF6); +SDR 16 TDI (FFFF) TDO (ACFF); +SDR 16 TDI (FFFF) TDO (337F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBDF); +SDR 16 TDI (FFFF) TDO (DDFF); +SDR 16 TDI (FFFF) TDO (7BBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FDDF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDD); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFBF); +SDR 16 TDI (FFFF) TDO (FFDD); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FEDF); +SDR 16 TDI (FFFF) TDO (BBFF); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (77BF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFBF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFF7); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EEFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B77F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (79FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7BF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (75FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (A59F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (69FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AB7F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BABF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (3333); +SDR 16 TDI (FFFF) TDO (63E6); +SDR 16 TDI (FFFF) TDO (6667); +SDR 16 TDI (FFFF) TDO (B333); +SDR 16 TDI (FFFF) TDO (31F3); +SDR 16 TDI (FFFF) TDO (6666); +SDR 16 TDI (FFFF) TDO (7CCC); +SDR 16 TDI (FFFF) TDO (B98F); +SDR 16 TDI (FFFF) TDO (9999); +SDR 16 TDI (FFFF) TDO (73CC); +SDR 16 TDI (FFFF) TDO (CCC7); +SDR 16 TDI (FFFF) TDO (B999); +SDR 16 TDI (FFFF) TDO (99FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7BF); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (6957); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (B777); +SDR 16 TDI (FFFF) TDO (74AB); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (7DDD); +SDR 16 TDI (FFFF) TDO (BBA5); +SDR 16 TDI (FFFF) TDO (5DDD); +SDR 16 TDI (FFFF) TDO (7BDD); +SDR 16 TDI (FFFF) TDO (DDD2); +SDR 16 TDI (FFFF) TDO (B5DD); +SDR 16 TDI (FFFF) TDO (DDFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AD5F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (69FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (ABFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BD9F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (69FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B6BF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (75FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFAF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B6AF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B9FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFEB); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BF5F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BE9F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (3333); +SDR 16 TDI (FFFF) TDO (63E6); +SDR 16 TDI (FFFF) TDO (6667); +SDR 16 TDI (FFFF) TDO (B333); +SDR 16 TDI (FFFF) TDO (31F3); +SDR 16 TDI (FFFF) TDO (6666); +SDR 16 TDI (FFFF) TDO (7CCC); +SDR 16 TDI (FFFF) TDO (B98F); +SDR 16 TDI (FFFF) TDO (9999); +SDR 16 TDI (FFFF) TDO (73CC); +SDR 16 TDI (FFFF) TDO (CCC7); +SDR 16 TDI (FFFF) TDO (B999); +SDR 16 TDI (FFFF) TDO (99FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFBF); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (6957); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (B777); +SDR 16 TDI (FFFF) TDO (74AB); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (7DDD); +SDR 16 TDI (FFFF) TDO (BBA5); +SDR 16 TDI (FFFF) TDO (5DDD); +SDR 16 TDI (FFFF) TDO (7BDD); +SDR 16 TDI (FFFF) TDO (DDD2); +SDR 16 TDI (FFFF) TDO (B5DD); +SDR 16 TDI (FFFF) TDO (DDFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (BEFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FF5F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BF7F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (6FF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BF7F); +SDR 16 TDI (FFFF) TDO (FEFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFB); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (BBF7); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (DFF7); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFBD); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFEA); +SDR 16 TDI (FFFF) TDO (75FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFDB); +SDR 16 TDI (FFFF) TDO (B5FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B6AF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7AF); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDAF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEA); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (4FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DEFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BAFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFBF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEE); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (A55F); +SDR 16 TDI (FFFF) TDO (FEBF); +SDR 16 TDI (FFFF) TDO (67C6); +SDR 16 TDI (FFFF) TDO (1EBF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (67FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (C2BF); +SDR 16 TDI (FFFF) TDO (47A6); +SDR 16 TDI (FFFF) TDO (1EBF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B55F); +SDR 16 TDI (FFFF) TDO (FE7F); +SDR 16 TDI (FFFF) TDO (67E6); +SDR 16 TDI (FFFF) TDO (1F3F); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (67FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (C27F); +SDR 16 TDI (FFFF) TDO (47E6); +SDR 16 TDI (FFFF) TDO (1F3F); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (3BB3); +SDR 16 TDI (FFFF) TDO (73EE); +SDR 16 TDI (FFFF) TDO (E6E7); +SDR 16 TDI (FFFF) TDO (B333); +SDR 16 TDI (FFFF) TDO (31F3); +SDR 16 TDI (FFFF) TDO (4666); +SDR 16 TDI (FFFF) TDO (7CCC); +SDR 16 TDI (FFFF) TDO (B98F); +SDR 16 TDI (FFFF) TDO (9999); +SDR 16 TDI (FFFF) TDO (73CC); +SDR 16 TDI (FFFF) TDO (CCC7); +SDR 16 TDI (FFFF) TDO (B999); +SDR 16 TDI (FFFF) TDO (99FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7337); +SDR 16 TDI (FFFF) TDO (4546); +SDR 16 TDI (FFFF) TDO (7677); +SDR 16 TDI (FFFF) TDO (B777); +SDR 16 TDI (FFFF) TDO (74AB); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (7DDD); +SDR 16 TDI (FFFF) TDO (BBA5); +SDR 16 TDI (FFFF) TDO (5DDD); +SDR 16 TDI (FFFF) TDO (7BDD); +SDR 16 TDI (FFFF) TDO (DDD2); +SDR 16 TDI (FFFF) TDO (B5DD); +SDR 16 TDI (FFFF) TDO (DDFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BF7F); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (8FFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (4FF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9F7F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (77EE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (A55F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (A55F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AAFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BAFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEE); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (855F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (97FF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (4BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B55F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF5); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (3333); +SDR 16 TDI (FFFF) TDO (43E6); +SDR 16 TDI (FFFF) TDO (6667); +SDR 16 TDI (FFFF) TDO (B333); +SDR 16 TDI (FFFF) TDO (31F3); +SDR 16 TDI (FFFF) TDO (6666); +SDR 16 TDI (FFFF) TDO (7CCC); +SDR 16 TDI (FFFF) TDO (B98F); +SDR 16 TDI (FFFF) TDO (9999); +SDR 16 TDI (FFFF) TDO (73CC); +SDR 16 TDI (FFFF) TDO (CCC7); +SDR 16 TDI (FFFF) TDO (B999); +SDR 16 TDI (FFFF) TDO (99FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (6957); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (B777); +SDR 16 TDI (FFFF) TDO (74AB); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (7DDD); +SDR 16 TDI (FFFF) TDO (BBA5); +SDR 16 TDI (FFFF) TDO (5DDD); +SDR 16 TDI (FFFF) TDO (7BDD); +SDR 16 TDI (FFFF) TDO (DDD2); +SDR 16 TDI (FFFF) TDO (B5DD); +SDR 16 TDI (FFFF) TDO (DDFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FEFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFDF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FEF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFBD); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FF7E); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DBFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFD); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (77EF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFDD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (5FFD); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (BFEF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FEF1); +SDR 16 TDI (FFFF) TDO (67E7); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (9FED); +SDR 16 TDI (FFFF) TDO (EFFD); +SDR 16 TDI (FFFF) TDO (53FF); +SDR 16 TDI (FFFF) TDO (FFF9); +SDR 16 TDI (FFFF) TDO (B77F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (B99F); +SDR 16 TDI (FFFF) TDO (BCCF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFC); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF3); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (AF9E); +SDR 16 TDI (FFFF) TDO (7CFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFE7); +SDR 16 TDI (FFFF) TDO (93E7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5F3E); +SDR 16 TDI (FFFF) TDO (79F3); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SIR 10 TDI (203); +RUNTEST 93 TCK; +SDR 13 TDI (0001); +SIR 10 TDI (205); +RUNTEST 93 TCK; +SDR 16 TDI (FFFF) TDO (FFFF) MASK (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SIR 10 TDI (203); +RUNTEST 93 TCK; +SDR 13 TDI (0000); +SIR 10 TDI (2F4); +RUNTEST 93 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFC); +RUNTEST 1800 TCK; +SDR 16 TDI (F9E7); +RUNTEST 1800 TCK; +SIR 10 TDI (201); +RUNTEST 18003 TCK; +SIR 10 TDI (3FF); +RUNTEST 18000 TCK; +STATE IDLE;