diff --git a/.github/workflows/create_nightly_release.yml b/.github/workflows/create_nightly_release.yml index 0d2e88e3..4ed96367 100644 --- a/.github/workflows/create_nightly_release.yml +++ b/.github/workflows/create_nightly_release.yml @@ -54,19 +54,22 @@ jobs: run: docker run -e VERSION_STRING=${{ steps.version_date.outputs.date }} -i -v ${{ github.workspace }}:/havoc portapack-dev - name: Create Small SD Card ZIP - No World Map run: | - mkdir -p sdcard/FIRMWARE && cp build/firmware/portapack-h1_h2-mayhem.bin sdcard/FIRMWARE/portapack-mayhem_${{ steps.version_date.outputs.date }}.bin && mkdir -p sdcard/APPS && cp build/firmware/application/*.ppma sdcard/APPS && cp build/firmware/standalone/*/*.ppmp sdcard/APPS && cd sdcard && zip -r ../sdcard-no-map.zip . && cd .. + mkdir -p sdcard/FIRMWARE && cp build/firmware/portapack-mayhem-firmware.bin sdcard/FIRMWARE/portapack-mayhem_${{ steps.version_date.outputs.date }}.bin && cp build/firmware/portapack-mayhem_OCI.ppfw.tar sdcard/FIRMWARE/mayhem_nightly_${{ steps.version_date.outputs.date }}_OCI.ppfw.tar && mkdir -p sdcard/APPS && cp build/firmware/application/*.ppma sdcard/APPS && cp build/firmware/standalone/*/*.ppmp sdcard/APPS && cd sdcard && zip -r ../sdcard-no-map.zip . && cd .. - name: Download world map run: | wget https://github.com/portapack-mayhem/mayhem-firmware/releases/download/world_map/world_map.zip - name: Unzip world map run: | unzip world_map.zip -d sdcard/ADSB + - name: Prepare Firmware ZIP + run: | + cp build/hackrf/firmware/hackrf_usb/hackrf_usb.dfu flashing/utils/hackrf_one_usb.dfu && cp build/hackrf/firmware/hackrf_usb/hackrf_usb.bin flashing/utils/hackrf_one_usb.bin - name: Create Firmware ZIP run: | - zip -j firmware.zip build/firmware/portapack-h1_h2-mayhem.bin && cd flashing && zip -r ../firmware.zip * + zip -j firmware.zip build/firmware/portapack-mayhem-firmware.bin && cd flashing && zip -r ../firmware.zip * - name: Create SD Card ZIP run: | - mkdir -p sdcard/FIRMWARE && cp build/firmware/portapack-h1_h2-mayhem.bin sdcard/FIRMWARE/portapack-mayhem_${{ steps.version_date.outputs.date }}.bin && mkdir -p sdcard/APPS && cp build/firmware/application/*.ppma sdcard/APPS && cp build/firmware/standalone/*/*.ppmp sdcard/APPS && cd sdcard && zip -r ../sdcard.zip . && cd .. + mkdir -p sdcard/FIRMWARE && cp build/firmware/portapack-mayhem-firmware.bin sdcard/FIRMWARE/portapack-mayhem_${{ steps.version_date.outputs.date }}.bin && cp build/firmware/portapack-mayhem_OCI.ppfw.tar sdcard/FIRMWARE/mayhem_nightly_${{ steps.version_date.outputs.date }}_OCI.ppfw.tar && mkdir -p sdcard/APPS && cp build/firmware/application/*.ppma sdcard/APPS && cp build/firmware/standalone/*/*.ppmp sdcard/APPS && cd sdcard && zip -r ../sdcard.zip . && cd .. - name: Create changelog env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/create_stable_release.yml b/.github/workflows/create_stable_release.yml index ca99b66f..c6284380 100644 --- a/.github/workflows/create_stable_release.yml +++ b/.github/workflows/create_stable_release.yml @@ -38,19 +38,22 @@ jobs: run: docker run -e VERSION_STRING=${{ steps.version.outputs.version }} -i -v ${{ github.workspace }}:/havoc portapack-dev - name: Create Small SD Card ZIP - No World Map run: | - mkdir -p sdcard/FIRMWARE && cp build/firmware/portapack-h1_h2-mayhem.bin sdcard/FIRMWARE/portapack-mayhem_${{ steps.version.outputs.version }}.bin && mkdir -p sdcard/APPS && cp build/firmware/application/*.ppma sdcard/APPS && cp build/firmware/standalone/*/*.ppmp sdcard/APPS && cd sdcard && zip -r ../sdcard-no-map.zip . && cd .. + mkdir -p sdcard/FIRMWARE && cp build/firmware/portapack-mayhem-firmware.bin sdcard/FIRMWARE/portapack-mayhem_${{ steps.version.outputs.version }}.bin && cp build/firmware/portapack-mayhem_OCI.ppfw.tar sdcard/FIRMWARE/mayhem_${{ steps.version.outputs.version }}_OCI.ppfw.tar && mkdir -p sdcard/APPS && cp build/firmware/application/*.ppma sdcard/APPS && cp build/firmware/standalone/*/*.ppmp sdcard/APPS && cd sdcard && zip -r ../sdcard-no-map.zip . && cd .. - name: Download world map run: | wget https://github.com/portapack-mayhem/mayhem-firmware/releases/download/world_map/world_map.zip - name: Unzip world map run: | unzip world_map.zip -d sdcard/ADSB + - name: Prepare Firmware ZIP + run: | + cp build/hackrf/firmware/hackrf_usb/hackrf_usb.dfu flashing/utils/hackrf_one_usb.dfu && cp build/hackrf/firmware/hackrf_usb/hackrf_usb.bin flashing/utils/hackrf_one_usb.bin - name: Create Firmware ZIP run: | - zip -j firmware.zip build/firmware/portapack-h1_h2-mayhem.bin && cd flashing && zip -r ../firmware.zip * + zip -j firmware.zip build/firmware/portapack-mayhem-firmware.bin && cd flashing && zip -r ../firmware.zip * - name: Create SD Card ZIP run: | - mkdir -p sdcard/FIRMWARE && cp build/firmware/portapack-h1_h2-mayhem.bin sdcard/FIRMWARE/portapack-mayhem_${{ steps.version.outputs.version }}.bin && mkdir -p sdcard/APPS && cp build/firmware/application/*.ppma sdcard/APPS && cp build/firmware/standalone/*/*.ppmp sdcard/APPS && cd sdcard && zip -r ../sdcard.zip . && cd .. + mkdir -p sdcard/FIRMWARE && cp build/firmware/portapack-mayhem-firmware.bin sdcard/FIRMWARE/portapack-mayhem_${{ steps.version.outputs.version }}.bin && cp build/firmware/portapack-mayhem_OCI.ppfw.tar sdcard/FIRMWARE/mayhem_${{ steps.version.outputs.version }}_OCI.ppfw.tar && mkdir -p sdcard/APPS && cp build/firmware/application/*.ppma sdcard/APPS && cp build/firmware/standalone/*/*.ppmp sdcard/APPS && cd sdcard && zip -r ../sdcard.zip . && cd .. - name: Create changelog env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/past_version.txt b/.github/workflows/past_version.txt index 0ac852dd..f3b15f3f 100644 --- a/.github/workflows/past_version.txt +++ b/.github/workflows/past_version.txt @@ -1 +1 @@ -v2.0.1 +v2.0.2 diff --git a/.github/workflows/version.txt b/.github/workflows/version.txt index f3b15f3f..1defe531 100644 --- a/.github/workflows/version.txt +++ b/.github/workflows/version.txt @@ -1 +1 @@ -v2.0.2 +v2.1.0 diff --git a/.gitmodules b/.gitmodules index eaadf0d4..dd2d6545 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "hackrf"] path = hackrf - url = https://github.com/mossmann/hackrf.git + url = https://github.com/portapack-mayhem/hackrf.git diff --git a/CMakeLists.txt b/CMakeLists.txt index a9b6cbb0..3aff31c8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -23,6 +23,12 @@ cmake_policy(SET CMP0005 NEW) set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/firmware/toolchain-arm-cortex-m.cmake) +set(CMAKE_COLOR_MAKEFILE ON) + +add_compile_options(-fdiagnostics-color=always) + +option(USE_CCACHE "Enable ccache, please keep an eye on this because sometimes it's not quite stable and generated unusable binary" OFF) + project(portapack-h1) set(EXPECTED_GCC_VERSION "9.2.1") @@ -59,10 +65,11 @@ message("Building version: ${VERSION} MD5: ${VERSION_MD5}") set(LICENSE_PATH ${CMAKE_CURRENT_LIST_DIR}/LICENSE) set(HARDWARE_PATH ${CMAKE_CURRENT_LIST_DIR}/hardware) -add_subdirectory(hackrf-portapack) +add_subdirectory(hackrf/firmware) set(HACKRF_FIRMWARE_DFU_FILENAME hackrf_usb.dfu) set(HACKRF_FIRMWARE_BIN_FILENAME hackrf_usb_ram.bin) +set(HACKRF_FIRMWARE_FILENAME hackrf_usb.bin) set(HACKRF_CPLD_XSVF_FILENAME default.xsvf) set(HACKRF_PATH ${CMAKE_CURRENT_LIST_DIR}/hackrf) @@ -72,13 +79,24 @@ set(HACKRF_CPLD_XSVF_PATH ${HACKRF_PATH}/firmware/cpld/sgpio_if/${HACKRF_CPLD_XS set(HACKRF_FIRMWARE_DFU_IMAGE ${hackrf_usb_BINARY_DIR}/${HACKRF_FIRMWARE_DFU_FILENAME}) set(HACKRF_FIRMWARE_BIN_IMAGE ${hackrf_usb_BINARY_DIR}/${HACKRF_FIRMWARE_BIN_FILENAME}) -# this seems causing some issues (ref. in discord discussions), so temporarily disabled, until figure out the pros and cons and bugs of this tool. -#find_program(CCACHE "ccache") -#if(CCACHE) -# set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE}) -# set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE}) -# set(ENV{CCACHE_SLOPPINESS} pch_defines,time_macros) -#endif(CCACHE) +# this seems causing some issues (ref. in discord discussions), but it sometimes do helps, so you have your choice to use. it's default disabled, unless you use such command: +# cmake -DUSE_CCACHE=ON .. +# `make` or `make -j` or `make -j10` etc +# the default behavior `cmake ..` isn't changed (aka don't use ccache) +message(STATUS "-------v ccache info--------") +if(USE_CCACHE) + find_program(CCACHE_FOUND ccache) + if(CCACHE_FOUND) + set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_FOUND}) + set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_FOUND}) + message(STATUS "Using ccache, please keep an eye on this because sometimes it's not quite stable and generated unusable binary.\n-- use `cmake -DUSE_CCACHE=OFF ..` (pure cmake) or `cmake -G Ninja -DUSE_CCACHE=OFF .. ` (cmake with Ninja) to turn off ccache") + else() + message(WARNING "ccache is enabled but not found on the system.") + endif() +else() + message(STATUS "Not using ccache, use `cmake -DUSE_CCACHE=ON ..` (pure cmake) or `cmake -G Ninja -DUSE_CCACHE=ON ..` (cmake with Ninja) to turn on ccache") +endif() +message(STATUS "-------^ ccache info--------") enable_testing() add_subdirectory(firmware) diff --git a/README.md b/README.md index fd9a2fef..367aa36e 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,23 @@ + # PortaPack Mayhem [![Nightly Release](https://github.com/portapack-mayhem/mayhem-firmware/actions/workflows/create_nightly_release.yml/badge.svg?branch=next)](https://github.com/portapack-mayhem/mayhem-firmware/actions/workflows/create_nightly_release.yml) [![CodeScene Code Health](https://codescene.io/projects/8381/status-badges/code-health)](https://codescene.io/projects/8381) [![GitHub All Releases](https://img.shields.io/github/downloads/portapack-mayhem/mayhem-firmware/total)](https://github.com/portapack-mayhem/mayhem-firmware/releases) [![GitHub Releases](https://img.shields.io/github/downloads/portapack-mayhem/mayhem-firmware/latest/total)](https://github.com/portapack-mayhem/mayhem-firmware/releases/latest) [![Docker Hub Pulls](https://img.shields.io/docker/pulls/eried/portapack.svg)](https://hub.docker.com/r/eried/portapack) [![Discord Chat](https://dcbadge.vercel.app/api/server/tuwVMv3?style=flat)](https://discord.gg/tuwVMv3) This is a fork of the [Havoc](https://github.com/furrtek/portapack-havoc/) firmware, which itself was a fork of the [PortaPack](https://github.com/sharebrained/portapack-hackrf) firmware, an add-on for the [HackRF](http://greatscottgadgets.com/hackrf/). A fork is a derivate, in this case one that has extra features and fixes when compared to the older versions. -[](https://github.com/portapack-mayhem/mayhem-firmware/wiki/Hardware-overview) [](https://github.com/portapack-mayhem/mayhem-firmware/wiki/Hardware-overview#portapack-internals) - -*[PortaPack H2+HackRF+battery](https://grabify.link/7T28JP) (clone) with a custom [3d printed case](https://github.com/portapack-mayhem/mayhem-firmware/wiki/H2-Enclosure)* +[](https://github.com/portapack-mayhem/mayhem-firmware/wiki/PortaPack-Versions#new-h4m-mayhem-edition) [](https://github.com/portapack-mayhem/mayhem-firmware/wiki/PortaPack-Versions#h2m-mayhem-edition) # What is this? If you are new to *HackRF+PortaPack+Mayhem*, check these: -[It’s TOO Easy to Accidentally Do Illegal Stuff with This](https://grabify.link/X4D5TF) +[The Latest HackRF & Portapak Combo - H4M The Flipper Zero Killer?](https://share.hackrf.app/6HKX9A) -[What is the HackRF One Portapack H2+?](https://grabify.link/9UZGEW) [Beginner's Guide To The HackRF & Portapak With Mayhem](https://grabify.link/5MU2VH) [HackRF 101 : Everything You Need to Know to Get Started!](https://grabify.link/C0J6ZR) +[It’s TOO Easy to Accidentally Do Illegal Stuff with This](https://share.hackrf.app/X4D5TF) [HackRF Portapack H4M - Getting Started Guide](https://share.hackrf.app/F9MPOO) [The new HackRF Portapack H4M](https://share.hackrf.app/0JUHZ6) [HackRF 101 : Everything You Need to Know to Get Started!](https://share.hackrf.app/C0J6ZR) # Frequently Asked Questions @@ -27,11 +25,12 @@ This repository expands upon the previous work by many people and aims to consta ## What to buy? -:heavy_check_mark: ![Static Badge](https://img.shields.io/badge/NEW-yellow) The fabulous [PortaPack H4M Mayhem](https://grabify.link/VPMPSL), featuring numerous improvements and accessories. Sold by our friends at OpenSourceSDRLab. Join their giveaways on discord (check the badge on top). + +:heavy_check_mark: ![Static Badge](https://img.shields.io/badge/NEW-yellow) The fabulous H4M [complete](https://share.hackrf.app/TUOLYI) or [upgrade](https://share.hackrf.app/FPLM1H), featuring numerous improvements and accessories. Sold by our friends at [OpenSourceSDRLab](https://share.hackrf.app/99SAMT). Join their giveaways on discord (check the badge on top). -:heavy_check_mark: A recommended one is this [PortaPack H2](https://grabify.link/7T28JP), that includes everything you need with the plastic case "inspired" on [this](https://github.com/portapack-mayhem/mayhem-firmware/wiki/H2-Enclosure). +:heavy_check_mark: A recommended one is this [PortaPack H2](https://www.ebay.com/itm/116382397447), that includes everything you need with the plastic case "inspired" on [this](https://github.com/portapack-mayhem/mayhem-firmware/wiki/3d-printed-enclosure). -:heavy_check_mark: Some individuals lean towards the [H2 with a metal enclosure](https://grabify.link/HTDXG5), but its advantages remain debated. Share your insights on our [wiki](https://github.com/portapack-mayhem/mayhem-firmware/wiki/Hardware-overview). +:heavy_check_mark: Some individuals lean towards the [H2 with a metal enclosure](https://share.hackrf.app/LZPBH9), but its advantages remain debated. Share your insights on our [wiki](https://github.com/portapack-mayhem/mayhem-firmware/wiki/Hardware-overview). :warning: Be cautious , *ask* the seller about compatibility with the latest releases. Look out for the description of the item, if they provide the firmware files for an older version or they have custom setup instructions, this means it might be **NOT compatible**, for example: @@ -55,7 +54,7 @@ Consider that the hardware and firmware has been created and maintain by a [lot] To support the people behind the hardware, please buy a genuine [HackRF](https://greatscottgadgets.com/hackrf/) and [PortaPack](https://store.sharebrained.com/products/portapack-for-hackrf-one-kit). ## What if I really want something specific? -If what you need can be relevant in general, you can [request a feature](https://github.com/portapack-mayhem/mayhem-firmware/issues/new?labels=enhancement&template=feature_request.md). Alternatively, go to our Discord by clicking the chat badge on [top](#portapack-mayhem) and discuss there. +If what you need can be relevant in general, you can [request a feature](https://github.com/portapack-mayhem/mayhem-firmware/issues/new?assignees=&labels=enhancement&projects=&template=02_feature_request.yml). Alternatively, go to our Discord by clicking the chat badge on [top](#portapack-mayhem) and discuss there. ## What if I need help? First, check the [documentation](https://github.com/portapack-mayhem/mayhem-firmware/wiki). If you find a bug or you think the problem is related to the current repository, please open an [issue](https://github.com/portapack-mayhem/mayhem-firmware/issues/new/choose). diff --git a/dockerfile-nogit b/dockerfile-nogit index d2f5f84d..916e510c 100644 --- a/dockerfile-nogit +++ b/dockerfile-nogit @@ -1,4 +1,4 @@ -FROM ubuntu:xenial +FROM ubuntu:noble # Set location to download ARM toolkit from. # This will need to be changed over time or replaced with a static link to the latest release. @@ -11,19 +11,10 @@ WORKDIR /havoc/firmware # Fetch dependencies from APT RUN apt-get update \ - && apt-get install -y git tar wget dfu-util cmake python3 ccache bzip2 liblz4-tool curl ninja-build \ + && apt-get install -y git tar wget dfu-util cmake python3 python3-pip python3-yaml ccache bzip2 liblz4-tool curl ninja-build \ && apt-get -qy autoremove \ && rm -rf /var/lib/apt/lists/* -#Install current pip from PyPa -RUN curl https://bootstrap.pypa.io/pip/3.4/get-pip.py -o get-pip.py && \ - python3 get-pip.py - -#Fetch additional dependencies from Python 3.x pip -RUN pip install pyyaml \ - && ln -s /usr/bin/python3 /usr/bin/python \ - && ln -s /usr/bin/pip3 /usr/bin/pip - ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 diff --git a/dockerfile-nogit-arm b/dockerfile-nogit-arm index b5431ade..b4421c8d 100644 --- a/dockerfile-nogit-arm +++ b/dockerfile-nogit-arm @@ -1,4 +1,4 @@ -FROM ubuntu:xenial +FROM ubuntu:noble # Set location to download ARM toolkit from. # This will need to be changed over time or replaced with a static link to the latest release. @@ -11,19 +11,10 @@ WORKDIR /havoc/firmware # Fetch dependencies from APT RUN apt-get update \ - && apt-get install -y git tar wget dfu-util cmake python3 ccache bzip2 liblz4-tool curl ninja-build \ + && apt-get install -y git tar wget dfu-util cmake python3 python3-pip python3-yaml ccache bzip2 liblz4-tool curl ninja-build \ && apt-get -qy autoremove \ && rm -rf /var/lib/apt/lists/* -#Install current pip from PyPa -RUN curl https://bootstrap.pypa.io/pip/3.4/get-pip.py -o get-pip.py && \ - python3 get-pip.py - -#Fetch additional dependencies from Python 3.x pip -RUN pip install pyyaml \ - && ln -s /usr/bin/python3 /usr/bin/python \ - && ln -s /usr/bin/pip3 /usr/bin/pip - ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 diff --git a/firmware/CMakeLists.txt b/firmware/CMakeLists.txt index 0097ec59..bc613db1 100644 --- a/firmware/CMakeLists.txt +++ b/firmware/CMakeLists.txt @@ -33,7 +33,7 @@ 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(LZ4 lz4) -set(FIRMWARE_NAME portapack-h1_h2-mayhem) +set(FIRMWARE_NAME portapack-mayhem-firmware) set(FIRMWARE_FILENAME ${FIRMWARE_NAME}.bin) set(PPFW_FILENAME "portapack-mayhem_OCI.ppfw.tar") @@ -64,7 +64,7 @@ add_custom_command( add_custom_target( firmware - DEPENDS ${FIRMWARE_FILENAME} ${HACKRF_FIRMWARE_DFU_FILENAME} + DEPENDS ${FIRMWARE_FILENAME} ${HACKRF_FIRMWARE_DFU_FILENAME} ${HACKRF_FIRMWARE_FILENAME} ) if(${GCC_VERSION_MISMATCH}) diff --git a/firmware/application/CMakeLists.txt b/firmware/application/CMakeLists.txt index 7f0d846c..8b4ce16c 100644 --- a/firmware/application/CMakeLists.txt +++ b/firmware/application/CMakeLists.txt @@ -117,6 +117,7 @@ set(CSRC usb_serial_descriptor.c usb_serial_endpoints.c usb_serial_device_to_host.c + i2c_device_to_host.c ${HACKRF_PATH}/firmware/common/usb.c ${HACKRF_PATH}/firmware/common/usb_queue.c ${HACKRF_PATH}/firmware/hackrf_usb/usb_device.c @@ -125,12 +126,14 @@ set(CSRC ${CHIBIOS}/os/various/chprintf.c ) +#look for all i2cdev_ files +file(GLOB I2CDEV_SOURCES ${COMMON}/i2cdev_*.cpp) + # C++ sources that can be compiled in ARM or THUMB mode depending on the global # setting. set(CPPSRC main.cpp shell.cpp - ${COMMON}/acars_packet.cpp ${COMMON}/adsb.cpp ${COMMON}/adsb_frame.cpp ${COMMON}/ais_baseband.cpp @@ -176,8 +179,8 @@ set(CPPSRC ${COMMON}/ui_language.cpp ${COMMON}/utility.cpp ${COMMON}/wm8731.cpp - ${COMMON}/ads1110.cpp - ${COMMON}/max17055.cpp + ${COMMON}/i2cdevmanager.cpp + ${I2CDEV_SOURCES} ${COMMON}/battery.cpp ${COMMON}/performance_counter.cpp ${COMMON}/bmpfile.cpp @@ -189,7 +192,6 @@ set(CPPSRC core_control.cpp database.cpp de_bruijn.cpp - #emu_cc1101.cpp rfm69.cpp event_m0.cpp file_reader.cpp @@ -242,9 +244,9 @@ set(CPPSRC hw/si5351.cpp hw/spi_pp.cpp hw/touch_adc.cpp + ook_file.cpp ui_baseband_stats_view.cpp ui_navigation.cpp - ui_playdead.cpp ui_record_view.cpp ui_sd_card_status_view.cpp ui/ui_alphanum.cpp @@ -266,56 +268,41 @@ set(CPPSRC ui/ui_tone_key.cpp ui/ui_transmitter.cpp ui/ui_bmpview.cpp - apps/acars_app.cpp apps/ais_app.cpp apps/analog_audio_app.cpp - # apps/analog_tv_app.cpp apps/ble_comm_app.cpp apps/ble_rx_app.cpp apps/ble_tx_app.cpp apps/capture_app.cpp apps/ert_app.cpp - # apps/gps_sim_app.cpp - # apps/lge_app.cpp apps/pocsag_app.cpp - # apps/replay_app.cpp apps/soundboard_app.cpp - # apps/tpms_app.cpp apps/ui_about_simple.cpp apps/ui_adsb_rx.cpp - # apps/ui_adsb_tx.cpp #moved to ext apps/ui_aprs_rx.cpp apps/ui_aprs_tx.cpp apps/ui_battinfo.cpp apps/ui_bht_tx.cpp apps/ui_bmp_file_viewer.cpp apps/ui_btle_rx.cpp - # apps/ui_coasterp.cpp apps/ui_debug.cpp - apps/ui_debug_battery.cpp + apps/ui_debug_max17055.cpp apps/ui_dfu_menu.cpp apps/ui_encoders.cpp + apps/ui_external_module_view.cpp apps/ui_fileman.cpp apps/ui_flash_utility.cpp apps/ui_freqman.cpp - apps/ui_fsk_rx.cpp apps/ui_iq_trim.cpp - # apps/ui_jammer.cpp - # apps/ui_keyfob.cpp - # apps/ui_lcr.cpp apps/ui_level.cpp apps/ui_looking_glass_app.cpp apps/ui_mictx.cpp apps/ui_modemsetup.cpp - # apps/ui_morse.cpp - # apps/ui_nrf_rx.cpp - # apps/ui_nuoptix.cpp apps/ui_playlist.cpp apps/ui_pocsag_tx.cpp apps/ui_rds.cpp apps/ui_recon_settings.cpp apps/ui_recon.cpp - apps/ui_remote.cpp apps/ui_scanner.cpp apps/ui_sd_over_usb.cpp apps/ui_sd_wipe.cpp @@ -323,16 +310,11 @@ set(CPPSRC apps/ui_settings.cpp apps/ui_siggen.cpp apps/ui_sonde.cpp - # apps/ui_spectrum_painter_image.cpp - # apps/ui_spectrum_painter_text.cpp - # apps/ui_spectrum_painter.cpp apps/ui_ss_viewer.cpp - # apps/ui_sstvtx.cpp #moved to ext apps/ui_standalone_view.cpp apps/ui_subghzd.cpp # apps/ui_test.cpp apps/ui_text_editor.cpp - apps/ui_tone_search.cpp apps/ui_touch_calibration.cpp apps/ui_touchtunes.cpp apps/ui_view_wav.cpp @@ -343,14 +325,8 @@ set(CPPSRC protocols/bht.cpp protocols/dcs.cpp protocols/encoders.cpp - # protocols/lcr.cpp protocols/modems.cpp protocols/rds.cpp - # ui_handwrite.cpp - # ui_loadmodule.cpp - # ui_numbers.cpp - # ui_replay_view.cpp - # ui_script.cpp ui_sd_card_debug.cpp config_mode.cpp ${CPLD_20150901_DATA_CPP} diff --git a/firmware/application/apps/capture_app.cpp b/firmware/application/apps/capture_app.cpp index d5082bab..ca5c5477 100644 --- a/firmware/application/apps/capture_app.cpp +++ b/firmware/application/apps/capture_app.cpp @@ -87,9 +87,12 @@ CaptureAppView::CaptureAppView(NavigationView& nav) auto anti_alias_filter_bandwidth = filter_bandwidth_for_sampling_rate(actual_sample_rate); receiver_model.set_baseband_bandwidth(anti_alias_filter_bandwidth); - // Automatically switch default capture format to C8 when bandwidth setting is increased to >=1.5MHz + // Automatically switch default capture format to C8 when bandwidth setting is increased to >=1.5MHz anb back to C16 for <=1,25Mhz if ((bandwidth >= 1500000) && (previous_bandwidth < 1500000)) { - option_format.set_selected_index(1); + option_format.set_selected_index(1); // Default C8 format for REC, 1500K ... 5500k + } + if ((bandwidth <= 1250000) && (previous_bandwidth > 1250000)) { + option_format.set_selected_index(0); // Default C16 format for REC , 12k5 ... 1250K } previous_bandwidth = bandwidth; diff --git a/firmware/application/apps/replay_app.cpp b/firmware/application/apps/replay_app.cpp deleted file mode 100644 index 832b41c6..00000000 --- a/firmware/application/apps/replay_app.cpp +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * Copyleft (ↄ) 2022 NotPike - * - * 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 "replay_app.hpp" -#include "string_format.hpp" - -#include "ui_fileman.hpp" -#include "io_file.hpp" -#include "io_convert.hpp" - -#include "baseband_api.hpp" -#include "metadata_file.hpp" -#include "portapack.hpp" -#include "portapack_persistent_memory.hpp" -#include "utility.hpp" - -using namespace portapack; -namespace fs = std::filesystem; - -namespace ui { - -void ReplayAppView::set_ready() { - ready_signal = true; -} - -void ReplayAppView::on_file_changed(const fs::path& new_file_path) { - file_path = new_file_path; - File::Size file_size{}; - - { // Get the size of the data file. - File data_file; - auto error = data_file.open(file_path); - if (error) { - file_error(); - return; - } - - file_size = data_file.size(); - } - - // Get original record frequency if available. - auto metadata_path = get_metadata_path(file_path); - auto metadata = read_metadata_file(metadata_path); - - if (metadata) { - field_frequency.set_value(metadata->center_frequency); - sample_rate = metadata->sample_rate; - } else { - // TODO: This is interesting because it implies that the - // The capture will just be replayed at the freq set on the - // FrequencyField. Is that an intentional behavior? - sample_rate = 500000; - } - - // UI Fixup. - text_sample_rate.set(unit_auto_scale(sample_rate, 3, 0) + "Hz"); - progressbar.set_max(file_size); - text_filename.set(truncate(file_path.filename().string(), 12)); - - uint8_t sample_size = capture_file_sample_size(current()->path); - auto duration = ms_duration(file_size, sample_rate, sample_size); - text_duration.set(to_string_time_ms(duration)); - - button_play.focus(); -} - -void ReplayAppView::on_tx_progress(const uint32_t progress) { - progressbar.set_value(progress); -} - -void ReplayAppView::focus() { - button_open.focus(); -} - -void ReplayAppView::file_error() { - nav_.display_modal("Error", "File read error."); -} - -bool ReplayAppView::is_active() const { - return (bool)replay_thread; -} - -void ReplayAppView::toggle() { - if (is_active()) { - stop(false); - } else { - start(); - } -} - -void ReplayAppView::start() { - stop(false); - - std::unique_ptr reader; - - auto p = std::make_unique(); - auto open_error = p->open(file_path); - if (open_error.is_valid()) { - file_error(); - return; // Fixes TX bug if there's a file error - } else { - reader = std::move(p); - } - - if (reader) { - button_play.set_bitmap(&bitmap_stop); - baseband::set_sample_rate(sample_rate, OversampleRate::x8); - - replay_thread = std::make_unique( - std::move(reader), - read_size, buffer_count, - &ready_signal, - [](uint32_t return_code) { - ReplayThreadDoneMessage message{return_code}; - EventDispatcher::send_message(message); - }); - } - - transmitter_model.set_sampling_rate(sample_rate * toUType(OversampleRate::x8)); - transmitter_model.set_baseband_bandwidth(baseband_bandwidth); - transmitter_model.enable(); - - if (portapack::persistent_memory::stealth_mode()) { - DisplaySleepMessage message; - EventDispatcher::send_message(message); - } -} - -void ReplayAppView::stop(const bool do_loop) { - if (is_active()) - replay_thread.reset(); - - if (do_loop && check_loop.value()) { - start(); - } else { - transmitter_model.disable(); - button_play.set_bitmap(&bitmap_play); - } - - ready_signal = false; -} - -void ReplayAppView::handle_replay_thread_done(const uint32_t return_code) { - if (return_code == ReplayThread::END_OF_FILE) { - stop(true); - } else if (return_code == ReplayThread::READ_ERROR) { - stop(false); - file_error(); - } - - progressbar.set_value(0); -} - -ReplayAppView::ReplayAppView( - NavigationView& nav) - : nav_(nav) { - baseband::run_image(portapack::spi_flash::image_tag_replay); - - add_children({ - &button_open, - &text_filename, - &text_sample_rate, - &text_duration, - &progressbar, - &field_frequency, - &tx_view, // now it handles previous rfgain, rfamp. - &check_loop, - &button_play, - &waterfall, - }); - - button_play.on_select = [this](ImageButton&) { - this->toggle(); - }; - - button_open.on_select = [this, &nav](Button&) { - auto open_view = nav.push(".C*"); - open_view->on_changed = [this](fs::path new_file_path) { - on_file_changed(new_file_path); - }; - }; -} - -ReplayAppView::~ReplayAppView() { - transmitter_model.disable(); - baseband::shutdown(); -} - -void ReplayAppView::on_hide() { - stop(false); - // TODO: Terrible kludge because widget system doesn't notify Waterfall that - // it's being shown or hidden. - waterfall.on_hide(); - View::on_hide(); -} - -void ReplayAppView::set_parent_rect(const Rect new_parent_rect) { - View::set_parent_rect(new_parent_rect); - - const ui::Rect waterfall_rect{0, header_height, new_parent_rect.width(), new_parent_rect.height() - header_height}; - waterfall.set_parent_rect(waterfall_rect); -} - -} /* namespace ui */ diff --git a/firmware/application/apps/replay_app.hpp b/firmware/application/apps/replay_app.hpp deleted file mode 100644 index 716fa6cd..00000000 --- a/firmware/application/apps/replay_app.hpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2016 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 __REPLAY_APP_HPP__ -#define __REPLAY_APP_HPP__ - -#include "app_settings.hpp" -#include "radio_state.hpp" -#include "ui_widget.hpp" -#include "ui_navigation.hpp" -#include "ui_receiver.hpp" -#include "ui_freq_field.hpp" -#include "replay_thread.hpp" -#include "ui_spectrum.hpp" -#include "ui_transmitter.hpp" - -#include -#include - -namespace ui { - -class ReplayAppView : public View { - public: - ReplayAppView(NavigationView& nav); - ~ReplayAppView(); - - void on_hide() override; - void set_parent_rect(const Rect new_parent_rect) override; - void focus() override; - - std::string title() const override { return "Replay"; }; - - private: - NavigationView& nav_; - TxRadioState radio_state_{}; - app_settings::SettingsManager settings_{ - "tx_replay", app_settings::Mode::TX}; - - static constexpr ui::Dim header_height = 3 * 16; - - uint32_t sample_rate = 0; - int32_t tx_gain{47}; - bool rf_amp{true}; // aux private var to store temporal, Replay App rf_amp user selection. - static constexpr uint32_t baseband_bandwidth = 2500000; - const size_t read_size{16384}; - const size_t buffer_count{3}; - - void on_file_changed(const std::filesystem::path& new_file_path); - void on_tx_progress(const uint32_t progress); - - void toggle(); - void start(); - void stop(const bool do_loop); - bool is_active() const; - void set_ready(); - void handle_replay_thread_done(const uint32_t return_code); - void file_error(); - - std::filesystem::path file_path{}; - std::unique_ptr replay_thread{}; - bool ready_signal{false}; - - Button button_open{ - {0 * 8, 0 * 16, 10 * 8, 2 * 16}, - "Open file"}; - - Text text_filename{ - {11 * 8, 0 * 16, 12 * 8, 16}, - "-"}; - Text text_sample_rate{ - {24 * 8, 0 * 16, 6 * 8, 16}, - "-"}; - - Text text_duration{ - {11 * 8, 1 * 16, 6 * 8, 16}, - "-"}; - ProgressBar progressbar{ - {18 * 8, 1 * 16, 12 * 8, 16}}; - - TxFrequencyField field_frequency{ - {0 * 8, 2 * 16}, - nav_}; - - TransmitterView2 tx_view{ - {11 * 8, 2 * 16}, - /*short_ui*/ true}; - - Checkbox check_loop{ - {21 * 8, 2 * 16}, - 4, - "Loop", - true}; - ImageButton button_play{ - {28 * 8, 2 * 16, 2 * 8, 1 * 16}, - &bitmap_play, - Theme::getInstance()->fg_green->foreground, - Theme::getInstance()->fg_green->background}; - - spectrum::WaterfallView waterfall{}; - - MessageHandlerRegistration message_handler_replay_thread_error{ - Message::ID::ReplayThreadDone, - [this](const Message* const p) { - const auto message = *reinterpret_cast(p); - this->handle_replay_thread_done(message.return_code); - }}; - - MessageHandlerRegistration message_handler_fifo_signal{ - Message::ID::RequestSignal, - [this](const Message* const p) { - const auto message = static_cast(p); - if (message->signal == RequestSignalMessage::Signal::FillRequest) { - this->set_ready(); - } - }}; - - MessageHandlerRegistration message_handler_tx_progress{ - Message::ID::TXProgress, - [this](const Message* const p) { - const auto message = *reinterpret_cast(p); - this->on_tx_progress(message.progress); - }}; -}; - -} /* namespace ui */ - -#endif /*__REPLAY_APP_HPP__*/ diff --git a/firmware/application/apps/soundboard_app.cpp b/firmware/application/apps/soundboard_app.cpp index 9a00b98c..b8af1d0f 100644 --- a/firmware/application/apps/soundboard_app.cpp +++ b/firmware/application/apps/soundboard_app.cpp @@ -35,6 +35,8 @@ using namespace portapack; namespace ui { +#define FILE_PER_PAGE 50 + bool SoundBoardView::is_active() const { return (bool)replay_thread; } @@ -178,9 +180,9 @@ void SoundBoardView::refresh_list() { if ((reader->channels() == 1) && ((reader->bits_per_sample() == 8) || (reader->bits_per_sample() == 16))) { // sounds[c].ms_duration = reader->ms_duration(); // sounds[c].path = u"WAV/" + entry.path().native(); - if (count >= (page - 1) * 100 && count < page * 100) { + if (count >= (page - 1) * FILE_PER_PAGE && count < page * FILE_PER_PAGE) { file_list.push_back(entry.path()); - if (file_list.size() == 100) { + if (file_list.size() == FILE_PER_PAGE) { page++; break; } @@ -225,7 +227,7 @@ void SoundBoardView::refresh_list() { menu_view.set_highlighted(0); // Refresh } - if (file_list.size() < 100) { + if (file_list.size() < FILE_PER_PAGE) { page = 1; } } diff --git a/firmware/application/apps/ui_about.cpp b/firmware/application/apps/ui_about.cpp deleted file mode 100644 index 681d67ec..00000000 --- a/firmware/application/apps/ui_about.cpp +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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_update.hpp" -#include "portapack.hpp" -#include "event_m0.hpp" - -#include "ui_about.hpp" - -#include "portapack_shared_memory.hpp" -#include "portapack_persistent_memory.hpp" -#include "lpc43xx_cpp.hpp" - -#include -#include - -using namespace lpc43xx; -using namespace portapack; - -namespace ui { - -// This is pretty much WaterfallView but in the opposite direction -CreditsWidget::CreditsWidget( - Rect parent_rect) - : Widget{parent_rect} { -} - -void CreditsWidget::paint(Painter&) { -} - -void CreditsWidget::on_show() { - clear(); - - const auto screen_r = screen_rect(); - display.scroll_set_area(screen_r.top(), screen_r.bottom()); -} - -void CreditsWidget::on_hide() { - display.scroll_disable(); -} - -void CreditsWidget::new_row( - const std::array& pixel_row) { - // Glitch be here (see comment in main.cpp) - const auto draw_y = display.scroll(-1); - - display.draw_pixels( - {{0, draw_y - 1}, {240, 1}}, - pixel_row); -} - -void CreditsWidget::clear() { - display.fill_rectangle( - screen_rect(), - Theme::getInstance()->bg_darkest->background); -} - -void AboutView::update() { - size_t i = 0; - std::array pixel_row; - - slow_down++; - if (slow_down % 3 < 2) return; - - if (!timer) { - if (loop) { - credits_index = 0; - loop = false; - } - - text = credits[credits_index].text; - timer = credits[credits_index].delay; - start_pos = credits[credits_index].start_pos; - - if (timer < 0) { - timer = 240; - loop = true; - } else - timer += 16; - - render_line = 0; - credits_index++; - } else - timer--; - - if (render_line < 16) { - for (const auto c : text) { - const auto glyph = style().font.glyph(c); - - const size_t start = (glyph.size().width() / 8) * render_line; - for (Dim c = 0; c < glyph.size().width(); c++) { - const auto pixel = glyph.pixels()[start + (c >> 3)] & (1U << (c & 0x7)); - pixel_row[start_pos + i + c] = pixel ? Theme::getInstance()->bg_darkest->foreground : Theme::getInstance()->bg_darkest->background; - } - - const auto advance = glyph.advance(); - i += advance.x(); - } - render_line++; - } - - credits_display.new_row(pixel_row); -} - -AboutView::AboutView( - NavigationView& nav) { - add_children({&credits_display, - &button_ok}); - - button_ok.on_select = [&nav](Button&) { - nav.pop(); - }; -} - -void AboutView::focus() { - button_ok.focus(); -} - -} /* namespace ui */ diff --git a/firmware/application/apps/ui_about.hpp b/firmware/application/apps/ui_about.hpp deleted file mode 100644 index e4f5e0c9..00000000 --- a/firmware/application/apps/ui_about.hpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 __UI_ABOUT_H__ -#define __UI_ABOUT_H__ - -#include "ui_widget.hpp" -#include "ui_navigation.hpp" - -#include - -namespace ui { - -class CreditsWidget : public Widget { - public: - CreditsWidget(Rect parent_rect); - - void on_show() override; - void on_hide() override; - - void paint(Painter&) override; - - void new_row(const std::array& pixel_row); - - private: - void clear(); -}; - -class AboutView : public View { - public: - AboutView(NavigationView& nav); - - void focus() override; - - std::string title() const override { return "About"; }; - - private: - void update(); - - uint8_t credits_index{0}; - uint8_t render_line{0}; - Coord start_pos{0}; - uint8_t slow_down{0}; - int32_t timer{0}; - bool loop{false}; - - std::string text{}; - - typedef struct credits_t { - size_t start_pos; - std::string text; - int32_t delay; - } credits_t; - - // TODO: Make this dinamically centered and parse \n as the delay value so it is easy to maintain - const credits_t credits[26] = { - // 012345678901234567890123456789 - {60, "PortaPack Mayhem", 0}, - {60, "PortaPack|HAVOC", 0}, - {11 * 8, "Gurus J. Boone", 0}, - {18 * 8, "M. Ossmann", 16}, - {11 * 8, "HAVOC Furrtek", 16}, - {7 * 8, "POCSAG rx T. Sailer", 0}, - {18 * 8, "E. Oenal", 16}, - {0 * 8, "Radiosonde infos F4GMU", 0}, - {18 * 8, "RS1729", 16}, - {4 * 8, "RDS waveform C. Jacquet", 16}, - {7 * 8, "Xy. infos cLx", 16}, - {2 * 8, "OOK scan trick Samy Kamkar", 16}, - {7 * 8, "World map NASA", 16}, - {0 * 8, "TouchTunes infos Notpike", 16}, - {4 * 8, "Subaru infos Tom", 0}, - {18 * 8, "Wimmenhove", 16}, - {1 * 8, "GPS,TV,BTLE,NRF Shao", 24}, - {6 * 8, "Thanks & donators", 16}, - {1 * 8, "Rainer Matla Keld Norman", 0}, - {1 * 8, " Giorgio C. DC1RDB", 0}, - {1 * 8, " Sigmounte Waax", 0}, - {1 * 8, " Windyoona Channels", 0}, - {1 * 8, " F4GEV Pyr3x", 0}, - {1 * 8, " HB3YOE", 24}, - {11 * 8, "MMXVIII", -1}}; - - CreditsWidget credits_display{ - {0, 16, 240, 240}}; - - Button button_ok{ - {72, 272, 96, 24}, - "OK"}; - - MessageHandlerRegistration message_handler_update{ - Message::ID::DisplayFrameSync, - [this](const Message* const) { - this->update(); - }}; -}; - -} /* namespace ui */ - -#endif /*__UI_ABOUT_H__*/ diff --git a/firmware/application/apps/ui_about_demo.cpp b/firmware/application/apps/ui_about_demo.cpp deleted file mode 100644 index 853b0c4e..00000000 --- a/firmware/application/apps/ui_about_demo.cpp +++ /dev/null @@ -1,413 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 - -#include "demofont.hpp" -#include "ymdata.hpp" - -#include "cpld_update.hpp" -#include "portapack.hpp" -#include "audio.hpp" -#include "event_m0.hpp" - -#include "ui_about.hpp" -#include "touch.hpp" -#include "sine_table.hpp" - -#include "portapack_shared_memory.hpp" -#include "portapack_persistent_memory.hpp" -#include "lpc43xx_cpp.hpp" - -#include -#include - -using namespace lpc43xx; -using namespace portapack; - -namespace ui { - -void AboutView::on_show() { - transmitter_model.set_target_frequency(1337000000); // TODO: Change - transmitter_model.set_baseband_configuration({ - .mode = 0, - .sampling_rate = 1536000, - .decimation_factor = 1, - }); - transmitter_model.set_rf_amp(true); - transmitter_model.set_lna(40); - transmitter_model.set_vga(40); - transmitter_model.enable(); - - baseband::set_audiotx_data(32, 50, false, 0); - - // audio::headphone::set_volume(volume_t::decibel(0 - 99) + audio::headphone::volume_range().max); -} - -void AboutView::render_video() { - uint8_t p, r, luma, chroma, cy; - ui::Color cc; - char ch; - float s; - - // Send framebuffer to LCD. Gotta go fast ! - display.render_box({30, 112}, {180, 72}, framebuffer); - - // Clear framebuffer to black - memset(framebuffer, 0, 180 * 72 * sizeof(ui::Color)); - - // Drum hit palette animation - if (drum > 1) drum--; - - // Render copper bars from Y buffer - for (p = 0; p < 72; p++) { - luma = copperbuffer[p] & 0x0F; // 0 is transparent - if (luma) { - chroma = copperbuffer[p] >> 4; - cc = ui::Color(std::min((coppercolor[chroma][0] / luma) * drum, 255), std::min((coppercolor[chroma][1] / luma) * drum, 255), std::min((coppercolor[chroma][2] / luma) * drum, 255)); - for (r = 0; r < 180; r++) - framebuffer[(p * 180) + r] = cc; - } - } - - // Scroll in/out state machine - if (anim_state == 0) { - // Scroll in - if (ofy < 8) { - ofy++; - anim_state = 0; - } else { - anim_state = 1; - } - if (ofx < (int16_t)(180 - (strlen(credits[credits_index].name) * 16) - 8)) { - ofx += 8; - anim_state = 0; - } - } else if (anim_state == 1) { - // Just wait - if (credits_timer == (30 * 3)) { - credits_timer = 0; - anim_state = 2; - } else { - credits_timer++; - } - } else { - // Scroll out - if (credits[credits_index].change == true) { - if (ofy > -24) { - ofy--; - anim_state = 2; - } else { - anim_state = 0; - } - } else { - anim_state = 0; - } - if (ofx < 180) { - ofx += 8; - anim_state = 2; - } - - // Switch to next text - if (anim_state == 0) { - if (credits_index == 9) - credits_index = 0; - else - credits_index++; - ofx = -(strlen(credits[credits_index].name) * 16) - 16; - } - } - - // Sine text ("role") - p = 0; - while ((ch = credits[credits_index].role[p])) { - draw_demoglyph({(ui::Coord)(8 + (p * 16)), (ui::Coord)(ofy + (sine_table_f32[((p * 16) + (phase >> 5)) & 0xFF] * 8))}, ch, paletteA); - p++; - } - - // Scroll text (name) - p = 0; - while ((ch = credits[credits_index].name[p])) { - draw_demoglyph({(ui::Coord)(ofx + (p * 16)), 56}, ch, paletteB); - p++; - } - - // Clear bars Y buffer - memset(copperbuffer, 0, 72); - - // Render bars to Y buffer - for (p = 0; p < 5; p++) { - cy = copperbars[p]; - for (r = 0; r < 16; r++) - copperbuffer[cy + r] = copperluma[r] + (p << 4); - } - - // Animate bars positions - for (p = 0; p < 5; p++) { - s = sine_table_f32[((p * 32) + (phase / 24)) & 0xFF]; - s += sine_table_f32[((p * 16) + (phase / 35)) & 0xFF]; - copperbars[p] = 28 + (uint8_t)(s * 14); - } - - phase += 128; -} - -void AboutView::draw_demoglyph(ui::Point p, char ch, ui::Color* pal) { - uint8_t x, y, c, cl, cr; - uint16_t che; - int16_t lbx, il; - - // Map ASCII to font bitmap - if ((ch >= 32) && (ch < 96)) - che = char_map[ch - 32]; - else - che = 0xFF; - - if (che < 0xFF) { - che = (che * 128) + 48; // Start in bitmap - - il = (180 * p.y) + p.x; // Start il framebuffer - - for (y = 0; y < 16; y++) { - if (p.y + y >= 72) break; // Over bottom of framebuffer, abort - if (p.y + y >= 0) { - for (x = 0; x < 8; x++) { - c = demofont_bin[x + (y * 8) + che]; // Split byte in 2 4BPP pixels - cl = c >> 4; - cr = c & 0x0F; - lbx = p.x + (x * 2); - if (cl && (lbx < 180) && (lbx >= 0)) framebuffer[il] = pal[cl]; - lbx++; - il++; - if (cr && (lbx < 180) && (lbx >= 0)) framebuffer[il] = pal[cr]; - il++; - } - il += 180 - 16; - } else { - il += 180; - } - } - } -} - -void AboutView::render_audio() { - uint8_t i, ymdata; - uint16_t ym_render_cnt; - - // This is heavily inspired by MAME's ay8910.cpp and the YM2149's datasheet - - // Render 1024 music samples - for (ym_render_cnt = 0; ym_render_cnt < 1024; ym_render_cnt++) { - // Update registers at 48000/960 = 50Hz - if (ym_sample_cnt == 0) { - // "Decompress" on the fly and update YM registers - for (i = 0; i < 14; i++) { - if (!ym_regs[i].cnt) { - // New run - ymdata = ymdata_bin[ym_regs[i].ptr++]; - ym_regs[i].cnt = ymdata & 0x7F; - if (ymdata & 0x80) { - ym_regs[i].same = true; - ym_regs[i].value = ymdata_bin[ym_regs[i].ptr++]; - } else { - ym_regs[i].same = false; - } - // Detect drum on channel B - if (i == 3) - if (ym_regs[3].value > 2) drum = 4; - } - if (ym_regs[i].same == false) { - ym_regs[i].value = ymdata_bin[ym_regs[i].ptr++]; - if (i == 13) { - // Update envelope attributes - ym_env_att = (ym_regs[13].value & 4) ? 0x1F : 0x00; - if (!(ym_regs[13].value & 8)) { - ym_env_hold = 1; - ym_env_alt = ym_env_att; - } else { - ym_env_hold = ym_regs[13].value & 1; - ym_env_alt = ym_regs[13].value & 2; - } - // Reset envelope counter - ym_env_step = 0x1F; - ym_env_holding = 0; - ym_env_vol = (ym_env_step ^ ym_env_att); - } - } - ym_regs[i].cnt--; - } - ym_frame++; - } - - // Square wave oscillators - // 2457600/16/48000 = 3.2, but 4 sounds better than 3... - for (i = 0; i < 3; i++) { - ym_osc_cnt[i] += 4; - if (ym_osc_cnt[i] >= (ym_regs[i * 2].value | ((ym_regs[(i * 2) + 1].value & 0x0f) << 8))) { - ym_osc_cnt[i] = 0; - ym_osc_out[i] ^= 1; - } - } - - // Noise generator - ym_noise_cnt += 4; - if (ym_noise_cnt >= ((ym_regs[6].value & 0x1F) * 2)) { - ym_noise_cnt = 0; - ym_rng ^= (((ym_rng & 1) ^ ((ym_rng >> 3) & 1)) << 17); - ym_rng >>= 1; - } - - // Mix tones and noise - for (i = 0; i < 3; i++) - ym_ch[i] = (ym_osc_out[i] | ((ym_regs[7].value >> i) & 1)) & ((ym_rng & 1) | ((ym_regs[7].value >> (i + 3)) & 1)); - - // Envelope generator - if (!ym_env_holding) { - ym_env_cnt += 8; - if (ym_env_cnt >= (ym_regs[11].value | (ym_regs[12].value << 8))) { - ym_env_cnt = 0; - ym_env_step--; - if (ym_env_step < 0) { - if (ym_env_hold) { - if (ym_env_alt) - ym_env_att ^= 0x1F; - ym_env_holding = 1; - ym_env_step = 0; - } else { - if (ym_env_alt && (ym_env_step & 0x20)) - ym_env_att ^= 0x1F; - ym_env_step &= 0x1F; - } - } - } - } - ym_env_vol = (ym_env_step ^ ym_env_att); - - ym_out = 0; - for (i = 0; i < 3; i++) { - if (ym_regs[i + 8].value & 0x10) { - // Envelope mode - ym_out += (ym_ch[i] ? ym_env_vol : 0); - } else { - // Fixed mode - ym_out += (ym_ch[i] ? (ym_regs[i + 8].value & 0x0F) : 0); - } - } - - ym_buffer[ym_render_cnt] = (ym_out * 2) - 45; - - if (ym_sample_cnt < 960) { - ym_sample_cnt++; - } else { - ym_sample_cnt = 0; - } - - // Loop - if (ym_frame == ym_frames) ym_init(); - } -} - -void AboutView::update() { - if (framebuffer) { - // Update 1 out of 2 frames, 60Hz is very laggy - if (refresh_cnt & 1) render_video(); - refresh_cnt++; - } - - // Slowly increase volume to avoid jumpscare - if (headphone_vol < (70 << 2)) { - audio::headphone::set_volume(volume_t::decibel((headphone_vol / 4) - 99) + audio::headphone::volume_range().max); - headphone_vol++; - } -} - -void AboutView::ym_init() { - uint8_t reg; - - for (reg = 0; reg < 14; reg++) { - ym_regs[reg].cnt = 0; - // Pick up start pointers for each YM registers RLE blocks - ym_regs[reg].ptr = ((uint16_t)(ymdata_bin[(reg * 2) + 3]) << 8) + ymdata_bin[(reg * 2) + 2]; - ym_regs[reg].same = false; // Useless ? - ym_regs[reg].value = 0; // Useless ? - } - - ym_frame = 0; -} - -AboutView::AboutView( - NavigationView& nav) { - uint8_t p, c; - - baseband::run_image(portapack::spi_flash::image_tag_audio_tx); - - add_children({{ - &text_title, - &text_firmware, - &text_cpld_hackrf, - &text_cpld_hackrf_status, - &button_ok, - }}); - - if (cpld_hackrf_verify_eeprom()) { - text_cpld_hackrf_status.set(" OK"); - } else { - text_cpld_hackrf_status.set("BAD"); - } - - // Politely ask for about 26kB - framebuffer = (ui::Color*)chHeapAlloc(0x0, 180 * 72 * sizeof(ui::Color)); - - if (framebuffer) { - memset(framebuffer, 0, 180 * 72 * sizeof(ui::Color)); - - // Copy original font palette - c = 0; - for (p = 0; p < 48; p += 3) - paletteA[c++] = ui::Color(demofont_bin[p], demofont_bin[p + 1], demofont_bin[p + 2]); - - // Increase red in another one - c = 0; - for (p = 0; p < 48; p += 3) - paletteB[c++] = ui::Color(std::min(demofont_bin[p] + 64, 255), demofont_bin[p + 1], demofont_bin[p + 2]); - } - - // Init YM synth - ym_frames = ((uint16_t)(ymdata_bin[1]) << 8) + ymdata_bin[0]; - ym_init(); - - button_ok.on_select = [this, &nav](Button&) { - if (framebuffer) chHeapFree(framebuffer); // Do NOT forget this - nav.pop(); - }; -} - -AboutView::~AboutView() { - transmitter_model.disable(); - baseband::shutdown(); -} - -void AboutView::focus() { - button_ok.focus(); -} - -} /* namespace ui */ diff --git a/firmware/application/apps/ui_about_demo.hpp b/firmware/application/apps/ui_about_demo.hpp deleted file mode 100644 index 37342c53..00000000 --- a/firmware/application/apps/ui_about_demo.hpp +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 __UI_ABOUT_H__ -#define __UI_ABOUT_H__ - -#include "ui_widget.hpp" -#include "ui_menu.hpp" -#include "ui_navigation.hpp" -#include "transmitter_model.hpp" -#include "baseband_api.hpp" - -#include - -namespace ui { - -class AboutView : public View { - public: - AboutView(NavigationView& nav); - ~AboutView(); - - void on_show() override; - void focus() override; - - private: - void ym_init(); - void update(); - void render_video(); - void render_audio(); - void draw_demoglyph(ui::Point p, char ch, ui::Color* pal); - uint16_t debug_cnt = 0; - - typedef struct ymreg_t { - uint8_t value; - uint8_t cnt; - uint16_t ptr; - bool same; - } ymreg_t; - - uint16_t headphone_vol = 5 << 2; - - ymreg_t ym_regs[14]; - uint16_t ym_frames; - uint16_t ym_frame; - uint8_t drum = 0; - uint16_t ym_osc_cnt[3]; - uint32_t ym_rng = 1; - uint16_t ym_noise_cnt; - uint8_t ym_env_att, ym_env_hold, ym_env_alt, ym_env_holding, ym_env_vol; - int8_t ym_env_step; - uint16_t ym_env_cnt; - uint8_t ym_osc_out[3]; - uint8_t ym_ch[3]; - uint8_t ym_out; - uint16_t ym_sample_cnt = 0; - - int8_t ym_buffer[1024]; - - uint8_t refresh_cnt; - ui::Color paletteA[16]; - ui::Color paletteB[16]; - ui::Color* framebuffer; - uint32_t phase = 0; - uint8_t copperbars[5] = {0}; - uint8_t copperbuffer[72] = {0}; - - uint8_t anim_state = 0; - uint8_t credits_index = 0; - uint16_t credits_timer = 0; - - int16_t ofx = -180, ofy = -24; - - const uint8_t char_map[64] = {0xFF, 27, 46, 0xFF, 0xFF, 0xFF, 28, 45, - 58, 59, 0xFF, 43, 40, 57, 26, 42, - 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 41, 0xFF, 0xFF, 0xFF, 0xFF, 44, - 0xFF, 0, 1, 2, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; - - const uint8_t copperluma[16] = {8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8}; - const uint8_t coppercolor[5][3] = {{255, 0, 0}, - {0, 255, 0}, - {0, 0, 255}, - {255, 0, 255}, - {255, 255, 0}}; - - typedef struct credits_t { - char role[12]; - char name[12]; - bool change; - } credits_t; - - // 0123456789A 0123456789A - const credits_t credits[10] = {{"GURUS", "J. BOONE", false}, - {"GURUS", "M. OSSMANN", true}, - {"BUGS", "FURRTEK", true}, - {"RDS WAVE", "C. JACQUET", true}, - {"POCSAG RX", "T. SAILER", false}, - {"POCSAG RX", "E. OENAL", true}, - {"XYLOS DATA", "CLX", true}, - {"GREETS TO", "SIGMOUNTE", false}, - {"GREETS TO", "WINDYOONA", true}, - {"THIS MUSIC", "BIG ALEC", true}}; - - Text text_title{ - {100, 32, 40, 16}, - "About", - }; - - Text text_firmware{ - {0, 236, 240, 16}, - "Version " VERSION_STRING, - }; - - Text text_cpld_hackrf{ - {0, 252, 11 * 8, 16}, - "HackRF CPLD", - }; - - Text text_cpld_hackrf_status{ - {240 - 3 * 8, 252, 3 * 8, 16}, - "???"}; - - Button button_ok{ - {72, 272, 96, 24}, - "OK"}; - - MessageHandlerRegistration message_handler_update{ - Message::ID::DisplayFrameSync, - [this](const Message* const) { - this->update(); - }}; - - MessageHandlerRegistration message_handler_fifo_signal{ - Message::ID::FIFOSignal, - [this](const Message* const p) { - const auto message = static_cast(p); - if (message->signaltype == 1) { - this->render_audio(); - baseband::set_fifo_data(ym_buffer); - } - }}; -}; - -} /* namespace ui */ - -#endif /*__UI_ABOUT_H__*/ diff --git a/firmware/application/apps/ui_about_simple.cpp b/firmware/application/apps/ui_about_simple.cpp index 153d4d18..1e78e5e9 100644 --- a/firmware/application/apps/ui_about_simple.cpp +++ b/firmware/application/apps/ui_about_simple.cpp @@ -1,47 +1,60 @@ #include "ui_about_simple.hpp" +#include + +#define ROLL_SPEED_FRAME_PER_LINE 60 +// cuz frame rate of pp screen is probably 60, scroll per sec namespace ui { -// TODO: Generate this automatically from github // Information: a line starting with a '#' will be yellow coloured -const std::string authors_list[] = { +constexpr std::string_view authors_list[] = { "# * List of contributors * ", " ", - "#Mayhem:", - "eried,euquiq,gregoryfenton", - "johnelder,jwetzell,nnemanjan00", - "N0vaPixel,klockee,gullradriel", - "jamesshao8,ITAxReal,rascafr", - "mcules,dqs105,strijar", - "zhang00963,RedFox-Fr,aldude999", - "East2West,fossum,ArjanOnwezen", - "vXxOinvizioNxX,teixeluis", - "Brumi-2021,texasyojimbo", - "heurist1,intoxsick,ckuethe", - "notpike,jLynx,zigad", - "MichalLeonBorsuk,jimilinuxguy", - "kallanreed,bernd-herzog", - "NotherNgineer,zxkmm,u-foka", - "Netro,HTotoo", + "#Mayhem-Firmware:", + "jboone,eried,furrtek,", + "NotherNgineer,gullradriel,", + "jLynx,kallanreed,Brumi-2021,", + "htotoo,bernd-herzog,zxkmm,", + "ArjanOnwezen,euquiq,u-foka,", + "iNetro,heurist1,dqs105,", + "teixeluis,jwetzell,", + "jimilinuxguy,gregoryfenton,", + "notpike,strijar,BehleZebub,", + "arneluehrs,rascafr,joyel24,", + "ImDroided,zigad,johnelder,", + "klockee,nnesetto,LupusE,", + "argilo,dc2dc,formtapez,", + "RocketGod-git,mrmookie,", + "ITAxReal,F33RNI,F4GEV,", + "rusty-labs,mjwaxios,andrej-mk,", + "RedFox-Fr,nemanjan00,", + "MichalLeonBorsuk,", + "MatiasFernandez,Giorgiofox,", + "ckuethe", " ", "#Havoc:", - "furrtek,mrmookie,NotPike", - "mjwaxios,ImDroided,Giorgiofox", - "F4GEV,z4ziggy,xmycroftx", - "troussos,silascutler", - "nickbouwhuis,msoose,leres", - "joakar,dhoetger,clem-42", - "brianlechthaler,ZeroChaos-...", + "jboone,furrtek,eried,argilo,", + "mrmookie,Giorgiofox,ImDroided,", + "mjwaxios,F4GEV,OpCode1300,", + "ZeroChaos-,RndmNmbr,", + "silascutler,troussos,z4ziggy,", + "clem-42,dhoetger,NickBouwhuis,", + "xmycroftx,Maescool,KimIV,", + "joakar,leres,brianlechthaler,", + "N0vaPixel", " ", "#PortaPack:", - "jboone,argilo", + "jboone,mossmann,martinling,", + "argilo,eried,ZeroChaos-,", + "RndmNmbr", " ", "#HackRF:", - "mossmann,dominicgs,bvernoux", - "bgamari,schneider42,miek", - "willcode,hessu,Sec42", - "yhetti,ckuethe,smunaut", - "wishi,mrbubble62,scateu..."}; + "mossmann,jboone,dominicgs,", + "martinling,bvernoux,miek,", + "bgamari,schneider42,straithe,", + "grvvy,willcode,hessu,yhetti,", + "Sec42,ckuethe", + " "}; AboutView::AboutView(NavigationView& nav) { add_children({&menu_view, @@ -59,18 +72,18 @@ AboutView::AboutView(NavigationView& nav) { button_ok.focus(); }; - for (const std::string& authors_line : authors_list) { + for (auto& authors_line : authors_list) { // if it's starting with #, it's a title and we have to substract the '#' and paint yellow if (authors_line.size() > 0) { if (authors_line[0] == '#') { menu_view.add_item( - {authors_line.substr(1, authors_line.size() - 1), + {(std::string)authors_line.substr(1, authors_line.size() - 1), ui::Theme::getInstance()->fg_yellow->foreground, nullptr, nullptr}); } else { menu_view.add_item( - {authors_line, + {(std::string)authors_line, Theme::getInstance()->bg_darkest->foreground, nullptr, nullptr}); @@ -79,10 +92,42 @@ AboutView::AboutView(NavigationView& nav) { } } +void AboutView::on_frame_sync() { + if (interacted) return; + + if (frame_sync_count++ % ROLL_SPEED_FRAME_PER_LINE == 0) { + const auto current = menu_view.highlighted_index(); + const auto count = menu_view.item_count(); + + if (current < count - 1) { + menu_view.set_highlighted(current + 1); + } else { + menu_view.set_highlighted(0); + // ^ to go back to the REAL top instead of make the 2 at the top to make the title disappeares + menu_view.set_highlighted(2); // the first line that has human name + } + } +} + void AboutView::focus() { + button_ok.focus(); + menu_view.set_highlighted(2); // the first line that has human name +} + +bool AboutView::on_touch(const TouchEvent) { + interacted = true; + return false; +} + +bool AboutView::on_key(const KeyEvent) { + interacted = true; + return false; +} + +bool AboutView::on_encoder(const EncoderEvent) { + interacted = true; menu_view.focus(); - // put focus on last text line to make it more obvious that list is scrollable - menu_view.set_highlighted(10); + return false; } } /* namespace ui */ diff --git a/firmware/application/apps/ui_about_simple.hpp b/firmware/application/apps/ui_about_simple.hpp index f5e8488f..637a0312 100644 --- a/firmware/application/apps/ui_about_simple.hpp +++ b/firmware/application/apps/ui_about_simple.hpp @@ -14,6 +14,13 @@ class AboutView : public View { std::string title() const override { return "About"; }; private: + virtual bool on_key(const KeyEvent event); + virtual bool on_encoder(const EncoderEvent event); + virtual bool on_touch(const TouchEvent event); + + bool interacted{false}; + uint16_t frame_sync_count{0}; + void on_frame_sync(); MenuView menu_view{ {0, 0, 240, 264}, true}; @@ -22,6 +29,12 @@ class AboutView : public View { {240 / 3, 270, 240 / 3, 24}, "OK", }; + + MessageHandlerRegistration message_handler_frame_sync{ + Message::ID::DisplayFrameSync, + [this](const Message* const) { + this->on_frame_sync(); + }}; }; } // namespace ui diff --git a/firmware/application/apps/ui_aprs_rx.cpp b/firmware/application/apps/ui_aprs_rx.cpp index 9296a67d..d5ff4f23 100644 --- a/firmware/application/apps/ui_aprs_rx.cpp +++ b/firmware/application/apps/ui_aprs_rx.cpp @@ -94,21 +94,39 @@ APRSRxView::APRSRxView(NavigationView& nav, Rect parent_rect) record_view.set_sampling_rate(24000); options_region.on_change = [this](size_t, int32_t i) { - if (i == 0) { + field_frequency.on_change = [this](rf::Frequency f) { (void)f; }; + if (i == 0) { // MAN Manual setting + field_frequency.set_value(aprs_rx_freq); + } else if (i == 1) { // NA - North America - is also the default field_frequency.set_value(144390000); - } else if (i == 1) { + } else if (i == 2) { // EUR field_frequency.set_value(144800000); - } else if (i == 2) { + } else if (i == 3) { // AUS field_frequency.set_value(145175000); - } else if (i == 3) { + } else if (i == 4) { // NZ field_frequency.set_value(144575000); - } else if (i == 4) { + } else if (i == 5) { // ISS field_frequency.set_value(145825000); } + options_region_id = i; + receiver_model.set_target_frequency(field_frequency.value()); // Retune + field_frequency.on_change = [this](rf::Frequency f) { + aprs_rx_freq = f; + options_region.set_selected_index(0, true); + }; }; field_frequency.set_step(100); - options_region.set_selected_index(0, true); + field_frequency.on_edit = [this]() { + auto freq_view = nav_.push(field_frequency.value()); + freq_view->on_changed = [this](rf::Frequency f) { + aprs_rx_freq = f; + field_frequency.set_value(f); + }; + }; + + // Note: setting the region is also going to sef field_frequency.on_change + options_region.set_selected_index(options_region_id, true); logger = std::make_unique(); if (logger) @@ -124,6 +142,8 @@ APRSRxView::APRSRxView(NavigationView& nav, Rect parent_rect) void APRSRxView::on_freqchg(int64_t freq) { field_frequency.set_value(freq); + aprs_rx_freq = freq; + options_region.set_selected_index(0, true); } void APRSRxView::on_packet(const APRSPacketMessage* message) { diff --git a/firmware/application/apps/ui_aprs_rx.hpp b/firmware/application/apps/ui_aprs_rx.hpp index d2ebf6f5..6761842d 100644 --- a/firmware/application/apps/ui_aprs_rx.hpp +++ b/firmware/application/apps/ui_aprs_rx.hpp @@ -190,6 +190,8 @@ class APRSRxView : public View { private: void on_data(uint32_t value, bool is_data); bool reset_console = false; + uint8_t options_region_id = 1; // default to North America + rf::Frequency aprs_rx_freq{144390000}; // default to North America frequency NavigationView& nav_; RxRadioState radio_state_{ @@ -198,7 +200,10 @@ class APRSRxView : public View { 3072000 /* sampling rate */ }; app_settings::SettingsManager settings_{ - "rx_aprs", app_settings::Mode::RX}; + "rx_aprs", + app_settings::Mode::RX, + {{"options_region_id"sv, &options_region_id}, + {"aprs_rx_freq"sv, &aprs_rx_freq}}}; uint8_t console_color{0}; std::string str_log{""}; @@ -220,15 +225,15 @@ class APRSRxView : public View { OptionsField options_region{ {0 * 8, 0 * 8}, 3, - {{"NA ", 0}, - {"EUR", 1}, - {"AUS", 2}, - {"NZ ", 3}, - {"ISS", 4}}}; + {{"MAN", 0}, + {"NA ", 1}, + {"EUR", 2}, + {"AUS", 3}, + {"NZ ", 4}, + {"ISS", 5}}}; - RxFrequencyField field_frequency{ - {3 * 8, 0 * 16}, - nav_}; + FrequencyField field_frequency{ + {3 * 8, 0 * 16}}; // DEBUG RecordView record_view{ diff --git a/firmware/application/apps/ui_battinfo.cpp b/firmware/application/apps/ui_battinfo.cpp index fa875390..bb35fc22 100644 --- a/firmware/application/apps/ui_battinfo.cpp +++ b/firmware/application/apps/ui_battinfo.cpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2016 Furrtek + * Copyright (C) 2024 HTotoo * * This file is part of PortaPack. * @@ -49,10 +50,10 @@ void BattinfoView::update_result() { text_voltage.set("UNKNOWN"); text_current.set("-"); text_charge.set("-"); - text_cycles.set("-"); + // text_cycles.set("-"); text_ttef.set("-"); text_method.set("-"); - text_warn.set(""); + // text_warn.set(""); return; } bool uichg = false; @@ -74,7 +75,19 @@ void BattinfoView::update_result() { text_current.hidden(false); text_charge.hidden(false); text_current.set(to_string_dec_int(current) + " mA"); - text_charge.set(current >= 0 ? "Charging" : "Discharging"); + if (current >= 25) // when >25mA it is charging in any scenario + text_charge.set("Charging"); + else { + if (current > -25) { // between -25 and 25 + if (voltage > 4060 || percent == 100) { // the voltage is high enough, so it is full, that's why no mA + text_charge.set("Full"); + } else { + text_charge.set("Holding"); // not enough voltage, so should charge. maybe the batttery is off, or USB power is not enough + } + } else { + text_charge.set("Discharging"); // less then -25mA, so it is discharging + } + } labels_opt.hidden(false); text_ttef.hidden(false); @@ -83,26 +96,26 @@ void BattinfoView::update_result() { labels_opt.hidden(true); text_current.hidden(true); text_charge.hidden(true); - text_cycles.hidden(true); + // text_cycles.hidden(true); text_ttef.hidden(true); - text_warn.set(""); + // text_warn.set(""); } - if ((valid_mask & battery::BatteryManagement::BATT_VALID_CYCLES) == battery::BatteryManagement::BATT_VALID_CYCLES) { - text_cycles.hidden(false); - uint16_t cycles = battery::BatteryManagement::get_cycles(); + /* if ((valid_mask & battery::BatteryManagement::BATT_VALID_CYCLES) == battery::BatteryManagement::BATT_VALID_CYCLES) { + // text_cycles.hidden(false); + uint16_t cycles = 0; // battery::BatteryManagement::get_cycles(); if (cycles < 2) - text_warn.set("SoC improves after 2 cycles"); + text_warn.set("SoC improves after each cycles"); else text_warn.set(""); - text_cycles.set(to_string_dec_uint(cycles)); + // text_cycles.set(to_string_dec_uint(cycles)); } else { - text_cycles.hidden(true); + // text_cycles.hidden(true); text_warn.set(""); - } + } */ if ((valid_mask & battery::BatteryManagement::BATT_VALID_TTEF) == battery::BatteryManagement::BATT_VALID_TTEF) { text_ttef.hidden(false); float ttef = 0; - if (current <= 0) { + if (current <= 0) { // we keep this yet ttef = battery::BatteryManagement::get_tte(); } else { ttef = battery::BatteryManagement::get_ttf(); @@ -132,7 +145,7 @@ void BattinfoView::update_result() { } if (uichg) set_dirty(); // to update status bar too, send message in behalf of batt manager - BatteryStateMessage msg{valid_mask, percent, current >= 0, voltage}; + BatteryStateMessage msg{valid_mask, percent, current >= 25, voltage}; EventDispatcher::send_message(msg); } @@ -147,8 +160,8 @@ BattinfoView::BattinfoView(NavigationView& nav) &text_method, &button_mode, &button_exit, - &text_cycles, - &text_warn, + // &text_cycles, + // &text_warn, &text_ttef}); button_exit.on_select = [this, &nav](Button&) { @@ -185,4 +198,4 @@ BattinfoView::~BattinfoView() { thread = nullptr; } } -} // namespace ui +} // namespace ui \ No newline at end of file diff --git a/firmware/application/apps/ui_battinfo.hpp b/firmware/application/apps/ui_battinfo.hpp index 83b6112c..45960c2e 100644 --- a/firmware/application/apps/ui_battinfo.hpp +++ b/firmware/application/apps/ui_battinfo.hpp @@ -1,6 +1,7 @@ /* * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2016 Furrtek + * Copyright (C) 2024 HTotoo * * This file is part of PortaPack. * @@ -27,6 +28,7 @@ #include "ui_widget.hpp" #include "ui_navigation.hpp" #include "string_format.hpp" +#include "i2cdevmanager.hpp" namespace ui { class BattinfoView : public View { @@ -61,7 +63,7 @@ class BattinfoView : public View { {{2 * 8, 4 * 16}, "Current:", Theme::getInstance()->fg_light->foreground}, {{2 * 8, 5 * 16}, "Charge:", Theme::getInstance()->fg_light->foreground}, {{2 * 8, 6 * 16}, "TTF/E:", Theme::getInstance()->fg_light->foreground}, - {{2 * 8, 7 * 16}, "Cycles:", Theme::getInstance()->fg_light->foreground}, + // {{2 * 8, 7 * 16}, "Cycles:", Theme::getInstance()->fg_light->foreground}, {{2 * 8, 10 * 16}, "Change method:", Theme::getInstance()->fg_light->foreground}, }; @@ -83,13 +85,13 @@ class BattinfoView : public View { Text text_ttef{ {13 * 8, 6 * 16, 10 * 16, 16}, "-"}; - Text text_cycles{ + /* Text text_cycles{ {13 * 8, 7 * 16, 10 * 16, 16}, "-"}; Text text_warn{ - {2 * 8, 8 * 16, 30 * 8, 2 * 16}, - ""}; + {1 * 8, 8 * 16, 30 * 8, 2 * 16}, + ""}; */ Button button_mode{ {2 * 8, 11 * 16 + 5, 5 * 16, 32}, @@ -104,4 +106,4 @@ class BattinfoView : public View { } /* namespace ui */ -#endif /*__UI_BATTINFO__*/ +#endif /*__UI_BATTINFO__*/ \ No newline at end of file diff --git a/firmware/application/apps/ui_debug.cpp b/firmware/application/apps/ui_debug.cpp index 54844d6f..daa986f4 100644 --- a/firmware/application/apps/ui_debug.cpp +++ b/firmware/application/apps/ui_debug.cpp @@ -36,7 +36,8 @@ #include "ui_font_fixed_8x16.hpp" #include "ui_painter.hpp" #include "ui_external_items_menu_loader.hpp" -#include "ui_debug_battery.hpp" +#include "ui_debug_max17055.hpp" +#include "ui_external_module_view.hpp" #include "portapack.hpp" #include "portapack_persistent_memory.hpp" @@ -73,91 +74,6 @@ void DebugMemoryView::focus() { button_done.focus(); } -/* TemperatureWidget *****************************************************/ - -void TemperatureWidget::paint(Painter& painter) { - const auto logger = portapack::temperature_logger; - - const auto rect = screen_rect(); - const Color color_background{0, 0, 64}; - const Color color_foreground = Theme::getInstance()->fg_green->foreground; - const Color color_reticle{128, 128, 128}; - - const auto graph_width = static_cast(logger.capacity()) * bar_width; - const Rect graph_rect{ - rect.left() + (rect.width() - graph_width) / 2, rect.top() + 8, - graph_width, rect.height()}; - const Rect frame_rect{ - graph_rect.left() - 1, graph_rect.top() - 1, - graph_rect.width() + 2, graph_rect.height() + 2}; - painter.draw_rectangle(frame_rect, color_reticle); - painter.fill_rectangle(graph_rect, color_background); - - const auto history = logger.history(); - for (size_t i = 0; i < history.size(); i++) { - const Coord x = graph_rect.right() - (history.size() - i) * bar_width; - const auto sample = history[i]; - const auto temp = temperature(sample); - const auto y = screen_y(temp, graph_rect); - const Dim bar_height = graph_rect.bottom() - y; - painter.fill_rectangle({x, y, bar_width, bar_height}, color_foreground); - } - - if (!history.empty()) { - const auto sample = history.back(); - const auto temp = temperature(sample); - const auto last_y = screen_y(temp, graph_rect); - const Coord x = graph_rect.right() + 8; - const Coord y = last_y - 8; - - painter.draw_string({x, y}, style(), temperature_str(temp)); - } - - const auto display_temp_max = display_temp_min + (graph_rect.height() / display_temp_scale); - for (auto temp = display_temp_min; temp <= display_temp_max; temp += 10) { - const int32_t tick_length = 6; - const auto tick_x = graph_rect.left() - tick_length; - const auto tick_y = screen_y(temp, graph_rect); - painter.fill_rectangle({tick_x, tick_y, tick_length, 1}, color_reticle); - const auto text_x = graph_rect.left() - temp_len * 8 - 8; - const auto text_y = tick_y - 8; - painter.draw_string({text_x, text_y}, style(), temperature_str(temp)); - } -} - -TemperatureWidget::temperature_t TemperatureWidget::temperature(const sample_t sensor_value) const { - // Scaling is different for MAX2837 vs MAX2839 so it's now done in the respective chip-specific module - return sensor_value; -} - -std::string TemperatureWidget::temperature_str(const temperature_t temperature) const { - return to_string_dec_int(temperature, temp_len - 2) + STR_DEGREES_C; -} - -Coord TemperatureWidget::screen_y( - const temperature_t temperature, - const Rect& rect) const { - int y_raw = rect.bottom() - ((temperature - display_temp_min) * display_temp_scale); - const auto y_limit = std::min(rect.bottom(), std::max(rect.top(), y_raw)); - return y_limit; -} - -/* TemperatureView *******************************************************/ - -TemperatureView::TemperatureView(NavigationView& nav) { - add_children({ - &text_title, - &temperature_widget, - &button_done, - }); - - button_done.on_select = [&nav](Button&) { nav.pop(); }; -} - -void TemperatureView::focus() { - button_done.focus(); -} - /* RegistersWidget *******************************************************/ RegistersWidget::RegistersWidget( @@ -226,8 +142,10 @@ uint32_t RegistersWidget::reg_read(const uint32_t register_number) { return radio::debug::second_if::register_read(register_number); case CT_SI5351: return portapack::clock_generator.read_register(register_number); - case CT_BATTERY: - return battery::BatteryManagement::read_register(register_number); + case CT_MAX17055: { + i2cdev::I2cDev_MAX17055* dev = (i2cdev::I2cDev_MAX17055*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDEVMDL_MAX17055); + return dev->read_register(register_number); + } case CT_AUDIO: return audio::debug::reg_read(register_number); } @@ -249,9 +167,11 @@ void RegistersWidget::reg_write(const uint32_t register_number, const uint32_t v case CT_SI5351: portapack::clock_generator.write_register(register_number, value); break; - case CT_BATTERY: - battery::BatteryManagement::write_register(register_number, value); + case CT_MAX17055: { + i2cdev::I2cDev_MAX17055* dev = (i2cdev::I2cDev_MAX17055*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDEVMDL_MAX17055); + dev->write_register(register_number, value); break; + } case CT_AUDIO: audio::debug::reg_write(register_number, value); break; @@ -465,9 +385,9 @@ void DebugPeripheralsMenuView::on_populate() { {si5351x, Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_peripherals_details, [this, si5351x]() { nav_.push(si5351x, RegistersWidgetConfig{CT_SI5351, 188, 96, 8}); }}, {audio::debug::codec_name(), Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_peripherals_details, [this]() { nav_.push(audio::debug::codec_name(), RegistersWidgetConfig{CT_AUDIO, audio::debug::reg_count(), audio::debug::reg_count(), audio::debug::reg_bits()}); }}, }); - if (battery::BatteryManagement::detectedModule() == battery::BatteryManagement::BatteryModules::BATT_MAX17055) { + if (i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDEVMDL_MAX17055)) { add_item( - {"MAX17055", Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_peripherals_details, [this]() { nav_.push("MAX17055", RegistersWidgetConfig{CT_BATTERY, 256, 16, 16}); }}); + {"MAX17055", Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_peripherals_details, [this]() { nav_.push("MAX17055", RegistersWidgetConfig{CT_MAX17055, 256, 16, 16}); }}); } set_max_rows(2); // allow wider buttons } @@ -502,17 +422,15 @@ void DebugMenuView::on_populate() { {"Debug Dump", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_memory, [this]() { portapack::persistent_memory::debug_dump(); }}, {"M0 Stack Dump", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_memory, [this]() { stack_dump(); }}, {"Memory Dump", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_memory, [this]() { nav_.push(); }}, - //{"Memory Usage", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_memory, [this]() { nav_.push(); }}, {"Peripherals", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_peripherals, [this]() { nav_.push(); }}, {"Pers. Memory", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_memory, [this]() { nav_.push(); }}, - //{ "Radio State", ui::Theme::getInstance()->bg_darkest->foreground, nullptr, [this](){ nav_.push(); } }, {"SD Card", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_sdcard, [this]() { nav_.push(); }}, - {"Temperature", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_temperature, [this]() { nav_.push(); }}, {"Touch Test", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_notepad, [this]() { nav_.push(); }}, {"Reboot", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_setup, [this]() { nav_.push(); }}, + {"Ext Module", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_peripherals_details, [this]() { nav_.push(); }}, }); - if (battery::BatteryManagement::detectedModule() == battery::BatteryManagement::BatteryModules::BATT_MAX17055) { + if (i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDEVMDL_MAX17055)) { add_item( {"Battery", ui::Theme::getInstance()->fg_darkcyan->foreground, &bitmap_icon_batt_icon, [this]() { nav_.push(); }}); } diff --git a/firmware/application/apps/ui_debug.hpp b/firmware/application/apps/ui_debug.hpp index 25007bbd..6c7b0c43 100644 --- a/firmware/application/apps/ui_debug.hpp +++ b/firmware/application/apps/ui_debug.hpp @@ -86,60 +86,13 @@ class DebugMemoryView : public View { "Done"}; }; -class TemperatureWidget : public Widget { - public: - explicit TemperatureWidget( - Rect parent_rect) - : Widget{parent_rect} { - } - - void paint(Painter& painter) override; - - private: - using sample_t = uint32_t; - using temperature_t = int32_t; - - temperature_t temperature(const sample_t sensor_value) const; - Coord screen_y(const temperature_t temperature, const Rect& screen_rect) const; - - std::string temperature_str(const temperature_t temperature) const; - - static constexpr temperature_t display_temp_min = -10; // Accomodate negative values, present in cold startup cases - static constexpr temperature_t display_temp_scale = 3; - static constexpr int bar_width = 1; - static constexpr int temp_len = 5; // Now scale shows up to 5 chars ("-10ºC") -}; - -class TemperatureView : public View { - public: - explicit TemperatureView(NavigationView& nav); - - void focus() override; - - std::string title() const override { return "Temperature"; }; - - private: - Text text_title{ - {76, 16, 240, 16}, - "Temperature", - }; - - TemperatureWidget temperature_widget{ - {0, 40, 240, 180}, - }; - - Button button_done{ - {72, 264, 96, 24}, - "Done"}; -}; - typedef enum { CT_PMEM, CT_RFFC5072, CT_MAX283X, CT_SI5351, CT_AUDIO, - CT_BATTERY, + CT_MAX17055, } chip_type_t; struct RegistersWidgetConfig { diff --git a/firmware/application/apps/ui_debug_battery.cpp b/firmware/application/apps/ui_debug_max17055.cpp similarity index 78% rename from firmware/application/apps/ui_debug_battery.cpp rename to firmware/application/apps/ui_debug_max17055.cpp index 2099d02c..79cd45d5 100644 --- a/firmware/application/apps/ui_debug_battery.cpp +++ b/firmware/application/apps/ui_debug_max17055.cpp @@ -1,11 +1,11 @@ -#include "ui_debug_battery.hpp" +#include "ui_debug_max17055.hpp" #include "string_format.hpp" namespace ui { BatteryCapacityView::RegisterEntry BatteryCapacityView::get_entry(size_t index) { - if (index < battery::max17055::MAX17055::entries_count) { - return battery::max17055::MAX17055::entries[index]; + if (index < i2cdev::I2cDev_MAX17055::entries_count) { + return i2cdev::I2cDev_MAX17055::entries[index]; } return {"", 0, "", 0, false, "", false, 0, false, false, false, 0, false}; } @@ -27,6 +27,12 @@ BatteryCapacityView::BatteryCapacityView(NavigationView& nav) { button_done.on_select = [&nav](Button&) { nav.pop(); }; + auto dev = (i2cdev::I2cDev_MAX17055*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDEVMDL_MAX17055); + if (!dev) { // dev not found + nav.pop(); + return; + } + populate_page(0); update_page_text(); } @@ -37,7 +43,7 @@ void BatteryCapacityView::focus() { bool BatteryCapacityView::on_encoder(const EncoderEvent delta) { int32_t new_page = current_page + delta; - if (new_page >= 0 && new_page < ((int32_t)battery::max17055::MAX17055::entries_count + ENTRIES_PER_PAGE - 1) / ENTRIES_PER_PAGE) { + if (new_page >= 0 && new_page < ((int32_t)i2cdev::I2cDev_MAX17055::entries_count + ENTRIES_PER_PAGE - 1) / ENTRIES_PER_PAGE) { current_page = new_page; populate_page(current_page * ENTRIES_PER_PAGE); update_page_text(); @@ -46,11 +52,12 @@ bool BatteryCapacityView::on_encoder(const EncoderEvent delta) { } void BatteryCapacityView::update_values() { + i2cdev::I2cDev_MAX17055* dev = (i2cdev::I2cDev_MAX17055*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDEVMDL_MAX17055); for (size_t i = 0; i < ENTRIES_PER_PAGE; ++i) { size_t entry_index = current_page * ENTRIES_PER_PAGE + i; - if (entry_index < battery::max17055::MAX17055::entries_count) { + if (entry_index < i2cdev::I2cDev_MAX17055::entries_count) { const auto entry = get_entry(entry_index); - uint16_t raw_value = battery::BatteryManagement::read_register(entry.address); + uint16_t raw_value = dev->read_register(entry.address); hex_texts[i].set("0x" + to_string_hex(raw_value, 4)); @@ -78,7 +85,7 @@ void BatteryCapacityView::update_values() { void BatteryCapacityView::populate_page(int start_index) { for (size_t i = 0; i < ENTRIES_PER_PAGE; ++i) { size_t entry_index = start_index + i; - if (entry_index < battery::max17055::MAX17055::entries_count) { + if (entry_index < i2cdev::I2cDev_MAX17055::entries_count) { const auto entry = get_entry(entry_index); name_texts[i].set(entry.name); addr_texts[i].set("0x" + to_string_hex(entry.address, 2)); @@ -97,7 +104,7 @@ void BatteryCapacityView::populate_page(int start_index) { } void BatteryCapacityView::update_page_text() { - int total_pages = (battery::max17055::MAX17055::entries_count + ENTRIES_PER_PAGE - 1) / ENTRIES_PER_PAGE; + int total_pages = (i2cdev::I2cDev_MAX17055::entries_count + ENTRIES_PER_PAGE - 1) / ENTRIES_PER_PAGE; page_text.set("Page " + to_string_dec_uint(current_page + 1) + "/" + to_string_dec_uint(total_pages)); } diff --git a/firmware/application/apps/ui_debug_battery.hpp b/firmware/application/apps/ui_debug_max17055.hpp similarity index 91% rename from firmware/application/apps/ui_debug_battery.hpp rename to firmware/application/apps/ui_debug_max17055.hpp index 3fafa305..10791026 100644 --- a/firmware/application/apps/ui_debug_battery.hpp +++ b/firmware/application/apps/ui_debug_max17055.hpp @@ -5,7 +5,8 @@ #include "ui_widget.hpp" #include "ui_navigation.hpp" #include "battery.hpp" -#include "max17055.hpp" +#include "i2cdevmanager.hpp" +#include "i2cdev_max17055.hpp" namespace ui { @@ -17,7 +18,7 @@ class BatteryCapacityView : public View { bool on_encoder(const EncoderEvent delta) override; - using RegisterEntry = battery::max17055::RegisterEntry; + using RegisterEntry = i2cdev::I2cDev_MAX17055::RegisterEntry; private: static RegisterEntry get_entry(size_t index); diff --git a/firmware/application/apps/ui_dfu_menu.cpp b/firmware/application/apps/ui_dfu_menu.cpp index d77d4c92..3bef06e3 100644 --- a/firmware/application/apps/ui_dfu_menu.cpp +++ b/firmware/application/apps/ui_dfu_menu.cpp @@ -41,11 +41,6 @@ DfuMenu::DfuMenu(NavigationView& nav) &text_info_line_8, &text_info_line_9, &text_info_line_10}); - - if (battery::BatteryManagement::isDetected()) { - add_child(&voltage_label); - add_child(&text_info_line_11); - } } void DfuMenu::paint(Painter& painter) { @@ -53,7 +48,7 @@ void DfuMenu::paint(Painter& painter) { size_t m0_fragmented_free_space = 0; const auto m0_fragments = chHeapStatus(NULL, &m0_fragmented_free_space); - auto lines = (battery::BatteryManagement::isDetected() ? 11 : 10) + 2; + auto lines = 10 + 2; text_info_line_1.set(to_string_dec_uint(chCoreStatus(), 6)); text_info_line_2.set(to_string_dec_uint(m0_fragmented_free_space, 6)); @@ -65,9 +60,6 @@ void DfuMenu::paint(Painter& painter) { text_info_line_8.set(to_string_dec_uint(shared_memory.m4_performance_counter, 6)); text_info_line_9.set(to_string_dec_uint(shared_memory.m4_buffer_missed, 6)); text_info_line_10.set(to_string_dec_uint(chTimeNow() / 1000, 6)); - if (battery::BatteryManagement::isDetected()) { - text_info_line_11.set(to_string_decimal_padding((float)battery::BatteryManagement::getVoltage() / 1000.0, 3, 6)); - } constexpr auto margin = 5; diff --git a/firmware/application/apps/ui_dfu_menu.hpp b/firmware/application/apps/ui_dfu_menu.hpp index 9bcdb48c..a95fb648 100644 --- a/firmware/application/apps/ui_dfu_menu.hpp +++ b/firmware/application/apps/ui_dfu_menu.hpp @@ -60,8 +60,6 @@ class DfuMenu : public View { {{6 * CHARACTER_WIDTH, 13 * LINE_HEIGHT}, "M4 miss:", Theme::getInstance()->fg_darkcyan->foreground}, {{6 * CHARACTER_WIDTH, 14 * LINE_HEIGHT}, "Uptime:", Theme::getInstance()->fg_darkcyan->foreground}}; - Labels voltage_label{{{6 * CHARACTER_WIDTH, 15 * LINE_HEIGHT}, "Voltage:", Theme::getInstance()->fg_darkcyan->foreground}}; - Text text_info_line_1{{15 * CHARACTER_WIDTH, 5 * LINE_HEIGHT, 6 * CHARACTER_WIDTH, 1 * LINE_HEIGHT}, ""}; Text text_info_line_2{{15 * CHARACTER_WIDTH, 6 * LINE_HEIGHT, 6 * CHARACTER_WIDTH, 1 * LINE_HEIGHT}, ""}; Text text_info_line_3{{15 * CHARACTER_WIDTH, 7 * LINE_HEIGHT, 6 * CHARACTER_WIDTH, 1 * LINE_HEIGHT}, ""}; @@ -72,7 +70,6 @@ class DfuMenu : public View { Text text_info_line_8{{15 * CHARACTER_WIDTH, 12 * LINE_HEIGHT, 6 * CHARACTER_WIDTH, 1 * LINE_HEIGHT}, ""}; Text text_info_line_9{{15 * CHARACTER_WIDTH, 13 * LINE_HEIGHT, 6 * CHARACTER_WIDTH, 1 * LINE_HEIGHT}, ""}; Text text_info_line_10{{15 * CHARACTER_WIDTH, 14 * LINE_HEIGHT, 6 * CHARACTER_WIDTH, 1 * LINE_HEIGHT}, ""}; - Text text_info_line_11{{15 * CHARACTER_WIDTH, 15 * LINE_HEIGHT, 6 * CHARACTER_WIDTH, 1 * LINE_HEIGHT}, ""}; }; class DfuMenu2 : public View { diff --git a/firmware/application/apps/ui_encoders.cpp b/firmware/application/apps/ui_encoders.cpp index 60d386a0..da174f6b 100644 --- a/firmware/application/apps/ui_encoders.cpp +++ b/firmware/application/apps/ui_encoders.cpp @@ -25,6 +25,9 @@ #include "baseband_api.hpp" #include "string_format.hpp" +#define PADDING_LEFT 1 +#define PADDING_RIGHT 1 + using namespace portapack; namespace ui { @@ -58,6 +61,7 @@ EncodersConfigView::EncodersConfigView( options_enctype.on_change = [this](size_t index, int32_t) { on_type_change(index); + set_dirty(); }; options_enctype.set_options(enc_options); @@ -104,7 +108,18 @@ void EncodersConfigView::on_type_change(size_t index) { // Add new SymFields. Point pos{2 * 8, 9 * 8}; - std::string format_string; + std::string format_string = encoder_def->word_format; + + /*important notes of this format_String + * previously before PR#1444, this code using the for loop below to generate the format_string, which MAYBE to prevent showing the S symble. + * but after PR#1444, the entireh of symfield code not compatible with this design anymore. + * however the encoder_def struct itself has a field called word_format, which exactly be avle to use as the format_string, + * because itself is ONLY a hint text, not impact protocol things. + * When you find OOK protocol is broken and see this commit from git blame, please be aware that it's not from here. + * previously me and @cusspvz already found it broken, this commit is just to fix the broken that from PR#1444. + * @zxkmm + */ + uint8_t word_length = encoder_def->word_length; auto on_change_handler = [this](SymField&) { generate_frame(); @@ -119,11 +134,9 @@ void EncodersConfigView::on_type_change(size_t index) { switch (symbol_type) { case 'A': symfield->set_symbol_list(encoder_def->address_symbols); - format_string += 'A'; break; case 'D': symfield->set_symbol_list(encoder_def->data_symbols); - format_string += 'D'; break; } @@ -131,8 +144,8 @@ void EncodersConfigView::on_type_change(size_t index) { pos += Point{8, 0}; } - // Ugly :( Pad to erase - format_string.append(24 - format_string.size(), ' '); + // cut the S, cuz sync bit isn't in symfield for user to chage/edit. + format_string.erase(std::remove(format_string.begin(), format_string.end(), 'S'), format_string.end()); text_format.set(format_string); generate_frame(); @@ -144,12 +157,34 @@ void EncodersConfigView::on_show() { } void EncodersConfigView::draw_waveform() { + // padding reason: + // in real world the signal would always start with low level and became low level again after yout turn off the radio; + // the waveform_buffer only controls drawing, the real send logic that been sent is controlled by frame_fragments + // so just for out of looking things + size_t length = frame_fragments.length(); - for (size_t n = 0; n < length; n++) - waveform_buffer[n] = (frame_fragments[n] == '0') ? 0 : 1; + // currently not needed since all the supported OOK protocol wont exceed 550 yet + if (length + (PADDING_LEFT + PADDING_RIGHT) >= WAVEFORM_BUFFER_SIZE) { + length = WAVEFORM_BUFFER_SIZE - (PADDING_LEFT + PADDING_RIGHT); + } - waveform.set_length(length); + // padding l + for (size_t i = 0; i < PADDING_LEFT; i++) { + waveform_buffer[i] = 0; + } + + // real wf + for (size_t n = 0; n < length; n++) { + waveform_buffer[n + PADDING_LEFT] = (frame_fragments[n] == '0') ? 0 : 1; + } + + // padding r + for (size_t i = length + PADDING_LEFT; i < WAVEFORM_BUFFER_SIZE; i++) { + waveform_buffer[i] = 0; + } + + waveform.set_length(length + PADDING_LEFT + PADDING_RIGHT); waveform.set_dirty(); } diff --git a/firmware/application/apps/ui_encoders.hpp b/firmware/application/apps/ui_encoders.hpp index e1661891..39879d49 100644 --- a/firmware/application/apps/ui_encoders.hpp +++ b/firmware/application/apps/ui_encoders.hpp @@ -32,6 +32,8 @@ #include #include +#define WAVEFORM_BUFFER_SIZE 550 + using namespace encoders; namespace ui { @@ -56,7 +58,7 @@ class EncodersConfigView : public View { std::string frame_fragments = "0"; private: - int16_t waveform_buffer[550]; + int16_t waveform_buffer[WAVEFORM_BUFFER_SIZE]; const encoder_def_t* encoder_def{}; void draw_waveform(); diff --git a/firmware/application/apps/ui_external_module_view.cpp b/firmware/application/apps/ui_external_module_view.cpp new file mode 100644 index 00000000..5e376981 --- /dev/null +++ b/firmware/application/apps/ui_external_module_view.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2024 Bernd Herzog + * + * 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 "ui_external_module_view.hpp" +#include "portapack.hpp" +#include "ui_standalone_view.hpp" + +#include "i2cdevmanager.hpp" +#include "i2cdev_ppmod.hpp" + +#include + +namespace ui { + +void ExternalModuleView::focus() { + dummy.focus(); +} + +void ExternalModuleView::on_tick_second() { + i2cdev::I2CDevManager::manual_scan(); + + auto dev = (i2cdev::I2cDev_PPmod*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDECMDL_PPMOD); + + if (!dev) { + text_header.set("No module connected"); + text_name.set(""); + text_version.set(""); + text_number_apps.set(""); + text_app1_name.set(""); + text_app2_name.set(""); + text_app3_name.set(""); + text_app4_name.set(""); + text_app5_name.set(""); + return; + } + + auto device_info = dev->readDeviceInfo(); + + if (device_info.has_value() == false) { + text_header.set("No module connected"); + text_name.set(""); + text_version.set(""); + text_number_apps.set(""); + text_app1_name.set(""); + text_app2_name.set(""); + text_app3_name.set(""); + text_app4_name.set(""); + text_app5_name.set(""); + return; + } + + text_header.set("Module found"); + + std::string btnText = (std::string) "Module: " + device_info->module_name; + text_name.set(btnText); + text_version.set("Version: " + std::to_string(device_info->module_version)); + text_number_apps.set("No# Apps: " + std::to_string(device_info->application_count)); + + for (uint32_t i = 0; i < device_info->application_count && i < 5; i++) { + auto appInfo = dev->getStandaloneAppInfo(i); + if (appInfo.has_value() == false) { + continue; + } + + std::string btnText = (std::string) "App " + std::to_string(i + 1) + ": " + (const char*)appInfo->app_name; + + switch (appInfo->menu_location) { + case app_location_t::UTILITIES: + btnText += " (Utilities)"; + break; + case app_location_t::RX: + btnText += " (RX)"; + break; + case app_location_t::TX: + btnText += " (TX)"; + break; + case app_location_t::DEBUG: + btnText += " (Debug)"; + break; + case app_location_t::HOME: + btnText += " (Home)"; + break; + } + + switch (i) { + case 0: + text_app1_name.set(btnText); + break; + case 1: + text_app2_name.set(btnText); + break; + case 2: + text_app3_name.set(btnText); + break; + case 3: + text_app4_name.set(btnText); + break; + case 4: + text_app5_name.set(btnText); + break; + } + } +} +} // namespace ui diff --git a/firmware/application/apps/ui_external_module_view.hpp b/firmware/application/apps/ui_external_module_view.hpp new file mode 100644 index 00000000..f09cf2f2 --- /dev/null +++ b/firmware/application/apps/ui_external_module_view.hpp @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2024 Bernd Herzog + * + * 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 __UI_EXTERNAL_MODULE_VIEW_H +#define __UI_EXTERNAL_MODULE_VIEW_H + +#include "ui.hpp" +#include "ui_widget.hpp" +#include "ui_painter.hpp" +#include "ui_menu.hpp" +#include "ui_navigation.hpp" + +#include "rffc507x.hpp" +#include "portapack.hpp" +#include "memory_map.hpp" +#include "irq_controls.hpp" + +#include +#include + +#include "i2cdevmanager.hpp" +#include "i2cdev_ppmod.hpp" + +namespace ui { + +class ExternalModuleView : public View { + public: + ExternalModuleView(NavigationView& nav) + : nav_(nav) { + add_children({&text_header, + &text_name, + &text_version, + &text_number_apps, + &text_app1_name, + &text_app2_name, + &text_app3_name, + &text_app4_name, + &text_app5_name, + &dummy}); + + text_header.set("No module connected"); + + signal_token_tick_second = rtc_time::signal_tick_second += [this]() { + on_tick_second(); + }; + } + + ~ExternalModuleView() { + rtc_time::signal_tick_second -= signal_token_tick_second; + } + + std::string title() const override { return "Ext Module"; }; + void focus() override; + + private: + NavigationView& nav_; + Text text_header{{16, 16, 208, 16}}; + Text text_name{{24, 32, 200, 16}}; + Text text_version{{24, 48, 200, 16}}; + Text text_number_apps{{24, 64, 200, 16}}; + + Text text_app1_name{{24, 96, 200, 16}}; + Text text_app2_name{{24, 112, 200, 16}}; + Text text_app3_name{{24, 128, 200, 16}}; + Text text_app4_name{{24, 144, 200, 16}}; + Text text_app5_name{{24, 160, 200, 16}}; + + Button dummy{ + {240, 0, 0, 0}, + ""}; + + SignalToken signal_token_tick_second{}; + + void on_tick_second(); +}; + +} // namespace ui + +#endif diff --git a/firmware/application/apps/ui_fileman.cpp b/firmware/application/apps/ui_fileman.cpp index 3351cc84..bcc80fd8 100644 --- a/firmware/application/apps/ui_fileman.cpp +++ b/firmware/application/apps/ui_fileman.cpp @@ -27,7 +27,6 @@ #include #include "ui_fileman.hpp" #include "ui_playlist.hpp" -#include "ui_remote.hpp" #include "ui_ss_viewer.hpp" #include "ui_bmp_file_viewer.hpp" #include "ui_text_editor.hpp" @@ -704,10 +703,11 @@ bool FileManagerView::handle_file_open() { reload_current(false); return true; - } else if (path_iequal(rem_ext, ext)) { + } + /*else if (path_iequal(rem_ext, ext)) { nav_.push(path); return true; - } + }*/ return false; } @@ -751,10 +751,17 @@ FileManagerView::FileManagerView( text_date.set("Too many files!"); } else { text_date.set_style(Theme::getInstance()->fg_medium); - if (selected_is_valid()) - text_date.set((is_directory(get_selected_full_path()) ? "Created " : "Modified ") + to_string_FAT_timestamp(file_created_date(get_selected_full_path()))); - else + if (selected_is_valid()) { + if (get_selected_entry().path == str_back) { + text_date.set("Go page " + std::to_string(pagination + 1 - 1)); // for better explain, pagination start with 0 AKA real page - 1 + } else if (get_selected_entry().path == str_next) { + text_date.set("Go page " + std::to_string(pagination + 1 + 1)); // when show this, it should display current AKA (pagination + 1) + 1 AKA next page + } else { + text_date.set((is_directory(get_selected_full_path()) ? "Created " : "Modified ") + to_string_FAT_timestamp(file_created_date(get_selected_full_path()))); + } + } else { text_date.set(""); + } } }; diff --git a/firmware/application/apps/ui_flash_utility.cpp b/firmware/application/apps/ui_flash_utility.cpp index 2eb935f9..55d5a23b 100644 --- a/firmware/application/apps/ui_flash_utility.cpp +++ b/firmware/application/apps/ui_flash_utility.cpp @@ -95,7 +95,7 @@ FlashUtilityView::FlashUtilityView(NavigationView& nav) menu_view.add_item({filename.string().substr(0, max_filename_length), color, - &bitmap_icon_temperature, + &bitmap_icon_peripherals_details, [this, path](KeyEvent) { this->firmware_selected(path); }}); diff --git a/firmware/application/apps/ui_freqman.cpp b/firmware/application/apps/ui_freqman.cpp index 7b6ea5a7..7e230dc6 100644 --- a/firmware/application/apps/ui_freqman.cpp +++ b/firmware/application/apps/ui_freqman.cpp @@ -40,27 +40,39 @@ namespace fs = std::filesystem; // TODO: Clean up after moving to better lookup tables. using options_t = OptionsField::options_t; -extern options_t freqman_modulations; -extern options_t freqman_bandwidths[4]; -extern options_t freqman_steps; -extern options_t freqman_steps_short; + +using option_db_t = std::pair; +using options_db_t = std::vector; + +extern options_db_t freqman_modulations; +extern options_db_t freqman_bandwidths[4]; +extern options_db_t freqman_steps; +extern options_db_t freqman_steps_short; + +options_t dboptions_to_options(const options_db_t& dboptions) { + options_t options; + for (const auto& dboption : dboptions) { + options.emplace_back(dboption.first, dboption.second); + } + return options; +} /* Set options. */ void freqman_set_modulation_option(OptionsField& option) { - option.set_options(freqman_modulations); + option.set_options(dboptions_to_options(freqman_modulations)); } void freqman_set_bandwidth_option(freqman_index_t modulation, OptionsField& option) { if (is_valid(modulation)) - option.set_options(freqman_bandwidths[modulation]); + option.set_options(dboptions_to_options(freqman_bandwidths[modulation])); } void freqman_set_step_option(OptionsField& option) { - option.set_options(freqman_steps); + option.set_options(dboptions_to_options(freqman_steps)); } void freqman_set_step_option_short(OptionsField& option) { - option.set_options(freqman_steps_short); + option.set_options(dboptions_to_options(freqman_steps_short)); } namespace ui { @@ -438,7 +450,7 @@ void FrequencyEditView::populate_bandwidth_options() { auto& bandwidths = freqman_bandwidths[entry_.modulation]; for (auto i = 0u; i < bandwidths.size(); ++i) { auto& item = bandwidths[i]; - options.push_back({item.first, (OptionsField::value_t)i}); + options.push_back({(std::string)item.first, (OptionsField::value_t)i}); } } @@ -451,7 +463,7 @@ void FrequencyEditView::populate_step_options() { for (auto i = 0u; i < freqman_steps.size(); ++i) { auto& item = freqman_steps[i]; - options.push_back({item.first, (OptionsField::value_t)i}); + options.push_back({(std::string)item.first, (OptionsField::value_t)i}); } field_step.set_options(std::move(options)); diff --git a/firmware/application/apps/ui_fsk_rx.cpp b/firmware/application/apps/ui_fsk_rx.cpp deleted file mode 100644 index 17380858..00000000 --- a/firmware/application/apps/ui_fsk_rx.cpp +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 "ui_fsk_rx.hpp" - -#include "audio.hpp" -#include "baseband_api.hpp" -#include "portapack_persistent_memory.hpp" -#include "string_format.hpp" -#include "utility.hpp" -#include "file_path.hpp" - -#include "ui_freqman.hpp" - -using namespace portapack; -namespace pmem = portapack::persistent_memory; - -void FskRxLogger::log_raw_data(const std::string& data, const uint32_t frequency) { - std::string entry = "Raw: F:" + to_string_dec_uint(frequency) + "Hz"; - - // // Raw hex dump of all the codewords - // for (size_t c = 0; c < 16; c++) - // entry += to_string_hex(packet[c], 8) + " "; - - log_file.write_entry(data + entry); -} - -void FskRxLogger::log_decoded(Timestamp timestamp, const std::string& text) { - log_file.write_entry(timestamp, text); -} - -namespace ui { -//--------------------------------------------------------------------------------------------------------------- -// Console View -//--------------------------------------------------------------------------------------------------------------- -FskRxAppConsoleView::FskRxAppConsoleView(NavigationView& nav, Rect parent_rect) - : View(parent_rect), nav_{nav} { - add_child(&console); -}; - -void FskRxAppConsoleView::on_packet(uint32_t value, bool is_data) { - if (is_data) { - console.write(to_string_dec_uint(value) + " "); - } -} - -void FskRxAppConsoleView::on_show() { - hidden(false); -} - -void FskRxAppConsoleView::on_hide() { - hidden(true); -} - -FskRxAppConsoleView::~FskRxAppConsoleView() { -} - -//--------------------------------------------------------------------------------------------------------------- -// Spectrum View -//--------------------------------------------------------------------------------------------------------------- -FskRxAppView::FskRxAppView(NavigationView& nav, Rect parent_rect) - : View(parent_rect), nav_{nav} { - add_child(&waterfall); - hidden(true); -} - -FskRxAppView::~FskRxAppView() { -} - -void FskRxAppView::focus() { -} - -void FskRxAppView::on_show() { - hidden(false); - waterfall.start(); -} - -void FskRxAppView::on_hide() { - hidden(true); - waterfall.stop(); -} - -//--------------------------------------------------------------------------------------------------------------- -// Base View -//--------------------------------------------------------------------------------------------------------------- -FskxRxMainView::FskxRxMainView(NavigationView& nav) - : nav_{nav} { - add_children({&tab_view, - &view_data, - &view_stream, - &labels, - &rssi, - &channel, - &field_rf_amp, - &field_lna, - &field_vga, - &field_frequency, - &deviation_frequency, - &record_view}); - - baseband::run_image(portapack::spi_flash::image_tag_fskrx); - - // DEBUG - record_view.on_error = [&nav](std::string message) { - nav.display_modal("Error", message); - }; - - deviation_frequency.on_change = [this](rf::Frequency f) { - refresh_ui(f); - }; - - // Set initial sampling rate - /* Bandwidth of 2FSK is 2 * Deviation */ - record_view.set_sampling_rate(initial_deviation * 2); - - field_frequency.set_value(initial_target_frequency); - deviation_frequency.set_value(initial_deviation); - - logger.append(logs_dir / u"FSKRX.TXT"); - - baseband::set_fsk(initial_deviation); - - audio::output::start(); - receiver_model.enable(); -} - -void FskxRxMainView::handle_decoded(Timestamp timestamp, const std::string& prefix) { - if (logging()) { - logger.log_decoded(timestamp, prefix); - } -} - -void FskxRxMainView::refresh_ui(rf::Frequency deviationHz) { - /* Nyquist would imply a sample rate of 2x bandwidth, but because the ADC - * provides 2 values (I,Q), the sample_rate is equal to bandwidth here. */ - /* Bandwidth of 2FSK is 2 * Deviation */ - auto sample_rate = deviationHz * 2; - - /* base_rate (bandwidth) is used for FFT calculation and display LCD, and also in recording writing SD Card rate. */ - /* ex. sampling_rate values, 4Mhz, when recording 500 kHz (BW) and fs 8 Mhz, when selected 1 Mhz BW ... */ - /* ex. recording 500kHz BW to .C16 file, base_rate clock 500kHz x2(I,Q) x 2 bytes (int signed) =2MB/sec rate SD Card. */ - - if (!view_stream.hidden()) { - view_stream.waterfall.stop(); - } - - // record_view determines the correct oversampling to apply and returns the actual sample rate. - // NB: record_view is what actually updates proc_capture baseband settings. - auto actual_sample_rate = record_view.set_sampling_rate(sample_rate); - - // Update the radio model with the actual sampling rate. - receiver_model.set_sampling_rate(actual_sample_rate); - - // Get suitable anti-aliasing BPF bandwidth for MAX2837 given the actual sample rate. - auto anti_alias_filter_bandwidth = filter_bandwidth_for_sampling_rate(actual_sample_rate); - receiver_model.set_baseband_bandwidth(anti_alias_filter_bandwidth); - - if (!view_stream.hidden()) { - view_stream.waterfall.start(); - } -} - -void FskxRxMainView::focus() { - field_frequency.focus(); -} - -void FskxRxMainView::set_parent_rect(const Rect new_parent_rect) { - View::set_parent_rect(new_parent_rect); - - ui::Rect waterfall_rect{0, 0, new_parent_rect.width(), new_parent_rect.height() - header_height}; - view_stream.waterfall.set_parent_rect(waterfall_rect); -} - -FskxRxMainView::~FskxRxMainView() { - audio::output::stop(); - receiver_model.disable(); - baseband::shutdown(); -} -} /* namespace ui */ diff --git a/firmware/application/apps/ui_fsk_rx.hpp b/firmware/application/apps/ui_fsk_rx.hpp deleted file mode 100644 index bcebbfb3..00000000 --- a/firmware/application/apps/ui_fsk_rx.hpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2018 Furrtek - * Copyright (C) 2023 gullradriel, Nilorea Studio 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 __UI_FSK_RX_H__ -#define __UI_FSK_RX_H__ - -#include "ui_widget.hpp" -#include "ui_freq_field.hpp" -#include "ui_receiver.hpp" -#include "ui_record_view.hpp" -#include "ui_rssi.hpp" -#include "ui_spectrum.hpp" -#include "ui_tabview.hpp" - -#include "app_settings.hpp" -#include "log_file.hpp" -#include "radio_state.hpp" -#include "pocsag_app.hpp" - -#include - -class FskRxLogger { - public: - Optional append(const std::filesystem::path& filename) { - return log_file.append(filename); - } - - void log_raw_data(const std::string& data, const uint32_t frequency); - void log_decoded(Timestamp timestamp, const std::string& text); - - private: - LogFile log_file{}; -}; - -namespace ui { -class FskRxAppConsoleView : public View { - public: - FskRxAppConsoleView(NavigationView& nav, Rect parent_rec); - ~FskRxAppConsoleView(); - - std::string title() const override { return "FSK RX Data"; }; - - void on_packet(uint32_t value, bool is_data); - - void on_show() override; - void on_hide() override; - - private: - NavigationView& nav_; - - Console console{ - {0, 0, 240, 224}}; -}; - -class FskRxAppView : public View { - public: - FskRxAppView(NavigationView& nav, Rect parent_rect); - ~FskRxAppView(); - - void focus() override; - void on_show() override; - void on_hide() override; - - spectrum::WaterfallView waterfall{}; - - std::string title() const override { return "FSK RX Stream"; }; - - private: - NavigationView& nav_; - RxRadioState radio_state_{}; -}; - -class FskxRxMainView : public View { - public: - FskxRxMainView(NavigationView& nav); - ~FskxRxMainView(); - - void focus() override; - void set_parent_rect(const Rect new_parent_rect) override; - - std::string title() const override { return "FSK RX"; }; - - private: - static constexpr uint32_t initial_target_frequency = 902'075'000; - static constexpr ui::Dim header_height = (5 * 16); - - uint32_t initial_deviation{3750}; - - bool logging() const { return false; }; - bool logging_raw() const { return false; }; - - NavigationView& nav_; - Rect view_rect = {0, header_height, 240, 224}; - - FskRxAppView view_stream{nav_, view_rect}; - FskRxAppConsoleView view_data{nav_, view_rect}; - - TabView tab_view{ - {"Data", Theme::getInstance()->fg_yellow->foreground, &view_data}, - {"Stream", Theme::getInstance()->fg_cyan->foreground, &view_stream}}; - - void refresh_ui(rf::Frequency f); - void on_packet(uint32_t value, bool is_data); - void handle_decoded(Timestamp timestamp, const std::string& prefix); - - uint32_t last_address = 0; - FskRxLogger logger{}; - uint16_t packet_count = 0; - - RxFrequencyField field_frequency{ - {0 * 8, 4 * 8}, - nav_}; - - RFAmpField field_rf_amp{ - {11 * 8, 2 * 16}}; - - LNAGainField field_lna{ - {13 * 8, 2 * 16}}; - - VGAGainField field_vga{ - {16 * 8, 2 * 16}}; - - RSSI rssi{ - {19 * 8 - 4, 35, 6 * 8, 4}}; - - Channel channel{ - {19 * 8 - 4, 40, 6 * 8, 4}}; - - Labels labels{ - {{0 * 8, 3 * 16}, "Deviation:", Theme::getInstance()->fg_light->foreground}, - }; - - FrequencyField deviation_frequency{ - {10 * 8, 3 * 16}, - {3750, 500000}, - }; - - // DEBUG - RecordView record_view{ - {0 * 8, 4 * 16, 30 * 8, 1 * 16}, - u"FSKRX_????.C16", - u"FSKRX", - RecordView::FileType::RawS16, - 16384, - 3}; - - MessageHandlerRegistration message_handler_packet{ - Message::ID::AFSKData, - [this](Message* const p) { - const auto message = static_cast(p); - this->view_data.on_packet(message->value, message->is_data); - }}; -}; - -} /* namespace ui */ - -#endif /*__POCSAG_APP_H__*/ \ No newline at end of file diff --git a/firmware/application/apps/ui_level.cpp b/firmware/application/apps/ui_level.cpp index a81a97b8..e5aa5ef7 100644 --- a/firmware/application/apps/ui_level.cpp +++ b/firmware/application/apps/ui_level.cpp @@ -187,6 +187,7 @@ void LevelView::on_statistics_update(const ChannelStatistics& statistics) { if (last_max_db != statistics.max_db) { last_max_db = statistics.max_db; freq_stats_db.set("Power: " + to_string_dec_int(statistics.max_db) + " db"); + rssi.set_db(statistics.max_db); } // refresh rssi if (last_min_rssi != rssi_graph.get_graph_min() || last_avg_rssi != rssi_graph.get_graph_avg() || last_max_rssi != rssi_graph.get_graph_max()) { diff --git a/firmware/application/apps/ui_looking_glass_app.cpp b/firmware/application/apps/ui_looking_glass_app.cpp index 7160337a..5e412c42 100644 --- a/firmware/application/apps/ui_looking_glass_app.cpp +++ b/firmware/application/apps/ui_looking_glass_app.cpp @@ -98,7 +98,6 @@ rf::Frequency GlassView::get_freq_from_bin_pos(uint8_t pos) { freq_at_pos = f_center_ini + ((pos - 120) * ((looking_glass_range - ((16 * looking_glass_range) / SPEC_NB_BINS)) / 2)) / (SCREEN_W / 2); } else freq_at_pos = f_min + (2 * offset * each_bin_size) + (pos * looking_glass_range) / SCREEN_W; - return freq_at_pos; } @@ -257,7 +256,7 @@ void GlassView::on_range_changed() { bin_length = SCREEN_W; ignore_dc = 0; looking_glass_bandwidth = looking_glass_range; - looking_glass_sampling_rate = looking_glass_bandwidth; + looking_glass_sampling_rate = looking_glass_range; each_bin_size = looking_glass_bandwidth / SCREEN_W; looking_glass_step = looking_glass_bandwidth; f_center_ini = f_min + (looking_glass_bandwidth / 2); // Initial center frequency for sweep @@ -265,7 +264,7 @@ void GlassView::on_range_changed() { // view is made in multiple pass, use original bin picking mode = scan_type.selected_index_value(); looking_glass_bandwidth = LOOKING_GLASS_SLICE_WIDTH_MAX; - looking_glass_sampling_rate = LOOKING_GLASS_SLICE_WIDTH_MAX; + looking_glass_sampling_rate = LOOKING_GLASS_MAX_SAMPLERATE; each_bin_size = LOOKING_GLASS_SLICE_WIDTH_MAX / SPEC_NB_BINS; if (mode == LOOKING_GLASS_FASTSCAN) { offset = 2; @@ -315,8 +314,8 @@ void GlassView::update_min(int32_t v) { int32_t min_size = steps; if (locked_range) min_size = search_span; - if (min_size < 2) - min_size = 2; + if (min_size < 1) + min_size = 1; if (v > 7200 - min_size) { v = 7200 - min_size; } @@ -332,8 +331,8 @@ void GlassView::update_max(int32_t v) { int32_t min_size = steps; if (locked_range) min_size = search_span; - if (min_size < 2) - min_size = 2; + if (min_size < 1) + min_size = 1; if (v < min_size) { v = min_size; } @@ -487,7 +486,12 @@ GlassView::GlassView( range_presets.set_selected_index(preset_index); field_marker.on_encoder_change = [this](TextField&, EncoderEvent delta) { - marker_pixel_index = clip(marker_pixel_index + delta, 0, SCREEN_W); + if ((marker_pixel_index + delta) < 0) + marker_pixel_index = marker_pixel_index + delta + SCREEN_W; + else if ((marker_pixel_index + delta) > SCREEN_W) + marker_pixel_index = marker_pixel_index + delta - SCREEN_W; + else + marker_pixel_index = marker_pixel_index + delta; on_marker_change(); }; diff --git a/firmware/application/apps/ui_looking_glass_app.hpp b/firmware/application/apps/ui_looking_glass_app.hpp index 2acfde71..d02803b9 100644 --- a/firmware/application/apps/ui_looking_glass_app.hpp +++ b/firmware/application/apps/ui_looking_glass_app.hpp @@ -40,6 +40,7 @@ namespace ui { #define LOOKING_GLASS_SLICE_WIDTH_MAX 20000000 +#define LOOKING_GLASS_MAX_SAMPLERATE 20000000 #define MHZ_DIV 1000000 // blanked DC (16 centered bins ignored ) and top left and right (2 bins ignored on each side ) diff --git a/firmware/application/apps/ui_numbers.cpp b/firmware/application/apps/ui_numbers.cpp deleted file mode 100644 index c85bb089..00000000 --- a/firmware/application/apps/ui_numbers.cpp +++ /dev/null @@ -1,288 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 "ui_numbers.hpp" -#include "string_format.hpp" - -#include "portapack.hpp" -#include "hackrf_hal.hpp" -#include "portapack_shared_memory.hpp" - -#include -#include - -using namespace portapack; - -namespace ui { - -// TODO: This app takes way too much space, find a way to shrink/simplify or make it an SD card module (loadable) - -void NumbersStationView::focus() { - if (file_error) - nav_.display_modal("No voices", "No valid voices found in\nthe /numbers directory.", ABORT); - else - button_exit.focus(); -} - -NumbersStationView::~NumbersStationView() { - transmitter_model.disable(); - baseband::shutdown(); -} - -NumbersStationView::wav_file_t* NumbersStationView::get_wav(uint32_t index) { - return ¤t_voice->available_wavs[index]; -} - -void NumbersStationView::prepare_audio() { - uint8_t code; - wav_file_t* wav_file; - - if (sample_counter >= sample_length) { - if (segment == ANNOUNCE) { - if (!announce_loop) { - code_index = 0; - segment = MESSAGE; - } else { - wav_file = get_wav(11); - reader->open(current_voice->dir + file_names[wav_file->index].name + ".wav"); - sample_length = wav_file->length; - announce_loop--; - } - } - - if (segment == MESSAGE) { - if (code_index == 25) { - transmitter_model.disable(); - return; - } - - code = symfield_code.get_offset(code_index); - - if (code >= 10) { - memset(audio_buffer, 0, 1024); - if (code == 10) { - pause = 11025; // p: 0.25s @ 44100Hz - } else if (code == 11) { - pause = 33075; // P: 0.75s @ 44100Hz - } else if (code == 12) { - transmitter_model.disable(); - return; - } - } else { - wav_file = get_wav(code); - reader->open(current_voice->dir + file_names[code].name + ".wav"); - sample_length = wav_file->length; - } - code_index++; - } - sample_counter = 0; - } - - if (!pause) { - auto bytes_read = reader->read(audio_buffer, 1024).value(); - - // Unsigned to signed, pretty stupid :/ - for (size_t n = 0; n < bytes_read; n++) - audio_buffer[n] -= 0x80; - for (size_t n = bytes_read; n < 1024; n++) - audio_buffer[n] = 0; - - sample_counter += 1024; - } else { - if (pause >= 1024) { - pause -= 1024; - } else { - sample_counter = sample_length; - pause = 0; - } - } - - baseband::set_fifo_data(audio_buffer); -} - -void NumbersStationView::start_tx() { - // sample_length = sound_sizes[10]; // Announce - sample_counter = sample_length; - - code_index = 0; - announce_loop = 2; - segment = ANNOUNCE; - - prepare_audio(); - - transmitter_model.set_rf_amp(true); - transmitter_model.enable(); - - baseband::set_audiotx_data( - (1536000 / 44100) - 1, // TODO: Read wav file's samplerate - 12000, - 1, - false, - 0); -} - -void NumbersStationView::on_tick_second() { - armed_blink = not armed_blink; - - if (armed_blink) - check_armed.set_style(Theme::getInstance()->fg_red); - else - check_armed.set_style(&style()); - - check_armed.set_dirty(); -} - -void NumbersStationView::on_voice_changed(size_t index) { - std::string code_list; - - for (const auto& wavs : voices[index].available_wavs) - code_list += wavs.code; - - symfield_code.set_symbol_list(code_list); - current_voice = &voices[index]; -} - -bool NumbersStationView::check_wav_validity(const std::string dir, const std::string file) { - if (reader->open("/numbers/" + dir + "/" + file)) { - // Check format (mono, 8 bits) - if ((reader->channels() == 1) && (reader->bits_per_sample() == 8)) - return true; - else - return false; - } else - return false; -} - -NumbersStationView::NumbersStationView( - NavigationView& nav) - : nav_(nav) { - std::vector directory_list; - using option_t = std::pair; - using options_t = std::vector; - options_t voice_options; - voice_t temp_voice{}; - bool valid; - uint32_t c; - // uint8_t y, m, d, dayofweek; - - reader = std::make_unique(); - - // Search for valid voice directories - directory_list = scan_root_directories("/numbers"); - if (!directory_list.size()) { - file_error = true; - return; - } - - for (const auto& dir : directory_list) { - c = 0; - for (const auto& file_name : file_names) { - valid = check_wav_validity(dir.string(), file_name.name + ".wav"); - if ((!valid) && (file_name.required)) { - temp_voice.available_wavs.clear(); - break; // Invalid required file means invalid voice - } else if (valid) { - temp_voice.available_wavs.push_back({file_name.code, c++, 0, 0}); // TODO: Needs length and samplerate - } - } - if (!temp_voice.available_wavs.empty()) { - // Voice can be used, are there accent files ? - c = 0; - for (const auto& file_name : file_names) { - valid = check_wav_validity(dir.string(), file_name.name + "a.wav"); - if ((!valid) && (file_name.required)) { - c = 0; - break; // Invalid required file means accents can't be used - } else if (valid) { - c++; - } - } - - temp_voice.accent = c ? true : false; - temp_voice.dir = dir.string(); - - voices.push_back(temp_voice); - } - } - - if (voices.empty()) { - file_error = true; - return; - } - - baseband::run_image(portapack::spi_flash::image_tag_audio_tx); - - add_children({&labels, - &symfield_code, - &check_armed, - &options_voices, - &text_voice_flags, - //&button_tx_now, - &button_exit}); - - for (const auto& voice : voices) - voice_options.emplace_back(voice.dir.substr(0, 4), 0); - - options_voices.set_options(voice_options); - options_voices.on_change = [this](size_t i, int32_t) { - this->on_voice_changed(i); - }; - options_voices.set_selected_index(0); - - check_armed.set_value(false); - - check_armed.on_select = [this](Checkbox&, bool v) { - if (v) { - armed_blink = false; - signal_token_tick_second = rtc_time::signal_tick_second += [this]() { - this->on_tick_second(); - }; - } else { - check_armed.set_style(&style()); - rtc_time::signal_tick_second -= signal_token_tick_second; - } - }; - - // DEBUG - symfield_code.set_offset(0, 10); - symfield_code.set_offset(1, 3); - symfield_code.set_offset(2, 4); - symfield_code.set_offset(3, 11); - symfield_code.set_offset(4, 6); - symfield_code.set_offset(5, 1); - symfield_code.set_offset(6, 9); - symfield_code.set_offset(7, 7); - symfield_code.set_offset(8, 8); - symfield_code.set_offset(9, 0); - symfield_code.set_offset(10, 12); // End - - /* - dayofweek = rtc_time::current_day_of_week(); - text_title.set(day_of_week[dayofweek]); - */ - - button_exit.on_select = [&nav](Button&) { - nav.pop(); - }; -} - -} /* namespace ui */ diff --git a/firmware/application/apps/ui_numbers.hpp b/firmware/application/apps/ui_numbers.hpp deleted file mode 100644 index bf2cd292..00000000 --- a/firmware/application/apps/ui_numbers.hpp +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 __UI_NUMBERS_H__ -#define __UI_NUMBERS_H__ - -#include "ui.hpp" -#include "ui_widget.hpp" -#include "ui_receiver.hpp" -#include "ui_navigation.hpp" -#include "rtc_time.hpp" -#include "clock_manager.hpp" -#include "baseband_api.hpp" -#include "utility.hpp" -#include "message.hpp" -#include "file.hpp" -#include "io_wave.hpp" -#include "radio_state.hpp" - -namespace ui { - -class NumbersStationView : public View { - public: - NumbersStationView(NavigationView& nav); - ~NumbersStationView(); - - NumbersStationView(const NumbersStationView&) = delete; - NumbersStationView(NumbersStationView&&) = delete; - NumbersStationView& operator=(const NumbersStationView&) = delete; - NumbersStationView& operator=(NumbersStationView&&) = delete; - - void focus() override; - - std::string title() const override { return "Station"; }; - - private: - NavigationView& nav_; - - TxRadioState radio_state_{ - 0 /* frequency */, - 1750000 /* bandwidth */, - 1536000 /* sampling rate */ - }; - - // Sequencing state machine - enum segments { - IDLE = 0, - ANNOUNCE, - MESSAGE, - SIGNOFF - }; - - typedef struct { - char code; - uint32_t index; - uint32_t length; - uint32_t samplerate; - } wav_file_t; - - struct voice_t { - std::string dir; - std::vector available_wavs; - bool accent; - }; - - std::vector voices{}; - voice_t* current_voice{}; - - struct wav_file_list_t { - std::string name; - bool required; - char code; - }; - - const std::vector file_names = { - {"0", true, '0'}, - {"1", true, '1'}, - {"2", true, '2'}, - {"3", true, '3'}, - {"4", true, '4'}, - {"5", true, '5'}, - {"6", true, '6'}, - {"7", true, '7'}, - {"8", true, '8'}, - {"9", true, '9'}, - {"announce", false, 'A'}}; - - segments segment{IDLE}; - bool armed{false}; - bool file_error{false}; - - // const uint8_t month_table[12] = { 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 }; - // const char * day_of_week[7] = { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday" }; - - std::unique_ptr reader{}; - - uint8_t code_index{0}, announce_loop{0}; - uint32_t sample_counter{0}; - uint32_t sample_length{0}; - int8_t audio_buffer[1024]{}; - uint32_t pause{0}; - bool armed_blink{false}; - SignalToken signal_token_tick_second{}; - - wav_file_t* get_wav(uint32_t index); - bool check_wav_validity(const std::string dir, const std::string file); - void on_voice_changed(size_t index); - void on_tick_second(); - void prepare_audio(); - void start_tx(); - - Labels labels{ - {{2 * 8, 5 * 8}, "Voice: Flags:", Theme::getInstance()->fg_light->foreground}, - {{1 * 8, 8 * 8}, "Code:", Theme::getInstance()->fg_light->foreground}}; - - OptionsField options_voices{ - {8 * 8, 1 * 8}, - 4, - {}}; - Text text_voice_flags{ - {19 * 8, 1 * 8, 2 * 8, 16}, - ""}; - - SymField symfield_code{ - {1 * 8, 10 * 8}, - 25, - SymField::Type::Custom}; - - Checkbox check_armed{ - {2 * 8, 13 * 16}, - 5, - "Armed"}; - - /* - Button button_tx_now { - { 18 * 8, 13 * 16, 10 * 8, 32 }, - "TX now"}; - */ - - Button button_exit{ - {21 * 8, 16 * 16, 64, 32}, - "Exit"}; - - MessageHandlerRegistration message_handler_fifo_signal{ - Message::ID::RequestSignal, - [this](const Message* const p) { - const auto message = static_cast(p); - if (message->signal == RequestSignalMessage::Signal::FillRequest) { - this->prepare_audio(); - } - }}; -}; - -} /* namespace ui */ - -#endif /*__UI_NUMBERS_H__*/ diff --git a/firmware/application/apps/ui_nuoptix.cpp b/firmware/application/apps/ui_nuoptix.cpp deleted file mode 100644 index e4894f2c..00000000 --- a/firmware/application/apps/ui_nuoptix.cpp +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 "ui_nuoptix.hpp" - -#include "ch.h" -#include "portapack.hpp" -#include "lfsr_random.hpp" -#include "string_format.hpp" - -#include "portapack_shared_memory.hpp" - -#include -#include - -using namespace portapack; - -namespace ui { - -void NuoptixView::focus() { - number_timecode.focus(); -} - -NuoptixView::~NuoptixView() { - transmitter_model.disable(); - baseband::shutdown(); -} - -void NuoptixView::on_tx_progress(const uint32_t progress, const bool done) { - if (done) - transmit(false); - else - progressbar.set_value(progress); -} - -void NuoptixView::transmit(bool setup) { - uint8_t mod, tone_code; - uint8_t c; - uint8_t dtmf_message[6]; - rtc::RTC datetime; - - if (!tx_mode) { - transmitter_model.disable(); - return; - } - - if (tx_mode == IMPROVISE) - timecode = lfsr_iterate(timecode) % 1999; // Could be 9999 but that would be one long audio track ! - - if (setup) { - progressbar.set_max(6 * 2); - - if (tx_mode == IMPROVISE) { - // Seed from RTC - rtcGetTime(&RTCD1, &datetime); - timecode = datetime.day() + datetime.second(); - } else { - timecode = number_timecode.value(); - } - - transmitter_model.set_rf_amp(true); - transmitter_model.enable(); - - dtmf_message[0] = '*'; // "Pre-tone for restart" method #1 - dtmf_message[1] = 'A'; // "Restart" method #1 - } else { - dtmf_message[0] = '#'; - dtmf_message[1] = (timecode / 1000) % 10; - chThdSleepMilliseconds(92); // 141-49ms - number_timecode.set_value(timecode); - } - - progressbar.set_value(0); - - dtmf_message[2] = (timecode / 100) % 10; - dtmf_message[3] = (timecode / 10) % 10; - dtmf_message[4] = timecode % 10; - - mod = 0; - for (c = 1; c < 5; c++) - if (dtmf_message[c] <= 9) - mod += dtmf_message[c]; - - mod = 10 - (mod % 10); - if (mod == 10) mod = 0; // Is this right ? - - text_mod.set("Mod: " + to_string_dec_uint(mod)); - - dtmf_message[5] = mod; - - for (c = 0; c < 6; c++) { - tone_code = dtmf_message[c]; - - if (tone_code == 'A') - tone_code = 10; - else if (tone_code == 'B') - tone_code = 11; - else if (tone_code == 'C') - tone_code = 12; - else if (tone_code == 'D') - tone_code = 13; - else if (tone_code == '#') - tone_code = 14; - else if (tone_code == '*') - tone_code = 15; - - shared_memory.bb_data.tones_data.message[c * 2] = tone_code; - shared_memory.bb_data.tones_data.message[c * 2 + 1] = 0xFF; // Silence - } - - for (c = 0; c < 16; c++) { - baseband::set_tone(c * 2, dtmf_deltas[c][0], NUOPTIX_TONE_LENGTH); - baseband::set_tone(c * 2 + 1, dtmf_deltas[c][1], NUOPTIX_TONE_LENGTH); - } - shared_memory.bb_data.tones_data.silence = NUOPTIX_TONE_LENGTH; // 49ms tone, 49ms space - - audio::set_rate(audio::Rate::Hz_24000); - - baseband::set_tones_config(transmitter_model.channel_bandwidth(), 0, 6 * 2, true, true); - - timecode++; -} - -NuoptixView::NuoptixView( - NavigationView& nav) { - baseband::run_image(portapack::spi_flash::image_tag_tones); - - add_children({&number_timecode, - &text_timecode, - &text_mod, - &progressbar, - &tx_view}); - - number_timecode.set_value(1); - - tx_view.on_edit_frequency = [this, &nav]() { - auto new_view = nav.push(transmitter_model.target_frequency()); - new_view->on_changed = [this](rf::Frequency f) { - transmitter_model.set_target_frequency(f); - }; - }; - - tx_view.on_start = [this]() { - tx_view.set_transmitting(true); - tx_mode = NORMAL; - transmit(true); - }; - - tx_view.on_stop = [this]() { - tx_view.set_transmitting(false); - tx_mode = IDLE; - }; - - /*button_impro.on_select = [this](Button&){ - if (tx_mode == IMPROVISE) { - tx_mode = IDLE; - button_impro.set_text("IMPROVISE"); - } else if (tx_mode == IDLE) { - tx_mode = IMPROVISE; - button_impro.set_text("STOP"); - transmit(true); - } - };*/ -} - -} // namespace ui diff --git a/firmware/application/apps/ui_nuoptix.hpp b/firmware/application/apps/ui_nuoptix.hpp deleted file mode 100644 index bc7564ca..00000000 --- a/firmware/application/apps/ui_nuoptix.hpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 __UI_NUOPTIX_H__ -#define __UI_NUOPTIX_H__ - -#include "ui.hpp" -#include "ui_widget.hpp" -#include "baseband_api.hpp" -#include "ui_navigation.hpp" -#include "ui_transmitter.hpp" -#include "rtc_time.hpp" -#include "tonesets.hpp" -#include "message.hpp" -#include "volume.hpp" -#include "audio.hpp" -#include "radio_state.hpp" - -#define NUOPTIX_TONE_LENGTH ((TONES_SAMPLERATE * 0.049) - 1) // 49ms - -namespace ui { - -class NuoptixView : public View { - public: - NuoptixView(NavigationView& nav); - ~NuoptixView(); - - void focus() override; - - std::string title() const override { return "Nuoptix sync"; }; - - private: - enum tx_modes { - IDLE = 0, - NORMAL, - IMPROVISE - }; - - TxRadioState radio_state_{ - 0 /* frequency */, - 1750000 /* bandwidth */, - 1536000 /* sampling rate */ - }; - - tx_modes tx_mode{IDLE}; - - void transmit(bool setup); - void on_tx_progress(const uint32_t progress, const bool done); - - uint32_t timecode{0}; - - Text text_timecode{ - {10 * 8, 2 * 16, 9 * 8, 16}, - "Timecode:"}; - - NumberField number_timecode{ - {13 * 8, 3 * 16}, - 4, - {1, 9999}, - 1, - '0'}; - - Text text_mod{ - {10 * 8, 5 * 16, 6 * 8, 16}, - "Mod: "}; - - ProgressBar progressbar{ - {16, 14 * 16, 208, 16}}; - - /*Button button_impro { - { 64, 184, 112, 40 }, - "IMPROVISE" - };*/ - - TransmitterView tx_view{ - 16 * 16, - 10000, - 15}; - - MessageHandlerRegistration message_handler_tx_progress{ - Message::ID::TXProgress, - [this](const Message* const p) { - const auto message = *reinterpret_cast(p); - this->on_tx_progress(message.progress, message.done); - }}; -}; - -} /* namespace ui */ - -#endif /*__UI_NUOPTIX_H__*/ diff --git a/firmware/application/apps/ui_pocsag_tx.cpp b/firmware/application/apps/ui_pocsag_tx.cpp index b9bc06d7..2efed265 100644 --- a/firmware/application/apps/ui_pocsag_tx.cpp +++ b/firmware/application/apps/ui_pocsag_tx.cpp @@ -33,6 +33,8 @@ using namespace pocsag; namespace ui { +#define MAX_POCSAG_LENGTH 80 + void POCSAGTXView::focus() { field_address.focus(); } @@ -57,6 +59,7 @@ void POCSAGTXView::on_remote(const PocsagTosendMessage data) { options_phase.set_selected_index(data.phase == 'P' ? 0 : 1); field_address.set_value(data.addr); message = (char*)data.msg; + buffer = message; text_message.set(message); options_bitrate.dirty(); options_type.dirty(); @@ -105,9 +108,9 @@ bool POCSAGTXView::start_tx() { progressbar.set_max(total_frames); - transmitter_model.set_rf_amp(true); - transmitter_model.set_tx_gain(40); - // We left exactly same TX LPF settings as previous fw 1.7.4, TX LPF= 1M75 (min). It is fine even in max FM dev. 150khz and 2400 bauds. + // transmitter_model.set_rf_amp(true); + // transmitter_model.set_tx_gain(40); + // We left exactly same TX LPF settings as previous fw 1.7.4, TX LPF= 1M75 (min). It is fine even in max FM dev. 150khz and 2400 bauds. transmitter_model.set_baseband_bandwidth(1'750'000); // Min TX LPF . Pocsag is NBFM , using BW channel 25khz or 12khz transmitter_model.enable(); @@ -139,11 +142,18 @@ bool POCSAGTXView::start_tx() { void POCSAGTXView::paint(Painter&) { message = buffer; - text_message.set(message); + text_message.set(message); // the whole message, but it may not fit. + if (message.length() > 30 && message.length() <= 60) { + text_message_l2.set(message.substr(29)); // remaining to 2nd line + } else if (message.length() > 60) { + text_message_l2.set(message.substr(29, 27) + "..."); + } else { + text_message_l2.set(""); + } } void POCSAGTXView::on_set_text(NavigationView& nav) { - text_prompt(nav, buffer, 30); + text_prompt(nav, buffer, MAX_POCSAG_LENGTH); } POCSAGTXView::POCSAGTXView( @@ -158,6 +168,7 @@ POCSAGTXView::POCSAGTXView( &options_function, &options_phase, &text_message, + &text_message_l2, &button_message, &progressbar, &tx_view}); diff --git a/firmware/application/apps/ui_pocsag_tx.hpp b/firmware/application/apps/ui_pocsag_tx.hpp index de0240ae..f4eb242c 100644 --- a/firmware/application/apps/ui_pocsag_tx.hpp +++ b/firmware/application/apps/ui_pocsag_tx.hpp @@ -122,15 +122,18 @@ class POCSAGTXView : public View { }}; Text text_message{ - {0 * 8, 16 * 8, 16 * 8, 16}, + {0 * 8, 16 * 8, 30 * 8, 16}, + ""}; + Text text_message_l2{ + {0 * 8, 18 * 8, 30 * 8, 16}, ""}; Button button_message{ - {0 * 8, 18 * 8, 14 * 8, 32}, + {0 * 8, 20 * 8, 14 * 8, 32}, "Set message"}; ProgressBar progressbar{ - {16, 200, 208, 16}}; + {16, 210, 208, 16}}; TransmitterView tx_view{ 16 * 16, diff --git a/firmware/application/apps/ui_recon.cpp b/firmware/application/apps/ui_recon.cpp index 48879ca1..977f9cbb 100644 --- a/firmware/application/apps/ui_recon.cpp +++ b/firmware/application/apps/ui_recon.cpp @@ -28,7 +28,6 @@ #include "file.hpp" #include "file_reader.hpp" #include "tone_key.hpp" -#include "replay_app.hpp" #include "string_format.hpp" #include "ui_fileman.hpp" #include "io_file.hpp" diff --git a/firmware/application/apps/ui_script.cpp b/firmware/application/apps/ui_script.cpp deleted file mode 100644 index a9717195..00000000 --- a/firmware/application/apps/ui_script.cpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 "ui_script.hpp" - -#include "portapack.hpp" -#include "event_m0.hpp" - -#include - -using namespace portapack; - -namespace ui { - -void ScriptView::on_frequency_select() { - // button_edit_freq.focus(); -} - -void ScriptView::on_edit_freq(rf::Frequency f) { - (void)f; - // frequencies[menu_view.highlighted()].value = f; - setup_list(); -} - -void ScriptView::on_edit_desc(NavigationView& nav) { - (void)nav; -} - -void ScriptView::on_delete() { - // frequencies.erase(frequencies.begin() + menu_view.highlighted()); - setup_list(); -} - -void ScriptView::setup_list() { - // size_t n; - - menu_view.clear(); - - /*for (n = 0; n < frequencies.size(); n++) { - menu_view.add_item({ freqman_item_string(frequencies[n]), Theme::getInstance()->bg_darkest->foreground, nullptr, [this](){ on_frequency_select(); } }); - }*/ - - menu_view.set_parent_rect({0, 0, 240, 168}); - menu_view.set_highlighted(menu_view.highlighted()); // Refresh -} - -void ScriptView::focus() { - menu_view.focus(); -} - -ScriptView::ScriptView( - NavigationView& nav) { - add_children({&menu_view, - &text_edit, - &button_edit_freq, - &button_edit_desc, - &button_del, - &button_exit}); - - setup_list(); - - button_edit_freq.on_select = [this, &nav](Button&) { - /*auto new_view = nav.push(frequencies[menu_view.highlighted()].value); - new_view->on_changed = [this](rf::Frequency f) { - on_edit_freq(f); - };*/ - }; - - button_edit_desc.on_select = [this, &nav](Button&) { - on_edit_desc(nav); - }; - - button_del.on_select = [this, &nav](Button&) { - nav.push("Confirm", "Are you sure?", YESNO, - [this](bool choice) { - if (choice) { - on_delete(); - } - }); - }; - - button_exit.on_select = [this, &nav](Button&) { - nav.pop(); - }; -} - -} // namespace ui diff --git a/firmware/application/apps/ui_script.hpp b/firmware/application/apps/ui_script.hpp deleted file mode 100644 index 0add5de8..00000000 --- a/firmware/application/apps/ui_script.hpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 "ui.hpp" -#include "ui_widget.hpp" -#include "ui_painter.hpp" -#include "ui_menu.hpp" -#include "ui_navigation.hpp" -#include "ui_receiver.hpp" -#include "ui_textentry.hpp" -#include "rtc_time.hpp" - -namespace ui { - -enum script_keyword { - STOP = 0, - WAIT_N, - WAIT_RTC, - IF, - LOOP, - END, - TX, - RX -}; - -struct script_line { - script_keyword keyword; -}; - -class ScriptView : public View { - public: - ScriptView(NavigationView& nav); - - void focus() override; - - std::string title() const override { return "Script editor"; }; - - private: - void on_frequency_select(); - void on_edit_freq(rf::Frequency f); - void on_edit_desc(NavigationView& nav); - void on_delete(); - void setup_list(); - - std::vector script{}; - - MenuView menu_view{ - {0, 0, 240, 168}, - true}; - - Text text_edit{ - {16, 194, 5 * 8, 16}, - "Edit:"}; - Button button_edit_freq{ - {16, 194 + 16, 88, 32}, - "Frequency"}; - Button button_edit_desc{ - {16, 194 + 16 + 34, 88, 32}, - "Description"}; - Button button_del{ - {160, 192, 72, 64}, - "Delete"}; - - Button button_exit{ - {160, 264, 72, 32}, - "Exit"}; -}; - -} /* namespace ui */ diff --git a/firmware/application/apps/ui_settings.cpp b/firmware/application/apps/ui_settings.cpp index 3988014e..3af587dc 100644 --- a/firmware/application/apps/ui_settings.cpp +++ b/firmware/application/apps/ui_settings.cpp @@ -5,6 +5,7 @@ * Copyright (C) 2023 Kyle Reed * Copyright (C) 2024 Mark Thompson * Copyright (C) 2024 u-foka + * Copyright (C) 2024 HTotoo * Copyleft (ɔ) 2024 zxkmm under GPL license * * This file is part of PortaPack. @@ -49,6 +50,8 @@ namespace fs = std::filesystem; #include "ui_font_fixed_8x16.hpp" #include "cpld_update.hpp" #include "config_mode.hpp" +#include "i2cdevmanager.hpp" +#include "i2cdev_max17055.hpp" extern ui::SystemView* system_view_ptr; @@ -321,7 +324,6 @@ SetUIView::SetUIView(NavigationView& nav) { &toggle_bias_tee, &toggle_clock, &toggle_mute, - &toggle_fake_brightness, &toggle_sd_card, &button_save, &button_cancel}); @@ -359,7 +361,6 @@ SetUIView::SetUIView(NavigationView& nav) { toggle_clock.set_value(!pmem::ui_hide_clock()); toggle_speaker.set_value(!pmem::ui_hide_speaker()); toggle_mute.set_value(!pmem::ui_hide_mute()); - toggle_fake_brightness.set_value(!pmem::ui_hide_fake_brightness()); toggle_battery_icon.set_value(!pmem::ui_hide_battery_icon()); toggle_battery_text.set_value(!pmem::ui_hide_numeric_battery()); toggle_sd_card.set_value(!pmem::ui_hide_sd_card()); @@ -388,7 +389,6 @@ SetUIView::SetUIView(NavigationView& nav) { pmem::set_ui_hide_clock(!toggle_clock.value()); pmem::set_ui_hide_speaker(!toggle_speaker.value()); pmem::set_ui_hide_mute(!toggle_mute.value()); - pmem::set_ui_hide_fake_brightness(!toggle_fake_brightness.value()); pmem::set_ui_hide_battery_icon(!toggle_battery_icon.value()); pmem::set_ui_hide_numeric_battery(!toggle_battery_text.value()); pmem::set_ui_hide_sd_card(!toggle_sd_card.value()); @@ -777,20 +777,13 @@ void SetConfigModeView::focus() { /* SetDisplayView ************************************/ SetDisplayView::SetDisplayView(NavigationView& nav) { - add_children({&labels, - &field_fake_brightness, - &button_save, + add_children({&button_save, &button_cancel, - &checkbox_invert_switch, - &checkbox_brightness_switch}); + &checkbox_invert_switch}); - field_fake_brightness.set_by_value(pmem::fake_brightness_level()); - checkbox_brightness_switch.set_value(pmem::apply_fake_brightness()); checkbox_invert_switch.set_value(pmem::config_lcd_inverted_mode()); button_save.on_select = [&nav, this](Button&) { - pmem::set_apply_fake_brightness(checkbox_brightness_switch.value()); - pmem::set_fake_brightness_level(field_fake_brightness.selected_index_value()); if (checkbox_invert_switch.value() != pmem::config_lcd_inverted_mode()) { display.set_inverted(checkbox_invert_switch.value()); pmem::set_lcd_inverted_mode(checkbox_invert_switch.value()); @@ -798,13 +791,6 @@ SetDisplayView::SetDisplayView(NavigationView& nav) { send_system_refresh(); nav.pop(); }; - // only enable invert OR fake brightness - checkbox_invert_switch.on_select = [this](Checkbox&, bool v) { - if (v) checkbox_brightness_switch.set_value(false); - }; - checkbox_brightness_switch.on_select = [this](Checkbox&, bool v) { - if (v) checkbox_invert_switch.set_value(false); - }; button_cancel.on_select = [&nav, this](Button&) { nav.pop(); @@ -815,6 +801,107 @@ void SetDisplayView::focus() { button_save.focus(); } +/* SetTouchscreenSensitivityView ************************************/ +/* sample max: 1023 sample_t AKA uint16_t + * touch_sensitivity: range: 1 to 128 + * threshold = 1023 / sensitive + * threshold range: 1023/1 to 1023/128 = 1023 to 8 + */ +SetTouchscreenThresholdView::SetTouchscreenThresholdView(NavigationView& nav) { + add_children({&labels, + &field_threshold, + &button_autodetect, + &button_reset, + &button_save, + &button_cancel, + &text_hint, + &text_wait_timer}); + + set_dirty(); + org_threshold = portapack::touch_threshold; + field_threshold.set_value(pmem::touchscreen_threshold()); + text_hint.set_style(Theme::getInstance()->error_dark); + text_hint.hidden(true); + text_wait_timer.set_style(Theme::getInstance()->error_dark); + text_wait_timer.hidden(true); + // clang-format off + button_autodetect.on_select = [this, &nav](Button&) { + nav.display_modal("NOTICE", + "Now on don't touch screen;\n" + "Use arrow keys to operate.\n" + "Follow instructions.\n" + "Press YES to continue", + YESNO, [this, &nav](bool choice) { + if (choice){ + time_start_auto_detect = chTimeNow(); + text_hint.hidden(false); + text_wait_timer.hidden(false); + text_wait_timer.set("ETA " + to_string_dec_uint(10) + "s"); + in_auto_detect = true; + field_threshold.set_value(1); + portapack::touch_threshold = 1; + set_dirty(); } }, TRUE); + }; + // clang-format on + + button_reset.on_select = [this](Button&) { + field_threshold.set_value(32); + portapack::touch_threshold = 32; + }; + + button_save.on_select = [&nav, this](Button&) { + pmem::set_touchscreen_threshold(field_threshold.value()); + portapack::touch_threshold = field_threshold.value(); + send_system_refresh(); + nav.pop(); + }; + + button_cancel.on_select = [&nav, this](Button&) { + portapack::touch_threshold = org_threshold; + nav.pop(); + }; +} + +void SetTouchscreenThresholdView::focus() { + button_autodetect.focus(); + set_dirty(); +} + +void SetTouchscreenThresholdView::on_frame_sync() { + if (!in_auto_detect) return; + uint32_t time_now = chTimeNow(); + int32_t time_diff = time_now - time_start_auto_detect; + text_wait_timer.set("ETA " + to_string_dec_uint((10 - time_diff / 1000) <= 0 ? 0 : 10 - time_diff / 1000) + "s"); + if (time_diff >= 10001 && !auto_detect_succeed_consumed) { // 10s + in_auto_detect = false; + text_wait_timer.hidden(true); + text_hint.set("OK, press save and reboot"); + portapack::touch_threshold = org_threshold; + pmem::set_touchscreen_threshold(org_threshold); + set_dirty(); + auto_detect_succeed_consumed = true; + button_save.focus(); + return; + } + if (get_touch_frame().touch) { + if (in_auto_detect) { + uint16_t sen = field_threshold.value(); + sen++; + portapack::touch_threshold = sen; + field_threshold.set_value(sen); + } + } +} + +SetTouchscreenThresholdView::~SetTouchscreenThresholdView() { + // it seems that sometimes in the msg handler func it would enter the condi that not possible to entered, + // so added this workaround. + // TODO: find out why + in_auto_detect = false; + auto_detect_succeed_consumed = false; + time_start_auto_detect = 0; +} + /* SetMenuColorView ************************************/ void SetMenuColorView::paint_sample() { @@ -876,6 +963,7 @@ SetAutostartView::SetAutostartView(NavigationView& nav) { add_children({&labels, &button_save, &button_cancel, + &button_reset, &options}); button_save.on_select = [&nav, this](Button&) { @@ -892,6 +980,12 @@ SetAutostartView::SetAutostartView(NavigationView& nav) { nav.pop(); }; + button_reset.on_select = [this](Button&) { + selected = 0; + options.set_selected_index(0); + autostart_app = ""; + }; + // options i = 0; OptionsField::option_t o{"-none-", i}; @@ -969,7 +1063,7 @@ SetBatteryView::SetBatteryView(NavigationView& nav) { &button_cancel, &checkbox_overridebatt}); - if (battery::BatteryManagement::detectedModule() == battery::BatteryManagement::BATT_MAX17055) add_children({&button_reset, &labels2}); + if (i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDEVMDL_MAX17055)) add_children({&button_reset, &labels2}); button_save.on_select = [&nav, this](Button&) { pmem::set_ui_override_batt_calc(checkbox_overridebatt.value()); @@ -979,7 +1073,8 @@ SetBatteryView::SetBatteryView(NavigationView& nav) { }; button_reset.on_select = [&nav, this](Button&) { - if (battery::BatteryManagement::reset_learned()) + auto dev = (i2cdev::I2cDev_MAX17055*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDEVMDL_MAX17055); + if (dev->reset_learned()) nav.display_modal("Reset", "Battery parameters reset"); else nav.display_modal("Error", "Error parameter reset"); @@ -1011,6 +1106,7 @@ void SettingsMenuView::on_populate() { {"App Settings", ui::Color::dark_cyan(), &bitmap_icon_notepad, [this]() { nav_.push(); }}, {"Audio", ui::Color::dark_cyan(), &bitmap_icon_speaker, [this]() { nav_.push(); }}, {"Calibration", ui::Color::dark_cyan(), &bitmap_icon_options_touch, [this]() { nav_.push(); }}, + {"TouchThreshold", ui::Color::dark_cyan(), &bitmap_icon_options_touch, [this]() { nav_.push(); }}, {"Config Mode", ui::Color::dark_cyan(), &bitmap_icon_clk_ext, [this]() { nav_.push(); }}, {"Converter", ui::Color::dark_cyan(), &bitmap_icon_options_radio, [this]() { nav_.push(); }}, {"Date/Time", ui::Color::dark_cyan(), &bitmap_icon_options_datetime, [this]() { nav_.push(); }}, diff --git a/firmware/application/apps/ui_settings.hpp b/firmware/application/apps/ui_settings.hpp index 4a94d90c..9d31429d 100644 --- a/firmware/application/apps/ui_settings.hpp +++ b/firmware/application/apps/ui_settings.hpp @@ -35,6 +35,7 @@ #include "bitmap.hpp" #include "ff.h" #include "portapack_persistent_memory.hpp" +#include "irq_controls.hpp" #include @@ -362,12 +363,8 @@ class SetUIView : public View { {19 * 8, 14 * 16 + 2, 16, 16}, &bitmap_icon_batt_text}; - ImageToggle toggle_fake_brightness{ - {21 * 8, 14 * 16 + 2, 16, 16}, - &bitmap_icon_brightness}; - ImageToggle toggle_sd_card{ - {23 * 8, 14 * 16 + 2, 16, 16}, + {21 * 8, 14 * 16 + 2, 16, 16}, &bitmap_sd_card_ok}; Button button_save{ @@ -709,8 +706,6 @@ class SetConfigModeView : public View { }; }; -using portapack::persistent_memory::fake_brightness_level_options; - class SetDisplayView : public View { public: SetDisplayView(NavigationView& nav); @@ -720,27 +715,8 @@ class SetDisplayView : public View { std::string title() const override { return "Display"; }; private: - Labels labels{ - {{1 * 8, 1 * 16}, "Limits screen brightness", Theme::getInstance()->fg_light->foreground}, - {{1 * 8, 2 * 16}, "(has a small performance", Theme::getInstance()->fg_light->foreground}, - {{1 * 8, 3 * 16}, "impact when enabled).", Theme::getInstance()->fg_light->foreground}, - {{2 * 8, 8 * 16}, "Brightness:", Theme::getInstance()->fg_light->foreground}, - }; - - OptionsField field_fake_brightness{ - {20 * 8, 8 * 16}, - 6, - {{"12.5%", fake_brightness_level_options::BRIGHTNESS_12p5}, - {"25%", fake_brightness_level_options::BRIGHTNESS_25}, - {"50%", fake_brightness_level_options::BRIGHTNESS_50}}}; - - Checkbox checkbox_brightness_switch{ - {1 * 8, 5 * 16}, - 16, - "Enable brightness adjust"}; - Checkbox checkbox_invert_switch{ - {1 * 8, 10 * 16}, + {1 * 8, 2 * 16}, 23, "Invert colors (For IPS)"}; @@ -754,6 +730,77 @@ class SetDisplayView : public View { }; }; +using portapack::persistent_memory::touchscreen_threshold; + +class SetTouchscreenThresholdView : public View { + public: + SetTouchscreenThresholdView(NavigationView& nav); + ~SetTouchscreenThresholdView(); + + void focus() override; + + std::string title() const override { return "Touch S"; }; + + private: + bool in_auto_detect = false; + uint16_t org_threshold = 0; + uint8_t auto_detect_succeed_consumed = false; // prevent screen flash but can still change text content + uint32_t time_start_auto_detect = 0; + + Labels labels{ + {{1 * 8, 1 * 16}, "Set touchscreen sensitivity", Theme::getInstance()->fg_light->foreground}, + {{1 * 8, 2 * 16}, "Or press auto detect button", Theme::getInstance()->fg_light->foreground}, + {{1 * 8, 3 * 16}, "FOLLOW INSTRUCTIONS", Theme::getInstance()->fg_light->foreground}, + {{1 * 8, 4 * 16}, "REBOOT TO APPLY", Theme::getInstance()->fg_light->foreground}, + {{1 * 8, 11 * 16}, "Threshold:", Theme::getInstance()->fg_light->foreground}, + }; + + Text text_hint{ + {1 * 8, 7 * 16, screen_width - 2 * 8, 1 * 16}, + "DON'T TOUCH SCREEN"}; + + Text text_wait_timer{ + {1 * 8, 8 * 16, screen_width - 2 * 8, 1 * 16}, + "ETA 00:00"}; + + void on_frame_sync(); + + /* sample max: 1023 sample_t AKA uint16_t + * touch_sensitivity: range: 1 to 128 + * threshold range: 1023/1 to 1023/128 = 1023 to 8 + */ + NumberField field_threshold{ + {1 * 8 + 11 * 8 + 8, 11 * 16}, + 4, + {1, 1023}, + 1, + ' ', + }; + + Button button_autodetect{ + {2 * 8, 13 * 16, 12 * 8, 32}, + "Auto Detect"}; + Button button_reset{ + {16 * 8, 13 * 16, 12 * 8, 32}, + "Reset", + }; + + Button button_save{ + {2 * 8, 16 * 16, 12 * 8, 32}, + "Save"}; + + Button button_cancel{ + {16 * 8, 16 * 16, 12 * 8, 32}, + "Cancel", + }; + + MessageHandlerRegistration message_handler_frame_sync{ + Message::ID::DisplayFrameSync, + [this](const Message* const) { + this->on_frame_sync(); + }}; +}; + class SetMenuColorView : public View { public: SetMenuColorView(NavigationView& nav); @@ -843,14 +890,19 @@ class SetAutostartView : public View { "Save"}; OptionsField options{ - {8 * 8, 4 * 16}, - 30, - {}}; + {0 * 8, 4 * 16}, + screen_width / 8, + {}, + true}; Button button_cancel{ {16 * 8, 16 * 16, 12 * 8, 32}, "Cancel", }; + + Button button_reset{ + {2 * 8, 6 * 16, screen_width - 4 * 8, 32}, + "Reset"}; }; class SetThemeView : public View { @@ -872,15 +924,16 @@ class SetThemeView : public View { "Save"}; OptionsField options{ - {8 * 8, 4 * 16}, - 30, + {0 * 8, 4 * 16}, + screen_width / 8, { {"Default - Grey", 0}, {"Yellow", 1}, {"Aqua", 2}, {"Green", 3}, {"Red", 4}, - }}; + }, + true}; Checkbox checkbox_menuset{ {2 * 8, 6 * 16}, diff --git a/firmware/application/apps/ui_sigfrx.cpp b/firmware/application/apps/ui_sigfrx.cpp index 750cf9c6..e0493306 100644 --- a/firmware/application/apps/ui_sigfrx.cpp +++ b/firmware/application/apps/ui_sigfrx.cpp @@ -56,7 +56,7 @@ SIGFRXView::~SIGFRXView() { void SIGFRXView::paint(Painter& painter) { uint8_t i, xp; - // portapack::display.drawBMP({0, 302-160}, fox_bmp); + // portapack::display.draw_bmp_from_bmp_hex_arr({0, 302-160}, fox_bmp); portapack::display.fill_rectangle({0, 16, 240, 160 - 16}, Theme::getInstance()->bg_darkest->foreground); for (i = 0; i < 6; i++) { xp = sigfrx_marks[i * 3]; diff --git a/firmware/application/apps/ui_ss_viewer.cpp b/firmware/application/apps/ui_ss_viewer.cpp index eb14fda8..a0741041 100644 --- a/firmware/application/apps/ui_ss_viewer.cpp +++ b/firmware/application/apps/ui_ss_viewer.cpp @@ -119,7 +119,7 @@ bool SplashViewer::on_key(const KeyEvent key) { void SplashViewer::paint(Painter& painter) { painter.fill_rectangle({0, 0, screen_width, screen_height}, Color::black()); - if (!portapack::display.drawBMP2({0, 0}, path_)) { + if (!portapack::display.draw_bmp_from_sdcard_file({0, 0}, path_)) { painter.draw_string({10, 160}, *Theme::getInstance()->bg_darkest, "Not a valid splash image."); return; } diff --git a/firmware/application/apps/ui_standalone_view.cpp b/firmware/application/apps/ui_standalone_view.cpp index cbab847c..5fc1e229 100644 --- a/firmware/application/apps/ui_standalone_view.cpp +++ b/firmware/application/apps/ui_standalone_view.cpp @@ -22,6 +22,12 @@ #include "ui_standalone_view.hpp" #include "irq_controls.hpp" +#include "i2cdevmanager.hpp" +#include "i2cdev_ppmod.hpp" + +#include "ui_font_fixed_5x8.hpp" +#include "ui_font_fixed_8x16.hpp" + namespace ui { void create_thread(int32_t (*fn)(void*), void* arg, size_t stack_size, int priority) { @@ -34,6 +40,16 @@ void fill_rectangle(int x, int y, int width, int height, uint16_t color) { painter.fill_rectangle({x, y, width, height}, ui::Color(color)); } +void fill_rectangle_unrolled8(int x, int y, int width, int height, uint16_t color) { + ui::Painter painter; + painter.fill_rectangle_unrolled8({x, y, width, height}, ui::Color(color)); +} + +void draw_bitmap(int x, int y, int width, int height, const uint8_t* pixels, uint16_t foreground, uint16_t background) { + ui::Painter painter; + painter.draw_bitmap({x, y}, {{width, height}, pixels}, ui::Color(foreground), ui::Color(background)); +} + void* alloc(size_t size) { void* p = chHeapAlloc(0x0, size); if (p == nullptr) @@ -45,6 +61,45 @@ uint64_t get_switches_state_ulong() { return get_switches_state().to_ulong(); } +ui::Coord scroll_area_y(const ui::Coord y) { + return portapack::display.scroll_area_y(y); +} + +void scroll_set_area(const ui::Coord top_y, const ui::Coord bottom_y) { + portapack::display.scroll_set_area(top_y, bottom_y); +} + +void scroll_disable() { + portapack::display.scroll_disable(); +} + +ui::Coord scroll_set_position(const ui::Coord position) { + return portapack::display.scroll_set_position(position); +} + +ui::Coord scroll(const int32_t delta) { + return portapack::display.scroll(delta); +} + +bool i2c_read(uint8_t* cmd, size_t cmd_len, uint8_t* data, size_t data_len) { + auto dev = (i2cdev::I2cDev_PPmod*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDECMDL_PPMOD); + if (!dev) { + return false; + } + + if (data_len == 0 || data == nullptr) + return dev->i2c_write(nullptr, 0, cmd, cmd_len); + + return dev->i2c_read(cmd, cmd_len, data, data_len); +} + +StandaloneView* standaloneView = nullptr; + +void set_dirty() { + if (standaloneView != nullptr) + standaloneView->set_dirty(); +} + standalone_application_api_t api = { /* .malloc = */ &alloc, /* .calloc = */ &calloc, @@ -54,20 +109,78 @@ standalone_application_api_t api = { /* .fill_rectangle = */ &fill_rectangle, /* .swizzled_switches = */ &swizzled_switches, /* .get_switches_state = */ &get_switches_state_ulong, + /* .fixed_5x8_glyph_data = */ ui::font::fixed_5x8.get_data(), + /* .fixed_8x16_glyph_data = */ ui::font::fixed_8x16.get_data(), + /* .fill_rectangle_unrolled8 = */ &fill_rectangle_unrolled8, + /* .draw_bitmap = */ &draw_bitmap, + /* .scroll_area_y = */ &scroll_area_y, + /* .scroll_set_area = */ &scroll_set_area, + /* .scroll_disable = */ &scroll_disable, + /* .scroll_set_position = */ &scroll_set_position, + /* .scroll = */ &scroll, + /* .i2c_read = */ &i2c_read, + /* .panic = */ &chDbgPanic, + /* .set_dirty = */ &set_dirty, }; -StandaloneView::StandaloneView(NavigationView& nav, std::unique_ptr app_image) - : nav_(nav), _app_image(std::move(app_image)) { - get_application_information()->initialize(api); - add_children({&dummy}); +StandaloneView::StandaloneView(NavigationView& nav, uint8_t* app_image) + : nav_(nav), + _app_image(*app_image) { + if (app_image == nullptr) { + chDbgPanic("Invalid application image"); + } + + set_focusable(true); + + standaloneView = this; } void StandaloneView::focus() { - dummy.focus(); + View::focus(); } void StandaloneView::paint(Painter& painter) { (void)painter; + + if (initialized && + get_application_information()->header_version > 1) { + get_application_information()->PaintViewMirror(); + } +} + +void StandaloneView::on_focus() { + if (get_application_information()->header_version > 1) { + get_application_information()->OnFocus(); + } +} + +bool StandaloneView::on_key(const KeyEvent key) { + if (get_application_information()->header_version > 1) { + return get_application_information()->OnKeyEvent((uint8_t)key); + } + + return false; +} + +bool StandaloneView::on_encoder(const EncoderEvent event) { + if (get_application_information()->header_version > 1) { + return get_application_information()->OnEncoder((int32_t)event); + } + return false; +} + +bool StandaloneView::on_touch(const TouchEvent event) { + if (get_application_information()->header_version > 1) { + get_application_information()->OnTouchEvent(event.point.x(), event.point.y(), (uint32_t)event.type); + } + return true; +} + +bool StandaloneView::on_keyboard(const KeyboardEvent event) { + if (get_application_information()->header_version > 1) { + return get_application_information()->OnKeyboard((uint8_t)event); + } + return false; } void StandaloneView::frame_sync() { @@ -79,4 +192,14 @@ void StandaloneView::frame_sync() { } } +void StandaloneView::on_after_attach() { + context().focus_manager().setMirror(this); + get_application_information()->initialize(api); +} + +void StandaloneView::on_before_detach() { + get_application_information()->shutdown(); + context().focus_manager().clearMirror(); +} + } // namespace ui diff --git a/firmware/application/apps/ui_standalone_view.hpp b/firmware/application/apps/ui_standalone_view.hpp index 012d7f07..f5a8a78b 100644 --- a/firmware/application/apps/ui_standalone_view.hpp +++ b/firmware/application/apps/ui_standalone_view.hpp @@ -31,28 +31,34 @@ namespace ui { class StandaloneView : public View { public: - StandaloneView(NavigationView& nav, std::unique_ptr app_image); - virtual ~StandaloneView() override { get_application_information()->shutdown(); } - - void focus() override; + StandaloneView(NavigationView& nav, uint8_t* app_image); + virtual ~StandaloneView() override { + } std::string title() const override { return (const char*)get_application_information()->app_name; }; + void focus() override; void paint(Painter& painter) override; + + void on_focus() override; + bool on_key(const KeyEvent key) override; + bool on_encoder(const EncoderEvent event) override; + bool on_touch(const TouchEvent event) override; + bool on_keyboard(const KeyboardEvent event) override; + + void on_after_attach() override; + void on_before_detach() override; + void frame_sync(); private: bool initialized = false; NavigationView& nav_; - std::unique_ptr _app_image; + uint8_t& _app_image; standalone_application_information_t* get_application_information() const { - return reinterpret_cast(_app_image.get()); + return reinterpret_cast(&_app_image); } - Button dummy{ - {240, 0, 0, 0}, - ""}; - MessageHandlerRegistration message_handler_sample{ Message::ID::DisplayFrameSync, [this](const Message* const) { diff --git a/firmware/application/apps/ui_subghzd.cpp b/firmware/application/apps/ui_subghzd.cpp index bab43a7d..fa878252 100644 --- a/firmware/application/apps/ui_subghzd.cpp +++ b/firmware/application/apps/ui_subghzd.cpp @@ -24,6 +24,7 @@ #include "audio.hpp" #include "baseband_api.hpp" #include "string_format.hpp" +#include "file_path.hpp" #include "portapack_persistent_memory.hpp" using namespace portapack; @@ -31,6 +32,18 @@ using namespace ui; namespace ui { +std::string SubGhzDRecentEntry::to_csv() { + std::string csv = ";"; + csv += SubGhzDView::getSensorTypeName((FPROTO_SUBGHZD_SENSOR)sensorType); + csv += ";" + to_string_dec_uint(bits) + ";"; + csv += to_string_hex(data, 64 / 4); + return csv; +} + +void SubGhzDLogger::log_data(SubGhzDRecentEntry& data) { + log_file.write_entry(data.to_csv()); +} + void SubGhzDRecentEntryDetailView::update_data() { // process protocol data parseProtocol(); @@ -76,16 +89,25 @@ SubGhzDView::SubGhzDView(NavigationView& nav) &field_vga, &field_frequency, &button_clear_list, + &check_log, &recent_entries_view}); baseband::run_image(portapack::spi_flash::image_tag_subghzd); + logger = std::make_unique(); button_clear_list.on_select = [this](Button&) { recent.clear(); recent_entries_view.set_dirty(); }; field_frequency.set_step(10000); - + check_log.on_select = [this](Checkbox&, bool v) { + logging = v; + if (logger && logging) { + logger->append(logs_dir.string() + "/SUBGHZDLOG_" + to_string_timestamp(rtc_time::now()) + ".CSV"); + logger->write_header(); + } + }; + check_log.set_value(logging); const Rect content_rect{0, header_height, screen_width, screen_height - header_height}; recent_entries_view.set_parent_rect(content_rect); recent_entries_view.on_select = [this](const SubGhzDRecentEntry& entry) { @@ -107,6 +129,9 @@ void SubGhzDView::on_tick_second() { void SubGhzDView::on_data(const SubGhzDDataMessage* data) { SubGhzDRecentEntry key{data->sensorType, data->data, data->bits}; + if (logger && logging) { + logger->log_data(key); + } auto matching_recent = find(recent, key.key()); if (matching_recent != std::end(recent)) { // Found within. Move to front of list, increment counter. diff --git a/firmware/application/apps/ui_subghzd.hpp b/firmware/application/apps/ui_subghzd.hpp index 20271a35..afdf79e2 100644 --- a/firmware/application/apps/ui_subghzd.hpp +++ b/firmware/application/apps/ui_subghzd.hpp @@ -34,6 +34,7 @@ #include "app_settings.hpp" #include "radio_state.hpp" #include "utility.hpp" +#include "log_file.hpp" #include "recent_entries.hpp" #include "../baseband/fprotos/subghztypes.hpp" @@ -68,6 +69,23 @@ struct SubGhzDRecentEntry { void reset_age() { age = 0; } + + std::string to_csv(); +}; + +class SubGhzDLogger { + public: + Optional append(const std::filesystem::path& filename) { + return log_file.append(filename); + } + + void log_data(SubGhzDRecentEntry& data); + void write_header() { + log_file.write_entry(";Type; Bits; Data;"); + } + + private: + LogFile log_file{}; }; using SubGhzDRecentEntries = RecentEntries; using SubGhzDRecentEntriesView = RecentEntriesView; @@ -93,10 +111,13 @@ class SubGhzDView : public View { 1'750'000 /* bandwidth */, 4'000'000 /* sampling rate */, ReceiverModel::Mode::AMAudio}; + bool logging = false; app_settings::SettingsManager settings_{ "rx_subghzd", app_settings::Mode::RX, - {}}; + { + {"log"sv, &logging}, + }}; SubGhzDRecentEntries recent{}; @@ -118,8 +139,16 @@ class SubGhzDView : public View { {0, 16, 7 * 8, 32}, "Clear"}; + Checkbox check_log{ + {10 * 8, 18}, + 3, + "Log", + true}; + static constexpr auto header_height = 3 * 16; + std::unique_ptr logger{}; + const RecentEntriesColumns columns{{ {"Type", 19}, {"Bits", 4}, diff --git a/firmware/application/apps/ui_tone_search.cpp b/firmware/application/apps/ui_tone_search.cpp deleted file mode 100644 index e17ed52b..00000000 --- a/firmware/application/apps/ui_tone_search.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2018 Furrtek - * - * 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 "ui_tone_search.hpp" - -#include "baseband_api.hpp" -#include "string_format.hpp" - -using namespace portapack; - -namespace ui { - -void ToneSearchView::focus() { - // field_frequency_min.focus(); -} - -ToneSearchView::~ToneSearchView() { - receiver_model.disable(); - baseband::shutdown(); -} - -ToneSearchView::ToneSearchView( - NavigationView& nav) - : nav_(nav) { - // baseband::run_image(portapack::spi_flash::image_tag_wideband_spectrum); - - add_children({ - &labels, - &field_lna, - &field_vga, - &field_rf_amp, - }); -} - -} /* namespace ui */ diff --git a/firmware/application/apps/ui_tone_search.hpp b/firmware/application/apps/ui_tone_search.hpp deleted file mode 100644 index 88499ef5..00000000 --- a/firmware/application/apps/ui_tone_search.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2018 Furrtek - * - * 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 "receiver_model.hpp" - -#include "ui_receiver.hpp" - -namespace ui { - -class ToneSearchView : public View { - public: - ToneSearchView(NavigationView& nav); - ~ToneSearchView(); - - void focus() override; - - std::string title() const override { return "Tone search"; }; - - private: - NavigationView& nav_; - - Labels labels{ - {{0 * 8, 0 * 8}, "LNA: VGA: AMP:", Theme::getInstance()->fg_light->foreground}}; - - LNAGainField field_lna{ - {4 * 8, 0 * 16}}; - - VGAGainField field_vga{ - {11 * 8, 0 * 16}}; - - RFAmpField field_rf_amp{ - {18 * 8, 0 * 16}}; - - /* - 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); - } - } - this->do_timers(); - } - };*/ -}; - -} /* namespace ui */ diff --git a/firmware/application/apps/ui_weatherstation.cpp b/firmware/application/apps/ui_weatherstation.cpp index bf63094c..2eae1607 100644 --- a/firmware/application/apps/ui_weatherstation.cpp +++ b/firmware/application/apps/ui_weatherstation.cpp @@ -25,6 +25,7 @@ #include "audio.hpp" #include "baseband_api.hpp" #include "string_format.hpp" +#include "file_path.hpp" #include "portapack_persistent_memory.hpp" #include "../baseband/fprotos/fprotogeneral.hpp" @@ -35,6 +36,21 @@ namespace pmem = portapack::persistent_memory; namespace ui { +std::string WeatherRecentEntry::to_csv() { + std::string csv = ";"; + csv += WeatherView::getWeatherSensorTypeName((FPROTO_WEATHER_SENSOR)sensorType); + csv += ";" + to_string_dec_uint(id) + ";"; + csv += to_string_decimal(temp, 2) + ";"; + csv += to_string_dec_uint(humidity) + ";"; + csv += to_string_dec_uint(channel) + ";"; + csv += to_string_dec_uint(battery_low); + return csv; +} + +void WeatherLogger::log_data(WeatherRecentEntry& data) { + log_file.write_entry(data.to_csv()); +} + void WeatherRecentEntryDetailView::update_data() { // set text elements text_type.set(WeatherView::getWeatherSensorTypeName((FPROTO_WEATHER_SENSOR)entry_.sensorType)); @@ -98,8 +114,11 @@ WeatherView::WeatherView(NavigationView& nav) &field_frequency, &options_temperature, &button_clear_list, + &check_log, &recent_entries_view}); + logger = std::make_unique(); + baseband::run_image(portapack::spi_flash::image_tag_weather); button_clear_list.on_select = [this](Button&) { @@ -114,6 +133,15 @@ WeatherView::WeatherView(NavigationView& nav) }; options_temperature.set_selected_index(weather_units_fahr, false); + check_log.on_select = [this](Checkbox&, bool v) { + logging = v; + if (logger && logging) { + logger->append(logs_dir.string() + "/WEATHERLOG_" + to_string_timestamp(rtc_time::now()) + ".CSV"); + logger->write_header(); + } + }; + check_log.set_value(logging); + const Rect content_rect{0, header_height, screen_width, screen_height - header_height}; recent_entries_view.set_parent_rect(content_rect); recent_entries_view.on_select = [this](const WeatherRecentEntry& entry) { @@ -140,6 +168,9 @@ void WeatherView::on_tick_second() { void WeatherView::on_data(const WeatherDataMessage* data) { WeatherRecentEntry key = process_data(data); + if (logger && logging) { + logger->log_data(key); + } // WeatherRecentEntry key{data->sensorType, data->id, data->temp, data->humidity, data->channel, data->battery_low}; auto matching_recent = find(recent, key.key()); if (matching_recent != std::end(recent)) { @@ -213,6 +244,11 @@ const char* WeatherView::getWeatherSensorTypeName(FPROTO_WEATHER_SENSOR type) { return "EmosE601x"; case FPW_SolightTE44: return "SolightTE44"; + case FPW_Bresser3CH: + case FPW_Bresser3CH_V1: + return "Bresser3CH"; + case FPW_Vauno_EN8822: + return "Vauno EN8822"; case FPW_Invalid: default: return "Unknown"; @@ -532,6 +568,42 @@ WeatherRecentEntry WeatherView::process_data(const WeatherDataMessage* data) { i16 |= 0xf000; } ret.temp = (float)i16 / 10.0; + break; + case FPW_Bresser3CH: + ret.id = (data->decode_data >> 28) & 0xff; + ret.channel = ((data->decode_data >> 27) & 0x01) | (((data->decode_data >> 26) & 0x01) << 1); + // ret.btn = ((data->decode_data >> 25) & 0x1); + ret.battery_low = ((data->decode_data >> 24) & 0x1); + i16 = (data->decode_data >> 12) & 0x0fff; + /* Handle signed data */ + if (i16 & 0x0800) { + i16 |= 0xf000; + } + ret.temp = (float)i16 / 10.0; + ret.humidity = data->decode_data & 0xff; + break; + case FPW_Bresser3CH_V1: + ret.id = (data->decode_data >> 32) & 0xff; + ret.battery_low = ((data->decode_data >> 31) & 0x1); + // ret.btn = (data->decode_data >> 30) & 0x1; + ret.channel = (data->decode_data >> 28) & 0x3; + ret.temp = (data->decode_data >> 16) & 0xfff; + ret.temp = FProtoGeneral::locale_fahrenheit_to_celsius((float)(ret.temp - 900) / 10.0); + ret.humidity = (data->decode_data >> 8) & 0xff; + break; + + case FPW_Vauno_EN8822: + ret.id = (data->decode_data >> 34) & 0xff; + ret.battery_low = (data->decode_data >> 33) & 0x01; + ret.channel = ((data->decode_data >> 30) & 0x03); + i16 = (data->decode_data >> 18) & 0x0fff; + /* Handle signed data */ + if (i16 & 0x0800) { + i16 |= 0xf000; + } + ret.temp = (float)i16 / 10.0; + ret.humidity = (data->decode_data >> 11) & 0x7f; + break; case FPW_Invalid: default: diff --git a/firmware/application/apps/ui_weatherstation.hpp b/firmware/application/apps/ui_weatherstation.hpp index d1dfd563..6c265e51 100644 --- a/firmware/application/apps/ui_weatherstation.hpp +++ b/firmware/application/apps/ui_weatherstation.hpp @@ -30,6 +30,7 @@ #include "app_settings.hpp" #include "radio_state.hpp" #include "utility.hpp" +#include "log_file.hpp" #include "recent_entries.hpp" #include "../baseband/fprotos/weathertypes.hpp" @@ -78,7 +79,25 @@ struct WeatherRecentEntry { void reset_age() { age = 0; } + + std::string to_csv(); }; + +class WeatherLogger { + public: + Optional append(const std::filesystem::path& filename) { + return log_file.append(filename); + } + + void log_data(WeatherRecentEntry& data); + void write_header() { + log_file.write_entry(";Type; id; Temp; Hum; CH; Batt"); + } + + private: + LogFile log_file{}; +}; + using WeatherRecentEntries = RecentEntries; using WeatherRecentEntriesView = RecentEntriesView; @@ -103,11 +122,13 @@ class WeatherView : public View { 1'750'000 /* bandwidth */, 2'000'000 /* sampling rate */, ReceiverModel::Mode::AMAudio}; + bool logging = false; app_settings::SettingsManager settings_{ "rx_weather", app_settings::Mode::RX, { {"units_fahr"sv, &weather_units_fahr}, + {"log"sv, &logging}, }}; WeatherRecentEntries recent{}; @@ -140,8 +161,16 @@ class WeatherView : public View { {0, 16, 7 * 8, 32}, "Clear"}; + Checkbox check_log{ + {10 * 8, 18}, + 3, + "Log", + true}; + static constexpr auto header_height = 3 * 16; + std::unique_ptr logger{}; + const RecentEntriesColumns columns{{ {"Type", 10}, {"Temp", 5}, diff --git a/firmware/application/bitmap.hpp b/firmware/application/bitmap.hpp index 37ef8690..704d727c 100644 --- a/firmware/application/bitmap.hpp +++ b/firmware/application/bitmap.hpp @@ -363,6 +363,44 @@ static constexpr Bitmap bitmap_icon_downconvert{ {16, 16}, bitmap_icon_downconvert_data}; +static constexpr uint8_t bitmap_icon_speaker_and_headphones_data[] = { + 0x20, + 0x10, + 0x30, + 0x20, + 0x38, + 0x44, + 0x3E, + 0x48, + 0x3E, + 0x91, + 0x3E, + 0x92, + 0x38, + 0x92, + 0x30, + 0x92, + 0x20, + 0x92, + 0x00, + 0x92, + 0x30, + 0x91, + 0x48, + 0x48, + 0x84, + 0x44, + 0x84, + 0x20, + 0x86, + 0x11, + 0x86, + 0x01, +}; +static constexpr Bitmap bitmap_icon_speaker_and_headphones{ + {16, 16}, + bitmap_icon_speaker_and_headphones_data}; + static constexpr uint8_t bitmap_more_data[] = { 0x10, 0x10, @@ -987,6 +1025,44 @@ static constexpr Bitmap bitmap_icon_tools_antenna{ {16, 16}, bitmap_icon_tools_antenna_data}; +static constexpr uint8_t bitmap_icon_batt_text_data[] = { + 0x00, + 0x00, + 0x30, + 0x06, + 0x48, + 0x09, + 0x48, + 0x09, + 0x70, + 0x0E, + 0x40, + 0x08, + 0x30, + 0x06, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x48, + 0x00, + 0x20, + 0x00, + 0x10, + 0x00, + 0x48, + 0x00, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_icon_batt_text{ + {16, 16}, + bitmap_icon_batt_text_data}; + static constexpr uint8_t bitmap_icon_new_file_data[] = { 0x00, 0x00, @@ -1289,6 +1365,44 @@ static constexpr Bitmap bitmap_icon_stealth{ {16, 16}, bitmap_icon_stealth_data}; +static constexpr uint8_t bitmap_key_data[] = { + 0xC0, + 0x03, + 0xE0, + 0x07, + 0x30, + 0x0C, + 0x30, + 0x0C, + 0x30, + 0x0C, + 0x30, + 0x0C, + 0xE0, + 0x07, + 0xC0, + 0x03, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x07, + 0x80, + 0x03, + 0x80, + 0x07, + 0x80, + 0x01, +}; +static constexpr Bitmap bitmap_key{ + {16, 16}, + bitmap_key_data}; + static constexpr uint8_t bitmap_sig_square_data[] = { 0x00, 0x00, @@ -1727,6 +1841,44 @@ static constexpr Bitmap bitmap_icon_soundboard{ {16, 16}, bitmap_icon_soundboard_data}; +static constexpr uint8_t bitmap_icon_tetris_data[] = { + 0xF8, + 0xFF, + 0x88, + 0x88, + 0x88, + 0x88, + 0x88, + 0x88, + 0xF8, + 0xFF, + 0x80, + 0x08, + 0x80, + 0x08, + 0x9F, + 0x08, + 0x91, + 0x0F, + 0x11, + 0x00, + 0x11, + 0x00, + 0xFF, + 0xF1, + 0x11, + 0x91, + 0x11, + 0x91, + 0x11, + 0x91, + 0xFF, + 0xF1, +}; +static constexpr Bitmap bitmap_icon_tetris{ + {16, 16}, + bitmap_icon_tetris_data}; + static constexpr uint8_t bitmap_icon_rename_data[] = { 0x00, 0x00, @@ -2091,6 +2243,44 @@ static constexpr Bitmap bitmap_icon_dmr{ {16, 16}, bitmap_icon_dmr_data}; +static constexpr uint8_t bitmap_arrow_right_data[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x00, + 0x0C, + 0x00, + 0x1C, + 0xFE, + 0x3F, + 0xFE, + 0x7F, + 0xFE, + 0x3F, + 0x00, + 0x1C, + 0x00, + 0x0C, + 0x00, + 0x04, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_arrow_right{ + {16, 16}, + bitmap_arrow_right_data}; + static constexpr uint8_t bitmap_icon_upconvert_data[] = { 0x80, 0x01, @@ -2129,6 +2319,82 @@ static constexpr Bitmap bitmap_icon_upconvert{ {16, 16}, bitmap_icon_upconvert_data}; +static constexpr uint8_t bitmap_icon_hide_data[] = { + 0x00, + 0x00, + 0x00, + 0x40, + 0x00, + 0x20, + 0xE0, + 0x17, + 0x18, + 0x18, + 0xC4, + 0x27, + 0x62, + 0x42, + 0x21, + 0x85, + 0xA1, + 0x84, + 0x62, + 0x46, + 0xA4, + 0x23, + 0x18, + 0x18, + 0xE8, + 0x07, + 0x04, + 0x00, + 0x02, + 0x00, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_icon_hide{ + {16, 16}, + bitmap_icon_hide_data}; + +static constexpr uint8_t bitmap_icon_add_data[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x01, + 0xF8, + 0x1F, + 0xF8, + 0x1F, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_icon_add{ + {16, 16}, + bitmap_icon_add_data}; + static constexpr uint8_t bitmap_icon_clk_int_data[] = { 0x00, 0x00, @@ -2227,43 +2493,43 @@ static constexpr Bitmap bitmap_icon_file_image{ {16, 16}, bitmap_icon_file_image_data}; -static constexpr uint8_t bitmap_icon_temperature_data[] = { +static constexpr uint8_t bitmap_icon_batt_icon_data[] = { + 0xC0, + 0x03, + 0xC0, + 0x03, + 0xF0, + 0x0F, + 0x10, + 0x08, + 0x10, + 0x08, + 0x10, + 0x08, + 0x10, + 0x08, + 0x10, + 0x08, + 0xF0, + 0x0F, + 0xF0, + 0x0F, + 0xF0, + 0x0F, + 0xF0, + 0x0F, + 0xF0, + 0x0F, + 0xF0, + 0x0F, + 0xF0, + 0x0F, + 0x00, 0x00, - 0x01, - 0x80, - 0x01, - 0x80, - 0x05, - 0xC0, - 0x0D, - 0x40, - 0x0D, - 0xD0, - 0x1F, - 0x70, - 0x15, - 0xB0, - 0x1A, - 0x58, - 0x35, - 0xB8, - 0x3A, - 0x58, - 0x34, - 0x28, - 0x28, - 0x18, - 0x30, - 0x30, - 0x18, - 0x60, - 0x0C, - 0xC0, - 0x07, }; -static constexpr Bitmap bitmap_icon_temperature{ +static constexpr Bitmap bitmap_icon_batt_icon{ {16, 16}, - bitmap_icon_temperature_data}; + bitmap_icon_batt_icon_data}; static constexpr uint8_t bitmap_tab_edge_data[] = { 0x00, @@ -2333,6 +2599,82 @@ static constexpr Bitmap bitmap_icon_sdcard{ {16, 16}, bitmap_icon_sdcard_data}; +static constexpr uint8_t bitmap_icon_clean_data[] = { + 0x00, + 0x00, + 0xC0, + 0x01, + 0x20, + 0x02, + 0xFC, + 0x1F, + 0x00, + 0x00, + 0x08, + 0x08, + 0xE8, + 0x08, + 0xA8, + 0x09, + 0xA8, + 0x0B, + 0x28, + 0x0A, + 0x28, + 0x0A, + 0x28, + 0x0A, + 0xE8, + 0x0B, + 0x08, + 0x08, + 0xF0, + 0x07, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_icon_clean{ + {16, 16}, + bitmap_icon_clean_data}; + +static constexpr uint8_t bitmap_icon_touchtunes_data[] = { + 0xE0, + 0x07, + 0x30, + 0x0C, + 0x7C, + 0x3E, + 0xC4, + 0x23, + 0x26, + 0x64, + 0x12, + 0x48, + 0x0F, + 0xF3, + 0x09, + 0x95, + 0x0F, + 0xF1, + 0x09, + 0x91, + 0x0F, + 0xF1, + 0xC9, + 0x91, + 0xE9, + 0x91, + 0xC9, + 0x90, + 0x0F, + 0xF0, + 0xFF, + 0xFF, +}; +static constexpr Bitmap bitmap_icon_touchtunes{ + {16, 16}, + bitmap_icon_touchtunes_data}; + static constexpr uint8_t bitmap_icon_file_iq_data[] = { 0xFC, 0x03, @@ -2447,82 +2789,6 @@ static constexpr Bitmap bitmap_icon_camera{ {16, 16}, bitmap_icon_camera_data}; -static constexpr uint8_t bitmap_icon_batt_icon_data[] = { - 0xC0, - 0x03, - 0xC0, - 0x03, - 0xF0, - 0x0F, - 0x10, - 0x08, - 0x10, - 0x08, - 0x10, - 0x08, - 0x10, - 0x08, - 0x10, - 0x08, - 0xF0, - 0x0F, - 0xF0, - 0x0F, - 0xF0, - 0x0F, - 0xF0, - 0x0F, - 0xF0, - 0x0F, - 0xF0, - 0x0F, - 0xF0, - 0x0F, - 0x00, - 0x00, -}; -static constexpr Bitmap bitmap_icon_batt_icon{ - {16, 16}, - bitmap_icon_batt_icon_data}; - -static constexpr uint8_t bitmap_icon_batt_text_data[] = { - 0x00, - 0x00, - 0x30, - 0x06, - 0x48, - 0x09, - 0x48, - 0x09, - 0x70, - 0x0E, - 0x40, - 0x08, - 0x30, - 0x06, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x48, - 0x00, - 0x20, - 0x00, - 0x10, - 0x00, - 0x48, - 0x00, - 0x00, - 0x00, -}; -static constexpr Bitmap bitmap_icon_batt_text{ - {16, 16}, - bitmap_icon_batt_text_data}; - static constexpr uint8_t bitmap_icon_tools_wipesd_data[] = { 0xF0, 0x3F, @@ -2637,6 +2903,44 @@ static constexpr Bitmap bitmap_icon_freqman{ {16, 16}, bitmap_icon_freqman_data}; +static constexpr uint8_t bitmap_icon_thermometer_data[] = { + 0xC0, + 0x00, + 0x20, + 0x01, + 0x10, + 0x02, + 0x10, + 0x3A, + 0x10, + 0x02, + 0x10, + 0x1A, + 0x10, + 0x02, + 0xD0, + 0x3A, + 0xD0, + 0x02, + 0xD0, + 0x1A, + 0xD0, + 0x02, + 0xE8, + 0x05, + 0xE8, + 0x05, + 0xC8, + 0x04, + 0x10, + 0x02, + 0xE0, + 0x01, +}; +static constexpr Bitmap bitmap_icon_thermometer{ + {16, 16}, + bitmap_icon_thermometer_data}; + static constexpr uint8_t bitmap_sd_card_ok_data[] = { 0x00, 0x00, @@ -2903,6 +3207,44 @@ static constexpr Bitmap bitmap_icon_bht{ {16, 16}, bitmap_icon_bht_data}; +static constexpr uint8_t bitmap_icon_shift_data[] = { + 0x00, + 0x00, + 0x80, + 0x00, + 0xC0, + 0x01, + 0xE0, + 0x03, + 0xF0, + 0x07, + 0xF8, + 0x0F, + 0xFC, + 0x1F, + 0xE0, + 0x03, + 0xE0, + 0x03, + 0xE0, + 0x03, + 0x20, + 0x02, + 0xE0, + 0x03, + 0x20, + 0x02, + 0xE0, + 0x03, + 0x00, + 0x00, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_icon_shift{ + {16, 16}, + bitmap_icon_shift_data}; + static constexpr uint8_t bitmap_play_data[] = { 0x00, 0x00, @@ -3113,6 +3455,44 @@ static constexpr Bitmap bitmap_sig_saw_down{ {32, 32}, bitmap_sig_saw_down_data}; +static constexpr uint8_t bitmap_icon_font_viewer_data[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x10, + 0x0C, + 0x38, + 0x0C, + 0x38, + 0x0C, + 0x6C, + 0x0C, + 0x6C, + 0x0C, + 0xC6, + 0x7C, + 0xFE, + 0xFC, + 0xFF, + 0x8D, + 0x83, + 0x8D, + 0x83, + 0xFD, + 0x01, + 0x7D, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_icon_font_viewer{ + {16, 16}, + bitmap_icon_font_viewer_data}; + static constexpr uint8_t bitmap_icon_load_data[] = { 0x00, 0x01, @@ -3343,6 +3723,44 @@ static constexpr Bitmap bitmap_icon_sleep{ {16, 16}, bitmap_icon_sleep_data}; +static constexpr uint8_t bitmap_icon_paint_data[] = { + 0xFE, + 0x3F, + 0xFF, + 0x3F, + 0xFF, + 0xFF, + 0xFF, + 0xBF, + 0xFE, + 0xBF, + 0x00, + 0x80, + 0x80, + 0xFF, + 0x80, + 0x00, + 0x80, + 0x00, + 0xC0, + 0x01, + 0xC0, + 0x01, + 0xC0, + 0x01, + 0xC0, + 0x01, + 0xC0, + 0x01, + 0xC0, + 0x01, + 0xC0, + 0x01, +}; +static constexpr Bitmap bitmap_icon_paint{ + {16, 16}, + bitmap_icon_paint_data}; + static constexpr uint8_t bitmap_icon_notepad_data[] = { 0x0C, 0x00, @@ -3381,6 +3799,44 @@ static constexpr Bitmap bitmap_icon_notepad{ {16, 16}, bitmap_icon_notepad_data}; +static constexpr uint8_t bitmap_icon_trim_data[] = { + 0x10, + 0x10, + 0x30, + 0x12, + 0x50, + 0x15, + 0x50, + 0x15, + 0x50, + 0x15, + 0x52, + 0x95, + 0x56, + 0xD5, + 0x5F, + 0xF5, + 0x56, + 0xD5, + 0x52, + 0x95, + 0x50, + 0x15, + 0x50, + 0x15, + 0x50, + 0x15, + 0x90, + 0x18, + 0x10, + 0x10, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_icon_trim{ + {16, 16}, + bitmap_icon_trim_data}; + static constexpr uint8_t bitmap_icon_copy_data[] = { 0x00, 0x00, @@ -3895,44 +4351,6 @@ static constexpr Bitmap bitmap_icon_looking{ {16, 16}, bitmap_icon_looking_data}; -static constexpr uint8_t bitmap_icon_add_data[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x80, - 0x01, - 0x80, - 0x01, - 0x80, - 0x01, - 0x80, - 0x01, - 0xF8, - 0x1F, - 0xF8, - 0x1F, - 0x80, - 0x01, - 0x80, - 0x01, - 0x80, - 0x01, - 0x80, - 0x01, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, -}; -static constexpr Bitmap bitmap_icon_add{ - {16, 16}, - bitmap_icon_add_data}; - static constexpr uint8_t bitmap_icon_delete_data[] = { 0x00, 0x00, @@ -4575,6 +4993,44 @@ static constexpr Bitmap bitmap_icon_btle{ {16, 16}, bitmap_icon_btle_data}; +static constexpr uint8_t bitmap_arrow_left_data[] = { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x20, + 0x00, + 0x30, + 0x00, + 0x38, + 0x00, + 0xFC, + 0x7F, + 0xFE, + 0x7F, + 0xFC, + 0x7F, + 0x38, + 0x00, + 0x30, + 0x00, + 0x20, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_arrow_left{ + {16, 16}, + bitmap_arrow_left_data}; + static constexpr uint8_t bitmap_sd_card_error_data[] = { 0x00, 0x00, @@ -4747,6 +5203,44 @@ static constexpr Bitmap bitmap_sig_saw_up{ {32, 32}, bitmap_sig_saw_up_data}; +static constexpr uint8_t bitmap_icon_brightness_data[] = { + 0x00, + 0x00, + 0x80, + 0x01, + 0x84, + 0x21, + 0x08, + 0x10, + 0xC0, + 0x03, + 0xE0, + 0x07, + 0xF0, + 0x0F, + 0xF6, + 0x6F, + 0xF6, + 0x6F, + 0xF0, + 0x0F, + 0xE0, + 0x07, + 0xC0, + 0x03, + 0x08, + 0x10, + 0x84, + 0x21, + 0x80, + 0x01, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_icon_brightness{ + {16, 16}, + bitmap_icon_brightness_data}; + static constexpr uint8_t bitmap_icon_microphone_data[] = { 0xC0, 0x03, @@ -5417,234 +5911,6 @@ static constexpr Bitmap bitmap_target{ {16, 16}, bitmap_target_data}; -static constexpr uint8_t bitmap_icon_new_dir_data[] = { - 0x00, - 0x00, - 0x1E, - 0x00, - 0x21, - 0x00, - 0xE1, - 0x7F, - 0x01, - 0xC0, - 0x81, - 0x81, - 0x81, - 0x81, - 0x81, - 0x81, - 0xF1, - 0x8F, - 0xF1, - 0x8F, - 0x81, - 0x81, - 0x81, - 0x81, - 0x81, - 0x81, - 0x03, - 0xC0, - 0xFE, - 0x7F, - 0x00, - 0x00, -}; -static constexpr Bitmap bitmap_icon_new_dir{ - {16, 16}, - bitmap_icon_new_dir_data}; - -static constexpr uint8_t bitmap_icon_paint_data[] = { - 0xFE, - 0x3F, - 0xFF, - 0x3F, - 0xFF, - 0xFF, - 0xFF, - 0xBF, - 0xFE, - 0xBF, - 0x00, - 0x80, - 0x80, - 0xFF, - 0x80, - 0x00, - 0x80, - 0x00, - 0xC0, - 0x01, - 0xC0, - 0x01, - 0xC0, - 0x01, - 0xC0, - 0x01, - 0xC0, - 0x01, - 0xC0, - 0x01, - 0xC0, - 0x01, -}; -static constexpr Bitmap bitmap_icon_paint{ - {16, 16}, - bitmap_icon_paint_data}; - -static constexpr uint8_t bitmap_icon_touchtunes_data[] = { - 0xE0, - 0x07, - 0x30, - 0x0C, - 0x7C, - 0x3E, - 0xC4, - 0x23, - 0x26, - 0x64, - 0x12, - 0x48, - 0x0F, - 0xF3, - 0x09, - 0x95, - 0x0F, - 0xF1, - 0x09, - 0x91, - 0x0F, - 0xF1, - 0xC9, - 0x91, - 0xE9, - 0x91, - 0xC9, - 0x90, - 0x0F, - 0xF0, - 0xFF, - 0xFF, -}; -static constexpr Bitmap bitmap_icon_touchtunes{ - {16, 16}, - bitmap_icon_touchtunes_data}; - -static constexpr uint8_t bitmap_arrow_left_data[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x20, - 0x00, - 0x30, - 0x00, - 0x38, - 0x00, - 0xFC, - 0x7F, - 0xFE, - 0x7F, - 0xFC, - 0x7F, - 0x38, - 0x00, - 0x30, - 0x00, - 0x20, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, -}; -static constexpr Bitmap bitmap_arrow_left{ - {16, 16}, - bitmap_arrow_left_data}; - -static constexpr uint8_t bitmap_arrow_right_data[] = { - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x04, - 0x00, - 0x0C, - 0x00, - 0x1C, - 0xFE, - 0x3F, - 0xFE, - 0x7F, - 0xFE, - 0x3F, - 0x00, - 0x1C, - 0x00, - 0x0C, - 0x00, - 0x04, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, - 0x00, -}; -static constexpr Bitmap bitmap_arrow_right{ - {16, 16}, - bitmap_arrow_right_data}; - -static constexpr uint8_t bitmap_icon_speaker_and_headphones_data[] = { - 0x20, - 0x10, - 0x30, - 0x20, - 0x38, - 0x44, - 0x3E, - 0x48, - 0x3E, - 0x91, - 0x3E, - 0x92, - 0x38, - 0x92, - 0x30, - 0x92, - 0x20, - 0x92, - 0x00, - 0x92, - 0x30, - 0x91, - 0x48, - 0x48, - 0x84, - 0x44, - 0x84, - 0x20, - 0x86, - 0x11, - 0x86, - 0x01, -}; -static constexpr Bitmap bitmap_icon_speaker_and_headphones{ - {16, 16}, - bitmap_icon_speaker_and_headphones_data}; - static constexpr uint8_t bitmap_icon_speaker_and_headphones_mute_data[] = { 0x40, 0x00, @@ -5683,233 +5949,81 @@ static constexpr Bitmap bitmap_icon_speaker_and_headphones_mute{ {16, 16}, bitmap_icon_speaker_and_headphones_mute_data}; -static constexpr uint8_t bitmap_icon_shift_data[] = { +static constexpr uint8_t bitmap_icon_new_dir_data[] = { 0x00, 0x00, - 0x80, + 0x1E, 0x00, - 0xC0, + 0x21, + 0x00, + 0xE1, + 0x7F, 0x01, - 0xE0, + 0xC0, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0xF1, + 0x8F, + 0xF1, + 0x8F, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, + 0x81, 0x03, - 0xF0, - 0x07, + 0xC0, + 0xFE, + 0x7F, + 0x00, + 0x00, +}; +static constexpr Bitmap bitmap_icon_new_dir{ + {16, 16}, + bitmap_icon_new_dir_data}; + +static constexpr uint8_t bitmap_icon_protoview_data[] = { + 0x00, + 0x00, + 0x00, + 0x00, 0xF8, + 0x87, + 0x08, + 0x84, 0x0F, 0xFC, - 0x1F, - 0xE0, - 0x03, - 0xE0, - 0x03, - 0xE0, - 0x03, - 0x20, - 0x02, - 0xE0, - 0x03, - 0x20, - 0x02, - 0xE0, - 0x03, 0x00, 0x00, 0x00, 0x00, -}; -static constexpr Bitmap bitmap_icon_shift{ - {16, 16}, - bitmap_icon_shift_data}; - -static constexpr uint8_t bitmap_icon_trim_data[] = { - 0x10, - 0x10, - 0x30, + 0x00, + 0x00, + 0xF3, + 0xE0, + 0x92, + 0xA0, + 0x9E, + 0xBF, + 0x00, + 0x00, + 0x00, + 0x00, + 0xFC, + 0xF3, + 0x04, 0x12, - 0x50, - 0x15, - 0x50, - 0x15, - 0x50, - 0x15, - 0x52, - 0x95, - 0x56, - 0xD5, - 0x5F, - 0xF5, - 0x56, - 0xD5, - 0x52, - 0x95, - 0x50, - 0x15, - 0x50, - 0x15, - 0x50, - 0x15, - 0x90, - 0x18, - 0x10, - 0x10, - 0x00, - 0x00, -}; -static constexpr Bitmap bitmap_icon_trim{ - {16, 16}, - bitmap_icon_trim_data}; - -static constexpr uint8_t bitmap_icon_hide_data[] = { - 0x00, - 0x00, - 0x00, - 0x40, - 0x00, - 0x20, - 0xE0, - 0x17, - 0x18, - 0x18, - 0xC4, - 0x27, - 0x62, - 0x42, - 0x21, - 0x85, - 0xA1, - 0x84, - 0x62, - 0x46, - 0xA4, - 0x23, - 0x18, - 0x18, - 0xE8, 0x07, - 0x04, - 0x00, - 0x02, - 0x00, - 0x00, - 0x00, + 0x1E, }; -static constexpr Bitmap bitmap_icon_hide{ +static constexpr Bitmap bitmap_icon_protoview{ {16, 16}, - bitmap_icon_hide_data}; - -static constexpr uint8_t bitmap_icon_thermometer_data[] = { - 0xC0, - 0x00, - 0x20, - 0x01, - 0x10, - 0x02, - 0x10, - 0x3A, - 0x10, - 0x02, - 0x10, - 0x1A, - 0x10, - 0x02, - 0xD0, - 0x3A, - 0xD0, - 0x02, - 0xD0, - 0x1A, - 0xD0, - 0x02, - 0xE8, - 0x05, - 0xE8, - 0x05, - 0xC8, - 0x04, - 0x10, - 0x02, - 0xE0, - 0x01, -}; -static constexpr Bitmap bitmap_icon_thermometer{ - {16, 16}, - bitmap_icon_thermometer_data}; - -static constexpr uint8_t bitmap_icon_brightness_data[] = { - 0x00, - 0x00, - 0x80, - 0x01, - 0x84, - 0x21, - 0x08, - 0x10, - 0xC0, - 0x03, - 0xE0, - 0x07, - 0xF0, - 0x0F, - 0xF6, - 0x6F, - 0xF6, - 0x6F, - 0xF0, - 0x0F, - 0xE0, - 0x07, - 0xC0, - 0x03, - 0x08, - 0x10, - 0x84, - 0x21, - 0x80, - 0x01, - 0x00, - 0x00, -}; -static constexpr Bitmap bitmap_icon_brightness{ - {16, 16}, - bitmap_icon_brightness_data}; - -static constexpr uint8_t bitmap_icon_clean_data[] = { - 0x00, - 0x00, - 0xC0, - 0x01, - 0x20, - 0x02, - 0xFC, - 0x1F, - 0x00, - 0x00, - 0x08, - 0x08, - 0xE8, - 0x08, - 0xA8, - 0x09, - 0xA8, - 0x0B, - 0x28, - 0x0A, - 0x28, - 0x0A, - 0x28, - 0x0A, - 0xE8, - 0x0B, - 0x08, - 0x08, - 0xF0, - 0x07, - 0x00, - 0x00, -}; -static constexpr Bitmap bitmap_icon_clean{ - {16, 16}, - bitmap_icon_clean_data}; + bitmap_icon_protoview_data}; } /* namespace ui */ diff --git a/firmware/application/emu_cc1101.cpp b/firmware/application/emu_cc1101.cpp deleted file mode 100644 index de946e8b..00000000 --- a/firmware/application/emu_cc1101.cpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2017 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2017 Furrtek - * - * 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 "emu_cc1101.hpp" - -namespace cc1101 { - -void CC1101Emu::whitening_init() { - whitening_pn = 0x1FF; -} - -// See TI app note DN509 -uint8_t CC1101Emu::whiten_byte(uint8_t byte) { - uint_fast8_t new_bit; - - byte ^= (whitening_pn & 0xFF); - - for (size_t step = 0; step < 8; step++) { - new_bit = (whitening_pn & 1) ^ ((whitening_pn >> 5) & 1); - whitening_pn >>= 1; - whitening_pn |= (new_bit << 8); - } - - return byte; -} - -} /* namespace cc1101 */ diff --git a/firmware/application/apps/acars_app.cpp b/firmware/application/external/acars_rx/acars_app.cpp similarity index 52% rename from firmware/application/apps/acars_app.cpp rename to firmware/application/external/acars_rx/acars_app.cpp index a8a5e1f9..d7b5079d 100644 --- a/firmware/application/apps/acars_app.cpp +++ b/firmware/application/external/acars_rx/acars_app.cpp @@ -20,45 +20,26 @@ * Boston, MA 02110-1301, USA. */ -#include "acars_app.hpp" - #include "baseband_api.hpp" #include "portapack_persistent_memory.hpp" #include "file_path.hpp" +#include "audio.hpp" +#include "acars_app.hpp" using namespace portapack; -using namespace acars; #include "string_format.hpp" #include "utility.hpp" -void ACARSLogger::log_raw_data(const acars::Packet& packet, const uint32_t frequency) { - (void)frequency; - std::string entry{}; //= "Raw: F:" + to_string_dec_uint(frequency) + "Hz "; - entry.reserve(256); +namespace ui::external_app::acars_rx { - // Raw hex dump of all the bytes - // for (size_t c = 0; c < packet.length(); c += 32) - // entry += to_string_hex(packet.read(c, 32), 8) + " "; - - for (size_t c = 0; c < 256; c += 32) - entry += to_string_bin(packet.read(c, 32), 32); - - log_file.write_entry(packet.received_at(), entry); +void ACARSLogger::log_str(std::string msg) { + log_file.write_entry(msg); } -/*void ACARSLogger::log_decoded( - const acars::Packet& packet, - const std::string text) { - - log_file.write_entry(packet.timestamp(), text); -}*/ - -namespace ui { - ACARSAppView::ACARSAppView(NavigationView& nav) : nav_{nav} { - baseband::run_image(portapack::spi_flash::image_tag_acars); + baseband::run_prepared_image(portapack::memory::map::m4_code.base()); add_children({&rssi, &channel, @@ -66,6 +47,7 @@ ACARSAppView::ACARSAppView(NavigationView& nav) &field_lna, &field_vga, &field_frequency, + &field_volume, &check_log, &console}); @@ -79,6 +61,9 @@ ACARSAppView::ACARSAppView(NavigationView& nav) logger = std::make_unique(); if (logger) logger->append(logs_dir / u"ACARS.TXT"); + + audio::set_rate(audio::Rate::Hz_24000); + audio::output::start(); } ACARSAppView::~ACARSAppView() { @@ -90,29 +75,31 @@ void ACARSAppView::focus() { field_frequency.focus(); } -void ACARSAppView::on_packet(const acars::Packet& packet) { +void ACARSAppView::on_packet(const ACARSPacketMessage* packet) { std::string console_info; - /*if (!packet.is_valid()) { - console_info = to_string_datetime(packet.received_at(), HMS); - console_info += " INVALID"; - - console.writeln(console_info); - } else { - console_info = to_string_datetime(packet.received_at(), HMS); - console_info += ":" + to_string_bin(packet.read(0, 32), 32); - //console_info += " REG:" + packet.registration_number(); - - console.writeln(console_info); - }*/ - - packet_counter++; - if (packet_counter % 10 == 0) - console.writeln("Block #" + to_string_dec_uint(packet_counter)); - - // Log raw data whatever it contains - if (logger && logging) - logger->log_raw_data(packet, receiver_model.target_frequency()); + if (packet->state == 255) { + // got a packet, parse it, and display + rtc::RTC datetime; + rtc_time::now(datetime); + // todo parity error recovery + console_info = to_string_datetime(datetime, HMS); + console_info += ": "; + console_info += packet->message; + console.writeln(console_info); + // Log raw data whatever it contains + if (logger && logging) + logger->log_str(console_info); + } else { + // debug message arrived + console_info = "State: "; + console_info += to_string_dec_int(packet->state); + console_info += " lastbyte: "; + console_info += to_string_dec_uint(packet->message[0]); + console.writeln(console_info); + if (logger && logging) + logger->log_str(console_info); + } } -} /* namespace ui */ +} // namespace ui::external_app::acars_rx \ No newline at end of file diff --git a/firmware/application/apps/acars_app.hpp b/firmware/application/external/acars_rx/acars_app.hpp similarity index 82% rename from firmware/application/apps/acars_app.hpp rename to firmware/application/external/acars_rx/acars_app.hpp index fd688695..ac99e704 100644 --- a/firmware/application/apps/acars_app.hpp +++ b/firmware/application/external/acars_rx/acars_app.hpp @@ -31,23 +31,19 @@ #include "ui_rssi.hpp" #include "log_file.hpp" -#include "acars_packet.hpp" +namespace ui::external_app::acars_rx { class ACARSLogger { public: Optional append(const std::filesystem::path& filename) { return log_file.append(filename); } - - void log_raw_data(const acars::Packet& packet, const uint32_t frequency); - // void log_decoded(const acars::Packet& packet, const std::string text); + void log_str(std::string msg); private: LogFile log_file{}; }; -namespace ui { - class ACARSAppView : public View { public: ACARSAppView(NavigationView& nav); @@ -55,12 +51,12 @@ class ACARSAppView : public View { void focus() override; - std::string title() const override { return "ACARS (WIP)"; }; + std::string title() const override { return "ACARS"; }; private: NavigationView& nav_; RxRadioState radio_state_{ - 131550000 /* frequency */, + 131825000 /* frequency */, 1750000 /* bandwidth */, 2457600 /* sampling rate */ }; @@ -85,7 +81,7 @@ class ACARSAppView : public View { {0 * 8, 0 * 8}, nav_}; Checkbox check_log{ - {22 * 8, 21}, + {16 * 8, 1 * 16}, 3, "LOG", true}; @@ -93,19 +89,21 @@ class ACARSAppView : public View { Console console{ {0, 3 * 16, 240, 256}}; + AudioVolumeField field_volume{ + {28 * 8, 1 * 16}}; + std::unique_ptr logger{}; - void on_packet(const acars::Packet& packet); + void on_packet(const ACARSPacketMessage* packet); MessageHandlerRegistration message_handler_packet{ Message::ID::ACARSPacket, [this](Message* const p) { const auto message = static_cast(p); - const acars::Packet packet{message->packet}; - this->on_packet(packet); + this->on_packet(message); }}; }; -} /* namespace ui */ +} // namespace ui::external_app::acars_rx -#endif /*__ACARS_APP_H__*/ +#endif /*__ACARS_APP_H__*/ \ No newline at end of file diff --git a/firmware/application/external/acars_rx/main.cpp b/firmware/application/external/acars_rx/main.cpp new file mode 100644 index 00000000..d11adcb8 --- /dev/null +++ b/firmware/application/external/acars_rx/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2023 Bernd Herzog + * + * 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 "ui.hpp" +#include "acars_app.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::acars_rx { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::acars_rx + +extern "C" { + +__attribute__((section(".external_app.app_acars_rx.application_information"), used)) application_information_t _application_information_acars_rx = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::acars_rx::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "ACARS", + /*.bitmap_data = */ { + 0x80, + 0x01, + 0xC0, + 0x03, + 0xC0, + 0x03, + 0xC0, + 0x03, + 0xC0, + 0x03, + 0xE0, + 0x07, + 0xF8, + 0x1F, + 0xFE, + 0x7F, + 0xFF, + 0xFF, + 0xFF, + 0xFF, + 0xC0, + 0x03, + 0xC0, + 0x03, + 0xC0, + 0x03, + 0xE0, + 0x07, + 0xF0, + 0x0F, + 0xF8, + 0x1F, + }, + /*.icon_color = */ ui::Color::orange().v, + /*.menu_location = */ app_location_t::RX, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_acars */ {'P', 'A', 'C', 'A'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} diff --git a/firmware/application/external/adsbtx/main.cpp b/firmware/application/external/adsbtx/main.cpp index bb9e0ef9..9506211f 100644 --- a/firmware/application/external/adsbtx/main.cpp +++ b/firmware/application/external/adsbtx/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_adsbtx.application_information"), used }, /*.icon_color = */ ui::Color::green().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_adsbtx */ {'P', 'A', 'D', 'T'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/afsk_rx/main.cpp b/firmware/application/external/afsk_rx/main.cpp index aa2b3341..ca1a7cfc 100644 --- a/firmware/application/external/afsk_rx/main.cpp +++ b/firmware/application/external/afsk_rx/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_afsk_rx.application_information"), use }, /*.icon_color = */ ui::Color::yellow().v, /*.menu_location = */ app_location_t::RX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_afsk_rx */ {'P', 'A', 'F', 'R'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/analogtv/main.cpp b/firmware/application/external/analogtv/main.cpp index 92ff6135..0106a091 100644 --- a/firmware/application/external/analogtv/main.cpp +++ b/firmware/application/external/analogtv/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_analogtv.application_information"), us }, /*.icon_color = */ ui::Color::yellow().v, /*.menu_location = */ app_location_t::RX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_am_tv */ {'P', 'A', 'M', 'T'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/audio_test/main.cpp b/firmware/application/external/audio_test/main.cpp index 48554ce1..79003140 100644 --- a/firmware/application/external/audio_test/main.cpp +++ b/firmware/application/external/audio_test/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_audio_test.application_information"), }, /*.icon_color = */ ui::Color::cyan().v, /*.menu_location = */ app_location_t::DEBUG, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_none */ {'P', 'A', 'B', 'P'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/audio_test/ui_audio_test.cpp b/firmware/application/external/audio_test/ui_audio_test.cpp index de138764..8b6de1de 100644 --- a/firmware/application/external/audio_test/ui_audio_test.cpp +++ b/firmware/application/external/audio_test/ui_audio_test.cpp @@ -26,7 +26,7 @@ using namespace portapack; -namespace ui { +namespace ui::external_app::audio_test { AudioTestView::AudioTestView(NavigationView& nav) : nav_{nav} { @@ -103,4 +103,4 @@ void AudioTestView::update_audio_beep() { baseband::request_beep_stop(); } -} /* namespace ui */ +} /* namespace ui::external_app::audio_test */ diff --git a/firmware/application/external/audio_test/ui_audio_test.hpp b/firmware/application/external/audio_test/ui_audio_test.hpp index 1d6119b5..65003303 100644 --- a/firmware/application/external/audio_test/ui_audio_test.hpp +++ b/firmware/application/external/audio_test/ui_audio_test.hpp @@ -25,7 +25,7 @@ #include "ui_navigation.hpp" #include "ui_receiver.hpp" -namespace ui { +namespace ui::external_app::audio_test { class AudioTestView : public View { public: @@ -96,6 +96,6 @@ class AudioTestView : public View { Theme::getInstance()->bg_dark->background}; }; -} /* namespace ui */ +} /* namespace ui::external_app::audio_test */ #endif /*__UI_AUDIO_TEST_H__*/ diff --git a/firmware/application/external/blespam/main.cpp b/firmware/application/external/blespam/main.cpp index aa8e8b2a..d58beb99 100644 --- a/firmware/application/external/blespam/main.cpp +++ b/firmware/application/external/blespam/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_blespam.application_information"), use }, /*.icon_color = */ ui::Color::yellow().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_btle_tx */ {'P', 'B', 'T', 'T'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/calculator/main.cpp b/firmware/application/external/calculator/main.cpp index e03488b6..ebb2c985 100644 --- a/firmware/application/external/calculator/main.cpp +++ b/firmware/application/external/calculator/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_calculator.application_information"), }, /*.icon_color = */ ui::Color::yellow().v, /*.menu_location = */ app_location_t::UTILITIES, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_none */ {0, 0, 0, 0}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/coasterp/main.cpp b/firmware/application/external/coasterp/main.cpp index a81d5888..0415f842 100644 --- a/firmware/application/external/coasterp/main.cpp +++ b/firmware/application/external/coasterp/main.cpp @@ -76,6 +76,7 @@ __attribute__((section(".external_app.app_coasterp.application_information"), us }, /*.icon_color = */ ui::Color::yellow().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_fsktx */ {'P', 'F', 'S', 'K'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/cvs_spam/cvs_spam.cpp b/firmware/application/external/cvs_spam/cvs_spam.cpp new file mode 100644 index 00000000..3486d719 --- /dev/null +++ b/firmware/application/external/cvs_spam/cvs_spam.cpp @@ -0,0 +1,310 @@ +// CVS Spam app by RocketGod (@rocketgod-git) https://betaskynet.com +// Original .cu8 files by @jimilinuxguy https://github.com/jimilinuxguy/customer-assistance-buttons-sdr +// If you can read this, you're a nerd. :P +// Come join us at https://discord.gg/thepiratesreborn + +#include "cvs_spam.hpp" +#include "io_file.hpp" +#include "metadata_file.hpp" +#include "oversample.hpp" +#include "io_convert.hpp" +#include "lfsr_random.hpp" + +using namespace portapack; + +namespace ui::external_app::cvs_spam { + +void CVSSpamView::file_error(const std::filesystem::path& path, const std::string& error_details) { + nav_.display_modal("Error", + "File error:\n" + path.string() + "\n" + error_details); +} + +void CVSSpamView::refresh_list() { + file_list.clear(); + current_page = page; + uint32_t count = 0; + + for (const auto& entry : std::filesystem::directory_iterator(cvsfiles_dir, u"*")) { + if (std::filesystem::is_regular_file(entry.status())) { + auto filename = entry.path().filename().string(); + auto extension = entry.path().extension().string(); + std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower); + + if (extension == ".c16" || extension == ".cu8") { + if (count >= (page - 1) * 50 && count < page * 50) { + file_list.push_back(entry.path()); + if (file_list.size() == 50) { + page++; + break; + } + } + count++; + } + } + } + + if (file_list.empty()) { + if (page == 1) { + menu_view.hidden(true); + text_empty.hidden(false); + } else { + page = 1; + refresh_list(); + return; + } + } else { + menu_view.hidden(false); + text_empty.hidden(true); + menu_view.clear(); + for (const auto& file : file_list) { + menu_view.add_item({file.filename().string(), + ui::Theme::getInstance()->fg_green->foreground, + nullptr, + [this](KeyEvent key) { + if (key == KeyEvent::Select) { + start_tx(menu_view.highlighted_index()); + } + }}); + } + page_info.set("Page " + std::to_string(current_page)); + menu_view.set_highlighted(0); + } + + if (file_list.size() < 50) { + page = 1; + } +} + +void CVSSpamView::start_tx(const uint32_t id) { + if (is_active()) { + stop_tx(); + return; + } + + const uint32_t sample_rate = 250000; + + current_file = cvsfiles_dir / file_list[id].filename(); + + File capture_file; + auto open_error = capture_file.open(current_file); + if (open_error) { + file_error(current_file, + "Cannot open file.\n" + "Initial file check failed.\n" + "Path: " + + cvsfiles_dir.string() + + "\n" + "Error: " + + std::to_string(static_cast(open_error))); + return; + } + + auto metadata_path = get_metadata_path(current_file); + auto metadata = read_metadata_file(metadata_path); + if (!metadata) { + metadata = capture_metadata{transmitter_model.target_frequency(), sample_rate}; + } + + auto file_size = capture_file.size(); + capture_file.close(); + + replay_thread.reset(); + transmitter_model.disable(); + ready_signal = false; + + baseband::set_sample_rate(metadata->sample_rate, get_oversample_rate(metadata->sample_rate)); + + auto reader = std::make_unique(); + if (auto error = reader->open(current_file)) { + file_error(current_file, + "Cannot read C16 data.\n" + "Check file format/perms.\n" + "Rate: " + + to_string_dec_uint(metadata->sample_rate) + + "\n" + "Size: " + + to_string_dec_uint(file_size) + + "\n" + "Error: " + + std::to_string(static_cast(error))); + return; + } + + progressbar.set_value(0); + + transmitter_model.set_sampling_rate(get_actual_sample_rate(metadata->sample_rate)); + transmitter_model.set_baseband_bandwidth(metadata->sample_rate <= 500000 ? 1750000 : 2500000); + transmitter_model.set_target_frequency(metadata->center_frequency); + transmitter_model.enable(); + + chThdSleepMilliseconds(100); + + replay_thread = std::make_unique( + std::move(reader), + read_size, + buffer_count, + &ready_signal, + [](uint32_t return_code) { + ReplayThreadDoneMessage message{return_code}; + EventDispatcher::send_message(message); + }); +} + +void CVSSpamView::start_random_tx() { + if (is_active()) { + stop_tx(); + return; + } + + if (file_list.empty()) { + nav_.display_modal("Error", "No files found!"); + return; + } + + lfsr_v = lfsr_iterate(lfsr_v); + size_t random_index = lfsr_v % file_list.size(); + + const uint32_t sample_rate = 250000; + current_file = cvsfiles_dir / file_list[random_index].filename(); + + File capture_file; + auto open_error = capture_file.open(current_file); + if (open_error) { + file_error(current_file, "Cannot open file.\nInitial check failed."); + return; + } + + auto metadata_path = get_metadata_path(current_file); + auto metadata = read_metadata_file(metadata_path); + if (!metadata) { + metadata = capture_metadata{transmitter_model.target_frequency(), sample_rate}; + } + + capture_file.close(); + + replay_thread.reset(); + transmitter_model.disable(); + ready_signal = false; + + baseband::set_sample_rate(metadata->sample_rate, get_oversample_rate(metadata->sample_rate)); + + auto reader = std::make_unique(); + if (auto error = reader->open(current_file)) { + file_error(current_file, "Cannot read file data."); + return; + } + + progressbar.set_value(0); + + transmitter_model.set_sampling_rate(get_actual_sample_rate(metadata->sample_rate)); + transmitter_model.set_baseband_bandwidth(metadata->sample_rate <= 500000 ? 1750000 : 2500000); + transmitter_model.set_target_frequency(metadata->center_frequency); + transmitter_model.enable(); + + chThdSleepMilliseconds(100); + + replay_thread = std::make_unique( + std::move(reader), + read_size, + buffer_count, + &ready_signal, + [](uint32_t return_code) { + ReplayThreadDoneMessage message{return_code}; + EventDispatcher::send_message(message); + }); +} + +void CVSSpamView::on_tx_progress(const uint32_t progress) { + if (is_active()) { + progressbar.set_value(progress % 100); + progressbar.set_style(Theme::getInstance()->fg_red); + } +} + +void CVSSpamView::focus() { + menu_view.focus(); +} + +bool CVSSpamView::is_active() const { + return (bool)replay_thread; +} + +void CVSSpamView::stop_tx() { + replay_thread.reset(); + transmitter_model.disable(); + ready_signal = false; + thread_sync_complete = false; + chaos_mode = false; + progressbar.set_value(0); + chThdSleepMilliseconds(50); +} + +CVSSpamView::CVSSpamView(NavigationView& nav) + : nav_{nav}, + current_file{} { + baseband::run_image(portapack::spi_flash::image_tag_replay); + + add_children({&menu_view, + &text_empty, + &button_prev_page, + &button_next_page, + &page_info, + &button_send, + &button_chaos, + &button_stop, + &progressbar}); + + button_send.set_style(Theme::getInstance()->fg_magenta); + button_chaos.set_style(Theme::getInstance()->fg_yellow); + button_stop.set_style(Theme::getInstance()->fg_red); + + transmitter_model.set_sampling_rate(1536000); + transmitter_model.set_baseband_bandwidth(1750000); + transmitter_model.set_rf_amp(true); + transmitter_model.set_tx_gain(47); + transmitter_model.set_channel_bandwidth(1750000); + + refresh_list(); + + button_prev_page.on_select = [this](Button&) { + if (is_active()) return; + if (current_page == 1) return; + if (current_page == 2) page = 1; + page = current_page - 1; + refresh_list(); + }; + + button_next_page.on_select = [this](Button&) { + if (is_active()) return; + refresh_list(); + }; + + button_send.on_select = [this](Button&) { + if (!file_list.empty()) { + start_tx(menu_view.highlighted_index()); + } + }; + + button_chaos.on_select = [this](Button&) { + if (is_active()) { + chaos_mode = false; + stop_tx(); + } else { + chaos_mode = true; + start_random_tx(); + } + }; + + button_stop.on_select = [this](Button&) { + if (is_active()) { + stop_tx(); + } + }; +} + +CVSSpamView::~CVSSpamView() { + stop_tx(); + baseband::shutdown(); +} + +} // namespace ui::external_app::cvs_spam \ No newline at end of file diff --git a/firmware/application/external/cvs_spam/cvs_spam.hpp b/firmware/application/external/cvs_spam/cvs_spam.hpp new file mode 100644 index 00000000..77320d4c --- /dev/null +++ b/firmware/application/external/cvs_spam/cvs_spam.hpp @@ -0,0 +1,136 @@ +// CVS Spam app by RocketGod (@rocketgod-git) https://betaskynet.com +// Original .cu8 files by @jimilinuxguy https://github.com/jimilinuxguy/customer-assistance-buttons-sdr +// If you can read this, you're a nerd. :P +// Come join us at https://discord.gg/thepiratesreborn + +#pragma once + +#include "ui_widget.hpp" +#include "ui_transmitter.hpp" +#include "replay_thread.hpp" +#include "baseband_api.hpp" +#include "ui_language.hpp" +#include "file_path.hpp" + +using namespace portapack; + +namespace ui::external_app::cvs_spam { + +class CVSSpamView : public View { + public: + explicit CVSSpamView(NavigationView& nav); + ~CVSSpamView(); + + void focus() override; + std::string title() const override { return "CVS Spam"; }; + + private: + static constexpr size_t read_size = 0x4000; + static constexpr size_t buffer_count = 3; + + lfsr_word_t lfsr_v = 1; + bool chaos_mode{false}; + + NavigationView& nav_; + std::unique_ptr replay_thread{}; + bool ready_signal{false}; + bool thread_sync_complete{false}; + std::filesystem::path current_file; + + bool is_active() const; + void stop_tx(); + void file_error(const std::filesystem::path& path, const std::string& error_details); + void refresh_list(); + void start_tx(const uint32_t id); + void start_random_tx(); + void on_tx_progress(const uint32_t progress); + + uint32_t page = 1; + uint32_t current_page = 1; + std::vector file_list{}; + + MenuView menu_view{ + {0, 0, 240, 180}, + true}; + + Text text_empty{ + {7 * 8, 12 * 8, 16 * 8, 16}, + "Empty directory!"}; + + Button button_prev_page{ + {0, 180, 50, 32}, + "<"}; + + Button button_next_page{ + {190, 180, 50, 32}, + ">"}; + + Text page_info{ + {95, 188, 50, 16}}; + + Button button_send{ + {0, 212, 75, 36}, + "CALL"}; + + Button button_chaos{ + {82, 212, 75, 36}, + "CHAOS"}; + + Button button_stop{ + {165, 212, 75, 36}, + LanguageHelper::currentMessages[LANG_STOP]}; + + ProgressBar progressbar{ + {0, 256, 240, 44}}; + + MessageHandlerRegistration message_handler_fifo_signal{ + Message::ID::RequestSignal, + [this](const Message* const p) { + const auto message = static_cast(p); + if (message->signal == RequestSignalMessage::Signal::FillRequest) { + ready_signal = true; + } + }}; + + MessageHandlerRegistration message_handler_tx_progress{ + Message::ID::TXProgress, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + this->on_tx_progress(message.progress); + }}; + + MessageHandlerRegistration message_handler_replay_thread_done{ + Message::ID::ReplayThreadDone, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + if (message.return_code == ReplayThread::END_OF_FILE) { + if (chaos_mode) { + replay_thread.reset(); + transmitter_model.disable(); + ready_signal = false; + lfsr_v = lfsr_iterate(lfsr_v); + size_t random_index = lfsr_v % file_list.size(); + menu_view.set_highlighted(random_index); + chThdSleepMilliseconds(100); + start_tx(random_index); + } else { + thread_sync_complete = true; + stop_tx(); + } + } else if (message.return_code == ReplayThread::READ_ERROR) { + file_error(file_list[menu_view.highlighted_index()], "Read error during playback"); + if (chaos_mode) { + replay_thread.reset(); + transmitter_model.disable(); + ready_signal = false; + lfsr_v = lfsr_iterate(lfsr_v); + size_t random_index = lfsr_v % file_list.size(); + menu_view.set_highlighted(random_index); + chThdSleepMilliseconds(100); + start_tx(random_index); + } + } + }}; +}; + +} // namespace ui::external_app::cvs_spam \ No newline at end of file diff --git a/firmware/application/external/cvs_spam/main.cpp b/firmware/application/external/cvs_spam/main.cpp new file mode 100644 index 00000000..b9ccb5f0 --- /dev/null +++ b/firmware/application/external/cvs_spam/main.cpp @@ -0,0 +1,34 @@ +// CVS Spam app by RocketGod (@rocketgod-git) https://betaskynet.com +// Original .cu8 files by @jimilinuxguy https://github.com/jimilinuxguy/customer-assistance-buttons-sdr +// If you can read this, you're a nerd. :P +// Come join us at https://discord.gg/thepiratesreborn + +#include "ui.hpp" +#include "cvs_spam.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::cvs_spam { +void initialize_app(NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::cvs_spam + +extern "C" { + +__attribute__((section(".external_app.app_cvs_spam.application_information"), used)) application_information_t _application_information_cvs_spam = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::cvs_spam::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "CVS Spam", + /*.bitmap_data = */ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81}, + /*.icon_color = */ ui::Color::red().v, + /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_afsk_rx */ {'P', 'R', 'E', 'P'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} \ No newline at end of file diff --git a/firmware/application/external/external.cmake b/firmware/application/external/external.cmake index 8bc794ec..03fbffad 100644 --- a/firmware/application/external/external.cmake +++ b/firmware/application/external/external.cmake @@ -96,6 +96,56 @@ set(EXTCPPSRC #sstvtx external/sstvtx/main.cpp external/sstvtx/ui_sstvtx.cpp + + #random + external/random_password/main.cpp + external/random_password/ui_random_password.cpp + external/random_password/sha512.cpp + external/random_password/sha512.h + + #acars + external/acars_rx/main.cpp + external/acars_rx/acars_app.cpp + + #shoppingcart_lock + external/shoppingcart_lock/main.cpp + external/shoppingcart_lock/shoppingcart_lock.cpp + + #ookbrute + external/ookbrute/main.cpp + external/ookbrute/ui_ookbrute.cpp + + #ook_editor + external/ook_editor/main.cpp + external/ook_editor/ui_ook_editor.cpp + + #cvs_spam + external/cvs_spam/main.cpp + external/cvs_spam/cvs_spam.cpp + + #flippertx + external/flippertx/main.cpp + external/flippertx/ui_flippertx.cpp + + #remote + external/remote/main.cpp + external/remote/ui_remote.cpp + + #mcu_temperature + external/mcu_temperature/main.cpp + external/mcu_temperature/mcu_temperature.cpp + + #fmradio + external/fmradio/main.cpp + external/fmradio/ui_fmradio.cpp + + #tuner + external/tuner/main.cpp + external/tuner/ui_tuner.cpp + + #metronome + external/metronome/main.cpp + external/metronome/ui_metronome.cpp ) set(EXTAPPLIST @@ -117,9 +167,21 @@ set(EXTAPPLIST foxhunt_rx audio_test wardrivemap + cvs_spam tpmsrx protoview adsbtx morse_tx sstvtx + random_password + #acars_rx + ookbrute + ook_editor + shoppingcart_lock + flippertx + remote + mcu_temperature + fmradio + tuner + metronome ) diff --git a/firmware/application/external/external.ld b/firmware/application/external/external.ld index 932c76a6..51a24ea5 100644 --- a/firmware/application/external/external.ld +++ b/firmware/application/external/external.ld @@ -46,6 +46,18 @@ MEMORY ram_external_app_adsbtx(rwx) : org = 0xADC50000, len = 32k ram_external_app_morse_tx(rwx) : org = 0xADC60000, len = 32k ram_external_app_sstvtx(rwx) : org = 0xADC70000, len = 32k + ram_external_app_random_password(rwx) : org = 0xADC80000, len = 32k + ram_external_app_acars_rx(rwx) : org = 0xADC90000, len = 32k + ram_external_app_shoppingcart_lock(rwx) : org = 0xADCA0000, len = 32k + ram_external_app_cvs_spam(rwx) : org = 0xADCB0000, len = 32k + ram_external_app_ookbrute(rwx) : org = 0xADCC0000, len = 32k + ram_external_app_flippertx(rwx) : org = 0xADCD0000, len = 32k + ram_external_app_ook_editor(rwx) : org = 0xADCE0000, len = 32k + ram_external_app_remote(rwx) : org = 0xADCF0000, len = 32k + ram_external_app_mcu_temperature(rwx) : org = 0xADD00000, len = 32k + ram_external_app_fmradio(rwx) : org = 0xADD10000, len = 32k + ram_external_app_tuner(rwx) : org = 0xADD20000, len = 32k + ram_external_app_metronome(rwx) : org = 0xADD30000, len = 32k } SECTIONS @@ -164,7 +176,6 @@ SECTIONS *(*ui*external_app*tpmsrx*); } > ram_external_app_tpmsrx - .external_app_protoview : ALIGN(4) SUBALIGN(4) { KEEP(*(.external_app.app_protoview.application_information)); @@ -190,6 +201,75 @@ SECTIONS *(*ui*external_app*sstvtx*); } > ram_external_app_sstvtx + .external_app_random_password : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_random_password.application_information)); + *(*ui*external_app*random_password*); + } > ram_external_app_random_password + .external_app_acars_rx : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_acars_rx.application_information)); + *(*ui*external_app*acars_rx*); + } > ram_external_app_acars_rx + .external_app_shoppingcart_lock : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_shoppingcart_lock.application_information)); + *(*ui*external_app*shoppingcart_lock*); + } > ram_external_app_shoppingcart_lock + + .external_app_cvs_spam : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_cvs_spam.application_information)); + *(*ui*external_app*cvs_spam*); + } > ram_external_app_cvs_spam + + .external_app_ookbrute : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_ookbrute.application_information)); + *(*ui*external_app*ookbrute*); + } > ram_external_app_ookbrute + + .external_app_ook_editor : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_ook_editor.application_information)); + *(*ui*external_app*ook_editor*); + } > ram_external_app_ook_editor + + .external_app_flippertx : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_flippertx.application_information)); + *(*ui*external_app*flippertx*); + } > ram_external_app_flippertx + + .external_app_remote : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_remote.application_information)); + *(*ui*external_app*remote*); + } > ram_external_app_remote + + .external_app_mcu_temperature : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_mcu_temperature.application_information)); + *(*ui*external_app*mcu_temperature*); + } > ram_external_app_mcu_temperature + + .external_app_fmradio : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_fmradio.application_information)); + *(*ui*external_app*fmradio*); + } > ram_external_app_fmradio + + .external_app_tuner : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_tuner.application_information)); + *(*ui*external_app*tuner*); + } > ram_external_app_tuner + + .external_app_metronome : ALIGN(4) SUBALIGN(4) + { + KEEP(*(.external_app.app_metronome.application_information)); + *(*ui*external_app*metronome*); + } > ram_external_app_metronome } diff --git a/firmware/application/external/extsensors/main.cpp b/firmware/application/external/extsensors/main.cpp index 27926409..4597dd19 100644 --- a/firmware/application/external/extsensors/main.cpp +++ b/firmware/application/external/extsensors/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_extsensors.application_information"), }, /*.icon_color = */ ui::Color::orange().v, /*.menu_location = */ app_location_t::DEBUG, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_none */ {0, 0, 0, 0}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/extsensors/ui_extsensors.cpp b/firmware/application/external/extsensors/ui_extsensors.cpp index 572effe6..d36a5a93 100644 --- a/firmware/application/external/extsensors/ui_extsensors.cpp +++ b/firmware/application/external/extsensors/ui_extsensors.cpp @@ -22,6 +22,7 @@ #include "rtc_time.hpp" #include "string_format.hpp" #include "portapack_persistent_memory.hpp" +#include "i2cdevmanager.hpp" using namespace portapack; using namespace ui; @@ -29,7 +30,7 @@ using namespace ui; namespace ui::external_app::extsensors { void ExtSensorsView::focus() { - text_info.focus(); + console.focus(); } ExtSensorsView::ExtSensorsView(NavigationView& nav) @@ -39,10 +40,33 @@ ExtSensorsView::ExtSensorsView(NavigationView& nav) &text_gps, &text_orientation, &text_envl1, - &text_envl2}); + &text_envl2, + &text_envl3, + &console}); + + prev_scan_int = i2cdev::I2CDevManager::get_autoscan_interval(); + refreshi2c(); + i2cdev::I2CDevManager::set_autoscan_interval(3); // scan each 3 sec for new i2c devices +} + +void ExtSensorsView::on_new_dev() { + refreshi2c(); +} + +void ExtSensorsView::refreshi2c() { + console.clear(true); + console.writeln("Found I2C devices:"); + auto addrlist = i2cdev::I2CDevManager::get_gev_list_by_addr(); + for (size_t i = 0; i < addrlist.size(); ++i) { + console.write("0x"); + console.write(to_string_hex(addrlist[i])); + console.write(", "); + } + if (addrlist.size() == 0) console.writeln("No I2C devs found."); } ExtSensorsView::~ExtSensorsView() { + i2cdev::I2CDevManager::set_autoscan_interval(prev_scan_int); } void ExtSensorsView::on_any() { @@ -78,9 +102,14 @@ void ExtSensorsView::on_environment(const EnvironmentDataMessage* msg) { tmp += "C"; tmp += "; H: " + to_string_decimal(msg->humidity, 1) + "%"; // humidity text_envl1.set(tmp); - tmp = "P: " + to_string_decimal(msg->pressure, 1) + " hPa; L:"; // pressure - tmp += to_string_dec_int(msg->light) + " LUX"; // light + tmp = "P: " + to_string_decimal(msg->pressure, 1) + " hPa"; // pressure text_envl2.set(tmp); } +void ExtSensorsView::on_light(const LightDataMessage* msg) { + on_any(); + std::string tmp = "L: " + to_string_dec_int(msg->light) + " LUX"; + text_envl3.set(tmp); +} + } // namespace ui::external_app::extsensors \ No newline at end of file diff --git a/firmware/application/external/extsensors/ui_extsensors.hpp b/firmware/application/external/extsensors/ui_extsensors.hpp index e0472361..555e576b 100644 --- a/firmware/application/external/extsensors/ui_extsensors.hpp +++ b/firmware/application/external/extsensors/ui_extsensors.hpp @@ -53,6 +53,7 @@ class ExtSensorsView : public View { NavigationView& nav_; bool has_data = false; + uint16_t prev_scan_int = 0; Labels labels{ {{0 * 8, 3 * 16}, "GPS:", Theme::getInstance()->fg_light->foreground}, @@ -64,9 +65,15 @@ class ExtSensorsView : public View { Text text_orientation{{5 * 8, 5 * 16, 24 * 8, 16}, "-"}; Text text_envl1{{5 * 8, 7 * 16, 24 * 8, 16}, "-"}; Text text_envl2{{1 * 8, 9 * 16, 24 * 8, 16}, "-"}; + Text text_envl3{{1 * 8, 11 * 16, 24 * 8, 16}, "-"}; + Console console{ + {1, 13 * 16, screen_width - 1, screen_height - 13 * 16}}; + void refreshi2c(); + void on_new_dev(); void on_any(); + void on_light(const LightDataMessage* msg); void on_gps(const GPSPosDataMessage* msg); void on_orientation(const OrientationDataMessage* msg); void on_environment(const EnvironmentDataMessage* msg); @@ -90,6 +97,20 @@ class ExtSensorsView : public View { const auto message = static_cast(p); this->on_environment(message); }}; + + MessageHandlerRegistration message_handler_light{ + Message::ID::LightData, + [this](Message* const p) { + const auto message = static_cast(p); + this->on_light(message); + }}; + + MessageHandlerRegistration message_handler_dev{ + Message::ID::I2CDevListChanged, + [this](Message* const p) { + (void)p; // make compiler happy + this->on_new_dev(); + }}; }; }; // namespace ui::external_app::extsensors diff --git a/firmware/application/external/flippertx/main.cpp b/firmware/application/external/flippertx/main.cpp new file mode 100644 index 00000000..3dde72c2 --- /dev/null +++ b/firmware/application/external/flippertx/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2023 Bernd Herzog + * + * 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 "ui.hpp" +#include "ui_flippertx.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::flippertx { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::flippertx + +extern "C" { + +__attribute__((section(".external_app.app_flippertx.application_information"), used)) application_information_t _application_information_flippertx = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::flippertx::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "FlipperTx", + /*.bitmap_data = */ { + 0x20, + 0x00, + 0x20, + 0x00, + 0x20, + 0x00, + 0x20, + 0x00, + 0xE0, + 0x07, + 0xF0, + 0x0F, + 0x30, + 0x0C, + 0x30, + 0x0C, + 0xF0, + 0x0F, + 0xF0, + 0x0F, + 0x70, + 0x0D, + 0xB0, + 0x0E, + 0x70, + 0x0D, + 0xB0, + 0x0E, + 0xF0, + 0x0F, + 0xE0, + 0x07, + }, + /*.icon_color = */ ui::Color::orange().v, + /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_ookstreaming */ {'P', 'O', 'S', 'K'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} diff --git a/firmware/application/external/flippertx/ui_flippertx.cpp b/firmware/application/external/flippertx/ui_flippertx.cpp new file mode 100644 index 00000000..03572ed0 --- /dev/null +++ b/firmware/application/external/flippertx/ui_flippertx.cpp @@ -0,0 +1,285 @@ +/* + * Copyright (C) 2024 HTotoo + * + * 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 "ui_flippertx.hpp" +#include "audio.hpp" +#include "rtc_time.hpp" +#include "baseband_api.hpp" +#include "string_format.hpp" +#include "portapack_persistent_memory.hpp" +#include "buffer_exchange.hpp" + +using namespace portapack; +using namespace ui; + +namespace ui::external_app::flippertx { + +void FlipperTxView::focus() { + button_browse.focus(); +} + +void FlipperTxView::set_ready() { + ready_signal = true; +} + +FlipperTxView::FlipperTxView(NavigationView& nav) + : nav_{nav} { + add_children({&button_startstop, + &field_frequency, + &tx_view, + &field_filename, + &button_browse}); + + button_startstop.on_select = [this](Button&) { + if (is_running) { + stop(); + } else { + start(); + } + }; + + button_browse.on_select = [this](Button&) { + auto open_view = nav_.push(".sub"); + open_view->push_dir(subghz_dir); + open_view->on_changed = [this](std::filesystem::path new_file_path) { + if (on_file_changed(new_file_path)) { + ; // tif (button_startstop.parent()) button_startstop.focus(); parent_ is null error..... + } + }; + }; +} + +bool FlipperTxView::on_file_changed(std::filesystem::path new_file_path) { + submeta = read_flippersub_file(new_file_path); + filename = ""; + if (!submeta.is_valid()) { + field_filename.set_text("File: err, bad file"); + return false; + } + proto = submeta.value().protocol; + if (proto != FLIPPER_PROTO_RAW && proto != FLIPPER_PROTO_BINRAW) { // temp disabled + field_filename.set_text("File: err, not supp. proto"); + return false; + } + preset = submeta.value().preset; + if (preset != FLIPPER_PRESET_OOK) { + field_filename.set_text("File: err, not supp. preset"); + return false; + } + te = submeta.value().te; + binraw_bit_count = submeta.value().binraw_bit_count; + /*if (binraw_bit_count >= 512 * 800) { + field_filename.set_text("File: err, too long"); // should stream, but not in this scope YET + return false; + }*/ + field_filename.set_text("File: " + new_file_path.string()); + filename = new_file_path; + return true; +} + +void FlipperTxView::stop() { + if (is_running && replay_thread) replay_thread.reset(); + is_running = false; + ready_signal = false; + + transmitter_model.disable(); + baseband::shutdown(); + button_startstop.set_text(LanguageHelper::currentMessages[LANG_START]); +} + +bool FlipperTxView::start() { + if (filename.empty()) return false; + baseband::run_prepared_image(portapack::memory::map::m4_code.base()); + transmitter_model.enable(); + button_startstop.set_text(LanguageHelper::currentMessages[LANG_STOP]); + // start thread + replay_thread = std::make_unique( + filename, + 1024, 4, + &ready_signal, + submeta.value().protocol, + submeta.value().te, + [](uint32_t return_code) { + ReplayThreadDoneMessage message{return_code}; + EventDispatcher::send_message(message); + }); + is_running = true; + return true; +} + +void FlipperTxView::on_tx_progress(const bool done) { + if (done) { + if (is_running) { + stop(); + } + } +} + +FlipperTxView::~FlipperTxView() { + stop(); +} + +FlipperPlayThread::FlipperPlayThread( + std::filesystem::path filename, + size_t read_size, + size_t buffer_count, + bool* ready_signal, + FlipperProto proto, + uint16_t te, + std::function terminate_callback) + : config{read_size, buffer_count}, + filename{filename}, + ready_sig{ready_signal}, + proto{proto}, + te{te}, + terminate_callback{std::move(terminate_callback)} { + thread = chThdCreateFromHeap(NULL, 6 * 1024, NORMALPRIO + 10, FlipperPlayThread::static_fn, this); +} + +FlipperPlayThread::~FlipperPlayThread() { + if (thread) { + chThdTerminate(thread); + if (thread->p_refs) chThdWait(thread); + thread = nullptr; + } +} + +msg_t FlipperPlayThread::static_fn(void* arg) { + auto obj = static_cast(arg); + const auto return_code = obj->run(); + if (obj->terminate_callback) { + obj->terminate_callback(return_code); + } + chThdExit(0); + return 0; +} + +uint32_t FlipperPlayThread::run() { + BasebandReplay replay{&config}; + BufferExchange buffers{&config}; + StreamBuffer* prefill_buffer{nullptr}; + int32_t read_result = 0; + // assume it is ok, since prev we checked it. + // open the sub file + File f; // don't worry, destructor will close it. + auto error = f.open(filename); + if (error) return READ_ERROR; + // seek to the first data + if (proto == FLIPPER_PROTO_RAW) + seek_flipper_raw_first_data(f); + else { + seek_flipper_binraw_first_data(f); + } + // Wait for FIFOs to be allocated in baseband + // Wait for _view to tell us that the buffers are ready + while (!(*ready_sig) && !chThdShouldTerminate()) { + chThdSleep(100); + }; + uint8_t readall = 0; + int32_t endsignals[3] = {0, 42069, 613379}; // unlikely a valid data + // While empty buffers fifo is not empty... + while (!buffers.empty() && !chThdShouldTerminate()) { + prefill_buffer = buffers.get_prefill(); + + if (prefill_buffer == nullptr) { + buffers.put_app(prefill_buffer); + } else { + size_t c = 0; + for (c = 0; c < config.read_size / 4;) { + read_result = 0; + if (0 == readall) { + if (proto == FLIPPER_PROTO_RAW) { + auto data = read_flipper_raw_next_data(f); + if (!data.is_valid()) { + ((int32_t*)prefill_buffer->data())[c] = endsignals[++readall]; + } else { + read_result = data.value(); + ((int32_t*)prefill_buffer->data())[c] = read_result; + } + c++; + + } else { // BINRAW + auto data = read_flipper_binraw_next_data(f); + if (!data.is_valid()) + readall = 1; + else { + read_result = data.value(); + // add 8 data + for (uint8_t bit = 0; bit < 8; bit++) { + ((int32_t*)prefill_buffer->data())[c + bit] = ((get_flipper_binraw_bitvalue(read_result, (7 - bit)) ? 1 : -1) * te); + c++; + } + } + } + } else { + ((int32_t*)prefill_buffer->data())[c] = endsignals[readall]; + if (readall == 1) readall++; + c++; + } + } + prefill_buffer->set_size(config.read_size); + buffers.put(prefill_buffer); + } + }; + baseband::set_fifo_data(nullptr); + if (readall) return END_OF_FILE; + + while (!chThdShouldTerminate()) { + auto buffer = buffers.get(); + int32_t read_result = 0; + for (size_t d = 0; d < buffer->capacity() / 4; d++) { + read_result = -133469; + if (!readall) { + if (proto == FLIPPER_PROTO_RAW) { + auto data = read_flipper_raw_next_data(f); + if (!data.is_valid()) { + readall = 1; + } else { + read_result = data.value(); + } + } else { + auto data = read_flipper_binraw_next_data(f); + if (!data.is_valid()) + readall = 1; + else { + read_result = data.value(); + // add 8 data + for (uint8_t bit = 0; bit < 8; bit++) { + ((int32_t*)prefill_buffer->data())[d + bit] = ((get_flipper_binraw_bitvalue(read_result, (7 - bit)) ? 1 : -1) * te); + } + d += 7; + continue; + } + } + } + if (readall >= 1 && readall <= 2) { + read_result = endsignals[readall++]; + } + ((int32_t*)buffer->data())[d] = read_result; + } + buffer->set_size(buffer->capacity()); + buffers.put(buffer); + if (readall == 3) return END_OF_FILE; + } + return TERMINATED; +} + +} // namespace ui::external_app::flippertx diff --git a/firmware/application/external/flippertx/ui_flippertx.hpp b/firmware/application/external/flippertx/ui_flippertx.hpp new file mode 100644 index 00000000..a1e05877 --- /dev/null +++ b/firmware/application/external/flippertx/ui_flippertx.hpp @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2024 HTotoo + * + * This file is part of PortaPack. + * + */ + +#ifndef __UI_flippertx_H__ +#define __UI_flippertx_H__ + +#include "ui.hpp" +#include "ui_language.hpp" +#include "ui_navigation.hpp" +#include "ui_transmitter.hpp" +#include "ui_freq_field.hpp" +#include "app_settings.hpp" +#include "radio_state.hpp" +#include "utility.hpp" +#include "string_format.hpp" +#include "file_path.hpp" +#include "metadata_file.hpp" +#include "flipper_subfile.hpp" +#include "ui_fileman.hpp" +#include "baseband_api.hpp" + +using namespace ui; + +namespace ui::external_app::flippertx { + +#define OOK_SAMPLERATE 2280000U +class FlipperPlayThread; +class FlipperTxView : public View { + public: + FlipperTxView(NavigationView& nav); + ~FlipperTxView(); + + void focus() override; + + std::string title() const override { + return "FlipperTx"; + }; + + private: + NavigationView& nav_; + TxRadioState radio_state_{ + 433920000 /* frequency */, + 1750000 /* bandwidth */, + OOK_SAMPLERATE /* sampling rate */ + }; + + TxFrequencyField field_frequency{ + {0 * 8, 0 * 16}, + nav_}; + TransmitterView2 tx_view{ + {11 * 8, 0 * 16}, + /*short_ui*/ true}; + + app_settings::SettingsManager settings_{ + "tx_flippertx", app_settings::Mode::TX}; + + TextField field_filename{ + {0, 2 * 16, 300, 1 * 8}, + "File: -"}; + + Button button_startstop{ + {1, 6 * 16, 96, 24}, + LanguageHelper::currentMessages[LANG_START]}; + + Button button_browse{ + {1, 3 * 16 + 3, 96, 24}, + LanguageHelper::currentMessages[LANG_BROWSE]}; + + bool is_running{false}; + + bool start(); + void stop(); + + void set_ready(); + void on_tx_progress(const bool done); + bool on_file_changed(std::filesystem::path new_file_path); + + std::filesystem::path filename = {}; + FlipperProto proto = FLIPPER_PROTO_UNSUPPORTED; + FlipperPreset preset = FLIPPER_PRESET_UNK; + uint16_t te = 0; // for binraw + uint32_t binraw_bit_count = 0; + bool ready_signal = false; + + std::unique_ptr replay_thread{}; + Optional submeta{}; + + const std::filesystem::path subghz_dir = u"subghz"; + + MessageHandlerRegistration message_handler_tx_progress{ + Message::ID::TXProgress, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + this->on_tx_progress(message.done); + }}; + + MessageHandlerRegistration message_handler_fifo_signal{ + Message::ID::RequestSignal, + [this](const Message* const p) { + const auto message = static_cast(p); + if (message->signal == RequestSignalMessage::Signal::FillRequest) { + this->set_ready(); + } + }}; + + MessageHandlerRegistration message_handler_replay_thread_done{ + Message::ID::ReplayThreadDone, + [this](const Message* const p) { + // const auto message = *reinterpret_cast(p); + (void)p; + // stop(); //don't stop for now, stop when i get the tx finished msg + }}; +}; + +struct BasebandReplay { + BasebandReplay(ReplayConfig* const config) { + baseband::replay_start(config); + } + + ~BasebandReplay() { + // baseband::replay_stop(); // wont, since we need to send out that is in the buffer + } +}; + +class FlipperPlayThread { + public: + FlipperPlayThread( + std::filesystem::path, + size_t read_size, + size_t buffer_count, + bool* ready_signal, + FlipperProto proto, + uint16_t te, + std::function terminate_callback); + ~FlipperPlayThread(); + + FlipperPlayThread(const FlipperPlayThread&) = delete; + FlipperPlayThread(FlipperPlayThread&&) = delete; + FlipperPlayThread& operator=(const FlipperPlayThread&) = delete; + FlipperPlayThread& operator=(FlipperPlayThread&&) = delete; + + const ReplayConfig& state() const { + return config; + }; + + enum FlipperPlayThread_return { + READ_ERROR = 0, + END_OF_FILE, + TERMINATED + }; + + private: + ReplayConfig config; + std::filesystem::path filename; + bool* ready_sig; + FlipperProto proto; + uint16_t te; + std::function terminate_callback; + Thread* thread{nullptr}; + + static msg_t static_fn(void* arg); + + uint32_t run(); +}; +}; // namespace ui::external_app::flippertx + +#endif /*__UI_flippertx_H__*/ diff --git a/firmware/application/external/fmradio/main.cpp b/firmware/application/external/fmradio/main.cpp new file mode 100644 index 00000000..040fbe8c --- /dev/null +++ b/firmware/application/external/fmradio/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 HTotoo + * + * 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 "ui.hpp" +#include "ui_fmradio.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::fmradio { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::fmradio + +extern "C" { + +__attribute__((section(".external_app.app_fmradio.application_information"), used)) application_information_t _application_information_fmradio = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::fmradio::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "FM Radio", + /*.bitmap_data = */ { + 0x00, + 0x00, + 0x00, + 0x00, + 0x04, + 0x20, + 0x12, + 0x48, + 0x8A, + 0x51, + 0xCA, + 0x53, + 0xCA, + 0x53, + 0x8A, + 0x51, + 0x12, + 0x48, + 0x84, + 0x21, + 0xC0, + 0x03, + 0x40, + 0x02, + 0x60, + 0x06, + 0x20, + 0x04, + 0x30, + 0x0C, + 0xF0, + 0x0F, + }, + /*.icon_color = */ ui::Color::green().v, + /*.menu_location = */ app_location_t::RX, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_wfm_audio */ {'P', 'W', 'F', 'M'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} diff --git a/firmware/application/external/fmradio/ui_fmradio.cpp b/firmware/application/external/fmradio/ui_fmradio.cpp new file mode 100644 index 00000000..ece1d211 --- /dev/null +++ b/firmware/application/external/fmradio/ui_fmradio.cpp @@ -0,0 +1,168 @@ +/* + * Copyright (C) 2024 HTotoo + * + * 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 "ui_fmradio.hpp" + +#include "audio.hpp" +#include "rtc_time.hpp" +#include "baseband_api.hpp" +#include "string_format.hpp" +#include "portapack_persistent_memory.hpp" + +using namespace portapack; +using namespace modems; +using namespace ui; + +namespace ui::external_app::fmradio { + +void FmRadioView::focus() { + field_frequency.focus(); +} + +FmRadioView::FmRadioView(NavigationView& nav) + : nav_{nav} { + baseband::run_image(portapack::spi_flash::image_tag_wfm_audio); + + add_children({&rssi, + &field_rf_amp, + &field_lna, + &field_vga, + &field_volume, + &field_frequency, + &btn_fav_save, + &txt_save_help, + &btn_fav_0, + &btn_fav_1, + &btn_fav_2, + &btn_fav_3, + &btn_fav_4, + &btn_fav_5, + &btn_fav_6, + &btn_fav_7, + &btn_fav_8, + &btn_fav_9, + &audio, + &waveform}); + + txt_save_help.visible(false); + for (uint8_t i = 0; i < 12; ++i) { + if (freq_fav_list[i] == 0) { + freq_fav_list[i] = 87000000; + } + } + + if (field_frequency.value() == 0) { + field_frequency.set_value(87000000); + } + + receiver_model.set_modulation(ReceiverModel::Mode::WidebandFMAudio); + + field_frequency.set_step(25000); + receiver_model.enable(); + audio::output::start(); + + btn_fav_0.on_select = [this](Button&) { + on_btn_clicked(0); + }; + btn_fav_1.on_select = [this](Button&) { + on_btn_clicked(1); + }; + btn_fav_2.on_select = [this](Button&) { + on_btn_clicked(2); + }; + btn_fav_3.on_select = [this](Button&) { + on_btn_clicked(3); + }; + btn_fav_4.on_select = [this](Button&) { + on_btn_clicked(4); + }; + btn_fav_5.on_select = [this](Button&) { + on_btn_clicked(5); + }; + btn_fav_6.on_select = [this](Button&) { + on_btn_clicked(6); + }; + btn_fav_7.on_select = [this](Button&) { + on_btn_clicked(7); + }; + btn_fav_8.on_select = [this](Button&) { + on_btn_clicked(8); + }; + btn_fav_9.on_select = [this](Button&) { + on_btn_clicked(9); + }; + + btn_fav_save.on_select = [this](Button&) { + save_fav = !save_fav; + txt_save_help.set_text(save_fav ? "Select slot" : ""); + txt_save_help.visible(save_fav); + txt_save_help.set_dirty(); + }; + + update_fav_btn_texts(); +} + +void FmRadioView::on_btn_clicked(uint8_t i) { + if (save_fav) { + save_fav = false; + freq_fav_list[i] = field_frequency.value(); + update_fav_btn_texts(); + txt_save_help.visible(save_fav); + txt_save_help.set_text(""); + txt_save_help.set_dirty(); + return; + } + field_frequency.set_value(freq_fav_list[i]); +} + +std::string FmRadioView::to_nice_freq(rf::Frequency freq) { + std::string nice = to_string_dec_uint(freq / 1000000); + nice += "."; + nice += to_string_dec_uint((freq / 10000) % 100); + return nice; +} + +void FmRadioView::update_fav_btn_texts() { + btn_fav_0.set_text(to_nice_freq(freq_fav_list[0])); + btn_fav_1.set_text(to_nice_freq(freq_fav_list[1])); + btn_fav_2.set_text(to_nice_freq(freq_fav_list[2])); + btn_fav_3.set_text(to_nice_freq(freq_fav_list[3])); + btn_fav_4.set_text(to_nice_freq(freq_fav_list[4])); + btn_fav_5.set_text(to_nice_freq(freq_fav_list[5])); + btn_fav_6.set_text(to_nice_freq(freq_fav_list[6])); + btn_fav_7.set_text(to_nice_freq(freq_fav_list[7])); + btn_fav_8.set_text(to_nice_freq(freq_fav_list[8])); + btn_fav_9.set_text(to_nice_freq(freq_fav_list[9])); +} + +FmRadioView::~FmRadioView() { + receiver_model.disable(); + baseband::shutdown(); + audio::output::stop(); +} + +void FmRadioView::on_audio_spectrum() { + for (size_t i = 0; i < audio_spectrum_data->db.size(); i++) + audio_spectrum[i] = ((int16_t)audio_spectrum_data->db[i] - 127) * 256; + waveform.set_dirty(); +} + +} // namespace ui::external_app::fmradio diff --git a/firmware/application/external/fmradio/ui_fmradio.hpp b/firmware/application/external/fmradio/ui_fmradio.hpp new file mode 100644 index 00000000..74fc65ea --- /dev/null +++ b/firmware/application/external/fmradio/ui_fmradio.hpp @@ -0,0 +1,150 @@ +/* + * Copyright (C) 2024 HTotoo + * + * 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. + */ + +/* + FUTURE TODO: implement search function. +*/ + +#ifndef __UI_fmradio_H__ +#define __UI_fmradio_H__ + +#include "ui.hpp" +#include "ui_language.hpp" +#include "ui_navigation.hpp" +#include "ui_receiver.hpp" +#include "ui_geomap.hpp" +#include "ui_freq_field.hpp" +#include "ui_spectrum.hpp" +#include "ui_record_view.hpp" +#include "app_settings.hpp" +#include "radio_state.hpp" +#include "log_file.hpp" +#include "utility.hpp" + +using namespace ui; + +namespace ui::external_app::fmradio { + +#define FMR_BTNGRID_TOP 60 + +class FmRadioView : public View { + public: + FmRadioView(NavigationView& nav); + FmRadioView& operator=(const FmRadioView&) = delete; + FmRadioView(const FmRadioView&) = delete; + ~FmRadioView(); + + void focus() override; + + std::string title() const override { return "FM radio"; }; + + private: + NavigationView& nav_; + RxRadioState radio_state_{}; + int16_t audio_spectrum[128]{0}; + bool audio_spectrum_update = false; + AudioSpectrum* audio_spectrum_data{nullptr}; + rf::Frequency freq_fav_list[12] = {0}; + + app_settings::SettingsManager settings_{ + "rx_fmradio", + app_settings::Mode::RX, + {{"favlist0"sv, &freq_fav_list[0]}, + {"favlist1"sv, &freq_fav_list[1]}, + {"favlist2"sv, &freq_fav_list[2]}, + {"favlist3"sv, &freq_fav_list[3]}, + {"favlist4"sv, &freq_fav_list[4]}, + {"favlist5"sv, &freq_fav_list[5]}, + {"favlist6"sv, &freq_fav_list[6]}, + {"favlist7"sv, &freq_fav_list[7]}, + {"favlist8"sv, &freq_fav_list[8]}, + {"favlist9"sv, &freq_fav_list[9]}, + {"favlist10"sv, &freq_fav_list[10]}, + {"favlist11"sv, &freq_fav_list[11]}}}; + + RFAmpField field_rf_amp{ + {13 * 8, 0 * 16}}; + LNAGainField field_lna{ + {15 * 8, 0 * 16}}; + VGAGainField field_vga{ + {18 * 8, 0 * 16}}; + RSSI rssi{ + {21 * 8, 0, 6 * 8, 4}}; + AudioVolumeField field_volume{ + {28 * 8, 0 * 16}}; + + RxFrequencyField field_frequency{ + {0 * 8, 0 * 16}, + nav_}; + + TextField txt_save_help{ + {2, FMR_BTNGRID_TOP + 6 * 34 - 20, 12 * 8, 16}, + " "}; + + Audio audio{ + {21 * 8, 10, 6 * 8, 4}}; + + Waveform waveform{ + {0, 20, 30 * 8, 2 * 16}, + audio_spectrum, + 128, + 0, + false, + Theme::getInstance()->bg_darkest->foreground}; + + Button btn_fav_0{{2, FMR_BTNGRID_TOP + 0 * 34, 10 * 8, 28}, "---"}; + Button btn_fav_1{{2 + 15 * 8, FMR_BTNGRID_TOP + 0 * 34, 10 * 8, 28}, "---"}; + Button btn_fav_2{{2, FMR_BTNGRID_TOP + 1 * 34, 10 * 8, 28}, "---"}; + Button btn_fav_3{{2 + 15 * 8, FMR_BTNGRID_TOP + 1 * 34, 10 * 8, 28}, "---"}; + Button btn_fav_4{{2, FMR_BTNGRID_TOP + 2 * 34, 10 * 8, 28}, "---"}; + Button btn_fav_5{{2 + 15 * 8, FMR_BTNGRID_TOP + 2 * 34, 10 * 8, 28}, "---"}; + Button btn_fav_6{{2, FMR_BTNGRID_TOP + 3 * 34, 10 * 8, 28}, "---"}; + Button btn_fav_7{{2 + 15 * 8, FMR_BTNGRID_TOP + 3 * 34, 10 * 8, 28}, "---"}; + Button btn_fav_8{{2, FMR_BTNGRID_TOP + 4 * 34, 10 * 8, 28}, "---"}; + Button btn_fav_9{{2 + 15 * 8, FMR_BTNGRID_TOP + 4 * 34, 10 * 8, 28}, "---"}; + + Button btn_fav_save{{2, FMR_BTNGRID_TOP + 6 * 34, 7 * 8, 1 * 28}, "Save"}; + bool save_fav = false; + void on_btn_clicked(uint8_t i); + void update_fav_btn_texts(); + std::string to_nice_freq(rf::Frequency freq); + void on_audio_spectrum(); + + MessageHandlerRegistration message_handler_audio_spectrum{ + Message::ID::AudioSpectrum, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + audio_spectrum_data = message.data; + audio_spectrum_update = true; + }}; + MessageHandlerRegistration message_handler_frame_sync{ + Message::ID::DisplayFrameSync, + [this](const Message* const) { + if (audio_spectrum_update) { + audio_spectrum_update = false; + on_audio_spectrum(); + } + }}; +}; + +} // namespace ui::external_app::fmradio + +#endif /*__UI_fmradio_H__*/ diff --git a/firmware/application/external/font_viewer/main.cpp b/firmware/application/external/font_viewer/main.cpp index be07615c..7110a3d2 100644 --- a/firmware/application/external/font_viewer/main.cpp +++ b/firmware/application/external/font_viewer/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_font_viewer.application_information"), }, /*.icon_color = */ ui::Color::cyan().v, /*.menu_location = */ app_location_t::DEBUG, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_none */ {0, 0, 0, 0}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/foxhunt/main.cpp b/firmware/application/external/foxhunt/main.cpp index 1f652846..8aa239c0 100644 --- a/firmware/application/external/foxhunt/main.cpp +++ b/firmware/application/external/foxhunt/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_foxhunt_rx.application_information"), }, /*.icon_color = */ ui::Color::yellow().v, /*.menu_location = */ app_location_t::RX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_am_audio */ {'P', 'A', 'M', 'A'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/gpssim/main.cpp b/firmware/application/external/gpssim/main.cpp index ebcfdd07..763bdbb7 100644 --- a/firmware/application/external/gpssim/main.cpp +++ b/firmware/application/external/gpssim/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_gpssim.application_information"), used }, /*.icon_color = */ ui::Color::green().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_gpssim */ {'P', 'G', 'P', 'S'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/jammer/main.cpp b/firmware/application/external/jammer/main.cpp index 8fe3403b..7c01ba0e 100644 --- a/firmware/application/external/jammer/main.cpp +++ b/firmware/application/external/jammer/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_jammer.application_information"), used }, /*.icon_color = */ ui::Color::green().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_jammer */ {'P', 'J', 'A', 'M'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/keyfob/main.cpp b/firmware/application/external/keyfob/main.cpp index 0c40554a..e12b2194 100644 --- a/firmware/application/external/keyfob/main.cpp +++ b/firmware/application/external/keyfob/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_keyfob.application_information"), used }, /*.icon_color = */ ui::Color::orange().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_keyfob */ {'P', 'O', 'O', 'K'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/lcr/main.cpp b/firmware/application/external/lcr/main.cpp index aa748af7..1d2b86e6 100644 --- a/firmware/application/external/lcr/main.cpp +++ b/firmware/application/external/lcr/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_lcr.application_information"), used)) }, /*.icon_color = */ ui::Color::yellow().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_afsk */ {'P', 'A', 'F', 'T'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/lge/main.cpp b/firmware/application/external/lge/main.cpp index e09564e8..d2794a0f 100644 --- a/firmware/application/external/lge/main.cpp +++ b/firmware/application/external/lge/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_lge.application_information"), used)) }, /*.icon_color = */ ui::Color::yellow().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_fsktx */ {'P', 'F', 'S', 'K'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/mcu_temperature/main.cpp b/firmware/application/external/mcu_temperature/main.cpp new file mode 100644 index 00000000..64b1ba13 --- /dev/null +++ b/firmware/application/external/mcu_temperature/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 Bernd Herzog + * + * 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 "ui.hpp" +#include "mcu_temperature.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::mcu_temperature { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::mcu_temperature + +extern "C" { + +__attribute__((section(".external_app.app_mcu_temperature.application_information"), used)) application_information_t _application_information_mcu_temperature = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::mcu_temperature::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "Temperature", + /*.bitmap_data = */ { + 0x00, + 0x00, + 0x20, + 0x00, + 0x70, + 0x3E, + 0x88, + 0x00, + 0x88, + 0x00, + 0x88, + 0x3E, + 0x88, + 0x00, + 0x88, + 0x00, + 0x88, + 0x3E, + 0x88, + 0x00, + 0x04, + 0x01, + 0x74, + 0x01, + 0x04, + 0x01, + 0x88, + 0x00, + 0x70, + 0x00, + 0x00, + 0x00, + }, + /*.icon_color = */ ui::Color::cyan().v, + /*.menu_location = */ app_location_t::DEBUG, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_none */ {0, 0, 0, 0}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} \ No newline at end of file diff --git a/firmware/application/external/mcu_temperature/mcu_temperature.cpp b/firmware/application/external/mcu_temperature/mcu_temperature.cpp new file mode 100644 index 00000000..aee90308 --- /dev/null +++ b/firmware/application/external/mcu_temperature/mcu_temperature.cpp @@ -0,0 +1,91 @@ +#include "mcu_temperature.hpp" + +#include "ui_painter.hpp" + +#include "portapack.hpp" + +using namespace portapack; +namespace ui::external_app::mcu_temperature { + +void McuTemperatureWidget::paint(Painter& painter) { + const auto logger = portapack::temperature_logger; + + const auto rect = screen_rect(); + const Color color_background{0, 0, 64}; + const Color color_foreground = Theme::getInstance()->fg_green->foreground; + const Color color_reticle{128, 128, 128}; + + const auto graph_width = static_cast(logger.capacity()) * bar_width; + const Rect graph_rect{ + rect.left() + (rect.width() - graph_width) / 2, rect.top() + 8, + graph_width, rect.height()}; + const Rect frame_rect{ + graph_rect.left() - 1, graph_rect.top() - 1, + graph_rect.width() + 2, graph_rect.height() + 2}; + painter.draw_rectangle(frame_rect, color_reticle); + painter.fill_rectangle(graph_rect, color_background); + + const auto history = logger.history(); + for (size_t i = 0; i < history.size(); i++) { + const Coord x = graph_rect.right() - (history.size() - i) * bar_width; + const auto sample = history[i]; + const auto temp = temperature(sample); + const auto y = screen_y(temp, graph_rect); + const Dim bar_height = graph_rect.bottom() - y; + painter.fill_rectangle({x, y, bar_width, bar_height}, color_foreground); + } + + if (!history.empty()) { + const auto sample = history.back(); + const auto temp = temperature(sample); + const auto last_y = screen_y(temp, graph_rect); + const Coord x = graph_rect.right() + 8; + const Coord y = last_y - 8; + + painter.draw_string({x, y}, style(), temperature_str(temp)); + } + + const auto display_temp_max = display_temp_min + (graph_rect.height() / display_temp_scale); + for (auto temp = display_temp_min; temp <= display_temp_max; temp += 10) { + const int32_t tick_length = 6; + const auto tick_x = graph_rect.left() - tick_length; + const auto tick_y = screen_y(temp, graph_rect); + painter.fill_rectangle({tick_x, tick_y, tick_length, 1}, color_reticle); + const auto text_x = graph_rect.left() - temp_len * 8 - 8; + const auto text_y = tick_y - 8; + painter.draw_string({text_x, text_y}, style(), temperature_str(temp)); + } +} + +McuTemperatureWidget::temperature_t McuTemperatureWidget::temperature(const sample_t sensor_value) const { + // Scaling is different for MAX2837 vs MAX2839 so it's now done in the respective chip-specific module + return sensor_value; +} + +std::string McuTemperatureWidget::temperature_str(const temperature_t temperature) const { + return to_string_dec_int(temperature, temp_len - 2) + STR_DEGREES_C; +} + +Coord McuTemperatureWidget::screen_y( + const temperature_t temperature, + const Rect& rect) const { + int y_raw = rect.bottom() - ((temperature - display_temp_min) * display_temp_scale); + const auto y_limit = std::min(rect.bottom(), std::max(rect.top(), y_raw)); + return y_limit; +} + +McuTemperatureView::McuTemperatureView(NavigationView& nav) { + add_children({ + &text_title, + &temperature_widget, + &button_done, + }); + + button_done.on_select = [&nav](Button&) { nav.pop(); }; +} + +void McuTemperatureView::focus() { + button_done.focus(); +} + +} // namespace ui::external_app::mcu_temperature \ No newline at end of file diff --git a/firmware/application/external/mcu_temperature/mcu_temperature.hpp b/firmware/application/external/mcu_temperature/mcu_temperature.hpp new file mode 100644 index 00000000..a8cbb617 --- /dev/null +++ b/firmware/application/external/mcu_temperature/mcu_temperature.hpp @@ -0,0 +1,90 @@ +/* + * 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. + */ + +#ifndef __MCU_TEMPERATURE_H__ +#define __MCU_TEMPERATURE_H__ + +#include "ui.hpp" +#include "ui_widget.hpp" +#include "ui_painter.hpp" +#include "ui_menu.hpp" +#include "ui_navigation.hpp" + +#include "rffc507x.hpp" +#include "portapack.hpp" +#include "memory_map.hpp" +#include "irq_controls.hpp" + +#include +#include + +namespace ui::external_app::mcu_temperature { + +class McuTemperatureWidget : public Widget { + public: + explicit McuTemperatureWidget( + Rect parent_rect) + : Widget{parent_rect} { + } + + void paint(Painter& painter) override; + + private: + using sample_t = uint32_t; + using temperature_t = int32_t; + + temperature_t temperature(const sample_t sensor_value) const; + Coord screen_y(const temperature_t temperature, const Rect& screen_rect) const; + + std::string temperature_str(const temperature_t temperature) const; + + static constexpr temperature_t display_temp_min = -10; // Accomodate negative values, present in cold startup cases + static constexpr temperature_t display_temp_scale = 3; + static constexpr int bar_width = 1; + static constexpr int temp_len = 5; // Now scale shows up to 5 chars ("-10ºC") +}; + +class McuTemperatureView : public View { + public: + explicit McuTemperatureView(NavigationView& nav); + + void focus() override; + + std::string title() const override { return "Temperature"; }; + + private: + Text text_title{ + {76, 16, 240, 16}, + "Temperature", + }; + + McuTemperatureWidget temperature_widget{ + {0, 40, 240, 180}, + }; + + Button button_done{ + {72, 264, 96, 24}, + "Done"}; +}; + +} // namespace ui::external_app::mcu_temperature + +#endif /*__MCU_TEMPERATURE_H__*/ diff --git a/firmware/application/external/metronome/main.cpp b/firmware/application/external/metronome/main.cpp new file mode 100644 index 00000000..620e8962 --- /dev/null +++ b/firmware/application/external/metronome/main.cpp @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2024 Bernd + * + * 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 "ui.hpp" +#include "ui_metronome.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::metronome { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::metronome + +extern "C" { + +__attribute__((section(".external_app.app_metronome.application_information"), used)) application_information_t _application_information_metronome = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::metronome::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "Metronome", + /*.bitmap_data = */ { + 0x00, + 0x00, + 0xC0, + 0x43, + 0x20, + 0x66, + 0xA0, + 0x34, + 0x20, + 0x18, + 0xB0, + 0x0C, + 0x10, + 0x04, + 0x10, + 0x06, + 0x10, + 0x0B, + 0x98, + 0x19, + 0x08, + 0x10, + 0xF8, + 0x1F, + 0xF8, + 0x1F, + 0xF8, + 0x1F, + 0xF0, + 0x0F, + 0x00, + 0x00, + + }, + /*.icon_color = */ ui::Color::cyan().v, + /*.menu_location = */ app_location_t::UTILITIES, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_none */ {'P', 'A', 'B', 'P'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} \ No newline at end of file diff --git a/firmware/application/external/metronome/ui_metronome.cpp b/firmware/application/external/metronome/ui_metronome.cpp new file mode 100644 index 00000000..75dca3b3 --- /dev/null +++ b/firmware/application/external/metronome/ui_metronome.cpp @@ -0,0 +1,177 @@ +/* + * copyleft 2024 sommermorgentraum + * + * 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 "ui_metronome.hpp" +#include "baseband_api.hpp" +#include "audio.hpp" +#include "portapack.hpp" + +using namespace portapack; + +namespace ui::external_app::metronome { + +MetronomeView::MetronomeView(NavigationView& nav) + : nav_{nav} { + baseband::run_prepared_image(portapack::memory::map::m4_code.base()); // proc_audio_beep baseband is external too + + add_children({ + &labels, + &field_volume, + &button_play_stop, + &field_rythm_unaccent_time, + &field_rythm_accent_time, + &field_accent_beep_tune, + &field_unaccent_beep_tune, + &field_beep_flash_duration, + &field_bpm, + &progressbar, + }); + + field_bpm.set_value(120); + field_rythm_accent_time.set_value(4); + field_rythm_unaccent_time.set_value(4); + field_accent_beep_tune.set_value(880); + field_unaccent_beep_tune.set_value(440); + field_beep_flash_duration.set_value(100); + button_play_stop.on_select = [this]() { + if (playing_) { + stop_play(); + } else { + play(); + } + }; + + field_volume.set_value(0); // seems that a change is required to force update, so setting to 0 first + field_volume.set_value(99); + + audio::set_rate(audio::Rate::Hz_48000); + + audio::output::start(); +} + +MetronomeView::~MetronomeView() { + should_exit = true; + if (thread) { + chThdWait(thread); + thread = nullptr; + } + receiver_model.disable(); + baseband::shutdown(); + audio::output::stop(); +} + +void MetronomeView::focus() { + field_bpm.focus(); +} + +void MetronomeView::stop_play() { + if (playing_) { + playing_ = false; + button_play_stop.set_bitmap(&bitmap_icon_replay); + baseband::request_beep_stop(); + progressbar.set_value(0); + progressbar.set_style(Theme::getInstance()->fg_light); + } +} + +void MetronomeView::play() { + if (!playing_) { + playing_ = true; + current_beat_ = 0; + button_play_stop.set_bitmap(&bitmap_icon_sleep); + + if (!thread) { + thread = chThdCreateFromHeap(NULL, 1024, NORMALPRIO + 10, MetronomeView::static_fn, this); + } + } +} + +void MetronomeView::beep_accent_beat() { + baseband::request_audio_beep(field_accent_beep_tune.value(), 48000, field_beep_flash_duration.value()); +} + +void MetronomeView::beep_unaccent_beat() { + baseband::request_audio_beep(field_unaccent_beep_tune.value(), 48000, field_beep_flash_duration.value()); +} + +// TODO: draw the beat +// void MetronomeView::paint(Painter& painter) { +// View::paint(painter); + +// painter.fill_rectangle( +// {visual_x, visual_y, visual_width, visual_height}, +// Theme::getInstance()->bg_darkest->background); + +// if (playing_) { +// const bool is_accent_beat = (current_beat_ % field_rythm_accent_time.value()) == 0; + +// const Color beat_color = is_accent_beat ? +// Theme::getInstance()->fg_red->foreground : +// Theme::getInstance()->fg_green->foreground; + +// painter.fill_rectangle( +// {visual_x + visual_width/4, +// visual_y + visual_height/4, +// visual_width/2, +// visual_height/2}, +// beat_color); +// } +// } + +msg_t MetronomeView::static_fn(void* arg) { + auto obj = static_cast(arg); + obj->run(); + return 0; +} + +void MetronomeView::run() { + while (!should_exit) { + if (!playing_) { + chThdSleepMilliseconds(100); + continue; + } + + uint32_t base_interval = (60 * 1000) / field_bpm.value(); // quarter note as 1 beat + + uint32_t beats_per_measure = field_rythm_unaccent_time.value(); // how many beates per bar + progressbar.set_max(beats_per_measure); + uint32_t beat_unit = field_rythm_accent_time.value(); // which note type (quarter, eighth, etc.) as 1 beat + + uint32_t actual_interval = (base_interval * 4) / beat_unit; // e.g. when beat_unit==8 it's 1/2 of base_interval AKA eighths notes + + uint32_t beat_in_measure = current_beat_ % beats_per_measure; // current beat in this bar (need to decide accent or unaccent) + progressbar.set_value(beat_in_measure + 1); + + // accent beat is the first beat of this bar + if (beat_in_measure == 0) { + beep_accent_beat(); + progressbar.set_style(Theme::getInstance()->fg_red); + } else { + beep_unaccent_beat(); + progressbar.set_style(Theme::getInstance()->fg_green); + } + + current_beat_++; + chThdSleepMilliseconds(actual_interval); + } +} + +} // namespace ui::external_app::metronome \ No newline at end of file diff --git a/firmware/application/external/metronome/ui_metronome.hpp b/firmware/application/external/metronome/ui_metronome.hpp new file mode 100644 index 00000000..d813146d --- /dev/null +++ b/firmware/application/external/metronome/ui_metronome.hpp @@ -0,0 +1,126 @@ +/* + * copyleft 2024 sommermorgentraum + * + * 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 __UI_METRONOME_H__ +#define __UI_METRONOME_H__ + +#include "ui_navigation.hpp" +#include "ui_receiver.hpp" +#include "audio.hpp" +#include "ch.h" + +namespace ui::external_app::metronome { + +class MetronomeView : public View { + public: + MetronomeView(NavigationView& nav); + ~MetronomeView(); + MetronomeView(const MetronomeView& other) = delete; + MetronomeView& operator=(const MetronomeView& other) = delete; + + void focus() override; + + std::string title() const override { return "Metronome"; }; + + private: + NavigationView& nav_; + + void beep_accent_beat(); // e.g. 3 of 3/4 beat + void beep_unaccent_beat(); // e.g. 4 of 3/4 beat + void stop_play(); + void play(); + // void paint(Painter& painter) override; + + Thread* thread{nullptr}; + bool should_exit{false}; + static msg_t static_fn(void* arg); + void run(); + + bool playing_{false}; + uint32_t current_beat_{0}; + + Labels labels{ + {{0 * 8, 1 * 16}, "BPM:", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 2 * 16}, "Accent Beep Tune:", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 3 * 16}, "Unaccent Beep Tune:", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 4 * 16}, "Rhythm:", Theme::getInstance()->fg_light->foreground}, + {{(sizeof("Rhythm:") + 1) * 8 + 4 * 8, 4 * 16}, "/", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 5 * 16}, "Beep Flash Duration:", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 6 * 16}, "Volume:", Theme::getInstance()->fg_light->foreground}}; + + NumberField field_bpm{ + {(sizeof("BPM:") + 1) * 8, 1 * 16}, + 4, + {1, 1000}, + 1, + ' '}; + + NumberField field_rythm_unaccent_time{// e.g. 3 in 3/4 beat + {(sizeof("Rhythm:") + 1) * 8, 4 * 16}, + 2, + {1, 99}, + 1, + ' '}; + + NumberField field_rythm_accent_time{// e.g. 4 in 3/4 beat + {(sizeof("Rhythm:") + 1) * 8 + 5 * 8, 4 * 16}, + 2, + {1, 99}, + 1, + ' '}; + + NumberField field_beep_flash_duration{ + {(sizeof("Beep Flash Duration:") + 1) * 8, 5 * 16}, + 3, + {10, 999}, + 1, + ' '}; + + NumberField field_accent_beep_tune{ + {(sizeof("Accent Beep Tune:") + 1) * 8, 2 * 16}, + 5, + {380, 24000}, + 20, + ' '}; + + NumberField field_unaccent_beep_tune{ + {(sizeof("Unaccent Beep Tune:") + 1) * 8, 3 * 16}, + 5, + {380, 24000}, + 20, + ' '}; + + AudioVolumeField field_volume{ + {(sizeof("Volume:") + 1) * 8, 6 * 16}}; + + NewButton button_play_stop{ + {0 * 16, 16 * 16, screen_width, screen_height - 16 * 16}, + {}, + &bitmap_icon_replay, + Theme::getInstance()->fg_red->foreground}; + + ProgressBar progressbar{ + {0 * 16, 8 * 16, screen_width, screen_height - 14 * 16}}; +}; + +} // namespace ui::external_app::metronome + +#endif /*__UI_METRONOME_H__*/ \ No newline at end of file diff --git a/firmware/application/external/morse_tx/main.cpp b/firmware/application/external/morse_tx/main.cpp index a1d499a1..b591599f 100644 --- a/firmware/application/external/morse_tx/main.cpp +++ b/firmware/application/external/morse_tx/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_morse_tx.application_information"), us }, /*.icon_color = */ ui::Color::green().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_tones */ {'P', 'T', 'O', 'N'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/morse_tx/ui_morse.cpp b/firmware/application/external/morse_tx/ui_morse.cpp index 99af99bd..e6421ab0 100644 --- a/firmware/application/external/morse_tx/ui_morse.cpp +++ b/firmware/application/external/morse_tx/ui_morse.cpp @@ -232,9 +232,8 @@ MorseView::MorseView( set_foxhunt(foxhunt_code); }; - options_modulation.on_change = [this](size_t i, int32_t value) { - (void)i; // avoid unused warning - mode_cw = (bool)value; + options_modulation.on_change = [this](size_t, OptionsField::value_t v) { + mode_cw = (bool)v; }; options_loop.on_change = [this](size_t i, uint32_t value) { diff --git a/firmware/application/external/morse_tx/ui_morse.hpp b/firmware/application/external/morse_tx/ui_morse.hpp index d3783af0..57da2cad 100644 --- a/firmware/application/external/morse_tx/ui_morse.hpp +++ b/firmware/application/external/morse_tx/ui_morse.hpp @@ -41,6 +41,11 @@ using namespace morse; namespace ui::external_app::morse_tx { +enum Modulation { + FM = 0, + CW = 1 +}; + class MorseView : public View { public: MorseView(NavigationView& nav); @@ -137,8 +142,8 @@ class MorseView : public View { OptionsField options_modulation{ {15 * 8, 10 * 8}, 2, - {{"CW", true}, - {"FM", false}}}; + {{"CW", Modulation::CW}, + {"FM", Modulation::FM}}}; OptionsField options_loop{ {9 * 8, 12 * 8}, diff --git a/firmware/application/external/nrf_rx/main.cpp b/firmware/application/external/nrf_rx/main.cpp index 3a3f1369..f7a4912b 100644 --- a/firmware/application/external/nrf_rx/main.cpp +++ b/firmware/application/external/nrf_rx/main.cpp @@ -76,6 +76,7 @@ __attribute__((section(".external_app.app_nrf_rx.application_information"), used }, /*.icon_color = */ ui::Color::yellow().v, /*.menu_location = */ app_location_t::RX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_nrf_rx */ {'P', 'N', 'R', 'R'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/ook_editor/main.cpp b/firmware/application/external/ook_editor/main.cpp new file mode 100644 index 00000000..39692a4a --- /dev/null +++ b/firmware/application/external/ook_editor/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 Samir Sánchez Garnica @sasaga92 + * + * 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 "ui.hpp" +#include "ui_ook_editor.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::ook_editor { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::ook_editor + +extern "C" { + +__attribute__((section(".external_app.app_ook_editor.application_information"), used)) application_information_t _application_information_ook_editor = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::ook_editor::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "OOKEditor", + /*.bitmap_data = */ { + 0x20, + 0x00, + 0x20, + 0x00, + 0x20, + 0x00, + 0x20, + 0x00, + 0xE0, + 0x07, + 0xF0, + 0x0F, + 0x30, + 0x0C, + 0x30, + 0x0C, + 0xF0, + 0x0F, + 0xF0, + 0x0F, + 0x70, + 0x0D, + 0xB0, + 0x0E, + 0x70, + 0x0D, + 0xB0, + 0x0E, + 0xF0, + 0x0F, + 0xE0, + 0x07, + }, + /*.icon_color = */ ui::Color::orange().v, + /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_ook */ {'P', 'O', 'O', 'K'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} diff --git a/firmware/application/external/ook_editor/ui_ook_editor.cpp b/firmware/application/external/ook_editor/ui_ook_editor.cpp new file mode 100644 index 00000000..a4e53ccc --- /dev/null +++ b/firmware/application/external/ook_editor/ui_ook_editor.cpp @@ -0,0 +1,283 @@ +/* + * Copyright (C) 2024 Samir Sánchez Garnica @sasaga92 + * + * 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 "ui_ook_editor.hpp" + +using namespace portapack; +using namespace ui; + +namespace fs = std::filesystem; + +namespace ui::external_app::ook_editor { + +// give focus to set button +void OOKEditorAppView::focus() { + button_set.focus(); +} + +// update internal ook_data with GUI values +void OOKEditorAppView::update_ook_data_from_app() { + ook_data.frequency = field_frequency.value(); + ook_data.sample_rate = field_sample_rate.selected_index_value(); + ook_data.symbol_rate = field_symbol_rate.value(); + ook_data.repeat = field_repeat.value(); + ook_data.pause_symbol_duration = field_pause_symbol_duration.value(); +} + +// `start_tx` method: Configures and begins OOK data transmission with a specific message. +void OOKEditorAppView::start_tx() { + // check if there is a payload + if (ook_data.payload.length() < 1) { + text_app_status.set("Error: no payload to tx !!"); + return; + } + progressbar.set_max(field_repeat.value()); // Size the progress bar accordingly to the number of repeat + is_transmitting = true; // set transmitting flag + button_send_stop.set_text(LanguageHelper::currentMessages[LANG_STOP]); // set button back to initial "start" state + start_ook_file_tx(ook_data); // start the transmission +} + +// `stop_tx` method: Stops the transmission and resets the progress bar. +void OOKEditorAppView::stop_tx() { + // TODO: model stopped but message still spamming. + is_transmitting = false; // set transmitting flag + stop_ook_file_tx(); // stop transmission + progressbar.set_value(0); // Reset progress bar to 0 + button_send_stop.set_text(LanguageHelper::currentMessages[LANG_START]); // set button back to initial "start" state +} + +// `on_file_changed` method: Called when a new file is loaded; parses file data into variables +void OOKEditorAppView::on_file_changed(const fs::path& new_file_path) { + ook_data.payload.clear(); // Clear previous payload content + if (!read_ook_file(new_file_path, ook_data)) { + text_app_status.set("Error loading " + new_file_path.filename().string()); + return; + } + field_frequency.set_value(ook_data.frequency); + field_symbol_rate.set_value(ook_data.symbol_rate); + field_repeat.set_value(ook_data.repeat); + field_pause_symbol_duration.set_value(ook_data.pause_symbol_duration); + field_sample_rate.set_by_value(ook_data.sample_rate); + text_payload.set(ook_data.payload); + button_send_stop.focus(); + text_app_status.set("Loaded: " + new_file_path.filename().string()); +} + +// `on_tx_progress` method: Updates the progress bar based on transmission progress. +void OOKEditorAppView::on_tx_progress(const uint32_t progress, const bool done) { + if (is_transmitting) progressbar.set_value(progress); // Update progress bar value + if (done) { + stop_tx(); // Stop transmission when progress reaches maximum + } +} + +// `draw_waveform` method: Draws the waveform on the UI based on the payload data +void OOKEditorAppView::draw_waveform() { + // Padding reason: + // In real-world scenarios, the signal would always start low and return low after turning off the radio. + // `waveform_buffer` only controls drawing; the actual send logic is handled by frame_fragments. + size_t length = ook_data.payload.length(); + + // Ensure waveform length does not exceed buffer size + if (length + (PADDING_LEFT + PADDING_RIGHT) >= WAVEFORM_BUFFER_SIZE) { + length = WAVEFORM_BUFFER_SIZE - (PADDING_LEFT + PADDING_RIGHT); + } + + // Left padding + for (size_t i = 0; i < PADDING_LEFT; i++) { + waveform_buffer[i] = 0; + } + + // Draw the actual waveform + for (size_t n = 0; n < length; n++) { + waveform_buffer[n + PADDING_LEFT] = (ook_data.payload[n] == '0') ? 0 : 1; + } + + // Right padding + for (size_t i = length + PADDING_LEFT; i < WAVEFORM_BUFFER_SIZE; i++) { + waveform_buffer[i] = 0; + } + + waveform.set_length(length + PADDING_LEFT + PADDING_RIGHT); + waveform.set_dirty(); +} + +// build a new path+file, make some tests, call save_ook_to_file +void OOKEditorAppView::on_save_file(const std::string value) { + // check if there is a payload, else Error + if (ook_data.payload.length() < 1) { + text_app_status.set("Err: can't save, no payload !"); + return; + } + ensure_directory(ook_editor_dir); + auto new_path = ook_editor_dir / value + ".OOK"; + if (save_ook_to_file(new_path)) { + text_app_status.set("Saved to " + new_path.string()); + } else { + text_app_status.set("Error saving " + new_path.string()); + } +} + +// update ook_data from GUI and save +bool OOKEditorAppView::save_ook_to_file(const std::filesystem::path& path) { + update_ook_data_from_app(); + return save_ook_file(ook_data, path); +} + +// Destructor for `OOKEditorAppView`: Disables the transmitter and shuts down the baseband +OOKEditorAppView::~OOKEditorAppView() { + stop_ook_file_tx(); + baseband::shutdown(); +} + +// Constructor for `OOKEditorAppView`: Sets up the app view and initializes UI elements +OOKEditorAppView::OOKEditorAppView(NavigationView& nav) + : nav_{nav} { + // load OOK baseband + baseband::run_image(portapack::spi_flash::image_tag_ook); + + // add all the widgets + add_children({&field_frequency, + &tx_view, + &button_send_stop, + &label_step, + &field_step, + &label_sample_rate, + &field_sample_rate, + &label_symbol_rate, + &field_symbol_rate, + &label_symbol_rate_unit, + &text_payload, + &button_set, + &progressbar, + &label_repeat, + &field_repeat, + &label_pause_symbol_duration, + &field_pause_symbol_duration, + &label_pause_symbol_duration_unit, + &label_payload, + &text_app_status, + &label_waveform, + &waveform, + &button_open, + &button_save}); + + // Initialize default values for controls + field_symbol_rate.set_value(100); + field_pause_symbol_duration.set_value(100); + field_repeat.set_value(4); + + // Configure open ook file button + button_open.on_select = [this](Button&) { + auto open_view = nav_.push(".OOK"); + ensure_directory(ook_editor_dir); + open_view->push_dir(ook_editor_dir); + open_view->on_changed = [this](std::filesystem::path new_file_path) { + // Postpone `on_file_changed` call until `FileLoadView` is closed + nav_.set_on_pop([this, new_file_path]() { + on_file_changed(new_file_path); + button_send_stop.focus(); + draw_waveform(); + }); + }; + }; + + // Configure save to ook file button + button_save.on_select = [this, &nav](const ui::Button&) { + outputFileBuffer = ""; + text_prompt( + nav, + outputFileBuffer, + 64, + [this](std::string& buffer) { + on_save_file(buffer); + }); + }; + + // clean out loaded file name if field is changed + field_symbol_rate.on_change = [this](int32_t) { + text_app_status.set(""); // Clear loaded file text field + }; + // clean out loaded file name if field is changed + field_repeat.on_change = [this](int32_t) { + text_app_status.set(""); // Clear loaded file text field + }; + // clean out loaded file name if field is changed + field_pause_symbol_duration.on_change = [this](int32_t) { + text_app_status.set(""); // Clear loaded file text field + }; + // clean out loaded file name if field is changed + field_sample_rate.on_change = [this](size_t, int32_t) { + text_app_status.set(""); // Clear loaded file text field + }; + + // setting up FrequencyField + field_frequency.set_value(ook_editor_tx_freq); + + // clean out loaded file name if field is changed, save ook_editor_tx_freq + field_frequency.on_change = [this](rf::Frequency f) { + ook_editor_tx_freq = f; + text_app_status.set(""); // Clear loaded file text field + }; + + // allow typing frequency number + field_frequency.on_edit = [this]() { + auto freq_view = nav_.push(field_frequency.value()); + freq_view->on_changed = [this](rf::Frequency f) { + field_frequency.set_value(f); + text_app_status.set(""); // Clear loaded file text field + }; + }; + + // allow different steps on symbol_rate and pause_symbol_duration + field_step.on_change = [this](size_t, int32_t value) { + text_app_status.set(""); // Clear loaded file text field + field_symbol_rate.set_step(value); + field_pause_symbol_duration.set_step(value); + }; + + // Configure button to manually set payload through text input + button_set.on_select = [this, &nav](Button&) { + text_prompt( + nav, + ook_data.payload, + 100, + [this](std::string& s) { + text_payload.set(s); + draw_waveform(); + text_app_status.set(""); // Clear loaded file text field + }); + }; + + // Configure button to start or stop the transmission + button_send_stop.on_select = [this](Button&) { + if (!is_transmitting) { + update_ook_data_from_app(); + start_tx(); // Begin transmission + } else { + stop_tx(); + } + }; + + // initial waveform drawing (should be a single line) + draw_waveform(); +} +} // namespace ui::external_app::ook_editor diff --git a/firmware/application/external/ook_editor/ui_ook_editor.hpp b/firmware/application/external/ook_editor/ui_ook_editor.hpp new file mode 100644 index 00000000..34376334 --- /dev/null +++ b/firmware/application/external/ook_editor/ui_ook_editor.hpp @@ -0,0 +1,137 @@ +/* + * Copyright (C) 2024 Samir Sánchez Garnica @sasaga92 + * + * This file is part of PortaPack. + * + */ + +#ifndef __UI_OOK_EDITOR_H__ +#define __UI_OOK_EDITOR_H__ + +#include "ui.hpp" +#include "ui_language.hpp" +#include "ui_freq_field.hpp" +#include "ui_textentry.hpp" +#include "ui_fileman.hpp" +#include "ui_transmitter.hpp" +#include "radio_state.hpp" +#include "app_settings.hpp" +#include "file_path.hpp" +#include "ook_file.hpp" + +using namespace ui; + +namespace ui::external_app::ook_editor { + +#define PADDING_LEFT 1 // waveform padding +#define PADDING_RIGHT 1 // waveform padding +#define OOK_SAMPLERATE_DEFAULT 2280000U // Set the default Sample Rate +#define TRANSMISSION_FREQUENCY_DEFAULT 433920000U // Sets the default transmission frequency (27 MHz). +#define WAVEFORM_BUFFER_SIZE 550 + +class OOKEditorAppView : public View { + public: + void focus() override; + OOKEditorAppView(NavigationView& nav); + + ~OOKEditorAppView(); + + std::string title() const override { + return "OOKEditor"; + }; + + private: + NavigationView& nav_; // Reference to the navigation system. + uint32_t progress = 0; // Stores the current transmission progress. + int16_t waveform_buffer[WAVEFORM_BUFFER_SIZE]; // Buffer for waveform data. + bool is_transmitting = false; // State of transmission. + rf::Frequency ook_editor_tx_freq{24000000}; // last used transmit frequency + std::string outputFileBuffer{}; // buffer for output file + ook_file_data ook_data = {0, 0, 0, 0, 0, ""}; // ook files handle + + // draw current payload waveform + void draw_waveform(); + + // update ook_data from GUI selection + void update_ook_data_from_app(); + + // start transmission + void start_tx(); + // stop transmission + void stop_tx(); + + // Updates the transmission progress on the progress bar. + void on_tx_progress(const uint32_t progress, const bool done); + + // Updates data when a new file is loaded. + void on_file_changed(const std::filesystem::path& new_file_path); + + // Prepare a new std::filesystem::path from string value and call saveFile + void on_save_file(const std::string value); + + // Called by on_save_file to save the current OOK parameters to the file + bool save_ook_to_file(const std::filesystem::path& path); + + // Registers a message handler for transmission progress updates. + MessageHandlerRegistration message_handler_tx_progress{ + Message::ID::TXProgress, // Transmission progress message ID. + [this](const Message* const p) { // Callback to handle the message. + const auto message = *reinterpret_cast(p); + this->on_tx_progress(message.progress, message.done); + }}; + + // Sets transmission frequency, bandwidth, and default sample rate for OOK. + TxRadioState radio_state_{TRANSMISSION_FREQUENCY_DEFAULT, 1750000, OOK_SAMPLERATE_DEFAULT}; + + // Settings manager for app configuration. + app_settings::SettingsManager settings_{ + "ook_editor", + app_settings::Mode::TX, + {{"ook_editor_tx_freq"sv, &ook_editor_tx_freq}}}; + + // UI components for frequency and transmitter view. + FrequencyField field_frequency{{0 * 8, 0 * 16}}; + TransmitterView2 tx_view{{20 * 7, 0 * 16}, true}; + + // Labels for various fields such as sample rate and repeat count. + Labels label_step{{{170, 20}, "Step:", Theme::getInstance()->fg_light->foreground}}; + Labels label_sample_rate{{{0, 20}, "SampleRate:", Theme::getInstance()->fg_light->foreground}}; + Labels label_symbol_rate{{{0, 40}, "SymbolRate:", Theme::getInstance()->fg_light->foreground}}; + Labels label_symbol_rate_unit{{{132, 40}, "/s", Theme::getInstance()->fg_light->foreground}}; + Labels label_repeat{{{154, 40}, "Repeat:", Theme::getInstance()->fg_light->foreground}}; + Labels label_pause_symbol_duration{{{0, 60}, "PauseSymbol:", Theme::getInstance()->fg_light->foreground}}; + Labels label_pause_symbol_duration_unit{{{132, 60}, "us", Theme::getInstance()->fg_light->foreground}}; + Labels label_payload{{{0, 80}, "Payload:", Theme::getInstance()->fg_light->foreground}}; + Labels label_waveform{{{0, 188}, "Waveform:", Theme::getInstance()->fg_light->foreground}}; + + // Text field to display the various status message of the app + Text text_app_status{{0, 160, 30 * 8, 16}, ""}; + + // OptionsField for selectable sample rates. + OptionsField field_sample_rate{{96, 20}, 7, {{"250k", 250000U}, {"1M", 1000000U}, {"2M", 2000000U}, {"5M", 5000000U}, {"10M", 10000000U}, {"20M", 20000000U}}}; + // OptionsField for step symbol rates. + OptionsField field_step{{210, 20}, 7, {{"1", 1}, {"10", 10}, {"100", 100}}}; + // Number fields for symbols, pause_symbol between repeat, and repeat count. + NumberField field_symbol_rate{{96, 40}, 4, {0, 9999}, 1, '0', false}; + NumberField field_pause_symbol_duration{{96, 60}, 4, {0, 9999}, 1, '0', false}; + NumberField field_repeat{{210, 40}, 3, {1, 999}, 1, '0', false}; + + // Text field to display the payload data. + Text text_payload{{0 * 8, 100, 30 * 8, 16}, ""}; + + // Buttons for setting configurations, opening files, and starting transmission. + Button button_set{{0, 125, 60, 28}, LanguageHelper::currentMessages[LANG_SET]}; + Button button_open{{68, 125, 80, 28}, LanguageHelper::currentMessages[LANG_OPEN_FILE]}; + Button button_save{{154, 125, 80, 28}, LanguageHelper::currentMessages[LANG_SAVE_FILE]}; + Button button_send_stop{{80, 273, 80, 32}, LanguageHelper::currentMessages[LANG_SEND]}; + + // Progress bar to display transmission progress. + ProgressBar progressbar{{2 * 8, 250, 208, 16}}; + + // Waveform display using waveform buffer and yellow theme color. + Waveform waveform{{0, 208, 240, 32}, waveform_buffer, 0, 0, true, Theme::getInstance()->fg_yellow->foreground}; +}; + +}; // namespace ui::external_app::ook_editor + +#endif /*__UI_OOK_EDITOR_H__*/ diff --git a/firmware/application/external/ookbrute/main.cpp b/firmware/application/external/ookbrute/main.cpp new file mode 100644 index 00000000..e323fda2 --- /dev/null +++ b/firmware/application/external/ookbrute/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2023 Bernd Herzog + * + * 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 "ui.hpp" +#include "ui_ookbrute.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::ookbrute { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::ookbrute + +extern "C" { + +__attribute__((section(".external_app.app_ookbrute.application_information"), used)) application_information_t _application_information_ookbrute = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::ookbrute::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "OOKBrute", + /*.bitmap_data = */ { + 0x20, + 0x00, + 0x20, + 0x00, + 0x20, + 0x00, + 0x20, + 0x00, + 0xE0, + 0x07, + 0xF0, + 0x0F, + 0x30, + 0x0C, + 0x30, + 0x0C, + 0xF0, + 0x0F, + 0xF0, + 0x0F, + 0x70, + 0x0D, + 0xB0, + 0x0E, + 0x70, + 0x0D, + 0xB0, + 0x0E, + 0xF0, + 0x0F, + 0xE0, + 0x07, + }, + /*.icon_color = */ ui::Color::orange().v, + /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_ook */ {'P', 'O', 'O', 'K'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} diff --git a/firmware/application/external/ookbrute/ui_ookbrute.cpp b/firmware/application/external/ookbrute/ui_ookbrute.cpp new file mode 100644 index 00000000..c997fb6b --- /dev/null +++ b/firmware/application/external/ookbrute/ui_ookbrute.cpp @@ -0,0 +1,253 @@ +/* + * Copyright (C) 2024 HTotoo + * + * 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 "ui_ookbrute.hpp" +#include "audio.hpp" +#include "rtc_time.hpp" +#include "baseband_api.hpp" +#include "string_format.hpp" +#include "portapack_persistent_memory.hpp" + +using namespace portapack; +using namespace ui; + +namespace ui::external_app::ookbrute { + +void OOKBruteView::focus() { + button_startstop.focus(); +} + +OOKBruteView::OOKBruteView(NavigationView& nav) + : nav_{nav} { + add_children({ + &button_startstop, + &field_frequency, + &tx_view, + &options_atkmode, + &field_start, + &field_stop, + }); + + button_startstop.on_select = [this](Button&) { + if (is_running) { + is_running = false; + stop(); + } else { + is_running = true; + start(); + } + }; + + options_atkmode.on_change = [this](size_t, int32_t i) { + update_start_stop(i); + validate_start_stop(); + }; + field_start.on_change = [this](int32_t) { + validate_start_stop(); + }; + field_stop.on_change = [this](int32_t) { + validate_start_stop(); + }; + update_start_stop(0); +} + +void OOKBruteView::update_start_stop(uint32_t proto) { + uint8_t bits = 12; + switch (proto) { + default: + case 0: + case 2: + case 4: + bits = 12; + break; + case 1: + case 3: + case 5: + bits = 24; + break; + } + uint32_t max = (1 << bits) - 1; + field_start.set_range(0, max); + field_stop.set_range(0, max); + field_start.set_value(0); + field_stop.set_value(max); +} + +void OOKBruteView::validate_start_stop() { + if (field_start.value() > field_stop.value()) { + field_start.set_value(field_stop.value()); + } + if (field_stop.value() < field_start.value()) { + field_stop.set_value(field_start.value()); + } +} + +void OOKBruteView::generate_packet() { + uint32_t protocol = options_atkmode.selected_index_value(); + uint8_t byte = 0; + size_t bitstream_length = 0; + uint8_t* bitstream = shared_memory.bb_data.data; // max 512 in size + uint32_t samples_per_bit = 0; // OOK_SAMPLERATE * bit_duration_in_sec + std::string dataFormat = ""; + std::string zero = ""; + std::string one = ""; + uint16_t databits = 0; + uint16_t repeat = 1; + uint16_t pause_sym = 0; + if (protocol == 0) { // came 12 + samples_per_bit = OOK_SAMPLERATE / ((3 * 1000) / 1); + dataFormat = "0000000000000000000000000000000000001CCCCCCCCCCCC0000"; // 36 0 preamble +start bit + data + databits = 12; + zero = "011"; + one = "001"; + repeat = 2; + pause_sym = 0; + } + + if (protocol == 1) { // came24 + samples_per_bit = OOK_SAMPLERATE / ((3 * 1000) / 1); + dataFormat = "0000000000000000000000000000000000001CCCCCCCCCCCCCCCCCCCCCCCC0000"; // 36 0 preamble +start bit + data + databits = 24; + zero = "011"; + one = "001"; + repeat = 2; + pause_sym = 0; + } + if (protocol == 2) { // nice12 + samples_per_bit = OOK_SAMPLERATE * (680.0 / 1000000.0); + dataFormat = "000000000000000000000000000000000000000001CCCCCCCCCCCC0000"; // 36 0 preamble +start bit + data + databits = 12; + zero = "011"; + one = "001"; + repeat = 2; + pause_sym = 0; + } + if (protocol == 3) { // nice24 + samples_per_bit = OOK_SAMPLERATE * (680.0 / 1000000.0); + dataFormat = "000000000000000000000000000000000000000001CCCCCCCCCCCCCCCCCCCCCCCC0000"; // 36 0 preamble +start bit + data + databits = 24; + zero = "011"; + one = "001"; + repeat = 2; + pause_sym = 0; + } + if (protocol == 4) { // holtek_ht12 + samples_per_bit = OOK_SAMPLERATE * (390.0 / 1000000.0); + dataFormat = "0000000000000000000000000000000000001CCCCCCCCCCCC00000000000"; // 36 0 preamble +start bit + data. + databits = 12; + zero = "011"; + one = "001"; + repeat = 2; + pause_sym = 0; + } + if (protocol == 5) { // princeton24 + samples_per_bit = OOK_SAMPLERATE * (450.0 / 1000000.0); // long = 3* + dataFormat = "000000000000000000000000000000000000CCCCCCCCCCCCCCCCCCCCCCCC10000000"; // + databits = 24; + zero = "1000"; + one = "1110"; + repeat = 6; + pause_sym = 0; + } + + std::string fragments = ""; // storage + + uint16_t cdb = 0; // current data bit + for (auto c : dataFormat) { // generate fragments from template + if (c == '0') fragments += '0'; + if (c == '1') fragments += '1'; + if (c == 'C') { + if (counter & (1 << (databits - cdb - 1))) { + fragments += one; + } else { + fragments += zero; + } + cdb++; + } + } + + // create bitstream + for (auto c : fragments) { + byte <<= 1; + if (c != '0') byte |= 1; + if ((bitstream_length & 7) == 7) + bitstream[bitstream_length >> 3] = byte; + bitstream_length++; + } + + // Finish last byte if needed + size_t padding = 8 - (bitstream_length & 7); + if (padding != 8) { + byte <<= padding; + bitstream[(bitstream_length + padding - 1) >> 3] = byte; + padding++; + } + + // send bitstream + baseband::set_ook_data( + bitstream_length, + samples_per_bit, + repeat, + pause_sym, + 0); +} + +void OOKBruteView::stop() { + transmitter_model.disable(); + baseband::shutdown(); + button_startstop.set_text(LanguageHelper::currentMessages[LANG_START]); +} + +void OOKBruteView::start() { + counter = field_start.value(); + baseband::run_prepared_image(portapack::memory::map::m4_code.base()); + transmitter_model.enable(); + button_startstop.set_text(LanguageHelper::currentMessages[LANG_STOP]); + generate_packet(); +} + +void OOKBruteView::on_tx_progress(const bool done) { + if (done) { + if (is_running) { + counter++; + field_start.set_value(counter); + if (counter > (uint32_t)field_stop.value()) { + stop(); + } else { + generate_packet(); + } + } + } +} + +OOKBruteView::~OOKBruteView() { + is_running = false; + stop(); +} + +} // namespace ui::external_app::ookbrute + +/* + +https://web.archive.org/web/20230331125843/https://phreakerclub.com/447 + + +*/ diff --git a/firmware/application/external/ookbrute/ui_ookbrute.hpp b/firmware/application/external/ookbrute/ui_ookbrute.hpp new file mode 100644 index 00000000..d5a4c8d8 --- /dev/null +++ b/firmware/application/external/ookbrute/ui_ookbrute.hpp @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2024 HTotoo + * + * This file is part of PortaPack. + * + */ + +#ifndef __UI_OOKBRUTE_H__ +#define __UI_OOKBRUTE_H__ + +#include "ui.hpp" +#include "ui_language.hpp" +#include "ui_navigation.hpp" +#include "ui_transmitter.hpp" +#include "ui_freq_field.hpp" +#include "ui_record_view.hpp" +#include "app_settings.hpp" +#include "radio_state.hpp" +#include "utility.hpp" + +using namespace ui; + +namespace ui::external_app::ookbrute { + +#define OOK_SAMPLERATE 2280000U + +class OOKBruteView : public View { + public: + OOKBruteView(NavigationView& nav); + ~OOKBruteView(); + + void focus() override; + + std::string title() const override { + return "OOKBrute"; + }; + + private: + NavigationView& nav_; + TxRadioState radio_state_{ + 433920000 /* frequency */, + 1750000 /* bandwidth */, + OOK_SAMPLERATE /* sampling rate */ + }; + + TxFrequencyField field_frequency{ + {0 * 8, 0 * 16}, + nav_}; + TransmitterView2 tx_view{ + {11 * 8, 0 * 16}, + /*short_ui*/ true}; + app_settings::SettingsManager settings_{ + "tx_ookbrute", app_settings::Mode::TX}; + + Button button_startstop{ + {0, 3 * 16, 96, 24}, + LanguageHelper::currentMessages[LANG_START]}; + + NumberField field_start{ + {0 * 8, 1 * 16}, + 8, + {0, 2500}, + 1, + ' ', + true}; + + NumberField field_stop{ + {11 * 8, 1 * 16}, + 9, + {0, 2500}, + 1, + ' ', + true}; + + OptionsField options_atkmode{ + {0 * 8, 2 * 16}, + 12, + {{"Came12", 0}, + {"Came24", 1}, + {"Nice12", 2}, + {"Nice24", 3}, + {"Holtek12", 4}, + {"Princeton24", 5}}}; + + bool is_running{false}; + + uint32_t counter = 0; // for packet change + + void start(); + void stop(); + + void on_tx_progress(const bool done); + void validate_start_stop(); + void update_start_stop(uint32_t proto); + void generate_packet(); + + MessageHandlerRegistration message_handler_tx_progress{ + Message::ID::TXProgress, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + this->on_tx_progress(message.done); + }}; +}; +}; // namespace ui::external_app::ookbrute + +#endif /*__UI_OOKBRUTE_H__*/ diff --git a/firmware/application/external/protoview/main.cpp b/firmware/application/external/protoview/main.cpp index 403bef32..a32b8e1b 100644 --- a/firmware/application/external/protoview/main.cpp +++ b/firmware/application/external/protoview/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_protoview.application_information"), u }, /*.icon_color = */ ui::Color::orange().v, /*.menu_location = */ app_location_t::RX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_protoview */ {'P', 'P', 'V', 'W'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/protoview/ui_protoview.cpp b/firmware/application/external/protoview/ui_protoview.cpp index d4c9cf18..7519dcc5 100644 --- a/firmware/application/external/protoview/ui_protoview.cpp +++ b/firmware/application/external/protoview/ui_protoview.cpp @@ -1,6 +1,5 @@ /* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2017 Furrtek + * Copyright (C) 2024 HTotoo, zxkmm * * This file is part of PortaPack. * @@ -49,10 +48,12 @@ ProtoView::ProtoView(NavigationView& nav) &field_vga, &field_volume, &field_frequency, - &labels, + &label_zoom, + &label_shift, &options_zoom, &number_shift, &button_reset, + &button_pause, &waveform, &waveform2, &waveform3, @@ -72,6 +73,10 @@ ProtoView::ProtoView(NavigationView& nav) button_reset.on_select = [this](Button&) { reset(); }; + button_pause.on_select = [this](Button&) { + set_pause(!paused); + }; + set_pause(false); // need to use this to default hide shift functionality baseband::set_subghzd_config(0, receiver_model.sampling_rate()); audio::set_rate(audio::Rate::Hz_24000); audio::output::start(); @@ -80,6 +85,7 @@ ProtoView::ProtoView(NavigationView& nav) void ProtoView::reset() { cnt = 0; + set_pause(false); number_shift.set_value(0); waveform_shift = 0; for (uint16_t i = 0; i < MAXSIGNALBUFFER; i++) time_buffer[i] = 0; @@ -134,19 +140,20 @@ void ProtoView::draw() { drawcnt = 0; for (uint16_t i = 0; i < MAXDRAWCNT; i++) waveform_buffer[i] = 0; // reset - // add empty data for padding (so you can shift left/nagetive) - for (int32_t i = 0; - i < ((waveform_shift > 0) ? 0 : -waveform_shift) && drawcnt < MAXDRAWCNT; // this is for shift nagetive (left side) - ++i) { - waveform_buffer[drawcnt++] = 0; + // add empty data for padding (so you can shift left/negative) + if (waveform_shift < 0) { + for (int32_t i = 0; (i < -1 * waveform_shift) && drawcnt < MAXDRAWCNT; // this is for shift negative (move to right) + ++i) { + waveform_buffer[drawcnt++] = 0; + } } - - for (uint16_t i = ((waveform_shift < 0) ? -waveform_shift : 0); // this is for shift positive aka right side - i < MAXSIGNALBUFFER && drawcnt < MAXDRAWCNT; // prevent out of ranging + uint16_t skipped = 0; + uint16_t to_skip = ((waveform_shift > 0) ? waveform_shift : 0); // when >0 it'll skip some to move left + for (uint16_t i = 0; + i < MAXSIGNALBUFFER && drawcnt < MAXDRAWCNT; // prevent out of ranging ++i) { - uint16_t buffer_index = (i + waveform_shift + MAXSIGNALBUFFER) % MAXSIGNALBUFFER; - state = time_buffer[buffer_index] >= 0; - int32_t timeabs = state ? time_buffer[buffer_index] : -1 * time_buffer[buffer_index]; + state = time_buffer[i] >= 0; + int32_t timeabs = state ? time_buffer[i] : -1 * time_buffer[i]; int32_t timesize = timeabs / zoom; if (timesize == 0) { remain += timeabs; @@ -164,7 +171,11 @@ void ProtoView::draw() { remain = 0; lmax = 0; for (int32_t ii = 0; ii < timesize && drawcnt < MAXDRAWCNT; ++ii) { - waveform_buffer[drawcnt++] = state; + if (skipped < to_skip) { + skipped++; + } else { + waveform_buffer[drawcnt++] = state; + } } } } @@ -175,6 +186,7 @@ void ProtoView::add_time(int32_t time) { } void ProtoView::on_data(const ProtoViewDataMessage* message) { + if (paused) return; // filter out invalid ones. uint16_t start = 0; uint16_t stop = 0; @@ -207,6 +219,20 @@ void ProtoView::on_freqchg(int64_t freq) { field_frequency.set_value(freq); } +void ProtoView::set_pause(bool pause) { + paused = pause; + if (pause) { + label_shift.hidden(false); + number_shift.hidden(false); + button_pause.set_text(LanguageHelper::currentMessages[LANG_RESUME]); + } else { + label_shift.hidden(true); + number_shift.hidden(true); + button_pause.set_text(LanguageHelper::currentMessages[LANG_PAUSE]); + } + set_dirty(); +} + ProtoView::~ProtoView() { audio::output::stop(); receiver_model.disable(); diff --git a/firmware/application/external/protoview/ui_protoview.hpp b/firmware/application/external/protoview/ui_protoview.hpp index 0af34b1b..b356bcf8 100644 --- a/firmware/application/external/protoview/ui_protoview.hpp +++ b/firmware/application/external/protoview/ui_protoview.hpp @@ -74,8 +74,11 @@ class ProtoView : public View { RxFrequencyField field_frequency{ {0 * 8, 0 * 16}, nav_}; - Labels labels{ - {{0 * 8, 1 * 16}, "Zoom: ", Theme::getInstance()->fg_light->foreground}, + + // need to seperate because label shift need to hide independently + Labels label_zoom{ + {{0 * 8, 1 * 16}, "Zoom: ", Theme::getInstance()->fg_light->foreground}}; + Labels label_shift{ {{0 * 8, 2 * 16}, "Shift: ", Theme::getInstance()->fg_light->foreground}}; OptionsField options_zoom{ @@ -103,6 +106,10 @@ class ProtoView : public View { {screen_width - 12 * 8, 1 * 16, 96, 24}, LanguageHelper::currentMessages[LANG_RESET]}; + Button button_pause{ + {screen_width - 12 * 8, 1 * 16 + 24, 96, 24}, + LanguageHelper::currentMessages[LANG_PAUSE]}; + Waveform waveform{ {0, 8 * 8, 240, 50}, waveform_buffer, @@ -136,6 +143,7 @@ class ProtoView : public View { Theme::getInstance()->fg_yellow->foreground}; bool needCntReset = false; + bool paused = false; int16_t zoom = 1; // one value in ms int16_t waveform_shift = 0; @@ -151,6 +159,7 @@ class ProtoView : public View { void on_data(const ProtoViewDataMessage* message); void draw(); void draw2(); + void set_pause(bool pause); void reset(); MessageHandlerRegistration message_handler_packet{ @@ -178,4 +187,4 @@ class ProtoView : public View { } // namespace ui::external_app::protoview -#endif /*__UI_PROTOVIEW_H__*/ \ No newline at end of file +#endif /*__UI_PROTOVIEW_H__*/ diff --git a/firmware/application/external/random_password/main.cpp b/firmware/application/external/random_password/main.cpp new file mode 100644 index 00000000..f92851e1 --- /dev/null +++ b/firmware/application/external/random_password/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2023 Bernd Herzog + * + * 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 "ui.hpp" +#include "ui_random_password.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::random_password { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::random_password + +extern "C" { + +__attribute__((section(".external_app.app_random_password.application_information"), used)) application_information_t _application_information_random_password = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::random_password::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "Random passwd", + /*.bitmap_data = */ { + 0xC0, + 0x03, + 0xE0, + 0x07, + 0x30, + 0x0C, + 0x30, + 0x0C, + 0x30, + 0x0C, + 0x30, + 0x0C, + 0xE0, + 0x07, + 0xC0, + 0x03, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x07, + 0x80, + 0x03, + 0x80, + 0x07, + 0x80, + 0x01, + }, + /*.icon_color = */ ui::Color::yellow().v, + /*.menu_location = */ app_location_t::UTILITIES, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_afsk_rx */ {'P', 'A', 'F', 'R'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} diff --git a/firmware/application/external/random_password/sha512.cpp b/firmware/application/external/random_password/sha512.cpp new file mode 100644 index 00000000..e4b73ce3 --- /dev/null +++ b/firmware/application/external/random_password/sha512.cpp @@ -0,0 +1,156 @@ +/* modified from https://github.com/ulwanski/sha512 + * copyright @ulwanski + * */ +#include "sha512.h" + +namespace ui::external_app::random_password { + +const unsigned long long SHA512::sha512_k[80] = // ULL = uint64 + {0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, + 0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL, + 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL, + 0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL, + 0xd807aa98a3030242ULL, 0x12835b0145706fbeULL, + 0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL, + 0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL, + 0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL, + 0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL, + 0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL, + 0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL, + 0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL, + 0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL, + 0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL, + 0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL, + 0x06ca6351e003826fULL, 0x142929670a0e6e70ULL, + 0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL, + 0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL, + 0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL, + 0x81c2c92e47edaee6ULL, 0x92722c851482353bULL, + 0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL, + 0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL, + 0xd192e819d6ef5218ULL, 0xd69906245565a910ULL, + 0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL, + 0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL, + 0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL, + 0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL, + 0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL, + 0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL, + 0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL, + 0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL, + 0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL, + 0xca273eceea26619cULL, 0xd186b8c721c0c207ULL, + 0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL, + 0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL, + 0x113f9804bef90daeULL, 0x1b710b35131c471bULL, + 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, + 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, + 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, + 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL}; + +void SHA512::transform(const unsigned char* message, unsigned int block_nb) { + uint64 w[80]; + uint64 wv[8]; + uint64 t1, t2; + const unsigned char* sub_block; + int i, j; + for (i = 0; i < (int)block_nb; i++) { + sub_block = message + (i << 7); + for (j = 0; j < 16; j++) { + SHA2_PACK64(&sub_block[j << 3], &w[j]); + } + for (j = 16; j < 80; j++) { + w[j] = SHA512_F4(w[j - 2]) + w[j - 7] + SHA512_F3(w[j - 15]) + w[j - 16]; + } + for (j = 0; j < 8; j++) { + wv[j] = m_h[j]; + } + for (j = 0; j < 80; j++) { + t1 = wv[7] + SHA512_F2(wv[4]) + SHA2_CH(wv[4], wv[5], wv[6]) + sha512_k[j] + w[j]; + t2 = SHA512_F1(wv[0]) + SHA2_MAJ(wv[0], wv[1], wv[2]); + wv[7] = wv[6]; + wv[6] = wv[5]; + wv[5] = wv[4]; + wv[4] = wv[3] + t1; + wv[3] = wv[2]; + wv[2] = wv[1]; + wv[1] = wv[0]; + wv[0] = t1 + t2; + } + for (j = 0; j < 8; j++) { + m_h[j] += wv[j]; + } + } +} + +void SHA512::init() { + m_h[0] = 0x6a09e667f3bcc908ULL; + m_h[1] = 0xbb67ae8584caa73bULL; + m_h[2] = 0x3c6ef372fe94f82bULL; + m_h[3] = 0xa54ff53a5f1d36f1ULL; + m_h[4] = 0x510e527fade682d1ULL; + m_h[5] = 0x9b05688c2b3e6c1fULL; + m_h[6] = 0x1f83d9abfb41bd6bULL; + m_h[7] = 0x5be0cd19137e2179ULL; + m_len = 0; + m_tot_len = 0; +} + +void SHA512::update(const unsigned char* message, unsigned int len) { + unsigned int block_nb; + unsigned int new_len, rem_len, tmp_len; + const unsigned char* shifted_message; + tmp_len = SHA384_512_BLOCK_SIZE - m_len; + rem_len = len < tmp_len ? len : tmp_len; + memcpy(&m_block[m_len], message, rem_len); + if (m_len + len < SHA384_512_BLOCK_SIZE) { + m_len += len; + return; + } + new_len = len - rem_len; + block_nb = new_len / SHA384_512_BLOCK_SIZE; + shifted_message = message + rem_len; + transform(m_block, 1); + transform(shifted_message, block_nb); + rem_len = new_len % SHA384_512_BLOCK_SIZE; + memcpy(m_block, &shifted_message[block_nb << 7], rem_len); + m_len = rem_len; + m_tot_len += (block_nb + 1) << 7; +} + +void SHA512::final(unsigned char* digest) { + unsigned int block_nb; + unsigned int pm_len; + unsigned int len_b; + int i; + block_nb = 1 + ((SHA384_512_BLOCK_SIZE - 17) < (m_len % SHA384_512_BLOCK_SIZE)); + len_b = (m_tot_len + m_len) << 3; + pm_len = block_nb << 7; + memset(m_block + m_len, 0, pm_len - m_len); + m_block[m_len] = 0x80; + SHA2_UNPACK32(len_b, m_block + pm_len - 4); + transform(m_block, block_nb); + for (i = 0; i < 8; i++) { + SHA2_UNPACK64(m_h[i], &digest[i << 3]); + } +} + +std::string sha512(const void* dat, size_t len) { + unsigned char digest[SHA512::DIGEST_SIZE]; + memset(digest, 0, SHA512::DIGEST_SIZE); + SHA512 ctx = SHA512(); + ctx.init(); + ctx.update((const unsigned char*)dat, len); + ctx.final(digest); + + char buf[2 * SHA512::DIGEST_SIZE + 1]; + buf[2 * SHA512::DIGEST_SIZE] = 0; + for (unsigned int i = 0; i < SHA512::DIGEST_SIZE; i++) + sprintf(buf + i * 2, "%02x", digest[i]); + return std::string(buf); +} + +std::string sha512(std::string input) { + return sha512((const unsigned char*)input.c_str(), (size_t)input.length()); +} + +} // namespace ui::external_app::random_password \ No newline at end of file diff --git a/firmware/application/external/random_password/sha512.h b/firmware/application/external/random_password/sha512.h new file mode 100644 index 00000000..a2e3632e --- /dev/null +++ b/firmware/application/external/random_password/sha512.h @@ -0,0 +1,76 @@ +/* modified from https://github.com/ulwanski/sha512 + * copyright @ulwanski + * */ + +#ifndef SHA512_H +#define SHA512_H + +#include +#include +#include + +#define _CRT_SECURE_NO_WARNINGS + +std::string sha512(const void* dat, size_t len); +std::string sha512(std::string input); + +namespace ui::external_app::random_password { + +class SHA512 { + protected: + typedef unsigned char uint8; + typedef unsigned long uint32; + typedef unsigned long long uint64; + const static uint64 sha512_k[]; + static const unsigned int SHA384_512_BLOCK_SIZE = (1024 / 8); + + public: + void init(); + void update(const unsigned char* message, unsigned int len); + void final(unsigned char* digest); + static const unsigned int DIGEST_SIZE = (512 / 8); + + protected: + void transform(const unsigned char* message, unsigned int block_nb); + unsigned int m_tot_len; + unsigned int m_len; + unsigned char m_block[2 * SHA384_512_BLOCK_SIZE]; + uint64 m_h[8]; +}; + +std::string sha512(std::string input); + +#define SHA2_SHFR(x, n) (x >> n) +#define SHA2_ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) +#define SHA2_ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n))) +#define SHA2_CH(x, y, z) ((x & y) ^ (~x & z)) +#define SHA2_MAJ(x, y, z) ((x & y) ^ (x & z) ^ (y & z)) +#define SHA512_F1(x) (SHA2_ROTR(x, 28) ^ SHA2_ROTR(x, 34) ^ SHA2_ROTR(x, 39)) +#define SHA512_F2(x) (SHA2_ROTR(x, 14) ^ SHA2_ROTR(x, 18) ^ SHA2_ROTR(x, 41)) +#define SHA512_F3(x) (SHA2_ROTR(x, 1) ^ SHA2_ROTR(x, 8) ^ SHA2_SHFR(x, 7)) +#define SHA512_F4(x) (SHA2_ROTR(x, 19) ^ SHA2_ROTR(x, 61) ^ SHA2_SHFR(x, 6)) +#define SHA2_UNPACK32(x, str) \ + { \ + *((str) + 3) = (uint8)((x)); \ + *((str) + 2) = (uint8)((x) >> 8); \ + *((str) + 1) = (uint8)((x) >> 16); \ + *((str) + 0) = (uint8)((x) >> 24); \ + } +#define SHA2_UNPACK64(x, str) \ + { \ + *((str) + 7) = (uint8)((x)); \ + *((str) + 6) = (uint8)((x) >> 8); \ + *((str) + 5) = (uint8)((x) >> 16); \ + *((str) + 4) = (uint8)((x) >> 24); \ + *((str) + 3) = (uint8)((x) >> 32); \ + *((str) + 2) = (uint8)((x) >> 40); \ + *((str) + 1) = (uint8)((x) >> 48); \ + *((str) + 0) = (uint8)((x) >> 56); \ + } +#define SHA2_PACK64(str, x) \ + { \ + *(x) = ((uint64) * ((str) + 7)) | ((uint64) * ((str) + 6) << 8) | ((uint64) * ((str) + 5) << 16) | ((uint64) * ((str) + 4) << 24) | ((uint64) * ((str) + 3) << 32) | ((uint64) * ((str) + 2) << 40) | ((uint64) * ((str) + 1) << 48) | ((uint64) * ((str) + 0) << 56); \ + } +} // namespace ui::external_app::random_password + +#endif \ No newline at end of file diff --git a/firmware/application/external/random_password/ui_random_password.cpp b/firmware/application/external/random_password/ui_random_password.cpp new file mode 100644 index 00000000..c36236f6 --- /dev/null +++ b/firmware/application/external/random_password/ui_random_password.cpp @@ -0,0 +1,397 @@ +/* + * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2017 Furrtek + * Copyright (C) 2024 zxkmm + * Copyright (C) 2024 HTotoo + * + * 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. + */ + +/* Notes about safety/randomness: + * - Radio data is from nature, so if it's evenly tiled in space, it's random enough, but usually it's not + * - A unsafe point is the freq that fetch data is from LCG (from Cpp STL) using time as seed, but should be spread out by later random calculation + * - A unsafe point is the init data is still using LCG to generate, but used following methods to spread out: + * - - Radio data + * - - save a buffer of seeds and generate char by char, this cover all the possible chars combination + * - - Rollout with teo seeds and get a final char, this spread out again + * - - Hash out the generated password and spread out again if you choose. SHA-512 is proven very spreading out in random space by math + * - But still, this isn't meant to become a TRNG generator, don't use at critical/high safety requited/important system, this FOSS has absolutely no warranty + */ + +#include "ui_random_password.hpp" +#include "ui_modemsetup.hpp" + +#include "modems.hpp" +#include "rtc_time.hpp" +#include "baseband_api.hpp" +#include "string_format.hpp" +#include "portapack_persistent_memory.hpp" +#include "file_path.hpp" +#include "sha512.h" + +using namespace portapack; +using namespace modems; +using namespace ui; + +namespace ui::external_app::random_password { + +void RandomPasswordLogger::log_raw_data(const std::string& data) { + log_file.write_entry(data); +} + +void RandomPasswordView::focus() { + button_refresh.focus(); +} + +RandomPasswordView::RandomPasswordView(NavigationView& nav) + : nav_{nav} { + baseband::run_prepared_image(portapack::memory::map::m4_code.base()); + + add_children({&rssi, + &channel, + &field_rf_amp, + &field_lna, + &field_vga, + &field_frequency, + &check_log, + &button_modem_setup, + &labels, + &text_generated_passwd, + &text_char_type_hints, + &check_digits, + &check_latin_lower, + &check_latin_upper, + &check_punctuation, + &check_show_seeds, + &check_auto_send, + &button_refresh, + &button_show_qr, + &button_flood, + &button_send, + &field_digits, + &field_method, + &check_allow_confusable_chars, + &text_seed, + &progressbar}); + + // no idea what's these, i copied from afsk rx app and they seems needed' + auto def_bell202 = &modem_defs[0]; + persistent_memory::set_modem_baudrate(def_bell202->baudrate); + serial_format_t serial_format; + serial_format.data_bits = 7; + serial_format.parity = EVEN; + serial_format.stop_bits = 1; + serial_format.bit_order = LSB_FIRST; + persistent_memory::set_serial_format(serial_format); + + progressbar.set_max(MAX_DIGITS * 2); + + check_log.set_value(logging); + check_log.on_select = [this](Checkbox&, bool v) { + if (v) { + nav_.display_modal( + "Warning", + "Sure?\n" + "this will save all generated\n" + "password to sdcard\n" + "in plain text\n" + "those which generated before\n" + "you check me, will lost", + YESNO, + [this, v](bool c) { + if (c) { + logging = v; + } else { + check_log.set_value(false); + // this is needed to check back to false cuz when trigger by human, the check to true already happened + // this blocked interface so won't accidently saved even if user checked but selected no later here, + // but take care of here if in the future implemented ticking/auto/batch save etc + } + }); + } else { + logging = v; + } + }; + + button_modem_setup.on_select = [&nav](Button&) { // copied from afsk rx app + nav.push(); + }; + + check_digits.on_select = [this](Checkbox&, bool) { + this->new_password(); + }; + + check_latin_lower.on_select = [this](Checkbox&, bool) { + this->new_password(); + }; + + check_latin_upper.on_select = [this](Checkbox&, bool) { + this->new_password(); + }; + + check_punctuation.on_select = [this](Checkbox&, bool) { + this->new_password(); + }; + + check_allow_confusable_chars.on_select = [this](Checkbox&, bool) { + this->new_password(); + }; + + button_refresh.on_select = [this](Button&) { + this->set_random_freq(); + this->new_password(); + }; + + button_show_qr.on_select = [this, &nav](Button&) { + nav.push(password.data()); + }; + + button_flood.on_select = [this](Button&) { + if (flooding) { + flooding = false; + button_flood.set_text(LanguageHelper::currentMessages[LANG_FLOOD]); + } else { + flooding = true; + button_flood.set_text(LanguageHelper::currentMessages[LANG_STOP]); + } + }; + button_send.on_select = [this, &nav](Button&) { + async_prev_val = portapack::async_tx_enabled; + portapack::async_tx_enabled = true; + UsbSerialAsyncmsg::asyncmsg(password); + portapack::async_tx_enabled = async_prev_val; + }; + + field_digits.on_change = [this](int32_t) { + clean_buffer(); + this->new_password(); + }; + + /// v check defauly val init + check_digits.set_value(true); + check_latin_lower.set_value(true); + check_latin_upper.set_value(true); + check_punctuation.set_value(true); + check_show_seeds.set_value(true); + field_digits.set_value(16); + field_method.set_by_value(Method::RADIO_LCG_ROLL_HASH); + ///^ check defauly val init + + logger = std::make_unique(); + if (logger) + logger->append(logs_dir / u"random.TXT"); + + // Auto-configure modem for LCR RX (will be removed later), copied from afsk rx app + baseband::set_afsk(persistent_memory::modem_baudrate(), 8, 0, false); + + receiver_model.enable(); + receiver_model.set_rf_amp(false); + set_random_freq(); + new_password(); +} + +void RandomPasswordView::on_data(uint32_t value, bool is_data) { + if (is_data) { + seed = static_cast(value); + text_seed.set(to_string_dec_uint(check_show_seeds.value() ? seed : 0)); + + /// v feed deque + seeds_deque.push_back(value); + if (seeds_deque.size() > MAX_DIGITS * 2) { + seeds_deque.pop_front(); + } + + ///^ feed deque + + progressbar.set_value(seeds_deque.size()); + + if (flooding && seeds_deque.size() >= MAX_DIGITS * 2) { + new_password(); + } + + } else { + text_generated_passwd.set("Baudrate estimation: ~"); + text_char_type_hints.set(to_string_dec_uint(value)); + } +} + +void RandomPasswordView::clean_buffer() { + seeds_deque = {}; +} + +void RandomPasswordView::on_freqchg(int64_t freq) { + field_frequency.set_value(freq); +} + +void RandomPasswordView::set_random_freq() { + std::srand(LPC_RTC->CTIME0); + // this is only for seed to visit random freq, the radio is still real random + + auto random_freq = 100000000 + (std::rand() % 900000000); // 100mhz to 1ghz + receiver_model.set_target_frequency(random_freq); + field_frequency.set_value(random_freq); +} + +void RandomPasswordView::new_password() { + if (seeds_deque.size() < MAX_DIGITS * 2) { + seeds_buffer_not_full = true; + text_generated_passwd.set("wait seeds buffer full"); + text_char_type_hints.set("then press generate"); + return; + } + password = ""; + std::string charset = ""; + std::string char_type_hints = ""; + std::string initial_password = ""; + int password_length = field_digits.value(); + + /// charset worker + if (check_digits.value()) + charset += "0123456789"; + if (check_latin_lower.value()) + charset += "abcdefghijklmnopqrstuvwxyz"; + if (check_latin_upper.value()) + charset += "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + if (check_punctuation.value()) + charset += ".,-!?"; + + if (!check_allow_confusable_chars.value()) { + charset.erase(std::remove_if(charset.begin(), charset.end(), + [](char c) { return c == '0' || c == 'O' || c == 'o' || c == '1' || c == 'l'; }), + charset.end()); + } + + if (charset.empty()) { + text_generated_passwd.set("generate failed,"); + text_char_type_hints.set("select at least 1 type"); + return; + } + + /// roll worker + for (int i = 0; i < password_length * 2; i += 2) { + unsigned int seed = seeds_deque[i]; + std::srand(seed); + uint8_t rollnum = (uint8_t)(seeds_deque[i + 1] % 128); + uint8_t nu = 0; + for (uint8_t o = 0; o < rollnum; ++o) nu = std::rand(); + nu++; + char c = charset[std::rand() % charset.length()]; + initial_password += c; + } + + // hash worker + std::string hashed_password = sha512(initial_password); + + std::vector password_chars(password_length); + for (int i = 0; i < password_length; i++) { + unsigned int index = std::stoul(hashed_password.substr(i * 2, 2), nullptr, 16) % charset.length(); // result from 0 to charset.length()-1,should be very evenly tiled in the charset space + password_chars[i] = charset[index]; + } + + /// hint text worker + for (char c : password_chars) { + password += c; + if (std::isdigit(c)) { + char_type_hints += "1"; + } else if (std::islower(c)) { + char_type_hints += "a"; + } else if (std::isupper(c)) { + char_type_hints += "A"; + } else { + char_type_hints += ","; + } + } + + /// decision worker + switch (field_method.selected_index_value()) { + case Method::RADIO_LCG_ROLL: + password = initial_password; + break; + case Method::RADIO_LCG_ROLL_HASH: + break; + default: + break; + } + + /// give out result worker + text_generated_passwd.set(password); + text_char_type_hints.set(char_type_hints); + + paint_password_hints(); + + if (logger && logging) { + str_log += generate_log_line(); + logger->log_raw_data(str_log); + str_log = ""; + } + + if (check_auto_send.value() || flooding) { + async_prev_val = portapack::async_tx_enabled; + portapack::async_tx_enabled = true; + UsbSerialAsyncmsg::asyncmsg(password); + portapack::async_tx_enabled = async_prev_val; + } + + clean_buffer(); +} + +void RandomPasswordView::paint_password_hints() { + Painter painter; + const int char_width = 8; + const int char_height = 16; + const int start_y = 6 * char_height; + const int rect_height = 4; + + for (size_t i = 0; i < password.length(); i++) { + char c = password[i]; + Color color; + if (std::isdigit(c)) { + color = Color::red(); + } else if (std::islower(c)) { + color = Color::green(); + } else if (std::isupper(c)) { + color = Color::blue(); + } else { + color = Color::white(); + } + + painter.fill_rectangle( + {{static_cast(i) * char_width, start_y}, + {char_width, rect_height}}, + color); + } +} + +std::string RandomPasswordView::generate_log_line() { + std::string seeds_set = ""; + for (auto seed : seeds_deque) { + seeds_set += std::to_string(seed); + seeds_set += " "; + } + std::string line = "\npassword=" + password + + "\nseeds=" + seeds_set + + "\n"; + return line; +} + +RandomPasswordView::~RandomPasswordView() { + receiver_model.disable(); + baseband::shutdown(); +} + +} // namespace ui::external_app::random_password \ No newline at end of file diff --git a/firmware/application/external/random_password/ui_random_password.hpp b/firmware/application/external/random_password/ui_random_password.hpp new file mode 100644 index 00000000..24ebb63e --- /dev/null +++ b/firmware/application/external/random_password/ui_random_password.hpp @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2017 Furrtek + * Copyright (C) 2024 zxkmm + * Copyright (C) 2024 HTotoo + * + * 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 __UI_RANDOM_PASSWORD_H__ +#define __UI_RANDOM_PASSWORD_H__ + +#define MAX_DIGITS 30 + +#include "ui.hpp" +#include "ui_language.hpp" +#include "ui_navigation.hpp" +#include "ui_receiver.hpp" +#include "ui_freq_field.hpp" +#include "ui_record_view.hpp" +#include "app_settings.hpp" +#include "radio_state.hpp" +#include "log_file.hpp" +#include "utility.hpp" +#include "ui_qrcode.hpp" +#include "usb_serial_asyncmsg.hpp" +#include "sha512.h" + +#include +#include + +using namespace ui; + +namespace ui::external_app::random_password { + +enum Method { + RADIO_LCG_ROLL, + RADIO_LCG_ROLL_HASH, +}; + +class RandomPasswordLogger { + public: + Optional append(const std::filesystem::path& filename) { + return log_file.append(filename); + } + + void log_raw_data(const std::string& data); + + private: + LogFile log_file{}; +}; + +class RandomPasswordView : public View { + public: + RandomPasswordView(NavigationView& nav); + ~RandomPasswordView(); + + void focus() override; + + std::string title() const override { return "R.passwd"; }; + + private: + unsigned int seed = 0; // extern void srand (unsigned int __seed) __THROW; + std::string password = ""; + + std::deque seeds_deque = {0}; + bool seeds_buffer_not_full = true; + bool in_benchmark = false; + bool flooding = false; + bool logging = false; + bool async_prev_val = false; + std::string str_log{""}; + + void on_data(uint32_t value, bool is_data); + void clean_buffer(); + void new_password(); + std::string generate_log_line(); + void paint_password_hints(); + + NavigationView& nav_; + RxRadioState radio_state_{}; + app_settings::SettingsManager settings_{ + "rx_passgen", app_settings::Mode::RX}; + + Labels labels{ + {{0 * 8, 0 * 16}, "------------seeds-------------", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 3 * 16}, "-----------password-----------", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 7 * 16 - 2}, "digits:", Theme::getInstance()->fg_light->foreground}, + {{screen_width / 2, 7 * 16 - 2}, "method:", Theme::getInstance()->fg_light->foreground}, + }; + + RFAmpField field_rf_amp{ + {13 * 8, 1 * 16}}; + LNAGainField field_lna{ + {15 * 8, 1 * 16}}; + VGAGainField field_vga{ + {18 * 8, 1 * 16}}; + + RSSI rssi{ + {21 * 8, 1 * 16 + 0, 6 * 8, 4}}; + Channel channel{ + {21 * 8, 1 * 16 + 5, 6 * 8, 4}}; + + RxFrequencyField field_frequency{ + {0 * 8, 1 * 16}, + nav_}; + + Button button_modem_setup{ + {screen_width - 12 * 8, 2 * 16 - 1, 96, 16 + 2}, + LanguageHelper::currentMessages[LANG_MODEM_SETUP]}; + + Text text_seed{ + {0, 2 * 16, 10 * 8, 16}, + "0000000000"}; + + ProgressBar progressbar{ + {10 * 8 + 2, 2 * 16, screen_width - 96 - (10 * 8 + 4) - 1, 16}}; + + Text text_generated_passwd{ + {0, 4 * 16, screen_width, 16}, + "000000000000000000000000000000"}; + + Text text_char_type_hints{ + {0, 5 * 16 + 4, screen_width, 16}, + "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"}; + + Checkbox check_show_seeds{ + {17 * 8, 8 * 16}, + 6, + "Show seed"}; + + Checkbox check_auto_send{ + {1 * 8, 8 * 16}, + 20, + "Auto send"}; + + Checkbox check_punctuation{ + {17 * 8, 12 * 16}, + 6, + ".,-!?"}; + + Checkbox check_allow_confusable_chars{ + {1 * 8, 10 * 16}, + 20, + "0 O o 1 l"}; + + Checkbox check_digits{ + {1 * 8, 12 * 16}, + 3, + "123"}; + + Checkbox check_latin_lower{ + {1 * 8, 14 * 16}, + 3, + "abc"}; + + Checkbox check_latin_upper{ + {17 * 8, 14 * 16}, + 3, + "ABC"}; + + Checkbox check_log{ + {17 * 8, 10 * 16}, + 3, + LanguageHelper::currentMessages[LANG_SAVE]}; + + Button button_flood{ + {0 * 8, 15 * 16 + 18, screen_width / 2, 22}, + LanguageHelper::currentMessages[LANG_FLOOD]}; + + Button button_send{ + {screen_width / 2 + 2, 15 * 16 + 18, screen_width / 2 - 2, 22}, + "Send pwd"}; + + Button button_refresh{ + {0 * 8, 17 * 16 + 10, screen_width / 2, 22}, + "Generate"}; + + Button button_show_qr{ + {screen_width / 2 + 2, 17 * 16 + 10, screen_width / 2 - 2, 22}, + LanguageHelper::currentMessages[LANG_SHOWQR]}; + + NumberField field_digits{ + {0 + (sizeof("digits:") - 1) * 8, 7 * 16 - 2}, + 2, + {1, 30}, + 1, + ' '}; + + OptionsField field_method{ + {(screen_width / 2) + (sizeof("method:") - 1) * 8, 7 * 16 - 2}, + sizeof("R+L+R+H"), + {{"R+L+R", Method::RADIO_LCG_ROLL}, + {"R+L+R+H", Method::RADIO_LCG_ROLL_HASH}}}; + + void on_data_afsk(const AFSKDataMessage& message); + + std::unique_ptr logger{}; + + MessageHandlerRegistration message_handler_packet{ + Message::ID::AFSKData, + [this](Message* const p) { + const auto message = static_cast(p); + this->on_data(message->value, message->is_data); + }}; + + MessageHandlerRegistration message_handler_freqchg{ + Message::ID::FreqChangeCommand, + [this](Message* const p) { + const auto message = static_cast(p); + this->on_freqchg(message->freq); + }}; + + void on_freqchg(int64_t freq); + void set_random_freq(); +}; + +} // namespace ui::external_app::random_password + +#endif /*__UI_RANDOM_PASSWORD_H__*/ diff --git a/firmware/application/external/remote/main.cpp b/firmware/application/external/remote/main.cpp new file mode 100644 index 00000000..358452a4 --- /dev/null +++ b/firmware/application/external/remote/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 gullradriel + * + * 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 "ui.hpp" +#include "ui_remote.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::remote { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::remote + +extern "C" { + +__attribute__((section(".external_app.app_remote.application_information"), used)) application_information_t _application_information_remote = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::remote::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "Remote", + /*.bitmap_data = */ { + 0x20, + 0x00, + 0x20, + 0x00, + 0x20, + 0x00, + 0x20, + 0x00, + 0xE0, + 0x07, + 0xF0, + 0x0F, + 0x30, + 0x0C, + 0x30, + 0x0C, + 0xF0, + 0x0F, + 0xF0, + 0x0F, + 0x70, + 0x0D, + 0xB0, + 0x0E, + 0x70, + 0x0D, + 0xB0, + 0x0E, + 0xF0, + 0x0F, + 0xE0, + 0x07, + }, + /*.icon_color = */ ui::Color::green().v, + /*.menu_location = */ app_location_t::HOME, + /*.desired_menu_position = */ 4, + + /*.m4_app_tag = portapack::spi_flash::image_tag_replay */ {'P', 'R', 'E', 'P'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} diff --git a/firmware/application/apps/ui_remote.cpp b/firmware/application/external/remote/ui_remote.cpp similarity index 93% rename from firmware/application/apps/ui_remote.cpp rename to firmware/application/external/remote/ui_remote.cpp index ea4c7fd5..b4f7f650 100644 --- a/firmware/application/apps/ui_remote.cpp +++ b/firmware/application/external/remote/ui_remote.cpp @@ -20,7 +20,6 @@ */ #include "ui_remote.hpp" - #include "binder.hpp" #include "convert.hpp" #include "file_reader.hpp" @@ -34,11 +33,11 @@ #include "utility.hpp" #include "file_path.hpp" +namespace ui::external_app::remote { + using namespace portapack; namespace fs = std::filesystem; -namespace ui { - static constexpr uint8_t text_edit_max = 30; /* RemoteEntryModel **************************************/ @@ -309,9 +308,9 @@ void RemoteEntryEditView::load_path(std::filesystem::path&& path) { entry_.metadata = {transmitter_model.target_frequency(), 500'000}; } -/* RemoteView ********************************************/ +/* RemoteAppView ********************************************/ -RemoteView::RemoteView( +RemoteAppView::RemoteAppView( NavigationView& nav) : nav_{nav} { baseband::run_image(portapack::spi_flash::image_tag_replay); @@ -365,27 +364,27 @@ RemoteView::RemoteView( refresh_ui(); } -RemoteView::RemoteView(NavigationView& nav, fs::path path) - : RemoteView(nav) { +RemoteAppView::RemoteAppView(NavigationView& nav, fs::path path) + : RemoteAppView(nav) { load_remote(std::move(path)); refresh_ui(); } -RemoteView::~RemoteView() { +RemoteAppView::~RemoteAppView() { stop(); baseband::shutdown(); save_remote(/*show_error*/ false); } -void RemoteView::focus() { +void RemoteAppView::focus() { if (model_.entries.empty()) button_add.focus(); else buttons_[0]->focus(); } -void RemoteView::create_buttons() { +void RemoteAppView::create_buttons() { // Handler callbacks. auto handle_send = [this](RemoteButton& btn) { if (btn.entry()->path.empty()) @@ -420,7 +419,7 @@ void RemoteView::create_buttons() { } } -void RemoteView::reset_buttons() { +void RemoteAppView::reset_buttons() { // Whever the model's entries instance is invalidated, // all the pointers in the buttons will end up dangling. // TODO: This is pretty lame. Could maybe static alloc? @@ -428,7 +427,7 @@ void RemoteView::reset_buttons() { btn->set_entry(nullptr); } -void RemoteView::refresh_ui() { +void RemoteAppView::refresh_ui() { field_title.set_text(model_.name); field_filename.set_text(remote_path_.stem().string()); @@ -441,7 +440,7 @@ void RemoteView::refresh_ui() { } } -void RemoteView::add_button() { +void RemoteAppView::add_button() { if (model_.entries.size() >= max_buttons) return; @@ -454,7 +453,7 @@ void RemoteView::add_button() { set_needs_save(); } -void RemoteView::edit_button(RemoteButton& btn) { +void RemoteAppView::edit_button(RemoteButton& btn) { // Don't let replay thread read the model while editing. stop(); @@ -471,7 +470,7 @@ void RemoteView::edit_button(RemoteButton& btn) { }; } -void RemoteView::send_button(RemoteButton& btn) { +void RemoteAppView::send_button(RemoteButton& btn) { // TODO: If this is called while is_sending() == true, // it just stops and doesn't start the new button? @@ -510,14 +509,14 @@ void RemoteView::send_button(RemoteButton& btn) { }); } -void RemoteView::stop() { +void RemoteAppView::stop() { // This terminates the underlying chThread. replay_thread_.reset(); transmitter_model.disable(); ready_signal_ = false; } -void RemoteView::new_remote() { +void RemoteAppView::new_remote() { save_remote(); init_remote(); refresh_ui(); @@ -526,7 +525,7 @@ void RemoteView::new_remote() { set_dirty(); } -void RemoteView::open_remote() { +void RemoteAppView::open_remote() { auto open_view = nav_.push(".REM"); open_view->push_dir(remotes_dir); open_view->on_changed = [this](fs::path path) { @@ -536,7 +535,7 @@ void RemoteView::open_remote() { }; } -void RemoteView::init_remote() { +void RemoteAppView::init_remote() { model_ = {"", {}}; reset_buttons(); set_remote_path(next_filename_matching_pattern(remotes_dir / u"REMOTE_????.REM")); @@ -546,14 +545,14 @@ void RemoteView::init_remote() { show_error("Couldn't make new remote file."); } -bool RemoteView::load_remote(fs::path&& path) { +bool RemoteAppView::load_remote(fs::path&& path) { set_remote_path(std::move(path)); set_needs_save(false); reset_buttons(); return model_.load(remote_path_); } -void RemoteView::save_remote(bool show_errors) { +void RemoteAppView::save_remote(bool show_errors) { if (!needs_save_) return; @@ -564,7 +563,7 @@ void RemoteView::save_remote(bool show_errors) { set_needs_save(false); } -void RemoteView::rename_remote(const std::string& new_name) { +void RemoteAppView::rename_remote(const std::string& new_name) { auto folder = remote_path_.parent_path(); auto ext = remote_path_.extension(); auto new_path = folder / new_name + ext; @@ -581,7 +580,7 @@ void RemoteView::rename_remote(const std::string& new_name) { set_remote_path(std::move(new_path)); } -void RemoteView::handle_replay_thread_done(uint32_t return_code) { +void RemoteAppView::handle_replay_thread_done(uint32_t return_code) { if (return_code == ReplayThread::END_OF_FILE) { if (check_loop.value() && current_btn_) { send_button(*current_btn_); @@ -598,15 +597,15 @@ void RemoteView::handle_replay_thread_done(uint32_t return_code) { stop(); } -void RemoteView::set_remote_path(fs::path&& path) { +void RemoteAppView::set_remote_path(fs::path&& path) { // Unfortunately, have to keep these two in sync because // settings doesn't know about fs::path. remote_path_ = std::move(path); settings_.remote_path = remote_path_.string(); } -void RemoteView::show_error(const std::string& msg) const { +void RemoteAppView::show_error(const std::string& msg) const { nav_.display_modal("Error", msg); } -} /* namespace ui */ +} // namespace ui::external_app::remote diff --git a/firmware/application/apps/ui_remote.hpp b/firmware/application/external/remote/ui_remote.hpp similarity index 96% rename from firmware/application/apps/ui_remote.hpp rename to firmware/application/external/remote/ui_remote.hpp index 548f8a14..e61834f4 100644 --- a/firmware/application/apps/ui_remote.hpp +++ b/firmware/application/external/remote/ui_remote.hpp @@ -41,7 +41,7 @@ #include #include -namespace ui { +namespace ui::external_app::remote { /* Maps icon index to bitmap. */ class RemoteIcons { @@ -84,7 +84,7 @@ class RemoteIcons { &bitmap_icon_sonde, &bitmap_icon_stealth, &bitmap_icon_tetra, - &bitmap_icon_temperature}; + &bitmap_icon_peripherals_details}; }; // TODO: Use RGB colors instead? @@ -257,14 +257,14 @@ class RemoteEntryEditView : public View { }; /* App that allows for buttons to be bound to captures for playback. */ -class RemoteView : public View { +class RemoteAppView : public View { public: - RemoteView(NavigationView& nav); - RemoteView(NavigationView& nav, std::filesystem::path path); - ~RemoteView(); + RemoteAppView(NavigationView& nav); + RemoteAppView(NavigationView& nav, std::filesystem::path path); + ~RemoteAppView(); - RemoteView(const RemoteView&) = delete; - RemoteView& operator=(const RemoteView&) = delete; + RemoteAppView(const RemoteAppView&) = delete; + RemoteAppView& operator=(const RemoteAppView&) = delete; std::string title() const override { return "Remote"; }; void focus() override; @@ -385,4 +385,4 @@ class RemoteView : public View { }}; }; -} /* namespace ui */ +} // namespace ui::external_app::remote diff --git a/firmware/application/external/shoppingcart_lock/main.cpp b/firmware/application/external/shoppingcart_lock/main.cpp new file mode 100644 index 00000000..7d7a6292 --- /dev/null +++ b/firmware/application/external/shoppingcart_lock/main.cpp @@ -0,0 +1,66 @@ + +// RocketGod's Shopping Cart Lock app +// https://betaskynet.com +#include "ui.hpp" +#include "shoppingcart_lock.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::shoppingcart_lock { +void initialize_app(NavigationView& nav) { + baseband::run_image(portapack::spi_flash::image_tag_audio_tx); + nav.push(); +} +} // namespace ui::external_app::shoppingcart_lock + +extern "C" { + +__attribute__((section(".external_app.app_shoppingcart_lock.application_information"), used)) application_information_t _application_information_shoppingcart_lock = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::shoppingcart_lock::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "Cart Lock", + /*.bitmap_data = */ { + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7E, + 0x7E, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x7E, + 0x81, + 0x81, + 0x7E, + 0x00, + 0x00, + 0x00, + 0x7E, + 0x81, + 0x81, + 0x81, + 0x81, + 0x7E, + 0x00, + }, + /*.icon_color = */ ui::Color::red().v, + /*.menu_location = */ app_location_t::UTILITIES, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_afsk_rx */ {'P', 'A', 'T', 'X'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} \ No newline at end of file diff --git a/firmware/application/external/shoppingcart_lock/shoppingcart_lock.cpp b/firmware/application/external/shoppingcart_lock/shoppingcart_lock.cpp new file mode 100644 index 00000000..22c42988 --- /dev/null +++ b/firmware/application/external/shoppingcart_lock/shoppingcart_lock.cpp @@ -0,0 +1,235 @@ +// RocketGod's Shopping Cart Lock app +// https://betaskynet.com +#include "shoppingcart_lock.hpp" + +using namespace portapack; + +namespace ui::external_app::shoppingcart_lock { + +void ShoppingCartLock::log_event(const std::string& message) { + static const size_t MAX_LOG_LINES = 50; + static std::vector message_history; + + message_history.push_back(message); + if (message_history.size() > MAX_LOG_LINES) { + message_history.erase(message_history.begin()); + menu_view.clear(); + for (const auto& msg : message_history) { + menu_view.add_item({msg, + ui::Theme::getInstance()->fg_green->foreground, + nullptr, + [](KeyEvent) {}}); + } + } else { + menu_view.add_item({message, + ui::Theme::getInstance()->fg_green->foreground, + nullptr, + [](KeyEvent) {}}); + } + + menu_view.set_highlighted(menu_view.item_count() - 1); +} + +bool ShoppingCartLock::is_active() const { + return (bool)replay_thread; +} + +void ShoppingCartLock::focus() { + menu_view.focus(); +} + +void ShoppingCartLock::stop() { + log_event(">>> STOP_SEQUENCE_START"); + if (is_active()) { + log_event("... Resetting Replay Thread"); + replay_thread.reset(); + } + log_event("... Stopping Audio Output"); + audio::output::stop(); + + log_event("... Resetting State Variables"); + transmitter_model.disable(); + ready_signal = false; + thread_sync_complete = false; + looping = false; + current_file = ""; + log_event("<<< STOP_SEQUENCE_COMPLETE"); +} + +std::string ShoppingCartLock::list_wav_files() { + log_event(">>> WAV_SCAN_START"); + auto reader = std::make_unique(); + bool found_lock = false; + bool found_unlock = false; + + for (const auto& entry : std::filesystem::directory_iterator(wav_dir, u"*")) { + if (std::filesystem::is_regular_file(entry.status())) { + auto filename = entry.path().filename().string(); + std::transform(filename.begin(), filename.end(), filename.begin(), ::tolower); + + if (filename == shoppingcart_lock_file || filename == shoppingcart_unlock_file) { + std::string file_path = (wav_dir / filename).string(); + if (reader->open(file_path)) { + if (filename == shoppingcart_lock_file) { + found_lock = true; + log_event("... Found: " + shoppingcart_lock_file); + log_event("Sample Rate: " + std::to_string(reader->sample_rate())); + log_event("Channels: " + std::to_string(reader->channels())); + log_event("Bits/Sample: " + std::to_string(reader->bits_per_sample())); + } + if (filename == shoppingcart_unlock_file) { + found_unlock = true; + log_event("... Found: " + shoppingcart_unlock_file); + log_event("Sample Rate: " + std::to_string(reader->sample_rate())); + log_event("Channels: " + std::to_string(reader->channels())); + log_event("Bits/Sample: " + std::to_string(reader->bits_per_sample())); + } + } + } + + if (found_lock && found_unlock) { + break; + } + } + } + + if (!found_lock || !found_unlock) { + log_event("!!! Missing Required Files:"); + if (!found_lock) log_event("!!! Missing: " + shoppingcart_lock_file); + if (!found_unlock) log_event("!!! Missing: " + shoppingcart_unlock_file); + menu_view.hidden(true); + text_empty.hidden(false); + } else { + log_event("... All Required Files Found"); + menu_view.hidden(false); + text_empty.hidden(true); + } + + log_event("<<< WAV_SCAN_COMPLETE"); + return found_lock && found_unlock ? "Required WAV files found" : "Missing required WAV files"; +} + +void ShoppingCartLock::wait_for_thread() { + uint32_t timeout = 100; + while (!ready_signal && timeout > 0) { + chThdYield(); + timeout--; + } +} + +void ShoppingCartLock::restart_playback() { + auto reader = std::make_unique(); + std::string file_path = (wav_dir / current_file).string(); + + if (!reader->open(file_path)) return; + + replay_thread = std::make_unique( + std::move(reader), + BUFFER_SIZE, + NUM_BUFFERS, + &ready_signal, + [](uint32_t return_code) { + ReplayThreadDoneMessage message{return_code}; + EventDispatcher::send_message(message); + }); + + log_event(">> SENDING <<"); + audio::output::start(); + transmitter_model.enable(); +} + +void ShoppingCartLock::play_audio(const std::string& filename, bool loop) { + auto reader = std::make_unique(); + stop(); + + std::string file_path = (wav_dir / filename).string(); + if (!reader->open(file_path)) { + nav_.display_modal("Error", "Cannot open " + filename); + return; + } + + const uint32_t wav_sample_rate = reader->sample_rate(); + const uint16_t wav_bits_per_sample = reader->bits_per_sample(); + + current_file = filename; + looping = loop; + + replay_thread = std::make_unique( + std::move(reader), + BUFFER_SIZE, + NUM_BUFFERS, + &ready_signal, + [](uint32_t return_code) { + ReplayThreadDoneMessage message{return_code}; + EventDispatcher::send_message(message); + }); + + wait_for_thread(); + + log_event("... Configuring Baseband"); + + const uint32_t bb_sample_rate = 1536000; + const uint32_t decimation = bb_sample_rate / wav_sample_rate; + + baseband::set_audiotx_config( + bb_sample_rate / decimation, + 0.0f, + 5.0f, + wav_bits_per_sample, + wav_bits_per_sample, + 0, + true, + false, + false, + false); + + baseband::set_sample_rate(wav_sample_rate); + + log_event("... Starting Audio Output"); + audio::output::start(); + log_event("... Setting Max Volume"); + audio::headphone::set_volume(audio::headphone::volume_range().max); + + transmitter_model.enable(); + + log_event(">>> Playback Started <<<"); +} + +ShoppingCartLock::ShoppingCartLock(NavigationView& nav) + : nav_{nav} { + add_children({&menu_view, + &text_empty, + &button_lock, + &button_unlock, + &button_stop}); + + button_lock.on_select = [this](Button&) { + if (is_active()) stop(); + log_event(">>> LOCK_SEQUENCE_START"); + play_audio(shoppingcart_lock_file, true); + }; + + button_unlock.on_select = [this](Button&) { + if (is_active()) stop(); + log_event(">>> UNLOCK_SEQUENCE_START"); + play_audio(shoppingcart_unlock_file, true); + }; + + button_stop.on_select = [this](Button&) { + log_event(">>> STOPPING AUDIO"); + stop(); + }; + + list_wav_files(); + + log_event("[+] INITIALIZATION COMPLETE"); + log_event("[+] PORTAPACK ARMED"); + log_event("[*] STATUS: READY"); +} + +ShoppingCartLock::~ShoppingCartLock() { + stop(); + baseband::shutdown(); +} + +} // namespace ui::external_app::shoppingcart_lock diff --git a/firmware/application/external/shoppingcart_lock/shoppingcart_lock.hpp b/firmware/application/external/shoppingcart_lock/shoppingcart_lock.hpp new file mode 100644 index 00000000..abea3ca7 --- /dev/null +++ b/firmware/application/external/shoppingcart_lock/shoppingcart_lock.hpp @@ -0,0 +1,102 @@ +// RocketGod's Shopping Cart Lock app +// https://betaskynet.com +#pragma once + +#include "ui_widget.hpp" +#include "ui_transmitter.hpp" +#include "replay_thread.hpp" +#include "baseband_api.hpp" +#include "io_wave.hpp" +#include "audio.hpp" +#include "portapack_shared_memory.hpp" +#include "ui_language.hpp" +#include "file_path.hpp" + +namespace ui::external_app::shoppingcart_lock { + +class ShoppingCartLock : public View { + public: + explicit ShoppingCartLock(NavigationView& nav); + ~ShoppingCartLock(); + + ShoppingCartLock(const ShoppingCartLock&) = delete; + ShoppingCartLock& operator=(const ShoppingCartLock&) = delete; + + std::string title() const override { return "Cart Lock"; }; + + void focus() override; + + private: + static constexpr size_t BUFFER_SIZE = 8192; + static constexpr size_t NUM_BUFFERS = 8; + const std::string shoppingcart_lock_file{"shopping_cart_lock.wav"}; + const std::string shoppingcart_unlock_file{"shopping_cart_unlock.wav"}; + + NavigationView& nav_; + std::unique_ptr replay_thread{}; + bool ready_signal{false}; + bool thread_sync_complete{false}; + bool looping{false}; + std::string current_file{}; + + struct WAVProperties { + uint32_t sample_rate; + uint16_t bits_per_sample; + size_t file_size; + }; + + void log_event(const std::string& message); + std::string list_wav_files(); + void handle_error(const std::string& message); + void play_audio(const std::string& filename, bool loop = false); + void stop(); + bool is_active() const; + void wait_for_thread(); + void restart_playback(); + + MenuView menu_view{ + {0, 0, 240, 150}, + true}; + + Text text_empty{ + {40, 70, 160, 16}, + "RocketGod was here"}; + + Button button_lock{ + {40, 165, 160, 35}, + LanguageHelper::currentMessages[LANG_LOCK]}; + + Button button_unlock{ + {40, 205, 160, 35}, + LanguageHelper::currentMessages[LANG_UNLOCK]}; + + Button button_stop{ + {40, 245, 160, 35}, + LanguageHelper::currentMessages[LANG_STOP]}; + + MessageHandlerRegistration message_handler_fifo_signal{ + Message::ID::RequestSignal, + [this](const Message* const p) { + const auto message = static_cast(p); + if (message->signal == RequestSignalMessage::Signal::FillRequest) { + ready_signal = true; + } + }}; + + MessageHandlerRegistration message_handler_replay_thread_done{ + Message::ID::ReplayThreadDone, + [this](const Message* const p) { + const auto message = *reinterpret_cast(p); + if (message.return_code == ReplayThread::END_OF_FILE && looping) { + if (is_active()) { + chThdSleepMilliseconds(50); + restart_playback(); + } + } else { + thread_sync_complete = true; + stop(); + } + }}; +}; + +} // namespace ui::external_app::shoppingcart_lock diff --git a/firmware/application/external/spainter/main.cpp b/firmware/application/external/spainter/main.cpp index e9678fdd..b12817a6 100644 --- a/firmware/application/external/spainter/main.cpp +++ b/firmware/application/external/spainter/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_spainter.application_information"), us }, /*.icon_color = */ ui::Color::orange().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_spainter */ {'P', 'S', 'P', 'T'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/spainter/ui_spectrum_painter.hpp b/firmware/application/external/spainter/ui_spectrum_painter.hpp index af9bd883..63e7e9c9 100644 --- a/firmware/application/external/spainter/ui_spectrum_painter.hpp +++ b/firmware/application/external/spainter/ui_spectrum_painter.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __UI_SPECTRUM_PAINTER_H +#define __UI_SPECTRUM_PAINTER_H #include "ui.hpp" #include "ui_language.hpp" @@ -165,3 +166,5 @@ class SpectrumPainterView : public View { }; } // namespace ui::external_app::spainter + +#endif diff --git a/firmware/application/external/spainter/ui_spectrum_painter_image.hpp b/firmware/application/external/spainter/ui_spectrum_painter_image.hpp index 711e8f27..a9c1bf62 100644 --- a/firmware/application/external/spainter/ui_spectrum_painter_image.hpp +++ b/firmware/application/external/spainter/ui_spectrum_painter_image.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __UI_SPECTRUM_PAINTER_IMAGE_H +#define __UI_SPECTRUM_PAINTER_IMAGE_H #include "ui.hpp" #include "ui_widget.hpp" @@ -64,3 +65,5 @@ class SpectrumInputImageView : public View { }; } // namespace ui::external_app::spainter + +#endif diff --git a/firmware/application/external/spainter/ui_spectrum_painter_text.hpp b/firmware/application/external/spainter/ui_spectrum_painter_text.hpp index 5a3859ce..f31305d2 100644 --- a/firmware/application/external/spainter/ui_spectrum_painter_text.hpp +++ b/firmware/application/external/spainter/ui_spectrum_painter_text.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __UI_SPECTRUM_PAINTER_TEXT_H +#define __UI_SPECTRUM_PAINTER_TEXT_H #include "ui.hpp" #include "ui_widget.hpp" @@ -110,3 +111,5 @@ class SpectrumInputTextView : public View { }; } // namespace ui::external_app::spainter + +#endif diff --git a/firmware/application/external/sstvtx/main.cpp b/firmware/application/external/sstvtx/main.cpp index 6a842ffc..887132ba 100644 --- a/firmware/application/external/sstvtx/main.cpp +++ b/firmware/application/external/sstvtx/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_sstvtx.application_information"), used }, /*.icon_color = */ ui::Color::green().v, /*.menu_location = */ app_location_t::TX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_sstvtx */ {'P', 'S', 'T', 'X'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/tetris/main.cpp b/firmware/application/external/tetris/main.cpp index f34a020f..fe66298a 100644 --- a/firmware/application/external/tetris/main.cpp +++ b/firmware/application/external/tetris/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_tetris.application_information"), used }, /*.icon_color = */ ui::Color::orange().v, /*.menu_location = */ app_location_t::UTILITIES, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_none */ {0, 0, 0, 0}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/tpmsrx/main.cpp b/firmware/application/external/tpmsrx/main.cpp index 7c4c4a04..552a14c0 100644 --- a/firmware/application/external/tpmsrx/main.cpp +++ b/firmware/application/external/tpmsrx/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_tpmsrx.application_information"), used }, /*.icon_color = */ ui::Color::green().v, /*.menu_location = */ app_location_t::RX, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_tpms */ {'P', 'T', 'P', 'M'}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/external/tuner/main.cpp b/firmware/application/external/tuner/main.cpp new file mode 100644 index 00000000..4df2414e --- /dev/null +++ b/firmware/application/external/tuner/main.cpp @@ -0,0 +1,83 @@ +/* + * Copyright (C) 2024 Bernd + * + * 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 "ui.hpp" +#include "ui_tuner.hpp" +#include "ui_navigation.hpp" +#include "external_app.hpp" + +namespace ui::external_app::tuner { +void initialize_app(ui::NavigationView& nav) { + nav.push(); +} +} // namespace ui::external_app::tuner + +extern "C" { + +__attribute__((section(".external_app.app_tuner.application_information"), used)) application_information_t _application_information_tuner = { + /*.memory_location = */ (uint8_t*)0x00000000, + /*.externalAppEntry = */ ui::external_app::tuner::initialize_app, + /*.header_version = */ CURRENT_HEADER_VERSION, + /*.app_version = */ VERSION_MD5, + + /*.app_name = */ "Tuner", + /*.bitmap_data = */ { + 0x00, + 0x00, + 0x00, + 0x00, + 0x22, + 0x44, + 0x21, + 0x84, + 0x2D, + 0xB4, + 0x25, + 0xA4, + 0x25, + 0xA4, + 0x2D, + 0xB4, + 0x61, + 0x86, + 0xC2, + 0x43, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x01, + 0x80, + 0x01, + 0x00, + 0x00, + 0x00, + 0x00, + }, + /*.icon_color = */ ui::Color::cyan().v, + /*.menu_location = */ app_location_t::UTILITIES, + /*.desired_menu_position = */ -1, + + /*.m4_app_tag = portapack::spi_flash::image_tag_none */ {'P', 'A', 'B', 'P'}, + /*.m4_app_offset = */ 0x00000000, // will be filled at compile time +}; +} diff --git a/firmware/application/external/tuner/ui_tuner.cpp b/firmware/application/external/tuner/ui_tuner.cpp new file mode 100644 index 00000000..5aa9e1c0 --- /dev/null +++ b/firmware/application/external/tuner/ui_tuner.cpp @@ -0,0 +1,256 @@ +/* + * copyleft 2024 sommermorgentraum + * + * 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 "ui_tuner.hpp" +#include "baseband_api.hpp" +#include "audio.hpp" +#include "portapack.hpp" + +using namespace portapack; + +namespace ui::external_app::tuner { + +TunerView::TunerView(NavigationView& nav) + : nav_{nav} { + baseband::run_prepared_image(portapack::memory::map::m4_code.base()); // proc_audio_beep baseband is external too + + add_children({ + &labels, + &field_volume, + &options_instrument, + &options_note, + &button_play_stop, + &text_note_frequency, + &text_note_octave_shift, + }); + + audio::set_rate(audio::Rate::Hz_24000); + + options_instrument.on_change = [this](size_t, int32_t value) { + const Instrument* selected_instrument = nullptr; + + switch (value) { + case 0: + selected_instrument = &guitar; + break; + case 1: + selected_instrument = &violin; + break; + case 2: + selected_instrument = &pitch_fork; + break; + } + + if (selected_instrument) { + update_notes_for_instrument(*selected_instrument); + } + + update_current_note(); + }; + + options_note.on_change = [this](size_t, int32_t index) { + const Instrument* current_instrument = nullptr; + switch (options_instrument.selected_index_value()) { + case 0: + current_instrument = &guitar; + break; + case 1: + current_instrument = &violin; + break; + case 2: + current_instrument = &pitch_fork; + break; + } + + if (current_instrument) { + auto it = current_instrument->notes.begin(); + std::advance(it, index); + if (it != current_instrument->notes.end()) { + current_note_frequency = it->second.frequency; + current_note_sample_rate = it->second.sample_rate; + current_note_octave_shift = it->second.octave_shift; + } + } + + update_current_note(); + }; + + button_play_stop.on_select = [this]() { + if (current_note_playing) { + stop_play(); + } else { + play_change_note(); + } + }; + + options_instrument.set_selected_index(0); + update_notes_for_instrument(guitar); + update_current_note(); + + field_volume.set_value(0); // seems that a change is required to force update, so setting to 0 first + field_volume.set_value(99); + + audio::set_rate(audio::Rate::Hz_24000); + audio::output::start(); +} + +TunerView::~TunerView() { + receiver_model.disable(); + baseband::shutdown(); + audio::output::stop(); +} + +void TunerView::focus() { + options_instrument.focus(); +} + +void TunerView::update_notes_for_instrument(const Instrument& instrument) { + std::vector note_options; + size_t index = 0; + + for (const auto& note_pair : instrument.notes) { + note_options.emplace_back(OptionsField::option_t{ + note_pair.first, + index++}); + } + + options_note.set_options(note_options); + if (!note_options.empty()) { + options_note.set_selected_index(0); + } +} + +void TunerView::update_current_note() { + const Instrument* current_instrument = nullptr; + + switch (options_instrument.selected_index_value()) { + case 0: + current_instrument = &guitar; + break; + case 1: + current_instrument = &violin; + break; + case 2: + current_instrument = &pitch_fork; + break; + } + + if (current_instrument) { + std::string note_name = options_note.selected_index_name(); + + // map + auto note_it = current_instrument->notes.find(note_name); + if (note_it != current_instrument->notes.end()) { + current_note_frequency = note_it->second.frequency; + current_note_sample_rate = note_it->second.sample_rate; + current_note_octave_shift = note_it->second.octave_shift; + + text_note_frequency.set(std::to_string(current_note_frequency)); + text_note_octave_shift.set(std::to_string(current_note_octave_shift)); + + set_dirty(); + + if (current_note_playing) { + play_change_note(); + } + } + } +} + +void TunerView::stop_play() { + baseband::request_beep_stop(); + current_note_playing = false; + button_play_stop.set_bitmap(&bitmap_icon_replay); +} + +void TunerView::play_change_note() { + if (current_note_playing) { + baseband::request_beep_stop(); + audio::set_rate(current_note_sample_rate); + baseband::request_audio_beep(current_note_frequency, protected_sample_rate(current_note_sample_rate), 0); + } else { + audio::set_rate(current_note_sample_rate); + baseband::request_audio_beep(current_note_frequency, protected_sample_rate(current_note_sample_rate), 0); + } + current_note_playing = true; + button_play_stop.set_bitmap(&bitmap_icon_sleep); + set_dirty(); +} + +uint32_t TunerView::protected_sample_rate(audio::Rate r) { + switch (r) { + case audio::Rate::Hz_12000: + return 12000; + case audio::Rate::Hz_24000: + return 24000; + case audio::Rate::Hz_48000: + return 48000; + default: + return 24000; + } +} + +void TunerView::paint(Painter& painter) { + View::paint(painter); + + painter.fill_rectangle( + {screen_width / 4, 8 * 16, screen_width / 2, 6 * 16}, + Theme::getInstance()->bg_darkest->background); + + if (!current_note_playing) return; + + painter.fill_rectangle( + {screen_width / 4, 10 * 16, 2, 2 * 16}, + Theme::getInstance()->fg_light->foreground); + + painter.fill_rectangle( + {screen_width / 4, 12 * 16, screen_width / 4 * 2 + 2, 2}, + Theme::getInstance()->fg_light->foreground); + + painter.fill_rectangle( + {(screen_width / 4) * 3, 10 * 16, 2, 2 * 16}, + Theme::getInstance()->fg_light->foreground); + + painter.draw_string( + {screen_width / 4 - 2 * 8, 8 * 16}, + (current_note_octave_shift == 0) ? *Theme::getInstance()->bg_darkest : *Theme::getInstance()->fg_red, + std::to_string(current_note_frequency)); + + int16_t real_frequency = current_note_frequency; + if (current_note_octave_shift > 0) { + for (int i = 0; i < current_note_octave_shift; i++) { + real_frequency *= 2; + } + } else if (current_note_octave_shift < 0) { + for (int i = 0; i > current_note_octave_shift; i--) { + real_frequency /= 2; + } + } + painter.draw_string({(screen_width / 4) * 3 - 2 * 8, 8 * 16}, + (current_note_octave_shift == 0) ? *Theme::getInstance()->bg_darkest : *Theme::getInstance()->fg_red, + std::to_string(real_frequency)); + + painter.draw_string({screen_width / 2 - 3 * 16, 13 * 16}, + (current_note_octave_shift == 0) ? *Theme::getInstance()->bg_darkest : *Theme::getInstance()->fg_red, + std::to_string(current_note_octave_shift) + " * 8ev"); +} + +} // namespace ui::external_app::tuner diff --git a/firmware/application/external/tuner/ui_tuner.hpp b/firmware/application/external/tuner/ui_tuner.hpp new file mode 100644 index 00000000..7b76d040 --- /dev/null +++ b/firmware/application/external/tuner/ui_tuner.hpp @@ -0,0 +1,145 @@ +/* + * copyleft 2024 sommermorgentraum + * + * 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 __UI_TUNER_H__ +#define __UI_TUNER_H__ + +#include "ui_navigation.hpp" +#include "ui_receiver.hpp" +#include "audio.hpp" + +namespace ui::external_app::tuner { + +struct Instrument { + std::string name; + struct NoteInfo { + uint16_t frequency; + audio::Rate sample_rate; // tune samplerate to allow for freqs + int8_t octave_shift; + // PP hardware can't handle some extremely low/high frequencies, this indicates how much the freq that were played is shifted up/down, + // for example, if shift is -2 and note is A3, it means the real string should play A5 but PP's speaker plays A3 + }; + std::map notes; // this is for fast looking : O(log(n)) , usage `auto note = guitar.notes["A4"];` +}; + +class TunerView : public View { + public: + TunerView(NavigationView& nav); + ~TunerView(); + TunerView(const TunerView& other) = delete; + TunerView& operator=(const TunerView& other) = delete; + + void focus() override; + void update_audio_beep(); + + std::string title() const override { return "Tuner"; }; + + private: + NavigationView& nav_; + bool beep{false}; + + void update_notes_for_instrument(const Instrument& instrument); + void play_change_note(); + void stop_play(); + void update_current_note(); + uint32_t protected_sample_rate(audio::Rate r); + void paint(Painter& painter) override; + + uint16_t current_note_frequency{440}; + audio::Rate current_note_sample_rate{audio::Rate::Hz_12000}; + int8_t current_note_octave_shift{0}; + bool current_note_playing{false}; + + Labels labels{ + {{0 * 8, 1 * 16}, "Instrument:", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 2 * 16}, "Note:", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 3 * 16}, "Note Frequency:", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 4 * 16}, "Note Octave Shift:", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 5 * 16}, "Volume:", Theme::getInstance()->fg_light->foreground}}; + + Text text_note_frequency{ + {(sizeof("Note Frequency:") + 1) * 8, 3 * 16, screen_width - (sizeof("Note Frequency:") + 1) * 8, 16}, + "", + }; + + Text text_note_octave_shift{ + {(sizeof("Note Octave Shift:") + 1) * 8, 4 * 16, screen_width - (sizeof("Note Octave Shift:") + 1) * 8, 16}, + "", + }; + + AudioVolumeField field_volume{ + {(sizeof("Volume:") + 1) * 8, 5 * 16}}; + + // TODO: load list runtime + OptionsField options_instrument{ + {(sizeof("Instrument:") + 1) * 8, 1 * 16}, + screen_width - (sizeof("Instrument:") + 1) * 8, + {{"Guitar", 0}, + {"Violin", 1}, + {"Pitch Fork", 2}}}; + + OptionsField options_note{ + {(sizeof("Note:") + 1) * 8, 2 * 16}, + screen_width - (sizeof("Note:") + 1) * 8, + {}}; + + NewButton button_play_stop{ + {0 * 8, 16 * 16, screen_width, screen_height - 16 * 16}, + {}, + &bitmap_icon_replay, + Theme::getInstance()->fg_red->foreground}; + + // TODO: load from file DB + const Instrument guitar = { + .name = "Folk Guitar", + .notes = { + {"E2", {165, audio::Rate::Hz_12000, -1}}, // actual: E2, PP speaker: E3 + {"A2", {110, audio::Rate::Hz_12000, 0}}, + {"D3", {147, audio::Rate::Hz_12000, 0}}, + {"G3", {196, audio::Rate::Hz_24000, 0}}, + {"B3", {247, audio::Rate::Hz_24000, 0}}, + {"E4", {330, audio::Rate::Hz_24000, 0}}}}; + + const Instrument violin = { + .name = "Violin 440 Standard, 12ET", + .notes = { + {"G3", {196, audio::Rate::Hz_12000, 0}}, + {"D4", {294, audio::Rate::Hz_24000, 0}}, + {"A4", {440, audio::Rate::Hz_48000, 0}}, + {"E5", {659, audio::Rate::Hz_48000, 0}}}}; + + const Instrument pitch_fork = {// freq copied from flipper app + .name = "Pitch Fork", + .notes = { + {"12ET A4", {440, audio::Rate::Hz_48000, 0}}, + {"Sarti's A4", {436, audio::Rate::Hz_48000, 0}}, + {"1858 A4", {435, audio::Rate::Hz_48000, 0}}, + {"Verdi's A4", {432, audio::Rate::Hz_48000, 0}}}}; + + std::map instruments{ + {"Guitar", guitar}, + {"Violin", violin}, + {"Pitch Fork", pitch_fork}}; +}; + +} // namespace ui::external_app::tuner + +#endif /*__UI_TUNER_H__*/ diff --git a/firmware/application/external/wardrivemap/main.cpp b/firmware/application/external/wardrivemap/main.cpp index fb5fb7eb..4da13113 100644 --- a/firmware/application/external/wardrivemap/main.cpp +++ b/firmware/application/external/wardrivemap/main.cpp @@ -75,6 +75,7 @@ __attribute__((section(".external_app.app_wardrivemap.application_information"), }, /*.icon_color = */ ui::Color::yellow().v, /*.menu_location = */ app_location_t::UTILITIES, + /*.desired_menu_position = */ -1, /*.m4_app_tag = portapack::spi_flash::image_tag_none */ {0, 0, 0, 0}, /*.m4_app_offset = */ 0x00000000, // will be filled at compile time diff --git a/firmware/application/file_path.cpp b/firmware/application/file_path.cpp index a56e141f..ce4acf48 100644 --- a/firmware/application/file_path.cpp +++ b/firmware/application/file_path.cpp @@ -30,6 +30,7 @@ const std::filesystem::path audio_dir = u"AUDIO"; const std::filesystem::path blerx_dir = u"BLERX"; const std::filesystem::path bletx_dir = u"BLETX"; const std::filesystem::path captures_dir = u"CAPTURES"; +const std::filesystem::path cvsfiles_dir = u"CVSFILES"; const std::filesystem::path debug_dir = u"DEBUG"; const std::filesystem::path firmware_dir = u"FIRMWARE"; const std::filesystem::path freqman_dir = u"FREQMAN"; @@ -47,3 +48,4 @@ const std::filesystem::path splash_dir = u"SPLASH"; const std::filesystem::path sstv_dir = u"SSTV"; const std::filesystem::path wav_dir = u"WAV"; const std::filesystem::path whipcalc_dir = u"WHIPCALC"; +const std::filesystem::path ook_editor_dir = u"OOKFILES"; diff --git a/firmware/application/file_path.hpp b/firmware/application/file_path.hpp index 802ee868..bc115736 100644 --- a/firmware/application/file_path.hpp +++ b/firmware/application/file_path.hpp @@ -32,6 +32,7 @@ extern const std::filesystem::path audio_dir; extern const std::filesystem::path blerx_dir; extern const std::filesystem::path bletx_dir; extern const std::filesystem::path captures_dir; +extern const std::filesystem::path cvsfiles_dir; extern const std::filesystem::path debug_dir; extern const std::filesystem::path firmware_dir; extern const std::filesystem::path freqman_dir; @@ -49,5 +50,6 @@ extern const std::filesystem::path splash_dir; extern const std::filesystem::path sstv_dir; extern const std::filesystem::path wav_dir; extern const std::filesystem::path whipcalc_dir; +extern const std::filesystem::path ook_editor_dir; #endif /* __FILE_PATH_H__ */ diff --git a/firmware/application/flipper_subfile.cpp b/firmware/application/flipper_subfile.cpp index 7cca20cc..fe57d976 100644 --- a/firmware/application/flipper_subfile.cpp +++ b/firmware/application/flipper_subfile.cpp @@ -29,13 +29,16 @@ namespace fs = std::filesystem; using namespace std::literals; -const std::string_view filetype_name = "Filetype"sv; -const std::string_view frequency_name = "Frequency"sv; -const std::string_view latitude_name = "Latitute"sv; -const std::string_view longitude_name = "Longitude"sv; -const std::string_view protocol_name = "Protocol"sv; -const std::string_view preset_name = "Preset"sv; -const std::string_view te_name = "TE"sv; // only in BinRAW +const std::string filetype_name = "Filetype"; +const std::string frequency_name = "Frequency"; +const std::string latitude_name_old = "Latitute"; +const std::string longitude_name_old = "Longitude"; +const std::string latitude_name = "Lat"; +const std::string longitude_name = "Lon"; +const std::string protocol_name = "Protocol"; +const std::string preset_name = "Preset"; +const std::string te_name = "TE"; // only in BinRAW +const std::string bit_count_name = "Bit"; // for us, only in BinRAW /* Filetype: Flipper SubGhz Key File @@ -70,35 +73,54 @@ raw_data- positive: carrier for n time, negative: no carrier for n time. (us) Optional read_flippersub_file(const fs::path& path) { File f; auto error = f.open(path); - if (error) return {}; - flippersub_metadata metadata{}; - auto reader = FileLineReader(f); - for (const auto& line : reader) { - auto cols = split_string(line, ':'); - - if (cols.size() != 2) + char ch = 0; + std::string line = ""; + auto fr = f.read(&ch, 1); + while (!fr.is_error() && fr.value() > 0) { + if (line.length() < 130 && ch != '\n') line += ch; + if (ch != '\n') { + fr = f.read(&ch, 1); + continue; + } + auto it = line.find(':', 0); + if (it == std::string::npos) { + fr = f.read(&ch, 1); continue; // Bad line. - if (cols[1].length() <= 1) continue; - std::string fixed = cols[1].data() + 1; + } + std::string fixed = line.data() + it + 1; fixed = trim(fixed); - if (cols[0] == filetype_name) { + std::string head = line.substr(0, it); + line = ""; + + if (fixed.length() <= 1) { + fr = f.read(&ch, 1); + continue; + } + + if (head == filetype_name) { if (fixed != "Flipper SubGhz Key File" && fixed != "Flipper SubGhz RAW File") return {}; // not supported - } else if (cols[0] == frequency_name) + } else if (head == frequency_name) parse_int(fixed, metadata.center_frequency); - else if (cols[0] == latitude_name) + else if (head == latitude_name) parse_float_meta(fixed, metadata.latitude); - else if (cols[0] == longitude_name) + else if (head == longitude_name) parse_float_meta(fixed, metadata.longitude); - else if (cols[0] == protocol_name) { + else if (head == latitude_name_old) + parse_float_meta(fixed, metadata.latitude); + else if (head == longitude_name_old) + parse_float_meta(fixed, metadata.longitude); + else if (head == protocol_name) { if (fixed == "RAW") metadata.protocol = FLIPPER_PROTO_RAW; if (fixed == "BinRAW") metadata.protocol = FLIPPER_PROTO_BINRAW; - } else if (cols[0] == te_name) { + } else if (head == te_name) { metadata.te = atoi(fixed.c_str()); - } else if (cols[0] == preset_name) { + } else if (head == bit_count_name) { + metadata.binraw_bit_count = atol(fixed.c_str()); + } else if (head == preset_name) { if (fixed.find("FSK") != std::string::npos) { metadata.preset = FLIPPER_PRESET_2FSK; } else if (fixed.find("Ook") != std::string::npos) { @@ -106,12 +128,92 @@ Optional read_flippersub_file(const fs::path& path) { } else if (fixed.find("Custom") != std::string::npos) { metadata.preset = FLIPPER_PRESET_CUSTOM; } - - } else - continue; + } + fr = f.read(&ch, 1); } - + f.close(); if (metadata.center_frequency == 0) return {}; // Parse failed. return metadata; } + +bool seek_flipper_raw_first_data(File& f) { + f.seek(0); + std::string chs = ""; + char ch; + while (f.read(&ch, 1)) { + if (ch == '\r') continue; + if (ch == '\n') { + chs = ""; + continue; + }; + chs += ch; + if (ch == 0) break; + if (chs == "RAW_Data: ") { + return true; + } + } + return false; +} +bool seek_flipper_binraw_first_data(File& f, bool seekzero) { + if (seekzero) f.seek(0); + std::string chs = ""; + char ch; + while (f.read(&ch, 1)) { + if (ch == '\r') continue; + if (ch == '\n') { + chs = ""; + continue; + }; + if (ch == 0) break; + chs += ch; + if (chs == "Data_RAW: ") { + return true; + } + } + return false; +} + +Optional read_flipper_raw_next_data(File& f) { + // RAW_Data: 5832 -12188 130 -162 + std::string chs = ""; + char ch = 0; + while (f.read(&ch, 1).is_ok()) { + if (ch == '\r') continue; // should not present + if ((ch == ' ') || ch == '\n') { + if (chs == "RAW_Data:") { + chs = ""; + continue; + } + break; + }; + if (ch == 0) break; + chs += ch; + } + if (chs == "") return {}; + return atol(chs.c_str()); +} + +Optional read_flipper_binraw_next_data(File& f) { + // Data_RAW: 02 10 84 BUT THERE ARE Bit_RAW lines to skip! + std::string chs = ""; + char ch = 0; + while (f.read(&ch, 1)) { + if (ch == '\r') continue; // should not present + if ((ch == ' ') || ch == '\n') { + if (chs == "RAW_Data:") { + chs = ""; + continue; + } + break; + }; + if (ch == 0) break; + chs += ch; + } + if (chs == "") return {}; + return static_cast(std::stoul(chs, nullptr, 16)); +} + +bool get_flipper_binraw_bitvalue(uint8_t byte, uint8_t nthBit) { + return (byte & (1 << nthBit)) != 0; +} \ No newline at end of file diff --git a/firmware/application/flipper_subfile.hpp b/firmware/application/flipper_subfile.hpp index 0a123edf..3681c849 100644 --- a/firmware/application/flipper_subfile.hpp +++ b/firmware/application/flipper_subfile.hpp @@ -44,9 +44,15 @@ struct flippersub_metadata { FlipperProto protocol = FLIPPER_PROTO_UNSUPPORTED; FlipperPreset preset = FLIPPER_PRESET_UNK; uint16_t te = 0; + uint32_t binraw_bit_count = 0; }; Optional read_flippersub_file(const std::filesystem::path& path); +bool seek_flipper_raw_first_data(File& f); +bool seek_flipper_binraw_first_data(File& f, bool seekzero = true); +Optional read_flipper_raw_next_data(File& f); +Optional read_flipper_binraw_next_data(File& f); +bool get_flipper_binraw_bitvalue(uint8_t byte, uint8_t nthBit); // Maybe sometime there will be a data part reader / converter diff --git a/firmware/application/freqman.cpp b/firmware/application/freqman.cpp index 17f3d66b..63632ce3 100644 --- a/firmware/application/freqman.cpp +++ b/firmware/application/freqman.cpp @@ -28,8 +28,11 @@ using option_t = ui::OptionsField::option_t; using options_t = ui::OptionsField::options_t; -extern options_t freqman_steps; -extern const option_t* find_by_index(const options_t& options, freqman_index_t index); +using option_db_t = std::pair; +using options_db_t = std::vector; + +extern options_db_t freqman_steps; +extern const option_db_t* find_by_index(const options_db_t& options, freqman_index_t index); /* Option value lookup. */ int32_t freqman_entry_get_step_value(freqman_index_t step) { diff --git a/firmware/application/freqman_db.cpp b/firmware/application/freqman_db.cpp index 61a071e5..89eb52b1 100644 --- a/firmware/application/freqman_db.cpp +++ b/firmware/application/freqman_db.cpp @@ -41,7 +41,7 @@ namespace fs = std::filesystem; const std::filesystem::path freqman_extension{u".TXT"}; // NB: Don't include UI headers to keep this code unit testable. -using option_t = std::pair; +using option_t = std::pair; using options_t = std::vector; options_t freqman_modulations = { @@ -194,27 +194,27 @@ bool operator==(const freqman_entry& lhs, const freqman_entry& rhs) { std::string freqman_entry_get_modulation_string(freqman_index_t modulation) { if (auto opt = find_by_index(freqman_modulations, modulation)) - return opt->first; + return (std::string)opt->first; return {}; } std::string freqman_entry_get_bandwidth_string(freqman_index_t modulation, freqman_index_t bandwidth) { if (modulation < freqman_modulations.size()) { if (auto opt = find_by_index(freqman_bandwidths[modulation], bandwidth)) - return opt->first; + return (std::string)opt->first; } return {}; } std::string freqman_entry_get_step_string(freqman_index_t step) { if (auto opt = find_by_index(freqman_steps, step)) - return opt->first; + return (std::string)opt->first; return {}; } std::string freqman_entry_get_step_string_short(freqman_index_t step) { if (auto opt = find_by_index(freqman_steps_short, step)) - return opt->first; + return (std::string)opt->first; return {}; } diff --git a/firmware/application/i2c_device_to_host.c b/firmware/application/i2c_device_to_host.c new file mode 100644 index 00000000..b243b9a5 --- /dev/null +++ b/firmware/application/i2c_device_to_host.c @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2023 Bernd Herzog + * Copyright (C) 2024 HTotoo + * + * 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 "i2c_device_to_host.h" +#include "i2cdevmanager_c_api.h" +#include + +I2CShellDriver I2CD1; + +// pp to i2c data tx +static void onotifyi2c(GenericQueue* qp) { + I2CShellDriver* sdp = chQGetLink(qp); + uint8_t buff[I2CSHELL_BUFFERS_SIZE]; + int n = chOQGetFullI(&sdp->oqueue); + if (n > I2CSHELL_BUFFERS_SIZE) n = I2CSHELL_BUFFERS_SIZE; // don't overflow + if (n > 0) { + for (int i = 0; i < n; i++) { + buff[i] = chOQGetI(&sdp->oqueue); + } + int ret; + chSysUnlock(); + do { + ret = oNofityI2cFromShell(&buff[0], n); // i2c_write + if (ret == -1) + chThdSleepMilliseconds(1); + } while (ret == -1); + chSysLock(); + } +} + +static size_t write(void* ip, const uint8_t* bp, size_t n) { + return chOQWriteTimeout(&((I2CShellDriver*)ip)->oqueue, bp, + n, TIME_INFINITE); +} + +static size_t read(void* ip, uint8_t* bp, size_t n) { + return chIQReadTimeout(&((I2CShellDriver*)ip)->iqueue, bp, + n, TIME_INFINITE); +} + +static msg_t put(void* ip, uint8_t b) { + return chOQPutTimeout(&((I2CShellDriver*)ip)->oqueue, b, TIME_INFINITE); +} + +static msg_t get(void* ip) { + return chIQGetTimeout(&((I2CShellDriver*)ip)->iqueue, TIME_INFINITE); +} + +static msg_t putt(void* ip, uint8_t b, systime_t timeout) { + return chOQPutTimeout(&((I2CShellDriver*)ip)->oqueue, b, timeout); +} + +static msg_t gett(void* ip, systime_t timeout) { + return chIQGetTimeout(&((I2CShellDriver*)ip)->iqueue, timeout); +} + +static size_t writet(void* ip, const uint8_t* bp, size_t n, systime_t time) { + return chOQWriteTimeout(&((I2CShellDriver*)ip)->oqueue, bp, n, time); +} + +static size_t readt(void* ip, uint8_t* bp, size_t n, systime_t time) { + return chIQReadTimeout(&((I2CShellDriver*)ip)->iqueue, bp, n, time); +} + +static const struct I2CShellDriverVMT vmt = { + write, read, put, get, + putt, gett, writet, readt}; + +void init_i2c_shell_driver(I2CShellDriver* sdp) { + sdp->vmt = &vmt; + chIQInit(&sdp->iqueue, sdp->ib, I2CSHELL_BUFFERS_SIZE, NULL, sdp); + chOQInit(&sdp->oqueue, sdp->ob, I2CSHELL_BUFFERS_SIZE, onotifyi2c, sdp); +} + +// i2c->pp data rx +void complete_i2chost_to_device_transfer(uint8_t* data, size_t length) { + chSysLock(); + for (unsigned int i = 0; i < length; i++) { + msg_t ret; + do { + ret = chIQPutI(&I2CD1.iqueue, data[i]); + if (ret == Q_FULL) { + chSysUnlock(); + chThdSleepMilliseconds(1); // wait for shell thread when buffer is full + chSysLock(); + } + + } while (ret == Q_FULL); + } + chSysUnlock(); +} diff --git a/firmware/application/i2c_device_to_host.h b/firmware/application/i2c_device_to_host.h new file mode 100644 index 00000000..61827106 --- /dev/null +++ b/firmware/application/i2c_device_to_host.h @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 Bernd Herzog + * Copyright (C) 2024 HTotoo + * + * 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 __I2C_DEVICE_TO_HOST_H +#define __I2C_DEVICE_TO_HOST_H + +#include "ch.h" +#include "hal.h" + +#ifndef I2CSHELL_BUFFERS_SIZE +#define I2CSHELL_BUFFERS_SIZE 64 +#endif + +struct I2CShellDriverVMT { + _base_asynchronous_channel_methods +}; + +struct I2CShellDriver { + /** @brief Virtual Methods Table.*/ + const struct I2CShellDriverVMT* vmt; + InputQueue iqueue; /* Output queue.*/ + OutputQueue oqueue; /* Input circular buffer.*/ + uint8_t ib[I2CSHELL_BUFFERS_SIZE]; /* Output circular buffer.*/ + uint8_t ob[I2CSHELL_BUFFERS_SIZE]; +}; + +typedef struct I2CShellDriver I2CShellDriver; + +extern I2CShellDriver I2CD1; + +#ifdef __cplusplus +extern "C" { +#endif +void init_i2c_shell_driver(I2CShellDriver* sdp); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/firmware/application/io.hpp b/firmware/application/io.hpp index ebbf9c45..fcaad0e9 100644 --- a/firmware/application/io.hpp +++ b/firmware/application/io.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __IO_H +#define __IO_H #include "file.hpp" @@ -38,3 +39,5 @@ class Writer { }; } /* namespace stream */ + +#endif diff --git a/firmware/application/io_convert.hpp b/firmware/application/io_convert.hpp index 78014203..0455444f 100644 --- a/firmware/application/io_convert.hpp +++ b/firmware/application/io_convert.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __IO_CONVERT_H +#define __IO_CONVERT_H #include "io_file.hpp" @@ -77,3 +78,5 @@ class FileConvertWriter : public stream::Writer { File file_{}; uint64_t bytes_written_{0}; }; + +#endif diff --git a/firmware/application/io_file.hpp b/firmware/application/io_file.hpp index 5dffa789..c7988ff4 100644 --- a/firmware/application/io_file.hpp +++ b/firmware/application/io_file.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __IO_FILE_H +#define __IO_FILE_H #include "io.hpp" @@ -71,3 +72,5 @@ class FileWriter : public stream::Writer { }; using RawFileWriter = FileWriter; + +#endif diff --git a/firmware/application/io_wave.hpp b/firmware/application/io_wave.hpp index 0293e5f9..6d32454f 100644 --- a/firmware/application/io_wave.hpp +++ b/firmware/application/io_wave.hpp @@ -20,7 +20,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __IO_WAVE_H +#define __IO_WAVE_H #include "io_file.hpp" @@ -181,3 +182,5 @@ class WAVFileWriter : public FileWriter { Optional update_header(); Optional write_tags(); }; + +#endif diff --git a/firmware/application/irq_controls.cpp b/firmware/application/irq_controls.cpp index 06a1d21f..f9b53321 100644 --- a/firmware/application/irq_controls.cpp +++ b/firmware/application/irq_controls.cpp @@ -85,7 +85,7 @@ static bool touch_update() { case IO::TouchPinsConfig::SensePressure: { const auto z1 = samples.xp - samples.xn; const auto z2 = samples.yp - samples.yn; - const auto touch_raw = (z1 > touch::touch_threshold) || (z2 > touch::touch_threshold); + const auto touch_raw = (z1 > portapack::touch_threshold) || (z2 > portapack::touch_threshold); touch_debounce = (touch_debounce << 1) | (touch_raw ? 1U : 0U); touch_detected = ((touch_debounce & touch_debounce_mask) == touch_debounce_mask); if (!touch_detected && !touch_cycle) { diff --git a/firmware/application/main.cpp b/firmware/application/main.cpp index b0f56fec..c1ca5b5c 100755 --- a/firmware/application/main.cpp +++ b/firmware/application/main.cpp @@ -96,7 +96,6 @@ Continuous (Fox-oring) // Multimon-style stuff: // TODO: DMR detector // TODO: GSM channel detector -// TODO: Playdead amnesia and login // TODO: Setup: Play dead by default ? Enable/disable ? // Old or low-priority stuff: @@ -106,7 +105,6 @@ Continuous (Fox-oring) // TODO: Check more OOK encoders // BUG (fixed ?): No audio in about when shown second time // TODO: Show MD5 mismatches for modules not found, etc... -// TODO: Module name/filename in modules.hpp to indicate requirement in case it's not found ui_loadmodule // BUG: Description doesn't show up first time going to system>module info (UI drawn on top) // TODO: Two players tic-tac-toe // TODO: Analog TV pong game @@ -141,6 +139,7 @@ Continuous (Fox-oring) #include "sd_card.hpp" #include +#include "i2cdevmanager.hpp" #include "rffc507x.hpp" /* c/m, avoiding initial short ON Ant_DC_Bias pulse, from cold reset */ rffc507x::RFFC507x first_if; @@ -161,6 +160,7 @@ static void event_loop() { event_dispatcher.set_display_sleep(true); }}; portapack::setEventDispatcherToUSBSerial(&event_dispatcher); + i2cdev::I2CDevManager::setEventDispatcher(&event_dispatcher); system_view.get_navigation_view()->handle_autostart(); event_dispatcher.run(); } diff --git a/firmware/application/ook_file.cpp b/firmware/application/ook_file.cpp new file mode 100644 index 00000000..a3515fe9 --- /dev/null +++ b/firmware/application/ook_file.cpp @@ -0,0 +1,158 @@ +/* + * Copyright (C) 2024 gullradriel + * + * 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 "ook_file.hpp" + +using namespace portapack; +namespace fs = std::filesystem; + +/* + struct of an OOK file: + + Frequency SampleRate SymbolRate Repeat PauseSymbolDuration Payload + + -Frequency is in hertz + -SampleRate is one of 250k, 1M, 2M, 5M , 10M ,20M + -SymbolRate is the number of symbols /s + -Repeat is the number of times we will repeat the payload + -PauseSymbolDuration is the duration of the pause between repeat, in usec + -Payload is the payload in form of a string of 0 and 1 +*/ + +bool read_ook_file(const std::filesystem::path& path, ook_file_data& ook_data) { + File data_file; + auto open_result = data_file.open(path); + if (open_result) { + return false; + } + + FileLineReader reader(data_file); + + for (const auto& line : reader) { + // Split the line into segments to extract each value + size_t first_space = line.find(' '); + size_t second_space = line.find(' ', first_space + 1); + size_t third_space = line.find(' ', second_space + 1); + size_t fourth_space = line.find(' ', third_space + 1); + size_t fifth_space = line.find(' ', fourth_space + 1); + + // Extract each component of the line + std::string frequency_str = line.substr(0, first_space); + std::string sample_rate_str = line.substr(first_space + 1, second_space - first_space - 1); + std::string symbol_rate_str = line.substr(second_space + 1, third_space - second_space - 1); + std::string repeat_str = line.substr(third_space + 1, fourth_space - third_space - 1); + std::string pause_symbol_duration_str = line.substr(fourth_space + 1, fifth_space - fourth_space - 1); + std::string payload_data = line.substr(fifth_space + 1); // Extract binary payload as final value + + // Convert and assign frequency + ook_data.frequency = std::stoull(frequency_str); + // Convert and assign symbol_rate + ook_data.symbol_rate = static_cast(atoi(symbol_rate_str.c_str())); + // Convert and assign repeat count + ook_data.repeat = static_cast(atoi(repeat_str.c_str())); + // Convert and assign pause_symbol_duration + ook_data.pause_symbol_duration = static_cast(atoi(pause_symbol_duration_str.c_str())); + // Select sample rate based on value read from file + if (sample_rate_str == "250k") { + ook_data.sample_rate = 250000U; + } else if (sample_rate_str == "1M") { + ook_data.sample_rate = 1000000U; + } else if (sample_rate_str == "2M") { + ook_data.sample_rate = 2000000U; + } else if (sample_rate_str == "5M") { + ook_data.sample_rate = 5000000U; + } else if (sample_rate_str == "10M") { + ook_data.sample_rate = 10000000U; + } else if (sample_rate_str == "20M") { + ook_data.sample_rate = 20000000U; + } else { + return false; + } + // Update payload with binary data + ook_data.payload = std::move(payload_data); + // Process only the first line + break; + } + return true; +} + +bool save_ook_file(ook_file_data& ook_data, const std::filesystem::path& path) { + // delete file if it exists + delete_file(path); + + // Attempt to open, if it can't be opened. Create new. + auto src = std::make_unique(); + auto error = src->open(path, false, true); + if (error) { + return false; + } + + std::string sample_rate_str; + if (ook_data.sample_rate == 250000U) { + sample_rate_str = "250k"; + } else if (ook_data.sample_rate == 1000000U) { + sample_rate_str = "1M"; + } else if (ook_data.sample_rate == 2000000U) { + sample_rate_str = "2M"; + } else if (ook_data.sample_rate == 5000000U) { + sample_rate_str = "5M"; + } else if (ook_data.sample_rate == 10000000U) { + sample_rate_str = "10M"; + } else if (ook_data.sample_rate == 20000000U) { + sample_rate_str = "20M"; + } else { + return false; + } + + // write informations + src->write_line(to_string_dec_uint(ook_data.frequency) + " " + + sample_rate_str + " " + + to_string_dec_uint(ook_data.symbol_rate) + " " + + to_string_dec_uint(ook_data.repeat) + " " + + to_string_dec_uint(ook_data.pause_symbol_duration) + " " + + ook_data.payload); + + // Close files + src.reset(); + + return true; +} + +void start_ook_file_tx(ook_file_data& ook_data) { + size_t bitstream_length = encoders::make_bitstream(const_cast(ook_data.payload)); // Convert the message into a bitstream + + transmitter_model.set_target_frequency(ook_data.frequency); // Set target frequency + transmitter_model.set_sampling_rate(ook_data.sample_rate); // Set the OOK sampling rate + transmitter_model.set_baseband_bandwidth(1750000); // Set the baseband bandwidth + transmitter_model.enable(); // Enable the transmitter + + // Configure OOK data and transmission characteristics + baseband::set_ook_data( + bitstream_length, // Length of the bitstream to transmit + ook_data.sample_rate / ook_data.symbol_rate, // Calculate symbol period based on repetition rate + ook_data.repeat, // Set the number of times the whole bitstream is repeated + ook_data.pause_symbol_duration // Set the pause_symbol between reps + ); +} + +void stop_ook_file_tx() { + transmitter_model.disable(); // Disable the transmitter +} diff --git a/firmware/application/ook_file.hpp b/firmware/application/ook_file.hpp new file mode 100644 index 00000000..03ddaace --- /dev/null +++ b/firmware/application/ook_file.hpp @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2024 gullradriel + * + * 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 __OOK_FILE_HPP__ +#define __OOK_FILE_HPP__ + +#include "portapack.hpp" +#include "metadata_file.hpp" +#include "encoders.hpp" // Includes data encoding functions for transmission +#include "convert.hpp" +#include "file_reader.hpp" +#include "string_format.hpp" +#include +#include "transmitter_model.hpp" +#include "baseband_api.hpp" // Includes baseband API for handling transmission settings + +struct ook_file_data { + rf::Frequency frequency = rf::Frequency(0); // Default frequency + uint32_t sample_rate = 0; // Default sample rate + uint16_t symbol_rate = 0; // Default bit duration + uint16_t pause_symbol_duration = 0; // Default pause between repeat + uint16_t repeat = 0; // Default repeat + std::string payload = ""; // Default payload +}; + +bool read_ook_file(const std::filesystem::path& path, ook_file_data& ook_data); +bool save_ook_file(ook_file_data& data, const std::filesystem::path& path); +void start_ook_file_tx(ook_file_data& ook_data); +void stop_ook_file_tx(); + +#endif // __FLIPPER_SUBFILE_HPP__ diff --git a/firmware/application/portapack.cpp b/firmware/application/portapack.cpp index 7520a7c7..251a265a 100644 --- a/firmware/application/portapack.cpp +++ b/firmware/application/portapack.cpp @@ -53,6 +53,8 @@ using asahi_kasei::ak4951::AK4951; #include "string_format.hpp" #include "bitmap.hpp" #include "ui_widget.hpp" +#include "i2cdevmanager.hpp" +#include "battery.hpp" namespace portapack { @@ -93,6 +95,7 @@ TemperatureLogger temperature_logger; bool antenna_bias{false}; uint32_t bl_tick_counter{0}; +uint16_t touch_threshold{32}; void set_antenna_bias(const bool v) { antenna_bias = v; @@ -536,6 +539,11 @@ init_status_t init() { set_cpu_clock_speed(); if (persistent_memory::config_lcd_inverted_mode()) display.set_inverted(true); + /* sample max: 1023 sample_t AKA uint16_t + * touch_sensitivity: range: 1 to 128 + * threshold range: 1023/1 to 1023/128 = 1023 to 8 + */ + touch_threshold = portapack::persistent_memory::touchscreen_threshold(); if (lcd_fast_setup) draw_splash_screen_icon(0, ui::bitmap_icon_memory); @@ -588,7 +596,8 @@ init_status_t init() { chThdSleepMilliseconds(10); audio::init(portapack_audio_codec()); - battery::BatteryManagement::init(persistent_memory::ui_override_batt_calc()); + battery::BatteryManagement::set_calc_override(persistent_memory::ui_override_batt_calc()); + i2cdev::I2CDevManager::init(); if (lcd_fast_setup) draw_splash_screen_icon(4, ui::bitmap_icon_speaker); diff --git a/firmware/application/portapack.hpp b/firmware/application/portapack.hpp index 7a446ed4..a13b987b 100644 --- a/firmware/application/portapack.hpp +++ b/firmware/application/portapack.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __PORTAPACK_H +#define __PORTAPACK_H #include "portapack_io.hpp" @@ -33,13 +34,9 @@ #include "backlight.hpp" #include "usb_serial.hpp" -#include "ads1110.hpp" -#include "max17055.hpp" - #include "radio.hpp" #include "clock_manager.hpp" #include "temperature_logger.hpp" -#include "battery.hpp" #include "theme.hpp" /* TODO: This would be better as a class to add @@ -71,6 +68,7 @@ extern TransmitterModel transmitter_model; extern uint32_t bl_tick_counter; extern bool antenna_bias; +extern uint16_t touch_threshold; extern TemperatureLogger temperature_logger; @@ -89,3 +87,5 @@ Backlight* backlight(); extern bool async_tx_enabled; // this is for serial tx things, globally } /* namespace portapack */ + +#endif diff --git a/firmware/application/tone_key.cpp b/firmware/application/tone_key.cpp index 41e3aec2..291a42c0 100644 --- a/firmware/application/tone_key.cpp +++ b/firmware/application/tone_key.cpp @@ -96,7 +96,7 @@ float tone_key_frequency(tone_index index) { std::string tone_key_string(tone_index index) { if (index < 0 || (unsigned)index >= tone_keys.size()) return std::string(""); - return tone_keys[index].first; + return (std::string)tone_keys[index].first; } // Return string showing frequency only from specific table index diff --git a/firmware/application/tone_key.hpp b/firmware/application/tone_key.hpp index 13eae1b4..0f57e90f 100644 --- a/firmware/application/tone_key.hpp +++ b/firmware/application/tone_key.hpp @@ -26,6 +26,7 @@ #include #include +#include #include namespace tonekey { @@ -35,7 +36,7 @@ namespace tonekey { #define F2Ix100(x) (int32_t)(x * 100.0 + 0.5) // add 0.5f to round vs truncate during FP->int conversion using tone_index = int32_t; -using tone_key_t = std::vector>; +using tone_key_t = std::vector>; extern const tone_key_t tone_keys; diff --git a/firmware/application/touch.hpp b/firmware/application/touch.hpp index 2594d40a..91758dfc 100644 --- a/firmware/application/touch.hpp +++ b/firmware/application/touch.hpp @@ -36,14 +36,6 @@ namespace touch { using sample_t = uint16_t; -constexpr sample_t sample_max = 1023; - -// If you have a dead bottom-left corner try to increase the sensitivity, -// but look for flickering touch indicator in the Buttons test screen -// in which case decrease sensitivity to avoid killing backlight timeout -constexpr sample_t touch_sensitivity = 32; -constexpr sample_t touch_threshold = sample_max / touch_sensitivity; - struct Samples { sample_t xp; sample_t xn; diff --git a/firmware/application/ui/ui_btngrid.cpp b/firmware/application/ui/ui_btngrid.cpp index 8c6b60be..d9646c6a 100644 --- a/firmware/application/ui/ui_btngrid.cpp +++ b/firmware/application/ui/ui_btngrid.cpp @@ -118,30 +118,36 @@ void BtnGridView::clear() { menu_item_views.clear(); } -void BtnGridView::add_items(std::initializer_list new_items) { +void BtnGridView::add_items(std::initializer_list new_items, bool inhibit_update) { for (auto item : new_items) { if (!blacklisted_app(item)) menu_items.push_back(item); } - update_items(); -} - -void BtnGridView::add_item(GridItem new_item) { - if (!blacklisted_app(new_item)) { - menu_items.push_back(new_item); + if (!inhibit_update) { update_items(); } } -void BtnGridView::insert_item(GridItem new_item, uint8_t position) { +void BtnGridView::add_item(const GridItem& new_item, bool inhibit_update) { + if (!blacklisted_app(new_item)) { + menu_items.push_back(new_item); + if (!inhibit_update) { + update_items(); + } + } +} + +void BtnGridView::insert_item(const GridItem& new_item, size_t position, bool inhibit_update) { if (!blacklisted_app(new_item)) { if (position < menu_items.size()) { auto pos_iter = menu_items.begin() + position; menu_items.insert(pos_iter, new_item); - update_items(); } else { menu_items.push_back(new_item); + } + + if (!inhibit_update) { update_items(); } } diff --git a/firmware/application/ui/ui_btngrid.hpp b/firmware/application/ui/ui_btngrid.hpp index b20a3433..e862b2c7 100644 --- a/firmware/application/ui/ui_btngrid.hpp +++ b/firmware/application/ui/ui_btngrid.hpp @@ -59,9 +59,9 @@ class BtnGridView : public View { ~BtnGridView(); - void add_items(std::initializer_list new_items); - void add_item(GridItem new_item); - void insert_item(GridItem new_item, uint8_t position); + void add_items(std::initializer_list new_items, bool inhibit_update = false); + void add_item(const GridItem& new_item, bool inhibit_update = false); + void insert_item(const GridItem& new_item, size_t position, bool inhibit_update = false); void set_max_rows(int rows); int rows(); void clear(); @@ -81,12 +81,13 @@ class BtnGridView : public View { bool on_encoder(const EncoderEvent event) override; bool blacklisted_app(GridItem new_item); + void update_items(); + protected: virtual void on_populate() = 0; private: int rows_{3}; - void update_items(); void on_tick_second(); bool keep_highlight{false}; diff --git a/firmware/application/ui/ui_geomap.hpp b/firmware/application/ui/ui_geomap.hpp index 8133d115..772efeda 100644 --- a/firmware/application/ui/ui_geomap.hpp +++ b/firmware/application/ui/ui_geomap.hpp @@ -344,7 +344,7 @@ class GeoMapView : public View { {0, GeoMap::banner_height, GeoMap::geomap_rect_width, GeoMap::geomap_rect_height}}; Button button_ok{ - {20 * 8, 8, 8 * 8, 2 * 16}, + {screen_width - 15 * 8, 0, 15 * 8, 1 * 16}, "OK"}; }; diff --git a/firmware/application/ui/ui_rssi.cpp b/firmware/application/ui/ui_rssi.cpp index 4d02aab7..de0018f6 100644 --- a/firmware/application/ui/ui_rssi.cpp +++ b/firmware/application/ui/ui_rssi.cpp @@ -100,8 +100,19 @@ void RSSI::paint(Painter& painter) { const Rect r5{r.left() + peak - 3, r.top(), 3, r.height()}; painter.fill_rectangle( r5, - Theme::getInstance()->fg_green->foreground); + Theme::getInstance()->fg_orange->foreground); } + + // dB - x + constexpr int db_min = -80; + constexpr int db_max = 10; + constexpr int db_delta = db_max - db_min; + const range_t x_db_range{0, r.width() - 1}; + const int16_t x_db = x_db_range.clip((db_ - db_min) * r.width() / db_delta); + + const Rect r_db{r.left() + x_db, r.top(), 1, r.height()}; + + if (db_) painter.fill_rectangle(r_db, Color::green()); } else { // vertical bottom to top level meters const range_t y_avg_range{0, r.height() - 1}; @@ -115,7 +126,7 @@ void RSSI::paint(Painter& painter) { // y_min const Rect r0{r.left(), r.bottom() - y_min, r.width(), y_min}; - painter.fill_rectangle( + painter.fill_rectangle( // TODO: the blue plot is broken in vertical bars, not from the dB PR (#2403) r0, Color::blue()); @@ -149,8 +160,18 @@ void RSSI::paint(Painter& painter) { const Rect r5{r.left(), r.bottom() - peak - 3, r.width(), 3}; painter.fill_rectangle( r5, - Color::green()); + Color::orange()); } + + // dB - y + constexpr int db_min = -80; + constexpr int db_max = 10; + constexpr int db_delta = db_max - db_min; + const range_t y_db_range{0, r.height() - 1}; + const int16_t y_db = y_db_range.clip((db_ - db_min) * r.height() / db_delta); + + const Rect r_db{r.left(), r.bottom() - y_db, r.width(), 3}; + if (db_) painter.fill_rectangle(r_db, Color::green()); } if (pitch_rssi_enabled) { baseband::set_pitch_rssi((avg_ - raw_min) * 2000 / raw_delta, true); @@ -159,7 +180,7 @@ void RSSI::paint(Painter& painter) { const Rect r6{r.left(), r.top(), r.width(), r.height()}; painter.draw_rectangle( r6, - Color::white()); + Color::white()); // TODO this and all the following Color struct call should satisfy the new "theme" system ref } } @@ -500,4 +521,8 @@ bool RSSI::on_touch(const TouchEvent event) { return false; } } + +void RSSI::set_db(int16_t db) { + db_ = db; +} } /* namespace ui */ diff --git a/firmware/application/ui/ui_rssi.hpp b/firmware/application/ui/ui_rssi.hpp index 7af30a3c..ade17a15 100644 --- a/firmware/application/ui/ui_rssi.hpp +++ b/firmware/application/ui/ui_rssi.hpp @@ -61,6 +61,7 @@ class RSSI : public Widget { void on_focus() override; bool on_key(const KeyEvent key) override; bool on_touch(const TouchEvent event) override; + void set_db(int16_t db); private: int8_t min_ = 0; @@ -68,6 +69,7 @@ class RSSI : public Widget { int8_t max_ = 0; int8_t peak_ = 0; size_t peak_duration_ = 0; + int16_t db_ = 0; bool instant_exec_{false}; bool pitch_rssi_enabled = false; diff --git a/firmware/application/ui/ui_tone_key.cpp b/firmware/application/ui/ui_tone_key.cpp index 019be359..814eaa35 100644 --- a/firmware/application/ui/ui_tone_key.cpp +++ b/firmware/application/ui/ui_tone_key.cpp @@ -34,7 +34,7 @@ void tone_keys_populate(OptionsField& field) { for (size_t c = 0; c < tone_keys.size(); c++) { auto f = tone_keys[c].second; if ((c != 0) && (f < 1000 * 100)) - tone_name = "CTCSS " + fx100_string(f) + " #" + tone_keys[c].first; + tone_name = "CTCSS " + fx100_string(f) + " #" + (std::string)tone_keys[c].first; else tone_name = tone_keys[c].first; diff --git a/firmware/application/ui_external_items_menu_loader.cpp b/firmware/application/ui_external_items_menu_loader.cpp index b107bc1c..6ec1202b 100644 --- a/firmware/application/ui_external_items_menu_loader.cpp +++ b/firmware/application/ui_external_items_menu_loader.cpp @@ -4,14 +4,39 @@ #include "file_path.hpp" #include "ui_standalone_view.hpp" +#include "i2cdevmanager.hpp" +#include "i2cdev_ppmod.hpp" + namespace ui { /* static */ std::vector> ExternalItemsMenuLoader::bitmaps; -// iterates over all ppma-s, and if it is runnable on the current system, it'll call the callback, and pass info. -/* static */ void ExternalItemsMenuLoader::load_all_external_items_callback(std::function callback) { +// iterates over all possible ext apps-s, and if it is runnable on the current system, it'll call the callback, and pass minimal info. used to print to console, and for autostart setting's app list. where the minimal info is enough +// please keep in sync with load_external_items +/* static */ void ExternalItemsMenuLoader::load_all_external_items_callback(std::function callback, bool module_included) { if (!callback) return; + auto dev = (i2cdev::I2cDev_PPmod*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDECMDL_PPMOD); + + if (dev && module_included) { + auto device_info = dev->readDeviceInfo(); + + if (device_info.has_value()) { + for (uint32_t i = 0; i < device_info->application_count; i++) { + auto appInfo = dev->getStandaloneAppInfo(i); + if (appInfo.has_value() == false) { + continue; + } + + if (appInfo->header_version > CURRENT_STANDALONE_APPLICATION_API_VERSION) + continue; + + AppInfoConsole appInfoConsole = {reinterpret_cast(&appInfo->app_name[0]), reinterpret_cast(&appInfo->app_name[0]), appInfo->menu_location}; + callback(appInfoConsole); + } + } + } + if (sd_card::status() != sd_card::Status::Mounted) return; @@ -33,18 +58,16 @@ namespace ui { continue; bool versionMatches = VERSION_MD5 == application_information.app_version; - if (!versionMatches) continue; - // here the app is startable and good. - std::string appshortname = filePath.filename().string(); - if (appshortname.size() >= 5 && appshortname.substr(appshortname.size() - 5) == ".ppma") { - // Remove the ".ppma" suffix - appshortname = appshortname.substr(0, appshortname.size() - 5); + + if (versionMatches) { + std::string appshortname = filePath.filename().string(); + if (appshortname.size() >= 5 && appshortname.substr(appshortname.size() - 5) == ".ppma") { + // Remove the ".ppma" suffix + appshortname = appshortname.substr(0, appshortname.size() - 5); + } + AppInfoConsole appInfoConsole = {appshortname.c_str(), reinterpret_cast(&application_information.app_name[0]), application_information.menu_location}; + callback(appInfoConsole); } - AppInfoConsole info{ - .appCallName = appshortname.c_str(), - .appFriendlyName = reinterpret_cast(&application_information.app_name[0]), - .appLocation = application_information.menu_location}; - callback(info); } for (const auto& entry : std::filesystem::directory_iterator(apps_dir, u"*.ppmp")) { @@ -61,28 +84,78 @@ namespace ui { if (!readResult) continue; - if (application_information.header_version < CURRENT_STANDALONE_APPLICATION_API_VERSION) + if (application_information.header_version > CURRENT_STANDALONE_APPLICATION_API_VERSION) continue; - // here the app is startable and good. std::string appshortname = filePath.filename().string(); if (appshortname.size() >= 5 && appshortname.substr(appshortname.size() - 5) == ".ppmp") { // Remove the ".ppmp" suffix appshortname = appshortname.substr(0, appshortname.size() - 5); } - AppInfoConsole info{ - .appCallName = appshortname.c_str(), - .appFriendlyName = reinterpret_cast(&application_information.app_name[0]), - .appLocation = application_information.menu_location}; - - callback(info); + AppInfoConsole appInfoConsole = {appshortname.c_str(), reinterpret_cast(&application_information.app_name[0]), application_information.menu_location}; + callback(appInfoConsole); } } -/* static */ std::vector ExternalItemsMenuLoader::load_external_items(app_location_t app_location, NavigationView& nav) { +/* static */ std::vector ExternalItemsMenuLoader::load_external_items(app_location_t app_location, NavigationView& nav) { bitmaps.clear(); - std::vector external_apps; + std::vector external_apps; + + auto dev = (i2cdev::I2cDev_PPmod*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDECMDL_PPMOD); + + if (dev) { + auto device_info = dev->readDeviceInfo(); + + if (device_info.has_value()) { + for (uint32_t i = 0; i < device_info->application_count; i++) { + auto appInfo = dev->getStandaloneAppInfo(i); + if (appInfo.has_value() == false) { + continue; + } + + if (appInfo->menu_location != app_location) { + continue; + } + + if (appInfo->header_version > CURRENT_STANDALONE_APPLICATION_API_VERSION) + continue; + + GridItemEx gridItem = {}; + gridItem.text = reinterpret_cast(&appInfo->app_name[0]); + + gridItem.color = Color((uint16_t)appInfo->icon_color); + + auto dyn_bmp = DynamicBitmap<16, 16>{appInfo->bitmap_data}; + gridItem.bitmap = dyn_bmp.bitmap(); + bitmaps.push_back(std::move(dyn_bmp)); + + gridItem.on_select = [&nav, appInfo, i]() { + auto dev2 = (i2cdev::I2cDev_PPmod*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDECMDL_PPMOD); + if (dev2) { + auto app_image = reinterpret_cast(portapack::memory::map::m4_code.end() - appInfo->binary_size); + for (size_t j = 0; j < appInfo->binary_size; j += 128) { + auto segment = dev2->downloadStandaloneApp(i, j); + if (segment.size() != 128) { + continue; + } + + std::copy(segment.begin(), segment.end(), app_image + j); + } + + if (!run_module_app(nav, app_image, appInfo->binary_size)) { + nav.display_modal("Error", "Unable to run downloaded app."); + } + } else + nav.display_modal("Error", "Unable to download app."); + }; + + gridItem.desired_position = -1; // TODO: Where should we put the module's app icon? First? Last? Also configurable? + + external_apps.push_back(gridItem); + } + } + } if (sd_card::status() != sd_card::Status::Mounted) return external_apps; @@ -109,7 +182,7 @@ namespace ui { bool versionMatches = VERSION_MD5 == application_information.app_version; - GridItem gridItem = {}; + GridItemEx gridItem = {}; gridItem.text = reinterpret_cast(&application_information.app_name[0]); if (versionMatches) { @@ -124,6 +197,8 @@ namespace ui { nav.display_modal("Error", "The .ppma file in your " + apps_dir.string() + "\nfolder can't be read. Please\nupdate your SD Card content."); } }; + + gridItem.desired_position = application_information.desired_menu_position; } else { gridItem.color = Theme::getInstance()->fg_light->foreground; @@ -132,6 +207,8 @@ namespace ui { gridItem.on_select = [&nav]() { nav.display_modal("Error", "The .ppma file in your " + apps_dir.string() + "\nfolder is outdated. Please\nupdate your SD Card content."); }; + + gridItem.desired_position = application_information.desired_menu_position; } external_apps.push_back(gridItem); @@ -157,7 +234,7 @@ namespace ui { if (application_information.header_version > CURRENT_STANDALONE_APPLICATION_API_VERSION) continue; - GridItem gridItem = {}; + GridItemEx gridItem = {}; gridItem.text = reinterpret_cast(&application_information.app_name[0]); gridItem.color = Color((uint16_t)application_information.icon_color); @@ -172,6 +249,8 @@ namespace ui { } }; + gridItem.desired_position = -1; // No desired position support for standalone apps yet + external_apps.push_back(gridItem); } @@ -259,6 +338,7 @@ namespace ui { return true; } +// TODO: implement baseband image support /* static */ bool ExternalItemsMenuLoader::run_standalone_app(ui::NavigationView& nav, std::filesystem::path filePath) { File app; @@ -266,7 +346,8 @@ namespace ui { if (openError) return false; - auto app_image = std::make_unique(app.size()); + // TODO: move this to m4 memory space + auto app_image = reinterpret_cast(portapack::memory::map::m4_code.end() - app.size()); // read file in 512 byte chunks for (size_t file_read_index = 0; file_read_index < app.size(); file_read_index += std::filesystem::max_file_block_size) { @@ -286,11 +367,25 @@ namespace ui { uint32_t* ptr = reinterpret_cast(&app_image[file_read_index * 4]); if (*ptr >= 0xADB10000 && *ptr < (0xADB10000 + 64 * 1024)) { - *ptr = *ptr - 0xADB10000 + (uint32_t)app_image.get(); + *ptr = *ptr - 0xADB10000 + (uint32_t)app_image; } } - nav.push(std::move(app_image)); + nav.push(app_image); + return true; +} + +// TODO: implement baseband image support +/* static */ bool ExternalItemsMenuLoader::run_module_app(ui::NavigationView& nav, uint8_t* app_image, size_t app_size) { + for (size_t file_read_index = 0; file_read_index < app_size / 4; file_read_index++) { + uint32_t* ptr = reinterpret_cast(&app_image[file_read_index * 4]); + + if (*ptr >= 0xADB10000 && *ptr < (0xADB10000 + 64 * 1024)) { + *ptr = *ptr - 0xADB10000 + (uint32_t)app_image; + } + } + + nav.push(app_image); return true; } diff --git a/firmware/application/ui_external_items_menu_loader.hpp b/firmware/application/ui_external_items_menu_loader.hpp index 74745d17..59695609 100644 --- a/firmware/application/ui_external_items_menu_loader.hpp +++ b/firmware/application/ui_external_items_menu_loader.hpp @@ -55,11 +55,16 @@ class DynamicBitmap { class ExternalItemsMenuLoader { public: - static std::vector load_external_items(app_location_t, NavigationView&); + struct GridItemEx : GridItem { + int32_t desired_position; + }; + + static std::vector load_external_items(app_location_t, NavigationView&); ExternalItemsMenuLoader() = delete; static bool run_external_app(ui::NavigationView&, std::filesystem::path); static bool run_standalone_app(ui::NavigationView&, std::filesystem::path); - static void load_all_external_items_callback(std::function callback); + static bool run_module_app(ui::NavigationView&, uint8_t*, size_t); + static void load_all_external_items_callback(std::function callback, bool module_included = false); private: static std::vector> bitmaps; diff --git a/firmware/application/ui_handwrite.cpp b/firmware/application/ui_handwrite.cpp deleted file mode 100644 index 4ef103bd..00000000 --- a/firmware/application/ui_handwrite.cpp +++ /dev/null @@ -1,344 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 "ui_handwrite.hpp" - -#include "portapack.hpp" -#include "hackrf_hal.hpp" -#include "portapack_shared_memory.hpp" - -#include - -using namespace portapack; - -namespace ui { - -void HandWriteView::paint(Painter& painter) { - _painter = &painter; -} - -HandWriteView::HandWriteView( - NavigationView& nav, - std::string* str, - size_t max_length) - : TextEntryView(nav, str, max_length) { - size_t n; - - // Handwriting alphabet definition here - handwriting = &handwriting_unistroke; - - add_children({&button_case}); - - const auto button_fn = [this](Button& button) { - this->on_button(button); - }; - - n = 0; - for (auto& button : num_buttons) { - add_child(&button); - button.on_select = button_fn; - button.set_parent_rect({static_cast(n * 24), - static_cast(236), - 24, 28}); - const std::string label{ - (char)(n + '0')}; - button.set_text(label); - button.id = n + '0'; - n++; - } - - n = 0; - for (auto& button : special_buttons) { - add_child(&button); - button.on_select = button_fn; - button.set_parent_rect({static_cast(50 + n * 24), - static_cast(270), - 24, 28}); - const std::string label{ - (char)(special_chars[n])}; - button.set_text(label); - button.id = special_chars[n]; - n++; - } - - button_case.on_select = [this, &nav](Button&) { - if (_lowercase == true) { - _lowercase = false; - button_case.set_text("LC"); - } else { - _lowercase = true; - button_case.set_text("UC"); - } - }; - - button_ok.on_select = [this, &nav](Button&) { - if (on_changed) - on_changed(_str); - nav.pop(); - }; - - update_text(); -} - -bool HandWriteView::on_touch(const TouchEvent event) { - if (event.type == ui::TouchEvent::Type::Start) { - stroke_index = 0; - move_wait = 3; - tracing = true; - } - if (event.type == ui::TouchEvent::Type::End) { - tracing = false; - guess_letter(); - } - if (event.type == ui::TouchEvent::Type::Move) { - if (tracing) - current_pos = event.point; - } - return true; -} - -void HandWriteView::clear_zone(const Color color, const bool flash) { - display.fill_rectangle( - {{0, 32}, {240, 216}}, - color); - if (flash) { - flash_timer = 8; - } else { - // Draw grid - _painter->draw_rectangle( - {{0, 32}, {80, 216}}, - Color::grey()); - _painter->draw_rectangle( - {{80, 32}, {80, 216}}, - Color::grey()); - _painter->draw_rectangle( - {{160, 32}, {80, 216}}, - Color::grey()); - _painter->draw_rectangle( - {{0, 104}, {240, 72}}, - Color::grey()); - } -} - -void HandWriteView::guess_letter() { - uint32_t symbol, match, count, stroke_idx, stroke_data; - Condition cond; - Direction dir; - bool matched; - - // Letter guessing - if (stroke_index) { - for (symbol = 0; symbol < handwriting->letter_count; symbol++) { - count = handwriting->letter[symbol].count; - matched = false; - if (count) { - // We have a count match to do - if ((count == 1) && (stroke_index == 1)) matched = true; - if ((count == 2) && (stroke_index == 2)) matched = true; - if ((count == 3) && (stroke_index > 2)) matched = true; - } else { - matched = true; - } - if (matched) { - for (match = 0; match < 3; match++) { - cond = handwriting->letter[symbol].match[match].cond; - dir = handwriting->letter[symbol].match[match].dir; - if ((cond != cond_empty) && (dir != dir_empty)) { - if (cond == last) { - if (stroke_index) - stroke_idx = stroke_index - 1; - else - stroke_idx = 0; - } else if (cond == stroke_a) - stroke_idx = 0; - else if (cond == stroke_b) - stroke_idx = 1; - else if (cond == stroke_c) - stroke_idx = 2; - else - stroke_idx = 3; - if (stroke_idx >= stroke_index) break; - stroke_data = stroke_list[stroke_idx]; - if ((dir & 0xF0) == 0xF0) { - if ((dir & 0x0F) != (stroke_data & 0x0F)) break; - } else if ((dir & 0x0F) == 0x0F) { - if ((dir & 0xF0) != (stroke_data & 0xF0)) break; - } else { - if (dir != (int32_t)stroke_data) break; - } - } - } - if (match == 3) - break; - else - matched = false; - } - } - if (matched) { - if (symbol) { - if (_lowercase) - char_add('a' + symbol - 1); - else - char_add('A' + symbol - 1); - clear_zone(Color::green(), true); // Green flash - } else { - if (_cursor_pos) { - char_delete(); - clear_zone(Color::yellow(), true); // Yellow flash - } else { - clear_zone(Color::red(), true); // Red flash - } - } - } else { - clear_zone(Color::red(), true); // Red flash - } - } else { - // Short tap is space - char_add(' '); - clear_zone(Color::green(), true); // Green flash - } - update_text(); - stroke_index = 0; -} - -void HandWriteView::add_stroke(uint8_t dir) { - if (stroke_index < 8) { - stroke_list[stroke_index] = dir; - stroke_index++; - } else { - guess_letter(); - } -} - -void HandWriteView::sample_pen() { - int16_t diff_x, diff_y; - uint8_t dir, dir_ud, dir_lr, stroke_prev; - - draw_cursor(); - - if (flash_timer) { - if (flash_timer == 1) clear_zone(Color::black(), false); - flash_timer--; - } - - if (!(sample_skip & 1)) { - if (tracing) { - if (move_wait) { - move_wait--; // ~100ms delay to get rid of jitter from touch start - } else { - diff_x = current_pos.x() - last_pos.x(); - diff_y = current_pos.y() - last_pos.y(); - - if (current_pos.y() <= 240) { - display.fill_rectangle( - {{current_pos.x(), current_pos.y()}, {4, 4}}, - Color::grey()); - } - - dir = 0; // UL by default - if (abs(diff_x) > 7) { - if (diff_x > 0) - dir |= 0x01; // R - } else { - dir |= 0x02; // ? - } - if (abs(diff_y) > 7) { - if (diff_y > 0) - dir |= 0x10; // D - } else { - dir |= 0x20; // ? - } - - // Need at least two identical directions to validate stroke - if ((dir & 0x11) == (dir_prev & 0x11)) - dir_cnt++; - else - dir_cnt = 0; - dir_prev = dir; - - if (dir_cnt > 1) { - dir_cnt = 0; - if (stroke_index) { - if ((stroke_list[stroke_index - 1] != dir) && (dir != 0x22)) { - // Register stroke if different from last one - dir_ud = (dir & 0xF0); - dir_lr = (dir & 0x0F); - stroke_prev = stroke_list[stroke_index - 1]; - if (dir_ud == 0x20) { - // LR changed - if ((stroke_prev & 0x0F) != dir_lr) add_stroke(dir); - } else if (dir_lr == 0x02) { - // UD changed - if ((stroke_prev & 0xF0) != dir_ud) add_stroke(dir); - } else { - // Add direction - if (((stroke_prev & 0xF0) == 0x20) && (dir_ud != 0x20)) { - // Add UD - if ((stroke_prev & 0x0F) == dir_lr) { - // Replace totally - stroke_list[stroke_index - 1] = dir; - } else if (dir_lr == 0x02) { - // Merge UD - stroke_list[stroke_index - 1] = dir_ud | (stroke_prev & 0x0F); - } else { - add_stroke(dir); - } - } else if (((stroke_prev & 0x0F) == 0x02) && (dir_lr != 0x02)) { - // Add LR - if ((stroke_prev & 0xF0) == dir_ud) { - // Replace totally - stroke_list[stroke_index - 1] = dir; - } else if (dir_ud == 0x20) { - // Merge LR - stroke_list[stroke_index - 1] = dir_lr | (stroke_prev & 0xF0); - } else { - add_stroke(dir); - } - } else { - add_stroke(dir); - } - } - } - } else { - // Register first stroke - if (dir != 0x22) add_stroke(dir); - } - } - } - - last_pos = current_pos; - } - } - - sample_skip++; -} - -void HandWriteView::on_show() { - clear_zone(Color::black(), false); -} - -void HandWriteView::on_button(Button& button) { - char_add(button.id); - update_text(); -} - -} // namespace ui diff --git a/firmware/application/ui_handwrite.hpp b/firmware/application/ui_handwrite.hpp deleted file mode 100644 index e039fcd8..00000000 --- a/firmware/application/ui_handwrite.hpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 __UNISTROKE_H__ -#define __UNISTROKE_H__ - -#include "ui.hpp" -#include "ui_widget.hpp" -#include "ui_painter.hpp" -#include "ui_textentry.hpp" -#include "unistroke.hpp" - -namespace ui { - -class HandWriteView : public TextEntryView { - public: - HandWriteView(NavigationView& nav, std::string* str, size_t max_length); - - HandWriteView(const HandWriteView&) = delete; - HandWriteView(HandWriteView&&) = delete; - HandWriteView& operator=(const HandWriteView&) = delete; - HandWriteView& operator=(HandWriteView&&) = delete; - - void paint(Painter& painter) override; - void on_show() override; - bool on_touch(const TouchEvent event) override; - - private: - const char special_chars[5] = {'\'', '.', '?', '!', '='}; - - const HandWriting* handwriting{}; - Painter* _painter{}; - uint8_t dir_cnt{0}; - uint8_t dir_prev{0}; - uint8_t flash_timer{0}; - bool tracing{false}; - uint8_t stroke_index{0}; - uint8_t sample_skip{0}, move_wait{0}; - uint8_t stroke_list[8]; - Point start_pos{}, current_pos{}, last_pos{}; - bool _lowercase = false; - - void sample_pen(); - void add_stroke(uint8_t dir); - void guess_letter(); - void clear_zone(const Color color, const bool flash); - void on_button(Button& button); - - std::array num_buttons{}; - std::array special_buttons{}; - - Button button_case{ - {8, 270, 32, 28}, - "UC"}; - - Button button_ok{ - {190, 270, 40, 28}, - "OK"}; - - MessageHandlerRegistration message_handler_sample{ - Message::ID::DisplayFrameSync, - [this](const Message* const) { - this->sample_pen(); - }}; -}; - -} /* namespace ui */ - -#endif /*__UNISTROKE_H__*/ diff --git a/firmware/application/ui_loadmodule.cpp b/firmware/application/ui_loadmodule.cpp deleted file mode 100644 index 59248887..00000000 --- a/firmware/application/ui_loadmodule.cpp +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 "ui_loadmodule.hpp" - -#include "ch.h" - -#include "ff.h" -#include "event_m0.hpp" -#include "hackrf_gpio.hpp" -#include "portapack.hpp" -#include "portapack_shared_memory.hpp" -#include "hackrf_hal.hpp" -#include "string_format.hpp" - -#include "ui_rds.hpp" -#include "ui_xylos.hpp" -#include "ui_epar.hpp" -#include "ui_lcr.hpp" -#include "analog_audio_app.hpp" -#include "ui_soundboard.hpp" -#include "ui_debug.hpp" -#include "ui_closecall.hpp" -#include "ui_audiotx.hpp" -#include "ui_jammer.hpp" - -#include -#include - -using namespace portapack; - -namespace ui { - -void LoadModuleView::focus() { - button_ok.focus(); -} - -void LoadModuleView::on_show() { - char md5_signature[16]; - uint8_t c; - - memcpy(md5_signature, (const void*)(0x10087FF0), 16); - for (c = 0; c < 16; c++) { - if (md5_signature[c] != _hash[c]) break; - } - // text_info.set(to_string_hex(*((unsigned int*)0x10087FF0), 8)); - - if (c == 16) { - text_info.set("Module already loaded :)"); - _mod_loaded = true; - } else { - text_info.set("Loading module"); - loadmodule(); - } -} - -int LoadModuleView::load_image() { - const char magic[6] = {'P', 'P', 'M', ' ', 0x02, 0x00}; - UINT bw; - uint8_t i; - uint32_t cnt; - char md5sum[16]; - FILINFO modinfo; - FIL modfile; - DIR rootdir; - FRESULT res; - - // Scan SD card root directory for files with the right MD5 fingerprint at the right location - if (f_opendir(&rootdir, "/") == FR_OK) { - for (;;) { - res = f_readdir(&rootdir, &modinfo); - if (res != FR_OK || modinfo.fname[0] == 0) break; // Reached last file, abort - // Only care about files with .bin extension - if ((!(modinfo.fattrib & AM_DIR)) && (modinfo.fname[9] == 'B') && (modinfo.fname[10] == 'I') && (modinfo.fname[11] == 'N')) { - res = f_open(&modfile, modinfo.fname, FA_OPEN_EXISTING | FA_READ); - if (res != FR_OK) return 0; - // Magic bytes and version check - f_read(&modfile, &md5sum, 6, &bw); - for (i = 0; i < 6; i++) - if (md5sum[i] != magic[i]) break; - if (i == 6) { - f_lseek(&modfile, 26); - f_read(&modfile, &md5sum, 16, &bw); - for (i = 0; i < 16; i++) - if (md5sum[i] != _hash[i]) break; - // f_read can't read more than 512 bytes at a time ? - if (i == 16) { - f_lseek(&modfile, 512); - for (cnt = 0; cnt < 64; cnt++) { - if (f_read(&modfile, reinterpret_cast(portapack::memory::map::m4_code.base() + (cnt * 512)), 512, &bw)) return 0; - } - f_close(&modfile); - f_closedir(&rootdir); - LPC_RGU->RESET_CTRL[0] = (1 << 13); - return 1; - } - } - f_close(&modfile); - } - } - f_closedir(&rootdir); - } - - return 0; -} - -void LoadModuleView::loadmodule() { - // baseband::shutdown(); - - /*EventDispatcher::message_map().register_handler(Message::ID::ReadyForSwitch, - [this](Message* const p) { - (void)p;*/ - if (load_image()) { - text_infob.set("Module loaded :)"); - _mod_loaded = true; - } else { - text_info.set("Module not found :("); - _mod_loaded = false; - } - // } - //); -} - -LoadModuleView::LoadModuleView( - NavigationView& nav, - const char* hash, - ViewID viewid) { - add_children({&text_info, - &text_infob, - &button_ok}); - - _hash = hash; - - button_ok.on_select = [this, &nav, viewid](Button&) { - nav.pop(); - if (_mod_loaded == true) { - if (viewid == AudioTX) nav.push(); - if (viewid == Xylos) nav.push(); - if (viewid == EPAR) nav.push(); - if (viewid == LCR) nav.push(); - if (viewid == SoundBoard) nav.push(); - if (viewid == AnalogAudio) nav.push(); - if (viewid == RDS) nav.push(); - if (viewid == CloseCall) nav.push(); - if (viewid == Receiver) nav.push(); - if (viewid == Jammer) nav.push(); - } - }; -} - -} /* namespace ui */ diff --git a/firmware/application/ui_loadmodule.hpp b/firmware/application/ui_loadmodule.hpp deleted file mode 100644 index eb6a22c9..00000000 --- a/firmware/application/ui_loadmodule.hpp +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 "ui.hpp" -#include "ui_widget.hpp" -#include "ui_painter.hpp" -#include "ui_menu.hpp" -#include "ui_navigation.hpp" -#include "core_control.hpp" - -namespace ui { - -enum ViewID { - Receiver, - AudioTX, - CloseCall, - Xylos, - EPAR, - LCR, - SoundBoard, - AnalogAudio, - RDS, - Jammer -}; - -class LoadModuleView : public View { - public: - LoadModuleView(NavigationView& nav, const char* hash, ViewID viewid); - void loadmodule(); - - void on_show() override; - void focus() override; - - private: - int load_image(void); - const char* _hash; - bool _mod_loaded = false; - - Text text_info{ - {8, 64, 224, 16}, - "-"}; - Text text_infob{ - {8, 64 + 16, 224, 16}, - "-"}; - - Button button_ok{ - {88, 128, 64, 32}, - "OK"}; -}; - -} /* namespace ui */ diff --git a/firmware/application/ui_navigation.cpp b/firmware/application/ui_navigation.cpp index 9d66e437..8654c204 100644 --- a/firmware/application/ui_navigation.cpp +++ b/firmware/application/ui_navigation.cpp @@ -24,8 +24,6 @@ #include "ui_navigation.hpp" -// #include "modules.h" - #include "bmp_modal_warning.hpp" #include "bmp_splash.hpp" #include "event_m0.hpp" @@ -35,36 +33,25 @@ #include "ui_about_simple.hpp" #include "ui_adsb_rx.hpp" -// #include "ui_adsb_tx.hpp" //moved to ext #include "ui_aprs_rx.hpp" #include "ui_aprs_tx.hpp" #include "ui_bht_tx.hpp" #include "ui_btle_rx.hpp" -// #include "ui_coasterp.hpp" //moved to ext #include "ui_debug.hpp" #include "ui_encoders.hpp" #include "ui_fileman.hpp" #include "ui_flash_utility.hpp" #include "ui_font_fixed_8x16.hpp" #include "ui_freqman.hpp" -#include "ui_fsk_rx.hpp" #include "ui_iq_trim.hpp" -// #include "ui_jammer.hpp" //moved to ext -// #include "ui_keyfob.hpp" //moved to ext -// #include "ui_lcr.hpp" #include "ui_level.hpp" #include "ui_looking_glass_app.hpp" #include "ui_mictx.hpp" -// #include "ui_morse.hpp" //moved to ext -// #include "ui_nrf_rx.hpp" //moved to ext -// #include "ui_numbers.hpp" -// #include "ui_nuoptix.hpp" -// #include "ui_playdead.hpp" + #include "ui_playlist.hpp" #include "ui_pocsag_tx.hpp" #include "ui_rds.hpp" #include "ui_recon.hpp" -#include "ui_remote.hpp" #include "ui_scanner.hpp" #include "ui_sd_over_usb.hpp" #include "ui_sd_wipe.hpp" @@ -72,12 +59,9 @@ #include "ui_settings.hpp" #include "ui_siggen.hpp" #include "ui_sonde.hpp" -// #include "ui_spectrum_painter.hpp" //moved to ext app #include "ui_ss_viewer.hpp" -// #include "ui_sstvtx.hpp" //moved to ext // #include "ui_test.hpp" #include "ui_text_editor.hpp" -#include "ui_tone_search.hpp" #include "ui_touchtunes.hpp" #include "ui_view_wav.hpp" #include "ui_weatherstation.hpp" @@ -86,21 +70,15 @@ #include "ui_battinfo.hpp" #include "ui_external_items_menu_loader.hpp" -// #include "acars_app.hpp" #include "ais_app.hpp" #include "analog_audio_app.hpp" -// #include "analog_tv_app.hpp" //moved to ext // #include "ble_comm_app.hpp" #include "ble_rx_app.hpp" #include "ble_tx_app.hpp" #include "capture_app.hpp" #include "ert_app.hpp" -// #include "gps_sim_app.hpp" //moved to ext -// #include "lge_app.hpp" //moved to ext #include "pocsag_app.hpp" -#include "replay_app.hpp" #include "soundboard_app.hpp" -// #include "tpms_app.hpp" //moved to ext #include "core_control.hpp" #include "file.hpp" @@ -143,26 +121,21 @@ static NavigationView::AppMap generate_app_map(const NavigationView::AppList& ap // TODO(u-foka): Check consistency of command names (where we add rx/tx postfix) const NavigationView::AppList NavigationView::appList = { /* HOME ******************************************************************/ - //{"playdead", "Play dead", HOME, Color::red(), &bitmap_icon_playdead, new ViewFactory()}, {nullptr, "Receive", HOME, Color::cyan(), &bitmap_icon_receivers, new ViewFactory()}, {nullptr, "Transmit", HOME, Color::cyan(), &bitmap_icon_transmit, new ViewFactory()}, {"capture", "Capture", HOME, Color::red(), &bitmap_icon_capture, new ViewFactory()}, {"replay", "Replay", HOME, Color::green(), &bitmap_icon_replay, new ViewFactory()}, - {"remote", "Remote", HOME, ui::Color::green(), &bitmap_icon_remote, new ViewFactory()}, {"scanner", "Scanner", HOME, Color::green(), &bitmap_icon_scanner, new ViewFactory()}, {"microphone", "Microphone", HOME, Color::green(), &bitmap_icon_microphone, new ViewFactory()}, {"lookingglass", "Looking Glass", HOME, Color::green(), &bitmap_icon_looking, new ViewFactory()}, {nullptr, "Utilities", HOME, Color::cyan(), &bitmap_icon_utilities, new ViewFactory()}, {nullptr, "Settings", HOME, Color::cyan(), &bitmap_icon_setup, new ViewFactory()}, {nullptr, "Debug", HOME, Color::light_grey(), &bitmap_icon_debug, new ViewFactory()}, - //{"about", "About", HOME, Color::cyan(), nullptr, new ViewFactory()}, /* RX ********************************************************************/ - //{"acars", "ACARS", RX, Color::yellow(), &bitmap_icon_adsb, new ViewFactory()}, {"adsbrx", "ADS-B", RX, Color::green(), &bitmap_icon_adsb, new ViewFactory()}, {"ais", "AIS Boats", RX, Color::green(), &bitmap_icon_ais, new ViewFactory()}, {"aprsrx", "APRS", RX, Color::green(), &bitmap_icon_aprs, new ViewFactory()}, {"audio", "Audio", RX, Color::green(), &bitmap_icon_speaker, new ViewFactory()}, - //{"btle", "BTLE", RX, Color::yellow(), &bitmap_icon_btle, new ViewFactory()}, //{"blecomm", "BLE Comm", RX, ui::Color::orange(), &bitmap_icon_btle, new ViewFactory()}, {"blerx", "BLE Rx", RX, Color::green(), &bitmap_icon_btle, new ViewFactory()}, {"ert", "ERT Meter", RX, Color::green(), &bitmap_icon_ert, new ViewFactory()}, @@ -171,10 +144,9 @@ const NavigationView::AppList NavigationView::appList = { {"radiosonde", "Radiosnde", RX, Color::green(), &bitmap_icon_sonde, new ViewFactory()}, {"recon", "Recon", RX, Color::green(), &bitmap_icon_scanner, new ViewFactory()}, {"search", "Search", RX, Color::yellow(), &bitmap_icon_search, new ViewFactory()}, - //{"tmps", "TPMS Cars", RX, Color::green(), &bitmap_icon_tpms, new ViewFactory()}, {"subghzd", "SubGhzD", RX, Color::yellow(), &bitmap_icon_remote, new ViewFactory()}, {"weather", "Weather", RX, Color::green(), &bitmap_icon_thermometer, new ViewFactory()}, - //{"fskrx", "FSK RX", RX, Color::yellow(), &bitmap_icon_remote, new ViewFactory()}, + //{"fskrx", "FSK RX", RX, Color::yellow(), &bitmap_icon_remote, new ViewFactory()}, //for JT //{"dmr", "DMR", RX, Color::dark_grey(), &bitmap_icon_dmr, new ViewFactory()}, //{"sigfox", "SIGFOX", RX, Color::dark_grey(), &bitmap_icon_fox, new ViewFactory()}, //{"lora", "LoRa", RX, Color::dark_grey(), &bitmap_icon_lora, new ViewFactory()}, @@ -185,13 +157,10 @@ const NavigationView::AppList NavigationView::appList = { {"aprstx", "APRS TX", TX, ui::Color::green(), &bitmap_icon_aprs, new ViewFactory()}, {"bht", "BHT Xy/EP", TX, ui::Color::green(), &bitmap_icon_bht, new ViewFactory()}, {"bletx", "BLE Tx", TX, ui::Color::green(), &bitmap_icon_btle, new ViewFactory()}, - //{"morse", "Morse", TX, ui::Color::green(), &bitmap_icon_morse, new ViewFactory()}, //moved to ext - //{"nuoptixdtmf", "Nuoptix DTMF", TX, ui::Color::green(), &bitmap_icon_nuoptix, new ViewFactory()}, {"ooktx", "OOK", TX, ui::Color::yellow(), &bitmap_icon_remote, new ViewFactory()}, {"pocsagtx", "POCSAG TX", TX, ui::Color::green(), &bitmap_icon_pocsag, new ViewFactory()}, {"rdstx", "RDS", TX, ui::Color::green(), &bitmap_icon_rds, new ViewFactory()}, {"soundbrd", "Soundbrd", TX, ui::Color::green(), &bitmap_icon_soundboard, new ViewFactory()}, - //{"sstvtx", "SSTV", TX, ui::Color::green(), &bitmap_icon_sstv, new ViewFactory()}, //moved to ext {"touchtune", "TouchTune", TX, ui::Color::green(), &bitmap_icon_touchtunes, new ViewFactory()}, /* UTILITIES *************************************************************/ {"antennalength", "Antenna Length", UTILITIES, Color::green(), &bitmap_icon_tools_antenna, new ViewFactory()}, @@ -202,10 +171,10 @@ const NavigationView::AppList NavigationView::appList = { {nullptr, "SD Over USB", UTILITIES, Color::yellow(), &bitmap_icon_hackrf, new ViewFactory()}, {"signalgen", "Signal Gen", UTILITIES, Color::green(), &bitmap_icon_cwgen, new ViewFactory()}, //{"testapp", "Test App", UTILITIES, Color::dark_grey(), nullptr, new ViewFactory()}, - //{"tonesearch", "Tone Search", UTILITIES, Color::dark_grey(), nullptr, new ViewFactory()}, + {"wavview", "Wav View", UTILITIES, Color::yellow(), &bitmap_icon_soundboard, new ViewFactory()}, // Dangerous apps. - {nullptr, "Flash Utility", UTILITIES, Color::red(), &bitmap_icon_temperature, new ViewFactory()}, + {nullptr, "Flash Utility", UTILITIES, Color::red(), &bitmap_icon_peripherals_details, new ViewFactory()}, {nullptr, "Wipe SD card", UTILITIES, Color::red(), &bitmap_icon_tools_wipesd, new ViewFactory()}, }; @@ -337,15 +306,6 @@ SystemStatusView::SystemStatusView( battery_icon.on_select = [this]() { on_battery_details(); }; battery_text.on_select = [this]() { on_battery_details(); }; - button_fake_brightness.on_select = [this](ImageButton&) { - set_dirty(); - pmem::toggle_fake_brightness_level(); - refresh(); - if (nullptr != parent()) { - parent()->set_dirty(); // The parent of NavigationView shal be the SystemView - } - }; - button_bias_tee.on_select = [this](ImageButton&) { this->on_bias_tee(); }; @@ -370,6 +330,7 @@ SystemStatusView::SystemStatusView( audio::output::stop(); audio::output::update_audio_mute(); + refresh(); } @@ -388,7 +349,6 @@ void SystemStatusView::on_battery_data(const BatteryStateMessage* msg) { if (!batt_was_inited) { batt_was_inited = true; refresh(); - return; } if (!pmem::ui_hide_numeric_battery()) { battery_text.set_battery(msg->valid_mask, msg->percent, msg->on_charger); @@ -413,17 +373,13 @@ void SystemStatusView::refresh() { // Display "Disable speaker" icon only if AK4951 Codec which has separate speaker/headphone control if (audio::speaker_disable_supported() && !pmem::ui_hide_speaker()) status_icons.add(&toggle_speaker); - if (!pmem::ui_hide_fake_brightness() && !pmem::config_lcd_inverted_mode()) status_icons.add(&button_fake_brightness); if (battery::BatteryManagement::isDetected()) { batt_was_inited = true; - uint8_t percent = battery::BatteryManagement::getPercent(); if (!pmem::ui_hide_battery_icon()) { status_icons.add(&battery_icon); - battery_text.set_battery(percent <= 100 ? 1 : 0, percent, false); // got an on select, that may pop up the details of the battery. }; if (!pmem::ui_hide_numeric_battery()) { status_icons.add(&battery_text); - battery_text.set_battery(percent <= 100 ? 1 : 0, percent, false); } } @@ -449,9 +405,6 @@ void SystemStatusView::refresh() { button_converter.set_bitmap(pmem::config_updown_converter() ? &bitmap_icon_downconvert : &bitmap_icon_upconvert); button_converter.set_foreground(pmem::config_converter() ? Theme::getInstance()->fg_red->foreground : Theme::getInstance()->fg_light->foreground); - // Fake Brightness - button_fake_brightness.set_foreground((pmem::apply_fake_brightness() & (!pmem::config_lcd_inverted_mode())) ? *Theme::getInstance()->status_active : Theme::getInstance()->fg_light->foreground); - set_dirty(); } @@ -658,12 +611,10 @@ bool NavigationView::is_valid() const { View* NavigationView::push_view(std::unique_ptr new_view) { free_view(); - const auto p = new_view.get(); view_stack.emplace_back(ViewState{std::move(new_view), {}}); update_view(); - return p; } @@ -722,8 +673,8 @@ void NavigationView::update_view() { auto top_view = top.view.get(); add_child(top_view); - top_view->set_parent_rect({{0, 0}, size()}); - + auto newSize = (is_top()) ? Size{size().width(), size().height() - 16} : size(); // if top(), then there is the info bar at the bottom, so leave space for it + top_view->set_parent_rect({{0, 0}, newSize}); focus(); set_dirty(); @@ -758,15 +709,40 @@ void NavigationView::handle_autostart() { "nav"sv, {{"autostart_app"sv, &autostart_app}}}; if (!autostart_app.empty()) { - if (StartAppByName(autostart_app.c_str())) return; - // if returned false, check for external apps by that name, and try to start it - std::string appwithpath = "/" + apps_dir.string() + "/"; - appwithpath += autostart_app; - appwithpath += ".ppma"; - std::wstring_convert, char16_t> conv; - std::filesystem::path pth = conv.from_bytes(appwithpath.c_str()); - ui::ExternalItemsMenuLoader::run_external_app(*this, pth); - } + bool started = false; + // inner app + if (StartAppByName(autostart_app.c_str())) { + started = true; + } + + if (!started) { + // ppma + + std::string appwithpath = "/" + apps_dir.string() + "/" + autostart_app + ".ppma"; + std::wstring_convert, char16_t> conv; + std::filesystem::path pth = conv.from_bytes(appwithpath.c_str()); + if (ui::ExternalItemsMenuLoader::run_external_app(*this, pth)) { + started = true; + } + + if (!started) { + // ppmp / standalone + appwithpath = "/" + apps_dir.string() + "/" + autostart_app + ".ppmp"; + pth = conv.from_bytes(appwithpath.c_str()); + if (ui::ExternalItemsMenuLoader::run_standalone_app(*this, pth)) { + started = true; + } + } + } + if (!started) { + display_modal( + "Notice", "Autostart failed:\n" + + autostart_app + + "\nupdate sdcard content\n" + + "and check if .ppma exists"); + } + } // autostart end + return; } /* Helpers **************************************************************/ @@ -775,16 +751,21 @@ static void add_apps(NavigationView& nav, BtnGridView& grid, app_location_t loc) for (auto& app : NavigationView::appList) { if (app.menuLocation == loc) { grid.add_item({app.displayName, app.iconColor, app.icon, - [&nav, &app]() { nav.push_view(std::unique_ptr(app.viewFactory->produce(nav))); }}); + [&nav, &app]() { + i2cdev::I2CDevManager::set_autoscan_interval(0); //if i navigate away from any menu, turn off autoscan + nav.push_view(std::unique_ptr(app.viewFactory->produce(nav))); }}, + true); } }; + + grid.update_items(); } // clang-format off -void addExternalItems(NavigationView& nav, app_location_t location, BtnGridView& grid) { +void add_external_items(NavigationView& nav, app_location_t location, BtnGridView& grid, uint8_t error_tile_pos) { auto externalItems = ExternalItemsMenuLoader::load_external_items(location, nav); if (externalItems.empty()) { - grid.insert_item({"Notice!", + grid.insert_item({"ExtAppErr", Theme::getInstance()->error_dark->foreground, nullptr, [&nav]() { @@ -794,28 +775,47 @@ void addExternalItems(NavigationView& nav, app_location_t location, BtnGridView& "see Mayhem wiki and copy apps\n" "to " + apps_dir.string() + " folder of SD card."); }}, - pmem::show_gui_return_icon() ? 1 : 0); + error_tile_pos); } else { + std::sort(externalItems.begin(), externalItems.end(), [](const auto &a, const auto &b) + { + return a.desired_position < b.desired_position; + }); + for (auto const& gridItem : externalItems) { - grid.add_item(gridItem); + if (gridItem.desired_position < 0) { + grid.add_item(gridItem, true); + } else { + grid.insert_item(gridItem, gridItem.desired_position, true); + } + } + + grid.update_items(); } } // clang-format on +bool verify_sdcard_format() { + FATFS* fs = &sd_card::fs; + return (fs->fs_type == FS_FAT32 || fs->fs_type == FS_EXFAT) || !(sd_card::status() == sd_card::Status::Mounted); + /* ^ to satisfy those users that not use an sd*/ +} + /* ReceiversMenuView *****************************************************/ ReceiversMenuView::ReceiversMenuView(NavigationView& nav) : nav_(nav) {} void ReceiversMenuView::on_populate() { - if (pmem::show_gui_return_icon()) { + bool return_icon = pmem::show_gui_return_icon(); + if (return_icon) { add_item({"..", Theme::getInstance()->fg_light->foreground, &bitmap_icon_previous, [this]() { nav_.pop(); }}); } add_apps(nav_, *this, RX); - addExternalItems(nav_, app_location_t::RX, *this); + add_external_items(nav_, app_location_t::RX, *this, return_icon ? 1 : 0); } /* TransmittersMenuView **************************************************/ @@ -824,13 +824,14 @@ TransmittersMenuView::TransmittersMenuView(NavigationView& nav) : nav_(nav) {} void TransmittersMenuView::on_populate() { - if (pmem::show_gui_return_icon()) { + bool return_icon = pmem::show_gui_return_icon(); + if (return_icon) { add_items({{"..", Theme::getInstance()->fg_light->foreground, &bitmap_icon_previous, [this]() { nav_.pop(); }}}); } add_apps(nav_, *this, TX); - addExternalItems(nav_, app_location_t::TX, *this); + add_external_items(nav_, app_location_t::TX, *this, return_icon ? 1 : 0); } /* UtilitiesMenuView *****************************************************/ @@ -841,13 +842,14 @@ UtilitiesMenuView::UtilitiesMenuView(NavigationView& nav) } void UtilitiesMenuView::on_populate() { - if (pmem::show_gui_return_icon()) { + bool return_icon = pmem::show_gui_return_icon(); + if (return_icon) { add_items({{"..", Theme::getInstance()->fg_light->foreground, &bitmap_icon_previous, [this]() { nav_.pop(); }}}); } add_apps(nav_, *this, UTILITIES); - addExternalItems(nav_, app_location_t::UTILITIES, *this); + add_external_items(nav_, app_location_t::UTILITIES, *this, return_icon ? 1 : 0); } /* SystemMenuView ********************************************************/ @@ -871,8 +873,13 @@ SystemMenuView::SystemMenuView(NavigationView& nav) } void SystemMenuView::on_populate() { + if (!verify_sdcard_format()) { + add_item({"SDCard Error", Theme::getInstance()->error_dark->foreground, nullptr, [this]() { + nav_.display_modal("Error", "SD Card is not exFAT/FAT32,\nformat to exFAT or FAT32 on PC"); + }}); + } add_apps(nav_, *this, HOME); - + add_external_items(nav_, app_location_t::HOME, *this, 0); add_item({"HackRF", Theme::getInstance()->fg_cyan->foreground, &bitmap_icon_hackrf, [this]() { hackrf_mode(nav_); }}); } @@ -912,6 +919,7 @@ SystemView::SystemView( } else { add_child(&info_view); info_view.refresh(); + i2cdev::I2CDevManager::set_autoscan_interval(3); // turn on autoscan in sysmainv } this->status_view.set_back_enabled(!this->navigation_view.is_top()); @@ -923,7 +931,7 @@ SystemView::SystemView( navigation_view.push(); if (pmem::config_splash()) { - navigation_view.push(); + navigation_view.push(); } status_view.set_back_enabled(false); status_view.set_title_image_enabled(true); @@ -992,21 +1000,52 @@ void SystemView::set_app_fullscreen(bool fullscreen) { /* ***********************************************************************/ -void BMPView::focus() { +void SplashScreenView::focus() { button_done.focus(); } -BMPView::BMPView(NavigationView& nav) { +SplashScreenView::SplashScreenView(NavigationView& nav) + : nav_(nav) { add_children({&button_done}); - button_done.on_select = [this, &nav](Button&) { - nav.pop(); + button_done.on_select = [this](Button&) { + handle_pop(); }; } -void BMPView::paint(Painter&) { - if (!portapack::display.drawBMP2({0, 0}, splash_dot_bmp)) - portapack::display.drawBMP({(240 - 230) / 2, (320 - 50) / 2 - 10}, splash_bmp, true); +void SplashScreenView::paint(Painter&) { + if (!portapack::display.draw_bmp_from_sdcard_file({0, 0}, splash_dot_bmp)) + // ^ try draw bmp file from sdcard at (0,0), and the (0,0) already bypassed the status bar, so actual pos is (0, STATUS_BAR_HEIGHT) + portapack::display.draw_bmp_from_bmp_hex_arr({(240 - 230) / 2, (320 - 50) / 2 - 10}, splash_bmp, (const uint8_t[]){0x29, 0x18, 0x16}); + // ^ draw BMP HEX arr in firmware, note that the BMP HEX arr only cover the image part (instead of fill the screen with background, this position is located it in the center) +} + +bool SplashScreenView::on_touch(const TouchEvent event) { + /* the event thing were resolved by HTotoo, talked here https://discord.com/channels/719669764804444213/956561375155589192/1287756910950486027 + * the touch screen policy can be better, talked here https://discord.com/channels/719669764804444213/956561375155589192/1198926225897443328 + * this workaround discussed here: https://discord.com/channels/719669764804444213/1170738202924044338/1295630640158478418 + */ + + if (!nav_.is_valid()) { + return false; + } + + switch (event.type) { + case TouchEvent::Type::Start: + handle_pop(); + return false; + + default: + break; + } + + return false; +} + +void SplashScreenView::handle_pop() { + if (nav_.is_valid()) { + nav_.pop(); + } } /* NotImplementedView ****************************************************/ @@ -1072,7 +1111,7 @@ ModalMessageView::ModalMessageView( } void ModalMessageView::paint(Painter& painter) { - if (!compact) portapack::display.drawBMP({100, 48}, modal_warning_bmp, true); + if (!compact) portapack::display.draw_bmp_from_bmp_hex_arr({100, 48}, modal_warning_bmp, (const uint8_t[]){0, 0, 0}); // Break lines. auto lines = split_string(message_, '\n'); diff --git a/firmware/application/ui_navigation.hpp b/firmware/application/ui_navigation.hpp index 2311b17e..80187b55 100644 --- a/firmware/application/ui_navigation.hpp +++ b/firmware/application/ui_navigation.hpp @@ -50,6 +50,7 @@ #include "sd_card.hpp" #include "external_app.hpp" #include "view_factory.hpp" +#include "battery.hpp" // for incrementing fake date when RTC battery is dead #define DATE_FILEFLAG u"/SETTINGS/DATE_FILEFLAG" @@ -196,6 +197,7 @@ class SystemStatusView : public View { static constexpr auto default_title = ""; bool batt_was_inited = false; // if the battery was off on tart, but later turned on. bool batt_info_up = false; // to prevent show multiple batt info dialog + NavigationView& nav_; Rectangle backdrop{ @@ -278,12 +280,6 @@ class SystemStatusView : public View { Theme::getInstance()->fg_light->foreground, Theme::getInstance()->bg_dark->background}; - ImageButton button_fake_brightness{ - {0, 0, 2 * 8, 1 * 16}, - &bitmap_icon_brightness, - *Theme::getInstance()->status_active, - Theme::getInstance()->bg_dark->background}; - SDCardStatusView sd_card_status_view{ {0, 0 * 16, 2 * 8, 1 * 16}}; @@ -327,7 +323,7 @@ class InformationView : public View { Rectangle backdrop{ {0, 0 * 16, 240, 16}, - {33, 33, 33}}; + Theme::getInstance()->bg_darker->background}; Text version{ {2, 0, 11 * 8, 16}, @@ -337,13 +333,17 @@ class InformationView : public View { {86, 0, 19 * 8, 16}}; }; -class BMPView : public View { +class SplashScreenView : public View { public: - BMPView(NavigationView& nav); + SplashScreenView(NavigationView& nav); void paint(Painter&) override; void focus() override; + bool on_touch(const TouchEvent event) override; + void handle_pop(); + private: + NavigationView& nav_; Button button_done{ {240, 0, 1, 1}, ""}; diff --git a/firmware/application/ui_playdead.cpp b/firmware/application/ui_playdead.cpp deleted file mode 100644 index adf4a2ae..00000000 --- a/firmware/application/ui_playdead.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 "ui_playdead.hpp" -#include "portapack_persistent_memory.hpp" -#include "string_format.hpp" - -using namespace portapack; - -namespace ui { - -void PlayDeadView::focus() { - button_seq_entry.focus(); -} - -void PlayDeadView::paint(Painter& painter) { - if (persistent_memory::config_login()) { - // Blank the whole display - painter.fill_rectangle( - display.screen_rect(), - style().background); - } -} - -PlayDeadView::PlayDeadView(NavigationView& nav) { - rtc::RTC datetime; - - persistent_memory::set_playing_dead(0x5920C1DF); // Enable - - add_children({ - &text_playdead1, - &text_playdead2, - &text_playdead3, - &button_seq_entry, - }); - - // Seed from RTC - rtcGetTime(&RTCD1, &datetime); - text_playdead2.set("0x" + to_string_hex(lfsr_iterate(datetime.second()), 6) + "00"); - - text_playdead3.hidden(true); - - button_seq_entry.on_dir = [this](Button&, KeyEvent key) { - sequence = (sequence << 3) | (static_cast::type>(key) + 1); - return true; - }; - - button_seq_entry.on_select = [this, &nav](Button&) { - if (sequence == persistent_memory::playdead_sequence()) { - persistent_memory::set_playing_dead(0x82175E23); // Disable - if (persistent_memory::config_login()) { - text_playdead3.hidden(false); - } else { - nav.pop(); - nav.push(); - } - } else { - sequence = 0; - } - }; -} - -} /* namespace ui */ diff --git a/firmware/application/ui_playdead.hpp b/firmware/application/ui_playdead.hpp deleted file mode 100644 index 394647e5..00000000 --- a/firmware/application/ui_playdead.hpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * - * 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 __UI_PLAYDEAD_H__ -#define __UI_PLAYDEAD_H__ - -#include "ui.hpp" -#include "ui_navigation.hpp" - -namespace ui { - -class PlayDeadView : public View { - public: - PlayDeadView(NavigationView& nav); - - void focus() override; - void paint(Painter& painter) override; - - private: - uint32_t sequence = 0; - - Text text_playdead1{ - {6 * 8, 7 * 16, 14 * 8, 16}, - "\x46irmwa" - "re " - "er\x72o\x72"}; - Text text_playdead2{ - {6 * 8, 9 * 16, 16 * 8, 16}, - ""}; - Text text_playdead3{ - {6 * 8, 12 * 16, 16 * 8, 16}, - "Please reset"}; - - Button button_seq_entry{ - {240, 0, 1, 1}, - ""}; -}; - -} /* namespace ui */ - -#endif /*__UI_PLAYDEAD_H__*/ diff --git a/firmware/application/ui_sd_card_debug.cpp b/firmware/application/ui_sd_card_debug.cpp index 13363727..c39594f6 100644 --- a/firmware/application/ui_sd_card_debug.cpp +++ b/firmware/application/ui_sd_card_debug.cpp @@ -240,21 +240,16 @@ namespace ui { SDCardDebugView::SDCardDebugView(NavigationView& nav) { add_children({ - &text_title, - &text_csd_title, + &labels, + &text_format, &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_type_title, &text_card_type_value, - &text_block_size_title, &text_block_size_value, - &text_block_count_title, &text_block_count_value, - &text_capacity_title, &text_capacity_value, &text_test_write_time_title, &text_test_write_time_value, @@ -374,6 +369,14 @@ void SDCardDebugView::on_status(const sd_card::Status) { text_csd_value_1.set(to_string_hex(csd[1], 8)); text_csd_value_0.set(to_string_hex(csd[0], 8)); + text_format.set(fetch_sdcard_format()); + if (fetch_sdcard_format().find("FAT32") != std::string::npos) { + // to satisfy the intendent style in this app, the text contains padding space, thus can't use == + text_format.set_style(Theme::getInstance()->fg_green); + } else { + text_format.set_style(Theme::getInstance()->error_dark); + } + 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)); @@ -447,4 +450,38 @@ void SDCardDebugView::on_test() { } } +std::string SDCardDebugView::fetch_sdcard_format() { + const size_t max_len = sizeof("Undefined: 255") + 1; + + auto padding = [max_len](std::string s) { + if (s.length() < max_len) { + return std::string(max_len - s.length(), ' ') + s; + } + return s; + }; + + FATFS* fs = &sd_card::fs; + std::string resault; + + switch (fs->fs_type) { + case FS_FAT12: + resault = "FAT12"; + break; + case FS_FAT16: + resault = "FAT16"; + break; + case FS_FAT32: + resault = "FAT32"; + break; + case FS_EXFAT: + resault = "ExFAT"; + break; + default: + resault = "Undefined: " + to_string_dec_uint(fs->fs_type, 1); + break; + } + + return padding(resault); +} + } /* namespace ui */ diff --git a/firmware/application/ui_sd_card_debug.hpp b/firmware/application/ui_sd_card_debug.hpp index 4590418e..cf2b60b6 100644 --- a/firmware/application/ui_sd_card_debug.hpp +++ b/firmware/application/ui_sd_card_debug.hpp @@ -45,15 +45,23 @@ class SDCardDebugView : public View { void on_status(const sd_card::Status status); void on_test(); + std::string fetch_sdcard_format(); + + Labels labels{ + {{0 * 8, 1 * 16}, "Format", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 3 * 16}, "CSD", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 5 * 16}, "Bus width", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 6 * 16}, "Card type", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 8 * 16}, "Block size", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 9 * 16}, "Block count", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 10 * 16}, "Capacity", Theme::getInstance()->fg_light->foreground}, + {{0 * 8, 5 * 16}, "Bus width", Theme::getInstance()->fg_light->foreground}, - Text text_title{ - {(240 - (7 * 8)) / 2, 1 * 16, (7 * 8), 16}, - "SD Card", }; - Text text_csd_title{ - {0, 3 * 16, (8 * 8), 16}, - "CSD", + Text text_format{ + {240 - ((sizeof("Undefined: 255") + 1) * 8), 1 * 16, (sizeof("Undefined: 255") + 1) * 8, 16}, + "Unknown", }; Text text_csd_value_3{ @@ -78,11 +86,6 @@ class SDCardDebugView : public View { static constexpr size_t bus_width_characters = 1; - Text text_bus_width_title{ - {0, 5 * 16, (9 * 8), 16}, - "Bus width", - }; - Text text_bus_width_value{ {240 - (bus_width_characters * 8), 5 * 16, (bus_width_characters * 8), 16}, "", @@ -90,11 +93,6 @@ class SDCardDebugView : public View { static constexpr size_t card_type_characters = 13; - Text text_card_type_title{ - {0, 6 * 16, (9 * 8), 16}, - "Card type", - }; - Text text_card_type_value{ {240 - (card_type_characters * 8), 6 * 16, (card_type_characters * 8), 16}, "", @@ -102,11 +100,6 @@ class SDCardDebugView : public View { static constexpr size_t block_size_characters = 5; - Text text_block_size_title{ - {0, 8 * 16, (10 * 8), 16}, - "Block size", - }; - Text text_block_size_value{ {240 - (block_size_characters * 8), 8 * 16, (block_size_characters * 8), 16}, "", @@ -114,11 +107,6 @@ class SDCardDebugView : public View { static constexpr size_t block_count_characters = 9; - Text text_block_count_title{ - {0, 9 * 16, (11 * 8), 16}, - "Block count", - }; - Text text_block_count_value{ {240 - (block_count_characters * 8), 9 * 16, (block_count_characters * 8), 16}, "", @@ -126,11 +114,6 @@ class SDCardDebugView : public View { static constexpr size_t capacity_characters = 10; - Text text_capacity_title{ - {0, 10 * 16, (8 * 8), 16}, - "Capacity", - }; - Text text_capacity_value{ {240 - (capacity_characters * 8), 10 * 16, (capacity_characters * 8), 16}, "", diff --git a/firmware/application/usb_serial.hpp b/firmware/application/usb_serial.hpp index af3f2c4e..4da8dbeb 100644 --- a/firmware/application/usb_serial.hpp +++ b/firmware/application/usb_serial.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __USB_SERIAL_H +#define __USB_SERIAL_H #include "ch.h" #include "hal.h" @@ -37,6 +38,8 @@ class USBSerial { void on_channel_closed(); void setEventDispatcher(EventDispatcher* ed) { _eventDispatcher = ed; } + bool serial_connected() { return connected; } + private: void enable_xtal(); void disable_pll0(); @@ -51,4 +54,6 @@ class USBSerial { EventDispatcher* _eventDispatcher = NULL; }; -} // namespace portapack \ No newline at end of file +} // namespace portapack + +#endif diff --git a/firmware/application/usb_serial_asyncmsg.cpp b/firmware/application/usb_serial_asyncmsg.cpp index f94277b0..c46c57f1 100644 --- a/firmware/application/usb_serial_asyncmsg.cpp +++ b/firmware/application/usb_serial_asyncmsg.cpp @@ -23,6 +23,7 @@ */ #include "usb_serial_asyncmsg.hpp" +#include "usb_serial.hpp" /// value // to_string_bin/ to_string_decimal/ to_string_hex/ to_string_hex_array/ to_string_dec_uint/ to_string_dec_int etc seems usellss so i didn't add them here @@ -30,7 +31,7 @@ template <> void UsbSerialAsyncmsg::asyncmsg(const int64_t& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", to_string_dec_int(data).c_str()); @@ -38,7 +39,7 @@ void UsbSerialAsyncmsg::asyncmsg(const int64_t& data) { template <> void UsbSerialAsyncmsg::asyncmsg(const int32_t& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", to_string_dec_int(data).c_str()); @@ -46,7 +47,7 @@ void UsbSerialAsyncmsg::asyncmsg(const int32_t& data) { template <> void UsbSerialAsyncmsg::asyncmsg(const int16_t& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", to_string_dec_int(data).c_str()); @@ -54,7 +55,7 @@ void UsbSerialAsyncmsg::asyncmsg(const int16_t& data) { template <> void UsbSerialAsyncmsg::asyncmsg(const int8_t& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", to_string_dec_int(data).c_str()); @@ -62,7 +63,7 @@ void UsbSerialAsyncmsg::asyncmsg(const int8_t& data) { template <> void UsbSerialAsyncmsg::asyncmsg(const uint8_t& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", to_string_dec_int(data).c_str()); @@ -70,7 +71,7 @@ void UsbSerialAsyncmsg::asyncmsg(const uint8_t& data) { template <> void UsbSerialAsyncmsg::asyncmsg(const uint16_t& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", to_string_dec_int(data).c_str()); @@ -78,7 +79,7 @@ void UsbSerialAsyncmsg::asyncmsg(const uint16_t& data) { template <> void UsbSerialAsyncmsg::asyncmsg(const uint32_t& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", to_string_dec_int(data).c_str()); @@ -86,7 +87,7 @@ void UsbSerialAsyncmsg::asyncmsg(const uint32_t& data) { template <> void UsbSerialAsyncmsg::asyncmsg(const uint64_t& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", to_string_dec_int(data).c_str()); @@ -94,7 +95,7 @@ void UsbSerialAsyncmsg::asyncmsg(const uint64_t& data) { template <> void UsbSerialAsyncmsg::asyncmsg(const float& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", to_string_decimal(data, 7).c_str()); @@ -105,7 +106,7 @@ void UsbSerialAsyncmsg::asyncmsg(const float& data) { template <> // usage: UsbSerialAsyncmsg::asyncmsg(path); void UsbSerialAsyncmsg::asyncmsg(const std::filesystem::path& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } std::string path_str = data.string(); @@ -114,7 +115,7 @@ void UsbSerialAsyncmsg::asyncmsg(const std::filesystem::p template <> void UsbSerialAsyncmsg::asyncmsg(const std::filesystem::path::string_type& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } std::string str_data(data.begin(), data.end()); @@ -127,7 +128,7 @@ void UsbSerialAsyncmsg::asyncmsg(const std:: template <> // usage: UsbSerialAsyncmsg::asyncmsg(str); void UsbSerialAsyncmsg::asyncmsg(const std::string& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", data.c_str()); @@ -136,7 +137,7 @@ void UsbSerialAsyncmsg::asyncmsg(const std::string& data) { // string literal AKA char[] // usage: UsbSerialAsyncmsg::asyncmsg("abc"); void UsbSerialAsyncmsg::asyncmsg(const char* data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", data); @@ -146,8 +147,8 @@ void UsbSerialAsyncmsg::asyncmsg(const char* data) { template <> // usage: UsbSerialAsyncmsg::asyncmsg(true); void UsbSerialAsyncmsg::asyncmsg(const bool& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } chprintf((BaseSequentialStream*)&SUSBD1, "%s\r\n", data ? "true" : "false"); -} \ No newline at end of file +} diff --git a/firmware/application/usb_serial_asyncmsg.hpp b/firmware/application/usb_serial_asyncmsg.hpp index fc57148e..da7fe7ba 100644 --- a/firmware/application/usb_serial_asyncmsg.hpp +++ b/firmware/application/usb_serial_asyncmsg.hpp @@ -47,10 +47,8 @@ class UsbSerialAsyncmsg { }; /*Notes: - * - Don't use MayhemHub since it currently not support real time serial output - * - If you don't use this class linker will drop it so it won't use any space - * - so delete all debug things before you push your code to production - * - use this client to filter only PP devices: https://github.com/zxkmm/Pyserial-Demo-portapack + * - Don't use MayhemHub since it's currently not supporting real time serial output (it's hiding some instructions to support some features like screenshot, and it's filtering out answers by response type) + * - use this client to debug with serial: https://github.com/portapack-mayhem/mayhem-cli * - usage: * portapack::async_tx_enabled = true; // note that use this when debugging, unless the msg would be forbidden. but don't use this in production, since it's not real async and multiple serial transmittions will broken each other. if this class is used in other scene in the future, just use command to cover (protect your serial tramsnitton) in your extern thing: asyncmsg enable --- your cmd --- asyncmsg disable * #include "usb_serial_asyncmsg.hpp" @@ -61,7 +59,7 @@ class UsbSerialAsyncmsg { // ussgae: UsbSerialAsyncmsg::asyncmsg(vec); template void UsbSerialAsyncmsg::asyncmsg(const std::vector& data) { - if (!portapack::async_tx_enabled) { + if (!portapack::async_tx_enabled || !portapack::usb_serial.serial_connected()) { return; } for (const auto& item : data) { diff --git a/firmware/application/usb_serial_cdc.h b/firmware/application/usb_serial_cdc.h index ee6f3239..10d844cf 100644 --- a/firmware/application/usb_serial_cdc.h +++ b/firmware/application/usb_serial_cdc.h @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __USB_SERIAL_CDC_H +#define __USB_SERIAL_CDC_H #include "ch.h" #include "hal.h" @@ -44,3 +45,5 @@ usb_request_status_t usb_set_line_coding_request(usb_endpoint_t* const endpoint, #endif void setup_usb_serial_controller(void); + +#endif diff --git a/firmware/application/usb_serial_descriptor.h b/firmware/application/usb_serial_descriptor.h index ebc073b7..5a5d0547 100644 --- a/firmware/application/usb_serial_descriptor.h +++ b/firmware/application/usb_serial_descriptor.h @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __USB_SERIAL_DESCRIPTOR_H +#define __USB_SERIAL_DESCRIPTOR_H #include "ch.h" #include "hal.h" @@ -42,3 +43,5 @@ extern uint8_t* usb_descriptor_strings[]; #define USB_WCID_VENDOR_REQ 0x19 extern uint8_t wcid_string_descriptor[]; extern uint8_t wcid_feature_descriptor[]; + +#endif diff --git a/firmware/application/usb_serial_device_to_host.h b/firmware/application/usb_serial_device_to_host.h index 77f688de..68a2ac1d 100644 --- a/firmware/application/usb_serial_device_to_host.h +++ b/firmware/application/usb_serial_device_to_host.h @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __USB_SERIAL_DEVICE_TO_HOST_H +#define __USB_SERIAL_DEVICE_TO_HOST_H #include "ch.h" #include "hal.h" @@ -56,3 +57,5 @@ size_t fillOBuffer(OutputQueue* oqp, const uint8_t* bp, size_t n); #ifdef __cplusplus } #endif + +#endif diff --git a/firmware/application/usb_serial_endpoints.h b/firmware/application/usb_serial_endpoints.h index 48ebaea2..fd02cf11 100644 --- a/firmware/application/usb_serial_endpoints.h +++ b/firmware/application/usb_serial_endpoints.h @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __USB_SERIAL_ENDPOINTS_H +#define __USB_SERIAL_ENDPOINTS_H #include "ch.h" #include "hal.h" @@ -49,3 +50,5 @@ extern USB_DECLARE_QUEUE(usb_endpoint_bulk_in); extern usb_endpoint_t usb_endpoint_bulk_out; extern USB_DECLARE_QUEUE(usb_endpoint_bulk_out); + +#endif diff --git a/firmware/application/usb_serial_event.hpp b/firmware/application/usb_serial_event.hpp index a3e40afb..6d9d3ae2 100644 --- a/firmware/application/usb_serial_event.hpp +++ b/firmware/application/usb_serial_event.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __USB_SERIAL_EVENT_H +#define __USB_SERIAL_EVENT_H #include "ch.h" #include "hal.h" @@ -32,3 +33,5 @@ void on_channel_closed(void); #ifdef __cplusplus } #endif + +#endif diff --git a/firmware/application/usb_serial_host_to_device.hpp b/firmware/application/usb_serial_host_to_device.hpp index e67f8093..8a0b9d71 100644 --- a/firmware/application/usb_serial_host_to_device.hpp +++ b/firmware/application/usb_serial_host_to_device.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __USB_SERIAL_HOST_TO_DEVICE_H +#define __USB_SERIAL_HOST_TO_DEVICE_H #include "ch.h" #include "hal.h" @@ -31,3 +32,5 @@ void reset_transfer_queues(); void serial_bulk_transfer_complete(void* user_data, unsigned int bytes_transferred); void schedule_host_to_device_transfer(); void complete_host_to_device_transfer(); + +#endif diff --git a/firmware/application/usb_serial_shell.cpp b/firmware/application/usb_serial_shell.cpp index 91187034..1c8fb9df 100644 --- a/firmware/application/usb_serial_shell.cpp +++ b/firmware/application/usb_serial_shell.cpp @@ -38,6 +38,7 @@ #include "performance_counter.hpp" #include "usb_serial_device_to_host.h" +#include "i2c_device_to_host.h" #include "chprintf.h" #include "chqueues.h" #include "ui_external_items_menu_loader.hpp" @@ -59,6 +60,7 @@ #define palOutputPad(port, pad) (LPC_GPIO->DIR[(port)] |= 1 << (pad)) static EventDispatcher* _eventDispatcherInstance = NULL; +static bool shell_i2c_created = false; static EventDispatcher* getEventDispatcherInstance() { return _eventDispatcherInstance; } @@ -136,7 +138,7 @@ bool strEndsWith(const std::u16string& str, const std::u16string& suffix) { static void cmd_flash(BaseSequentialStream* chp, int argc, char* argv[]) { if (argc != 1) { - chprintf(chp, "Usage: flash /FIRMWARE/portapack-h1_h2-mayhem.bin\r\n"); + chprintf(chp, "Usage: flash /FIRMWARE/portapack-mayhem-firmware.bin\r\n"); return; } @@ -905,6 +907,191 @@ static void cmd_cpld_read(BaseSequentialStream* chp, int argc, char* argv[]) { } } +static uint32_t reverse(uint32_t x) { + x = ((x >> 1) & 0x55555555u) | ((x & 0x55555555u) << 1); + x = ((x >> 2) & 0x33333333u) | ((x & 0x33333333u) << 2); + x = ((x >> 4) & 0x0f0f0f0fu) | ((x & 0x0f0f0f0fu) << 4); + x = ((x >> 8) & 0x00ff00ffu) | ((x & 0x00ff00ffu) << 8); + x = ((x >> 16) & 0xffffu) | ((x & 0xffffu) << 16); + return x; +} + +static void cmd_cpld_write(BaseSequentialStream* chp, int argc, char* argv[]) { + const char* usage = + "usage: cpld_write \r\n" + " device can be: hackrf, portapack\r\n" + " target can be: sram (hackrf only), eeprom\r\n" + " currently only \"cpld_write portapack eeprom \" is supported\r\n"; + + if (argc != 3) { + chprintf(chp, usage); + return; + } + + if (strncmp(argv[0], "hackrf", 5) == 0) { + chprintf(chp, usage); + } else if (strncmp(argv[0], "portapack", 5) == 0) { + if (strncmp(argv[1], "eeprom", 5) == 0) { + jtag::GPIOTarget target{ + portapack::gpio_cpld_tck, + portapack::gpio_cpld_tms, + portapack::gpio_cpld_tdi, + portapack::gpio_cpld_tdo}; + jtag::JTAG jtag{target}; + portapack::cpld::CPLD cpld{jtag}; + + cpld.reset(); + cpld.run_test_idle(); + uint32_t idcode = cpld.get_idcode(); + + chprintf(chp, "CPLD IDCODE: 0x%08X\r\n", idcode); + + if (idcode == 0x00025610) { + chprintf(chp, "CPLD Model: AGM AG256SL100\r\n"); + + if (cpld.AGM_enter_maintenance_mode() == false) { + return; + } + + File* file = new File(); + auto path = path_from_string8(argv[2]); + auto error = file->open(path); + + if (error.is_valid()) { + chprintf(chp, "Error opening file: %s %d %s\r\n", argv[2], error.value().code(), error.value().what().c_str()); + delete file; + cpld.AGM_exit_maintenance_mode(); + return; + } + + auto data = std::make_unique>(); + uint32_t magic = 0; + bool magic_found = false; + uint32_t expected_address = 0; + + auto readData = std::vector(); + + chprintf(chp, "Reading file...\r\n"); + file->seek(0); + + while (!file->eof().value()) { + uint32_t remainingData = readData.size(); + uint32_t bytesToRead = 512 - remainingData; + + readData.resize(512); + + auto result = file->read(readData.data() + remainingData, bytesToRead); + + if (result.is_error()) { + chprintf(chp, "Error reading file: %d %s\r\n", result.error().code(), result.error().what().c_str()); + cpld.AGM_exit_maintenance_mode(); + file->close(); + delete file; + return; + } + + if (result.value() != 512) + readData.resize(remainingData + result.value()); + + do { + auto it = std::find(readData.begin(), readData.end(), '\n'); + if (it != readData.end()) { + std::string line(readData.begin(), it); + readData.erase(readData.begin(), it + 1); + + line.erase(std::remove(line.begin(), line.end(), '\r'), line.end()); + line.erase(std::remove(line.begin(), line.end(), '\n'), line.end()); + + auto prefix = line.find("sdr 64 -tdi ", 0); + auto suffix = line.find("0040", line.size() - 4); + + if (prefix == 0 && suffix == line.size() - 4) { + std::string dataString = line.substr(line.size() - 16, 16); + + uint32_t address = reverse(std::stoul(dataString.substr(8, 8), nullptr, 16) - 64) / 4; + uint32_t value = std::stoul(dataString.substr(0, 8), nullptr, 16); + + if (expected_address == 299 && address == 0) { + magic = value; + magic_found = true; + chprintf(chp, "Magic found: %08X\r\n", magic); + continue; + } + + if (expected_address != address) { + chprintf(chp, "Error: expected address %d, got %d\r\n", expected_address, address); + cpld.AGM_exit_maintenance_mode(); + file->close(); + delete file; + return; + } + + (*data)[expected_address] = value; + expected_address++; + + if (expected_address == 1801) { + if (!magic_found) { + chprintf(chp, "Error: magic not found\r\n"); + cpld.AGM_exit_maintenance_mode(); + file->close(); + delete file; + return; + } + + chprintf(chp, "Writing data to CPLD...\r\n"); + file->close(); + delete file; + + cpld.AGM_write(*data, magic); + + cpld.AGM_enter_read_mode(); + + CRC<32> crc{0x04c11db7, 0xffffffff, 0xffffffff}; + for (size_t i = 0; i < 2048; i++) { + uint32_t data = cpld.AGM_read(i); + crc.process_byte((data >> 0) & 0xff); + crc.process_byte((data >> 8) & 0xff); + crc.process_byte((data >> 16) & 0xff); + crc.process_byte((data >> 24) & 0xff); + } + + cpld.AGM_exit_maintenance_mode(); + + chprintf(chp, "New CPLD firmware checksum: 0x%08X\r\n", crc.checksum()); + + m4_request_shutdown(); + chThdSleepMilliseconds(1000); + + WWDT_MOD = WWDT_MOD_WDEN | WWDT_MOD_WDRESET; + WWDT_TC = 100000 & 0xFFFFFF; + WWDT_FEED_SEQUENCE; + + return; + break; + } + } + } else { + break; + } + } while (true); + } + + file->close(); + delete file; + + cpld.AGM_exit_maintenance_mode(); + + } else { + chprintf(chp, "CPLD Model: unknown\r\n"); + } + } else { + chprintf(chp, usage); + } + } else { + chprintf(chp, usage); + } +} + static void cmd_gotgps(BaseSequentialStream* chp, int argc, char* argv[]) { const char* usage = "usage: gotgps [altitude] [speed] [satinuse]\r\n"; if (argc < 2 || argc > 5) { @@ -939,7 +1126,7 @@ static void cmd_gotorientation(BaseSequentialStream* chp, int argc, char* argv[] } static void cmd_gotenv(BaseSequentialStream* chp, int argc, char* argv[]) { - const char* usage = "usage: gotenv [humidity] [pressure] [light]\r\n"; + const char* usage = "usage: gotenv [humidity] [pressure] [light]\r\n"; // keeping light here too for compatibility if (argc < 1 || argc > 4) { chprintf(chp, usage); return; @@ -950,8 +1137,25 @@ static void cmd_gotenv(BaseSequentialStream* chp, int argc, char* argv[]) { uint16_t light = 0; if (argc > 1) humi = atof(argv[1]); if (argc > 2) pressure = atof(argv[2]); - if (argc > 3) light = strtol(argv[3], NULL, 10); - EnvironmentDataMessage msg{temp, humi, pressure, light}; + if (argc > 3) light = strtol(argv[0], NULL, 10); + EnvironmentDataMessage msg{temp, humi, pressure}; + EventDispatcher::send_message(msg); + // compatibility: + if (argc > 3) { + LightDataMessage msg{light}; + EventDispatcher::send_message(msg); + } + chprintf(chp, "ok\r\n"); +} + +static void cmd_gotlight(BaseSequentialStream* chp, int argc, char* argv[]) { + const char* usage = "usage: gotlight \r\n"; + if (argc != 1) { + chprintf(chp, usage); + return; + } + uint16_t light = strtol(argv[0], NULL, 10); + LightDataMessage msg{light}; EventDispatcher::send_message(msg); chprintf(chp, "ok\r\n"); } @@ -1062,8 +1266,8 @@ static void cmd_sendpocsag(BaseSequentialStream* chp, int argc, char* argv[]) { } uint64_t addr = atol(argv[0]); int msglen = atoi(argv[1]); // without minimum limit, since addr only don't send anything - if (msglen > 30 || msglen < 0) { - chprintf(chp, "error, msglen max is 30\r\n"); + if (msglen > 80 || msglen < 0) { + chprintf(chp, "error, msglen max is 80\r\n"); return; } @@ -1103,7 +1307,7 @@ static void cmd_sendpocsag(BaseSequentialStream* chp, int argc, char* argv[]) { } } - uint8_t msg[31] = {0}; + uint8_t msg[81] = {0}; if (msglen > 0) { chprintf(chp, "send %d bytes\r\n", msglen); do { @@ -1184,6 +1388,7 @@ static const ShellCommand commands[] = { {"rtcset", cmd_rtcset}, {"cpld_info", cpld_info}, {"cpld_read", cmd_cpld_read}, + {"cpld_write", cmd_cpld_write}, {"accessibility_readall", cmd_accessibility_readall}, {"accessibility_readcurr", cmd_accessibility_readcurr}, {"applist", cmd_applist}, @@ -1191,6 +1396,7 @@ static const ShellCommand commands[] = { {"gotgps", cmd_gotgps}, {"gotorientation", cmd_gotorientation}, {"gotenv", cmd_gotenv}, + {"gotlight", cmd_gotlight}, {"sysinfo", cmd_sysinfo}, {"radioinfo", cmd_radioinfo}, {"pmemreset", cmd_pmemreset}, @@ -1204,7 +1410,19 @@ static const ShellConfig shell_cfg1 = { (BaseSequentialStream*)&SUSBD1, commands}; +static const ShellConfig shell_cfg2 = { + (BaseSequentialStream*)&I2CD1, + commands}; + void create_shell(EventDispatcher* evtd) { _eventDispatcherInstance = evtd; shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO + 10); } + +extern "C" void create_shell_i2c(EventDispatcher* evtd) { + if (shell_i2c_created) return; + shell_i2c_created = true; + init_i2c_shell_driver(&I2CD1); + _eventDispatcherInstance = evtd; + shellCreate(&shell_cfg2, SHELL_WA_SIZE, NORMALPRIO + 10); +} diff --git a/firmware/application/usb_serial_shell.hpp b/firmware/application/usb_serial_shell.hpp index d442f92b..fbb406c3 100644 --- a/firmware/application/usb_serial_shell.hpp +++ b/firmware/application/usb_serial_shell.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __USB_SERIAL_SHELL_H +#define __USB_SERIAL_SHELL_H #include "ch.h" #include "hal.h" @@ -29,3 +30,13 @@ class EventDispatcher; void create_shell(EventDispatcher* evtd); + +#ifdef __cplusplus +extern "C" { +#endif +void create_shell_i2c(EventDispatcher* evtd); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/firmware/baseband/CMakeLists.txt b/firmware/baseband/CMakeLists.txt index 990dc8fa..3f8f1af7 100644 --- a/firmware/baseband/CMakeLists.txt +++ b/firmware/baseband/CMakeLists.txt @@ -271,6 +271,7 @@ macro(DeclareTargets chunk_tag name) project("baseband_${name}") include(${RULESPATH}/rules.cmake) + set_source_files_properties(${MODE_CPPSRC} PROPERTIES COMPILE_FLAGS "${MODE_FLAGS}") add_executable(${PROJECT_NAME}.elf $ ${MODE_CPPSRC} ${HALSRC} ${PLATFORMSRC}) set_target_properties(${PROJECT_NAME}.elf PROPERTIES LINK_DEPENDS ${LDSCRIPT}) add_definitions(${DEFS}) @@ -313,13 +314,8 @@ macro(DeclareTargets chunk_tag name) endmacro() set(add_to_firmware TRUE) +set(MODE_FLAGS "-O3") -### ACARS RX - -set(MODE_CPPSRC - proc_acars.cpp -) -DeclareTargets(PACA acars) ### ADS-B RX @@ -430,13 +426,6 @@ set(MODE_CPPSRC ) DeclareTargets(PNFM nfm_audio) -#### No op -# -#set(MODE_CPPSRC -# proc_noop.cpp -#) -#DeclareTargets(PNOP no_operation) - ### OOK set(MODE_CPPSRC @@ -444,12 +433,6 @@ set(MODE_CPPSRC ) DeclareTargets(POOK ook) -#### POCSAG RX -# -#set(MODE_CPPSRC -# proc_pocsag.cpp -#) -#DeclareTargets(PPOC pocsag) ### POCSAG2 RX @@ -517,6 +500,7 @@ set(MODE_CPPSRC ) DeclareTargets(PWTH weather) +set(MODE_FLAGS "-Os") ### Flash Utility @@ -578,6 +562,15 @@ DeclareTargets(PUSB sd_over_usb) ### Place external app and disabled images below so they don't get added to the firmware set(add_to_firmware FALSE) +set(MODE_FLAGS "-O3") + +### ACARS RX + +set(MODE_CPPSRC + proc_acars.cpp +) +DeclareTargets(PACA acars) + ### AFSK RX @@ -666,6 +659,14 @@ set(MODE_CPPSRC ) DeclareTargets(PADT adsbtx) +### OOKStream + +set(MODE_CPPSRC + proc_ook_stream_tx.cpp +) +DeclareTargets(POSK ookstream) + + ### HackRF "factory" firmware diff --git a/firmware/baseband/fprotos/w-bresser_3ch.hpp b/firmware/baseband/fprotos/w-bresser_3ch.hpp new file mode 100644 index 00000000..dcc5950c --- /dev/null +++ b/firmware/baseband/fprotos/w-bresser_3ch.hpp @@ -0,0 +1,197 @@ + +#ifndef __FPROTO_Bresser3ch_H__ +#define __FPROTO_Bresser3ch_H__ + +#include "weatherbase.hpp" + +#define BRESSER_V0_DATA 36 +#define BRESSER_V0_DATA_AND_TAIL 52 +#define BRESSER_V1_DATA 40 + +typedef enum { + Bresser3chDecoderStepReset = 0, + Bresser3chDecoderStepV0SaveDuration, + Bresser3chDecoderStepV0CheckDuration, + Bresser3chDecoderStepV0TailCheckDuration, + Bresser3chDecoderStepV1PreambleDn, + Bresser3chDecoderStepV1PreambleUp, + Bresser3chDecoderStepV1SaveDuration, + Bresser3chDecoderStepV1CheckDuration, +} Bresser3chDecoderStepV1; + +class FProtoWeatheBresser3CH : public FProtoWeatherBase { + public: + FProtoWeatheBresser3CH() { + sensorType = FPW_Bresser3CH; + } + + void feed(bool level, uint32_t duration) { + switch (parser_step) { + case Bresser3chDecoderStepReset: + if (level && DURATION_DIFF(duration, te_short * 3) < te_delta) { + te_last = duration; + parser_step = Bresser3chDecoderStepV1PreambleDn; + decode_data = 0; + decode_count_bit = 0; + } else if ((!level) && duration >= te_long) { + parser_step = Bresser3chDecoderStepV0SaveDuration; + decode_data = 0; + decode_count_bit = 0; + } + break; + + case Bresser3chDecoderStepV0SaveDuration: + if (level) { + te_last = duration; + if (decode_count_bit < BRESSER_V0_DATA) { + parser_step = Bresser3chDecoderStepV0CheckDuration; + } else { + parser_step = Bresser3chDecoderStepV0TailCheckDuration; + } + } else { + parser_step = Bresser3chDecoderStepReset; + } + break; + + case Bresser3chDecoderStepV0CheckDuration: + if (!level) { + if (DURATION_DIFF(te_last, te_short) < te_delta) { + if (DURATION_DIFF(duration, te_short * 2) < te_delta) { + subghz_protocol_blocks_add_bit(0); + parser_step = Bresser3chDecoderStepV0SaveDuration; + } else if ( + DURATION_DIFF(duration, te_short * 4) < te_delta) { + subghz_protocol_blocks_add_bit(1); + parser_step = Bresser3chDecoderStepV0SaveDuration; + } else + parser_step = Bresser3chDecoderStepReset; + } else + parser_step = Bresser3chDecoderStepReset; + } else + parser_step = Bresser3chDecoderStepReset; + break; + + case Bresser3chDecoderStepV0TailCheckDuration: + if (!level) { + if (duration >= te_long) { + if (decode_count_bit == BRESSER_V0_DATA_AND_TAIL && + ws_protocol_bresser_3ch_check_v0()) { + decode_count_bit = BRESSER_V0_DATA; + sensorType = FPW_Bresser3CH; + // ws_protocol_bresser_3ch_extract_data_v0(); + if (callback) { + callback(this); + } + } + decode_data = 0; + decode_count_bit = 0; + parser_step = Bresser3chDecoderStepReset; + } else if ( + decode_count_bit < BRESSER_V0_DATA_AND_TAIL && + DURATION_DIFF(te_last, te_short) < te_delta && + DURATION_DIFF(duration, te_short * 2) < te_delta) { + decode_count_bit++; + parser_step = Bresser3chDecoderStepV0SaveDuration; + } else + parser_step = Bresser3chDecoderStepReset; + } else + parser_step = Bresser3chDecoderStepReset; + break; + + case Bresser3chDecoderStepV1PreambleDn: + if ((!level) && DURATION_DIFF(duration, te_short_v1 * 3) < te_delta) { + if (DURATION_DIFF(te_last, te_short_v1 * 12) < te_delta * 2) { + // End of sync after 4*750 (12*250) high values, start reading the message + parser_step = Bresser3chDecoderStepV1SaveDuration; + } else { + parser_step = Bresser3chDecoderStepV1PreambleUp; + } + } else { + parser_step = Bresser3chDecoderStepReset; + } + break; + + case Bresser3chDecoderStepV1PreambleUp: + if (level && DURATION_DIFF(duration, te_short_v1 * 3) < te_delta) { + te_last = te_last + duration; + parser_step = Bresser3chDecoderStepV1PreambleDn; + } else { + parser_step = Bresser3chDecoderStepReset; + } + break; + + case Bresser3chDecoderStepV1SaveDuration: + if (decode_count_bit == BRESSER_V1_DATA) { + if (ws_protocol_bresser_3ch_check_v1()) { + // ws_protocol_bresser_3ch_extract_data_v1(&instance->generic); + sensorType = FPW_Bresser3CH_V1; + if (callback) { + callback(this); + } + } + decode_data = 0; + decode_count_bit = 0; + parser_step = Bresser3chDecoderStepReset; + } else if (level) { + te_last = duration; + parser_step = Bresser3chDecoderStepV1CheckDuration; + } else { + parser_step = Bresser3chDecoderStepReset; + } + break; + + case Bresser3chDecoderStepV1CheckDuration: + if (!level) { + if (DURATION_DIFF(te_last, te_short_v1) < te_delta && DURATION_DIFF(duration, te_long_v1) < te_delta) { + subghz_protocol_blocks_add_bit(0); + parser_step = Bresser3chDecoderStepV1SaveDuration; + } else if ( + DURATION_DIFF(te_last, te_long_v1) < te_delta && DURATION_DIFF(duration, te_short_v1) < te_delta) { + subghz_protocol_blocks_add_bit(1); + parser_step = Bresser3chDecoderStepV1SaveDuration; + } else + parser_step = Bresser3chDecoderStepReset; + } else + parser_step = Bresser3chDecoderStepReset; + break; + } + } + + protected: + uint32_t te_short = 475; + uint32_t te_long = 3900; + uint32_t te_delta = 150; + + uint32_t te_short_v1 = 250; + uint32_t te_long_v1 = 500; + + bool ws_protocol_bresser_3ch_check_v0() { + if (!decode_data) return false; + // No CRC, so better sanity checks here + if (((decode_data >> 8) & 0x0f) != 0x0f) return false; // separator not 0xf + if (((decode_data >> 28) & 0xff) == 0xff) return false; // ID only ones? + if (((decode_data >> 28) & 0xff) == 0x00) return false; // ID only zeroes? + if (((decode_data >> 25) & 0x0f) == 0x0f) return false; // flags only ones? + if (((decode_data >> 25) & 0x0f) == 0x00) return false; // flags only zeroes? + if (((decode_data >> 12) & 0x0fff) == 0x0fff) + return false; // temperature maxed out? + if ((decode_data & 0xff) < 20) + return false; // humidity percentage less than 20? + if ((decode_data & 0xff) > 95) + return false; // humidity percentage more than 95? + return true; + } + bool ws_protocol_bresser_3ch_check_v1() { + if (!decode_data) return false; + + uint8_t sum = (((decode_data >> 32) & 0xff) + + ((decode_data >> 24) & 0xff) + + ((decode_data >> 16) & 0xff) + + ((decode_data >> 8) & 0xff)) & + 0xff; + + return (decode_data & 0xff) == sum; + } +}; + +#endif diff --git a/firmware/baseband/fprotos/w-vauno_en8822.hpp b/firmware/baseband/fprotos/w-vauno_en8822.hpp new file mode 100644 index 00000000..73dbda70 --- /dev/null +++ b/firmware/baseband/fprotos/w-vauno_en8822.hpp @@ -0,0 +1,88 @@ + +#ifndef __FPROTO_VAUNO_EN8822_H__ +#define __FPROTO_VAUNO_EN8822_H__ + +#include "weatherbase.hpp" + +typedef enum { + VaunoEN8822CDecoderStepReset = 0, + VaunoEN8822CDecoderStepSaveDuration, + VaunoEN8822CDecoderStepCheckDuration, +} VaunoEN8822CDecoderStep; + +class FProtoWeatherVaunoEN8822 : public FProtoWeatherBase { + public: + FProtoWeatherVaunoEN8822() { + sensorType = FPW_Vauno_EN8822; + } + + void feed(bool level, uint32_t duration) override { + switch (parser_step) { + case VaunoEN8822CDecoderStepReset: + if ((!level) && DURATION_DIFF(duration, te_long * 4) < te_delta) { + parser_step = VaunoEN8822CDecoderStepSaveDuration; + decode_data = 0; + decode_count_bit = 0; + } + break; + + case VaunoEN8822CDecoderStepSaveDuration: + if (level) { + te_last = duration; + parser_step = VaunoEN8822CDecoderStepCheckDuration; + } else { + parser_step = VaunoEN8822CDecoderStepReset; + } + break; + + case VaunoEN8822CDecoderStepCheckDuration: + if (!level) { + if (DURATION_DIFF(te_last, te_short) < te_delta) { + if (DURATION_DIFF(duration, te_long * 2) < te_delta) { + subghz_protocol_blocks_add_bit(1); + parser_step = VaunoEN8822CDecoderStepSaveDuration; + } else if (DURATION_DIFF(duration, te_long) < te_delta) { + subghz_protocol_blocks_add_bit(0); + parser_step = VaunoEN8822CDecoderStepSaveDuration; + } else if (DURATION_DIFF(duration, te_long * 4) < te_delta) { + parser_step = VaunoEN8822CDecoderStepReset; + if (decode_count_bit == min_count_bit_for_found && ws_protocol_vauno_en8822c_check()) { + // ws_protocol_vauno_en8822c_extract_data(&instance->generic); + + if (callback) { + callback(this); + } + } else if (decode_count_bit == 1) { + parser_step = VaunoEN8822CDecoderStepSaveDuration; + } + decode_data = 0; + decode_count_bit = 0; + } else + parser_step = VaunoEN8822CDecoderStepReset; + } else + parser_step = VaunoEN8822CDecoderStepReset; + } else + parser_step = VaunoEN8822CDecoderStepReset; + break; + } + } + + protected: + // timing values + uint32_t te_short = 500; + uint32_t te_long = 1940; + uint32_t te_delta = 150; + uint32_t min_count_bit_for_found = 42; + + bool ws_protocol_vauno_en8822c_check() { + if (!decode_data) return false; + // The sum of all nibbles should match the last 6 bits + uint8_t sum = 0; + for (uint8_t i = 6; i <= 38; i += 4) { + sum += ((decode_data >> i) & 0x0f); + } + return sum != 0 && (sum & 0x3f) == (decode_data & 0x3f); + } +}; + +#endif diff --git a/firmware/baseband/fprotos/weatherprotos.hpp b/firmware/baseband/fprotos/weatherprotos.hpp index a4b82a13..efcb4220 100644 --- a/firmware/baseband/fprotos/weatherprotos.hpp +++ b/firmware/baseband/fprotos/weatherprotos.hpp @@ -29,6 +29,8 @@ So include here the .hpp, and add a new element to the protos vector in the cons #include "w-acurite5in1.hpp" #include "w-emose601x.hpp" #include "w-solight_te44.hpp" +#include "w-bresser_3ch.hpp" +#include "w-vauno_en8822.hpp" #include #include @@ -66,10 +68,13 @@ class WeatherProtos : public FProtoListGeneral { protos[FPW_Acurite5in1] = new FProtoWeatherAcurite5in1(); protos[FPW_EmosE601x] = new FProtoWeatherEmosE601x(); protos[FPW_SolightTE44] = new FProtoWeatherSolightTE44(); + protos[FPW_Bresser3CH] = new FProtoWeatheBresser3CH(); + protos[FPW_Bresser3CH_V1] = nullptr; // done by FProtoWeatheBresser3CH + protos[FPW_Vauno_EN8822] = new FProtoWeatherVaunoEN8822(); // set callback for them for (uint8_t i = 0; i < FPW_COUNT; ++i) { - protos[i]->setCallback(callbackTarget); + if (protos[i] != NULL) protos[i]->setCallback(callbackTarget); } } diff --git a/firmware/baseband/fprotos/weathertypes.hpp b/firmware/baseband/fprotos/weathertypes.hpp index ce10d672..fd6d043b 100644 --- a/firmware/baseband/fprotos/weathertypes.hpp +++ b/firmware/baseband/fprotos/weathertypes.hpp @@ -39,6 +39,9 @@ enum FPROTO_WEATHER_SENSOR { FPW_Acurite5in1 = 21, FPW_EmosE601x = 22, FPW_SolightTE44 = 23, + FPW_Bresser3CH = 24, + FPW_Bresser3CH_V1 = 25, + FPW_Vauno_EN8822 = 26, FPW_COUNT // this must be the last }; diff --git a/firmware/baseband/proc_acars.cpp b/firmware/baseband/proc_acars.cpp index 023112e5..af0b8bc3 100644 --- a/firmware/baseband/proc_acars.cpp +++ b/firmware/baseband/proc_acars.cpp @@ -20,18 +20,27 @@ * Boston, MA 02110-1301, USA. */ -#include "proc_acars.hpp" - #include "portapack_shared_memory.hpp" - +#include "proc_acars.hpp" #include "dsp_fir_taps.hpp" +#include "audio_dma.hpp" #include "event_m4.hpp" +#define SYN 0x16 +#define SOH 0x01 +#define STX 0x02 +#define ETX 0x83 +#define ETB 0x97 +#define DLE 0x7f + ACARSProcessor::ACARSProcessor() { + audio::dma::init_audio_out(); decim_0.configure(taps_11k0_decim_0.taps); decim_1.configure(taps_11k0_decim_1.taps); - packet.clear(); + decode_data = 0; + decode_count_bit = 0; + audio_output.configure(false); baseband_thread.start(); } @@ -45,6 +54,9 @@ void ACARSProcessor::execute(const buffer_c8_t& buffer) { /* 38.4kHz, 32 samples */ feed_channel_stats(decimator_out); + auto audio = demod.execute(decimator_out, audio_buffer); + audio_output.write(audio); + for (size_t i = 0; i < decimator_out.count; i++) { if (mf.execute_once(decimator_out.p[i])) { clock_recovery(mf.get_output()); @@ -52,24 +64,134 @@ void ACARSProcessor::execute(const buffer_c8_t& buffer) { } } -void ACARSProcessor::consume_symbol( - const float raw_symbol) { - const uint_fast8_t sliced_symbol = (raw_symbol >= 0.0f) ? 1 : 0; - // const auto decoded_symbol = acars_decode(sliced_symbol); - - // DEBUG - packet.add(sliced_symbol); - if (packet.size() == 256) { - payload_handler(packet); - packet.clear(); - } - - // packet_builder.execute(decoded_symbol); +void ACARSProcessor::add_bit(uint8_t bit) { + decode_data = decode_data << 1 | bit; + decode_count_bit++; } -void ACARSProcessor::payload_handler( - const baseband::Packet& packet) { - const ACARSPacketMessage message{packet}; +uint16_t ACARSProcessor::update_crc(uint8_t dataByte) { + (void)dataByte; + return 0; +} + +void ACARSProcessor::sendDebug() { + // if (curr_state <= 1) return; + message.state = curr_state; + shared_memory.application_queue.push(message); +} + +void ACARSProcessor::reset() { + decode_data = 0; + decode_count_bit = 0; + curr_state = WSYN; + message.msg_len = 0; + memset(message.message, 0, 250); + message.crc[0] = 0; + message.crc[1] = 0; + parity_errors = 0; +} + +void ACARSProcessor::consume_symbol(const float raw_symbol) { + const uint_fast8_t sliced_symbol = (raw_symbol >= 0.0f) ? 1 : 0; + + add_bit(sliced_symbol); + if (curr_state == WSYN && decode_count_bit == 8) { + if ((decode_data & 0xff) == SYN) { + curr_state = SYN2; + decode_data = 0; + decode_count_bit = 0; + } else { + decode_count_bit -= 1; // just drop the first bit + } + return; + } + if (curr_state == SYN2 && decode_count_bit == 8) { + if ((decode_data & 0xff) == SYN) { + curr_state = SOH1; + decode_data = 0; + decode_count_bit = 0; + sendDebug(); + return; + } + // here i don't have the right packets. so reset + reset(); + } + if (curr_state == SOH1 && decode_count_bit == 8) { + if ((decode_data & 0xff) == SOH) { + reset(); + curr_state = TXT; + sendDebug(); + return; + } + message.message[0] = (decode_data & 0xff); // debug + reset(); + sendDebug(); + } + if (curr_state == TXT && decode_count_bit == 8) { + uint8_t ch = (decode_data & 0xff); + message.message[message.msg_len++] = ch; + + if (!ParityCheck::parity_check(ch)) { + // parity error + parity_errors++; + if (parity_errors > 4) { + reset(); // too many parity errors, skip packet + sendDebug(); + return; + } + } + + if (ch == ETX || ch == ETB) { + curr_state = CRC1; + sendDebug(); + decode_data = 0; + decode_count_bit = 0; + return; + } + if (message.msg_len > 240) { + reset(); + sendDebug(); + } + if (message.msg_len > 20 && ch == DLE) { + message.msg_len -= 3; + message.crc[0] = message.message[message.msg_len]; + message.crc[1] = message.message[message.msg_len + 1]; + curr_state = CRC2; + sendDebug(); + // to hack the path: + decode_data = message.crc[1]; + } else { + decode_count_bit = 0; + decode_data = 0; + return; + } + } + if (curr_state == CRC1 && decode_count_bit == 8) { + message.crc[0] = (decode_data & 0xff); + curr_state = CRC2; + decode_data = 0; + decode_count_bit = 0; + sendDebug(); + } + + if (curr_state == CRC2 && decode_count_bit == 8) { + message.crc[1] = (decode_data & 0xff); + // send it to app cpu, and it'll take care of the rest + payload_handler(); + reset(); + curr_state = END; + decode_data = 0; + decode_count_bit = 0; + sendDebug(); + } + if (curr_state == END && decode_count_bit == 8) { + reset(); + sendDebug(); + } +} + +void ACARSProcessor::payload_handler() { + message.state = 255; // to indicate this is an actual payload, not a debug packet shared_memory.application_queue.push(message); } @@ -77,4 +199,4 @@ int main() { EventDispatcher event_dispatcher{std::make_unique()}; event_dispatcher.run(); return 0; -} +} \ No newline at end of file diff --git a/firmware/baseband/proc_acars.hpp b/firmware/baseband/proc_acars.hpp index ddd1c0a1..c732516f 100644 --- a/firmware/baseband/proc_acars.hpp +++ b/firmware/baseband/proc_acars.hpp @@ -46,11 +46,15 @@ #include "baseband_packet.hpp" #include "message.hpp" +#include "dsp_demodulate.hpp" +#include "audio_output.hpp" #include #include #include +#include "crc.hpp" + // AIS: // IN: 2457600/8/8 = 38400 // Offset: 2457600/4 = 614400 (614400/8/8 = 9600) @@ -101,6 +105,14 @@ constexpr std::array, 16> rect_taps_38k4_4k8_1t_2k4_p{{ {4.4194173824e-02f, -4.4194173824e-02f}, }}; +typedef enum { WSYN, + SYN2, + SOH1, + TXT, + CRC1, + CRC2, + END } Acarsstate; + class ACARSProcessor : public BasebandProcessor { public: ACARSProcessor(); @@ -124,24 +136,32 @@ class ACARSProcessor : public BasebandProcessor { 2400, {0.0555f}, [this](const float symbol) { this->consume_symbol(symbol); }}; - symbol_coding::ACARSDecoder acars_decode{}; - /*PacketBuilder packet_builder { - { 0b011010000110100010000000, 24, 1 }, // SYN, SYN, SOH - { }, - { 128 }, - [this](const baseband::Packet& packet) { - this->payload_handler(packet); - } - };*/ - baseband::Packet packet{}; + + uint16_t update_crc(uint8_t dataByte); + void consume_symbol(const float symbol); + void payload_handler(); + void add_bit(uint8_t bit); + void reset(); + void sendDebug(); + + std::array audio{}; + const buffer_f32_t audio_buffer{ + audio.data(), + audio.size()}; + dsp::demodulate::AM demod{}; + AudioOutput audio_output{}; + + Acarsstate curr_state = WSYN; + + uint32_t decode_data = 0; + uint8_t decode_count_bit = 0; + ACARSPacketMessage message{}; + uint8_t parity_errors = 0; /* NB: Threads should be the last members in the class definition. */ BasebandThread baseband_thread{ baseband_fs, this, baseband::Direction::Receive, /*auto_start*/ false}; RSSIThread rssi_thread{}; - - void consume_symbol(const float symbol); - void payload_handler(const baseband::Packet& packet); }; -#endif /*__PROC_ACARS_H__*/ +#endif /*__PROC_ACARS_H__*/ \ No newline at end of file diff --git a/firmware/baseband/proc_ook_stream_tx.cpp b/firmware/baseband/proc_ook_stream_tx.cpp new file mode 100644 index 00000000..a82f413c --- /dev/null +++ b/firmware/baseband/proc_ook_stream_tx.cpp @@ -0,0 +1,127 @@ +/* + * Copyright (C) 2024 HTotoo + * + * 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 "proc_ook_stream_tx.hpp" +#include "sine_table_int8.hpp" +#include "portapack_shared_memory.hpp" + +#include "event_m4.hpp" + +#include "utility.hpp" + +OOKProcessorStreamed::OOKProcessorStreamed() { + configured = false; + baseband_thread.start(); +} + +inline void OOKProcessorStreamed::write_sample(const buffer_c8_t& buffer, bool bit_value, size_t i) { + int8_t re, im; + + if (bit_value) { + phase = (phase + 200); // What ? + sphase = phase + (64 << 18); + re = (sine_table_i8[(sphase & 0x03FC0000) >> 18]); + im = (sine_table_i8[(phase & 0x03FC0000) >> 18]); + } else { + re = 0; + im = 0; + } + buffer.p[i] = {re, im}; +} + +void OOKProcessorStreamed::execute(const buffer_c8_t& buffer) { + if (!configured || !stream) return; + + for (size_t i = 0; i < buffer.count; i++) { + if (rem_samples <= curr_samples) { + // get a new sample from stream + int32_t sample = -13346; + rem_samples = 0; // reset my pointer + curr_samples = 0; + size_t readed = 0; + if (configured) readed = stream->read(&sample, 4); // read from stream // todo htotoo error handling?! + if (readed == 0) { + txprogress_message.progress = -10; + shared_memory.application_queue.push(txprogress_message); // debug + } else { + if (sample == endsignals[readerrs + 1]) { // if no more samples, stop + readerrs++; + if (readerrs == 2) { + configured = false; + txprogress_message.done = true; + txprogress_message.progress = 100; + curr_hilow = false; + shared_memory.application_queue.push(txprogress_message); + } + } else { + if (sample < 0) { + rem_samples = OOK_SAMPLERATE * ((-1 * sample) / 1000000.0); + curr_hilow = false; + } else { + rem_samples = OOK_SAMPLERATE * (sample / 1000000.0); + curr_hilow = true; + } + } + } + } + ++curr_samples; + write_sample(buffer, curr_hilow, i); + } +} + +void OOKProcessorStreamed::on_message(const Message* const message) { + switch (message->id) { + case Message::ID::ReplayConfig: + configured = false; + replay_config(*reinterpret_cast(message)); + break; + + case Message::ID::FIFOData: + configured = true; + txprogress_message.progress = -4; + shared_memory.application_queue.push(txprogress_message); + break; + + default: + break; + } +} + +void OOKProcessorStreamed::replay_config(const ReplayConfigMessage& message) { + if (message.config) { + txprogress_message.progress = -2; + shared_memory.application_queue.push(txprogress_message); + stream = std::make_unique(message.config); + // Tell application that the buffers and FIFO pointers are ready, prefill + RequestSignalMessage sig_message{RequestSignalMessage::Signal::FillRequest}; + shared_memory.application_queue.push(sig_message); + } else { + txprogress_message.progress = -3; + shared_memory.application_queue.push(txprogress_message); + stream.reset(); + } +} + +int main() { + EventDispatcher event_dispatcher{std::make_unique()}; + event_dispatcher.run(); + return 0; +} diff --git a/firmware/baseband/proc_ook_stream_tx.hpp b/firmware/baseband/proc_ook_stream_tx.hpp new file mode 100644 index 00000000..44c1629e --- /dev/null +++ b/firmware/baseband/proc_ook_stream_tx.hpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2024 HTotoo + * + * 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. + */ + +/* + For usage check the FlipperTX app. Don't forget to "close" the tx by sending 42069, 613379 values at the end of the stream. + Only close baseband when you get the TX done msg, not on replay thread done, because, there can still data in the buffer. +*/ + +#ifndef __PROC_OOKSTREAMTX_HPP__ +#define __PROC_OOKSTREAMTX_HPP__ + +#include "baseband_processor.hpp" +#include "baseband_thread.hpp" +#include "stream_output.hpp" +#include +#include + +#define OOK_SAMPLERATE 2280000U + +class OOKProcessorStreamed : public BasebandProcessor { + public: + OOKProcessorStreamed(); + + void execute(const buffer_c8_t& buffer) override; + void on_message(const Message* const message) override; + + private: + uint32_t rem_samples = 0; + uint32_t curr_samples = 0; + bool curr_hilow = false; + + uint32_t phase{0}, sphase{0}; + void write_sample(const buffer_c8_t& buffer, bool bit_value, size_t i); + + std::unique_ptr stream{}; + bool configured{false}; + void replay_config(const ReplayConfigMessage& message); + + int32_t endsignals[3] = {0, 42069, 613379}; // 0 is skipped, count from 1, don't ask... + uint8_t readerrs = 0; // to count in the array + + TXProgressMessage txprogress_message{}; + /* NB: Threads should be the last members in the class definition. */ + BasebandThread baseband_thread{OOK_SAMPLERATE, this, baseband::Direction::Transmit}; +}; + +#endif /*__PROC_OOKSTREAMTX_HPP__*/ diff --git a/firmware/baseband/proc_pocsag.cpp b/firmware/baseband/proc_pocsag.cpp deleted file mode 100644 index b05abd49..00000000 --- a/firmware/baseband/proc_pocsag.cpp +++ /dev/null @@ -1,539 +0,0 @@ -/* - * Copyright (C) 1996 Thomas Sailer (sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu) - * Copyright (C) 2012-2014 Elias Oenal (multimon-ng@eliasoenal.com) - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * Copyright (C) 2016 Kyle Reed - * - * 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 "proc_pocsag.hpp" - -#include "dsp_iir_config.hpp" -#include "event_m4.hpp" -#include "audio_dma.hpp" - -#include -#include -#include -#include - -void POCSAGProcessor::execute(const buffer_c8_t& buffer) { - if (!configured) return; - - // Get 24kHz audio - 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 channel_out = channel_filter.execute(decim_1_out, dst_buffer); - auto audio = demod.execute(channel_out, audio_buffer); - - // If squelching, check for audio before smoothing because smoothing - // causes the squelch noise detection to fail. Likely because squelch - // looks for HF noise and smoothing is basically a lowpass filter. - // NB: Squelch in this processor is only for the the audio output. - // Squelching will likely drop data "noise" and break processing. - if (squelch_.enabled()) { - bool has_audio = squelch_.execute(audio); - squelch_history = (squelch_history << 1) | (has_audio ? 1 : 0); - } - - smooth.Process(audio.p, audio.count); - processDemodulatedSamples(audio.p, 16); - extractFrames(); - - samples_processed += buffer.count; - if (samples_processed >= stat_update_threshold) { - send_stats(); - samples_processed = 0; - } - - // Clear the output before sending to audio chip. - // Only clear the audio buffer when there hasn't been any audio for a while. - if (squelch_.enabled() && squelch_history == 0) { - for (size_t i = 0; i < audio.count; ++i) { - audio.p[i] = 0.0; - } - } - - audio_output.write(audio); -} - -// ==================================================================== -// -// ==================================================================== -int POCSAGProcessor::OnDataWord(uint32_t word, int pos) { - packet.set(pos, word); - return 0; -} - -// ==================================================================== -// -// ==================================================================== -int POCSAGProcessor::OnDataFrame(int len, int baud) { - if (len > 0) { - packet.set_bitrate(baud); - packet.set_flag(pocsag::PacketFlag::NORMAL); - packet.set_timestamp(Timestamp::now()); - const POCSAGPacketMessage message(packet); - shared_memory.application_queue.push(message); - } - return 0; -} - -void POCSAGProcessor::on_message(const Message* const message) { - switch (message->id) { - case Message::ID::POCSAGConfigure: - configure(); - break; - - case Message::ID::NBFMConfigure: { - auto config = reinterpret_cast(message); - squelch_.set_threshold(config->squelch_level / 100.0); - break; - } - - default: - break; - } -} - -void POCSAGProcessor::configure() { - constexpr size_t decim_0_input_fs = baseband_fs; - constexpr size_t decim_0_output_fs = decim_0_input_fs / decim_0.decimation_factor; - - constexpr size_t decim_1_input_fs = decim_0_output_fs; - constexpr size_t decim_1_output_fs = decim_1_input_fs / decim_1.decimation_factor; - - constexpr size_t channel_filter_input_fs = decim_1_output_fs; - const size_t channel_filter_output_fs = channel_filter_input_fs / 2; - - const size_t demod_input_fs = channel_filter_output_fs; - - decim_0.configure(taps_11k0_decim_0.taps); - decim_1.configure(taps_11k0_decim_1.taps); - channel_filter.configure(taps_11k0_channel.taps, 2); - demod.configure(demod_input_fs, 4'500); // FSK +/- 4k5Hz. - - // Smoothing should be roughly sample rate over max baud - // 24k / 3.2k = 7.5 - smooth.SetSize(8); - - // Don't have audio process the stream. - audio_output.configure(false); - - // Set up the frame extraction, limits of baud - setFrameExtractParams(demod_input_fs, 4000, 300, 32); - - // Mark the class as ready to accept data - configured = true; -} - -void POCSAGProcessor::send_stats() const { - POCSAGStatsMessage message(m_fifo.codeword, m_numCode, m_gotSync, getRate()); - shared_memory.application_queue.push(message); -} - -// ----------------------------- -// Frame extractraction methods -// ----------------------------- -#define BAUD_STABLE (104) -#define MAX_CONSEC_SAME (32) -#define MAX_WITHOUT_SINGLE (64) -#define MAX_BAD_TRANS (10) - -#define M_SYNC (0x7cd215d8) -#define M_NOTSYNC (0x832dea27) - -#define M_IDLE (0x7a89c197) - -// ==================================================================== -// -// ==================================================================== -inline int bitsDiff(unsigned long left, unsigned long right) { - unsigned long xord = left ^ right; - int count = 0; - for (int i = 0; i < 32; i++) { - if ((xord & 0x01) != 0) ++count; - xord = xord >> 1; - } - return (count); -} - -// ==================================================================== -// -// ==================================================================== -void POCSAGProcessor::initFrameExtraction() { - m_averageSymbolLen_1024 = m_maxSymSamples_1024; - m_lastStableSymbolLen_1024 = m_minSymSamples_1024; - - m_badTransitions = 0; - m_bitsStart = 0; - m_bitsEnd = 0; - m_inverted = false; - - resetVals(); -} - -// ==================================================================== -// -// ==================================================================== -void POCSAGProcessor::resetVals() { - // Reset the parameters - // -------------------- - m_goodTransitions = 0; - m_badTransitions = 0; - m_averageSymbolLen_1024 = m_maxSymSamples_1024; - m_shortestGoodTrans_1024 = m_maxSymSamples_1024; - m_valMid = 0; - - // And reset the counts - // -------------------- - m_lastTransPos_1024 = 0; - m_lastBitPos_1024 = 0; - m_lastSample = 0; - m_sampleNo = 0; - m_nextBitPos_1024 = m_maxSymSamples_1024; - m_nextBitPosInt = (long)m_nextBitPos_1024; - - // Extraction - m_fifo.numBits = 0; - m_gotSync = false; - m_numCode = 0; -} - -// ==================================================================== -// -// ==================================================================== -void POCSAGProcessor::setFrameExtractParams(long a_samplesPerSec, long a_maxBaud, long a_minBaud, long maxRunOfSameValue) { - m_samplesPerSec = a_samplesPerSec; - m_minSymSamples_1024 = (uint32_t)(1024.0f * (float)a_samplesPerSec / (float)a_maxBaud); - m_maxSymSamples_1024 = (uint32_t)(1024.0f * (float)a_samplesPerSec / (float)a_minBaud); - m_maxRunOfSameValue = maxRunOfSameValue; - - m_shortestGoodTrans_1024 = m_maxSymSamples_1024; - m_averageSymbolLen_1024 = m_maxSymSamples_1024; - m_lastStableSymbolLen_1024 = m_minSymSamples_1024; - - m_nextBitPos_1024 = m_averageSymbolLen_1024 / 2; - m_nextBitPosInt = m_nextBitPos_1024 >> 10; - - initFrameExtraction(); -} - -// ==================================================================== -// -// ==================================================================== -int POCSAGProcessor::processDemodulatedSamples(float* sampleBuff, int noOfSamples) { - bool transition = false; - uint32_t samplePos_1024 = 0; - uint32_t len_1024 = 0; - - // Loop through the block of data - // ------------------------------ - for (int pos = 0; pos < noOfSamples; ++pos) { - m_sample = sampleBuff[pos]; - m_valMid += (m_sample - m_valMid) / 1024.0f; - - ++m_sampleNo; - - // Detect Transition - // ----------------- - transition = !((m_lastSample < m_valMid) ^ (m_sample >= m_valMid)); // use XOR for speed - - // If this is a transition - // ----------------------- - if (transition) { - // Calculate samples since last trans - // ---------------------------------- - int32_t fractional_1024 = (int32_t)(((m_sample - m_valMid) * 1024) / (m_sample - m_lastSample)); - if (fractional_1024 < 0) { - fractional_1024 = -fractional_1024; - } - - samplePos_1024 = (m_sampleNo << 10) - fractional_1024; - len_1024 = samplePos_1024 - m_lastTransPos_1024; - m_lastTransPos_1024 = samplePos_1024; - - // If symbol is large enough to be valid - // ------------------------------------- - if (len_1024 > m_minSymSamples_1024) { - // Check for shortest good transition - // ---------------------------------- - if ((len_1024 < m_shortestGoodTrans_1024) && - (m_goodTransitions < BAUD_STABLE)) // detect change of symbol size - { - int32_t fractionOfShortest_1024 = (len_1024 << 10) / m_shortestGoodTrans_1024; - - // If currently at half the baud rate - // ---------------------------------- - if ((fractionOfShortest_1024 > 410) && (fractionOfShortest_1024 < 614)) // 0.4 and 0.6 - { - m_averageSymbolLen_1024 /= 2; - m_shortestGoodTrans_1024 = len_1024; - } - // If currently at the wrong baud rate - // ----------------------------------- - else if (fractionOfShortest_1024 < 768) // 0.75 - { - m_averageSymbolLen_1024 = len_1024; - m_shortestGoodTrans_1024 = len_1024; - m_goodTransitions = 0; - m_lastSingleBitPos_1024 = samplePos_1024 - len_1024; - } - } - - // Calc the number of bits since events - // ------------------------------------ - int32_t halfSymbol_1024 = m_averageSymbolLen_1024 / 2; - int bitsSinceLastTrans = max((uint32_t)1, (len_1024 + halfSymbol_1024) / m_averageSymbolLen_1024); - int bitsSinceLastSingle = (((m_sampleNo << 10) - m_lastSingleBitPos_1024) + halfSymbol_1024) / m_averageSymbolLen_1024; - - // Check for single bit - // -------------------- - if (bitsSinceLastTrans == 1) { - m_lastSingleBitPos_1024 = samplePos_1024; - } - - // If too long since last transition - // --------------------------------- - if (bitsSinceLastTrans > MAX_CONSEC_SAME) { - resetVals(); - } - // If too long sice last single bit - // -------------------------------- - else if (bitsSinceLastSingle > MAX_WITHOUT_SINGLE) { - resetVals(); - } else { - // If this is a good transition - // ---------------------------- - int32_t offsetFromExtectedTransition_1024 = len_1024 - (bitsSinceLastTrans * m_averageSymbolLen_1024); - if (offsetFromExtectedTransition_1024 < 0) { - offsetFromExtectedTransition_1024 = -offsetFromExtectedTransition_1024; - } - if (offsetFromExtectedTransition_1024 < ((int32_t)m_averageSymbolLen_1024 / 4)) // Has to be within 1/4 of symbol to be good - { - ++m_goodTransitions; - uint32_t bitsCount = min((uint32_t)BAUD_STABLE, m_goodTransitions); - - uint32_t propFromPrevious = m_averageSymbolLen_1024 * bitsCount; - uint32_t propFromCurrent = (len_1024 / bitsSinceLastTrans); - m_averageSymbolLen_1024 = (propFromPrevious + propFromCurrent) / (bitsCount + 1); - m_badTransitions = 0; - // if ( len < m_shortestGoodTrans ){m_shortestGoodTrans = len;} - // Store the old symbol size - if (m_goodTransitions >= BAUD_STABLE) { - m_lastStableSymbolLen_1024 = m_averageSymbolLen_1024; - } - } - } - - // Set the point of the last bit if not yet stable - // ----------------------------------------------- - if ((m_goodTransitions < BAUD_STABLE) || (m_badTransitions > 0)) { - m_lastBitPos_1024 = samplePos_1024 - (m_averageSymbolLen_1024 / 2); - } - - // Calculate the exact positiom of the next bit - // -------------------------------------------- - int32_t thisPlusHalfsymbol_1024 = samplePos_1024 + (m_averageSymbolLen_1024 / 2); - int32_t lastPlusSymbol = m_lastBitPos_1024 + m_averageSymbolLen_1024; - m_nextBitPos_1024 = lastPlusSymbol + ((thisPlusHalfsymbol_1024 - lastPlusSymbol) / 16); - - // Check for bad pos error - // ----------------------- - if (m_nextBitPos_1024 < samplePos_1024) m_nextBitPos_1024 += m_averageSymbolLen_1024; - - // Calculate integer sample after next bit - // --------------------------------------- - m_nextBitPosInt = (m_nextBitPos_1024 >> 10) + 1; - - } // symbol is large enough to be valid - else { - // Bad transition, so reset the counts - // ----------------------------------- - ++m_badTransitions; - if (m_badTransitions > MAX_BAD_TRANS) { - resetVals(); - } - } - } // end of if transition - - // Reached the point of the next bit - // --------------------------------- - if (m_sampleNo >= m_nextBitPosInt) { - // Everything is good so extract a bit - // ----------------------------------- - if (m_goodTransitions > 20) { - // Store value at the center of bit - // -------------------------------- - storeBit(); - } - // Check for long 1 or zero - // ------------------------ - uint32_t bitsSinceLastTrans = ((m_sampleNo << 10) - m_lastTransPos_1024) / m_averageSymbolLen_1024; - if (bitsSinceLastTrans > m_maxRunOfSameValue) { - resetVals(); - } - - // Store the point of the last bit - // ------------------------------- - m_lastBitPos_1024 = m_nextBitPos_1024; - - // Calculate the exact point of the next bit - // ----------------------------------------- - m_nextBitPos_1024 += m_averageSymbolLen_1024; - - // Look for the bit after the next bit pos - // --------------------------------------- - m_nextBitPosInt = (m_nextBitPos_1024 >> 10) + 1; - - } // Reached the point of the next bit - - m_lastSample = m_sample; - - } // Loop through the block of data - - return getNoOfBits(); -} - -// ==================================================================== -// -// ==================================================================== -void POCSAGProcessor::storeBit() { - if (++m_bitsStart >= BIT_BUF_SIZE) { - m_bitsStart = 0; - } - - // Calculate the bit value - float sample = (m_sample + m_lastSample) / 2; - // int32_t sample_1024 = m_sample_1024; - bool bit = sample > m_valMid; - - // If buffer not full - if (m_bitsStart != m_bitsEnd) { - // Decide on output val - if (bit) { - m_bits[m_bitsStart] = 0; - } else { - m_bits[m_bitsStart] = 1; - } - } - // Throw away bits if the buffer is full - else { - if (--m_bitsStart <= -1) { - m_bitsStart = BIT_BUF_SIZE - 1; - } - } -} - -// ==================================================================== -// -// ==================================================================== -int POCSAGProcessor::extractFrames() { - int msgCnt = 0; - // While there is unread data in the bits buffer - //---------------------------------------------- - while (getNoOfBits() > 0) { - m_fifo.codeword = (m_fifo.codeword << 1) + getBit(); - m_fifo.numBits++; - - // If number of bits in fifo equals 32 - //------------------------------------ - if (m_fifo.numBits >= 32) { - // Not got sync - // ------------ - if (!m_gotSync) { - if (bitsDiff(m_fifo.codeword, M_SYNC) <= 2) { - m_inverted = false; - m_gotSync = true; - m_numCode = -1; - m_fifo.numBits = 0; - } else if (bitsDiff(m_fifo.codeword, M_NOTSYNC) <= 2) { - m_inverted = true; - m_gotSync = true; - m_numCode = -1; - m_fifo.numBits = 0; - } else { - // Cause it to load one more bit - m_fifo.numBits = 31; - } - } // Not got sync - else { - // Increment the word count - // ------------------------ - ++m_numCode; // It got set to -1 when a sync was found, now count the 16 words - uint32_t val = m_inverted ? ~m_fifo.codeword : m_fifo.codeword; - OnDataWord(val, m_numCode); - - // If at the end of a 16 word block - // -------------------------------- - if (m_numCode >= 15) { - msgCnt += OnDataFrame(m_numCode + 1, (m_samplesPerSec << 10) / m_lastStableSymbolLen_1024); - m_gotSync = false; - m_numCode = -1; - } - m_fifo.numBits = 0; - } - } // If number of bits in fifo equals 32 - } // While there is unread data in the bits buffer - return msgCnt; -} // extractFrames - -// ==================================================================== -// -// ==================================================================== -short POCSAGProcessor::getBit() { - if (m_bitsEnd != m_bitsStart) { - if (++m_bitsEnd >= BIT_BUF_SIZE) { - m_bitsEnd = 0; - } - return m_bits[m_bitsEnd]; - } else { - return -1; - } -} - -// ==================================================================== -// -// ==================================================================== -int POCSAGProcessor::getNoOfBits() { - int bits = m_bitsEnd - m_bitsStart; - if (bits < 0) { - bits += BIT_BUF_SIZE; - } - return bits; -} - -// ==================================================================== -// -// ==================================================================== -uint32_t POCSAGProcessor::getRate() const { - return ((m_samplesPerSec << 10) + 512) / m_lastStableSymbolLen_1024; -} - -// ==================================================================== -// -// ==================================================================== -int main() { - audio::dma::init_audio_out(); - - EventDispatcher event_dispatcher{std::make_unique()}; - event_dispatcher.run(); - return 0; -} diff --git a/firmware/baseband/proc_pocsag.hpp b/firmware/baseband/proc_pocsag.hpp deleted file mode 100644 index 66e5c47d..00000000 --- a/firmware/baseband/proc_pocsag.hpp +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (C) 1996 Thomas Sailer (sailer@ife.ee.ethz.ch, hb9jnx@hb9w.che.eu) - * Copyright (C) 2012-2014 Elias Oenal (multimon-ng@eliasoenal.com) - * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek - * Copyright (C) 2023 Kyle Reed - * - * 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 __PROC_POCSAG_H__ -#define __PROC_POCSAG_H__ - -#include "baseband_processor.hpp" -#include "baseband_thread.hpp" -#include "rssi_thread.hpp" - -#include "dsp_decimate.hpp" -#include "dsp_demodulate.hpp" - -#include "pocsag_packet.hpp" - -#include "pocsag.hpp" -#include "message.hpp" -#include "audio_output.hpp" -#include "portapack_shared_memory.hpp" - -#include -#include -using namespace std; - -// Class used to smooth demodulated waveform prior to decoding -// ----------------------------------------------------------- -template -class SmoothVals { - protected: - ValType* m_lastVals; // Previous N values - int m_size; // The size N - CalcType m_sumVal; // Running sum of lastVals - int m_pos; // Current position in last vals ring buffer - int m_count; // - - public: - SmoothVals() - : m_lastVals(NULL), m_size(1), m_sumVal(0), m_pos(0), m_count(0) { - m_lastVals = new ValType[m_size]; - } - - // -------------------------------------------------- - // -------------------------------------------------- - virtual ~SmoothVals() { - delete[] m_lastVals; - } - - SmoothVals(const SmoothVals&) { - } - - SmoothVals& operator=(const SmoothVals&) { - return *this; - } - - // -------------------------------------------------- - // Set size of smoothing - // -------------------------------------------------- - void SetSize(int size) { - m_size = std::max(size, 1); - m_pos = 0; - delete[] m_lastVals; - m_lastVals = new ValType[m_size]; - m_sumVal = 0; - } - - // -------------------------------------------------- - // Get size of smoothing - // -------------------------------------------------- - int Size() { return m_size; } - - // -------------------------------------------------- - // In place processing - // -------------------------------------------------- - void Process(ValType* valBuff, int numVals) { - ValType tmpVal; - - if (m_count > (1024 * 10)) { - // Recalculate the sum value occasionaly, stops accumulated errors when using float - m_count = 0; - m_sumVal = 0; - for (int i = 0; i < m_size; ++i) { - m_sumVal += (CalcType)m_lastVals[i]; - } - } - - // Use a rolling smoothed value while processing the buffer - for (int buffPos = 0; buffPos < numVals; ++buffPos) { - m_pos++; - if (m_pos >= m_size) { - m_pos = 0; - } - - m_sumVal -= (CalcType)m_lastVals[m_pos]; // Subtract the oldest value - m_lastVals[m_pos] = valBuff[buffPos]; // Store the new value - m_sumVal += (CalcType)m_lastVals[m_pos]; // Add on the new value - - tmpVal = (ValType)(m_sumVal / m_size); // Scale by number of values smoothed - valBuff[buffPos] = tmpVal; - } - - m_count += numVals; - } -}; - -// -------------------------------------------------- -// Class to process base band data to pocsag frames -// -------------------------------------------------- -class POCSAGProcessor : public BasebandProcessor { - public: - void execute(const buffer_c8_t& buffer) override; - void on_message(const Message* const message) override; - - int OnDataFrame(int len, int baud); - int OnDataWord(uint32_t word, int pos); - - private: - static constexpr size_t baseband_fs = 3072000; - static constexpr uint8_t stat_update_interval = 10; - static constexpr uint32_t stat_update_threshold = - baseband_fs / stat_update_interval; - - std::array dst{}; - const buffer_c16_t dst_buffer{ - dst.data(), - dst.size()}; - std::array audio{}; - const buffer_f32_t audio_buffer{ - audio.data(), - audio.size()}; - - dsp::decimate::FIRC8xR16x24FS4Decim8 decim_0{}; - dsp::decimate::FIRC16xR16x32Decim8 decim_1{}; - dsp::decimate::FIRAndDecimateComplex channel_filter{}; - dsp::demodulate::FM demod{}; - SmoothVals smooth = {}; - - AudioOutput audio_output{}; - - bool configured = false; - pocsag::POCSAGPacket packet{}; - - uint32_t samples_processed = 0; - - void configure(); - void send_stats() const; - - // ---------------------------------------- - // Frame extractraction methods and members - // ---------------------------------------- - void initFrameExtraction(); - struct FIFOStruct { - unsigned long codeword; - int numBits; - }; - -#define BIT_BUF_SIZE (64) - - void resetVals(); - void setFrameExtractParams(long a_samplesPerSec, long a_maxBaud = 8000, long a_minBaud = 200, long maxRunOfSameValue = 32); - - int processDemodulatedSamples(float* sampleBuff, int noOfSamples); - int extractFrames(); - - void storeBit(); - short getBit(); - - int getNoOfBits(); - uint32_t getRate() const; - - uint32_t m_averageSymbolLen_1024{0}; - uint32_t m_lastStableSymbolLen_1024{0}; - - uint32_t m_samplesPerSec{0}; - uint32_t m_goodTransitions{0}; - uint32_t m_badTransitions{0}; - - uint32_t m_sampleNo{0}; - float m_sample{0}; - float m_valMid{0.0f}; - float m_lastSample{0.0f}; - - uint32_t m_lastTransPos_1024{0}; - uint32_t m_lastSingleBitPos_1024{0}; - - uint32_t m_nextBitPosInt{0}; // Integer rounded up version to save on ops - uint32_t m_nextBitPos_1024{0}; - uint32_t m_lastBitPos_1024{0}; - - uint32_t m_shortestGoodTrans_1024{0}; - uint32_t m_minSymSamples_1024{0}; - uint32_t m_maxSymSamples_1024{0}; - uint32_t m_maxRunOfSameValue{0}; - - bitset<(size_t)BIT_BUF_SIZE> m_bits{0}; - long m_bitsStart{0}; - long m_bitsEnd{0}; - - FIFOStruct m_fifo{0, 0}; - bool m_gotSync{false}; - int m_numCode{0}; - bool m_inverted{false}; - - FMSquelch squelch_{}; - uint64_t squelch_history = 0; - - /* NB: Threads should be the last members in the class definition. */ - BasebandThread baseband_thread{baseband_fs, this, baseband::Direction::Receive}; - RSSIThread rssi_thread{}; -}; - -#endif /*__PROC_POCSAG_H__*/ diff --git a/firmware/baseband/proc_spectrum_painter.hpp b/firmware/baseband/proc_spectrum_painter.hpp index 438dd595..ad18cc11 100644 --- a/firmware/baseband/proc_spectrum_painter.hpp +++ b/firmware/baseband/proc_spectrum_painter.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __PROC_SPECTRUM_PAINTER_H +#define __PROC_SPECTRUM_PAINTER_H #include "portapack_shared_memory.hpp" #include "baseband_processor.hpp" @@ -46,3 +47,5 @@ class SpectrumPainterProcessor : public BasebandProcessor { return 0; } }; + +#endif diff --git a/firmware/baseband/proc_subghzd.cpp b/firmware/baseband/proc_subghzd.cpp index 4743d872..6dfa14ba 100644 --- a/firmware/baseband/proc_subghzd.cpp +++ b/firmware/baseband/proc_subghzd.cpp @@ -38,32 +38,79 @@ void SubGhzDProcessor::execute(const buffer_c8_t& buffer) { feed_channel_stats(decim_1_out); for (size_t i = 0; i < decim_1_out.count; i++) { + threshold = (low_estimate + high_estimate) / 2; + int32_t const hysteresis = threshold / 8; // +-12% int16_t re = decim_1_out.p[i].real(); int16_t im = decim_1_out.p[i].imag(); uint32_t mag = ((uint32_t)re * (uint32_t)re) + ((uint32_t)im * (uint32_t)im); - mag = (mag >> 12); // Decim samples are calculated with saturated gain . (we could also reduce that sat. param at configure time) + mag = (mag >> 10); + int32_t const ook_low_delta = mag - low_estimate; + bool meashl = currentHiLow; + if (sig_state == STATE_IDLE) { + if (mag > (threshold + hysteresis)) { // just become high + meashl = true; + sig_state = STATE_PULSE; + numg = 0; + } else { + meashl = false; // still low + low_estimate += ook_low_delta / OOK_EST_LOW_RATIO; + low_estimate += ((ook_low_delta > 0) ? 1 : -1); // Hack to compensate for lack of fixed-point scaling + // Calculate default OOK high level estimate + high_estimate = 1.35 * low_estimate; // Default is a ratio of low level + high_estimate = std::max(high_estimate, min_high_level); + high_estimate = std::min(high_estimate, (uint32_t)OOK_MAX_HIGH_LEVEL); + } + + } else if (sig_state == STATE_PULSE) { + ++numg; + if (numg > 100) numg = 100; + if (mag < (threshold - hysteresis)) { + // check if really a bad value + if (numg < 3) { + // susp + sig_state = STATE_GAP; + } else { + numg = 0; + sig_state = STATE_GAP_START; + } + meashl = false; // low + } else { + high_estimate += mag / OOK_EST_HIGH_RATIO - high_estimate / OOK_EST_HIGH_RATIO; + high_estimate = std::max(high_estimate, min_high_level); + high_estimate = std::min(high_estimate, (uint32_t)OOK_MAX_HIGH_LEVEL); + meashl = true; // still high + } + } else if (sig_state == STATE_GAP_START) { + ++numg; + if (mag > (threshold + hysteresis)) { // New pulse? + sig_state = STATE_PULSE; + meashl = true; + } else if (numg >= 3) { + sig_state = STATE_GAP; + meashl = false; // gap + } + } else if (sig_state == STATE_GAP) { + ++numg; + if (mag > (threshold + hysteresis)) { // New pulse? + numg = 0; + sig_state = STATE_PULSE; + meashl = true; + } else { + meashl = false; + } + } - bool meashl = (mag > threshold); - tm += mag; if (meashl == currentHiLow && currentDuration < 30'000'000) // allow pass 'end' signal { currentDuration += nsPerDecSamp; } else { // called on change, so send the last duration and dir. + if (currentDuration >= 30'000'000) sig_state = STATE_IDLE; if (protoList) protoList->feed(currentHiLow, currentDuration / 1000); currentDuration = nsPerDecSamp; currentHiLow = meashl; } } - - cnt += decim_1_out.count; // TODO , check if it is necessary that xdecim factor. - if (cnt > 90'000) { - threshold = (tm / cnt) / 2; - cnt = 0; - tm = 0; - if (threshold < 50) threshold = 50; - if (threshold > 1700) threshold = 1700; - } } void SubGhzDProcessor::on_message(const Message* const message) { @@ -75,8 +122,6 @@ void SubGhzDProcessor::configure(const SubGhzFPRxConfigureMessage& message) { // constexpr size_t decim_0_output_fs = baseband_fs / decim_0.decimation_factor; //unused // constexpr size_t decim_1_output_fs = decim_0_output_fs / decim_1.decimation_factor; //unused - modulation = message.modulation; // TODO: add support for FM (currently AM only) - baseband_fs = message.sampling_rate; baseband_thread.set_sampling_rate(baseband_fs); nsPerDecSamp = 1'000'000'000 / baseband_fs * 8; // Scaled it due to less array buffer sampes due to /8 decimation. 250 nseg (4Mhz) * 8 diff --git a/firmware/baseband/proc_subghzd.hpp b/firmware/baseband/proc_subghzd.hpp index b064c540..0650b3d3 100644 --- a/firmware/baseband/proc_subghzd.hpp +++ b/firmware/baseband/proc_subghzd.hpp @@ -32,7 +32,14 @@ #include "message.hpp" #include "dsp_decimate.hpp" +#pragma GCC push_options +#pragma GCC optimize("Os") #include "fprotos/subghzdprotos.hpp" +#pragma GCC pop_options + +#define OOK_EST_HIGH_RATIO 3 // Constant for slowness of OOK high level estimator +#define OOK_EST_LOW_RATIO 5 // Constant for slowness of OOK low level (noise) estimator (very slow) +#define OOK_MAX_HIGH_LEVEL 450000 class SubGhzDProcessor : public BasebandProcessor { public: @@ -40,9 +47,18 @@ class SubGhzDProcessor : public BasebandProcessor { void on_message(const Message* const message) override; private: + enum { + STATE_IDLE = 0, + STATE_PULSE = 1, + STATE_GAP_START = 2, + STATE_GAP = 3, + } sig_state = STATE_IDLE; + uint32_t low_estimate = 100; + uint32_t high_estimate = 12000; + uint32_t min_high_level = 10; + uint8_t numg = 0; // count of matched signals to filter spikes size_t baseband_fs = 0; // will be set later by configure message uint32_t nsPerDecSamp = 0; - uint8_t modulation = 0; /* Array Buffer aux. used in decim0 and decim1 IQ c16 signed data ; (decim0 defines the max length of the array) */ std::array dst{}; // decim0 /4 , 2048/4 = 512 complex I,Q @@ -55,14 +71,10 @@ class SubGhzDProcessor : public BasebandProcessor { dsp::decimate::FIRC16xR16x16Decim2 decim_1{}; uint32_t currentDuration = 0; - uint32_t threshold = 0x0630; // will overwrite after the first iteration + uint32_t threshold = 0x0630; bool currentHiLow = false; bool configured{false}; - // for threshold - uint32_t cnt = 0; - uint32_t tm = 0; - FProtoListGeneral* protoList = new SubGhzDProtos(); // holds all the protocols we can parse void configure(const SubGhzFPRxConfigureMessage& message); diff --git a/firmware/baseband/proc_weather.cpp b/firmware/baseband/proc_weather.cpp index 6939af8e..ae738c67 100644 --- a/firmware/baseband/proc_weather.cpp +++ b/firmware/baseband/proc_weather.cpp @@ -39,32 +39,79 @@ void WeatherProcessor::execute(const buffer_c8_t& buffer) { feed_channel_stats(decim_1_out); for (size_t i = 0; i < decim_1_out.count; i++) { + threshold = (low_estimate + high_estimate) / 2; + int32_t const hysteresis = threshold / 8; // +-12% int16_t re = decim_1_out.p[i].real(); int16_t im = decim_1_out.p[i].imag(); uint32_t mag = ((uint32_t)re * (uint32_t)re) + ((uint32_t)im * (uint32_t)im); - mag = (mag >> 12); // Decim samples are calculated with saturated gain . (we could also reduce that sat. param at configure time) + mag = (mag >> 10); + int32_t const ook_low_delta = mag - low_estimate; + bool meashl = currentHiLow; + if (sig_state == STATE_IDLE) { + if (mag > (threshold + hysteresis)) { // just become high + meashl = true; + sig_state = STATE_PULSE; + numg = 0; + } else { + meashl = false; // still low + low_estimate += ook_low_delta / OOK_EST_LOW_RATIO; + low_estimate += ((ook_low_delta > 0) ? 1 : -1); // Hack to compensate for lack of fixed-point scaling + // Calculate default OOK high level estimate + high_estimate = 1.35 * low_estimate; // Default is a ratio of low level + high_estimate = std::max(high_estimate, min_high_level); + high_estimate = std::min(high_estimate, (uint32_t)OOK_MAX_HIGH_LEVEL); + } + + } else if (sig_state == STATE_PULSE) { + ++numg; + if (numg > 100) numg = 100; + if (mag < (threshold - hysteresis)) { + // check if really a bad value + if (numg < 3) { + // susp + sig_state = STATE_GAP; + } else { + numg = 0; + sig_state = STATE_GAP_START; + } + meashl = false; // low + } else { + high_estimate += mag / OOK_EST_HIGH_RATIO - high_estimate / OOK_EST_HIGH_RATIO; + high_estimate = std::max(high_estimate, min_high_level); + high_estimate = std::min(high_estimate, (uint32_t)OOK_MAX_HIGH_LEVEL); + meashl = true; // still high + } + } else if (sig_state == STATE_GAP_START) { + ++numg; + if (mag > (threshold + hysteresis)) { // New pulse? + sig_state = STATE_PULSE; + meashl = true; + } else if (numg >= 3) { + sig_state = STATE_GAP; + meashl = false; // gap + } + } else if (sig_state == STATE_GAP) { + ++numg; + if (mag > (threshold + hysteresis)) { // New pulse? + numg = 0; + sig_state = STATE_PULSE; + meashl = true; + } else { + meashl = false; + } + } - bool meashl = (mag > threshold); - tm += mag; if (meashl == currentHiLow && currentDuration < 30'000'000) // allow pass 'end' signal { currentDuration += nsPerDecSamp; } else { // called on change, so send the last duration and dir. + if (currentDuration >= 30'000'000) sig_state = STATE_IDLE; if (protoList) protoList->feed(currentHiLow, currentDuration / 1000); currentDuration = nsPerDecSamp; currentHiLow = meashl; } } - - cnt += decim_1_out.count; // TODO , check if it is necessary that xdecim factor. - if (cnt > 90'000) { - threshold = (tm / cnt) / 2; - cnt = 0; - tm = 0; - if (threshold < 50) threshold = 50; - if (threshold > 1700) threshold = 1700; - } } void WeatherProcessor::on_message(const Message* const message) { diff --git a/firmware/baseband/proc_weather.hpp b/firmware/baseband/proc_weather.hpp index 4945db34..ec272b58 100644 --- a/firmware/baseband/proc_weather.hpp +++ b/firmware/baseband/proc_weather.hpp @@ -26,6 +26,7 @@ #ifndef __PROC_WEATHER_H__ #define __PROC_WEATHER_H__ +#include #include "baseband_processor.hpp" #include "baseband_thread.hpp" #include "rssi_thread.hpp" @@ -34,15 +35,28 @@ #include "fprotos/weatherprotos.hpp" +#define OOK_EST_HIGH_RATIO 3 // Constant for slowness of OOK high level estimator +#define OOK_EST_LOW_RATIO 5 // Constant for slowness of OOK low level (noise) estimator (very slow) +#define OOK_MAX_HIGH_LEVEL 450000 + class WeatherProcessor : public BasebandProcessor { public: void execute(const buffer_c8_t& buffer) override; void on_message(const Message* const message) override; private: + enum { + STATE_IDLE = 0, + STATE_PULSE = 1, + STATE_GAP_START = 2, + STATE_GAP = 3, + } sig_state = STATE_IDLE; + uint32_t low_estimate = 100; + uint32_t high_estimate = 12000; + uint32_t min_high_level = 10; size_t baseband_fs = 0; // will be set later by configure message. uint32_t nsPerDecSamp = 0; - + uint8_t numg = 0; // count of matched signals to filter spikes /* Array Buffer aux. used in decim0 and decim1 IQ c16 signed data ; (decim0 defines the max length of the array) */ std::array dst{}; // decim0 /4 , 2048/4 = 512 complex I,Q const buffer_c16_t dst_buffer{ @@ -58,10 +72,6 @@ class WeatherProcessor : public BasebandProcessor { bool currentHiLow = false; bool configured{false}; - // for threshold - uint32_t cnt = 0; - uint32_t tm = 0; - FProtoListGeneral* protoList = new WeatherProtos(); // holds all the protocols we can parse void configure(const SubGhzFPRxConfigureMessage& message); void on_beep_message(const AudioBeepMessage& message); diff --git a/firmware/common/acars_packet.cpp b/firmware/common/acars_packet.cpp deleted file mode 100644 index 653b1b62..00000000 --- a/firmware/common/acars_packet.cpp +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2018 Furrtek - * - * 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 "acars_packet.hpp" - -#include "crc.hpp" - -#include - -namespace acars { - -size_t Packet::length() const { - return packet_.size(); -} - -bool Packet::is_valid() const { - return true; // length_valid() && crc_ok(); -} - -Timestamp Packet::received_at() const { - return packet_.timestamp(); -} - -uint8_t Packet::block_id() const { - return field_.read(96, 8); -} - -std::string Packet::registration_number() const { - std::string result; - result.reserve(7); - - const size_t character_length = 8; - for (size_t i = 16; i < (16 + 7 * character_length); i += character_length) { - result += (field_.read(i, character_length) & 0x7F); - } - - return result; -} - -uint32_t Packet::read(const size_t start_bit, const size_t length) const { - return field_.read(start_bit, length); -} - -/*std::string Packet::text( - const size_t start_bit, - const size_t character_count -) const { - std::string result; - result.reserve(character_count); - - const size_t character_length = 6; - const size_t end_bit = start_bit + character_count * character_length; - for(size_t i=start_bit; i acars_fcs{0x1021, 0x0000, 0x0000}; - - for (size_t i = 0; i < data_length(); i += 8) { - acars_fcs.process_byte(field_crc.read(i, 8)); - } - - return (acars_fcs.checksum() == (unsigned)field_crc.read(data_length(), fcs_length)); -} - -size_t Packet::data_and_fcs_length() const { - return length() - 8; -} - -size_t Packet::data_length() const { - return data_and_fcs_length() - fcs_length; -} - -bool Packet::length_valid() const { - const size_t extra_bits = data_and_fcs_length() & 7; - if (extra_bits != 0) { - return false; - } - - return true; -} - -} // namespace acars diff --git a/firmware/common/acars_packet.hpp b/firmware/common/acars_packet.hpp deleted file mode 100644 index 322e64c8..00000000 --- a/firmware/common/acars_packet.hpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2018 Furrtek - * - * 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 __ACARS_PACKET_H__ -#define __ACARS_PACKET_H__ - -#include "baseband_packet.hpp" -#include "field_reader.hpp" - -#include -#include -#include - -namespace acars { - -class Packet { - public: - constexpr Packet( - const baseband::Packet& packet) - : packet_{packet}, - field_{packet_} { - } - - size_t length() const; - - bool is_valid() const; - - Timestamp received_at() const; - - uint8_t block_id() const; - std::string registration_number() const; - - uint32_t read(const size_t start_bit, const size_t length) const; - // std::string text(const size_t start_bit, const size_t character_count) const; - - bool crc_ok() const; - - private: - using Reader = FieldReader; - using CRCReader = FieldReader; - - const baseband::Packet packet_; - const Reader field_; - - const size_t fcs_length = 16; - - size_t data_and_fcs_length() const; - size_t data_length() const; - - bool length_valid() const; -}; - -} /* namespace acars */ - -#endif /*__ACARS_PACKET_H__*/ diff --git a/firmware/common/aprs_packet.hpp b/firmware/common/aprs_packet.hpp index 47bcf3d4..52894b19 100644 --- a/firmware/common/aprs_packet.hpp +++ b/firmware/common/aprs_packet.hpp @@ -276,7 +276,7 @@ class APRSPacket { if (!is_digits(sub)) { return 0; } else { - return std::stoi(sub); + return atoi(sub.c_str()); } } diff --git a/firmware/common/backlight.hpp b/firmware/common/backlight.hpp index 703b5c24..6f773229 100644 --- a/firmware/common/backlight.hpp +++ b/firmware/common/backlight.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __BACKLIGHT_H +#define __BACKLIGHT_H #include @@ -118,3 +119,5 @@ class BacklightCAT4004 : public BacklightBase { }; } /* namespace portapack */ + +#endif diff --git a/firmware/common/battery.cpp b/firmware/common/battery.cpp index 3871a96e..bf49ba4a 100644 --- a/firmware/common/battery.cpp +++ b/firmware/common/battery.cpp @@ -1,151 +1,26 @@ #include "battery.hpp" -#include "event_m0.hpp" #include "portapack.hpp" -#include "ads1110.hpp" -#include "max17055.hpp" - -// uncomment if you want to emulate batt management system -// #define USE_BATT_EMULATOR - -extern I2C portapack::i2c0; +#include "i2cdev_max17055.hpp" +#include "i2cdev_ads1110.hpp" namespace battery { -constexpr uint32_t BATTERY_UPDATE_INTERVAL = 20000; -BatteryManagement::BatteryModules BatteryManagement::detected_ = BatteryManagement::BATT_NONE; - -ads1110::ADS1110 battery_ads1110{portapack::i2c0, 0x48}; -max17055::MAX17055 battery_max17055{portapack::i2c0, 0x36}; - -Thread* BatteryManagement::thread = nullptr; bool BatteryManagement::calcOverride = false; -void BatteryManagement::detect() { - // try to detect supported modules - detected_ = BATT_NONE; - if (battery_max17055.detect()) { - battery_max17055.init(); - detected_ = BATT_MAX17055; - return; - } - if (battery_ads1110.detect()) { - battery_ads1110.init(); - detected_ = BATT_ADS1110; - return; - } - - // add new supported module detect + init here - -#ifdef USE_BATT_EMULATOR - if (detected_ == BATT_NONE) { - detected_ = BATT_EMULATOR; - return; - } -#endif -} - -void BatteryManagement::init(bool override) { - calcOverride = override; - detect(); - // sets timer to query and broadcats this info - create_thread(); -} - -bool BatteryManagement::reset_learned() { - if (detected_ == BATT_MAX17055) { - return battery_max17055.reset_learned(); - } - return false; -} - // set if the default percentage calculation should be overrided by voltage based one void BatteryManagement::set_calc_override(bool override) { calcOverride = override; } -// sets the values, it the currend module supports it. -void BatteryManagement::getBatteryInfo(uint8_t& valid_mask, uint8_t& batteryPercentage, uint16_t& voltage, int32_t& current) { - if (detected_ == BATT_NONE) { - valid_mask = BATT_VALID_NONE; - return; - } else if (detected_ == BATT_ADS1110) { - battery_ads1110.getBatteryInfo(valid_mask, voltage); - batteryPercentage = calc_percent_voltage(voltage); - return; - } else if (detected_ == BATT_MAX17055) { - battery_max17055.getBatteryInfo(valid_mask, batteryPercentage, voltage, current); - if (calcOverride) { - valid_mask &= ~BATT_VALID_PERCENT; // indicate it is voltage based - batteryPercentage = calc_percent_voltage(voltage); - } - return; - } - // add new module query here - -#ifdef USE_BATT_EMULATOR - if (detected_ == BATT_EMULATOR) { - batteryPercentage += 5; // % - if (batteryPercentage > 100) batteryPercentage = 0; - voltage = rand() % 1000 + 3000; // mV - current = rand() % 150; // mA - isCharging = rand() % 2; - valid_mask = 7; - return true; - } -#endif - - (void)current; -} - -uint16_t BatteryManagement::get_cycles() { - if (detected_ == BATT_MAX17055) { - return (uint16_t)battery_max17055.getValue("Cycles"); - } - return 0; -} - -float BatteryManagement::get_tte() { - if (detected_ == BATT_MAX17055) { - return battery_max17055.getValue("TTE"); - } - return 0; -} -float BatteryManagement::get_ttf() { - if (detected_ == BATT_MAX17055) { - return battery_max17055.getValue("TTF"); - } - return 0; -} - -uint16_t BatteryManagement::read_register(const uint8_t reg) { - if (detected_ == BATT_MAX17055) { - return battery_max17055.read_register(reg); - } - return 0xFFFF; -} - -bool BatteryManagement::write_register(const uint8_t reg, const uint16_t value) { - if (detected_ == BATT_MAX17055) { - return battery_max17055.write_register(reg, value); - } +// Helper function to checkif there is ANY battery management ic present. +bool BatteryManagement::isDetected() { + auto dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_MAX17055); + if (dev) return true; + dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_ADS1110); + if (dev) return true; return false; } -uint8_t BatteryManagement::getPercent() { - if (detected_ == BATT_NONE) return 102; - uint8_t validity = 0; - uint8_t batteryPercentage = 0; - uint16_t voltage = 0; - int32_t current = 0; - getBatteryInfo(validity, batteryPercentage, voltage, current); - if ((validity & BATT_VALID_VOLTAGE) != BATT_VALID_VOLTAGE) return 102; - if (calcOverride || ((validity & BATT_VALID_PERCENT) != BATT_VALID_PERCENT)) { - validity &= ~BATT_VALID_PERCENT; // indicate it is voltage based - batteryPercentage = calc_percent_voltage(voltage); - } - return batteryPercentage; -} - uint8_t BatteryManagement::calc_percent_voltage(uint16_t voltage) { // Calculate the remaining battery percentage uint8_t batteryPercentage = (float)(voltage - BATTERY_MIN_VOLTAGE) / (float)(BATTERY_MAX_VOLTAGE - BATTERY_MIN_VOLTAGE) * 100.0; @@ -154,42 +29,49 @@ uint8_t BatteryManagement::calc_percent_voltage(uint16_t voltage) { return batteryPercentage; } -uint16_t BatteryManagement::getVoltage() { - if (detected_ == BATT_NONE) return 0; - uint8_t validity = 0; - uint8_t batteryPercentage = 0; - uint16_t voltage = 0; - int32_t current = 0; - getBatteryInfo(validity, batteryPercentage, voltage, current); - if ((validity & BATT_VALID_VOLTAGE) != BATT_VALID_VOLTAGE) return 0; - return voltage; +// helper function to get data from ANY batt management ic +void BatteryManagement::getBatteryInfo(uint8_t& valid_mask, uint8_t& percent, uint16_t& voltage, int32_t& current) { + auto dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_MAX17055); + if (dev) { + ((i2cdev::I2cDev_MAX17055*)dev)->getBatteryInfo(valid_mask, percent, voltage, current); + return; + } + dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_ADS1110); + if (dev) { + voltage = ((i2cdev::I2cDev_ADS1110*)dev)->readVoltage(); + percent = calc_percent_voltage(voltage); + valid_mask = 1; + return; + } + + valid_mask = 0; } -msg_t BatteryManagement::timer_fn(void* arg) { - (void)arg; - uint8_t validity = 0; - uint8_t batteryPercentage = 102; - uint16_t voltage = 0; - int32_t current = 0; - chThdSleepMilliseconds(1000); // wait ui for fully load - while (1) { - if (!detected_) { - detect(); // try to detect it again, it maybe disconnected while pp was powered up - chThdSleepMilliseconds(500); - } - if (detected_) { - BatteryManagement::getBatteryInfo(validity, batteryPercentage, voltage, current); - // send local message - BatteryStateMessage msg{validity, batteryPercentage, current >= 0, voltage}; - EventDispatcher::send_message(msg); - } - chThdSleepMilliseconds(BATTERY_UPDATE_INTERVAL); +// helper function to get data from ANY batt management ic +uint16_t BatteryManagement::get_cycles() { + auto dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_MAX17055); + if (dev) { + return ((i2cdev::I2cDev_MAX17055*)dev)->getValue("Cycles"); } return 0; } -void BatteryManagement::create_thread() { - thread = chThdCreateFromHeap(NULL, 512, NORMALPRIO, BatteryManagement::timer_fn, nullptr); +// helper function to get data from ANY batt management ic +float BatteryManagement::get_tte() { + auto dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_MAX17055); + if (dev) { + return ((i2cdev::I2cDev_MAX17055*)dev)->getValue("TTE"); + } + return 0; +} + +// helper function to get data from ANY batt management ic +float BatteryManagement::get_ttf() { + auto dev = i2cdev::I2CDevManager::get_dev_by_model(I2CDEVMDL_MAX17055); + if (dev) { + return ((i2cdev::I2cDev_MAX17055*)dev)->getValue("TTF"); + } + return 0; } } // namespace battery \ No newline at end of file diff --git a/firmware/common/battery.hpp b/firmware/common/battery.hpp index 6601420b..a7e32fb5 100644 --- a/firmware/common/battery.hpp +++ b/firmware/common/battery.hpp @@ -23,7 +23,6 @@ #define __BATTERY_H__ #include -#include "ch.h" namespace battery { @@ -31,14 +30,9 @@ namespace battery { #define BATTERY_MAX_VOLTAGE 4170.0 #define BATTERY_DESIGN_CAP 2500 +// this will just hold the config and a calculation. also some defines above for the battery management. could be movet to the classes, but it is a bit more readeable i think. class BatteryManagement { public: - enum BatteryModules { - BATT_NONE = 0, - BATT_ADS1110 = 1, - BATT_MAX17055 = 2, - BATT_EMULATOR = 254 - }; enum BatteryValidMask { BATT_VALID_NONE = 0, BATT_VALID_VOLTAGE = 1, @@ -47,28 +41,16 @@ class BatteryManagement { BATT_VALID_CYCLES = 8, BATT_VALID_TTEF = 16, }; - static void init(bool override = false); - static void detect(); - static bool isDetected() { return detected_ != BATT_NONE; } - static BatteryModules detectedModule() { return detected_; } - static void getBatteryInfo(uint8_t& valid_mask, uint8_t& batteryPercentage, uint16_t& voltage, int32_t& current); - static uint16_t getVoltage(); - static uint8_t getPercent(); - static uint16_t read_register(const uint8_t reg); - static bool write_register(const uint8_t reg, const uint16_t value); + static bool isDetected(); static void set_calc_override(bool override); static uint8_t calc_percent_voltage(uint16_t); // calculates battery percentage from the voltage - static bool reset_learned(); // resets the ic's learned parameters + static bool calcOverride; // if set to true, it'll override the battery percent calculation based on current voltage. + static void getBatteryInfo(uint8_t& valid_mask, uint8_t& percent, uint16_t& voltage, int32_t& current); static uint16_t get_cycles(); static float get_tte(); static float get_ttf(); private: - static void create_thread(); - static msg_t timer_fn(void* arg); - static Thread* thread; - static BatteryModules detected_; // if there is any batt management system - static bool calcOverride; // if set to true, it'll override the battery percent calculation based on current voltage. }; }; // namespace battery #endif \ No newline at end of file diff --git a/firmware/common/buffer_exchange.hpp b/firmware/common/buffer_exchange.hpp index b188ba6b..7e4e4411 100644 --- a/firmware/common/buffer_exchange.hpp +++ b/firmware/common/buffer_exchange.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __BUFFER_EXCHANGE_H +#define __BUFFER_EXCHANGE_H #include "ch.h" @@ -110,3 +111,5 @@ class BufferExchange { StreamBuffer* get_prefill(FIFO* fifo); }; + +#endif diff --git a/firmware/common/cpld_max5.cpp b/firmware/common/cpld_max5.cpp index 894c0a78..b1fb6889 100644 --- a/firmware/common/cpld_max5.cpp +++ b/firmware/common/cpld_max5.cpp @@ -332,5 +332,40 @@ uint32_t CPLD::AGM_read(uint32_t address) { return jtag.shift_dr(32, encoded_address, 0x0); } +void CPLD::AGM_write(const std::array& block, uint32_t magic_value) { + shift_ir(instruction_t::AGM_SET_REGISTER); + jtag.runtest_tck(100); + jtag.shift_dr(8, 0xf0); + jtag.runtest_tck(100); + + shift_ir(instruction_t::AGM_ERASE); + jtag.runtest_tck(100); + jtag.runtest_ms(500); + + shift_ir(instruction_t::AGM_SET_REGISTER); + jtag.runtest_tck(100); + jtag.shift_dr(8, 0xf0); + jtag.runtest_tck(100); + + shift_ir(instruction_t::AGM_PROGRAM); + jtag.runtest_tck(100); + + auto data = block.data(); + for (size_t i = 0; i < 0x12B; i++) { + auto address = AGM_encode_address(i * 4, 0x40); + jtag.shift_dr(32, address, data[i]); + jtag.runtest_ms(2); + } + + jtag.shift_dr(32, 0x00000040, magic_value); + jtag.runtest_ms(2); + + for (size_t i = 0x12B; i < block.size(); i++) { + auto address = AGM_encode_address(i * 4, 0x40); + jtag.shift_dr(32, address, data[i]); + jtag.runtest_ms(2); + } +} + } /* namespace max5 */ } /* namespace cpld */ diff --git a/firmware/common/cpld_max5.hpp b/firmware/common/cpld_max5.hpp index e8dfdf8c..dcbbac2a 100644 --- a/firmware/common/cpld_max5.hpp +++ b/firmware/common/cpld_max5.hpp @@ -99,6 +99,7 @@ class CPLD { void AGM_enter_read_mode(); uint32_t AGM_encode_address(uint32_t address, uint32_t trailer); uint32_t AGM_read(uint32_t address); + void AGM_write(const std::array& block, uint32_t magic_value); private: using idcode_t = uint32_t; diff --git a/firmware/common/crc.hpp b/firmware/common/crc.hpp index c278ca93..ac812596 100644 --- a/firmware/common/crc.hpp +++ b/firmware/common/crc.hpp @@ -190,4 +190,21 @@ class Adler32 { } }; +static const unsigned char parity_numbits[256] = { + 0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, + 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8}; + +class ParityCheck { + public: + static bool parity_check(uint8_t ch, uint8_t pbitpos = 1) { + return ((parity_numbits[ch] & pbitpos) != 0); + } +}; + #endif /*__CRC_H__*/ diff --git a/firmware/common/emu_cc1101.hpp b/firmware/common/emu_cc1101.hpp deleted file mode 100644 index 1245a4e8..00000000 --- a/firmware/common/emu_cc1101.hpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2017 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2017 Furrtek - * - * 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 __EMU_CC1101_H__ -#define __EMU_CC1101_H__ - -#include -#include - -#include "utility.hpp" - -namespace cc1101 { - -// Data rate (Bauds) -// Whitening: Everything except preamble and sync word, init value = 111111111 -// Packet format: preamble, sync word, (opt) length, (opt) address, payload, (opt) CRC -// Preamble: 8*n bits of 10101010 -// Sync word: 2 bytes (can be repeated twice) -// Length: 1 byte (address + payload) -// 2-FSK: 0=-dev, 1=+dev -// 4-FSK: 00=-1/3dev, 01=-dev, 10=1/3dev, 11=+dev (preamble and sync are in 2-FSK) -// OOK: PA on or off -// ASK: Power can be adjusted -// FEC: ? - -class CC1101Emu { - public: - // CC1101Emu(); - //~CC1101Emu(); - - enum packet_mode_t { - FIXED_LENGTH, - VARIABLE_LENGTH, - INFINITE_LENGTH - }; - - enum modulation_t { - TWO_FSK, - GFSK, - OOK, - FOUR_FSK, - MSK, - }; - - void set_sync_word(const uint16_t sync_word) { - sync_word_ = sync_word; - }; - void set_address(const uint8_t address) { - address_ = address; - }; - void set_packet_length(const uint8_t packet_length) { - packet_length_ = packet_length; - }; - void set_data_config(const bool CRC, const bool manchester, const bool whitening) { - CRC_ = CRC; - manchester_ = manchester; - whitening_ = whitening; - }; - void set_packet_mode(const packet_mode_t packet_mode) { - packet_mode_ = packet_mode; - }; - void set_modulation(const modulation_t modulation) { - modulation_ = modulation; - } - void set_num_preamble(const uint8_t num_preamble) { // 2, 3, 4, 6, 8, 12, 16, or 24 - num_preamble_ = num_preamble; - }; - void set_deviation(const size_t deviation) { - deviation_ = deviation; - }; - - private: - uint16_t sync_word_{0xD391}; - uint8_t address_{0x00}; - uint8_t packet_length_{0}; - bool CRC_{false}; - bool manchester_{false}; - bool whitening_{true}; - packet_mode_t packet_mode_{VARIABLE_LENGTH}; - modulation_t modulation_{TWO_FSK}; - uint8_t num_preamble_{4}; - size_t deviation_{4000}; - - uint16_t whitening_pn{0x1FF}; - - void whitening_init(); - uint8_t whiten_byte(uint8_t byte); -}; - -} /* namespace cc1101 */ - -#endif /*__EMU_CC1101_H__*/ diff --git a/firmware/common/external_app.hpp b/firmware/common/external_app.hpp index c257671b..0a5726c4 100644 --- a/firmware/common/external_app.hpp +++ b/firmware/common/external_app.hpp @@ -27,7 +27,7 @@ #include "spi_image.hpp" #include "standalone_app.hpp" -#define CURRENT_HEADER_VERSION 0x00000002 +#define CURRENT_HEADER_VERSION 0x00000003 #define MIN_HEADER_VERSION_FOR_CHECKSUM 0x00000002 typedef void (*externalAppEntry_t)(ui::NavigationView& nav); @@ -42,6 +42,7 @@ struct application_information_t { uint8_t bitmap_data[32]; uint32_t icon_color; app_location_t menu_location; + int32_t desired_menu_position; portapack::spi_flash::image_tag_t m4_app_tag; uint32_t m4_app_offset; diff --git a/firmware/common/ffconf.h b/firmware/common/ffconf.h index 6d03383f..8ec2b72a 100644 --- a/firmware/common/ffconf.h +++ b/firmware/common/ffconf.h @@ -90,7 +90,7 @@ / 950 - Traditional Chinese (DBCS) */ -#define _USE_LFN 2 +#define _USE_LFN 3 #define _MAX_LFN 255 /* The _USE_LFN switches the support of long file name (LFN). / @@ -189,7 +189,7 @@ / Instead of private sector buffer eliminated from the file object, common sector / buffer in the file system object (FATFS) is used for the file data transfer. */ -#define _FS_EXFAT 0 +#define _FS_EXFAT 1 /* This option switches support of exFAT file system. (0:Disable or 1:Enable) / When enable exFAT, also LFN needs to be enabled. (_USE_LFN >= 1) / Note that enabling exFAT discards ANSI C (C89) compatibility. */ diff --git a/firmware/common/i2c_pp.cpp b/firmware/common/i2c_pp.cpp index 0e37f1ec..6ccb8de2 100644 --- a/firmware/common/i2c_pp.cpp +++ b/firmware/common/i2c_pp.cpp @@ -29,6 +29,21 @@ void I2C::stop() { i2cStop(_driver); } +bool I2C::probe(i2caddr_t addr, systime_t timeout) { + i2cAcquireBus(_driver); + chSysLock(); + _driver->errors = I2CD_NO_ERROR; + _driver->state = I2C_ACTIVE_TX; + msg_t rdymsg = i2c_lld_master_transmit_timeout(_driver, addr, nullptr, 0, nullptr, 0, timeout); + if (rdymsg == RDY_TIMEOUT) + _driver->state = I2C_LOCKED; + else + _driver->state = I2C_READY; + chSysUnlock(); + i2cReleaseBus(_driver); + return (rdymsg == RDY_OK); +} + bool I2C::transfer( const address_t slave_address, const uint8_t* const data_tx, diff --git a/firmware/common/i2c_pp.hpp b/firmware/common/i2c_pp.hpp index 4fd23ac9..f67298a4 100644 --- a/firmware/common/i2c_pp.hpp +++ b/firmware/common/i2c_pp.hpp @@ -59,7 +59,7 @@ class I2C { void start(const I2CConfig& config); void stop(); - + bool probe(i2caddr_t addr, systime_t timeout = TIME_INFINITE); bool receive( const address_t slave_address, uint8_t* const data, diff --git a/firmware/common/ads1110.cpp b/firmware/common/i2cdev_ads1110.cpp similarity index 75% rename from firmware/common/ads1110.cpp rename to firmware/common/i2cdev_ads1110.cpp index 6734b75f..97256b26 100644 --- a/firmware/common/ads1110.cpp +++ b/firmware/common/i2cdev_ads1110.cpp @@ -19,53 +19,60 @@ * Boston, MA 02110-1301, USA. */ -#include "ads1110.hpp" +#include "i2cdev_ads1110.hpp" #include "utility.hpp" #include #include -namespace battery { -namespace ads1110 { +namespace i2cdev { -void ADS1110::init() { - if (!detected_) { - detected_ = detect(); - } - if (detected_) { +bool I2cDev_ADS1110::init(uint8_t addr_) { + if (addr_ != I2CDEV_ADS1110_ADDR_1) return false; + addr = addr_; + model = I2CDEVMDL_ADS1110; + query_interval = BATTERY_WIDGET_REFRESH_INTERVAL; + + if (detect()) { // Set the configuration register write(0x8C); + return true; } + return false; } -bool ADS1110::detect() { +bool I2cDev_ADS1110::detect() { uint8_t data[3]; - if (bus.receive(bus_address, data, 3)) { + if (i2cbus.receive(addr, data, 3)) { // Check if the received data is valid uint8_t configRegister = data[2]; if ((configRegister & 0x0F) == 0x0C) { // The configuration register value matches the expected value (0x8C) - detected_ = true; return true; } } - detected_ = false; return false; } -bool ADS1110::write(const uint8_t value) { - return bus.transmit(bus_address, &value, 1); +void I2cDev_ADS1110::update() { + uint16_t voltage = readVoltage(); + uint8_t batteryPercentage = battery::BatteryManagement::calc_percent_voltage(voltage); + // send local message + BatteryStateMessage msg{1, batteryPercentage, false, voltage}; + EventDispatcher::send_message(msg); +} + +bool I2cDev_ADS1110::write(const uint8_t value) { + return i2cbus.transmit(addr, &value, 1); } // returns the batt voltage in mV -uint16_t ADS1110::readVoltage() { +uint16_t I2cDev_ADS1110::readVoltage() { // Read the conversion result uint8_t data[3]; - if (!bus.receive(bus_address, data, 3)) { + if (!i2cbus.receive(addr, data, 3)) { return 0.0f; // Return 0 if the read fails } - uint16_t raw = (static_cast(data[0]) << 8) | data[1]; - // Calculate the voltage based on the output code int16_t voltage = 0; float minCode = 0; @@ -115,10 +122,4 @@ uint16_t ADS1110::readVoltage() { return (uint16_t)voltage; } -void ADS1110::getBatteryInfo(uint8_t& valid_mask, uint16_t& voltage) { - voltage = readVoltage(); - valid_mask = 1; // BATT_VALID_VOLTAGE -} - -} /* namespace ads1110 */ -} // namespace battery \ No newline at end of file +} /* namespace i2cdev */ \ No newline at end of file diff --git a/firmware/common/ads1110.hpp b/firmware/common/i2cdev_ads1110.hpp similarity index 64% rename from firmware/common/ads1110.hpp rename to firmware/common/i2cdev_ads1110.hpp index a8014943..9333814b 100644 --- a/firmware/common/ads1110.hpp +++ b/firmware/common/i2cdev_ads1110.hpp @@ -19,39 +19,29 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __ADS1110_H__ -#define __ADS1110_H__ +#ifndef __I2CDEV_ADS1110_H__ +#define __I2CDEV_ADS1110_H__ #include #include #include +#include "battery.hpp" +#include "i2cdevmanager.hpp" -#include "i2c_pp.hpp" -namespace battery { -namespace ads1110 { +namespace i2cdev { using address_t = uint8_t; -class ADS1110 { +class I2cDev_ADS1110 : public I2cDev { public: - constexpr ADS1110(I2C& bus, const I2C::address_t bus_address) - : bus(bus), bus_address(bus_address), detected_(false) {} - - void init(); - bool detect(); - bool isDetected() const { return detected_; } - + bool init(uint8_t addr_) override; + void update() override; uint16_t readVoltage(); - void getBatteryInfo(uint8_t& valid_mask, uint16_t& voltage); private: - I2C& bus; - const I2C::address_t bus_address; - bool detected_; - bool write(const uint8_t value); + bool detect(); }; -} /* namespace ads1110 */ -} // namespace battery -#endif /* __ADS1110_H__ */ \ No newline at end of file +} /* namespace i2cdev */ +#endif /* __I2CDEV_ADS1110_H__ */ \ No newline at end of file diff --git a/firmware/common/i2cdev_bh1750.cpp b/firmware/common/i2cdev_bh1750.cpp new file mode 100644 index 00000000..f4e20032 --- /dev/null +++ b/firmware/common/i2cdev_bh1750.cpp @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2024 HTotoo. + * + * 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 "i2cdev_bh1750.hpp" +#include "utility.hpp" +#include +#include + +namespace i2cdev { + +#define BH1750_CONV_FACTOR 1.2 +#define BH1750_MODE 0x13 + +bool I2cDev_BH1750::init(uint8_t addr_) { + if (addr_ != I2CDEV_BH1750_ADDR_1) return false; + addr = addr_; + model = I2CDECMDL_BH1750; + query_interval = 3; + + // power up + uint8_t tmp = 0x01; + if (!i2c_write(nullptr, 0, &tmp, 1)) { + return false; + } + chThdSleepMilliseconds(10); + // set mode + tmp = BH1750_MODE; + if (!i2c_write(nullptr, 0, &tmp, 1)) { + return false; + } + chThdSleepMilliseconds(10); + + /* + // unused, since default + // mtreg + tmp = (0b01000 << 3) | (69 >> 5); + if (!i2c_write(nullptr, 0, &tmp, 1)) { + return false; + } + chThdSleepMilliseconds(10); + tmp = (0b011 << 5) | (69 & 0b11111); + if (!i2c_write(nullptr, 0, &tmp, 1)) { + return false; + } + chThdSleepMilliseconds(10); + // mode + tmp = BH1750_MODE; + if (!i2c_write(nullptr, 0, &tmp, 1)) { + return false; + } + chThdSleepMilliseconds(10); + */ + return true; +} + +void I2cDev_BH1750::update() { + uint16_t light = readLight(); + LightDataMessage msg{light}; + EventDispatcher::send_message(msg); +} + +uint16_t I2cDev_BH1750::readLight() { + float level = -1.0; + uint8_t tmp[2]; + // Read two bytes from the sensor, which are low and high parts of the sensor value + if (i2c_read(nullptr, 0, tmp, 2)) { + uint16_t t = (tmp[0] << 8) | tmp[1]; + level = t; + } + + if (level != -1.0) { + // Convert raw value to lux + level /= BH1750_CONV_FACTOR; + } else + return 0; + return level; +} + +} /* namespace i2cdev */ \ No newline at end of file diff --git a/firmware/baseband/proc_noop.cpp b/firmware/common/i2cdev_bh1750.hpp similarity index 65% rename from firmware/baseband/proc_noop.cpp rename to firmware/common/i2cdev_bh1750.hpp index acd06bb5..55f4ecef 100644 --- a/firmware/baseband/proc_noop.cpp +++ b/firmware/common/i2cdev_bh1750.hpp @@ -1,6 +1,5 @@ /* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek + * Copyright (C) 2024 HTotoo. * * This file is part of PortaPack. * @@ -20,19 +19,25 @@ * Boston, MA 02110-1301, USA. */ -#include "proc_noop.hpp" -#include "event_m4.hpp" +#ifndef __I2CDEV_BH1750_H__ +#define __I2CDEV_BH1750_H__ #include +#include +#include +#include "battery.hpp" +#include "i2cdevmanager.hpp" -void NOOPProcessor::execute(const buffer_c8_t& buffer) { - for (size_t i = 0; i < buffer.count; i++) { - buffer.p[i] = {0, 0}; - } -} +namespace i2cdev { -int main() { - EventDispatcher event_dispatcher{std::make_unique()}; - event_dispatcher.run(); - return 0; -} +using address_t = uint8_t; + +class I2cDev_BH1750 : public I2cDev { + public: + bool init(uint8_t addr_) override; + void update() override; + uint16_t readLight(); +}; + +} /* namespace i2cdev */ +#endif /* __I2CDEV_BH1750_H__ */ \ No newline at end of file diff --git a/firmware/common/i2cdev_bmx280.cpp b/firmware/common/i2cdev_bmx280.cpp new file mode 100644 index 00000000..5ce20f50 --- /dev/null +++ b/firmware/common/i2cdev_bmx280.cpp @@ -0,0 +1,188 @@ +/* + * Copyright (C) 2024 HTotoo. + * + * 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 "i2cdev_bmx280.hpp" + +namespace i2cdev { + +bool I2cDev_BMX280::init(uint8_t addr_) { + if (addr_ != I2CDEV_BMX280_ADDR_1 && addr_ != I2CDEV_BMX280_ADDR_2) return false; + addr = addr_; // store the addr so i2c write / read will use this. + model = I2C_DEVMDL::I2CDEVMDL_BMP280; // set the device model!!!!!!!!!!!!!!!!!! + query_interval = 5; // set update interval in sec + + uint8_t reg = BME280_REG_CHIPID; // register + uint8_t tmp = 0; // value. will save fw space, but harder to read code. so read comments + i2c_read(®, 1, &tmp, 1); // read chip id to tmp + if (tmp != CHIP_ID_BMP280 && tmp != CHIP_ID_BME280) return false; // this is not BME280 or BMP280, so skip + if (tmp == CHIP_ID_BME280) model = I2C_DEVMDL::I2CDEVMDL_BME280; // update dev model, since this driver can handle 2 type of models + + // here we can be "sure" this is a bmp280, so init it + + // soft reset the ic + reg = BME280_REG_RESET; + tmp = RESET_KEY; + i2c_write(®, 1, &tmp, 1); + chThdSleepMilliseconds(10); // wait to get awake + uint8_t timeout = 0; // wait for calibration data load + while (is_reading_calib()) { + timeout++; + if (timeout > 200) return false; // timeout, bad device + chThdSleepMilliseconds(10); + } + read_coeff(); + set_sampling(); + chThdSleepMilliseconds(50); + return true; +} + +void I2cDev_BMX280::update() { + float temp = read_temperature(); // internal data gathering from the device. + float pressure = read_pressure(); + float hum = read_humidity(); + EnvironmentDataMessage msg{temp, hum, pressure}; // create the system message + EventDispatcher::send_message(msg); // and send it +} + +/* + + INTERNAL FUNCTIONS + +*/ + +bool I2cDev_BMX280::is_reading_calib() { + uint8_t const rStatus = read8_1(BMX280_REG_STATUS); + return (rStatus & (1 << 0)) != 0; +} + +void I2cDev_BMX280::read_coeff() { + _dig_T1 = read16_LE_1(BMX280_REG_DIG_T1); + _dig_T2 = readS16_LE_1(BMX280_REG_DIG_T2); + _dig_T3 = readS16_LE_1(BMX280_REG_DIG_T3); + + _dig_P1 = read16_LE_1(BMX280_REG_DIG_P1); + _dig_P2 = readS16_LE_1(BMX280_REG_DIG_P2); + _dig_P3 = readS16_LE_1(BMX280_REG_DIG_P3); + _dig_P4 = readS16_LE_1(BMX280_REG_DIG_P4); + _dig_P5 = readS16_LE_1(BMX280_REG_DIG_P5); + _dig_P6 = readS16_LE_1(BMX280_REG_DIG_P6); + _dig_P7 = readS16_LE_1(BMX280_REG_DIG_P7); + _dig_P8 = readS16_LE_1(BMX280_REG_DIG_P8); + _dig_P9 = readS16_LE_1(BMX280_REG_DIG_P9); + + if (model == I2C_DEVMDL::I2CDEVMDL_BME280) { + _dig_H1 = read8_1(BME280_REG_DIG_H1); + _dig_H2 = readS16_LE_1(BME280_REG_DIG_H2); + _dig_H3 = read8_1(BME280_REG_DIG_H3); + _dig_H4 = ((int8_t)read8_1(BME280_REG_DIG_H4) << 4) | (read8_1(BME280_REG_DIG_H4 + 1) & 0xF); + _dig_H5 = ((int8_t)read8_1(BME280_REG_DIG_H5 + 1) << 4) | (read8_1(BME280_REG_DIG_H5) >> 4); + _dig_H6 = (int8_t)read8_1(BME280_REG_DIG_H6); + } +} + +void I2cDev_BMX280::set_sampling() { + // + write8_1(BMX280_REG_CTRL_MEAS, BMX280_MODE_SLEEP); + write8_1(BMX280_REG_CONFIG, (uint8_t)((BMX280_STANDBY_MS_0_5 << 5) | (BMX280_FILTER_OFF << 2))); + if (model == I2C_DEVMDL::I2CDEVMDL_BME280) write8_1(BME280_REG_CTRL_HUM, BMX280_SAMPLING_X16); + write8_1(BMX280_REG_CTRL_MEAS, (uint8_t)((BMX280_SAMPLING_X16 << 5) | (BMX280_SAMPLING_X16 << 2) | BMX280_MODE_NORMAL)); +} + +float I2cDev_BMX280::read_temperature() { + int32_t var1, var2; + + int32_t adc_T = read24_1(BMX280_REG_TEMP); + if (adc_T == 0x800000) // value in case temp measurement was disabled + return 0; + adc_T >>= 4; + + var1 = (int32_t)((adc_T / 8) - ((int32_t)_dig_T1 * 2)); + var1 = (var1 * ((int32_t)_dig_T2)) / 2048; + var2 = (int32_t)((adc_T / 16) - ((int32_t)_dig_T1)); + var2 = (((var2 * var2) / 4096) * ((int32_t)_dig_T3)) / 16384; + + _t_fine = var1 + var2; // + t_fine_adjust; + + int32_t T = (_t_fine * 5 + 128) / 256; + return (float)T / 100; +} + +float I2cDev_BMX280::read_pressure() { + int64_t var1, var2, var3, var4; + + // readTemperature(); // must be done first to get t_fine + + int32_t adc_P = read24_1(BMX280_REG_PRESS); + if (adc_P == 0x800000) // value in case pressure measurement was disabled + return 0; + adc_P >>= 4; + + var1 = ((int64_t)_t_fine) - 128000; + var2 = var1 * var1 * (int64_t)_dig_P6; + var2 = var2 + ((var1 * (int64_t)_dig_P5) * 131072); + var2 = var2 + (((int64_t)_dig_P4) * 34359738368); + var1 = ((var1 * var1 * (int64_t)_dig_P3) / 256) + + ((var1 * ((int64_t)_dig_P2) * 4096)); + var3 = ((int64_t)1) * 140737488355328; + var1 = (var3 + var1) * ((int64_t)_dig_P1) / 8589934592; + + if (var1 == 0) { + return 0; // avoid exception caused by division by zero + } + + var4 = 1048576 - adc_P; + var4 = (((var4 * 2147483648) - var2) * 3125) / var1; + var1 = (((int64_t)_dig_P9) * (var4 / 8192) * (var4 / 8192)) / + 33554432; + var2 = (((int64_t)_dig_P8) * var4) / 524288; + var4 = ((var4 + var1 + var2) / 256) + (((int64_t)_dig_P7) * 16); + + float P = var4 / 256.0; + return P / 100; +} + +float I2cDev_BMX280::read_humidity() { + if (model != I2C_DEVMDL::I2CDEVMDL_BME280) return 0; + int32_t var1, var2, var3, var4, var5; + // readTemperature(); // must be done first to get t_fine + int32_t adc_H = read16_1(BME280_REG_HUM); + if (adc_H == 0x8000) // value in case humidity measurement was disabled + return 0; + + var1 = _t_fine - ((int32_t)76800); + var2 = (int32_t)(adc_H * 16384); + var3 = (int32_t)(((int32_t)_dig_H4) * 1048576); + var4 = ((int32_t)_dig_H5) * var1; + var5 = (((var2 - var3) - var4) + (int32_t)16384) / 32768; + var2 = (var1 * ((int32_t)_dig_H6)) / 1024; + var3 = (var1 * ((int32_t)_dig_H3)) / 2048; + var4 = ((var2 * (var3 + (int32_t)32768)) / 1024) + (int32_t)2097152; + var2 = ((var4 * ((int32_t)_dig_H2)) + 8192) / 16384; + var3 = var5 * var2; + var4 = ((var3 / 32768) * (var3 / 32768)) / 128; + var5 = var3 - ((var4 * ((int32_t)_dig_H1)) / 16); + var5 = (var5 < 0 ? 0 : var5); + var5 = (var5 > 419430400 ? 419430400 : var5); + uint32_t H = (uint32_t)(var5 / 4096); + return (float)H / 1024.0; +} + +} // namespace i2cdev \ No newline at end of file diff --git a/firmware/common/i2cdev_bmx280.hpp b/firmware/common/i2cdev_bmx280.hpp new file mode 100644 index 00000000..9313e6d0 --- /dev/null +++ b/firmware/common/i2cdev_bmx280.hpp @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2024 HTotoo. + * + * 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. + */ + +/* + DEAR DEVS THIS IS AN EXAMPLE FILE FOR i2C COMMUNICATION + YOU have to derive your class from I2cDev and override the init(), and the update() + The update() query the device, and send the corresponding Message to the system with the data. + The init() must check the device if it is really that this driver meant to handle, and fully set the device up. If all ok, set the device's model to the corresponting enum value from "i2cdevlist.hpp" and return true. Othervise false, so next driver can check it. (since multiple different devices manufactured with the same addr) + + You can create custom functions, that can be called from any app that identifies the device and casts the I2cDev to your class. + This can be checked by query the 'model' variable. + + Steps: + - Add this new module name in the i2cdevlist.hpp's enum (to the end) + - Create a hpp and cpp. (in the init SET THE MODULE to the prev enum value you created). If the filename is i2cdev_*.cpp it'll be added to cmake automatically. + - Add this header to i2cdevmanager.cpp, and add an if statement and the init code to the I2CDevManager::found() function. (see examples) + - Compile and test. + - Create a PR. + + Notes: try to create a minimal code, to save FW space. + +*/ + +#ifndef __I2CDEV_BMP280_H__ +#define __I2CDEV_BMP280_H__ + +#include "i2cdevmanager.hpp" + +namespace i2cdev { + +// Register defines +#define BMX280_REG_DIG_T1 0x88 //!< Temperature coefficient register +#define BMX280_REG_DIG_T2 0x8A //!< Temperature coefficient register +#define BMX280_REG_DIG_T3 0x8C //!< Temperature coefficient register + +#define BMX280_REG_DIG_P1 0x8E //!< Pressure coefficient register +#define BMX280_REG_DIG_P2 0x90 //!< Pressure coefficient register +#define BMX280_REG_DIG_P3 0x92 //!< Pressure coefficient register +#define BMX280_REG_DIG_P4 0x94 //!< Pressure coefficient register +#define BMX280_REG_DIG_P5 0x96 //!< Pressure coefficient register +#define BMX280_REG_DIG_P6 0x98 //!< Pressure coefficient register +#define BMX280_REG_DIG_P7 0x9A //!< Pressure coefficient register +#define BMX280_REG_DIG_P8 0x9C //!< Pressure coefficient register +#define BMX280_REG_DIG_P9 0x9E //!< Pressure coefficient register + +#define BME280_REG_DIG_H1 0xA1 //!< Humidity coefficient register +#define BME280_REG_DIG_H2 0xE1 //!< Humidity coefficient register +#define BME280_REG_DIG_H3 0xE3 //!< Humidity coefficient register +#define BME280_REG_DIG_H4 0xE4 //!< Humidity coefficient register +#define BME280_REG_DIG_H5 0xE5 //!< Humidity coefficient register +#define BME280_REG_DIG_H6 0xE7 //!< Humidity coefficient register + +#define BME280_REG_CHIPID 0xD0 //!< Chip ID register +#define BME280_REG_RESET 0xE0 //!< Reset register + +#define BME280_REG_CTRL_HUM 0xF2 //!< BME280: Control humidity register +#define BMX280_REG_STATUS 0XF3 //!< Status register +#define BMX280_REG_CTRL_MEAS 0xF4 //!< Control measure register +#define BMX280_REG_CONFIG 0xF5 //!< Config register +#define BMX280_REG_PRESS 0xF7 //!< Pressure data register +#define BMX280_REG_TEMP 0xFA //!< Temperature data register +#define BME280_REG_HUM 0xFD //!< Humidity data register + +// Bit defines +#define CHIP_ID_BMP280 0x58 //!< BMP280 chip ID +#define CHIP_ID_BME280 0x60 //!< BME280 chip ID +#define RESET_KEY 0xB6 //!< Reset value for reset register +#define STATUS_IM_UPDATE 0 //!< im_update bit in status register + +#define BMX280_SAMPLING_X4 0b011 +#define BMX280_SAMPLING_X16 0b101 +#define BMX280_FILTER_OFF 0 +#define BMX280_STANDBY_MS_0_5 0 +#define BMX280_MODE_NORMAL 0b11 +#define BMX280_MODE_SLEEP 0b00 + +class I2cDev_BMX280 : public I2cDev { + public: + bool init(uint8_t addr_) override; // sets the addr to our local variable, set the model, try to init the module, and only return true if it is really that module, and inited ok + void update() override; // query the module for recent data, and send it to the system via the corresponding Message + + private: + // driver specific stuff + void read_coeff(); + void set_sampling(); + float read_temperature(); + float read_pressure(); + float read_humidity(); + bool is_reading_calib(); + uint16_t _dig_T1 = 0; + int16_t _dig_T2 = 0; + int16_t _dig_T3 = 0; + + uint16_t _dig_P1 = 0; + int16_t _dig_P2 = 0; + int16_t _dig_P3 = 0; + int16_t _dig_P4 = 0; + int16_t _dig_P5 = 0; + int16_t _dig_P6 = 0; + int16_t _dig_P7 = 0; + int16_t _dig_P8 = 0; + int16_t _dig_P9 = 0; + + uint8_t _dig_H1 = 0; + int16_t _dig_H2 = 0; + uint8_t _dig_H3 = 0; + int16_t _dig_H4 = 0; + int16_t _dig_H5 = 0; + int8_t _dig_H6 = 0; + + int32_t _t_fine = 0; +}; +} // namespace i2cdev + +#endif \ No newline at end of file diff --git a/firmware/common/max17055.cpp b/firmware/common/i2cdev_max17055.cpp similarity index 85% rename from firmware/common/max17055.cpp rename to firmware/common/i2cdev_max17055.cpp index 2c09d484..7e6ea605 100644 --- a/firmware/common/max17055.cpp +++ b/firmware/common/i2cdev_max17055.cpp @@ -19,17 +19,17 @@ 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 "max17055.hpp" +#include "i2cdev_max17055.hpp" +#include "battery.hpp" #include "utility.hpp" #include "portapack_persistent_memory.hpp" #include #include #include -namespace battery { -namespace max17055 { +namespace i2cdev { -const RegisterEntry MAX17055::entries[] = { +const I2cDev_MAX17055::RegisterEntry I2cDev_MAX17055::entries[] = { {"Status", 0x00, "", 1, false, "", false, 0, true, false, false, 0, false}, {"VAlrtTh", 0x01, "", 1, false, "", false, 0, true, false, false, 0, false}, {"TAlrtTh", 0x02, "", 1, false, "", false, 0, true, false, false, 0, false}, @@ -184,48 +184,57 @@ const RegisterEntry MAX17055::entries[] = { {"Reserved", 0xFF, "", 0.00390625, false, "%", true, 6, true, false, false, 0, true}, }; -void MAX17055::init() { - if (!detected_) { - detected_ = detect(); - } - if (detected_) { - if (needsInitialization()) { - // First-time or POR initialization - full_reset_and_init(); - } else { - // Subsequent boot - partialInit(); - } - partialInit(); - // statusClear(); I am not sure if this should be here or not - } +void I2cDev_MAX17055::update() { + uint8_t validity = 0; + uint8_t batteryPercentage = 102; + uint16_t voltage = 0; + int32_t current = 0; + getBatteryInfo(validity, batteryPercentage, voltage, current); + + // send local message + BatteryStateMessage msg{validity, batteryPercentage, current >= 25, voltage}; + EventDispatcher::send_message(msg); } -bool MAX17055::full_reset_and_init() { +bool I2cDev_MAX17055::init(uint8_t addr_) { + if (addr_ != I2CDEV_MAX17055_ADDR_1) return false; + addr = addr_; + model = I2CDEVMDL_MAX17055; + query_interval = BATTERY_WIDGET_REFRESH_INTERVAL; + if (detect()) { + bool return_status = true; + if (needsInitialization()) { + // First-time or POR initialization + return_status = full_reset_and_init(); + } + partialInit(); // If you always want hibernation disabled + // statusClear(); // I am not sure if this should be here or not (Clear all bits in the Status register (0x00)) + return return_status; + } + return false; +} + +bool I2cDev_MAX17055::full_reset_and_init() { if (!soft_reset()) { return false; } - if (!initialize_custom_parameters()) { return false; } - if (!load_custom_parameters()) { return false; } - if (!clear_por()) { return false; } - return true; } -bool MAX17055::soft_reset() { +bool I2cDev_MAX17055::soft_reset() { return write_register(0x0BB, 0x0000); } -bool MAX17055::initialize_custom_parameters() { +bool I2cDev_MAX17055::initialize_custom_parameters() { if (!write_register(0xD0, 0x03E8)) return false; // Unknown register, possibly related to battery profile if (!write_register(0xDB, 0x0000)) return false; // ModelCfg if (!write_register(0x05, 0x0000)) return false; // RepCap @@ -241,7 +250,7 @@ bool MAX17055::initialize_custom_parameters() { return true; } -bool MAX17055::load_custom_parameters() { +bool I2cDev_MAX17055::load_custom_parameters() { uint16_t hib_cfg = read_register(0xBA); if (!write_register(0xBA, 0x0000)) return false; // Disable hibernate mode if (!write_register(0x60, 0x0000)) return false; // Unknown register @@ -259,13 +268,13 @@ bool MAX17055::load_custom_parameters() { return true; } -bool MAX17055::clear_por() { +bool I2cDev_MAX17055::clear_por() { uint16_t status = read_register(0x00); status &= ~(1 << 1); return write_register(0x00, status); } -bool MAX17055::needsInitialization() { +bool I2cDev_MAX17055::needsInitialization() { uint16_t UserMem1 = read_register(0x40); if (UserMem1 == 0) { @@ -274,41 +283,37 @@ bool MAX17055::needsInitialization() { return false; } -void MAX17055::partialInit() { +void I2cDev_MAX17055::partialInit() { // Only update necessary volatile settings setHibCFG(0x0000); // If you always want hibernation disabled // Add any other volatile settings that need updating } -bool MAX17055::reset_learned() { +bool I2cDev_MAX17055::reset_learned() { // this if for reset all the learned parameters by ic // the full inis should do this - full_reset_and_init(); - return true; + return full_reset_and_init(); } -bool MAX17055::detect() { +bool I2cDev_MAX17055::detect() { // Read the DevName register (0x21) uint16_t dev_name = read_register(0x21); // The DevName register should return 0x4010 for MAX17055 if (dev_name == 0x4010) { - detected_ = true; return true; } // If DevName doesn't match, try reading Status register as a fallback uint16_t status = read_register(0x00); if (status != 0xFFFF && status != 0x0000) { - detected_ = true; return true; } - detected_ = false; return false; } -const RegisterEntry* MAX17055::findEntry(const char* name) const { +const I2cDev_MAX17055::RegisterEntry* I2cDev_MAX17055::findEntry(const char* name) const { for (const auto& entry : entries) { if (std::strcmp(entry.name, name) == 0) { return &entry; @@ -317,48 +322,47 @@ const RegisterEntry* MAX17055::findEntry(const char* name) const { return nullptr; } -uint16_t MAX17055::read_register(const uint8_t reg) { +uint16_t I2cDev_MAX17055::read_register(const uint8_t reg) { const std::array tx{reg}; std::array rx{0x00, 0x00}; - bus.transmit(bus_address, tx.data(), tx.size()); - bus.receive(bus_address, rx.data(), rx.size()); + i2cbus.transmit(addr, tx.data(), tx.size()); + i2cbus.receive(addr, rx.data(), rx.size()); // Combine the two bytes into a 16-bit value // little-endian format (LSB first) return static_cast((rx[1] << 8) | rx[0]); } -bool MAX17055::write_register(const uint8_t reg, const uint16_t value) { +bool I2cDev_MAX17055::write_register(const uint8_t reg, const uint16_t value) { std::array tx; tx[0] = reg; tx[1] = value & 0xFF; // Low byte tx[2] = (value >> 8) & 0xFF; // High byte - bool success = bus.transmit(bus_address, tx.data(), tx.size()); + bool success = i2cbus.transmit(addr, tx.data(), tx.size()); chThdSleepMilliseconds(1); return success; } -void MAX17055::getBatteryInfo(uint8_t& valid_mask, uint8_t& batteryPercentage, uint16_t& voltage, int32_t& current) { - if (detected_) { - // Read Status Register - uint16_t status = read_register(0x00); - voltage = averageMVoltage(); - if ((status == 0 && voltage == 0) || (status == 0x0002 && voltage == 3600) || (status == 0x0002 && voltage == 0)) { - valid_mask = 0; - return; - } - batteryPercentage = stateOfCharge(); - current = instantCurrent(); - valid_mask = 31; // BATT_VALID_VOLTAGE + CURRENT + PERCENT + BATT_VALID_CYCLES + BATT_VALID_TTEF - } else { - // let's indicate the data is wrong. ui will handle this by display UNK values. +void I2cDev_MAX17055::getBatteryInfo(uint8_t& valid_mask, uint8_t& batteryPercentage, uint16_t& voltage, int32_t& current) { + // Read Status Register + uint16_t status = read_register(0x00); + voltage = averageMVoltage(); + if ((status == 0 && voltage == 0) || (status == 0x0002 && voltage == 3600) || (status == 0x0002 && voltage == 0)) { valid_mask = 0; + return; + } + batteryPercentage = stateOfCharge(); + current = instantCurrent(); + valid_mask = 31; // BATT_VALID_VOLTAGE + CURRENT + PERCENT + BATT_VALID_CYCLES + BATT_VALID_TTEF + if (battery::BatteryManagement::calcOverride) { + valid_mask &= ~battery::BatteryManagement::BATT_VALID_PERCENT; // indicate it is voltage based + batteryPercentage = battery::BatteryManagement::calc_percent_voltage(voltage); } } -float MAX17055::getValue(const char* entityName) { +float I2cDev_MAX17055::getValue(const char* entityName) { const RegisterEntry* entry = findEntry(entityName); if (entry) { uint16_t raw_value = read_register(entry->address); @@ -376,11 +380,11 @@ float MAX17055::getValue(const char* entityName) { return 0; // Return 0 if entry not found } -uint16_t MAX17055::averageMVoltage(void) { +uint16_t I2cDev_MAX17055::averageMVoltage(void) { return static_cast(getValue("AvgVCell") * 1000.0f); // Convert to millivolts } -int32_t MAX17055::instantCurrent(void) { +int32_t I2cDev_MAX17055::instantCurrent(void) { return getValue("Current"); // Get Data from IC @@ -395,11 +399,11 @@ int32_t MAX17055::instantCurrent(void) { return _Value; } -uint16_t MAX17055::stateOfCharge(void) { +uint16_t I2cDev_MAX17055::stateOfCharge(void) { return getValue("RepSOC"); } -bool MAX17055::setEmptyVoltage(uint16_t _Empty_Voltage) { +bool I2cDev_MAX17055::setEmptyVoltage(uint16_t _Empty_Voltage) { // Calculate the new VE_Empty value (upper 9 bits) uint16_t ve_empty = ((_Empty_Voltage * 100) / 10) & 0xFF80; @@ -413,7 +417,7 @@ bool MAX17055::setEmptyVoltage(uint16_t _Empty_Voltage) { return write_register(0x3A, new_value); } -bool MAX17055::setRecoveryVoltage(uint16_t _Recovery_Voltage) { +bool I2cDev_MAX17055::setRecoveryVoltage(uint16_t _Recovery_Voltage) { // Calculate the new VR_Empty value (lower 7 bits) uint16_t vr_empty = (_Recovery_Voltage * 25) & 0x007F; // 40mV per bit, 25 = 1000/40 @@ -427,7 +431,7 @@ bool MAX17055::setRecoveryVoltage(uint16_t _Recovery_Voltage) { return write_register(0x3A, new_value); } -bool MAX17055::setMinVoltage(uint16_t _Minimum_Voltage) { +bool I2cDev_MAX17055::setMinVoltage(uint16_t _Minimum_Voltage) { uint16_t current_value = read_register(0x01); uint16_t min_voltage_raw = (_Minimum_Voltage * 50) & 0x00FF; // 20mV per bit, 50 = 1000/20 @@ -436,7 +440,7 @@ bool MAX17055::setMinVoltage(uint16_t _Minimum_Voltage) { return write_register(0x01, new_value); } -bool MAX17055::setMaxVoltage(uint16_t _Maximum_Voltage) { +bool I2cDev_MAX17055::setMaxVoltage(uint16_t _Maximum_Voltage) { uint16_t current_value = read_register(0x01); uint16_t max_voltage_raw = ((_Maximum_Voltage * 50) & 0x00FF) << 8; // 20mV per bit, 50 = 1000/20 @@ -445,7 +449,7 @@ bool MAX17055::setMaxVoltage(uint16_t _Maximum_Voltage) { return write_register(0x01, new_value); } -bool MAX17055::setMaxCurrent(uint16_t _Maximum_Current) { +bool I2cDev_MAX17055::setMaxCurrent(uint16_t _Maximum_Current) { uint16_t current_value = read_register(0xB4); uint16_t max_current_raw = ((_Maximum_Current * 25) & 0x00FF) << 8; // 40mV per bit, 25 = 1000/40 @@ -454,34 +458,34 @@ bool MAX17055::setMaxCurrent(uint16_t _Maximum_Current) { return write_register(0xB4, new_value); } -bool MAX17055::setChargeTerminationCurrent(uint16_t _Charge_Termination_Current) { +bool I2cDev_MAX17055::setChargeTerminationCurrent(uint16_t _Charge_Termination_Current) { float lsb_mA = 1.5625 / (__MAX17055_Resistor__ * 1000); // Convert to mA uint16_t ichgterm_value = static_cast(round(_Charge_Termination_Current / lsb_mA)); return write_register(0x1E, ichgterm_value); } -bool MAX17055::setDesignCapacity(const uint16_t _Capacity) { +bool I2cDev_MAX17055::setDesignCapacity(const uint16_t _Capacity) { uint16_t raw_cap = (uint16_t)_Capacity * 2; return write_register(0x18, raw_cap); } -bool MAX17055::setFullCapRep(const uint16_t _Capacity) { +bool I2cDev_MAX17055::setFullCapRep(const uint16_t _Capacity) { uint16_t raw_cap = _Capacity * 2; // 0.5mAh per LSB return write_register(0x10, raw_cap); } -bool MAX17055::setFullCapNom(const uint16_t _Capacity) { +bool I2cDev_MAX17055::setFullCapNom(const uint16_t _Capacity) { uint16_t raw_cap = _Capacity * 2; // 0.5mAh per LSB return write_register(0x23, raw_cap); } -bool MAX17055::setRepCap(const uint16_t _Capacity) { +bool I2cDev_MAX17055::setRepCap(const uint16_t _Capacity) { uint16_t raw_cap = _Capacity * 2; // 0.5mAh per LSB return write_register(0x05, raw_cap); } -bool MAX17055::setMinSOC(uint8_t _Minimum_SOC) { +bool I2cDev_MAX17055::setMinSOC(uint8_t _Minimum_SOC) { uint16_t current_value = read_register(0x03); uint16_t min_soc_raw = ((_Minimum_SOC * 256) / 100) & 0x00FF; @@ -490,7 +494,7 @@ bool MAX17055::setMinSOC(uint8_t _Minimum_SOC) { return write_register(0x03, new_value); } -bool MAX17055::setMaxSOC(uint8_t _Maximum_SOC) { +bool I2cDev_MAX17055::setMaxSOC(uint8_t _Maximum_SOC) { uint16_t current_value = read_register(0x03); uint16_t max_soc_raw = (((_Maximum_SOC * 256) / 100) & 0x00FF) << 8; @@ -499,7 +503,7 @@ bool MAX17055::setMaxSOC(uint8_t _Maximum_SOC) { return write_register(0x03, new_value); } -bool MAX17055::setMinTemperature(uint8_t _Minimum_Temperature) { +bool I2cDev_MAX17055::setMinTemperature(uint8_t _Minimum_Temperature) { uint16_t current_value = read_register(0x02); uint16_t min_temp_raw = (uint8_t)_Minimum_Temperature; @@ -508,7 +512,7 @@ bool MAX17055::setMinTemperature(uint8_t _Minimum_Temperature) { return write_register(0x02, new_value); } -bool MAX17055::setMaxTemperature(uint8_t _Maximum_Temperature) { +bool I2cDev_MAX17055::setMaxTemperature(uint8_t _Maximum_Temperature) { uint16_t current_value = read_register(0x02); uint16_t max_temp_raw = ((uint8_t)_Maximum_Temperature) << 8; @@ -517,7 +521,7 @@ bool MAX17055::setMaxTemperature(uint8_t _Maximum_Temperature) { return write_register(0x02, new_value); } -bool MAX17055::setModelCfg(const uint8_t _Model_ID) { +bool I2cDev_MAX17055::setModelCfg(const uint8_t _Model_ID) { uint16_t model_cfg = 0x0400; // Set Charge Voltage (bit 10) // Set Battery Model @@ -537,11 +541,11 @@ bool MAX17055::setModelCfg(const uint8_t _Model_ID) { return write_register(0xDB, model_cfg); } -bool MAX17055::setHibCFG(const uint16_t _Config) { +bool I2cDev_MAX17055::setHibCFG(const uint16_t _Config) { return write_register(0xBA, _Config); } -void MAX17055::config(void) { +void I2cDev_MAX17055::config(void) { uint16_t config1 = 0x0000; uint16_t config2 = 0x0618; // Default value: 0b00011000 00000110 @@ -575,7 +579,7 @@ void MAX17055::config(void) { write_register(0xBB, config2); } -bool MAX17055::statusClear() { +bool I2cDev_MAX17055::statusClear() { // Clear all bits in the Status register (0x00) return write_register(0x00, 0x0000); } @@ -584,7 +588,7 @@ bool bitRead(uint8_t value, uint8_t bit) { return (value >> bit) & 0x01; } -bool MAX17055::statusControl(const uint8_t _Status) { +bool I2cDev_MAX17055::statusControl(const uint8_t _Status) { // Read Status Register (0x00) uint16_t status_register = read_register(0x00); @@ -621,5 +625,4 @@ bool MAX17055::statusControl(const uint8_t _Status) { } } -} /* namespace max17055 */ -} // namespace battery \ No newline at end of file +} /* namespace i2cdev */ diff --git a/firmware/common/max17055.hpp b/firmware/common/i2cdev_max17055.hpp similarity index 93% rename from firmware/common/max17055.hpp rename to firmware/common/i2cdev_max17055.hpp index 8e5d6ce9..1b7414b9 100644 --- a/firmware/common/max17055.hpp +++ b/firmware/common/i2cdev_max17055.hpp @@ -25,9 +25,9 @@ #include #include #include - #include "battery.hpp" -#include "i2c_pp.hpp" + +#include "i2cdevmanager.hpp" #define MAX17055_POR 0 #define MAX17055_IMin 1 @@ -248,41 +248,36 @@ #define MAX17055_AtRateEn 0 #endif -namespace battery { -namespace max17055 { +namespace i2cdev { using address_t = uint8_t; -struct RegisterEntry { - const char* name; - uint8_t address; - const char* type; - float scalar; - bool is_signed; - const char* unit; - bool abbr_units; - int resolution; - bool is_user; - bool is_save_restore; - bool is_nv; - uint16_t por_data; - bool is_read_only; -}; - -class MAX17055 { +class I2cDev_MAX17055 : public I2cDev { public: - constexpr MAX17055(I2C& bus, const I2C::address_t bus_address) - : bus(bus), bus_address(bus_address), detected_(false) {} - + struct RegisterEntry { + const char* name; + uint8_t address; + const char* type; + float scalar; + bool is_signed; + const char* unit; + bool abbr_units; + int resolution; + bool is_user; + bool is_save_restore; + bool is_nv; + uint16_t por_data; + bool is_read_only; + }; static const RegisterEntry entries[]; static constexpr size_t entries_count = 144; uint16_t read_register(const uint8_t reg); bool write_register(const uint8_t reg, const uint16_t value); - void init(); + bool init(uint8_t addr_) override; + void update() override; bool detect(); - bool isDetected() const { return detected_; } void getBatteryInfo(uint8_t& valid_mask, uint8_t& batteryPercentage, uint16_t& voltage, int32_t& current); bool reset_learned(); @@ -293,10 +288,6 @@ class MAX17055 { uint16_t stateOfCharge(void); private: - I2C& bus; - const I2C::address_t bus_address; - bool detected_ = false; - const RegisterEntry* findEntry(const char* name) const; bool needsInitialization(); @@ -330,6 +321,5 @@ class MAX17055 { void config(void); }; -} /* namespace max17055 */ -} // namespace battery +} /* namespace i2cdev */ #endif /* __MAX17055_H__ */ \ No newline at end of file diff --git a/firmware/common/i2cdev_ppmod.cpp b/firmware/common/i2cdev_ppmod.cpp new file mode 100644 index 00000000..9699b5fa --- /dev/null +++ b/firmware/common/i2cdev_ppmod.cpp @@ -0,0 +1,236 @@ +/* + * Copyright (C) 2024 Bernd Herzog + * + * 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 "i2cdev_ppmod.hpp" +#include "portapack.hpp" +#include + +#define SENSORUPDATETIME 10 + +extern "C" { +void complete_i2chost_to_device_transfer(uint8_t* data, size_t length); +void create_shell_i2c(EventDispatcher* evtd); +} + +namespace i2cdev { + +bool I2cDev_PPmod::init(uint8_t addr_) { + if (addr_ != I2CDEV_PPMOD_ADDR_1) return false; + addr = addr_; + model = I2CDECMDL_PPMOD; + query_interval = 1; // self timer will handle the update interval per subdevice + mask = get_features_mask(); + if (mask & (uint64_t)SupportedFeatures::FEAT_SHELL) { + create_shell_i2c(I2CDevManager::get_event_dispatcher()); + } + + return true; +} + +void I2cDev_PPmod::update() { + // mask = get_features_mask(); //saved on init. replug device if something changed. //needs to revise when modules come out. + if (mask & (uint64_t)SupportedFeatures::FEAT_GPS && self_timer % SENSORUPDATETIME == 0) { + auto data = get_gps_data(); + if (data.has_value()) { + GPSPosDataMessage msg{data.value().latitude, data.value().longitude, (int32_t)data.value().altitude, (int32_t)data.value().speed, data.value().sats_in_use}; + EventDispatcher::send_message(msg); + } + } + if (mask & (uint64_t)SupportedFeatures::FEAT_ORIENTATION && self_timer % SENSORUPDATETIME == 0) { + auto data = get_orientation_data(); + if (data.has_value()) { + OrientationDataMessage msg{(uint16_t)data.value().angle, (int16_t)data.value().tilt}; + EventDispatcher::send_message(msg); + } + } + if (mask & (uint64_t)SupportedFeatures::FEAT_ENVIRONMENT && self_timer % SENSORUPDATETIME == 0) { + auto data = get_environment_data(); + if (data.has_value()) { + EnvironmentDataMessage msg{data.value().temperature, data.value().humidity, data.value().pressure}; + EventDispatcher::send_message(msg); + } + } + if (mask & (uint64_t)SupportedFeatures::FEAT_LIGHT && self_timer % SENSORUPDATETIME == 0) { + auto data = get_light_data(); + if (data.has_value()) { + LightDataMessage msg{data.value()}; + EventDispatcher::send_message(msg); + } + } + if (mask & (uint64_t)SupportedFeatures::FEAT_SHELL) { + auto commcnt = get_shell_buffer_bytes(); + if (commcnt > 0) { + bool has_more = false; + uint8_t buff[65]; // 0 th byte is the has_more flag, and size sent + do { + if (get_shell_get_buffer_data(buff, 65)) { + if (buff[0] == 0xff) { + break; // error + } + has_more = buff[0] & 0x80; + size_t size = buff[0] & 0x7F; + complete_i2chost_to_device_transfer(&buff[1], size); + } else { + has_more = false; + } + } while (has_more); + } + } + self_timer++; + if (self_timer >= 250) { + self_timer = 0; // rounding bc of uint8_t overflow + } +} + +bool I2cDev_PPmod::get_shell_get_buffer_data(uint8_t* buff, size_t len) { + Command cmd = Command::COMMAND_SHELL_MODTOPP_DATA; + return i2c_read((uint8_t*)&cmd, 2, buff, len); +} + +std::optional I2cDev_PPmod::get_orientation_data() { + Command cmd = Command::COMMAND_GETFEAT_DATA_ORIENTATION; + orientation_t data; + bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&data, sizeof(orientation_t)); + if (success == false) { + return std::nullopt; + } + return data; +} + +std::optional I2cDev_PPmod::get_gps_data() { + Command cmd = Command::COMMAND_GETFEAT_DATA_GPS; + gpssmall_t data; + bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&data, sizeof(gpssmall_t)); + if (success == false) { + return std::nullopt; + } + return data; +} + +std::optional I2cDev_PPmod::get_environment_data() { + Command cmd = Command::COMMAND_GETFEAT_DATA_ENVIRONMENT; + environment_t data; + bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&data, sizeof(environment_t)); + if (success == false) { + return std::nullopt; + } + return data; +} + +std::optional I2cDev_PPmod::get_light_data() { + Command cmd = Command::COMMAND_GETFEAT_DATA_LIGHT; + uint16_t data; + bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&data, sizeof(uint16_t)); + if (success == false) { + return std::nullopt; + } + return data; +} + +uint16_t I2cDev_PPmod::get_shell_buffer_bytes() { + Command cmd = Command::COMMAND_SHELL_MODTOPP_DATA_SIZE; + uint16_t data; + bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&data, sizeof(uint16_t)); + if (success == false) { + return 0; + } + return data; +} + +uint64_t I2cDev_PPmod::get_features_mask() { + uint64_t mask_ = 0; + Command cmd = Command::COMMAND_GETFEATURE_MASK; + bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&mask_, sizeof(mask_)); + if (success == false) { + return 0; + } + // sanity check + if (mask_ == UINT64_MAX) { + return 0; + } + return mask_; +} + +std::optional I2cDev_PPmod::readDeviceInfo() { + Command cmd = Command::COMMAND_INFO; + I2cDev_PPmod::device_info info; + + bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&info, sizeof(I2cDev_PPmod::device_info)); + if (success == false) { + return std::nullopt; + } + // sanity check + if (info.application_count > 1000) { + return std::nullopt; + } + return info; +} + +std::optional I2cDev_PPmod::getStandaloneAppInfo(uint32_t index) { + Command cmd = Command::COMMAND_APP_INFO; + uint32_t data = (uint32_t)cmd + (index << 16); + I2cDev_PPmod::standalone_app_info info; + + bool success = i2c_read((uint8_t*)&data, 4, (uint8_t*)&info, sizeof(I2cDev_PPmod::standalone_app_info)); + if (success == false) { + return std::nullopt; + } + // sanity check + if (info.binary_size == UINT32_MAX) { + return std::nullopt; + } + + return info; +} + +constexpr size_t transfer_block_size = 128; + +std::vector I2cDev_PPmod::downloadStandaloneApp(uint32_t index, size_t offset) { + if (offset % transfer_block_size != 0) { + return {}; + } + + uint16_t data[3] = { + static_cast(Command::COMMAND_APP_TRANSFER), + static_cast(index & 0xFFFF), // keep index in 16 bits range + static_cast((offset / transfer_block_size) & 0xFFFF) // keep (offset / transfer_block_size) in 16 bits range + }; + + /* + // TODO: check if there was an out of range, manage error + if (index > std::numeric_limits::max()) { + // manage error if index is bigger than a 16 bits value + } + // TODO: check if there was an out of range, manage error + if (offset / transfer_block_size > std::numeric_limits::max()) { + // manage error if (offset / transfer_block_size ) is bigger than a 16 bits value + } + */ + std::vector ret(transfer_block_size); + bool success = i2c_read((uint8_t*)&data, sizeof(data), (uint8_t*)ret.data(), transfer_block_size); + if (success == false) { + return {}; + } + + return ret; +} + +} // namespace i2cdev diff --git a/firmware/common/i2cdev_ppmod.hpp b/firmware/common/i2cdev_ppmod.hpp new file mode 100644 index 00000000..7a3330cc --- /dev/null +++ b/firmware/common/i2cdev_ppmod.hpp @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2024 Bernd Herzog + * + * 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 __I2CDEV_PPMOD_H +#define __I2CDEV_PPMOD_H + +#include +#include +#include +#include + +#include "standalone_app.hpp" +#include "i2cdevmanager.hpp" + +#include "i2cdev_ppmod_helper.hpp" + +namespace i2cdev { + +class I2cDev_PPmod : public I2cDev { + public: + enum class Command : uint16_t { + COMMAND_NONE = 0, + + // will respond with device_info + COMMAND_INFO = 1, + + // will respond with info of application + COMMAND_APP_INFO, + + // will respond with application data + COMMAND_APP_TRANSFER, + + // Feature specific commands + COMMAND_GETFEATURE_MASK, + // Feature data getter commands + COMMAND_GETFEAT_DATA_GPS, + COMMAND_GETFEAT_DATA_ORIENTATION, + COMMAND_GETFEAT_DATA_ENVIRONMENT, + COMMAND_GETFEAT_DATA_LIGHT, + // Shell specific communication + COMMAND_SHELL_PPTOMOD_DATA, // pp shell to esp. size not defined + COMMAND_SHELL_MODTOPP_DATA_SIZE, // how many bytes the esp has to send to pp's shell + COMMAND_SHELL_MODTOPP_DATA, // the actual bytes sent by esp. 1st byte's 1st bit is the "hasmore" flag, the remaining 7 bits are the size of the data. exactly 64 byte follows. + + }; + + typedef struct { + uint32_t api_version; + uint32_t module_version; + char module_name[20]; + uint32_t application_count; + } device_info; + + typedef struct { + uint32_t header_version; + uint8_t app_name[16]; + uint8_t bitmap_data[32]; + uint32_t icon_color; + app_location_t menu_location; + uint32_t binary_size; + } standalone_app_info; + + bool init(uint8_t addr_) override; + void update() override; + + std::optional getStandaloneAppInfo(uint32_t index); + std::vector downloadStandaloneApp(uint32_t index, size_t offset); + uint64_t get_features_mask(); + std::optional readDeviceInfo(); + std::optional get_gps_data(); + std::optional get_orientation_data(); + std::optional get_environment_data(); + std::optional get_light_data(); + uint16_t get_shell_buffer_bytes(); + bool get_shell_get_buffer_data(uint8_t* buff, size_t len); + + private: + uint8_t self_timer = 0; + uint64_t mask = 0; // feauture mask, that indicates what the device can do. this will determinate what we will query from the device +}; + +} /* namespace i2cdev */ + +#endif diff --git a/firmware/common/i2cdev_ppmod_helper.hpp b/firmware/common/i2cdev_ppmod_helper.hpp new file mode 100644 index 00000000..72ccfe86 --- /dev/null +++ b/firmware/common/i2cdev_ppmod_helper.hpp @@ -0,0 +1,60 @@ +#ifndef I2CDEV_PPMOD_HELPER_H +#define I2CDEV_PPMOD_HELPER_H + +#include + +enum class SupportedFeatures : uint64_t { + FEAT_NONE = 0, // no polling needed + FEAT_EXT_APP = 1 << 0, // supplies external app + FEAT_UART = 1 << 1, // supplies UART communication + FEAT_GPS = 1 << 2, // can be queried for GPS info + FEAT_ORIENTATION = 1 << 3, // can be queried for orientation info + FEAT_ENVIRONMENT = 1 << 4, // can be queried for environment info + FEAT_LIGHT = 1 << 5, // can be queried for light info + FEAT_DISPLAY = 1 << 6, // can handle special display output + FEAT_SHELL = 1 << 7, // can handle shell commands (polling needed for that) +}; + +typedef struct +{ + uint8_t hour; /*!< Hour */ + uint8_t minute; /*!< Minute */ + uint8_t second; /*!< Second */ + uint16_t thousand; /*!< Thousand */ +} gps_time_t; + +typedef struct +{ + uint8_t day; /*!< Day (start from 1) */ + uint8_t month; /*!< Month (start from 1) */ + uint16_t year; /*!< Year (start from 2000) */ +} gps_date_t; + +typedef struct +{ + float latitude; /*!< Latitude (degrees) */ + float longitude; /*!< Longitude (degrees) */ + float altitude; /*!< Altitude (meters) */ + uint8_t sats_in_use; /*!< Number of satellites in use */ + uint8_t sats_in_view; /*!< Number of satellites in view */ + float speed; /*!< Ground speed, unit: m/s */ + gps_date_t date; /*!< Fix date */ + gps_time_t tim; /*!< time in UTC */ +} gpssmall_t; + +typedef struct +{ + float angle; + float tilt; +} orientation_t; + +typedef struct +{ + float temperature; + float humidity; + float pressure; +} environment_t; + +// light is uint16_t + +#endif \ No newline at end of file diff --git a/firmware/common/i2cdev_sht3x.cpp b/firmware/common/i2cdev_sht3x.cpp new file mode 100644 index 00000000..c5be7309 --- /dev/null +++ b/firmware/common/i2cdev_sht3x.cpp @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2024 HTotoo. + * + * 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 "i2cdev_sht3x.hpp" + +namespace i2cdev { + +bool I2cDev_SHT3x::init(uint8_t addr_) { + if (addr_ != I2CDEV_SHT3X_ADDR_1 && addr_ != I2CDEV_SHT3X_ADDR_2) return false; + addr = addr_; // store the addr + model = I2C_DEVMDL::I2CDEVMDL_SHT3X; // set the device model!!!!!!!!!!!!!!!!!! + query_interval = 5; // set update interval in sec + chThdSleepMilliseconds(50); + uint8_t tmp[2]; // command buffer + tmp[0] = 0x30; + tmp[1] = 0x66; + if (!i2c_write(nullptr, 0, tmp, 2)) return false; // heater off + chThdSleepMilliseconds(50); + tmp[0] = 0x22; + tmp[1] = 0x36; + if (!i2c_write(nullptr, 0, tmp, 2)) return false; // conti, 2mps + + chThdSleepMilliseconds(50); + return true; +} + +void I2cDev_SHT3x::update() { + float temp = 0; + float hum = 0; + uint8_t cmd[2]; + cmd[0] = 0xe0; + cmd[1] = 0; + uint8_t res[6]; + i2c_read(cmd, 2, res, 6); + uint16_t temptick = res[0] << 8 | res[1]; + uint16_t humtick = res[3] << 8 | res[4]; + + temp = -45 + (((float)temptick * 175.0) / 65535.0); + hum = (100.0 * (float)humtick) / 65535.0; + EnvironmentDataMessage msg{temp, hum}; // create the system message + EventDispatcher::send_message(msg); // and send it +} + +} // namespace i2cdev \ No newline at end of file diff --git a/firmware/baseband/proc_noop.hpp b/firmware/common/i2cdev_sht3x.hpp similarity index 58% rename from firmware/baseband/proc_noop.hpp rename to firmware/common/i2cdev_sht3x.hpp index a2532c60..17a9aad3 100644 --- a/firmware/baseband/proc_noop.hpp +++ b/firmware/common/i2cdev_sht3x.hpp @@ -1,6 +1,5 @@ /* - * Copyright (C) 2014 Jared Boone, ShareBrained Technology, Inc. - * Copyright (C) 2016 Furrtek + * Copyright (C) 2024 HTotoo. * * This file is part of PortaPack. * @@ -20,19 +19,22 @@ * Boston, MA 02110-1301, USA. */ -#ifndef __PROC_NOOP_H__ -#define __PROC_NOOP_H__ +#ifndef __I2CDEV_SHT3X_H__ +#define __I2CDEV_SHT3X_H__ -#include "baseband_processor.hpp" -#include "baseband_thread.hpp" +#include "i2cdevmanager.hpp" -class NOOPProcessor : public BasebandProcessor { +namespace i2cdev { + +class I2cDev_SHT3x : public I2cDev { public: - void execute(const buffer_c8_t& buffer) override; + bool init(uint8_t addr_) override; // sets the addr to our local variable, set the model, try to init the module, and only return true if it is really that module, and inited ok + void update() override; // query the module for recent data, and send it to the system via the corresponding Message private: - /* NB: Threads should be the last members in the class definition. */ - BasebandThread baseband_thread{1536000, this, baseband::Direction::Transmit}; + float read_temperature(); + float read_humidity(); }; +} // namespace i2cdev -#endif +#endif \ No newline at end of file diff --git a/firmware/common/i2cdevlist.hpp b/firmware/common/i2cdevlist.hpp new file mode 100644 index 00000000..34ad7126 --- /dev/null +++ b/firmware/common/i2cdevlist.hpp @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2024 HTotoo. + * + * 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 __I2CDEVLIST_H__ +#define __I2CDEVLIST_H__ + +/* + DEAR DEVS: Put your new driver to this enum's end. Also consider using define to store it's address. + If the same driver can handle multiple devices, with different data, should use different names. Like BMP280 + BME280. If the data is the same across multiple devices, can use the same name. Like SHT3x (sht30, sht31, ..) +*/ + +enum I2C_DEVMDL { + I2CDEVMDL_NOTSET, // i2c dev present, but no driver for it + I2CDEVMDL_MAX17055, + I2CDEVMDL_ADS1110, + I2CDEVMDL_SHT3X, + I2CDEVMDL_BMP280, + I2CDEVMDL_BME280, + I2CDECMDL_BH1750, + I2CDECMDL_PPMOD, +}; + +#define I2CDEV_BMX280_ADDR_1 0x76 +#define I2CDEV_BMX280_ADDR_2 0x77 +#define I2CDEV_SHT3X_ADDR_1 0x44 +#define I2CDEV_SHT3X_ADDR_2 0x45 + +#define I2CDEV_MAX17055_ADDR_1 0x36 +#define I2CDEV_ADS1110_ADDR_1 0x48 + +#define I2CDEV_BH1750_ADDR_1 0x23 + +#define I2CDEV_PPMOD_ADDR_1 0x51 + +// this will be the update interval for battery management ic's: +#define BATTERY_WIDGET_REFRESH_INTERVAL 10 + +#endif \ No newline at end of file diff --git a/firmware/common/i2cdevmanager.cpp b/firmware/common/i2cdevmanager.cpp new file mode 100644 index 00000000..a28ced39 --- /dev/null +++ b/firmware/common/i2cdevmanager.cpp @@ -0,0 +1,354 @@ +/* + * Copyright (C) 2024 HTotoo. + * + * 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 +#include "i2cdevmanager.hpp" + +/* + DEAR DEVS. + Include your devices headers here: +*/ + +#include "i2cdev_bmx280.hpp" +#include "i2cdev_sht3x.hpp" +#include "i2cdev_max17055.hpp" +#include "i2cdev_ads1110.hpp" +#include "i2cdev_bh1750.hpp" +#include "i2cdev_ppmod.hpp" + +namespace i2cdev { + +// statics +uint16_t I2CDevManager::scan_interval = 0; +bool I2CDevManager::force_scan = false; +Thread* I2CDevManager::thread; +std::vector I2CDevManager::devlist; +Mutex I2CDevManager::mutex_list{}; +EventDispatcher* I2CDevManager::_eventDispatcher; + +/* + DEAR DEVELOPERS! + IF YOU WANT TO ADD NEW DERIVERS, PUT IT'S I2C ADDRESS AND INIT PART HERE. + THE INIT MUST RETURN FALSE, WHEN THE DEVICE NOT MATCH OR NOT WORKING. +*/ + +bool I2CDevManager::found(uint8_t addr) { + // check if present already + for (size_t i = 0; i < devlist.size(); i++) { + if (devlist[i].addr == addr) return false; + } + // try to find a suitable driver + I2DevListElement item; + item.addr = addr; + + /* + DEAR DEVS + Put your driver's init code here. ALLWAYS check the !item.dev, if any other driver already took it. Also check the addr if it suits your module. (also need additional checks in the init() code) + */ + + if (!item.dev && (addr == I2CDEV_BMX280_ADDR_1 || addr == I2CDEV_BMX280_ADDR_2)) { // check if device is already taken, and i can handle the address + item.dev = std::make_unique(); + if (!item.dev->init(addr)) item.dev = nullptr; // if not inited, reset it's instance, and let other handlers try + } + + if (!item.dev && (addr == I2CDEV_SHT3X_ADDR_1 || addr == I2CDEV_SHT3X_ADDR_2)) { + item.dev = std::make_unique(); + if (!item.dev->init(addr)) item.dev = nullptr; + } + + if (!item.dev && (addr == I2CDEV_MAX17055_ADDR_1)) { + item.dev = std::make_unique(); + if (!item.dev->init(addr)) item.dev = nullptr; + } + + if (!item.dev && (addr == I2CDEV_ADS1110_ADDR_1)) { + item.dev = std::make_unique(); + if (!item.dev->init(addr)) item.dev = nullptr; + } + + if (!item.dev && (addr == I2CDEV_BH1750_ADDR_1)) { + item.dev = std::make_unique(); + if (!item.dev->init(addr)) item.dev = nullptr; + } + + if (!item.dev && (addr == I2CDEV_PPMOD_ADDR_1)) { + item.dev = std::make_unique(); + if (!item.dev->init(addr)) item.dev = nullptr; + } + + // if can't find any driver, add it too with empty, so we won't try to init it again and again + devlist.push_back(std::move(item)); + return true; +} + +/* + + +FROM HERE YOU SHOULDN'T WRITE ANYTHING IF YOU JUST IMPLEMENT A NEW DRIVER +(maybe maximum i2c_rewd / write helpers) + + + +*/ + +void I2cDev::set_update_interval(uint8_t interval) { + query_interval = interval; +} +uint8_t I2cDev::get_update_interval() { + return query_interval; +} + +void I2cDev::got_error() { + errcnt++; + if (errcnt >= 5) need_del = true; // too many errors. remove dev from list. may be re-discovered and re inited +} + +void I2cDev::got_success() { + errcnt = 0; +} + +/* + + I2C read / write functions and helpers. + +*/ + +bool I2cDev::i2c_read(uint8_t* reg, uint8_t reg_size, uint8_t* data, uint8_t bytes) { + if (bytes == 0) return false; + bool ret = true; + if (reg_size > 0 && reg) ret = i2cbus.transmit(addr, reg, reg_size, 150); + if (!ret) { + got_error(); + return false; + } + ret = i2cbus.receive(addr, data, bytes, 150); + if (!ret) + got_error(); + else + got_success(); + return ret; +} + +bool I2cDev::i2c_write(uint8_t* reg, uint8_t reg_size, uint8_t* data, uint8_t bytes) { + // Check if there's any data to write + if (bytes == 0) return false; + // Create a new buffer to hold both reg and data + uint8_t total_size = reg_size + bytes; + uint8_t* buffer = new uint8_t[total_size]; + // Copy the register data into the buffer + if (reg_size > 0 && reg) { + memcpy(buffer, reg, reg_size); + } + // Copy the data into the buffer after the register data + memcpy(buffer + reg_size, data, bytes); + // Transmit the combined data + bool result = i2cbus.transmit(addr, buffer, total_size, 150); + // Clean up the dynamically allocated buffer + delete[] buffer; + if (!result) + got_error(); + else + got_success(); + return result; +} + +bool I2cDev::write8_1(uint8_t reg, uint8_t data) { + return i2c_write(®, 1, &data, 1); +} + +uint8_t I2cDev::read8_1(uint8_t reg) { + uint8_t res = 0; + i2c_read(®, 1, &res, 1); + return res; +} + +uint16_t I2cDev::read16_1(uint8_t reg) { + uint8_t buffer[2]; + i2c_read(®, 1, buffer, 2); + return uint16_t(buffer[0]) << 8 | uint16_t(buffer[1]); +} +uint32_t I2cDev::read24_1(uint8_t reg) { + uint8_t buffer[3]; + i2c_read(®, 1, buffer, 2); + return uint32_t(buffer[0]) << 16 | uint32_t(buffer[1]) << 8 | uint32_t(buffer[2]); +} + +int16_t I2cDev::readS16_1(uint8_t reg) { + return (int16_t)read16_1(reg); +} + +uint16_t I2cDev::read16_LE_1(uint8_t reg) { + uint16_t res = read16_1(reg); + res = (res >> 8) | (res << 8); + return res; +} + +int16_t I2cDev::readS16_LE_1(uint8_t reg) { + return (int16_t)read16_LE_1(reg); +} + +// END OF i2C communication + helpers + +void I2CDevManager::init() { + force_scan = true; + create_thread(); +} + +void I2CDevManager::manual_scan() { + force_scan = true; +} + +void I2CDevManager::set_autoscan_interval(uint16_t interval) { + scan_interval = interval; +} +uint16_t I2CDevManager::get_autoscan_interval() { + return scan_interval; +} + +I2cDev* I2CDevManager::get_dev_by_addr(uint8_t addr) { + chMtxLock(&mutex_list); + for (size_t i = 0; i < devlist.size(); i++) { + if (devlist[i].addr == addr) { + chMtxUnlock(); + return devlist[i].dev.get(); + } + } + chMtxUnlock(); + return nullptr; +} + +I2cDev* I2CDevManager::get_dev_by_model(I2C_DEVMDL model) { + chMtxLock(&mutex_list); + for (size_t i = 0; i < devlist.size(); i++) { + if (devlist[i].dev && devlist[i].dev->model == model) { + chMtxUnlock(); + return devlist[i].dev.get(); + } + } + chMtxUnlock(); + return nullptr; +} + +std::vector I2CDevManager::get_dev_list_by_model() { + std::vector ret; + chMtxLock(&mutex_list); + for (size_t i = 0; i < devlist.size(); i++) { + if (devlist[i].dev) { + ret.push_back(devlist[i].dev->model); + } + } + chMtxUnlock(); + return ret; +} + +std::vector I2CDevManager::get_gev_list_by_addr() { + std::vector ret; + chMtxLock(&mutex_list); + for (size_t i = 0; i < devlist.size(); i++) { + if (devlist[i].addr) { + ret.push_back(devlist[i].addr); + } + } + chMtxUnlock(); + return ret; +} + +bool I2CDevManager::scan() { + bool changed = false; + std::vector currList; + for (uint8_t i = 1; i < 128; ++i) { + if (i2cbus.probe(i, 50)) { + chMtxLock(&mutex_list); + changed = changed | found(i); + chMtxUnlock(); + currList.push_back(i); + } + chThdSleepMilliseconds(1); + } + // remove those not present + for (size_t i = 0; i < devlist.size(); ++i) { + if (std::find(currList.begin(), currList.end(), devlist[i].addr) == currList.end()) { + // found on our list, but now not discovered, so remove it + devlist[i].addr = 0; // mark to delete + changed = true; + } + } + return changed; +} + +void I2CDevManager::create_thread() { + chMtxInit(&mutex_list); + thread = chThdCreateFromHeap(NULL, 2048, NORMALPRIO, I2CDevManager::timer_fn, nullptr); +} + +msg_t I2CDevManager::timer_fn(void* arg) { + (void)arg; + uint16_t curr_timer = 0; // seconds since thread start + while (1) { + systime_t start_time = chTimeNow(); + bool changed = false; + // check if i2c scan needed + if (force_scan || (scan_interval != 0 && curr_timer % scan_interval == 0)) { + changed = changed | scan(); + force_scan = false; + } + for (size_t i = 0; i < devlist.size(); i++) { + if (devlist[i].addr != 0 && devlist[i].dev && devlist[i].dev->query_interval != 0) { + if ((curr_timer % devlist[i].dev->query_interval) == 0) { // only if it is device's interval + devlist[i].dev->update(); // updates it's data, and broadcasts it. if there is any error it will handle in it, and later we can remove it + } + } + } + + // remove all unneeded items + chMtxLock(&mutex_list); + size_t cnt = devlist.size(); + devlist.erase(std::remove_if(devlist.begin(), devlist.end(), [](const I2DevListElement& x) { + if (x.addr == 0) return true; + if (x.dev && x.dev->need_del == true) return true; // self destruct on too many errors + return false; // won't remove the unidentified ones, so we can list them, and not trying all the time with them + }), + devlist.end()); + chMtxUnlock(); + if (cnt != devlist.size()) changed = true; + + if (changed) { + I2CDevListChangedMessage msg{}; + EventDispatcher::send_message(msg); + } + systime_t end_time = chTimeNow(); + systime_t delta = (end_time > start_time) ? end_time - start_time : 100; // wont calculate overflow, just guess. + if (delta > 950) delta = 950; // ensure minimum 50 milli sleep + + chThdSleepMilliseconds(1000 - delta); // 1sec timer + ++curr_timer; + } + return 0; +} + +}; // namespace i2cdev + +extern "C" int oNofityI2cFromShell(uint8_t* buff, size_t len) { + i2cdev::I2cDev* dev = i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDECMDL_PPMOD); + if (!dev) return 0; // nothing to send to, so /dev/null + uint16_t reg = 9; // COMMAND_SHELL_PPTOMOD_DATA; + if (dev->i2c_write((uint8_t*)®, 2, buff, len)) return 0; + return 0; // shoud have an error handler +} diff --git a/firmware/common/i2cdevmanager.hpp b/firmware/common/i2cdevmanager.hpp new file mode 100644 index 00000000..4c87bcc3 --- /dev/null +++ b/firmware/common/i2cdevmanager.hpp @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2024 HTotoo. + * + * 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 __I2CDEVMANAGER_H__ +#define __I2CDEVMANAGER_H__ + +#include +#include +#include +#include "ch.h" +#include "portapack.hpp" +#include "i2c_pp.hpp" +#include "i2cdevlist.hpp" +#include "event_m0.hpp" + +#define i2cbus portapack::i2c0 + +extern I2C portapack::i2c0; + +namespace i2cdev { + +// The device class. You'll derive your from this. Override init() and update(); +class I2cDev { + public: + virtual ~I2cDev(){}; + virtual bool init(uint8_t addr); // returns true if it is that that device we are looking for. + virtual void update() = 0; // override this, and you'll be able to query your device and broadcast the result to the system + + void set_update_interval(uint8_t interval); // sets the device's update interval in sec. if you change it, don't forget to change back to it's original value after you finished! + uint8_t get_update_interval(); // gets the device's update interval in sec + + bool i2c_read(uint8_t* reg, uint8_t reg_size, uint8_t* data, uint8_t bytes); // if want to read without register addr, just set reg_size to 0. this way can read 8, or 16 or 32 bit registers too. reg_size in bytes! returns true on succes. handles the errcnt automatically! + bool i2c_write(uint8_t* reg, uint8_t reg_size, uint8_t* data, uint8_t bytes); // if want to write without register addr, just set reg_size to 0. this way can read 8, or 16 or 32 bit registers too. reg_size in bytes! returns true on succes. handles the errcnt automatically! + + // helpers for easier i2c communication + uint8_t read8_1(uint8_t reg); + bool write8_1(uint8_t reg, uint8_t data); + uint16_t read16_1(uint8_t reg); + int16_t readS16_1(uint8_t reg); + uint16_t read16_LE_1(uint8_t reg); + int16_t readS16_LE_1(uint8_t reg); + uint32_t read24_1(uint8_t reg); + + bool need_del = false; // device can self destruct, and re-init when new scan discovers it + I2C_DEVMDL model = I2CDEVMDL_NOTSET; // overwrite it in the init()!!! + uint8_t query_interval = 5; // in seconds. can be overriden in init() if necessary + protected: + void got_error(); // i2c communication will call this when communication was not ok. you can call it from any part of your code too. + void got_success(); // i2c communication will call this when the communication was ok. you can call it from any part of your code too. + + uint8_t addr = 0; // some devices can have different addresses, so we store what was it wound with + uint8_t errcnt = 0; // error count during communication. if it reaches a threshold set need_del to remove itself from the device list +}; + +// store for the devices. may not have a driver if not supported +class I2DevListElement { + public: + uint8_t addr = 0; // i2c addr of the device + std::unique_ptr dev = nullptr; // device driver if any +}; + +class I2CDevManager { + public: + static void init(); // creates the thread, and sets an one time full scan + static void manual_scan(); // it'll init a forced device scan in the thread's next cycle. (1sec max) + static void set_autoscan_interval(uint16_t interval); // 0 no auto scan, other values: seconds + static uint16_t get_autoscan_interval(); + static I2cDev* get_dev_by_addr(uint8_t addr); // caller function needs to cast to the specific device! + static I2cDev* get_dev_by_model(I2C_DEVMDL model); // caller function needs to cast to the specific device! + static std::vector get_dev_list_by_model(); // returns the currently discovered + static std::vector get_gev_list_by_addr(); // returns the currently discovered + static void setEventDispatcher(EventDispatcher* ed) { _eventDispatcher = ed; } + static EventDispatcher* get_event_dispatcher() { return _eventDispatcher; } + + private: + static uint16_t scan_interval; + static bool force_scan; // if set to true, on hte next run it'll do an i2c scan, ONCE + static std::vector devlist; + + static bool found(uint8_t addr); // returns true on any new device. also initializes the driver if there is a suitable one + static bool scan(); // return true on any change (delete or found new) + static void create_thread(); + static msg_t timer_fn(void* arg); + static Thread* thread; + static Mutex mutex_list; + static EventDispatcher* _eventDispatcher; +}; +}; // namespace i2cdev + +#endif \ No newline at end of file diff --git a/firmware/common/i2cdevmanager_c_api.h b/firmware/common/i2cdevmanager_c_api.h new file mode 100644 index 00000000..226656c5 --- /dev/null +++ b/firmware/common/i2cdevmanager_c_api.h @@ -0,0 +1,13 @@ +#ifndef I2CDEVMANAGER_C_API_H +#define I2CDEVMANAGER_C_API_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif +int oNofityI2cFromShell(uint8_t* buff, size_t len); +#ifdef __cplusplus +} +#endif +#endif \ No newline at end of file diff --git a/firmware/common/jtag.hpp b/firmware/common/jtag.hpp index 561446ae..3ef42627 100644 --- a/firmware/common/jtag.hpp +++ b/firmware/common/jtag.hpp @@ -23,6 +23,7 @@ #define __JTAG_H__ #include "jtag_target.hpp" +#include "ch.h" #include #include @@ -51,7 +52,16 @@ class JTAG { } void runtest_tck(const size_t count) { - target.delay(count); + for (size_t i = 0; i < count; i++) { + target.clock(0, 0); + } + } + + void runtest_ms(const size_t count) { + auto starttime = chTimeNow(); + + while ((chTimeNow() - starttime) < (count + 1)) + target.clock(0, 0); } uint32_t shift_ir(const size_t count, const uint32_t value) { diff --git a/firmware/common/lcd_ili9341.cpp b/firmware/common/lcd_ili9341.cpp index f966b59b..3c2a0f77 100644 --- a/firmware/common/lcd_ili9341.cpp +++ b/firmware/common/lcd_ili9341.cpp @@ -344,7 +344,20 @@ void ILI9341::render_box(const ui::Point p, const ui::Size s, const ui::Color* l } // RLE_4 BMP loader (delta not implemented) -void ILI9341::drawBMP(const ui::Point p, const uint8_t* bitmap, const bool transparency) { +/* draw transparent, pass transparent color as arg, usage inline anonymous obj + * portapack::display.draw_bmp_from_bmp_hex_arr({100, 100}, foo_bmp, (const uint8_t[]){41, 24, 22}); // dec, out of {255, 255, 255} + * portapack::display.draw_bmp_from_bmp_hex_arr({100, 100}, foo_bmp, (const uint8_t[]){0x29, 0x18, 0x16}); //hex out of {0xFF, 0xFF, 0xFF} + * + * draw transparent, pass transparent color as arg, usage pass uint8_t[] obj + * const uint8_t c[] = {41, 24, 22}; or const uint8_t c[3] = {0x29, 0x18, 0x16}; + * portapack::display.draw_bmp_from_bmp_hex_arr({100, 100}, foo_bmp, c); + * + * don't draw transparent, pass nullptr as arg, usage + * portapack::display.draw_bmp_from_bmp_hex_arr({100, 100}, foo_bmp, nullptr); + * + * if your image use RLE compress as transparency methods, pass any valid color as arg, it doesn't matter (like the modal bmp. TODO: write RLE transparency generator) + * */ +void ILI9341::draw_bmp_from_bmp_hex_arr(const ui::Point p, const uint8_t* bitmap, const uint8_t* transparency_color) { const bmp_header_t* bmp_header = (const bmp_header_t*)bitmap; uint32_t data_idx; uint8_t by, c, count, transp_idx = 0; @@ -362,12 +375,13 @@ void ILI9341::drawBMP(const ui::Point p, const uint8_t* bitmap, const bool trans // Convert palette and find pure magenta index (alpha color key) rgb dec(41,24,22) for (c = 0; c < 16; c++) { palette[c] = ui::Color(bmp_palette->color[c].R, bmp_palette->color[c].G, bmp_palette->color[c].B); - if ((bmp_palette->color[c].R == 0x29) && - (bmp_palette->color[c].G == 0x18) && - (bmp_palette->color[c].B == 0x16)) transp_idx = c; + if (transparency_color && + (bmp_palette->color[c].R == transparency_color[0]) && + (bmp_palette->color[c].G == transparency_color[1]) && + (bmp_palette->color[c].B == transparency_color[2])) transp_idx = c; } - if (!transparency) { + if (!transparency_color) { py = bmp_header->height + 16; do { by = bitmap[data_idx++]; @@ -449,7 +463,7 @@ void ILI9341::drawBMP(const ui::Point p, const uint8_t* bitmap, const bool trans * 24bpp RGB * 32bpp ARGB */ -bool ILI9341::drawBMP2(const ui::Point p, const std::filesystem::path& file) { +bool ILI9341::draw_bmp_from_sdcard_file(const ui::Point p, const std::filesystem::path& file) { File bmpimage; size_t file_pos = 0; uint16_t pointer = 0; @@ -498,7 +512,9 @@ bool ILI9341::drawBMP2(const ui::Point p, const std::filesystem::path& file) { file_pos = bmp_header.image_data; - py = height + 16; + py = height + 16 - 1; + /* ^ this is for to "start" AKA "image end" draw at the 17th line, + * because the render_line logic below is start with p.y() + py until "end" AKA "image start"*/ while (1) { while (px < width) { diff --git a/firmware/common/lcd_ili9341.hpp b/firmware/common/lcd_ili9341.hpp index feb87a39..cab63516 100644 --- a/firmware/common/lcd_ili9341.hpp +++ b/firmware/common/lcd_ili9341.hpp @@ -62,8 +62,8 @@ class ILI9341 { const ui::Color background); void draw_pixel(const ui::Point p, const ui::Color color); - void drawBMP(const ui::Point p, const uint8_t* bitmap, const bool transparency); - bool drawBMP2(const ui::Point p, const std::filesystem::path& file); + void draw_bmp_from_bmp_hex_arr(const ui::Point p, const uint8_t* bitmap, const uint8_t* transparency_color); + bool draw_bmp_from_sdcard_file(const ui::Point p, const std::filesystem::path& file); void render_line(const ui::Point p, const uint8_t count, const ui::Color* line_buffer); void render_box(const ui::Point p, const ui::Size s, const ui::Color* line_buffer); diff --git a/firmware/common/message.hpp b/firmware/common/message.hpp index d576653a..a619816c 100644 --- a/firmware/common/message.hpp +++ b/firmware/common/message.hpp @@ -32,7 +32,6 @@ #include "baseband_packet.hpp" -#include "acars_packet.hpp" #include "adsb_frame.hpp" #include "ert_packet.hpp" #include "pocsag_packet.hpp" @@ -126,6 +125,8 @@ class Message { BatteryStateData = 68, ProtoViewData = 69, FreqChangeCommand = 70, + I2CDevListChanged = 71, + LightData = 72, MAX }; @@ -377,13 +378,12 @@ class POCSAGStatsMessage : public Message { class ACARSPacketMessage : public Message { public: - constexpr ACARSPacketMessage( - const baseband::Packet& packet) - : Message{ID::ACARSPacket}, - packet{packet} { - } - - baseband::Packet packet; + constexpr ACARSPacketMessage() + : Message{ID::ACARSPacket} {} + uint8_t msg_len = 0; + char message[250] = {0}; // contains the whole packet + uint8_t crc[2] = {0}; + uint8_t state = 0; // for debug }; class ADSBFrameMessage : public Message { @@ -1330,18 +1330,26 @@ class EnvironmentDataMessage : public Message { constexpr EnvironmentDataMessage( float temperature = 0, float humidity = 0, - float pressure = 0, - uint16_t light = 0) + float pressure = 0) : Message{ID::EnvironmentData}, temperature{temperature}, humidity{humidity}, - pressure{pressure}, - light{light} { + pressure{pressure} { } float temperature = 0; // celsius float humidity = 0; // percent (rh) float pressure = 0; // hpa - uint16_t light = 0; // lux +}; + +class LightDataMessage : public Message { + public: + constexpr LightDataMessage( + + uint16_t light = 0) + : Message{ID::LightData}, + light{light} { + } + uint16_t light = 0; // lux }; class AudioBeepMessage : public Message { @@ -1423,4 +1431,10 @@ class FreqChangeCommandMessage : public Message { int64_t freq = 0; }; +class I2CDevListChangedMessage : public Message { + public: + constexpr I2CDevListChangedMessage() + : Message{ID::I2CDevListChanged} {} +}; + #endif /*__MESSAGE_H__*/ diff --git a/firmware/common/message_queue.hpp b/firmware/common/message_queue.hpp index 57534dc9..edef2ef7 100644 --- a/firmware/common/message_queue.hpp +++ b/firmware/common/message_queue.hpp @@ -101,7 +101,11 @@ class MessageQueue { } bool push(const void* const buf, const size_t len) { - chMtxLock(&mutex_write); + bool lock_success = chMtxTryLock(&mutex_write); + if (!lock_success) { + return false; + } + const auto result = fifo.in_r(buf, len); chMtxUnlock(); diff --git a/firmware/common/modules.h b/firmware/common/modules.h deleted file mode 100644 index f2656049..00000000 --- a/firmware/common/modules.h +++ /dev/null @@ -1,36 +0,0 @@ -const char md5_baseband[16] = { - 0xb8, - 0x9e, - 0x9b, - 0x08, - 0x44, - 0x34, - 0x04, - 0x20, - 0x0b, - 0xbc, - 0x60, - 0x7e, - 0x67, - 0x88, - 0x53, - 0xf7, -}; -const char md5_baseband_tx[16] = { - 0xd5, - 0xaf, - 0x76, - 0xd5, - 0xa3, - 0x32, - 0x5d, - 0x9a, - 0x9d, - 0x83, - 0x46, - 0x37, - 0x02, - 0x2d, - 0xd0, - 0x57, -}; diff --git a/firmware/common/portapack_io.cpp b/firmware/common/portapack_io.cpp index 25a725cd..e9eff2f9 100644 --- a/firmware/common/portapack_io.cpp +++ b/firmware/common/portapack_io.cpp @@ -77,18 +77,10 @@ void IO::reference_oscillator(const bool enable) { io_write(1, io_reg); } -bool IO::get_dark_cover() { - return portapack::persistent_memory::apply_fake_brightness() & (!portapack::persistent_memory::config_lcd_inverted_mode()); -} - bool IO::get_is_inverted() { return portapack::persistent_memory::config_lcd_inverted_mode(); } -uint8_t IO::get_brightness() { - return portapack::persistent_memory::fake_brightness_level(); -} - uint32_t IO::io_update(const TouchPinsConfig write_value) { /* Very touchy code to save context of PortaPack data bus while the * resistive touch pin drive is changed. Order of operations is diff --git a/firmware/common/portapack_io.hpp b/firmware/common/portapack_io.hpp index b25cdb7f..96822366 100644 --- a/firmware/common/portapack_io.hpp +++ b/firmware/common/portapack_io.hpp @@ -162,9 +162,6 @@ class IO { } void lcd_write_pixel(ui::Color pixel) { - if (get_dark_cover()) { - pixel.v = DARKENED_PIXEL(pixel.v, get_brightness()); - } lcd_write_data(pixel.v); } @@ -173,18 +170,12 @@ class IO { } void lcd_write_pixels(ui::Color pixel, size_t n) { - if (get_dark_cover()) { - pixel.v = DARKENED_PIXEL(pixel.v, get_brightness()); - } while (n--) { lcd_write_data(pixel.v); } } void lcd_write_pixels_unrolled8(ui::Color pixel, size_t n) { - if (get_dark_cover()) { - pixel.v = DARKENED_PIXEL(pixel.v, get_brightness()); - } auto v = pixel.v; n >>= 3; while (n--) { @@ -232,9 +223,6 @@ class IO { return switches_raw; } bool get_is_inverted(); - bool get_dark_cover(); - uint8_t get_brightness(); - // TODO: cache the value ^^ & ^ to increaase performance, need a trigger cuz init doesn't work. And since the constructor is constexpr, we can't use with in class var to cache it. maybe cache from outside somewhere and pass it here as argument. uint32_t io_update(const TouchPinsConfig write_value); @@ -416,9 +404,6 @@ class IO { const auto value_low = data_read(); uint32_t original_value = (value_high << 8) | value_low; - if (get_dark_cover()) { - original_value = DARKENED_PIXEL(original_value, get_brightness()); - } return original_value; } diff --git a/firmware/common/portapack_persistent_memory.cpp b/firmware/common/portapack_persistent_memory.cpp index a96a7cfd..77315955 100644 --- a/firmware/common/portapack_persistent_memory.cpp +++ b/firmware/common/portapack_persistent_memory.cpp @@ -109,7 +109,7 @@ struct ui_config_t { bool hide_clock : 1; bool clock_show_date : 1; bool clkout_enabled : 1; - bool apply_fake_brightness : 1; + bool unused_FB : 1; // apply_fake_brightness bool stealth_mode : 1; bool config_login : 1; bool config_splash : 1; @@ -130,7 +130,7 @@ struct ui_config2_t { bool hide_sd_card : 1; bool hide_mute : 1; - bool hide_fake_brightness : 1; + bool UNUSED_3 : 1; bool hide_numeric_battery : 1; bool hide_battery_icon : 1; bool override_batt_calc : 1; @@ -184,10 +184,9 @@ struct data_t { int32_t modem_baudrate; int32_t modem_repeat; - // Play dead unlock (Used?) - uint32_t playdead_magic; - uint32_t playing_dead; - uint32_t playdead_sequence; + uint32_t UNUSED_2; + uint32_t UNUSED_3; + uint32_t UNUSED_4; // UI Config ui_config_t ui_config; @@ -227,9 +226,6 @@ struct data_t { // Rotary encoder dial sensitivity (encoder.cpp/hpp) uint16_t encoder_dial_sensitivity : 4; - // fake brightness level (not switch, switch is in another place) - uint16_t fake_brightness_level : 4; - // Encoder rotation rate multiplier for larger increments when rotated rapidly uint16_t encoder_rate_multiplier : 4; @@ -253,7 +249,7 @@ struct data_t { // Menu Color Scheme Color menu_color; - uint16_t UNUSED_16; + uint16_t touchscreen_threshold; constexpr data_t() : structure_version(data_structure_version_enum::VERSION_CURRENT), @@ -269,11 +265,9 @@ struct data_t { afsk_space_freq(afsk_space_reset_value), modem_baudrate(modem_baudrate_reset_value), modem_repeat(modem_repeat_reset_value), - - playdead_magic(), // TODO: Unused? - playing_dead(), // TODO: Unused? - playdead_sequence(), // TODO: Unused? - + UNUSED_2(0), + UNUSED_3(0), + UNUSED_4(0), ui_config(), pocsag_last_address(0), // TODO: A better default? @@ -303,7 +297,6 @@ struct data_t { frequency_tx_correction(0), encoder_dial_sensitivity(DIAL_SENSITIVITY_NORMAL), - fake_brightness_level(BRIGHTNESS_50), encoder_rate_multiplier(1), UNUSED(0), @@ -313,7 +306,7 @@ struct data_t { config_mode_storage(CONFIG_MODE_NORMAL_VALUE), dst_config(), menu_color(Color::grey()), - UNUSED_16() { + touchscreen_threshold(32) { } }; @@ -472,7 +465,6 @@ void init() { set_config_mode_storage_direct(config_mode_backup); // Firmware upgrade handling - adjust newly defined fields where 0 is an invalid default - if (fake_brightness_level() == 0) set_fake_brightness_level(BRIGHTNESS_50); if (menu_color().v == 0) set_menu_color(Color::grey()); } @@ -653,10 +645,6 @@ bool stealth_mode() { return data->ui_config.stealth_mode; } -bool apply_fake_brightness() { - return data->ui_config.apply_fake_brightness; -} - bool config_login() { return data->ui_config.config_login; } @@ -760,10 +748,6 @@ void set_config_backlight_timer(const backlight_config_t& new_value) { data->ui_config.enable_backlight_timeout = static_cast(new_value.timeout_enabled()); } -void set_apply_fake_brightness(const bool v) { - data->ui_config.apply_fake_brightness = v; -} - uint32_t pocsag_last_address() { return data->pocsag_last_address; } @@ -950,9 +934,7 @@ bool ui_hide_clock() { bool ui_hide_sd_card() { return data->ui_config2.hide_sd_card; } -bool ui_hide_fake_brightness() { - return data->ui_config2.hide_fake_brightness; -} + bool ui_hide_numeric_battery() { return data->ui_config2.hide_numeric_battery; } @@ -995,9 +977,6 @@ void set_ui_hide_clock(bool v) { void set_ui_hide_sd_card(bool v) { data->ui_config2.hide_sd_card = v; } -void set_ui_hide_fake_brightness(bool v) { - data->ui_config2.hide_fake_brightness = v; -} void set_ui_hide_numeric_battery(bool v) { data->ui_config2.hide_numeric_battery = v; } @@ -1115,26 +1094,6 @@ void set_config_dst(dst_config_t v) { rtc_time::dst_init(); } -// Fake brightness level (switch is in another place) -uint8_t fake_brightness_level() { - return data->fake_brightness_level; -} -void set_fake_brightness_level(uint8_t v) { - data->fake_brightness_level = v; -} - -// Cycle through 4 brightness options: disabled -> enabled/50% -> enabled/25% -> enabled/12.5% -> disabled -void toggle_fake_brightness_level() { - bool fbe = apply_fake_brightness(); - if (config_lcd_inverted_mode()) return; // for now only inverted mode OR fake brightness - if ((!fbe) || (data->fake_brightness_level >= BRIGHTNESS_12p5)) { - set_apply_fake_brightness(!fbe); - data->fake_brightness_level = BRIGHTNESS_50; - } else { - data->fake_brightness_level++; - } -} - // Menu Color Scheme Color menu_color() { return data->menu_color; @@ -1143,6 +1102,13 @@ void set_menu_color(Color v) { data->menu_color = v; } +uint16_t touchscreen_threshold() { + return data->touchscreen_threshold; +} +void set_touchscreen_threshold(uint16_t v) { + data->touchscreen_threshold = v; +} + // PMem to sdcard settings bool should_use_sdcard_for_pmem() { @@ -1221,9 +1187,6 @@ bool debug_dump() { pmem_dump_file.write_line("afsk_space_freq: " + to_string_dec_int(data->afsk_space_freq)); pmem_dump_file.write_line("modem_baudrate: " + to_string_dec_int(data->modem_baudrate)); pmem_dump_file.write_line("modem_repeat: " + to_string_dec_int(data->modem_repeat)); - pmem_dump_file.write_line("playdead_magic: " + to_string_dec_uint(data->playdead_magic)); - pmem_dump_file.write_line("playing_dead: " + to_string_dec_uint(data->playing_dead)); - pmem_dump_file.write_line("playdead_sequence: " + to_string_dec_uint(data->playdead_sequence)); pmem_dump_file.write_line("pocsag_last_address: " + to_string_dec_uint(data->pocsag_last_address)); pmem_dump_file.write_line("pocsag_ignore_address: " + to_string_dec_uint(data->pocsag_ignore_address)); pmem_dump_file.write_line("tone_mix: " + to_string_dec_uint(data->tone_mix)); @@ -1248,8 +1211,8 @@ bool debug_dump() { pmem_dump_file.write_line("headphone_volume_cb: " + to_string_dec_int(data->headphone_volume_cb)); pmem_dump_file.write_line("config_mode_storage: 0x" + to_string_hex(data->config_mode_storage, 8)); pmem_dump_file.write_line("dst_config: 0x" + to_string_hex((uint32_t)data->dst_config.v, 8)); - pmem_dump_file.write_line("fake_brightness_level: " + to_string_dec_uint(data->fake_brightness_level)); pmem_dump_file.write_line("menu_color: 0x" + to_string_hex(data->menu_color.v, 4)); + pmem_dump_file.write_line("touchscreen_threshold: " + to_string_dec_uint(data->touchscreen_threshold)); // ui_config bits const auto backlight_timer = portapack::persistent_memory::config_backlight_timer(); @@ -1264,7 +1227,6 @@ bool debug_dump() { pmem_dump_file.write_line("ui_config hide_clock: " + to_string_dec_uint(data->ui_config.hide_clock)); pmem_dump_file.write_line("ui_config clock_with_date: " + to_string_dec_uint(data->ui_config.clock_show_date)); pmem_dump_file.write_line("ui_config clkout_enabled: " + to_string_dec_uint(data->ui_config.clkout_enabled)); - pmem_dump_file.write_line("ui_config apply_fake_brightness: " + to_string_dec_uint(data->ui_config.apply_fake_brightness)); pmem_dump_file.write_line("ui_config stealth_mode: " + to_string_dec_uint(data->ui_config.stealth_mode)); pmem_dump_file.write_line("ui_config config_login: " + to_string_dec_uint(data->ui_config.config_login)); pmem_dump_file.write_line("ui_config config_splash: " + to_string_dec_uint(data->ui_config.config_splash)); @@ -1279,7 +1241,6 @@ bool debug_dump() { pmem_dump_file.write_line("ui_config2 hide_clock: " + to_string_dec_uint(data->ui_config2.hide_clock)); pmem_dump_file.write_line("ui_config2 hide_sd_card: " + to_string_dec_uint(data->ui_config2.hide_sd_card)); pmem_dump_file.write_line("ui_config2 hide_mute: " + to_string_dec_uint(data->ui_config2.hide_mute)); - pmem_dump_file.write_line("ui_config2 hide_fake_brightness: " + to_string_dec_uint(data->ui_config2.hide_fake_brightness)); pmem_dump_file.write_line("ui_config2 hide_battery_icon: " + to_string_dec_uint(data->ui_config2.hide_battery_icon)); pmem_dump_file.write_line("ui_config2 hide_numeric_battery: " + to_string_dec_uint(data->ui_config2.hide_numeric_battery)); pmem_dump_file.write_line("ui_config2 theme_id: " + to_string_dec_uint(data->ui_config2.theme_id)); diff --git a/firmware/common/portapack_persistent_memory.hpp b/firmware/common/portapack_persistent_memory.hpp index 19ea9bf1..727a2003 100644 --- a/firmware/common/portapack_persistent_memory.hpp +++ b/firmware/common/portapack_persistent_memory.hpp @@ -135,12 +135,6 @@ typedef union { } dst_config_t; static_assert(sizeof(dst_config_t) == sizeof(uint32_t)); -enum fake_brightness_level_options { - BRIGHTNESS_50 = 1, - BRIGHTNESS_25 = 2, - BRIGHTNESS_12p5 = 3, // 12p5 is 12.5 -}; - namespace cache { /* Set values in cache to sensible defaults. */ @@ -189,12 +183,6 @@ void set_modem_baudrate(const int32_t new_value); uint8_t modem_repeat(); void set_modem_repeat(const uint32_t new_value); -uint32_t playing_dead(); -void set_playing_dead(const uint32_t new_value); - -uint32_t playdead_sequence(); -void set_playdead_sequence(const uint32_t new_value); - bool stealth_mode(); void set_stealth_mode(const bool v); @@ -279,14 +267,9 @@ uint16_t clkout_freq(); dst_config_t config_dst(); void set_config_dst(dst_config_t v); -/* Fake brightness */ -// switch (if do color change): -bool apply_fake_brightness(); -void set_apply_fake_brightness(const bool v); -// level (color change level): -uint8_t fake_brightness_level(); -void set_fake_brightness_level(uint8_t v); -void toggle_fake_brightness_level(); +/* Touchscreen threshold */ +uint16_t touchscreen_threshold(); +void set_touchscreen_threshold(uint16_t v); Color menu_color(); void set_menu_color(Color v); @@ -336,7 +319,6 @@ bool ui_hide_camera(); bool ui_hide_sleep(); bool ui_hide_bias_tee(); bool ui_hide_clock(); -bool ui_hide_fake_brightness(); bool ui_hide_numeric_battery(); bool ui_hide_battery_icon(); bool ui_hide_sd_card(); @@ -350,7 +332,6 @@ void set_ui_hide_camera(bool v); void set_ui_hide_sleep(bool v); void set_ui_hide_bias_tee(bool v); void set_ui_hide_clock(bool v); -void set_ui_hide_fake_brightness(bool v); void set_ui_hide_numeric_battery(bool v); void set_ui_hide_battery_icon(bool v); void set_ui_hide_sd_card(bool v); diff --git a/firmware/common/random.hpp b/firmware/common/random.hpp index 5442fc31..a31583c8 100644 --- a/firmware/common/random.hpp +++ b/firmware/common/random.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __RANDOM_H +#define __RANDOM_H /* Period parameters */ #define N 624 @@ -33,3 +34,5 @@ /* initializes state[N] with a seed */ extern void init_genrand(unsigned long s); extern long genrand_int31(void); + +#endif diff --git a/firmware/common/spi_image.hpp b/firmware/common/spi_image.hpp index ccc3d9cb..122ef23c 100644 --- a/firmware/common/spi_image.hpp +++ b/firmware/common/spi_image.hpp @@ -104,6 +104,7 @@ constexpr image_tag_t image_tag_fskrx{'P', 'F', 'S', 'R'}; constexpr image_tag_t image_tag_jammer{'P', 'J', 'A', 'M'}; constexpr image_tag_t image_tag_mic_tx{'P', 'M', 'T', 'X'}; constexpr image_tag_t image_tag_ook{'P', 'O', 'O', 'K'}; +constexpr image_tag_t image_tag_ookstream{'P', 'O', 'S', 'K'}; constexpr image_tag_t image_tag_rds{'P', 'R', 'D', 'S'}; constexpr image_tag_t image_tag_replay{'P', 'R', 'E', 'P'}; constexpr image_tag_t image_tag_gps{'P', 'G', 'P', 'S'}; diff --git a/firmware/common/standalone_app.hpp b/firmware/common/standalone_app.hpp index 5a34f8b7..6d8cfe9f 100644 --- a/firmware/common/standalone_app.hpp +++ b/firmware/common/standalone_app.hpp @@ -26,9 +26,12 @@ #include #include -#define CURRENT_STANDALONE_APPLICATION_API_VERSION 1 +#include "ui.hpp" + +#define CURRENT_STANDALONE_APPLICATION_API_VERSION 2 struct standalone_application_api_t { + // Version 1 void* (*malloc)(size_t size); void* (*calloc)(size_t num, size_t size); void* (*realloc)(void* p, size_t size); @@ -38,6 +41,26 @@ struct standalone_application_api_t { uint8_t (*swizzled_switches)(); uint64_t (*get_switches_state)(); + // Version 2 + const uint8_t* fixed_5x8_glyph_data; + const uint8_t* fixed_8x16_glyph_data; + + void (*fill_rectangle_unrolled8)(int x, int y, int width, int height, uint16_t color); + void (*draw_bitmap)(int x, int y, int width, int height, const uint8_t* pixels, uint16_t foreground, uint16_t background); + + ui::Coord (*scroll_area_y)(const ui::Coord y); + void (*scroll_set_area)(const ui::Coord top_y, const ui::Coord bottom_y); + void (*scroll_disable)(); + ui::Coord (*scroll_set_position)(const ui::Coord position); + ui::Coord (*scroll)(const int32_t delta); + + bool (*i2c_read)(uint8_t* cmd, size_t cmd_len, uint8_t* data, size_t data_len); + void (*panic)(const char* msg); + void (*set_dirty)(); + + // TODO: add filesystem access functions + // TODO: add baseband access functions + // HOW TO extend this interface: // to keep everything backward compatible: add new fields at the end // and increment CURRENT_STANDALONE_APPLICATION_API_VERSION @@ -69,6 +92,13 @@ struct standalone_application_information_t { /// @brief gets called once at application shutdown void (*shutdown)(); + + void (*PaintViewMirror)(); + void (*OnTouchEvent)(int x, int y, uint32_t type); + void (*OnFocus)(); + bool (*OnKeyEvent)(uint8_t key); + bool (*OnEncoder)(int32_t delta); + bool (*OnKeyboard)(uint8_t key); }; #endif /*__UI_STANDALONE_APP_H__*/ diff --git a/firmware/common/ui_focus.cpp b/firmware/common/ui_focus.cpp index c8015a70..dc92cec1 100644 --- a/firmware/common/ui_focus.cpp +++ b/firmware/common/ui_focus.cpp @@ -38,6 +38,14 @@ Widget* FocusManager::focus_widget() const { return focus_widget_; } +void FocusManager::setMirror(Widget* const mirror_widget) { + mirror_widget_ = mirror_widget; +} + +void FocusManager::clearMirror() { + mirror_widget_ = nullptr; +} + void FocusManager::set_focus_widget(Widget* const new_focus_widget) { // Widget already has focus. if (new_focus_widget == focus_widget()) { @@ -153,9 +161,12 @@ static int32_t rect_distances( } } -void FocusManager::update( - Widget* const top_widget, - const KeyEvent event) { +void FocusManager::update(Widget* const top_widget, const KeyEvent event) { + if (mirror_widget_) { + if (mirror_widget_->on_key(event)) + return; + } + if (focus_widget()) { const auto focus_screen_rect = focus_widget()->screen_rect(); diff --git a/firmware/common/ui_focus.hpp b/firmware/common/ui_focus.hpp index 2f9c4565..847e5c24 100644 --- a/firmware/common/ui_focus.hpp +++ b/firmware/common/ui_focus.hpp @@ -36,8 +36,12 @@ class FocusManager { void update(Widget* const top_widget, const KeyEvent event); // void update(Widget* const top_widget, const TouchEvent event); + void setMirror(Widget* const mirror_widget); + void clearMirror(); + private: Widget* focus_widget_{nullptr}; + Widget* mirror_widget_{nullptr}; }; } /* namespace ui */ diff --git a/firmware/common/ui_language.cpp b/firmware/common/ui_language.cpp index 73b8a9e7..be287ade 100644 --- a/firmware/common/ui_language.cpp +++ b/firmware/common/ui_language.cpp @@ -1,7 +1,9 @@ #include "ui_language.hpp" -const char* LanguageHelper::englishMessages[] = {"OK", "Cancel", "Error", "Modem setup", "Debug", "Log", "Done", "Start", "Stop", "Scan", "Clear", "Ready", "Data:", "Loop", "Reset"}; +// use the exact position in this array! the enum's value is the identifier. Best to add to the end +const char* LanguageHelper::englishMessages[] = {"OK", "Cancel", "Error", "Modem setup", "Debug", "Log", "Done", "Start", "Stop", "Scan", "Clear", "Ready", "Data:", "Loop", "Reset", "Pause", "Resume", "Flood", "Show QR", "Save", "Lock", "Unlock", "Browse", "Set", "Open File", "Save File", "Send", "Receive"}; +// multi language support will changes (not in use for now) const char** LanguageHelper::currentMessages = englishMessages; void LanguageHelper::setLanguage(LanguageList lang) { diff --git a/firmware/common/ui_language.hpp b/firmware/common/ui_language.hpp index 4b39e17a..9c6c6411 100644 --- a/firmware/common/ui_language.hpp +++ b/firmware/common/ui_language.hpp @@ -1,10 +1,43 @@ +/* + * Copyright (C) 2024 HTotoo + * + * 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. + */ + +/* + +The purpose of this: when creating an ext app it's address will be changed. But the compiler doesn't know this, so when it optimizes literals it can remove something from one ext app, that is included in the other, to save space. +But when we want to run this app, it won't find the literal at the fake address, so the best case we'll get just garbage or nothing instead of the string. +So we must use this Language helper that stores the literals in the fw instead of any ext app, so it'll be always available. +In the first run we must move those string literal here what are not so unique, like "OK". +*/ + #ifndef __UI_LANGUAGE_H__ #define __UI_LANGUAGE_H__ +// For future multi language support enum LanguageList { ENGLISH, }; +// Add an element to this enum when you fill a new value. +// Then add the string literal to the LanguageHelper::englishMessages at the exact position where the enum points to (usualy to the end) + enum LangConsts { LANG_OK, LANG_CANCEL, @@ -20,12 +53,25 @@ enum LangConsts { LANG_READY, LANG_DATADP, LANG_LOOP, - LANG_RESET + LANG_RESET, + LANG_PAUSE, + LANG_RESUME, + LANG_FLOOD, + LANG_SHOWQR, + LANG_SAVE, + LANG_LOCK, + LANG_UNLOCK, + LANG_BROWSE, + LANG_SET, + LANG_OPEN_FILE, + LANG_SAVE_FILE, + LANG_SEND, + LANG_RECV }; class LanguageHelper { public: - static void setLanguage(LanguageList lang); + static void setLanguage(LanguageList lang); // changes the pointer to the currently used language literal container. not used yet. static const char* getMessage(LangConsts msg); static const char** currentMessages; // expose, so can link directly too @@ -33,4 +79,4 @@ class LanguageHelper { static const char* englishMessages[]; }; -#endif \ No newline at end of file +#endif diff --git a/firmware/common/ui_text.hpp b/firmware/common/ui_text.hpp index 123da536..578cbf61 100644 --- a/firmware/common/ui_text.hpp +++ b/firmware/common/ui_text.hpp @@ -94,6 +94,10 @@ class Font { Size size_of(const std::string s) const; + const uint8_t* get_data() const { + return data; + } + private: const Dim w; const Dim h; diff --git a/firmware/common/ui_widget.cpp b/firmware/common/ui_widget.cpp index 5af3af6e..9f405bb9 100644 --- a/firmware/common/ui_widget.cpp +++ b/firmware/common/ui_widget.cpp @@ -33,6 +33,7 @@ #include "string_format.hpp" #include "usb_serial_device_to_host.h" #include "rtc_time.hpp" +#include "battery.hpp" using namespace portapack; using namespace rtc_time; @@ -93,8 +94,14 @@ void Widget::set_parent(Widget* const widget) { visible(false); } + if (widget == nullptr) + on_before_detach(); + parent_ = widget; + if (widget != nullptr) + on_after_attach(); + set_dirty(); } @@ -1697,10 +1704,12 @@ bool ImageOptionsField::on_touch(const TouchEvent event) { OptionsField::OptionsField( Point parent_pos, size_t length, - options_t options) + options_t options, + bool centered) : Widget{{parent_pos, {8 * (int)length, 16}}}, length_{length}, - options_{std::move(options)} { + options_{std::move(options)}, + centered_{centered} { set_focusable(true); } @@ -1792,8 +1801,19 @@ void OptionsField::paint(Painter& painter) { std::string_view temp = selected_index_name(); if (temp.length() > length_) temp = temp.substr(0, length_); + + Point draw_pos = screen_pos(); + if (centered_) { + // 8 is because big font width is 8px + // type is from: struct Point : constexpr int x() const + int text_width = temp.length() * 8; + int available_width = length_ * 8; + int x_offset = (available_width - text_width) / 2; + draw_pos = {draw_pos.x() + x_offset, draw_pos.y()}; + } + painter.draw_string( - screen_pos(), + draw_pos, paint_style, temp); } @@ -2622,6 +2642,8 @@ void Waveform::set_length(const uint32_t new_length) { } void Waveform::paint(Painter& painter) { + // previously it's upside down , low level is up and high level is down, which doesn't make sense, + // if that was made for a reason, feel free to revert. size_t n; Coord y, y_offset = screen_rect().location().y(); Coord prev_x = screen_rect().location().x(), prev_y; @@ -2642,7 +2664,7 @@ void Waveform::paint(Painter& painter) { x = 0; h--; for (n = 0; n < length_; n++) { - y = *(data_start++) ? h : 0; + y = *(data_start++) ? 0 : h; if (n) { if (y != prev_y) @@ -2658,6 +2680,7 @@ void Waveform::paint(Painter& painter) { // Analog waveform: each value is a point's Y coordinate x = prev_x + x_inc; h /= 2; + prev_y = y_offset + h - (*(data_start++) * y_scale); for (n = 1; n < length_; n++) { y = y_offset + h - (*(data_start++) * y_scale); diff --git a/firmware/common/ui_widget.hpp b/firmware/common/ui_widget.hpp index 46d873ed..e4c77524 100644 --- a/firmware/common/ui_widget.hpp +++ b/firmware/common/ui_widget.hpp @@ -84,6 +84,9 @@ class Widget { Widget* parent() const; void set_parent(Widget* const widget); + virtual void on_after_attach() { return; }; + virtual void on_before_detach() { return; }; + bool hidden() const { return flags.hidden; } void hidden(bool hide); @@ -97,8 +100,8 @@ class Widget { virtual void paint(Painter& painter) = 0; - virtual void on_show(){}; - virtual void on_hide(){}; + virtual void on_show() { return; }; + virtual void on_hide() { return; }; virtual bool on_key(const KeyEvent event); virtual bool on_encoder(const EncoderEvent event); @@ -156,6 +159,8 @@ class Widget { }; class View : public Widget { + // unlike Paint class, our Y ignored the top bar; + // so when you draw some of us as Y = 0, it would be exact below the top bar, instead of overlapped with top bar public: View() { } @@ -678,7 +683,7 @@ class OptionsField : public Widget { std::function on_change{}; std::function on_show_options{}; - OptionsField(Point parent_pos, size_t length, options_t options); + OptionsField(Point parent_pos, size_t length, options_t options, bool centered = false); options_t& options() { return options_; } const options_t& options() const { return options_; } @@ -706,6 +711,7 @@ class OptionsField : public Widget { const size_t length_; options_t options_; size_t selected_index_{0}; + bool centered_{false}; // e.g.: length as screen_width/8, x position as 0, it will be centered in x axis }; // A TextEdit is bound to a string reference and allows the string @@ -1034,4 +1040,4 @@ class OptionTabView : public View { } /* namespace ui */ -#endif /*__UI_WIDGET_H__*/ +#endif /*__UI_WIDGET_H__*/ \ No newline at end of file diff --git a/firmware/graphics/icon_tune_fork.png b/firmware/graphics/icon_tune_fork.png new file mode 100644 index 00000000..a542e128 Binary files /dev/null and b/firmware/graphics/icon_tune_fork.png differ diff --git a/firmware/graphics/key.png b/firmware/graphics/key.png new file mode 100644 index 00000000..4328e0d9 Binary files /dev/null and b/firmware/graphics/key.png differ diff --git a/firmware/graphics/temperature.png b/firmware/graphics/temperature.png new file mode 100644 index 00000000..e77b6704 Binary files /dev/null and b/firmware/graphics/temperature.png differ diff --git a/firmware/standalone/pacman/main.cpp b/firmware/standalone/pacman/main.cpp index 4ef787f7..79dfe52b 100644 --- a/firmware/standalone/pacman/main.cpp +++ b/firmware/standalone/pacman/main.cpp @@ -27,7 +27,7 @@ const standalone_application_api_t* _api; extern "C" { __attribute__((section(".standalone_application_information"), used)) standalone_application_information_t _standalone_application_information = { - /*.header_version = */ CURRENT_STANDALONE_APPLICATION_API_VERSION, + /*.header_version = */ 1, /*.app_name = */ "Pac-Man", /*.bitmap_data = */ { @@ -70,12 +70,18 @@ __attribute__((section(".standalone_application_information"), used)) standalone /*.initialize_app = */ initialize, /*.on_event = */ on_event, /*.shutdown = */ shutdown, -}; + /*PaintViewMirror */ NULL, + /*OnTouchEvent */ NULL, + /*OnFocus */ NULL, + /*OnKeyEvent */ NULL, + /*OnEncoder */ NULL, + /*OnKeyboard */ NULL}; } /* Implementing abort() eliminates requirement for _getpid(), _kill(), _exit(). */ extern "C" void abort() { - while (true); + while (true) + ; } // replace memory allocations to use heap from chibios diff --git a/firmware/test/application/mock_file.hpp b/firmware/test/application/mock_file.hpp index 1dea7743..06b95c2d 100644 --- a/firmware/test/application/mock_file.hpp +++ b/firmware/test/application/mock_file.hpp @@ -19,7 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#pragma once +#ifndef __MOCK_FILE_H +#define __MOCK_FILE_H #include "file.hpp" #include @@ -87,3 +88,5 @@ class MockFile { std::string data_; uint32_t offset_{0}; }; + +#endif diff --git a/firmware/tools/bitmap_tools/README.md b/firmware/tools/bitmap_tools/README.md index 2ce9e05e..d994cb6e 100644 --- a/firmware/tools/bitmap_tools/README.md +++ b/firmware/tools/bitmap_tools/README.md @@ -1 +1,25 @@ -bitmap is for icons, it's colorless and headless; splash and modal isn't using bitmap +bitmap is for icons, it's colorless and headless; splash and modal isn't +using bitmap + +## Bitmap helper folder +The folder `bitmap_tools` contains scripts to convert icons in png format to +the PortaPack readable format in `bitmap.hpp`. + +### Convert a folder contains one or more icon.png to one bitmap.hpp +The `make_bitmap.py` is the traditional helper, well tested. The folder with +the icons is given as argument and generates the `./bitmap.hpp`. This file +needs to be copied to `mayhem-firmware/firmware/application/`. +The icon size needs to be a multiple of 8. The generated icon is black/white. + +### Convert bitmap array to icon.png +The `bitmap_arr_reverse_decode.py` takes an array from the bitmap.hpp and +convert it back to a png. + +### Convert both ways +The `pp_png2hpp.py` is based on the privious scripts, as all in one solution. +With the `--hpp bitmap.hpp` file and the `--graphics /folder_to/png_icons/` +arguments, theis script will generate a `bitmap.hpp`. +Add the `--reverse` argument to generate png icons from the given `bitmap.hpp`. + +Especially the reverse function got a parser, to automatic get the filename +and size of the image. \ No newline at end of file diff --git a/firmware/tools/bitmap_tools/make_bitmap.py b/firmware/tools/bitmap_tools/make_bitmap.py index 6ba1eedf..0478fdb2 100755 --- a/firmware/tools/bitmap_tools/make_bitmap.py +++ b/firmware/tools/bitmap_tools/make_bitmap.py @@ -24,25 +24,26 @@ from PIL import Image from os import listdir from os import path -usage_message = """ +usage_message = f""" 1BPP PortaPack bitmap.hpp generator -Usage: +Usage: {sys.argv[0]} """ if len(sys.argv) < 2: print(usage_message) sys.exit(-1) +graphics_path = path.join(sys.argv[1], '') + def convert_png(file): c = 0 data = 0 - im = Image.open(file) - rgb_im = im.convert('RGBA') + rgb_im = Image.open(file).convert('RGBA') if rgb_im.size[0] % 8 or rgb_im.size[1] % 8: - print((file + ": Size isn\'t a multiple of 8")) + print((file + ": Size is not a multiple of 8. Image is not included in bitmap.hpp.")) sys.exit(-1) name = path.basename(file).split(".")[0].lower(); @@ -70,36 +71,36 @@ def convert_png(file): count = 0 f = open('bitmap.hpp', 'w') -f.write("/*\n") -f.write(" * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.\n") -f.write(" * Copyright (C) 2016 Furrtek\n") -f.write(" *\n") -f.write(" * This file is part of PortaPack.\n") -f.write(" *\n") -f.write(" * This program is free software; you can redistribute it and/or modify\n") -f.write(" * it under the terms of the GNU General Public License as published by\n") -f.write(" * the Free Software Foundation; either version 2, or (at your option)\n") -f.write(" * any later version.\n") -f.write(" *\n") -f.write(" * This program is distributed in the hope that it will be useful,\n") -f.write(" * but WITHOUT ANY WARRANTY; without even the implied warranty of\n") -f.write(" * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n") -f.write(" * GNU General Public License for more details.\n") -f.write(" *\n") -f.write(" * You should have received a copy of the GNU General Public License\n") -f.write(" * along with this program; see the file COPYING. If not, write to\n") -f.write(" * the Free Software Foundation, Inc., 51 Franklin Street,\n") -f.write(" * Boston, MA 02110-1301, USA.\n") -f.write(" */\n\n") -f.write("// This file was generated by make_bitmap.py\n\n") -f.write("#ifndef __BITMAP_HPP__\n") -f.write("#define __BITMAP_HPP__\n\n") -f.write("#include \"ui.hpp\"\n\n") -f.write("namespace ui {\n\n") +f.write("/*\n" + " * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.\n" + " * Copyright (C) 2016 Furrtek\n" + " *\n" + " * This file is part of PortaPack.\n" + " *\n" + " * This program is free software; you can redistribute it and/or modify\n" + " * it under the terms of the GNU General Public License as published by\n" + " * the Free Software Foundation; either version 2, or (at your option)\n" + " * any later version.\n" + " *\n" + " * This program is distributed in the hope that it will be useful,\n" + " * but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + " * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + " * GNU General Public License for more details.\n" + " *\n" + " * You should have received a copy of the GNU General Public License\n" + " * along with this program; see the file COPYING. If not, write to\n" + " * the Free Software Foundation, Inc., 51 Franklin Street,\n" + " * Boston, MA 02110-1301, USA.\n" + " */\n\n" + "// This file was generated by make_bitmap.py\n\n" + "#ifndef __BITMAP_HPP__\n" + "#define __BITMAP_HPP__\n\n" + "#include \"ui.hpp\"\n\n" + "namespace ui {\n\n") -for file in listdir(sys.argv[1]): - if file.endswith(".png"): - convert_png(sys.argv[1] + file) +for file in listdir(graphics_path): + if file.endswith(".png") and path.isfile(graphics_path + file): + convert_png(graphics_path + file) count += 1 f.write("} /* namespace ui */\n\n") diff --git a/firmware/tools/bitmap_tools/pp_bitmap_parser.py b/firmware/tools/bitmap_tools/pp_bitmap_parser.py new file mode 100755 index 00000000..453f6d5b --- /dev/null +++ b/firmware/tools/bitmap_tools/pp_bitmap_parser.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python3 + +## Note: This helper was just a POC for pp_png3hpp.py to test the regex. + +import argparse +import numpy as np +import re +from PIL import Image + + +def parse_bitmaphpp(bitmaphpp_file, icon_name): + ico_pattern = re.compile(r"static constexpr uint8_t bitmap_(.*)_data\[\] = {\n((?:\s+(?:.*)\n)+)};\nstatic constexpr Bitmap bitmap_.*\{\n\s+\{(.*)\},", re.MULTILINE) + ico_data = [] + + # read file to buffer, to find multiline regex + readfile = open(bitmaphpp_file,'r') + buff = readfile.read() + readfile.close() + + if icon_name == 'all': + for match in ico_pattern.finditer(buff): + ico_data.append([match.group(1), match.group(2), match.group(3)]) + else: + for match in ico_pattern.finditer(buff): + if match.group(1) in icon_name: + ico_data.append([match.group(1), match.group(2), match.group(3)]) + + return (ico_data) + +def convert_hpp(icon_name,bitmap_array,iconsize_str): + iconsize = iconsize_str.split(", ") + bitmap_size = (int(iconsize[0]),int(iconsize[1])) + bitmap_data=[] + + image_data = np.zeros((bitmap_size[1], bitmap_size[0]), dtype=np.uint8) + + #print(bitmap_array) + for value in bitmap_array.split(",\n"): + if (value): + #print(int(value, 0)) + bitmap_data.append(int(value, 0)) + + print(f"Count {len(bitmap_data)} Size: {bitmap_size[0]}x{bitmap_size[1]} ({bitmap_size[0]*bitmap_size[1]})") + + for y in range(bitmap_size[1]): + for x in range(bitmap_size[0]): + byte_index = (y * bitmap_size[0] + x) // 8 + bit_index = x % 8 + # bit_index = 7 - (x % 8) + pixel_value = (bitmap_data[byte_index] >> bit_index) & 1 + image_data[y, x] = pixel_value * 255 + + image = Image.fromarray(image_data, 'L') + imagea = image.copy() + imagea.putalpha(image) + imagea.save(icon_name+".png") + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("hpp", help="Path for bitmap.hpp") + parser.add_argument("--icon", help="Name of the icon from bitmap.hpp, Use 'All' for all icons in file", default = 'titlebar_image') + + args = parser.parse_args() + + if args.icon: + icon_name = args.icon + else: + icon_name = 'titlebar_image' + + print("parse", icon_name) + icons = parse_bitmaphpp(args.hpp, icon_name) + + for icon in icons: + convert_hpp(icon[0],icon[1],icon[2]) + + diff --git a/firmware/tools/bitmap_tools/pp_png2hpp.py b/firmware/tools/bitmap_tools/pp_png2hpp.py new file mode 100755 index 00000000..f465115c --- /dev/null +++ b/firmware/tools/bitmap_tools/pp_png2hpp.py @@ -0,0 +1,239 @@ +#!/usr/bin/env python3 + +# Convert png icons to bitmap.hpp inspired by +# make_bitmap.py - Copyright (C) 2016 Furrtek +# Convert bitmap.hpp to icons inspired by +# bitmap_arr_reverse_decode.py - Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. +# bitmap_arr_reverse_decode.py - Copyleft (ɔ) 2024 zxkmm with the GPL license +# Copysomething (c) 2024 LupusE with the license, needed by the PortaPack project +# +# 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 argparse +import numpy as np +import re +import sys +import os +from PIL import Image + +### Convert a directory of icons in png format to one bitmap.hpp file. +###################################################################### + +def pp_bitmaphpp_header(): + return ("""/* + * Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc. + * Copyright (C) 2016 Furrtek + * + * 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. + */ + +// This file was generated by make_bitmap.py + +#ifndef __BITMAP_HPP__ +#define __BITMAP_HPP__ + +#include \"ui.hpp\" + +namespace ui { +""") + + +def convert_png(file): + bmp_data = [] + data = 0 + + rgb_im = Image.open(file).convert('RGBA') + + if rgb_im.size[0] % 8 or rgb_im.size[1] % 8: + print((file + ": Size is not a multiple of 8. Image is not included in bitmap.hpp.")) + sys.exit(-1) + + name = os.path.basename(file).split(".")[0].lower() + + bmp_data.append(f"\nstatic constexpr uint8_t bitmap_{name}_data[] = {{\n") + + for i in range(rgb_im.size[1]): + for j in range(rgb_im.size[0]): + r, g, b, a = rgb_im.getpixel((j, i)) + + data >>= 1 + + if r > 127 and g > 127 and b > 127 and a > 127: + data += 128 + + if j % 8 == 7: + bmp_data.append(" 0x%0.2X,\n" % data) + data = 0 + + bmp_data.append(f"""}}; +static constexpr Bitmap bitmap_{name}{{ + {{{str(rgb_im.size[0])}, {str(rgb_im.size[1])}}}, + bitmap_{name}_data}}; +""") + + out_bmpdata = ''.join(map(str, bmp_data)) + + return (out_bmpdata) + +def pp_bitmaphpp_data(pngicons_path): + count = 0 + bitmaphpp_data = [] + for file in os.listdir(pngicons_path): + if os.path.isfile(pngicons_path + file) and file.endswith(".png"): + bitmaphpp_data.append(convert_png(pngicons_path + file)) + count += 1 + + return bitmaphpp_data + + +def pp_bitmaphpp_footer(): + return(""" +} /* namespace ui */ + +#endif /*__BITMAP_HPP__*/ +""") + + +def pp_write_bitmaphpp(pngicons_path, hpp_outpath): + bitmaphpp_file = [] + + bitmaphpp_file.append(pp_bitmaphpp_header()) + bitmaphpp_file.append("".join(str(x) for x in pp_bitmaphpp_data(pngicons_path))) + bitmaphpp_file.append(pp_bitmaphpp_footer()) + + out_file = "".join(str(x) for x in bitmaphpp_file) + + with open(hpp_outpath, "w", encoding="utf-8") as fd: + fd.writelines(out_file) + + print("Find your bitmap.hpp at", hpp_outpath) + + + + +### Convert from a bitmap.hpp file one or all icons in png. +########################################################### + +def parse_bitmaphpp(bitmaphpp_file,icon_name): + ico_pattern = re.compile(r"static constexpr uint8_t bitmap_(.*)_data\[\] = {\n((?:\s+(?:.*)\n)+)};\nstatic constexpr Bitmap bitmap_.*\{\n\s+\{(.*)\},", re.MULTILINE) + ico_data = [] + + # read file to buffer, to find multiline regex + readfile = open(bitmaphpp_file,'r') + buff = readfile.read() + readfile.close() + + if icon_name == 'all': + for match in ico_pattern.finditer(buff): + ico_data.append([match.group(1), match.group(2), match.group(3)]) + else: + for match in ico_pattern.finditer(buff): + if match.group(1) in icon_name: + ico_data.append([match.group(1), match.group(2), match.group(3)]) + + return (ico_data) + + +def convert_hpp(icon_name,bitmap_array,iconsize_str,png_outdir): + iconsize = iconsize_str.split(", ") + bitmap_size = (int(iconsize[0]),int(iconsize[1])) + bitmap_data=[] + + image_data = np.zeros((bitmap_size[1], bitmap_size[0]), dtype=np.uint8) + + for value in bitmap_array.split(",\n"): + if (value): + bitmap_data.append(int(value, 0)) + + for y in range(bitmap_size[1]): + for x in range(bitmap_size[0]): + byte_index = (y * bitmap_size[0] + x) // 8 + bit_index = x % 8 + # bit_index = 7 - (x % 8) + pixel_value = (bitmap_data[byte_index] >> bit_index) & 1 + image_data[y, x] = pixel_value * 255 + + image = Image.fromarray(image_data, 'L') + icon_out = os.path.join(png_outdir,icon_name+".png") + image.save(icon_out) + + +### Processing +############## + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument("hpp", help="Path of the bitmap.hpp") + parser.add_argument("graphics", help="Path of .png files to convert", default=os.path.join(os.getcwd(),"graphics")) + parser.add_argument("--icon","-i", help="Name of the icon to convert in reverse. Use 'all' to convert all. More names can be comma seperated.") + parser.add_argument("--reverse","-r", help="Convert icon from bitmap.hpp to .png", action="store_true") + + args = parser.parse_args() + + if args.reverse: + print("Reverse: Converting from hpp to png") + + # filter hpp arg is a file + hpp_file_path = args.hpp + if not os.path.isfile(hpp_file_path): + print(f"Error: {hpp_file_path} is not a valid file.") + sys.exit(1) + + # filter graph arg is a path + if args.graphics: + graphics_path = os.path.join(args.graphics, '') + else: + graphics_path = os.path.join(os.getcwd(),"graphics", '') + if not os.path.exists(graphics_path): + os.makedirs(graphics_path) # create if not exist + + # define icons to convert + if args.icon: + icon_name = args.icon + else: + icon_name = 'titlebar_image' + + icons = parse_bitmaphpp(hpp_file_path, icon_name) + + for icon in icons: + print("Converting icon", icon[0]) + convert_hpp(icon[0], icon[1], icon[2], graphics_path) + sys.exit() + else: + print("Converting from png to hpp") + if args.graphics: + graphics_path = os.path.join(args.graphics, '') + else: + graphics_path = os.path.join(os.getcwd(),"graphics", '') + print("From path", graphics_path, "to file", args.hpp) + pp_write_bitmaphpp(graphics_path, args.hpp) + sys.exit() diff --git a/firmware/tools/export_external_apps.py b/firmware/tools/export_external_apps.py index f0216a6d..0c61b444 100755 --- a/firmware/tools/export_external_apps.py +++ b/firmware/tools/export_external_apps.py @@ -91,8 +91,8 @@ cmake_objcopy = sys.argv[3] memory_location_header_position = 0 externalAppEntry_header_position = 4 -m4_app_tag_header_position = 72 -m4_app_offset_header_position = 76 +m4_app_tag_header_position = 76 +m4_app_offset_header_position = 80 for external_image_prefix in sys.argv[4:]: @@ -123,7 +123,10 @@ for external_image_prefix in sys.argv[4:]: write_image(external_application_image, "{}/{}.ppma".format(binary_dir, external_image_prefix)) continue + print(chunk_data) chunk_tag = chunk_data.decode("utf-8") + print(chunk_tag) + print("{}/../baseband/{}.bin".format(binary_dir, chunk_tag)) m4_image = read_image("{}/../baseband/{}.bin".format(binary_dir, chunk_tag)) app_image_len = len(external_application_image) external_application_image += m4_image diff --git a/firmware/tools/generate_ui-about-simple.cpp.py b/firmware/tools/generate_ui-about-simple.cpp.py new file mode 100755 index 00000000..7386eb46 --- /dev/null +++ b/firmware/tools/generate_ui-about-simple.cpp.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python3 + +# Copysomething (c) 2024 LupusE with the license, needed by the PortaPack project +# +# 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 argparse +import json +import os +import re +import requests +import sys + +cppheader = """#include "ui_about_simple.hpp" +#include + +#define ROLL_SPEED_FRAME_PER_LINE 60 +// cuz frame rate of pp screen is probably 60, scroll per sec + +namespace ui { + +// Information: a line starting with a '#' will be yellow coloured +constexpr std::""" + +cppfooter = """ +AboutView::AboutView(NavigationView& nav) { + add_children({&menu_view, + &button_ok}); + + button_ok.on_select = [&nav](Button&) { + nav.pop(); + }; + + menu_view.on_left = [this]() { + button_ok.focus(); + }; + + menu_view.on_right = [this]() { + button_ok.focus(); + }; + + for (auto& authors_line : authors_list) { + // if it's starting with #, it's a title and we have to substract the '#' and paint yellow + if (authors_line.size() > 0) { + if (authors_line[0] == '#') { + menu_view.add_item( + {(std::string)authors_line.substr(1, authors_line.size() - 1), + ui::Theme::getInstance()->fg_yellow->foreground, + nullptr, + nullptr}); + } else { + menu_view.add_item( + {(std::string)authors_line, + Theme::getInstance()->bg_darkest->foreground, + nullptr, + nullptr}); + } + } + } +} + +void AboutView::on_frame_sync() { + if (interacted) return; + + if (frame_sync_count++ % ROLL_SPEED_FRAME_PER_LINE == 0) { + const auto current = menu_view.highlighted_index(); + const auto count = menu_view.item_count(); + + if (current < count - 1) { + menu_view.set_highlighted(current + 1); + } else { + menu_view.set_highlighted(0); + // ^ to go back to the REAL top instead of make the 2 at the top to make the title disappeares + menu_view.set_highlighted(2); // the first line that has human name + } + } +} + +void AboutView::focus() { + button_ok.focus(); + menu_view.set_highlighted(2); // the first line that has human name +} + +bool AboutView::on_touch(const TouchEvent) { + interacted = true; + return false; +} + +bool AboutView::on_key(const KeyEvent) { + interacted = true; + return false; +} + +bool AboutView::on_encoder(const EncoderEvent) { + interacted = true; + menu_view.focus(); + return false; +} + +} /* namespace ui */ +""" + +def get_contributors(url): + contributors_list = [] ## Raw list of contributor names + logins = json.loads(requests.get(url).text) + try: + print(f"Could not reach URL - Error: {logins['status']} Messsage: {logins['message']}") + ## Status f.ex. 404 / message f.ex. "Not Found" or "API rate limit exceeded for...". + sys.exit() + except: + pass + + for gh_user in logins: + clean_ghuser = re.sub('[^a-zA-Z0-9-]', '.', gh_user['login']) ## replace non printable character with . + contributors_list.append(clean_ghuser) + + contributor_id = 0 + contrib_format = [] ## Formated list of contributors, max 30 char per line + for contributor in contributors_list: + contributor_id +=1 + contrib_format.append(contributor) + line_len = len(",".join(contrib_format).split("\n")[-1]) + if contributor_id < len(contributors_list) and line_len+len(contributors_list[contributor_id]) >=30: + contrib_format.append("\n") + + return(",".join(contrib_format).replace("\n,","\n")) # replace to erase first , in followup lines + +def generate_content(projects): + project_contrib = [] + project_contrib.append("string_view authors_list[] = {\n") + project_contrib.append(" \"# * List of contributors * \",\n") + for project in projects: + project_contrib.append(" \" \",\n") + project_contrib.append(f" \"#{project[0]}:\",\n") + + url = f"https://api.github.com/repos/{project[1]}/{project[2]}/contributors?per_page={project[3]}" + contrib_mayhem = get_contributors(url).split("\n") + for line in contrib_mayhem: + project_contrib.append(f" \"{line}\",\n") + + project_contrib.append(" \" \"};\n") + return("".join(project_contrib)) + + +def pp_create_ui_about_simple_cpp(cpp_file, cppheader, cppcontent, cppfooter): + uiaboutsimplecpp_file = [] + + uiaboutsimplecpp_file.append(cppheader) + uiaboutsimplecpp_file.append(cppcontent) + uiaboutsimplecpp_file.append(cppfooter) + + with open(cpp_file, "w", encoding="utf-8") as file: + file.writelines(uiaboutsimplecpp_file) + + print("Find your ui_simple_about.cpp at", cpp_file) + +def pp_change_ui_about_simple_cpp(cpp_file, cppcontent): + content = [] + content_pattern = re.compile(r"string_view authors_list\[\] = {\n(?:\s+(?:.*,\n)+\s+.*};\n)", re.MULTILINE) + + # Read original file + with open(cpp_file, 'r') as file: + filedata = file.read() + + # Replace regex content with generated list + for match in content_pattern.finditer(filedata): + content.append(match[0]) + + filedata = filedata.replace(content[0], cppcontent) + + # Write new file + with open(cpp_file, 'w') as file: + file.write(filedata) + + +projects = [] +## Format: Project title, Github name, Github repo, Amount of contributors +projects.append(["Mayhem-Firmware","portapack-mayhem","mayhem-firmware","50"]) +projects.append(["Havoc","furrtek","portapack-havoc","50"]) +projects.append(["PortaPack","sharebrained","portapack-hackrf","50"]) +projects.append(["HackRF","mossmann","hackrf","15"]) + + +## processing +############# + +if __name__ == '__main__': + parser = argparse.ArgumentParser( + description="This tool updates the ui_about_simple.cpp from PortaPack firmware from Github contributors. If no file is given, the file will be generated.", + ) + parser.add_argument("--cpp", help="Path of the source ui_about_simple.cpp to update.", default="ui_about_simple.cpp") + parser.add_argument("--new","-n", help="Generate a new file") + + args = parser.parse_args() + + if args.cpp: + cpp_file = os.path.join(os.getcwd(),args.cpp) + else: + cpp_file = os.path.join(os.getcwd(),"ui_about_simple.cpp") + + cppcontent = generate_content(projects) + + if args.new or not os.path.isfile(args.cpp): + pp_create_ui_about_simple_cpp(cpp_file, cppheader, cppcontent, cppfooter) + else: + pp_change_ui_about_simple_cpp(cpp_file, cppcontent) diff --git a/firmware/tools/make_baseband_file.py b/firmware/tools/make_baseband_file.py deleted file mode 100755 index 82edbbac..00000000 --- a/firmware/tools/make_baseband_file.py +++ /dev/null @@ -1,117 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright (C) 2016 Furrtek -# -# 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 -import md5 - -usage_message = """ -Baseband module package file generator - -Usage: ... -""" - -def read_image(path): - f = open(path, 'rb') - data = f.read() - f.close() - return data - -def write_file(data, path): - f = open(path, 'wb') - f.write(data) - f.close() - -if len(sys.argv) == 1: - print(usage_message) - sys.exit(-1) - -data = bytearray() -h_data = bytearray() -name = bytearray() -info = bytearray() -description = bytearray() -data_default_byte = bytearray((0,)) - -sys.argv = sys.argv[1:] - -# Format for module file: -# Magic (4), Version (2), Length (4), Name (16), MD5 (16), Description (214) -# 0x00 pad bytes (256) -# Module binary (padded to 32768-16) -# MD5 (16) again, so that module code can read it (dirty...) - -for args in sys.argv: - m = md5.new() - data = read_image(args + '/build/' + args + '.bin') - data_r = data - - # Magic bytes - info = 'PPM ' - - # Version - info += struct.pack('H', 2) - - # Length - info += struct.pack('I', len(data)) - - # Module name - name = read_image(args + '/name') - if len(name) > 16: - name = name[0:15] - pad_size = 16 - len(name) - name += (data_default_byte * pad_size) - info += name - - # Module MD5 footprint - m.update(data) - digest = m.digest() - pad_size = 16 - len(digest) - digest += (data_default_byte * pad_size) - info += digest - - # Module description - description = read_image(args + '/description') - if len(description) > 214: - description = description[0:213] - pad_size = 214 - len(description) - description += (data_default_byte * pad_size) - info += description - - # Header padding to fit in SD card sector - info += (data_default_byte * 256) - - # Binary padding - data = info + data - pad_size = (32768 + 512 - 16) - len(data) - data += (data_default_byte * pad_size) - data += digest - write_file(data, args + '.bin') - - # Add to modules.h - md5sum = '' - for byte in digest: - md5sum += '0x' + format(byte, '02x') + ',' - h_data += 'const char md5_' + args.replace('-','_') + '[16] = {' + md5sum + '};\n' - - # Update original binary with MD5 footprint - write_file(data[512:(32768+512)], args + '/build/' + args + '_inc.bin') - -write_file(h_data, 'common/modules.h') diff --git a/flashing/flash_portapack_mayhem.bat b/flashing/flash_portapack_mayhem.bat index 6ab9cfb4..83f63b06 100644 --- a/flashing/flash_portapack_mayhem.bat +++ b/flashing/flash_portapack_mayhem.bat @@ -12,8 +12,8 @@ pause echo. REM Check if the firmware file exists -if not exist portapack-h1_h2-mayhem.bin ( - echo The firmware file "portapack-h1_h2-mayhem.bin" does not exist. +if not exist portapack-mayhem-firmware.bin ( + echo The firmware file "portapack-mayhem-firmware.bin" does not exist. echo Please ensure that you have downloaded the latest release from: echo https://github.com/portapack-mayhem/mayhem-firmware/releases/ echo. @@ -21,7 +21,7 @@ if not exist portapack-h1_h2-mayhem.bin ( exit /b ) -"utils/hackrf_update.exe" portapack-h1_h2-mayhem.bin +"utils/hackrf_update.exe" portapack-mayhem-firmware.bin echo. echo If your device never boot after flashing, please refer to https://github.com/portapack-mayhem/mayhem-firmware/wiki/Won't-boot echo. diff --git a/flashing/utils/hackrf_one_usb.bin b/flashing/utils/hackrf_one_usb.bin deleted file mode 100644 index e35de267..00000000 Binary files a/flashing/utils/hackrf_one_usb.bin and /dev/null differ diff --git a/flashing/utils/hackrf_one_usb.dfu b/flashing/utils/hackrf_one_usb.dfu deleted file mode 100644 index 2e9d5f72..00000000 Binary files a/flashing/utils/hackrf_one_usb.dfu and /dev/null differ diff --git a/hackrf b/hackrf index d4ed8474..65bf67f9 160000 --- a/hackrf +++ b/hackrf @@ -1 +1 @@ -Subproject commit d4ed8474e532ccdbf605ee71c0f1fa0557da19e1 +Subproject commit 65bf67f9b55ec8e501d64de9ffcbd0528e41c5f3 diff --git a/hackrf-portapack/CMakeLists.txt b/hackrf-portapack/CMakeLists.txt deleted file mode 100644 index 07e9e3fa..00000000 --- a/hackrf-portapack/CMakeLists.txt +++ /dev/null @@ -1,93 +0,0 @@ -# Copyright 2012 Jared Boone -# -# This file is part of 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. -# - -cmake_minimum_required(VERSION 3.5) -set(CMAKE_TOOLCHAIN_FILE ../toolchain-arm-cortex-m.cmake) - -project(hackrf_usb C) - -include(../hackrf/firmware/hackrf-common.cmake) - -set(PATH_HACKRF_USB ../hackrf/firmware/hackrf_usb) - -add_custom_command( - OUTPUT ${PATH_HACKRF_CPLD_DATA_C} - COMMAND ${PATH_CPLD_BITSTREAM_TOOL} --xsvf ${PATH_HACKRF_CPLD_XSVF} --hackrf-data ${PATH_HACKRF_CPLD_DATA_C} - DEPENDS ${PATH_CPLD_BITSTREAM_TOOL} ${PATH_HACKRF_CPLD_XSVF} -) - -set(SRC_M4 - ${PATH_HACKRF_USB}/hackrf_usb.c - "${PATH_HACKRF_FIRMWARE_COMMON}/tuning.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/streaming.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/usb.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/usb_request.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/usb_standard_request.c" - ${PATH_HACKRF_USB}/usb_descriptor.c - ${PATH_HACKRF_USB}/usb_device.c - ${PATH_HACKRF_USB}/usb_endpoint.c - ${PATH_HACKRF_USB}/usb_api_cpld.c - ${PATH_HACKRF_USB}/usb_api_m0_state.c - ${PATH_HACKRF_USB}/usb_api_register.c - ${PATH_HACKRF_USB}/usb_api_spiflash.c - ${PATH_HACKRF_USB}/usb_api_transceiver.c - ${PATH_HACKRF_USB}/usb_api_operacake.c - ${PATH_HACKRF_USB}/usb_api_sweep.c - ${PATH_HACKRF_USB}/usb_api_ui.c - "${PATH_HACKRF_FIRMWARE_COMMON}/usb_queue.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/fault_handler.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/cpld_jtag.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/cpld_xc2c.c" - "${PATH_HACKRF_CPLD_DATA_C}" - "${PATH_HACKRF_FIRMWARE_COMMON}/xapp058/lenval.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/xapp058/micro.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/xapp058/ports.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/crc.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/rom_iap.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/operacake.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/operacake_sctimer.c" -) - -set(SRC_M0 ${PATH_HACKRF_USB}/sgpio_m0.s) - -if(BOARD STREQUAL "HACKRF_ONE") - SET(SRC_M4 - ${SRC_M4} - usb_api_board_info.c - portapack.c - "${PATH_HACKRF_FIRMWARE_COMMON}/ui_portapack.c" - ) -endif() - -if(BOARD STREQUAL "RAD1O") - SET(SRC_M4 - ${SRC_M4} - "${PATH_HACKRF_FIRMWARE_COMMON}/rad1o/display.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/rad1o/print.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/rad1o/render.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/rad1o/decoder.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/rad1o/smallfonts.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/rad1o/draw.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/rad1o/ubuntu18.c" - "${PATH_HACKRF_FIRMWARE_COMMON}/ui_rad1o.c" - ) -endif() - -DeclareTargets() diff --git a/hackrf-portapack/portapack.c b/hackrf-portapack/portapack.c deleted file mode 100644 index 8c41d640..00000000 --- a/hackrf-portapack/portapack.c +++ /dev/null @@ -1,640 +0,0 @@ -/* - * Copyright 2018-2022 Great Scott Gadgets - * Copyright 2018 Jared Boone - * - * This file is part of 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. - */ - -#include "portapack.h" - -#include "hackrf_core.h" -#include "gpio_lpc.h" - -#include - -static void portapack_sleep_milliseconds(const uint32_t milliseconds) -{ - /* NOTE: Naively assumes 204 MHz instruction cycle clock and five instructions per count */ - delay(milliseconds * 40800); -} - -// clang-format off -static struct gpio_t gpio_io_stbx = GPIO(5, 0); /* P2_0 */ -static struct gpio_t gpio_addr = GPIO(5, 1); /* P2_1 */ -__attribute__((unused)) -static struct gpio_t gpio_lcd_te = GPIO(5, 3); /* P2_3 */ -__attribute__((unused)) -static struct gpio_t gpio_unused = GPIO(5, 7); /* P2_8 */ -static struct gpio_t gpio_lcd_rdx = GPIO(5, 4); /* P2_4 */ -static struct gpio_t gpio_lcd_wrx = GPIO(1, 10); /* P2_9 */ -static struct gpio_t gpio_dir = GPIO(1, 13); /* P2_13 */ - -// clang-format on - -typedef struct portapack_if_t { - gpio_t gpio_dir; - gpio_t gpio_lcd_rdx; - gpio_t gpio_lcd_wrx; - gpio_t gpio_io_stbx; - gpio_t gpio_addr; - gpio_port_t* const gpio_port_data; - uint8_t io_reg; -} portapack_if_t; - -static portapack_if_t portapack_if = { - .gpio_dir = &gpio_dir, - .gpio_lcd_rdx = &gpio_lcd_rdx, - .gpio_lcd_wrx = &gpio_lcd_wrx, - .gpio_io_stbx = &gpio_io_stbx, - .gpio_addr = &gpio_addr, - .gpio_port_data = GPIO_LPC_PORT(3), - .io_reg = 0x03, -}; - -/* NOTE: Code below assumes the shift value is "8". */ -#define GPIO_DATA_SHIFT (8) -static const uint32_t gpio_data_mask = 0xFFU << GPIO_DATA_SHIFT; - -static void portapack_data_mask_set() -{ - portapack_if.gpio_port_data->mask = ~gpio_data_mask; -} - -static void portapack_data_write_low(const uint32_t value) -{ - portapack_if.gpio_port_data->mpin = (value << GPIO_DATA_SHIFT); -} - -static void portapack_data_write_high(const uint32_t value) -{ - /* NOTE: Assumes no other bits in the port are masked. */ - /* NOTE: Assumes that bits 15 through 8 are masked. */ - portapack_if.gpio_port_data->mpin = value; -} - -static void portapack_dir_read() -{ - portapack_if.gpio_port_data->dir &= ~gpio_data_mask; - gpio_set(portapack_if.gpio_dir); -} - -static void portapack_dir_write() -{ - gpio_clear(portapack_if.gpio_dir); - portapack_if.gpio_port_data->dir |= gpio_data_mask; - /* TODO: Manipulating DIR[3] makes me queasy. The RFFC5072 DATA pin - * is also on port 3, and switches direction periodically... - * Time to resort to bit-banding to enforce atomicity? But then, how - * to change direction on eight bits efficiently? Or do I care, since - * the PortaPack data bus shouldn't change direction too frequently? - */ -} - -__attribute__((unused)) static void portapack_lcd_rd_assert() -{ - gpio_clear(portapack_if.gpio_lcd_rdx); -} - -static void portapack_lcd_rd_deassert() -{ - gpio_set(portapack_if.gpio_lcd_rdx); -} - -static void portapack_lcd_wr_assert() -{ - gpio_clear(portapack_if.gpio_lcd_wrx); -} - -static void portapack_lcd_wr_deassert() -{ - gpio_set(portapack_if.gpio_lcd_wrx); -} - -static void portapack_io_stb_assert() -{ - gpio_clear(portapack_if.gpio_io_stbx); -} - -static void portapack_io_stb_deassert() -{ - gpio_set(portapack_if.gpio_io_stbx); -} - -static void portapack_addr(const bool value) -{ - gpio_write(portapack_if.gpio_addr, value); -} - -static void portapack_lcd_command(const uint32_t value) -{ - portapack_data_write_high(0); /* Drive high byte (with zero -- don't care) */ - portapack_dir_write(); /* Turn around data bus, MCU->CPLD */ - portapack_addr(0); /* Indicate command */ - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - portapack_lcd_wr_assert(); /* Latch high byte */ - - portapack_data_write_low(value); /* Drive low byte (pass-through) */ - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - portapack_lcd_wr_deassert(); /* Complete write operation */ - - portapack_addr(1); /* Set up for data phase (most likely after a command) */ -} - -static void portapack_lcd_write_data(const uint32_t value) -{ - // NOTE: Assumes and DIR=0 and ADDR=1 from command phase. - portapack_data_write_high(value); /* Drive high byte */ - __asm__("nop"); - portapack_lcd_wr_assert(); /* Latch high byte */ - - portapack_data_write_low(value); /* Drive low byte (pass-through) */ - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - portapack_lcd_wr_deassert(); /* Complete write operation */ -} - -static void portapack_io_write(const bool address, const uint_fast16_t value) -{ - portapack_data_write_low(value); - portapack_dir_write(); - portapack_addr(address); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - portapack_io_stb_assert(); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - portapack_io_stb_deassert(); -} - -static void portapack_if_init() -{ - portapack_data_mask_set(); - portapack_data_write_high(0); - - portapack_dir_read(); - portapack_lcd_rd_deassert(); - portapack_lcd_wr_deassert(); - portapack_io_stb_deassert(); - portapack_addr(0); - - gpio_output(portapack_if.gpio_dir); - gpio_output(portapack_if.gpio_lcd_rdx); - gpio_output(portapack_if.gpio_lcd_wrx); - gpio_output(portapack_if.gpio_io_stbx); - gpio_output(portapack_if.gpio_addr); - /* gpio_input(portapack_if.gpio_rot_a); */ - /* gpio_input(portapack_if.gpio_rot_b); */ - - scu_pinmux(SCU_PINMUX_PP_D0, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); - scu_pinmux(SCU_PINMUX_PP_D1, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); - scu_pinmux(SCU_PINMUX_PP_D2, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); - scu_pinmux(SCU_PINMUX_PP_D3, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); - scu_pinmux(SCU_PINMUX_PP_D4, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); - scu_pinmux(SCU_PINMUX_PP_D5, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); - scu_pinmux(SCU_PINMUX_PP_D6, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); - scu_pinmux(SCU_PINMUX_PP_D7, SCU_CONF_FUNCTION0 | SCU_GPIO_PDN); - - scu_pinmux(SCU_PINMUX_PP_DIR, SCU_CONF_FUNCTION0 | SCU_GPIO_NOPULL); - scu_pinmux(SCU_PINMUX_PP_LCD_RDX, SCU_CONF_FUNCTION4 | SCU_GPIO_NOPULL); - scu_pinmux(SCU_PINMUX_PP_LCD_WRX, SCU_CONF_FUNCTION0 | SCU_GPIO_NOPULL); - scu_pinmux(SCU_PINMUX_PP_IO_STBX, SCU_CONF_FUNCTION4 | SCU_GPIO_NOPULL); - scu_pinmux(SCU_PINMUX_PP_ADDR, SCU_CONF_FUNCTION4 | SCU_GPIO_NOPULL); - /* scu_pinmux(SCU_PINMUX_PP_LCD_TE, SCU_CONF_FUNCTION4 | SCU_GPIO_NOPULL); */ - /* scu_pinmux(SCU_PINMUX_PP_UNUSED, SCU_CONF_FUNCTION4 | SCU_GPIO_NOPULL); */ -} - -static void portapack_lcd_reset_state(const bool active) -{ - portapack_if.io_reg = (portapack_if.io_reg & 0xfe) | (active ? (1 << 0) : 0); - portapack_io_write(1, portapack_if.io_reg); -} - -static void portapack_lcd_data_write_command_and_data( - const uint_fast8_t command, - const uint8_t* data, - const size_t data_count) -{ - portapack_lcd_command(command); - for (size_t i = 0; i < data_count; i++) { - portapack_lcd_write_data(data[i]); - } -} - -static void portapack_lcd_sleep_out() -{ - const uint8_t cmd_11[] = {}; - portapack_lcd_data_write_command_and_data(0x11, cmd_11, ARRAY_SIZEOF(cmd_11)); - // "It will be necessary to wait 120msec after sending Sleep Out - // command (when in Sleep In Mode) before Sleep In command can be - // sent." - portapack_sleep_milliseconds(120); -} - -static void portapack_lcd_display_on() -{ - const uint8_t cmd_29[] = {}; - portapack_lcd_data_write_command_and_data(0x29, cmd_29, ARRAY_SIZEOF(cmd_29)); -} - -static void portapack_lcd_ramwr_start() -{ - const uint8_t cmd_2c[] = {}; - portapack_lcd_data_write_command_and_data(0x2c, cmd_2c, ARRAY_SIZEOF(cmd_2c)); -} - -static void portapack_lcd_set( - const uint_fast8_t command, - const uint_fast16_t start, - const uint_fast16_t end) -{ - const uint8_t data[] = {(start >> 8), (start & 0xff), (end >> 8), (end & 0xff)}; - portapack_lcd_data_write_command_and_data(command, data, ARRAY_SIZEOF(data)); -} - -static void portapack_lcd_caset( - const uint_fast16_t start_column, - const uint_fast16_t end_column) -{ - portapack_lcd_set(0x2a, start_column, end_column); -} - -static void portapack_lcd_paset( - const uint_fast16_t start_page, - const uint_fast16_t end_page) -{ - portapack_lcd_set(0x2b, start_page, end_page); -} - -static void portapack_lcd_start_ram_write(const ui_rect_t rect) -{ - portapack_lcd_caset(rect.point.x, rect.point.x + rect.size.width - 1); - portapack_lcd_paset(rect.point.y, rect.point.y + rect.size.height - 1); - portapack_lcd_ramwr_start(); -} - -static void portapack_lcd_write_pixel(const ui_color_t pixel) -{ - portapack_lcd_write_data(pixel.v); -} - -static void portapack_lcd_write_pixels_color(const ui_color_t c, size_t n) -{ - while (n--) { - portapack_lcd_write_data(c.v); - } -} - -static void portapack_lcd_wake() -{ - portapack_lcd_sleep_out(); - portapack_lcd_display_on(); -} - -static void portapack_lcd_reset() -{ - portapack_lcd_reset_state(false); - portapack_sleep_milliseconds(1); - portapack_lcd_reset_state(true); - portapack_sleep_milliseconds(10); - portapack_lcd_reset_state(false); - portapack_sleep_milliseconds(120); -} - -static void portapack_lcd_init() -{ - // LCDs are configured for IM[2:0] = 001 - // 8080-I system, 16-bit parallel bus - - // - // 0x3a: DBI[2:0] = 101 - // MDT[1:0] = XX (if not in 18-bit mode, right?) - - // Power control B - // 0 - // PCEQ=1, DRV_ena=0, Power control=3 - const uint8_t cmd_cf[] = {0x00, 0xD9, 0x30}; - portapack_lcd_data_write_command_and_data(0xCF, cmd_cf, ARRAY_SIZEOF(cmd_cf)); - - // Power on sequence control - const uint8_t cmd_ed[] = {0x64, 0x03, 0x12, 0x81}; - portapack_lcd_data_write_command_and_data(0xED, cmd_ed, ARRAY_SIZEOF(cmd_ed)); - - // Driver timing control A - const uint8_t cmd_e8[] = {0x85, 0x10, 0x78}; - portapack_lcd_data_write_command_and_data(0xE8, cmd_e8, ARRAY_SIZEOF(cmd_e8)); - - // Power control A - const uint8_t cmd_cb[] = {0x39, 0x2C, 0x00, 0x34, 0x02}; - portapack_lcd_data_write_command_and_data(0xCB, cmd_cb, ARRAY_SIZEOF(cmd_cb)); - - // Pump ratio control - const uint8_t cmd_f7[] = {0x20}; - portapack_lcd_data_write_command_and_data(0xF7, cmd_f7, ARRAY_SIZEOF(cmd_f7)); - - // Driver timing control B - const uint8_t cmd_ea[] = {0x00, 0x00}; - portapack_lcd_data_write_command_and_data(0xEA, cmd_ea, ARRAY_SIZEOF(cmd_ea)); - - const uint8_t cmd_b1[] = {0x00, 0x1B}; - portapack_lcd_data_write_command_and_data(0xB1, cmd_b1, ARRAY_SIZEOF(cmd_b1)); - - // Blanking Porch Control - // VFP = 0b0000010 = 2 (number of HSYNC of vertical front porch) - // VBP = 0b0000010 = 2 (number of HSYNC of vertical back porch) - // HFP = 0b0001010 = 10 (number of DOTCLOCK of horizontal front porch) - // HBP = 0b0010100 = 20 (number of DOTCLOCK of horizontal back porch) - const uint8_t cmd_b5[] = {0x02, 0x02, 0x0a, 0x14}; - portapack_lcd_data_write_command_and_data(0xB5, cmd_b5, ARRAY_SIZEOF(cmd_b5)); - - // Display Function Control - // PT[1:0] = 0b10 - // PTG[1:0] = 0b10 - // ISC[3:0] = 0b0010 (scan cycle interval of gate driver: 5 frames) - // SM = 0 (gate driver pin arrangement in combination with GS) - // SS = 1 (source output scan direction S720 -> S1) - // GS = 0 (gate output scan direction G1 -> G320) - // REV = 1 (normally white) - // NL = 0b100111 (default) - // PCDIV = 0b000000 (default?) - const uint8_t cmd_b6[] = {0x0A, 0xA2, 0x27, 0x00}; - portapack_lcd_data_write_command_and_data(0xB6, cmd_b6, ARRAY_SIZEOF(cmd_b6)); - - // Power Control 1 - //VRH[5:0] - const uint8_t cmd_c0[] = {0x1B}; - portapack_lcd_data_write_command_and_data(0xC0, cmd_c0, ARRAY_SIZEOF(cmd_c0)); - - // Power Control 2 - //SAP[2:0];BT[3:0] - const uint8_t cmd_c1[] = {0x12}; - portapack_lcd_data_write_command_and_data(0xC1, cmd_c1, ARRAY_SIZEOF(cmd_c1)); - - // VCOM Control 1 - const uint8_t cmd_c5[] = {0x32, 0x3C}; - portapack_lcd_data_write_command_and_data(0xC5, cmd_c5, ARRAY_SIZEOF(cmd_c5)); - - // VCOM Control 2 - const uint8_t cmd_c7[] = {0x9B}; - portapack_lcd_data_write_command_and_data(0xC7, cmd_c7, ARRAY_SIZEOF(cmd_c7)); - - // Memory Access Control - // Invert X and Y memory access order, so upper-left of - // screen is (0,0) when writing to display. - const uint8_t cmd_36[] = { - (1 << 7) | // MY=1 - (1 << 6) | // MX=1 - (0 << 5) | // MV=0 - (1 << 4) | // ML=1: reverse vertical refresh to simplify scrolling logic - (1 << 3) // BGR=1: For Kingtech LCD, BGR filter. - }; - portapack_lcd_data_write_command_and_data(0x36, cmd_36, ARRAY_SIZEOF(cmd_36)); - - // COLMOD: Pixel Format Set - // DPI=101 (16 bits/pixel), DBI=101 (16 bits/pixel) - const uint8_t cmd_3a[] = {0x55}; - portapack_lcd_data_write_command_and_data(0x3A, cmd_3a, ARRAY_SIZEOF(cmd_3a)); - - //portapack_lcd_data_write_command_and_data(0xF6, { 0x01, 0x30 }); - // WEMODE=1 (reset column and page number on overflow) - // MDT[1:0] - // EPF[1:0]=00 (use channel MSB for LSB) - // RIM=0 (If COLMOD[6:4]=101 (65k color), 16-bit RGB interface (1 transfer/pixel)) - // RM=0 (system interface/VSYNC interface) - // DM[1:0]=00 (internal clock operation) - // ENDIAN=0 (doesn't matter with 16-bit interface) - const uint8_t cmd_f6[] = {0x01, 0x30, 0x00}; - portapack_lcd_data_write_command_and_data(0xF6, cmd_f6, ARRAY_SIZEOF(cmd_f6)); - - // 3Gamma Function Disable - const uint8_t cmd_f2[] = {0x00}; - portapack_lcd_data_write_command_and_data(0xF2, cmd_f2, ARRAY_SIZEOF(cmd_f2)); - - // Gamma curve selected - const uint8_t cmd_26[] = {0x01}; - portapack_lcd_data_write_command_and_data(0x26, cmd_26, ARRAY_SIZEOF(cmd_26)); - - // Set Gamma - const uint8_t cmd_e0[] = { - 0x0F, - 0x1D, - 0x19, - 0x0E, - 0x10, - 0x07, - 0x4C, - 0x63, - 0x3F, - 0x03, - 0x0D, - 0x00, - 0x26, - 0x24, - 0x04}; - portapack_lcd_data_write_command_and_data(0xE0, cmd_e0, ARRAY_SIZEOF(cmd_e0)); - - // Set Gamma - const uint8_t cmd_e1[] = { - 0x00, - 0x1C, - 0x1F, - 0x02, - 0x0F, - 0x03, - 0x35, - 0x25, - 0x47, - 0x04, - 0x0C, - 0x0B, - 0x29, - 0x2F, - 0x05}; - portapack_lcd_data_write_command_and_data(0xE1, cmd_e1, ARRAY_SIZEOF(cmd_e1)); - - portapack_lcd_wake(); - - // Turn on Tearing Effect Line (TE) output signal. - const uint8_t cmd_35[] = {0b00000000}; - portapack_lcd_data_write_command_and_data(0x35, cmd_35, ARRAY_SIZEOF(cmd_35)); -} - -void portapack_backlight(const bool on) -{ - portapack_if.io_reg = (portapack_if.io_reg & 0x7f) | (on ? (1 << 7) : 0); - portapack_io_write(1, portapack_if.io_reg); -} - -void portapack_reference_oscillator(const bool on) -{ - const uint8_t mask = 1 << 6; - portapack_if.io_reg = (portapack_if.io_reg & ~mask) | (on ? mask : 0); - portapack_io_write(1, portapack_if.io_reg); -} - -void portapack_fill_rectangle(const ui_rect_t rect, const ui_color_t color) -{ - portapack_lcd_start_ram_write(rect); - portapack_lcd_write_pixels_color(color, rect.size.width * rect.size.height); -} - -void portapack_clear_display(const ui_color_t color) -{ - const ui_rect_t rect_screen = {{0, 0}, {240, 320}}; - portapack_fill_rectangle(rect_screen, color); -} - -void portapack_draw_bitmap( - const ui_point_t point, - const ui_bitmap_t bitmap, - const ui_color_t foreground, - const ui_color_t background) -{ - const ui_rect_t rect = {.point = point, .size = bitmap.size}; - - portapack_lcd_start_ram_write(rect); - - const size_t count = bitmap.size.width * bitmap.size.height; - for (size_t i = 0; i < count; i++) { - const uint8_t pixel = bitmap.data[i >> 3] & (1U << (i & 0x7)); - portapack_lcd_write_pixel(pixel ? foreground : background); - } -} - -ui_bitmap_t portapack_font_glyph(const ui_font_t* const font, const char c) -{ - if (c >= font->c_start) { - const uint_fast8_t index = c - font->c_start; - if (index < font->c_count) { - const ui_bitmap_t bitmap = { - .size = font->glyph_size, - .data = &font->data[index * font->data_stride]}; - return bitmap; - } - } - - const ui_bitmap_t bitmap = { - .size = font->glyph_size, - .data = font->data, - }; - return bitmap; -} - -static bool jtag_pp_tck(const bool tms_value) -{ - gpio_write(jtag_cpld.gpio->gpio_pp_tms, tms_value); - - // 8 ns TMS/TDI to TCK setup - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - - gpio_set(jtag_cpld.gpio->gpio_tck); - - // 15 ns TCK to TMS/TDI hold time - // 20 ns TCK high time - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - - gpio_clear(jtag_cpld.gpio->gpio_tck); - - // 20 ns TCK low time - // 25 ns TCK falling edge to TDO valid - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - __asm__("nop"); - - return gpio_read(jtag_cpld.gpio->gpio_pp_tdo); -} - -static uint32_t jtag_pp_shift(const uint32_t tms_bits, const size_t count) -{ - uint32_t result = 0; - size_t bit_in_index = count - 1; - size_t bit_out_index = 0; - while (bit_out_index < count) { - const uint32_t tdo = jtag_pp_tck((tms_bits >> bit_in_index) & 1) & 1; - result |= (tdo << bit_out_index); - - bit_in_index--; - bit_out_index++; - } - - return result; -} - -static uint32_t jtag_pp_idcode(void) -{ - cpld_jtag_take(&jtag_cpld); - - /* TODO: Check if PortaPack TMS is floating or driven by an external device. */ - gpio_output(jtag_cpld.gpio->gpio_pp_tms); - - /* Test-Logic/Reset -> Run-Test/Idle -> Select-DR/Scan -> Capture-DR */ - jtag_pp_shift(0b11111010, 8); - - /* Shift-DR */ - const uint32_t idcode = jtag_pp_shift(0, 32); - - /* Exit1-DR -> Update-DR -> Run-Test/Idle -> ... -> Test-Logic/Reset */ - jtag_pp_shift(0b11011111, 8); - - cpld_jtag_release(&jtag_cpld); - - return idcode; -} - -static bool portapack_detect(void) -{ - const uint32_t idcode = jtag_pp_idcode(); - return idcode == 0x00025610 || idcode == 0x020A50DD; -} - -static const portapack_t portapack_instance = {}; - -static const portapack_t* portapack_pointer = NULL; - -const portapack_t* portapack(void) -{ - return portapack_pointer; -} - -void portapack_init(void) -{ - if (portapack_detect()) { - portapack_if_init(); - portapack_lcd_reset(); - portapack_lcd_init(); - portapack_pointer = &portapack_instance; - } else { - portapack_pointer = NULL; - } -} diff --git a/hackrf-portapack/usb_api_board_info.c b/hackrf-portapack/usb_api_board_info.c deleted file mode 100644 index 199c3b3a..00000000 --- a/hackrf-portapack/usb_api_board_info.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright 2012-2022 Great Scott Gadgets - * Copyright 2012 Jared Boone - * Copyright 2013 Benjamin Vernoux - * - * This file is part of 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. - */ - -#include "usb_api_board_info.h" -#include "platform_detect.h" -#include "firmware_info.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -#ifdef HACKRF_ONE -#include "gpio_lpc.h" -static struct gpio_t gpio_h1r9_clkout_en = GPIO(0, 9); -static struct gpio_t gpio_h1r9_mcu_clk_en = GPIO(0, 8); -static struct gpio_t gpio_h1r9_rx = GPIO(0, 7); -#endif - -usb_request_status_t usb_vendor_request_read_board_id( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage) { - if (stage == USB_TRANSFER_STAGE_SETUP) { - endpoint->buffer[0] = detected_platform(); - usb_transfer_schedule_block( - endpoint->in, - &endpoint->buffer, - 1, - NULL, - NULL); - usb_transfer_schedule_ack(endpoint->out); - } - return USB_REQUEST_STATUS_OK; -} - -usb_request_status_t usb_vendor_request_read_version_string( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage) { - uint8_t length; - - if (stage == USB_TRANSFER_STAGE_SETUP) { - length = (uint8_t)strlen(firmware_info.version_string); - // The USB peripheral doesn't seem to be able to read directly from flash, - // so copy the version string into ram first. - memcpy(&endpoint->buffer, - firmware_info.version_string, - sizeof(firmware_info.version_string)); - usb_transfer_schedule_block( - endpoint->in, - &endpoint->buffer, - length, - NULL, - NULL); - usb_transfer_schedule_ack(endpoint->out); - } - return USB_REQUEST_STATUS_OK; -} - -static read_partid_serialno_t read_partid_serialno; - -usb_request_status_t usb_vendor_request_read_partid_serialno( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage) { - uint8_t length; - iap_cmd_res_t iap_cmd_res; - - if (stage == USB_TRANSFER_STAGE_SETUP) { - /* Read IAP Part Number Identification */ - iap_cmd_res.cmd_param.command_code = IAP_CMD_READ_PART_ID_NO; - iap_cmd_call(&iap_cmd_res); - if (iap_cmd_res.status_res.status_ret != CMD_SUCCESS) { - return USB_REQUEST_STATUS_STALL; - } - - read_partid_serialno.part_id[0] = iap_cmd_res.status_res.iap_result[0]; - read_partid_serialno.part_id[1] = iap_cmd_res.status_res.iap_result[1]; - - /* Read IAP Serial Number Identification */ - iap_cmd_res.cmd_param.command_code = IAP_CMD_READ_SERIAL_NO; - iap_cmd_call(&iap_cmd_res); - if (iap_cmd_res.status_res.status_ret != CMD_SUCCESS) { - return USB_REQUEST_STATUS_STALL; - } - - read_partid_serialno.serial_no[0] = iap_cmd_res.status_res.iap_result[0]; - read_partid_serialno.serial_no[1] = iap_cmd_res.status_res.iap_result[1]; - read_partid_serialno.serial_no[2] = iap_cmd_res.status_res.iap_result[2]; - read_partid_serialno.serial_no[3] = iap_cmd_res.status_res.iap_result[3]; - - length = (uint8_t)sizeof(read_partid_serialno_t); - usb_transfer_schedule_block( - endpoint->in, - &read_partid_serialno, - length, - NULL, - NULL); - usb_transfer_schedule_ack(endpoint->out); - } - return USB_REQUEST_STATUS_OK; -} - -usb_request_status_t usb_vendor_request_reset( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage) { - if (stage == USB_TRANSFER_STAGE_SETUP) { -#ifdef HACKRF_ONE - /* - * Set boot pins as inputs so that the bootloader reads them - * correctly after the reset. - */ - if (detected_platform() == BOARD_ID_HACKRF1_R9) { - gpio_input(&gpio_h1r9_mcu_clk_en); - gpio_input(&gpio_h1r9_clkout_en); - gpio_input(&gpio_h1r9_rx); - } -#endif - usb_transfer_schedule_ack(endpoint->in); - delay(50 * 40800); - - SCU_SFSP2_8 = (SCU_SFSP2_8 & ~(7)) | 4; - struct gpio_t dfu = GPIO(5, 7); - gpio_output(&dfu); - gpio_clear(&dfu); - - wwdt_reset(100000); - } - return USB_REQUEST_STATUS_OK; -} - -usb_request_status_t usb_vendor_request_read_board_rev( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage) { - if (stage == USB_TRANSFER_STAGE_SETUP) { - endpoint->buffer[0] = detected_revision(); - usb_transfer_schedule_block( - endpoint->in, - &endpoint->buffer, - 1, - NULL, - NULL); - usb_transfer_schedule_ack(endpoint->out); - } - return USB_REQUEST_STATUS_OK; -} - -usb_request_status_t usb_vendor_request_read_supported_platform( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage) { - if (stage == USB_TRANSFER_STAGE_SETUP) { - uint32_t platform = supported_platform(); - endpoint->buffer[0] = (platform >> 24) & 0xff; - endpoint->buffer[1] = (platform >> 16) & 0xff; - endpoint->buffer[2] = (platform >> 8) & 0xff; - endpoint->buffer[3] = platform & 0xff; - usb_transfer_schedule_block( - endpoint->in, - &endpoint->buffer, - 4, - NULL, - NULL); - usb_transfer_schedule_ack(endpoint->out); - } - return USB_REQUEST_STATUS_OK; -} diff --git a/hackrf-portapack/usb_api_board_info.h b/hackrf-portapack/usb_api_board_info.h deleted file mode 100644 index 663d25d8..00000000 --- a/hackrf-portapack/usb_api_board_info.h +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2012-2022 Great Scott Gadgets - * Copyright 2012 Jared Boone - * Copyright 2013 Benjamin Vernoux - * - * This file is part of 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. - */ - -#ifndef __USB_API_BOARD_INFO_H__ -#define __USB_API_BOARD_INFO_H__ - -#include - -#include -#include - -typedef struct { - uint32_t part_id[2]; - uint32_t serial_no[4]; -} read_partid_serialno_t; - -usb_request_status_t usb_vendor_request_read_board_id( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage); -usb_request_status_t usb_vendor_request_read_version_string( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage); -usb_request_status_t usb_vendor_request_read_partid_serialno( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage); -usb_request_status_t usb_vendor_request_reset( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage); -usb_request_status_t usb_vendor_request_read_board_rev( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage); -usb_request_status_t usb_vendor_request_read_supported_platform( - usb_endpoint_t* const endpoint, - const usb_transfer_stage_t stage); - -#endif /* end of include guard: __USB_API_BOARD_INFO_H__ */ diff --git a/hardware/portapack_h4m/Audio_Schematic.pdf b/hardware/portapack_h4m/Audio_Schematic.pdf new file mode 100644 index 00000000..9adea252 Binary files /dev/null and b/hardware/portapack_h4m/Audio_Schematic.pdf differ diff --git a/hardware/portapack_h4m/CPLD/.gitignore b/hardware/portapack_h4m/CPLD/.gitignore new file mode 100644 index 00000000..8399f17b --- /dev/null +++ b/hardware/portapack_h4m/CPLD/.gitignore @@ -0,0 +1,14 @@ +**/*.qws +**/*.chg +**/smart.log +**/db/ +**/incremental_db/ +**/output_files/*.done +**/output_files/*.smsg +**/output_files/*.summary +**/output_files/*.jdi +**/output_files/*.pin +**/output_files/*.pof +**/output_files/*.rpt +**/output_files/*.sld +**/simulation/ diff --git a/hardware/portapack_h4m/CPLD/AG256SL100/Makefile b/hardware/portapack_h4m/CPLD/AG256SL100/Makefile new file mode 100644 index 00000000..749e23b3 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/AG256SL100/Makefile @@ -0,0 +1,109 @@ +# +# Copyright (C) 2017 Jared Boone, ShareBrained Technology, Inc. +# Copyright (C) 2024 jLynx.net https://github.com/jLynx +# +# 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. + +# Makefile based on Altera Quartus documentation example, topic +# "About Using Quartus II from the Command Line" + +################################################################### +# Project Configuration: +# +# Specify the name of the design (project) and Quartus II Settings +# File (.qsf) and the list of source files used. +################################################################### + +PROJECT=portapack_h4m_cpld +SOURCE_FILES=top.vhd +ASSIGNMENT_FILES=$(PROJECT).qpf $(PROJECT).qsf $(PROJECT).sdc +OUTPUT_DIR=output_files + +################################################################### +# Main Targets +# +# all: build everything +# clean: remove output files and database +################################################################### + +all: smart.log $(OUTPUT_DIR)/$(PROJECT).asm.rpt $(OUTPUT_DIR)/$(PROJECT).sta.rpt + +clean: + rm -rf *.chg *.qws smart.log db/ incremental_db/ $(OUTPUT_DIR)/ + +map: smart.log $(OUTPUT_DIR)/$(PROJECT).map.rpt + +fit: smart.log $(OUTPUT_DIR)/$(PROJECT).fit.rpt + +asm: smart.log $(OUTPUT_DIR)/$(PROJECT).asm.rpt + +sta: smart.log $(OUTPUT_DIR)/$(PROJECT).sta.rpt + +smart: smart.log + +################################################################### +# Executable Configuration +################################################################### + +MAP_ARGS= +FIT_ARGS= +ASM_ARGS= +STA_ARGS= + +################################################################### +# Target implementations +################################################################### + +STAMP = echo done > + +$(OUTPUT_DIR)/$(PROJECT).map.rpt: $(SOURCE_FILES) + quartus_map $(MAP_ARGS) $(PROJECT) + $(STAMP) fit.chg + +$(OUTPUT_DIR)/$(PROJECT).fit.rpt: fit.chg $(OUTPUT_DIR)/$(PROJECT).map.rpt + quartus_fit $(FIT_ARGS) $(PROJECT) + $(STAMP) asm.chg + $(STAMP) sta.chg + +$(OUTPUT_DIR)/$(PROJECT).asm.rpt: asm.chg $(OUTPUT_DIR)/$(PROJECT).fit.rpt + quartus_asm $(ASM_ARGS) $(PROJECT) + +$(OUTPUT_DIR)/$(PROJECT).sta.rpt: sta.chg $(OUTPUT_DIR)/$(PROJECT).fit.rpt + quartus_sta $(STA_ARGS) $(PROJECT) + +smart.log: $(ASSIGNMENT_FILES) $(OUTPUT_DIR) + quartus_sh --determine_smart_action $(PROJECT) > smart.log + +################################################################### +# Project initialization +################################################################### + +$(OUTPUT_DIR): + mkdir $(OUTPUT_DIR) + +$(ASSIGNMENT_FILES): $(OUTPUT_DIR) + quartus_sh --prepare $(PROJECT) + +fit.chg: + $(STAMP) fit.chg + +sta.chg: + $(STAMP) sta.chg + +asm.chg: + $(STAMP) asm.chg diff --git a/hardware/portapack_h4m/CPLD/AG256SL100/output_files/portapack_h4m_cpld.svf b/hardware/portapack_h4m/CPLD/AG256SL100/output_files/portapack_h4m_cpld.svf new file mode 100644 index 00000000..f61e6a6e --- /dev/null +++ b/hardware/portapack_h4m/CPLD/AG256SL100/output_files/portapack_h4m_cpld.svf @@ -0,0 +1,11651 @@ +!Copyright (C) 2023 Intel Corporation. All rights reserved. +!Your use of Intel Corporation's design tools, logic functions +!and other software and tools, and any 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 Intel Program License +!Subscription Agreement, the Intel Quartus Prime License Agreement, +!the Intel FPGA IP License Agreement, or other applicable license +!agreement, including, without limitation, that your use is for +!the sole purpose of programming logic devices manufactured by +!Intel and sold by Intel or its authorized distributors. Please +!refer to the applicable agreement for further details, at +!https://fpgasoftware.intel.com/eula. +! +!Quartus Prime SVF converter 22.1 +! +!Device #1: EPM240 - A:/Users/jLynx/Documents/Code/C/portapack-mayhem/hardware/portapack_h4m/CPLD/AG256SL100/output_files/portapack_h4m_cpld.pof Sun Nov 3 11:15:25 2024 +! +!NOTE "USERCODE" "0018A481"; +! +!NOTE "CHECKSUM" "0018A981"; +! +! +! +FREQUENCY 1.80E+07 HZ; +! +! +! +TRST ABSENT; +ENDDR IDLE; +ENDIR IRPAUSE; +STATE IDLE; +SIR 10 TDI (005); +RUNTEST IDLE 93 TCK ENDSTATE IDLE; +SDR 240 TDI (FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); +SIR 10 TDI (3FF); +RUNTEST 18003 TCK; +SIR 10 TDI (2CC); +RUNTEST 18003 TCK; +! +! +! +!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 (0C2C); +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 (F9FF); +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 (7EFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBF7); +RUNTEST 1800 TCK; +SDR 16 TDI (BBF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7F3E); +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 (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 (FFFE); +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 (F7FE); +RUNTEST 1800 TCK; +SDR 16 TDI (6FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDD); +RUNTEST 1800 TCK; +SDR 16 TDI (FBF9); +RUNTEST 1800 TCK; +SDR 16 TDI (733F); +RUNTEST 1800 TCK; +SDR 16 TDI (FF19); +RUNTEST 1800 TCK; +SDR 16 TDI (B33F); +RUNTEST 1800 TCK; +SDR 16 TDI (CCCF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (999F); +RUNTEST 1800 TCK; +SDR 16 TDI (BCCC); +RUNTEST 1800 TCK; +SDR 16 TDI (CFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6EBF); +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 (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 (FEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF3); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F6FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFF); +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 (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 (BFDB); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +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 (FFEF); +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 (7FFF); +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 (FE6F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (5FF6); +RUNTEST 1800 TCK; +SDR 16 TDI (7FB7); +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 (BFFD); +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 (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 (FDBF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FCF); +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 (FFEF); +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 (67FA); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +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 (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BF7F); +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 (BFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +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 (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (EEFF); +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 (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BCFF); +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 (FFFF); +RUNTEST 1800 TCK; +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 (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 (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +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 (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 (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 (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 (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 (FFDF); +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 (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 (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 (A65F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (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 (FFEB); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (A65F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (AFFF); +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 (FFF5); +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 (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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBAF); +RUNTEST 1800 TCK; +SDR 16 TDI (CFFF); +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 (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BAFF); +RUNTEST 1800 TCK; +SDR 16 TDI (CFFF); +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 (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 (67FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFAF); +RUNTEST 1800 TCK; +SDR 16 TDI (CFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (CFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFB7); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BAF7); +RUNTEST 1800 TCK; +SDR 16 TDI (3B33); +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 (99E8); +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 (7377); +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 (DDBF); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFE7); +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 (FFED); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +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 (AFFF); +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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (BFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +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 (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 (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 (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 (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 (FFFA); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFF7); +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 (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 (BFFD); +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFF); +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 (BFFF); +RUNTEST 1800 TCK; +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 (DEF7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +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 (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 (FFFD); +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 (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BDF); +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 (BFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FB7F); +RUNTEST 1800 TCK; +SDR 16 TDI (BF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (DBFD); +RUNTEST 1800 TCK; +SDR 16 TDI (B3FF); +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 (FFCF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBF); +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 (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BCBF); +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 (BFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FD7E); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +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 (FFDE); +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 (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 (BFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFD); +RUNTEST 1800 TCK; +SDR 16 TDI (B5FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FCFF); +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 (FFD7); +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 (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +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 (7FFB); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFF); +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 (FFEA); +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 (6FFF); +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 (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFD); +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 (77FF); +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 (7F7F); +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 (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 (FFFE); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B5FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEB); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (77F7); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FD7B); +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 (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 (FFF5); +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 (FFFF); +RUNTEST 1800 TCK; +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 (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 (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 (7EFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (BFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +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 (FBFC); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (FE3F); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF6); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (7CFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEC); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +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 (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF9); +RUNTEST 1800 TCK; +SDR 16 TDI (A5FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FCFB); +RUNTEST 1800 TCK; +SDR 16 TDI (73FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +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 (FFBC); +RUNTEST 1800 TCK; +SDR 16 TDI (67DF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFC3); +RUNTEST 1800 TCK; +SDR 16 TDI (C3EF); +RUNTEST 1800 TCK; +SDR 16 TDI (67E6); +RUNTEST 1800 TCK; +SDR 16 TDI (1FFA); +RUNTEST 1800 TCK; +SDR 16 TDI (ABFF); +RUNTEST 1800 TCK; +SDR 16 TDI (79FB); +RUNTEST 1800 TCK; +SDR 16 TDI (73FF); +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 (67FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFAF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFBC); +RUNTEST 1800 TCK; +SDR 16 TDI (67FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFC3); +RUNTEST 1800 TCK; +SDR 16 TDI (C3FF); +RUNTEST 1800 TCK; +SDR 16 TDI (67E6); +RUNTEST 1800 TCK; +SDR 16 TDI (1FFA); +RUNTEST 1800 TCK; +SDR 16 TDI (B9FE); +RUNTEST 1800 TCK; +SDR 16 TDI (F9FB); +RUNTEST 1800 TCK; +SDR 16 TDI (73FF); +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 (BAFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FD3C); +RUNTEST 1800 TCK; +SDR 16 TDI (67FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE5); +RUNTEST 1800 TCK; +SDR 16 TDI (BFC3); +RUNTEST 1800 TCK; +SDR 16 TDI (C3FF); +RUNTEST 1800 TCK; +SDR 16 TDI (67E6); +RUNTEST 1800 TCK; +SDR 16 TDI (1FF9); +RUNTEST 1800 TCK; +SDR 16 TDI (B9FF); +RUNTEST 1800 TCK; +SDR 16 TDI (F9F9); +RUNTEST 1800 TCK; +SDR 16 TDI (63FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF3); +RUNTEST 1800 TCK; +SDR 16 TDI (6BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7F7); +RUNTEST 1800 TCK; +SDR 16 TDI (FD3C); +RUNTEST 1800 TCK; +SDR 16 TDI (67FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE5); +RUNTEST 1800 TCK; +SDR 16 TDI (BFC3); +RUNTEST 1800 TCK; +SDR 16 TDI (C3FF); +RUNTEST 1800 TCK; +SDR 16 TDI (67E6); +RUNTEST 1800 TCK; +SDR 16 TDI (1FF3); +RUNTEST 1800 TCK; +SDR 16 TDI (B9FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FB79); +RUNTEST 1800 TCK; +SDR 16 TDI (66FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BA8F); +RUNTEST 1800 TCK; +SDR 16 TDI (3133); +RUNTEST 1800 TCK; +SDR 16 TDI (73E6); +RUNTEST 1800 TCK; +SDR 16 TDI (6665); +RUNTEST 1800 TCK; +SDR 16 TDI (B33B); +RUNTEST 1800 TCK; +SDR 16 TDI (3973); +RUNTEST 1800 TCK; +SDR 16 TDI (6E66); +RUNTEST 1800 TCK; +SDR 16 TDI (FCCC); +RUNTEST 1800 TCK; +SDR 16 TDI (B98F); +RUNTEST 1800 TCK; +SDR 16 TDI (989B); +RUNTEST 1800 TCK; +SDR 16 TDI (63CC); +RUNTEST 1800 TCK; +SDR 16 TDI (CCC7); +RUNTEST 1800 TCK; +SDR 16 TDI (B999); +RUNTEST 1800 TCK; +SDR 16 TDI (99CA); +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 (7637); +RUNTEST 1800 TCK; +SDR 16 TDI (6557); +RUNTEST 1800 TCK; +SDR 16 TDI (7763); +RUNTEST 1800 TCK; +SDR 16 TDI (B773); +RUNTEST 1800 TCK; +SDR 16 TDI (72AB); +RUNTEST 1800 TCK; +SDR 16 TDI (6766); +RUNTEST 1800 TCK; +SDR 16 TDI (7DD9); +RUNTEST 1800 TCK; +SDR 16 TDI (B3B5); +RUNTEST 1800 TCK; +SDR 16 TDI (5DD8); +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 (DDDF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFEB); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFEF); +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6FFF); +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 (7FFA); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (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 (FFDD); +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 (FBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +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 (BFFB); +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 (FFED); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBF); +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 (BBFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +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 (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 (FFAF); +RUNTEST 1800 TCK; +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 (DFFF); +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 (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (EFFF); +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 (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFD); +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 (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7F77); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +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 (7FFF); +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 (BEFA); +RUNTEST 1800 TCK; +SDR 16 TDI (F9FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +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 (FBFF); +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 (AAFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +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 (BFFF); +RUNTEST 1800 TCK; +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F6FF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBEF); +RUNTEST 1800 TCK; +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 (F7FF); +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 (DFFF); +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 (FD7F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEF7); +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 (FFEF); +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 (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFF7); +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 (BFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDBF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (E7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (BF5D); +RUNTEST 1800 TCK; +SDR 16 TDI (DBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +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 (BFFB); +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 (BBFE); +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 (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 (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFB7); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (DB7F); +RUNTEST 1800 TCK; +SDR 16 TDI (BEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B5FD); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +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 (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDCD); +RUNTEST 1800 TCK; +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 (FF3F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (D8DF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBB2); +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 (FDFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (BE4D); +RUNTEST 1800 TCK; +SDR 16 TDI (7DEA); +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 (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFBB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFAF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (ABFF); +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 (FFF3); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE1); +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 (BE1F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FF9); +RUNTEST 1800 TCK; +SDR 16 TDI (70FF); +RUNTEST 1800 TCK; +SDR 16 TDI (E0EF); +RUNTEST 1800 TCK; +SDR 16 TDI (B027); +RUNTEST 1800 TCK; +SDR 16 TDI (3BF5); +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 (FF33); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE1); +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 (BE1F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF9); +RUNTEST 1800 TCK; +SDR 16 TDI (70FF); +RUNTEST 1800 TCK; +SDR 16 TDI (E4EF); +RUNTEST 1800 TCK; +SDR 16 TDI (A8B9); +RUNTEST 1800 TCK; +SDR 16 TDI (3BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B5AF); +RUNTEST 1800 TCK; +SDR 16 TDI (FCF3); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE1); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BE1F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF9); +RUNTEST 1800 TCK; +SDR 16 TDI (70FF); +RUNTEST 1800 TCK; +SDR 16 TDI (1F4F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFCF); +RUNTEST 1800 TCK; +SDR 16 TDI (9475); +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 (FC33); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE1); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BE1F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF9); +RUNTEST 1800 TCK; +SDR 16 TDI (70FF); +RUNTEST 1800 TCK; +SDR 16 TDI (174F); +RUNTEST 1800 TCK; +SDR 16 TDI (BEC8); +RUNTEST 1800 TCK; +SDR 16 TDI (1477); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BABF); +RUNTEST 1800 TCK; +SDR 16 TDI (31B3); +RUNTEST 1800 TCK; +SDR 16 TDI (62E6); +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 (B9CB); +RUNTEST 1800 TCK; +SDR 16 TDI (999B); +RUNTEST 1800 TCK; +SDR 16 TDI (73CC); +RUNTEST 1800 TCK; +SDR 16 TDI (6C67); +RUNTEST 1800 TCK; +SDR 16 TDI (B998); +RUNTEST 1800 TCK; +SDR 16 TDI (B37A); +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 (7633); +RUNTEST 1800 TCK; +SDR 16 TDI (6D57); +RUNTEST 1800 TCK; +SDR 16 TDI (7767); +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 (BB95); +RUNTEST 1800 TCK; +SDR 16 TDI (5DD9); +RUNTEST 1800 TCK; +SDR 16 TDI (73DD); +RUNTEST 1800 TCK; +SDR 16 TDI (C9CA); +RUNTEST 1800 TCK; +SDR 16 TDI (B4CD); +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 (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +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 (BEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7EFF); +RUNTEST 1800 TCK; +SDR 16 TDI (6F6F); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (B36F); +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 (FFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFE); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFEF); +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 (BFF7); +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFB); +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 (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDD); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +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 (FFFA); +RUNTEST 1800 TCK; +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 (7BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FEF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BDFF); +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 (BBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFE); +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 (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7DF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFDF); +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 (F7FF); +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 (FFAF); +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 (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 (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 (FFCF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +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 (F7EB); +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 (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 (FDFF); +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 (7FBF); +RUNTEST 1800 TCK; +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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFD7); +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 (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (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 (EF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF6F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +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 (DFFF); +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 (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 (7BFF); +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FF6F); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FEEF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF7); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (6BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFAF); +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 (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 (DFFF); +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 (B9AF); +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 (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FDDF); +RUNTEST 1800 TCK; +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 (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 (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +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 (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 (FFEE); +RUNTEST 1800 TCK; +SDR 16 TDI (79FF); +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 (BFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (DFFF); +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (BFFF); +RUNTEST 1800 TCK; +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 (BFFB); +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 (B5FF); +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 (BFFF); +RUNTEST 1800 TCK; +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 (DDDF); +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 (FFEA); +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 (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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFE); +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 (BFAC); +RUNTEST 1800 TCK; +SDR 16 TDI (3C3F); +RUNTEST 1800 TCK; +SDR 16 TDI (7DDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE1); +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 (FFFC); +RUNTEST 1800 TCK; +SDR 16 TDI (BE1F); +RUNTEST 1800 TCK; +SDR 16 TDI (0781); +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 (BDAC); +RUNTEST 1800 TCK; +SDR 16 TDI (3C3F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE1); +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 (FFFC); +RUNTEST 1800 TCK; +SDR 16 TDI (BE1B); +RUNTEST 1800 TCK; +SDR 16 TDI (8781); +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBFC); +RUNTEST 1800 TCK; +SDR 16 TDI (3C3F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE1); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFC); +RUNTEST 1800 TCK; +SDR 16 TDI (BE0F); +RUNTEST 1800 TCK; +SDR 16 TDI (E001); +RUNTEST 1800 TCK; +SDR 16 TDI (70FF); +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 (BBFC); +RUNTEST 1800 TCK; +SDR 16 TDI (3C3F); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFE1); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFC); +RUNTEST 1800 TCK; +SDR 16 TDI (BE1F); +RUNTEST 1800 TCK; +SDR 16 TDI (E001); +RUNTEST 1800 TCK; +SDR 16 TDI (70FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BAA7); +RUNTEST 1800 TCK; +SDR 16 TDI (B3B3); +RUNTEST 1800 TCK; +SDR 16 TDI (63E6); +RUNTEST 1800 TCK; +SDR 16 TDI (666F); +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 (B99F); +RUNTEST 1800 TCK; +SDR 16 TDI (8B9B); +RUNTEST 1800 TCK; +SDR 16 TDI (71CC); +RUNTEST 1800 TCK; +SDR 16 TDI (CCC7); +RUNTEST 1800 TCK; +SDR 16 TDI (B999); +RUNTEST 1800 TCK; +SDR 16 TDI (99EE); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (3737); +RUNTEST 1800 TCK; +SDR 16 TDI (6D57); +RUNTEST 1800 TCK; +SDR 16 TDI (7767); +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 (7DDC); +RUNTEST 1800 TCK; +SDR 16 TDI (BB95); +RUNTEST 1800 TCK; +SDR 16 TDI (5999); +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 (BFF9); +RUNTEST 1800 TCK; +SDR 16 TDI (FDFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FDF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFD); +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 (BEFF); +RUNTEST 1800 TCK; +SDR 16 TDI (3FF7); +RUNTEST 1800 TCK; +SDR 16 TDI (77FF); +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 (AFEF); +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 (7FFD); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F5FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEFF); +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 (BDF6); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (EFEF); +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 (BFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BF7F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (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 (FDFF); +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 (F7EF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BBBB); +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 (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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (FFBF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFD); +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 (7DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFB); +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 (BEDB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (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 (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 (7FFF); +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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B9AF); +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 (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (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 (FFEA); +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 (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 (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 (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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +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 (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 (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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (B56C); +RUNTEST 1800 TCK; +SDR 16 TDI (3FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7DDF); +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 (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 (FFF4); +RUNTEST 1800 TCK; +SDR 16 TDI (79FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFC); +RUNTEST 1800 TCK; +SDR 16 TDI (3FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFDF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +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 (6DFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (B66C); +RUNTEST 1800 TCK; +SDR 16 TDI (3FFF); +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 (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (5BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFC); +RUNTEST 1800 TCK; +SDR 16 TDI (3FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +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 (6FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BEAF); +RUNTEST 1800 TCK; +SDR 16 TDI (B333); +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 (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 (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (3777); +RUNTEST 1800 TCK; +SDR 16 TDI (6D57); +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 (9FFD); +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 (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 (7FFF); +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 (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FBF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (8FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +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 (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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +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 (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5F7F); +RUNTEST 1800 TCK; +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 (5FFF); +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 (5FFF); +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 (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 (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 (5FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (EFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (8FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (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 (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 (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 (FFFD); +RUNTEST 1800 TCK; +SDR 16 TDI (79FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (AAAF); +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 (FFFB); +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 (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 (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 (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 (9BBF); +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 (FFEA); +RUNTEST 1800 TCK; +SDR 16 TDI (57FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (A65F); +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 (9FFF); +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 (AEFF); +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 (9FFF); +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 (975F); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (FFF5); +RUNTEST 1800 TCK; +SDR 16 TDI (6BFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFB); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (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 (9333); +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 (9FFF); +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 (9777); +RUNTEST 1800 TCK; +SDR 16 TDI (74AB); +RUNTEST 1800 TCK; +SDR 16 TDI (5777); +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 (9FF7); +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 (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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (BFFF); +RUNTEST 1800 TCK; +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 (7FFF); +RUNTEST 1800 TCK; +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 (9FFF); +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 (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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +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 (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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (EFFF); +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 (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 (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 (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 (5FFF); +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 (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 (B7FF); +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 (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 (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (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 (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 (BF7F); +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 (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 (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 (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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FBFF); +RUNTEST 1800 TCK; +SDR 16 TDI (5FFF); +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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (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 (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 (FE7E); +RUNTEST 1800 TCK; +SDR 16 TDI (6FF3); +RUNTEST 1800 TCK; +SDR 16 TDI (3FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (9FE6); +RUNTEST 1800 TCK; +SDR 16 TDI (67F9); +RUNTEST 1800 TCK; +SDR 16 TDI (53FF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFF9); +RUNTEST 1800 TCK; +SDR 16 TDI (93FF); +RUNTEST 1800 TCK; +SDR 16 TDI (F7FF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (999F); +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 (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 (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 (9FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F9FF); +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 (7CF9); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (F3E7); +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 (9CFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +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 (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 (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (BFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (FFFF); +RUNTEST 1800 TCK; +SDR 16 TDI (7FFF); +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 (F9FF); +SDR 16 TDI (FFFF) TDO (79FF); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (AF9E); +SDR 16 TDI (FFFF) TDO (7EFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBF7); +SDR 16 TDI (FFFF) TDO (BBF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7F3E); +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 (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 (FFFE); +SDR 16 TDI (FFFF) TDO (67FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FE); +SDR 16 TDI (FFFF) TDO (6FEF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (BFDD); +SDR 16 TDI (FFFF) TDO (FBF9); +SDR 16 TDI (FFFF) TDO (733F); +SDR 16 TDI (FFFF) TDO (FF19); +SDR 16 TDI (FFFF) TDO (B33F); +SDR 16 TDI (FFFF) TDO (CCCF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (999F); +SDR 16 TDI (FFFF) TDO (BCCC); +SDR 16 TDI (FFFF) TDO (CFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FEEF); +SDR 16 TDI (FFFF) TDO (7FFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFF7); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (6EBF); +SDR 16 TDI (FFFF) TDO (EFFF); +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 (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 (7FF3); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F6FF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FEFF); +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 (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 (BFDB); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (6FFF); +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 (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (7FFF); +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 (FE6F); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFF7); +SDR 16 TDI (FFFF) TDO (5FF6); +SDR 16 TDI (FFFF) TDO (7FB7); +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 (BFFD); +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 (FFFE); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FDBF); +SDR 16 TDI (FFFF) TDO (7FEF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FCF); +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 (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (67FA); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (FFFF); +SDR 16 TDI (FFFF) TDO (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 (EFFF); +SDR 16 TDI (FFFF) TDO (BF7F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FEFF); +SDR 16 TDI (FFFF) TDO (BFFB); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (6FFE); +SDR 16 TDI (FFFF) TDO (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 (EEFF); +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 (B7FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (6FEF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (BCFF); +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 (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 (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 (EFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (BBFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +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 (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 (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 (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 (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 (FFDF); +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 (BFFF); +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 (A65F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (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 (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 (FFEB); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (A65F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (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 (AFFF); +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 (FFF5); +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 (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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (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 (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBAF); +SDR 16 TDI (FFFF) TDO (CFFF); +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 (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BAFF); +SDR 16 TDI (FFFF) TDO (CFFF); +SDR 16 TDI (FFFF) TDO (7EFF); +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 (67FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFAF); +SDR 16 TDI (FFFF) TDO (CFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (CFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFB7); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BAF7); +SDR 16 TDI (FFFF) TDO (3B33); +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 (99E8); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7377); +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 (DDBF); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFE7); +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 (FFED); +SDR 16 TDI (FFFF) TDO (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 (AFFF); +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 (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (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 (FFFB); +SDR 16 TDI (FFFF) TDO (BFEF); +SDR 16 TDI (FFFF) TDO (EFFF); +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 (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 (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 (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 (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 (FFFA); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DFF7); +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 (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 (BFFD); +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 (7FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (BBFF); +SDR 16 TDI (FFFF) TDO (FFFF); +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 (FFFF); +SDR 16 TDI (FFFF) TDO (BDFD); +SDR 16 TDI (FFFF) TDO (DEF7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFB); +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 (FFF5); +SDR 16 TDI (FFFF) TDO (6BFF); +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 (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 (BDFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7BDF); +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 (BFEF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FB7F); +SDR 16 TDI (FFFF) TDO (BF7F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (DBFD); +SDR 16 TDI (FFFF) TDO (B3FF); +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 (FFCF); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFBF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (BCBF); +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 (BFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FEF); +SDR 16 TDI (FFFF) TDO (FD7E); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (7FF7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDE); +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 (BF7F); +SDR 16 TDI (FFFF) TDO (FFF7); +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 (BBFD); +SDR 16 TDI (FFFF) TDO (B5FF); +SDR 16 TDI (FFFF) TDO (FCFF); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFD7); +SDR 16 TDI (FFFF) TDO (6FFF); +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 (FFF7); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFB); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (FEFF); +SDR 16 TDI (FFFF) TDO (7DFF); +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 (B6AF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (6FFF); +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 (FFFD); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (FDFD); +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 (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFAF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7F7F); +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 (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 (FFFE); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B5FF); +SDR 16 TDI (FFFF) TDO (FEFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFEB); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (77F7); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FD7B); +SDR 16 TDI (FFFF) TDO (7EFF); +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 (FFF5); +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 (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 (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 (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 (7EFF); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (BFF7); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FBFC); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (FE3F); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (6FEF); +SDR 16 TDI (FFFF) TDO (FFF6); +SDR 16 TDI (FFFF) TDO (BBFF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (7CFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEC); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFF9); +SDR 16 TDI (FFFF) TDO (A5FF); +SDR 16 TDI (FFFF) TDO (FCFB); +SDR 16 TDI (FFFF) TDO (73FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7AF); +SDR 16 TDI (FFFF) TDO (FFBC); +SDR 16 TDI (FFFF) TDO (67DF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (BFC3); +SDR 16 TDI (FFFF) TDO (C3EF); +SDR 16 TDI (FFFF) TDO (67E6); +SDR 16 TDI (FFFF) TDO (1FFA); +SDR 16 TDI (FFFF) TDO (ABFF); +SDR 16 TDI (FFFF) TDO (79FB); +SDR 16 TDI (FFFF) TDO (73FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (67FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFAF); +SDR 16 TDI (FFFF) TDO (FFBC); +SDR 16 TDI (FFFF) TDO (67FF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (BFC3); +SDR 16 TDI (FFFF) TDO (C3FF); +SDR 16 TDI (FFFF) TDO (67E6); +SDR 16 TDI (FFFF) TDO (1FFA); +SDR 16 TDI (FFFF) TDO (B9FE); +SDR 16 TDI (FFFF) TDO (F9FB); +SDR 16 TDI (FFFF) TDO (73FF); +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 (BAFF); +SDR 16 TDI (FFFF) TDO (FD3C); +SDR 16 TDI (FFFF) TDO (67FF); +SDR 16 TDI (FFFF) TDO (FFE5); +SDR 16 TDI (FFFF) TDO (BFC3); +SDR 16 TDI (FFFF) TDO (C3FF); +SDR 16 TDI (FFFF) TDO (67E6); +SDR 16 TDI (FFFF) TDO (1FF9); +SDR 16 TDI (FFFF) TDO (B9FF); +SDR 16 TDI (FFFF) TDO (F9F9); +SDR 16 TDI (FFFF) TDO (63FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF3); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7F7); +SDR 16 TDI (FFFF) TDO (FD3C); +SDR 16 TDI (FFFF) TDO (67FF); +SDR 16 TDI (FFFF) TDO (FFE5); +SDR 16 TDI (FFFF) TDO (BFC3); +SDR 16 TDI (FFFF) TDO (C3FF); +SDR 16 TDI (FFFF) TDO (67E6); +SDR 16 TDI (FFFF) TDO (1FF3); +SDR 16 TDI (FFFF) TDO (B9FF); +SDR 16 TDI (FFFF) TDO (FB79); +SDR 16 TDI (FFFF) TDO (66FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BA8F); +SDR 16 TDI (FFFF) TDO (3133); +SDR 16 TDI (FFFF) TDO (73E6); +SDR 16 TDI (FFFF) TDO (6665); +SDR 16 TDI (FFFF) TDO (B33B); +SDR 16 TDI (FFFF) TDO (3973); +SDR 16 TDI (FFFF) TDO (6E66); +SDR 16 TDI (FFFF) TDO (FCCC); +SDR 16 TDI (FFFF) TDO (B98F); +SDR 16 TDI (FFFF) TDO (989B); +SDR 16 TDI (FFFF) TDO (63CC); +SDR 16 TDI (FFFF) TDO (CCC7); +SDR 16 TDI (FFFF) TDO (B999); +SDR 16 TDI (FFFF) TDO (99CA); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBFF); +SDR 16 TDI (FFFF) TDO (7637); +SDR 16 TDI (FFFF) TDO (6557); +SDR 16 TDI (FFFF) TDO (7763); +SDR 16 TDI (FFFF) TDO (B773); +SDR 16 TDI (FFFF) TDO (72AB); +SDR 16 TDI (FFFF) TDO (6766); +SDR 16 TDI (FFFF) TDO (7DD9); +SDR 16 TDI (FFFF) TDO (B3B5); +SDR 16 TDI (FFFF) TDO (5DD8); +SDR 16 TDI (FFFF) TDO (79DD); +SDR 16 TDI (FFFF) TDO (DDD2); +SDR 16 TDI (FFFF) TDO (B5DD); +SDR 16 TDI (FFFF) TDO (DDDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFEB); +SDR 16 TDI (FFFF) TDO (FDFD); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFFD); +SDR 16 TDI (FFFF) TDO (BFDF); +SDR 16 TDI (FFFF) TDO (DFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (6FFF); +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 (7FFA); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (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 (7FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +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 (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 (FFDD); +SDR 16 TDI (FFFF) TDO (BFBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (BEEF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (BFFB); +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 (FFED); +SDR 16 TDI (FFFF) TDO (BFBF); +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 (BBFB); +SDR 16 TDI (FFFF) TDO (FFFE); +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 (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 (FFAF); +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 (DFFF); +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 (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FBB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (EFFF); +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 (BDFF); +SDR 16 TDI (FFFF) TDO (DEFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (FFFF); +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 (7F77); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFF7); +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 (7FFF); +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 (BEFA); +SDR 16 TDI (FFFF) TDO (F9FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (AAFF); +SDR 16 TDI (FFFF) TDO (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 (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 (7FFF); +SDR 16 TDI (FFFF) TDO (F6FF); +SDR 16 TDI (FFFF) TDO (BBEF); +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 (F7FF); +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 (DFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FD7F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEF7); +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 (FFEF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (BFF7); +SDR 16 TDI (FFFF) TDO (D7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFBF); +SDR 16 TDI (FFFF) TDO (FDBF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (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 (7BFF); +SDR 16 TDI (FFFF) TDO (E7FF); +SDR 16 TDI (FFFF) TDO (BF5D); +SDR 16 TDI (FFFF) TDO (DBFF); +SDR 16 TDI (FFFF) TDO (7BFF); +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 (BFFB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FEDF); +SDR 16 TDI (FFFF) TDO (BBFE); +SDR 16 TDI (FFFF) TDO (FFFB); +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 (BFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FF7F); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (FFB7); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (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 (DB7F); +SDR 16 TDI (FFFF) TDO (BEFF); +SDR 16 TDI (FFFF) TDO (B5FD); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (BFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +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 (FDFF); +SDR 16 TDI (FFFF) TDO (BDCD); +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 (FF3F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (D8DF); +SDR 16 TDI (FFFF) TDO (BBB2); +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 (FDFB); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +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 (BE4D); +SDR 16 TDI (FFFF) TDO (7DEA); +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 (FFF7); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFBB); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (7BFF); +SDR 16 TDI (FFFF) TDO (AFAF); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (ABFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B6AF); +SDR 16 TDI (FFFF) TDO (FFF3); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFE1); +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 (BE1F); +SDR 16 TDI (FFFF) TDO (7FF9); +SDR 16 TDI (FFFF) TDO (70FF); +SDR 16 TDI (FFFF) TDO (E0EF); +SDR 16 TDI (FFFF) TDO (B027); +SDR 16 TDI (FFFF) TDO (3BF5); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FF33); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFE1); +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 (BE1F); +SDR 16 TDI (FFFF) TDO (FFF9); +SDR 16 TDI (FFFF) TDO (70FF); +SDR 16 TDI (FFFF) TDO (E4EF); +SDR 16 TDI (FFFF) TDO (A8B9); +SDR 16 TDI (FFFF) TDO (3BFF); +SDR 16 TDI (FFFF) TDO (7DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B5AF); +SDR 16 TDI (FFFF) TDO (FCF3); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFE1); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BE1F); +SDR 16 TDI (FFFF) TDO (FFF9); +SDR 16 TDI (FFFF) TDO (70FF); +SDR 16 TDI (FFFF) TDO (1F4F); +SDR 16 TDI (FFFF) TDO (BFCF); +SDR 16 TDI (FFFF) TDO (9475); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBFF); +SDR 16 TDI (FFFF) TDO (FC33); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFE1); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BE1F); +SDR 16 TDI (FFFF) TDO (FFF9); +SDR 16 TDI (FFFF) TDO (70FF); +SDR 16 TDI (FFFF) TDO (174F); +SDR 16 TDI (FFFF) TDO (BEC8); +SDR 16 TDI (FFFF) TDO (1477); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BABF); +SDR 16 TDI (FFFF) TDO (31B3); +SDR 16 TDI (FFFF) TDO (62E6); +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 (B9CB); +SDR 16 TDI (FFFF) TDO (999B); +SDR 16 TDI (FFFF) TDO (73CC); +SDR 16 TDI (FFFF) TDO (6C67); +SDR 16 TDI (FFFF) TDO (B998); +SDR 16 TDI (FFFF) TDO (B37A); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (7633); +SDR 16 TDI (FFFF) TDO (6D57); +SDR 16 TDI (FFFF) TDO (7767); +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 (BB95); +SDR 16 TDI (FFFF) TDO (5DD9); +SDR 16 TDI (FFFF) TDO (73DD); +SDR 16 TDI (FFFF) TDO (C9CA); +SDR 16 TDI (FFFF) TDO (B4CD); +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 (FDFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFFD); +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 (BEFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7EFF); +SDR 16 TDI (FFFF) TDO (6F6F); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (B36F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFD); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (7FFE); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (DFFF); +SDR 16 TDI (FFFF) TDO (7DBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AFFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FEF); +SDR 16 TDI (FFFF) TDO (FFEF); +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 (BFF7); +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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFB); +SDR 16 TDI (FFFF) TDO (BEBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (BFDD); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFE); +SDR 16 TDI (FFFF) TDO (FFFA); +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 (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BF7F); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FEF); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (BDFF); +SDR 16 TDI (FFFF) TDO (FDFF); +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 (7FFE); +SDR 16 TDI (FFFF) TDO (FBFF); +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 (B7DF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (BFDB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBFB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (EFDF); +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 (F7FF); +SDR 16 TDI (FFFF) TDO (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFAF); +SDR 16 TDI (FFFF) TDO (77FF); +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 (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 (FFCF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BF5F); +SDR 16 TDI (FFFF) TDO (F7EB); +SDR 16 TDI (FFFF) TDO (77FF); +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 (FDFF); +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 (7FBF); +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 (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFD7); +SDR 16 TDI (FFFF) TDO (FFFF); +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 (FFEF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (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 (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 (EF7F); +SDR 16 TDI (FFFF) TDO (BFDF); +SDR 16 TDI (FFFF) TDO (FF6F); +SDR 16 TDI (FFFF) TDO (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 (BFF7); +SDR 16 TDI (FFFF) TDO (DFFF); +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 (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 (7BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +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 (FF6F); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FEEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B9FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFF7); +SDR 16 TDI (FFFF) TDO (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 (FFF5); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFAF); +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 (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFF7); +SDR 16 TDI (FFFF) TDO (DFFF); +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 (B9AF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FDDF); +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 (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 (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFD); +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 (FFEE); +SDR 16 TDI (FFFF) TDO (79FF); +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 (BFFD); +SDR 16 TDI (FFFF) TDO (DFFF); +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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (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 (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 (BFFB); +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 (B5FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (DDDF); +SDR 16 TDI (FFFF) TDO (7BFF); +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 (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 (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFE); +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 (BFAC); +SDR 16 TDI (FFFF) TDO (3C3F); +SDR 16 TDI (FFFF) TDO (7DDF); +SDR 16 TDI (FFFF) TDO (FFE1); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFC); +SDR 16 TDI (FFFF) TDO (BE1F); +SDR 16 TDI (FFFF) TDO (0781); +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 (BDAC); +SDR 16 TDI (FFFF) TDO (3C3F); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFE1); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFC); +SDR 16 TDI (FFFF) TDO (BE1B); +SDR 16 TDI (FFFF) TDO (8781); +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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBFC); +SDR 16 TDI (FFFF) TDO (3C3F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFE1); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFC); +SDR 16 TDI (FFFF) TDO (BE0F); +SDR 16 TDI (FFFF) TDO (E001); +SDR 16 TDI (FFFF) TDO (70FF); +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 (BBFC); +SDR 16 TDI (FFFF) TDO (3C3F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFE1); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFC); +SDR 16 TDI (FFFF) TDO (BE1F); +SDR 16 TDI (FFFF) TDO (E001); +SDR 16 TDI (FFFF) TDO (70FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BAA7); +SDR 16 TDI (FFFF) TDO (B3B3); +SDR 16 TDI (FFFF) TDO (63E6); +SDR 16 TDI (FFFF) TDO (666F); +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 (B99F); +SDR 16 TDI (FFFF) TDO (8B9B); +SDR 16 TDI (FFFF) TDO (71CC); +SDR 16 TDI (FFFF) TDO (CCC7); +SDR 16 TDI (FFFF) TDO (B999); +SDR 16 TDI (FFFF) TDO (99EE); +SDR 16 TDI (FFFF) TDO (77FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B7FF); +SDR 16 TDI (FFFF) TDO (3737); +SDR 16 TDI (FFFF) TDO (6D57); +SDR 16 TDI (FFFF) TDO (7767); +SDR 16 TDI (FFFF) TDO (B777); +SDR 16 TDI (FFFF) TDO (74AB); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (7DDC); +SDR 16 TDI (FFFF) TDO (BB95); +SDR 16 TDI (FFFF) TDO (5999); +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 (BFF9); +SDR 16 TDI (FFFF) TDO (FDFF); +SDR 16 TDI (FFFF) TDO (7FDF); +SDR 16 TDI (FFFF) TDO (FFFD); +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 (BEFF); +SDR 16 TDI (FFFF) TDO (3FF7); +SDR 16 TDI (FFFF) TDO (77FF); +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 (AFEF); +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 (7FFD); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F5FF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (BEFF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BDF6); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (EFEF); +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 (BFBF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (BF7F); +SDR 16 TDI (FFFF) TDO (FFFF); +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 (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 (FDFF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (F7EF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BBBB); +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 (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 (7FFF); +SDR 16 TDI (FFFF) TDO (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 (FFBF); +SDR 16 TDI (FFFF) TDO (7FFD); +SDR 16 TDI (FFFF) TDO (FFEF); +SDR 16 TDI (FFFF) TDO (BFFF); +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 (FBFB); +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 (BEDB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (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 (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 (7FFF); +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 (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B9AF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEAF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (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 (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 (FFEA); +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 (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 (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 (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 (7FFF); +SDR 16 TDI (FFFF) TDO (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 (BBBF); +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 (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (B56C); +SDR 16 TDI (FFFF) TDO (3FFF); +SDR 16 TDI (FFFF) TDO (7DDF); +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 (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 (FFF4); +SDR 16 TDI (FFFF) TDO (79FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFC); +SDR 16 TDI (FFFF) TDO (3FFF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FFDF); +SDR 16 TDI (FFFF) TDO (5FFF); +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 (6DFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (B66C); +SDR 16 TDI (FFFF) TDO (3FFF); +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 (FFF5); +SDR 16 TDI (FFFF) TDO (5BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFC); +SDR 16 TDI (FFFF) TDO (3FFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (6FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BEAF); +SDR 16 TDI (FFFF) TDO (B333); +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 (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 (9FFF); +SDR 16 TDI (FFFF) TDO (3777); +SDR 16 TDI (FFFF) TDO (6D57); +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 (9FFD); +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 (FFFF); +SDR 16 TDI (FFFF) TDO (4FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +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 (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (5FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (8FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (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 (7FFF); +SDR 16 TDI (FFFF) TDO (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 (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5F7F); +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 (5FFF); +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 (5FFF); +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 (AFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +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 (5FFF); +SDR 16 TDI (FFFF) TDO (EFFF); +SDR 16 TDI (FFFF) TDO (8FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (5FFF); +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 (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 (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 (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 (FFFD); +SDR 16 TDI (FFFF) TDO (79FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (AAAF); +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 (FFFB); +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 (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 (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 (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 (9BBF); +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 (FFEA); +SDR 16 TDI (FFFF) TDO (57FF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (A65F); +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 (9FFF); +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 (AEFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FBF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +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 (975F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (FFF5); +SDR 16 TDI (FFFF) TDO (6BFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFB); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (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 (9333); +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 (9FFF); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (6957); +SDR 16 TDI (FFFF) TDO (7777); +SDR 16 TDI (FFFF) TDO (9777); +SDR 16 TDI (FFFF) TDO (74AB); +SDR 16 TDI (FFFF) TDO (5777); +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 (9FF7); +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 (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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (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 (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 (9FFF); +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 (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 (7FFF); +SDR 16 TDI (FFFF) TDO (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 (FF7F); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (EFFF); +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 (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 (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 (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 (5FFF); +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 (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 (B7FF); +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 (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 (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (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 (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 (BF7F); +SDR 16 TDI (FFFF) TDO (EFFF); +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 (9FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (9FFF); +SDR 16 TDI (FFFF) TDO (FBFF); +SDR 16 TDI (FFFF) TDO (5FFF); +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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (9F7F); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (5FFF); +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 (FE7E); +SDR 16 TDI (FFFF) TDO (6FF3); +SDR 16 TDI (FFFF) TDO (3FFF); +SDR 16 TDI (FFFF) TDO (9FE6); +SDR 16 TDI (FFFF) TDO (67F9); +SDR 16 TDI (FFFF) TDO (53FF); +SDR 16 TDI (FFFF) TDO (FFF9); +SDR 16 TDI (FFFF) TDO (93FF); +SDR 16 TDI (FFFF) TDO (F7FF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (999F); +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 (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 (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 (9FFF); +SDR 16 TDI (FFFF) TDO (F9FF); +SDR 16 TDI (FFFF) TDO (7FF3); +SDR 16 TDI (FFFF) TDO (FFFE); +SDR 16 TDI (FFFF) TDO (AF9E); +SDR 16 TDI (FFFF) TDO (7CF9); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (F3E7); +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 (9CFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (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 (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 (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (7FFF); +SDR 16 TDI (FFFF) TDO (FFFF); +SDR 16 TDI (FFFF) TDO (BFFF); +SDR 16 TDI (FFFF) TDO (FFFF); +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 (F9FF); +RUNTEST 1800 TCK; +SIR 10 TDI (201); +RUNTEST 18003 TCK; +SIR 10 TDI (3FF); +RUNTEST 18000 TCK; +STATE IDLE; diff --git a/hardware/portapack_h4m/CPLD/AG256SL100/portapack_h4m_cpld.qpf b/hardware/portapack_h4m/CPLD/AG256SL100/portapack_h4m_cpld.qpf new file mode 100644 index 00000000..2378c009 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/AG256SL100/portapack_h4m_cpld.qpf @@ -0,0 +1,30 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# 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, 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 32-bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 21:24:55 April 29, 2014 +# +# -------------------------------------------------------------------------- # + +QUARTUS_VERSION = "13.1" +DATE = "21:24:55 April 29, 2014" + +# Revisions + +PROJECT_REVISION = "portapack_h4m_cpld" diff --git a/hardware/portapack_h4m/CPLD/AG256SL100/portapack_h4m_cpld.qsf b/hardware/portapack_h4m/CPLD/AG256SL100/portapack_h4m_cpld.qsf new file mode 100644 index 00000000..697b7004 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/AG256SL100/portapack_h4m_cpld.qsf @@ -0,0 +1,352 @@ +# -------------------------------------------------------------------------- # +# +# Copyright (C) 1991-2014 Altera Corporation +# 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, 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 32-bit +# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition +# Date created = 21:24:55 April 29, 2014 +# +# -------------------------------------------------------------------------- # +# +# Notes: +# +# 1) The default values for assignments are stored in the file: +# portapack_h4m_cpld_assignment_defaults.qdf +# If this file doesn't exist, see file: +# assignment_defaults.qdf +# +# 2) Altera recommends that you do not modify this file. This +# file is updated automatically by the Quartus II software +# and any changes you make may be lost or overwritten. +# +# -------------------------------------------------------------------------- # + + +set_global_assignment -name FAMILY "MAX II" +set_global_assignment -name DEVICE EPM240T100C5 +set_global_assignment -name TOP_LEVEL_ENTITY top +set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1 +set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:24:55 APRIL 29, 2014" +set_global_assignment -name LAST_QUARTUS_VERSION "22.1std.1 Lite Edition" +set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files +set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 +set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 +set_global_assignment -name DEVICE_FILTER_PIN_COUNT 100 +set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR "-1" +set_global_assignment -name EDA_SIMULATION_TOOL "Questa Intel FPGA (VHDL)" +set_global_assignment -name EDA_NETLIST_WRITER_OUTPUT_DIR simulation/modelsim -section_id eda_simulation +set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation +set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008 +set_global_assignment -name VHDL_SHOW_LMF_MAPPING_MESSAGES OFF +set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_D +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_L +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_R +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_ROT_A +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_ROT_B +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_SEL +set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_U +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_D +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_L +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_R +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_U +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[15] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[14] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[13] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[12] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[11] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[10] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[9] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[8] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[7] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[6] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[5] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[4] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[3] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[2] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[1] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[0] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RDX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RS +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_TE +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_WRX +set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS TEST_BENCH_MODE -section_id eda_simulation +set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH top_tb -section_id eda_simulation +set_global_assignment -name EDA_TEST_BENCH_NAME top_tb -section_id eda_simulation +set_global_assignment -name EDA_DESIGN_INSTANCE_NAME uut -section_id top_tb +set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME top_tb -section_id top_tb +set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "NO HEAT SINK WITH STILL AIR" +set_global_assignment -name EDA_TEST_BENCH_RUN_SIM_FOR "500 ns" -section_id top_tb +set_global_assignment -name EDA_TEST_BENCH_FILE top_tb.vhd -section_id top_tb +set_global_assignment -name EDA_BOARD_DESIGN_BOUNDARY_SCAN_TOOL "BSDL (Boundary Scan)" +set_global_assignment -name EDA_NETLIST_WRITER_OUTPUT_DIR /home/jboone/src/portapack/portapack_hackrf/hardware/portapack_h2/cpld -section_id eda_board_design_boundary_scan +set_global_assignment -name EDA_BOARD_BOUNDARY_SCAN_OPERATION POST_CONFIG -section_id eda_board_design_boundary_scan +set_global_assignment -name AUTO_RESTART_CONFIGURATION OFF +set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF +set_global_assignment -name ENABLE_NCE_PIN OFF +set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF +set_global_assignment -name USE_CONFIGURATION_DEVICE ON +set_global_assignment -name GENERATE_RBF_FILE OFF +set_global_assignment -name GENERATE_SVF_FILE ON +set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED WITH BUS-HOLD" +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RESETX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_ADDR +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[7] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[6] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[5] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[4] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[3] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[2] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[1] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[0] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_DIR +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_D +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_L +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_R +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_U +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_ROT_B +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_SEL +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_ROT_A +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[15] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[14] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[13] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RDX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RESETX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_TE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_WRX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_ADDR +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_DIR +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_D +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_L +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_R +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_ROT_A +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_ROT_B +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_SEL +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_U +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_D +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_L +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_R +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_U +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[15] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[14] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[13] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[12] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[11] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[10] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[9] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[8] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[7] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[6] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[5] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[4] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[3] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[2] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[1] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[0] +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_RDX +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_RESETX +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_RS +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_TE +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_WRX +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_ADDR +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[7] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[6] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[5] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[4] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[3] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[2] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[1] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[0] +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_DIR +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_D +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_L +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_R +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_ROT_A +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_ROT_B +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_SEL +set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_U +set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_D +set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_L +set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_R +set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_U +set_global_assignment -name ENABLE_DEVICE_WIDE_RESET OFF +set_global_assignment -name IOBANK_VCCIO 3.3V -section_id 2 +set_global_assignment -name IOBANK_VCCIO 3.3V -section_id 1 +set_instance_assignment -name PCI_IO OFF -to MCU_DIR +set_global_assignment -name ALLOW_LVTTL_LVCMOS_INPUT_LEVELS_TO_OVERDRIVE_INPUT_BUFFER ON +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_BACKLIGHT +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_BACKLIGHT +set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_BACKLIGHT +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to AUDIO_RESETX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to AUDIO_RESETX +set_instance_assignment -name SLOW_SLEW_RATE ON -to AUDIO_RESETX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_RDX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_RDX +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_LCD_RDX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_WRX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_WRX +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_LCD_WRX +set_instance_assignment -name PCI_IO OFF -to MCU_LCD_WRX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_IO_STBX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_IO_STBX +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_IO_STBX +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_R +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_D +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_L +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_U +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_TE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_TE +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_LCD_TE +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_P2_8 +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_P2_8 +set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_P2_8 +set_instance_assignment -name PCI_IO OFF -to MCU_P2_8 +set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL + +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[15] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[14] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[13] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[12] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[11] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[10] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[9] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[8] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[7] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[6] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[5] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[4] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[3] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[2] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[1] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[0] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[7] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[6] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[5] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[4] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[3] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[2] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[1] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[0] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_ADDR +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_DIR +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_IO_STBX +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_LCD_RDX +set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to MCU_LCD_WRX +set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to MCU_P2_8 + +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_TIMEPULSE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_TIMEPULSE +set_instance_assignment -name SLOW_SLEW_RATE ON -to GPS_TIMEPULSE +set_instance_assignment -name PCI_IO OFF -to GPS_TIMEPULSE +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to GPS_TIMEPULSE + +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_TX_READY +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_TX_READY +set_instance_assignment -name SLOW_SLEW_RATE ON -to GPS_TX_READY +set_instance_assignment -name PCI_IO OFF -to GPS_TX_READY +set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to GPS_TX_READY + +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to REF_EN +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to REF_EN +set_instance_assignment -name SLOW_SLEW_RATE ON -to REF_EN + +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_RESETX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_RESETX +set_instance_assignment -name SLOW_SLEW_RATE ON -to GPS_RESETX + +set_location_assignment PIN_58 -to REF_EN +set_location_assignment PIN_72 -to MCU_DIR +set_location_assignment PIN_41 -to MCU_IO_STBX +set_location_assignment PIN_40 -to MCU_LCD_TE +set_location_assignment PIN_43 -to MCU_P2_8 +set_location_assignment PIN_71 -to MCU_LCD_WRX +set_location_assignment PIN_42 -to MCU_ADDR +set_location_assignment PIN_39 -to MCU_LCD_RDX +set_location_assignment PIN_35 -to MCU_D[0] +set_location_assignment PIN_33 -to MCU_D[2] +set_location_assignment PIN_28 -to MCU_D[4] +set_location_assignment PIN_27 -to MCU_D[6] +set_location_assignment PIN_8 -to TP_U +set_location_assignment PIN_7 -to TP_L +set_location_assignment PIN_6 -to TP_D +set_location_assignment PIN_5 -to TP_R +set_location_assignment PIN_26 -to MCU_D[7] +set_location_assignment PIN_29 -to MCU_D[5] +set_location_assignment PIN_30 -to MCU_D[3] +set_location_assignment PIN_36 -to MCU_D[1] +set_location_assignment PIN_73 -to GPS_RESETX +set_location_assignment PIN_75 -to GPS_TX_READY +set_location_assignment PIN_74 -to GPS_TIMEPULSE +set_location_assignment PIN_34 -to SW_U +set_location_assignment PIN_37 -to SW_L +set_location_assignment PIN_17 -to SW_SEL +set_location_assignment PIN_12 -to SW_R +set_location_assignment PIN_14 -to SW_D +set_location_assignment PIN_15 -to SW_ROT_A +set_location_assignment PIN_16 -to SW_ROT_B +set_location_assignment PIN_99 -to LCD_DB[0] +set_location_assignment PIN_98 -to LCD_DB[1] +set_location_assignment PIN_97 -to LCD_DB[2] +set_location_assignment PIN_96 -to LCD_DB[3] +set_location_assignment PIN_95 -to LCD_DB[4] +set_location_assignment PIN_92 -to LCD_DB[5] +set_location_assignment PIN_91 -to LCD_DB[6] +set_location_assignment PIN_90 -to LCD_DB[7] +set_location_assignment PIN_89 -to LCD_DB[8] +set_location_assignment PIN_88 -to LCD_DB[9] +set_location_assignment PIN_87 -to LCD_DB[10] +set_location_assignment PIN_86 -to LCD_DB[11] +set_location_assignment PIN_85 -to LCD_DB[12] +set_location_assignment PIN_84 -to LCD_DB[13] +set_location_assignment PIN_83 -to LCD_DB[14] +set_location_assignment PIN_82 -to LCD_DB[15] +set_location_assignment PIN_100 -to LCD_RESETX +set_location_assignment PIN_1 -to LCD_RDX +set_location_assignment PIN_3 -to LCD_RS +set_location_assignment PIN_2 -to LCD_WRX +set_location_assignment PIN_76 -to LCD_BACKLIGHT +set_location_assignment PIN_4 -to LCD_TE +set_global_assignment -name ENABLE_OCT_DONE OFF +set_location_assignment PIN_38 -to DEVICE_RESET_V +set_location_assignment PIN_44 -to DEVICE_RESET +set_global_assignment -name SDC_FILE portapack_h4m_cpld.sdc +set_global_assignment -name VHDL_FILE top.vhd +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SYSOFF +set_location_assignment PIN_47 -to SYSOFF +set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to SYSOFF \ No newline at end of file diff --git a/hardware/portapack_h4m/CPLD/AG256SL100/portapack_h4m_cpld.sdc b/hardware/portapack_h4m/CPLD/AG256SL100/portapack_h4m_cpld.sdc new file mode 100644 index 00000000..5546679a --- /dev/null +++ b/hardware/portapack_h4m/CPLD/AG256SL100/portapack_h4m_cpld.sdc @@ -0,0 +1,116 @@ +## Generated SDC file "portapack_hackrf_one_cpld.sdc" + +## Copyright (C) 1991-2014 Altera Corporation +## 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, 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. + + +## VENDOR "Altera" +## PROGRAM "Quartus II" +## VERSION "Version 13.1.4 Build 182 03/12/2014 SJ Web Edition" + +## DATE "Sat May 3 10:22:18 2014" + +## +## DEVICE "5M40ZE64C5" +## + +# RS = 0, D = DB[15:8] +# wait max(tast = 0 ns, CPLD setup = ?) +# WR = 0, D = DB[7:0] +# wait max(CPLD ) + +#************************************************************** +# Time Information +#************************************************************** + +set_time_format -unit ns -decimal_places 3 + +set mcu_clk_period 4.9 + +set lcd_data_wr_setup 10.0 +set lcd_data_wr_hold 10.0 + +#************************************************************** +# Create Clock +#************************************************************** + +create_clock -name {MCU_LCD_WRX} -period 66.000 -waveform { 0.000 33.000 } [get_ports {MCU_LCD_WRX}] +#create_clock -name strobe_virt -period 66.000 + +#************************************************************** +# Create Generated Clock +#************************************************************** + + + +#************************************************************** +# Set Clock Latency +#************************************************************** + + + +#************************************************************** +# Set Clock Uncertainty +#************************************************************** + + + +#************************************************************** +# Set Input Delay +#************************************************************** + +#set_input_delay -clock strobe_virt [get_ports {D[*]}] + +#************************************************************** +# Set Output Delay +#************************************************************** + + + +#************************************************************** +# Set Clock Groups +#************************************************************** + + + +#************************************************************** +# Set False Path +#************************************************************** + +#set_false_path -from [get_clocks {MCU_IO_STBX}] -to [get_ports {TP_D TP_L TP_R TP_U}] +#set_false_path -from [get_ports {SW_D SW_L SW_R SW_ROT_A SW_ROT_B SW_SEL SW_U}] -to [get_ports {MCU_D[*]}] + + +#************************************************************** +# Set Multicycle Path +#************************************************************** + + + +#************************************************************** +# Set Maximum Delay +#************************************************************** + + + +#************************************************************** +# Set Minimum Delay +#************************************************************** + + + +#************************************************************** +# Set Input Transition +#************************************************************** + diff --git a/hardware/portapack_h4m/CPLD/AG256SL100/quartus.ini_ignore b/hardware/portapack_h4m/CPLD/AG256SL100/quartus.ini_ignore new file mode 100644 index 00000000..edc6cbd0 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/AG256SL100/quartus.ini_ignore @@ -0,0 +1 @@ +dft_skip_oct_vccn_check = on \ No newline at end of file diff --git a/hardware/portapack_h4m/CPLD/AG256SL100/top.vhd b/hardware/portapack_h4m/CPLD/AG256SL100/top.vhd new file mode 100644 index 00000000..88661184 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/AG256SL100/top.vhd @@ -0,0 +1,207 @@ +-- +-- Copyright (C) 2012 Jared Boone, ShareBrained Technology, Inc. +-- Copyright (C) 2024 jLynx.net https://github.com/jLynx +-- +-- 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. + +library ieee; +use ieee.std_logic_1164.all; + +entity top is + port ( + MCU_D : inout std_logic_vector(7 downto 0); + MCU_DIR : in std_logic; + MCU_IO_STBX : in std_logic; + MCU_LCD_WRX : in std_logic; + MCU_ADDR : in std_logic; + MCU_LCD_TE : out std_logic; + MCU_P2_8 : in std_logic; + MCU_LCD_RDX : in std_logic; + + TP_U : out std_logic; + TP_D : out std_logic; + TP_L : out std_logic; + TP_R : out std_logic; + + SW_SEL : in std_logic; + SW_ROT_A : in std_logic; + SW_ROT_B : in std_logic; + SW_U : in std_logic; + SW_D : in std_logic; + SW_L : in std_logic; + SW_R : in std_logic; + + LCD_RESETX : out std_logic; + LCD_RS : out std_logic; + LCD_WRX : out std_logic; + LCD_RDX : out std_logic; + LCD_DB : inout std_logic_vector(15 downto 0); + LCD_TE : in std_logic; + LCD_BACKLIGHT : out std_logic; + + SYSOFF : out std_logic; + + AUDIO_RESETX : out std_logic; + + REF_EN : out std_logic; + + GPS_RESETX : out std_logic; + GPS_TX_READY : in std_logic; + GPS_TIMEPULSE : in std_logic; + + DEVICE_RESET : in std_logic; + DEVICE_RESET_V : in std_logic + ); +end top; + +architecture rtl of top is + + signal switches : std_logic_vector(7 downto 0); + + type data_direction_t is (from_mcu, to_mcu); + signal data_dir : data_direction_t; + + signal mcu_data_out_lcd : std_logic_vector(7 downto 0); + signal mcu_data_out_io : std_logic_vector(7 downto 0); + signal mcu_data_out : std_logic_vector(7 downto 0); + signal mcu_data_in : std_logic_vector(7 downto 0); + + signal lcd_data_in : std_logic_vector(15 downto 0); + signal lcd_data_in_mux : std_logic_vector(7 downto 0); + signal lcd_data_out : std_logic_vector(15 downto 0); + + signal lcd_data_in_q : std_logic_vector(7 downto 0) := (others => '0'); + signal lcd_data_out_q : std_logic_vector(7 downto 0) := (others => '0'); + + signal tp_q : std_logic_vector(7 downto 0) := (others => '0'); + + signal lcd_reset_q : std_logic := '1'; + signal lcd_backlight_q : std_logic := '0'; + + signal sysoff_q : std_logic := '0'; + + signal audio_reset_q : std_logic := '1'; + + signal ref_en_q : std_logic := '0'; + + signal device_reset_q : std_logic := '1'; + + signal dir_read : boolean; + signal dir_write : boolean; + + signal lcd_read_strobe : boolean; + signal lcd_write_strobe : boolean; + signal lcd_write : boolean; + + signal io_strobe : boolean; + signal io_read_strobe : boolean; + signal io_write_strobe : boolean; + + signal reset_flag: boolean := false; + signal reset_sync: std_logic := '1'; + signal counter: integer range 0 to 25000000 := 0; -- Adjust the count value for desired delay (e.g., 1 second with a 25 MHz clock) + + constant COUNTER_MAX: integer := 25000000; -- Adjust this value to match the counter range + +begin + + -- I/O data + switches <= LCD_TE & not SW_ROT_B & not SW_ROT_A & not SW_SEL & not SW_U & not SW_D & not SW_L & not SW_R; + + TP_U <= tp_q(3) when tp_q(7) = '1' else 'Z'; + TP_D <= tp_q(2) when tp_q(6) = '1' else 'Z'; + TP_L <= tp_q(1) when tp_q(5) = '1' else 'Z'; + TP_R <= tp_q(0) when tp_q(4) = '1' else 'Z'; + + LCD_BACKLIGHT <= lcd_backlight_q; + + SYSOFF <= sysoff_q; + + MCU_LCD_TE <= LCD_TE; + + + -- State management + data_dir <= to_mcu when MCU_DIR = '1' else from_mcu; + dir_read <= (data_dir = to_mcu); + dir_write <= (data_dir = from_mcu); + + io_strobe <= (MCU_IO_STBX = '0'); + io_read_strobe <= io_strobe and dir_read; + + lcd_read_strobe <= (MCU_LCD_RDX = '0'); + lcd_write <= not lcd_read_strobe; + + -- LCD interface + LCD_RS <= MCU_ADDR; + LCD_RDX <= MCU_LCD_RDX; + LCD_WRX <= MCU_LCD_WRX; + + lcd_data_out <= lcd_data_out_q & mcu_data_in; + lcd_data_in <= LCD_DB; + LCD_DB <= lcd_data_out when lcd_write else (others => 'Z'); + + -- Reference clock + REF_EN <= ref_en_q; + + -- Peripheral reset control + LCD_RESETX <= not lcd_reset_q; + AUDIO_RESETX <= not audio_reset_q; + GPS_RESETX <= '1'; + + -- MCU interface + mcu_data_out_lcd <= lcd_data_in(15 downto 8) when lcd_read_strobe else lcd_data_in_q; + mcu_data_out_io <= switches; + mcu_data_out <= mcu_data_out_io when io_read_strobe else mcu_data_out_lcd; + + mcu_data_in <= MCU_D; + MCU_D <= mcu_data_out when dir_read else (others => 'Z'); + + -- Synchronous behaviors: + -- LCD write: Capture LCD high byte on LCD_WRX falling edge. + process(MCU_LCD_WRX, mcu_data_in) + begin + if falling_edge(MCU_LCD_WRX) then + lcd_data_out_q <= mcu_data_in; + end if; + end process; + + -- LCD read: Capture LCD low byte on LCD_RD falling edge. + process(MCU_LCD_RDX, lcd_data_in) + begin + if rising_edge(MCU_LCD_RDX) then + lcd_data_in_q <= lcd_data_in(7 downto 0); + end if; + end process; + + -- I/O write (to resistive touch panel): Capture data from + -- MCU and hold on TP pins until further notice. + process(MCU_IO_STBX, dir_write, mcu_data_in, MCU_ADDR) + begin + if rising_edge(MCU_IO_STBX) and dir_write then + if MCU_ADDR = '0' then + tp_q <= mcu_data_in; + else + lcd_reset_q <= mcu_data_in(0); + audio_reset_q <= mcu_data_in(1); + ref_en_q <= mcu_data_in(6); + lcd_backlight_q <= mcu_data_in(7); + sysoff_q <= mcu_data_in(2); + end if; + end if; + end process; +end rtl; \ No newline at end of file diff --git a/hardware/portapack_h4m/CPLD/README.md b/hardware/portapack_h4m/CPLD/README.md new file mode 100644 index 00000000..ee1b5fb5 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/README.md @@ -0,0 +1,58 @@ +# Project Setup Guide + +## Prerequisites + +- Intel Quartus Prime +- Supra-2023.02.b0-7773ca8a-win64-all + +## Installation Steps + +1. **Project Setup** + +- Create a new AG256SL100 project in Quartus Prime +- (Alternatively, copy an existing project) + +2. **Code Implementation** + +- Implement your code in the project +- Compile the project to verify there are no errors +- Ensure successful compilation before proceeding + +3. **Supra Configuration** + +- Launch Supra.exe +- Navigate to: File → Project → Open Project +- Select the H4M project when prompted +- Select Tools → Migrate → Next + +4. **Additional Setup** + +- Follow the on-screen prompts +- You will need to: + - Open a second Quartus project + - Execute a provided script + +5. **Programming** + +- In Supra, go to: Tools → Program +- Click "Query device ID" +- Verify the returned ID is: 0x00025610 + +6. **File Selection** + +- Select the programming file (if not automatically loaded) +- Use the .prg file from the Supra src folder (non-SRAM version) + +7. **Programming Process** + +- Click "Program" to begin +- Note: The counter shows elapsed seconds, not progress percentage +- Programming is complete when "USB driver disconnected" message appears + +## Troubleshooting + +If you encounter any issues, ensure: + +- All prerequisites are properly installed +- Project configurations are correct +- Device connections are secure \ No newline at end of file diff --git a/hardware/portapack_h4m/CPLD/Supra/H4M.proj b/hardware/portapack_h4m/CPLD/Supra/H4M.proj new file mode 100644 index 00000000..21d3c746 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/H4M.proj @@ -0,0 +1,62 @@ +[GuiMigrateSetupPage] +fromDir=../AG256SL100 +design=portapack_h4m_cpld +device=AG256SL100 +veFile= +ipFiles= +backwardCompatible=false +modeGroup=false +modeQuartus=true +modeSynplicity=false +modeNative=false + +[GuiMigrateRunPage] +isMC=false +count= +jobs= +seed= +retry=0 +fitting=0 +fitter=0 +effort=0 +holdx=0 +skew=0 +skope=0 +preset=0 +adjust=0 +target=0 +tuning=0 +corner=0 +flow=0 +orgPlace=false +quartusSdc=false +probeForce=false +probeState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2m\0\0\0\x2\0\x1\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\0\0\0K\0\0\0\x4\0\0\0\0\0\0\0\x2\0\0\x1\xc2\0\0\0\x1\0\0\0\0\0\0\0\xab\0\0\0\x1\0\0\0\0) +probeCount=5 +probe0From= +probe0Pad= +probe1From= +probe1Pad= +probe2From= +probe2Pad= +probe3From= +probe3Pad= +probe4From= +probe4Pad= + +[GuiProgramScreen] +hardwareId=0 +blasterSpeed=70 +prgFile=portapack_h4m_cpld.prg +eraseBox=false +cable=0 +runAction=program +eraseChip=true +eraseFrom= +eraseTo= +binFile= +readFrom= +readTo= + +[MainWindow] +recentFile.0= diff --git a/hardware/portapack_h4m/CPLD/Supra/af_batch.tcl b/hardware/portapack_h4m/CPLD/Supra/af_batch.tcl new file mode 100644 index 00000000..51b040ae --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/af_batch.tcl @@ -0,0 +1,114 @@ +if {![info exist MODE ]} {set MODE QUARTUS} +if {![info exists QUARTUS_SDC]} {set QUARTUS_SDC true} +if {![info exists CORNER]} {set CORNER ""} +if {![info exist COUNT]} {set COUNT 6} +if {![info exist JOBS ]} {set JOBS 1} + +if {![info exist SEEDS ]} {set SEEDS {0 0 0 0 666 888 }} +if {![info exist EFFORTS ]} {set EFFORTS {highest highest highest highest high high }} +if {![info exist FITTERS ]} {set FITTERS {hybrid hybrid hybrid hybrid hybrid hybrid }} +if {![info exist FITTINGS]} {set FITTINGS {timing_more timing_more timing_more timing timing basic }} +if {![info exist SKEWS ]} {set SKEWS {advanced advanced advanced advanced aggressive basic }} +if {![info exist HOLDXS ]} {set HOLDXS {default default default default default default}} + +set bc_config "./bc_config.txt" +if { [file exists $bc_config] } { + alta::tcl_highlight "Using MC config $bc_config.\n" + source "$bc_config" +} + +####################################################################### + +proc get_rand_value { values } { + if {[llength $values] == 0} { return {} } + return [lindex $values [expr {int(rand()*10000)%[llength $values]}]] +} + +set results "bc_results" +set summary "bc_summary.txt" +file delete -force $results; file mkdir $results +file delete $summary; print -nonewline "" >! $summary + +set is_parallel [expr $JOBS > 1] +set is_color ""; set is_gui ""; set is_quiet "" +if { $is_parallel } { + set is_gui "--quiet" +} else { + if { [alta::tcl_is_color] } { set is_color "--color" } + if { [alta::tcl_is_gui ] } { set is_gui "--gui" } +} + +####################################################################### + +set progs {} +set titles {} +for {set id 1} {$id <= $COUNT} {incr id} { +set result_dir "$results/$id" +file mkdir $result_dir + +set seed [get_rand_value $SEEDS ] +set effort [get_rand_value $EFFORTS ] +set skew [get_rand_value $SKEWS ] +set fitter [get_rand_value $FITTERS ] +set fitting [get_rand_value $FITTINGS] +set holdx [get_rand_value $HOLDXS ] + +set prog [list [info nameofexec] $is_quiet $is_color $is_gui -B --batch --mode $MODE] +alta::lconcat prog [list -X "set QUARTUS_SDC $QUARTUS_SDC"] +if { $CORNER != "" } { + alta::lconcat prog [list -X "set CORNER $CORNER"] +} +alta::lconcat prog [list -X "set RESULT_DIR $result_dir"] +if { $seed != "" } { + alta::lconcat prog [list -X "set SEED $seed"] +} +if { $effort != "" } { + alta::lconcat prog [list -X "set EFFORT $effort"] +} +if { $fitter != "" } { + alta::lconcat prog [list -X "set FITTER $fitter"] +} +if { $fitting != "" } { + alta::lconcat prog [list -X "set FITTING $fitting"] +} +if { $skew != "" } { + alta::lconcat prog [list -X "set SKEW $skew"] +} +if { $holdx != "" } { + alta::lconcat prog [list -X "set HOLDX $holdx"] +} +#alta::lconcat prog [list -F af_run.tcl] +lappend progs $prog +lappend titles "#$id $result_dir" +} + +####################################################################### + +if { $is_parallel } { + set bg_progs {} + foreach bg_prog $progs { + lappend bg_progs [lappend bg_prog $is_quiet] + } + bg_exec_queue $titles $bg_progs $JOBS +} + +####################################################################### + +for {set id 1} {$id <= $COUNT} {incr id} { +set result_dir "$results/$id" +set prog [lindex $progs [expr $id-1]] +set title [lindex $titles [expr $id-1]] +if { ! $is_parallel } { + puts $title + puts $prog + eval exec -ignorestderr $prog >&@ stdout +} + +print "***************************************************************************\n" >> $summary +print "$title\n" >> $summary +cat "$result_dir/alta_db/fmax.rpt" >> $summary +cat "$result_dir/alta_db/xfer.rpt" >> $summary +print "" >> $summary +} + +alta::tcl_highlight "Check $summary for result.\n" diff --git a/hardware/portapack_h4m/CPLD/Supra/af_ip.tcl b/hardware/portapack_h4m/CPLD/Supra/af_ip.tcl new file mode 100644 index 00000000..3e3c5cb0 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/af_ip.tcl @@ -0,0 +1,50 @@ +set AGM_SUPRA true +set DESIGN "portapack_h4m_cpld" +set IPLIST {alta_bram alta_bram9k alta_sram alta_wram alta_pll alta_pllx alta_pllv alta_pllve alta_boot alta_osc alta_mult alta_multm alta_ufm alta_ufms alta_ufml alta_i2c alta_spi alta_irda alta_mcu alta_mcu_m3 alta_saradc alta_adc alta_dac alta_cmp } +lappend IPLIST alta_rv32 + +proc set_alta_partition {inst tag} { + set full_name [get_name_info -observable_type pre_synthesis -info full_path $inst] + set inst_name [get_name_info -observable_type pre_synthesis -info short_full_path $inst] + set base_name [get_name_info -observable_type pre_synthesis -info instance_name $inst] + set section_id [string map { [ _ ] _ . _ | _} $inst_name] + eval "set_global_assignment -name PARTITION_COLOR 52377 -section_id $section_id -tag $tag" + eval "set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id $section_id -tag $tag" + eval "set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id $section_id -tag $tag" + eval "set_instance_assignment -name PARTITION_HIERARCHY $section_id -to $full_name -section_id $section_id -tag $tag" +} + +load_package flow +if { $DESIGN == "" } { + set DESIGN $::quartus(args) +} +project_open $DESIGN + +set tag alta_auto +if { [llength $IPLIST] > 0 } { + # A Quartus bug saves PARTITION_HIERARCHY assignments without tag. Use section_id to remove them. + set asgn_col [get_all_global_assignments -name PARTITION_NETLIST_TYPE -tag $tag] + foreach_in_collection part $asgn_col { + set section_id [lindex $part 0] + eval "remove_all_instance_assignments -name PARTITION_HIERARCHY -section_id $section_id" + } + eval "remove_all_global_assignments -name PARTITION_COLOR -tag $tag" + eval "remove_all_global_assignments -name PARTITION_NETLIST_TYPE -tag $tag" + eval "remove_all_global_assignments -name PARTITION_FITTER_PRESERVATION_LEVEL -tag $tag" + catch { execute_module -tool map } + + foreach ip $IPLIST { + foreach_in_collection inst [get_names -node_type hierarchy -observable_type pre_synthesis -filter "$ip:*"] { + set_alta_partition $inst $tag + } + foreach_in_collection inst [get_names -node_type hierarchy -observable_type pre_synthesis -filter "*|$ip:*"] { + set_alta_partition $inst $tag + } + } +} +eval "set_global_assignment -name EDA_MAINTAIN_DESIGN_HIERARCHY PARTITION_ONLY -section_id eda_simulation" + +project_close + +exit + diff --git a/hardware/portapack_h4m/CPLD/Supra/af_map.tcl b/hardware/portapack_h4m/CPLD/Supra/af_map.tcl new file mode 100644 index 00000000..ebdf2911 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/af_map.tcl @@ -0,0 +1,79 @@ +map -import + +if { [info exists DESIGN] && ! [info exists TOP_MODULE] } { + set TOP_MODULE "$DESIGN" +} +if { ! [info exists DESIGN] } { + set DESIGN "portapack_h4m_cpld" +} +if { ! [info exists TOP_MODULE] } { + set TOP_MODULE "top" +} + +set verilogs { } +if { [ llength $verilogs ] == 0 } { + set verilogs "A:/Users/jLynx/Documents/Code/C/portapack-mayhem/hardware/portapack_h4m/CPLD/AG256SL100/${DESIGN}.v" +} +foreach verilog $verilogs { + read_verilog "$verilog" +} + + read_verilog -sv -lib +/agm/rodina/cells_sim.v + read_verilog -sv -lib +/agm/common/m9k_bb.v + read_verilog -sv -lib +/agm/common/altpll_bb.v + hierarchy -check -top ${TOP_MODULE} + + synth -run coarse -top ${DESIGN} + + map proc + opt_expr + opt_clean + check + opt + + wreduce + alumacc + share + opt + fsm + opt -fast + memory -nomap + opt_clean + + memory_bram -rules +/agm/common/brams.txt + techmap -map +/agm/common/brams_map.v + + opt -fast -mux_undef -undriven -fine -full + memory_map + opt -undriven -fine + + techmap -autoproc -map +/techmap.v -map +/agm/rodina/arith_map.v + dffsr2dff + dff2dffe -direct-match \$_DFF_* + opt -full + + techmap -map +/agm/rodina/cells_map.v + agm_dffeas + opt -full + + clean -purge + setundef -undriven -zero + abc -markgroups -dff + opt_expr -mux_undef -undriven -full + opt_merge + opt_rmdff + opt_clean + + abc -lut 4 + clean + + techmap -map +/agm/rodina/cells_map.v + dffinit -ff dffeas Q INIT + clean -purge + + hierarchy -check + check -noinit + + write_verilog -bitblasted -attr2comment -defparam -decimal -renameprefix syn_ ${DESIGN}.vqm +# exec sed -i "/\\\\\\\$paramod/s/\[$=\\]/_/g" ${DESIGN}.vqm + diff --git a/hardware/portapack_h4m/CPLD/Supra/af_quartus.tcl b/hardware/portapack_h4m/CPLD/Supra/af_quartus.tcl new file mode 100644 index 00000000..54463c74 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/af_quartus.tcl @@ -0,0 +1,50 @@ +set AGM_SUPRA true +set RETRY 0 +set DESIGN "portapack_h4m_cpld" + +if { [is_project_open] } { + export_assignments +} + +set is_compatible false +if { $is_compatible } { + cd A:/Users/jLynx/Documents/Code/C/portapack-mayhem/hardware/portapack_h4m/CPLD/AG256SL100 + qexec "[file join $::quartus(binpath) quartus_eda] $DESIGN --simulation --tool=modelsim --format=verilog" +} else { + set FITTER_EFFORTS {"STANDARD FIT" "STANDARD FIT" "FAST FIT" "FAST FIT" "FAST FIT"} + set SEEDS [list [expr int(rand()*100)] \ + [expr int(rand()*100)] \ + [expr int(rand()*100)] \ + [expr int(rand()*100)] \ + [expr int(rand()*100)]] + set PLACEMENT_EFFORTS [list [expr rand()*5+0.1] \ + [expr rand()*5+0.1] \ + [expr rand()*5+0.1] \ + [expr rand()*5+0.1] \ + [expr rand()*5+0.1]] + set ROUTER_EFFORTS [list [expr rand()*5+0.25] \ + [expr rand()*5+0.25] \ + [expr rand()*5+0.25] \ + [expr rand()*5+0.25] \ + [expr rand()*5+0.25]] + + qexec "[file join $::quartus(binpath) quartus_sh] -t af_ip.tcl" + + load_package flow + project_open $DESIGN + + set RETRY [expr $RETRY<[llength $FITTER_EFFORTS]?$RETRY:[llength $FITTER_EFFORTS]] + for {set nn -1} {$nn < $RETRY} {incr nn} { + if {$nn >= 0} { + set_global_assignment -name FITTER_EFFORT \"[lindex $FITTER_EFFORTS $nn]\" + set_global_assignment -name SEED [lindex $SEEDS $nn] + set_global_assignment -name PLACEMENT_EFFORT_MULTIPLIER [lindex $PLACEMENT_EFFORTS $nn] + set_global_assignment -name ROUTER_EFFORT_MULTIPLIER [lindex $ROUTER_EFFORTS $nn] + } + + set code [catch {execute_flow -compile} msg] + if { $code == 0 } { break } + } +} + + diff --git a/hardware/portapack_h4m/CPLD/Supra/af_run.tcl b/hardware/portapack_h4m/CPLD/Supra/af_run.tcl new file mode 100644 index 00000000..7988dddd --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/af_run.tcl @@ -0,0 +1,340 @@ +set ALTA_SUPRA true +set sh_continue_on_error false +set sh_echo_on_source true +set sh_quiet_on_source true +set cc_critical_as_fatal true +set rt_incremental_route true +set ta_report_auto 1 +set ta_report_auto_constraints $ta_report_auto + +if { ! [info exists RESULT_DIR] } { + set RESULT_DIR "." +} elseif { ! [info exists alta_work] } { + set alta_work "${RESULT_DIR}/alta_db" +} +if { ! [info exists DEVICE] } { + set DEVICE "AG256SL100" +} +if { [info exists DESIGN] && ! [info exists TOP_MODULE] } { + set TOP_MODULE "$DESIGN" +} +if { ! [info exists DESIGN] } { + set DESIGN "portapack_h4m_cpld" +} +if { ! [info exists TOP_MODULE] } { + set TOP_MODULE "top" +} +if { ! [info exists IP_FILES] } { + set IP_FILES {} +} +if { ! [info exists VE_FILE] } { + set VE_FILE "" +} +if { ! [info exists TIMING_DERATE] } { + set TIMING_DERATE {1.000000 1.000000} +} +if { [info exists NO_ROUTE] && $NO_ROUTE } { + set no_route "-no_route" +} else { + set no_route "" +} +if { ! [info exists RETRY] } { set RETRY 0 } +if { ! [info exists SEED ] } { set SEED 666 } +set seed_rand "" +if { $SEED == 0 } { set seed_rand "-seed_rand" } +if { [info exists QUARTUS_SDC] } { + set sdc_remove_quartus_column_name $QUARTUS_SDC +} +if { ! [info exists ORG_PLACE] } { set ORG_PLACE false } +if { ! [info exists MODE] } { set MODE "QUARTUS" } +if { ! [info exists FLOW] } { set FLOW "ALL" } +if { $FLOW == "PROBE" } { + if { ! [info exists PROBE_FORCE] } { set PROBE_FORCE false } + if { ! [info exists PREFIX] } { set PREFIX "probe_" } +} +if { ! [info exists PREFIX] } { + set RESULT $DESIGN +} else { + set RESULT $PREFIX$DESIGN +} +if { $FLOW == "GEN" || $FLOW == "PACK" || $FLOW == "LOAD" } { set no_route "-no_route" } +set RUN "run" +if { $FLOW == "CHECK" } { + set RUN "check" +} elseif { $FLOW == "PROBE" } { + set RUN "probe" +} elseif { $FLOW == "GEN" } { + set RUN "gen" +} + +if { ! [info exists alta_logs] } { + set alta_logs "${RESULT_DIR}/alta_logs" +} +file mkdir $alta_logs +alta::begin_log_cmd "$alta_logs/${RUN}.log" "$alta_logs/${RUN}.err" +alta::tcl_whisper "Cmd : [alta::prog_path] [alta::prog_version]([alta::prog_subversion])\n" +alta::tcl_whisper "Args : [string map {\{ \" \} \"} $tcl_cmd_args]\n" + +set_seed_rand $SEED +set ar_timing_derate ${TIMING_DERATE} + +date_time +if { [file exists "./${DESIGN}.pre.asf"] } { + alta::tcl_highlight "Using pre-ASF file ${DESIGN}.pre.asf.\n" + source "./${DESIGN}.pre.asf" +} + +set LOAD_DB false +set LOAD_PLACE false +set LOAD_ROUTE false +if { $FLOW == "LOAD" || $FLOW == "CHECK" || $FLOW == "PROBE" } { + set LOAD_DB true + set LOAD_PLACE true + set LOAD_ROUTE true +} elseif { $FLOW == "R" || $FLOW == "ROUTE" } { + set LOAD_DB true + set LOAD_PLACE true +} + +set ORIGINAL_QSF "A:/Users/jLynx/Documents/Code/C/portapack-mayhem/hardware/portapack_h4m/CPLD/AG256SL100/./portapack_h4m_cpld.qsf" +set ORIGINAL_PIN "A:/Users/jLynx/Documents/Code/C/portapack-mayhem/hardware/portapack_h4m/CPLD/AG256SL100/output_files/portapack_h4m_cpld.pin" + +################################################################################# + +while (1) { +if { [info exists CORNER] } { set_mode -corner $CORNER; } + +eval "load_architect ${no_route} -type ${DEVICE} 1 1 1000 1000" +foreach ip_file $IP_FILES { read_ip $ip_file; } + + +if { $FLOW == "GEN" } { + if { ! [info exists CONFIG_BITS] } { + set CONFIG_BITS "${RESULT_DIR}/${DESIGN}.bin" + } + if { [llength $CONFIG_BITS] > 1 } { + if { ! [info exists BOOT_BINARY] } { + set BOOT_BINARY "${RESULT_DIR}/${DESIGN}_boot.bin" + } + if { ! [info exists CONFIG_ADDRESSES] } { + set CONFIG_ADDRESSES "" + } + generate_binary -master $BOOT_BINARY -inputs $CONFIG_BITS -address $CONFIG_ADDRESSES + } else { + set CONFIG_ROOT [file rootname [lindex $CONFIG_BITS 0]] + set SLAVE_RBF "${CONFIG_ROOT}_slave.rbf" + set MASTER_BINARY "${CONFIG_ROOT}_master.bin" + if { [file exists [lindex $CONFIG_BITS 0]] } { + generate_binary -slave $SLAVE_RBF -inputs [lindex $CONFIG_BITS 0] -reverse + generate_binary -master $MASTER_BINARY -inputs [lindex $CONFIG_BITS 0] + } + if { ! [info exists BOOT_BINARY] } { + set BOOT_BINARY $MASTER_BINARY + } + } + set PRG_FILE [file rootname $BOOT_BINARY].prg + set AS_FILE [file rootname $BOOT_BINARY]_as.prg + generate_programming_file $BOOT_BINARY -erase $ERASE \ + -program $PROGRAM -verify $VERIFY -offset $OFFSET \ + -prg $PRG_FILE -as $AS_FILE + break +} + +if { $LOAD_DB } { + load_db -top ${TOP_MODULE} + set sdc "./${DESIGN}.adc" + if { ! [file exists $sdc] } { set sdc "./${DESIGN}.sdc"; } + if { [file exists $sdc] } { read_sdc $sdc; } + +} elseif { $MODE == "QUARTUS" } { + set verilog ${DESIGN}.vo + set is_migrated false + if { ! [file exists $verilog] } { + set verilog "./simulation/modelsim/${DESIGN}.vo" + set is_migrated true + } + if { ! [file exists $verilog] } { + error "Can not find design verilog file $verilog" + } + alta::tcl_highlight "Using design verilog file $verilog.\n" + set ret [read_design -top ${TOP_MODULE} -ve $VE_FILE -qsf $ORIGINAL_QSF $verilog -hierachy 1] + if { !$ret } { exit -1; } + + set sdc "./${DESIGN}.adc" + if { ! [file exists $sdc] } { set sdc "./${DESIGN}.sdc"; } + if { ! [file exists $sdc] } { + alta::tcl_warn "Can not find design SDC file $sdc" + } else { + alta::tcl_highlight "Using design SDC file $sdc.\n" + read_sdc $sdc + } + +} elseif { $MODE == "SYNPLICITY" || $MODE == "NATIVE" } { + set db_gclk_assignment_level 2 + set verilog ${DESIGN}.vqm + set is_migrated false + if { ! [file exists $verilog] } { + error "Can not find design verilog file $verilog" + } + + set sdc "./${DESIGN}.adc" + if { ! [file exists $sdc] } { set sdc "./${DESIGN}.sdc"; } + alta::tcl_highlight "Using design verilog file $verilog.\n" + if { ! [file exists $sdc] } { + alta::tcl_warn "Can not find design SDC file $sdc" + set ret [read_design_and_pack -sdc $sdc -top ${TOP_MODULE} $verilog] + } else { + alta::tcl_highlight "Using design SDC file $sdc.\n" + set ret [read_design_and_pack -top ${TOP_MODULE} $verilog] + } + if { !$ret } { exit -1; } + +} else { + error "Unsupported mode $MODE" +} + +if { $FLOW == "PACK" } { break } + +if { [info exists FITTING] } { + if { $FITTING == "Auto" } { set FITTING auto; } + set_mode -fitting $FITTING +} +if { [info exists FITTER] } { + if { $FITTER == "Auto" } { + if { $MODE == "QUARTUS" } { set FITTER hybrid; } else { set FITTER full; } + } + if { $MODE == "SYNPLICITY" || $MODE == "NATIVE" } { set FITTER full; } + set_mode -fitter $FITTER +} +if { [info exists EFFORT] } { set_mode -effort $EFFORT; } +if { [info exists SKEW ] } { set_mode -skew $SKEW ; } +if { [info exists SKOPE ] } { set_mode -skope $SKOPE ; } +if { [info exists HOLDX ] } { set_mode -holdx $HOLDX; } +if { [info exists TUNING] } { set_mode -tuning $TUNING; } +if { [info exists TARGET] } { set_mode -target $TARGET; } +if { [info exists PRESET] } { set_mode -preset $PRESET; } +if { [info exists ADJUST] } { set pl_criticality_wadjust $ADJUST; } + +set alta_aqf $::alta_work/alta.aqf +if { $LOAD_DB } { + # Empty +} elseif { true } { + if { [file exists $VE_FILE] } { + set ORIGINAL_PIN "" + } elseif { ! [file exists $ORIGINAL_PIN] } { + if { $is_migrated } { + error "Can not find design PIN file $ORIGINAL_PIN, please compile design first" + } + set ORIGINAL_PIN "" + } + if { [file exists $ORIGINAL_QSF] } { + alta::convert_quartus_settings_cmd $ORIGINAL_QSF $ORIGINAL_PIN $alta_aqf + } elseif { $is_migrated } { + error "Can not find design exported QSF file $ORIGINAL_QSF, please export assigments first" + } +} +if { [file exists "$alta_aqf"] } { + alta::tcl_highlight "Using AQF file $alta_aqf.\n" + source "$alta_aqf" +} +if { [file exists "./${DESIGN}.asf"] } { + alta::tcl_highlight "Using ASF file ${DESIGN}.asf.\n" + source "./${DESIGN}.asf" +} + +if { $FLOW == "PROBE" } { + set ret [place_pseudo -user_io -place_io -place_pll -place_gclk] + if { !$ret } { exit -1 } + + set force "" + if { [info exists PROBE_FORCE] && $PROBE_FORCE } { set force "-force" } + eval "probe_design -froms {${PROBE_FROMS}} -tos {${PROBE_TOS}} ${force}" + +} elseif { $FLOW == "CHECK" } { + set ret [place_pseudo -user_io -place_io -place_pll -place_gclk] + if { !$ret } { exit -1 } + + if { [file exists "./${DESIGN}.chk"] } { + alta::tcl_highlight "Using CHK file ${DESIGN}.chk.\n" + source "./${DESIGN}.chk" + place_design -dry + check_design -rule led_guide + } else { + error "Can not find design CHECK file ${DESIGN}.chk" + } + +} else { + set ret [place_pseudo -user_io -place_io -place_pll -place_gclk -warn_io] + if { !$ret } { exit -1 } + + set org_place "" + set load_place "" + set load_route "" + set quiet "" + if { $ORG_PLACE } { set org_place "-org_place" ; } + if { $LOAD_PLACE } { set load_place "-load_place"; } + if { $LOAD_ROUTE } { set load_route "-load_route"; } + eval "place_and_route_design $org_place $load_place $load_route \ + -retry $RETRY $seed_rand $quiet" +} + +date_time +if { $FLOW != "CHECK" } { +if { $FLOW != "PROBE" } { +#report_timing -verbose 1 -file $::alta_work/timing.rpt.gz +report_timing -verbose 2 -setup -file $::alta_work/setup.rpt.gz +report_timing -verbose 2 -setup -brief -file $::alta_work/setup_summary.rpt.gz +report_timing -verbose 2 -hold -file $::alta_work/hold.rpt.gz +report_timing -verbose 2 -hold -brief -file $::alta_work/hold_summary.rpt.gz + +set ta_report_auto_constraints 0 +report_timing -fmax -file $::alta_work/fmax.rpt +report_timing -xfer -file $::alta_work/xfer.rpt +set ta_report_auto_constraints $ta_report_auto + +#set ta_coverage_limit "0.95 0.90" +set ta_dump_uncovered 1 +report_timing -verbose 1 -coverage >! $::alta_work/coverage.rpt.gz +#unset ta_coverage_limit +unset ta_dump_uncovered + + +if { ! [info exists rt_report_timing_fast] } { + set rt_report_timing_fast false +} +if { $rt_report_timing_fast } { + set_timing_corner fast + route_delay -quiet + report_timing -verbose 2 -setup -file $::alta_work/setup_fast.rpt.gz + report_timing -verbose 2 -setup -brief -file $::alta_work/setup_fast_summary.rpt.gz + report_timing -verbose 2 -hold -file $::alta_work/hold_fast.rpt.gz + report_timing -verbose 2 -hold -brief -file $::alta_work/hold_fast_summary.rpt.gz + set ta_report_auto_constraints 0 + report_timing -fmax -file $::alta_work/fmax_fast.rpt + report_timing -xfer -file $::alta_work/xfer_fast.rpt + set ta_report_auto_constraints $ta_report_auto +} + +write_routed_design "${RESULT_DIR}/${RESULT}_routed.v" +} + +bitgen normal -prg "${RESULT_DIR}/${RESULT}.prg" -bin "${RESULT_DIR}/${RESULT}.bin" +bitgen sram -prg "${RESULT_DIR}/${RESULT}_sram.prg" +bitgen download -bin "${RESULT_DIR}/${RESULT}.bin" -svf "${RESULT_DIR}/${RESULT}_download.svf" +generate_binary -slave "${RESULT_DIR}/${RESULT}_slave.rbf" \ + -inputs "${RESULT_DIR}/${RESULT}.bin" -reverse +generate_binary -master "${RESULT_DIR}/${RESULT}_master.bin" \ + -inputs "${RESULT_DIR}/${RESULT}.bin" +generate_programming_file "${RESULT_DIR}/${RESULT}_master.bin" -prg "${RESULT_DIR}/${RESULT}_master.prg" \ + -as "${RESULT_DIR}/${RESULT}_master_as.prg" -hybrid "${RESULT_DIR}/${RESULT}_hybrid.prg" +} +break +} + +if { [file exists "./${DESIGN}.post.asf"] } { + alta::tcl_highlight "Using post-ASF file ${DESIGN}.post.asf.\n" + source "./${DESIGN}.post.asf" +} +date_time +exit + diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.aqf b/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.aqf new file mode 100644 index 00000000..694cd105 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.aqf @@ -0,0 +1,266 @@ +set_global_assignment -name DEVICE_IO_STANDARD "3.3-V LVCMOS" +set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED WITH BUS-HOLD" +set_global_assignment -name ENABLE_DEVICE_WIDE_RESET "OFF" +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_D +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_L +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_R +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_U +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_ROT_B +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_SEL +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_ROT_A +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[15] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[14] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[13] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[12] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[11] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[10] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[9] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[8] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[7] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[6] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[5] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[4] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[3] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[2] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[1] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[0] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_RDX +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_RESETX +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_RS +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_TE +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_WRX +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_ADDR +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[7] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[6] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[5] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[4] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[3] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[2] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[1] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[0] +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_DIR +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_D +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_L +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_R +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_ROT_A +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_ROT_B +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_SEL +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_U +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to TP_D +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to TP_L +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to TP_R +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to TP_U +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_BACKLIGHT +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to AUDIO_RESETX +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_LCD_RDX +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_LCD_WRX +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_IO_STBX +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to TP_R +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to TP_D +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to TP_L +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to TP_U +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_LCD_TE +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_P2_8 +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[15] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[14] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[13] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[12] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[11] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[10] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[9] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[8] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[7] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[6] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[5] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[4] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[3] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[2] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[1] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[0] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[7] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[6] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[5] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[4] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[3] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[2] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[1] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[0] +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_ADDR +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_DIR +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_IO_STBX +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_LCD_RDX +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "OFF" -to MCU_LCD_WRX +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "OFF" -to MCU_P2_8 +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to GPS_TIMEPULSE +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to GPS_TIMEPULSE +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to GPS_TX_READY +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to GPS_TX_READY +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to REF_EN +set_instance_assignment -name SLOW_SLEW_RATE "ON" -to GPS_RESETX +set_instance_assignment -name WEAK_PULL_UP_RESISTOR "OFF" -to SYSOFF +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to AUDIO_RESETX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to DEVICE_RESET +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to DEVICE_RESET_V +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_RESETX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_TIMEPULSE +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_TX_READY +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_BACKLIGHT +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[0] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[10] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[11] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[12] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[13] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[14] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[15] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[1] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[2] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[3] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[4] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[5] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[6] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[7] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[8] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[9] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RDX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RESETX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RS +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_TE +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_WRX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_ADDR +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_DIR +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[0] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[1] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[2] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[3] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[4] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[5] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[6] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[7] +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_IO_STBX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_RDX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_TE +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_WRX +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_P2_8 +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to REF_EN +set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_D +set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_L +set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_R +set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_ROT_A +set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_ROT_B +set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_SEL +set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_U +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to SYSOFF +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_D +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_L +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_R +set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_U +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to AUDIO_RESETX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_RESETX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_TIMEPULSE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_TX_READY +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_BACKLIGHT +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[10] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[11] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[12] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[13] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[14] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[15] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[8] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[9] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RDX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RESETX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RS +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_TE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_WRX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_ADDR +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_DIR +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[0] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[1] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[2] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[3] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[4] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[5] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[6] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[7] +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_IO_STBX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_RDX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_TE +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_WRX +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_P2_8 +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to REF_EN +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_D +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_L +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_R +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_ROT_A +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_ROT_B +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_SEL +set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_U +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SYSOFF +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_D +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_L +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_R +set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_U +set_location_assignment PIN_57 -to AUDIO_RESETX +set_location_assignment PIN_44 -to DEVICE_RESET +set_location_assignment PIN_38 -to DEVICE_RESET_V +set_location_assignment PIN_73 -to GPS_RESETX +set_location_assignment PIN_74 -to GPS_TIMEPULSE +set_location_assignment PIN_75 -to GPS_TX_READY +set_location_assignment PIN_76 -to LCD_BACKLIGHT +set_location_assignment PIN_99 -to LCD_DB[0] +set_location_assignment PIN_87 -to LCD_DB[10] +set_location_assignment PIN_86 -to LCD_DB[11] +set_location_assignment PIN_85 -to LCD_DB[12] +set_location_assignment PIN_84 -to LCD_DB[13] +set_location_assignment PIN_83 -to LCD_DB[14] +set_location_assignment PIN_82 -to LCD_DB[15] +set_location_assignment PIN_98 -to LCD_DB[1] +set_location_assignment PIN_97 -to LCD_DB[2] +set_location_assignment PIN_96 -to LCD_DB[3] +set_location_assignment PIN_95 -to LCD_DB[4] +set_location_assignment PIN_92 -to LCD_DB[5] +set_location_assignment PIN_91 -to LCD_DB[6] +set_location_assignment PIN_90 -to LCD_DB[7] +set_location_assignment PIN_89 -to LCD_DB[8] +set_location_assignment PIN_88 -to LCD_DB[9] +set_location_assignment PIN_1 -to LCD_RDX +set_location_assignment PIN_100 -to LCD_RESETX +set_location_assignment PIN_3 -to LCD_RS +set_location_assignment PIN_4 -to LCD_TE +set_location_assignment PIN_2 -to LCD_WRX +set_location_assignment PIN_42 -to MCU_ADDR +set_location_assignment PIN_72 -to MCU_DIR +set_location_assignment PIN_35 -to MCU_D[0] +set_location_assignment PIN_36 -to MCU_D[1] +set_location_assignment PIN_33 -to MCU_D[2] +set_location_assignment PIN_30 -to MCU_D[3] +set_location_assignment PIN_28 -to MCU_D[4] +set_location_assignment PIN_29 -to MCU_D[5] +set_location_assignment PIN_27 -to MCU_D[6] +set_location_assignment PIN_26 -to MCU_D[7] +set_location_assignment PIN_41 -to MCU_IO_STBX +set_location_assignment PIN_39 -to MCU_LCD_RDX +set_location_assignment PIN_40 -to MCU_LCD_TE +set_location_assignment PIN_71 -to MCU_LCD_WRX +set_location_assignment PIN_43 -to MCU_P2_8 +set_location_assignment PIN_58 -to REF_EN +set_location_assignment PIN_14 -to SW_D +set_location_assignment PIN_37 -to SW_L +set_location_assignment PIN_12 -to SW_R +set_location_assignment PIN_15 -to SW_ROT_A +set_location_assignment PIN_16 -to SW_ROT_B +set_location_assignment PIN_17 -to SW_SEL +set_location_assignment PIN_34 -to SW_U +set_location_assignment PIN_47 -to SYSOFF +set_location_assignment PIN_6 -to TP_D +set_location_assignment PIN_7 -to TP_L +set_location_assignment PIN_5 -to TP_R +set_location_assignment PIN_8 -to TP_U diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.asf b/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.asf new file mode 100644 index 00000000..36e9d5b1 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.asf @@ -0,0 +1,38 @@ +set_instance_assignment -name ENABLE_OPEN_DRAIN -to TP_U~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to TP_L~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to TP_R~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to TP_D~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[1]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[2]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[0]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[6]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[7]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[8]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[0]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[6]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[14]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[15]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[7]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[1]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[5]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[3]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[4]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[2]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[9]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[10]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[13]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[5]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[3]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[4]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[11]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[12]~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_RDX~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_WRX~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_RS~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_LCD_TE~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_RESETX~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to REF_EN~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_BACKLIGHT~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to SYSOFF~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to AUDIO_RESETX~output false +set_instance_assignment -name ENABLE_OPEN_DRAIN -to GPS_RESETX~output false diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.cellmap b/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.cellmap new file mode 100644 index 00000000..c5b6f4af --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.cellmap @@ -0,0 +1,29 @@ +tp_q[3] clken_ctrl_X1_Y15_N0 +tp_q[4] clken_ctrl_X1_Y15_N0 +lcd_backlight_q clken_ctrl_X1_Y15_N1 +tp_q[0] clken_ctrl_X1_Y15_N0 +lcd_reset_q clken_ctrl_X1_Y15_N1 +tp_q[1] clken_ctrl_X1_Y15_N0 +audio_reset_q clken_ctrl_X1_Y15_N1 +tp_q[7] clken_ctrl_X1_Y15_N0 +tp_q[2] clken_ctrl_X1_Y15_N0 +tp_q[5] clken_ctrl_X1_Y15_N0 +ref_en_q clken_ctrl_X1_Y15_N1 +sysoff_q clken_ctrl_X1_Y15_N1 +tp_q[6] clken_ctrl_X1_Y15_N0 +lcd_data_in_q[0] clken_ctrl_X1_Y19_N0 +lcd_data_in_q[6] clken_ctrl_X1_Y19_N0 +lcd_data_out_q[1] clken_ctrl_X1_Y20_N0 +lcd_data_out_q[2] clken_ctrl_X1_Y20_N0 +lcd_data_out_q[6] clken_ctrl_X1_Y20_N0 +lcd_data_out_q[7] clken_ctrl_X1_Y20_N0 +lcd_data_out_q[0] clken_ctrl_X1_Y20_N0 +lcd_data_in_q[7] clken_ctrl_X1_Y21_N0 +lcd_data_in_q[1] clken_ctrl_X1_Y21_N0 +lcd_data_in_q[2] clken_ctrl_X1_Y24_N0 +lcd_data_in_q[4] clken_ctrl_X1_Y26_N0 +lcd_data_out_q[4] clken_ctrl_X1_Y26_N1 +lcd_data_out_q[3] clken_ctrl_X1_Y26_N1 +lcd_data_out_q[5] clken_ctrl_X1_Y26_N1 +lcd_data_in_q[3] clken_ctrl_X1_Y26_N0 +lcd_data_in_q[5] clken_ctrl_X1_Y26_N0 diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.pinmap b/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.pinmap new file mode 100644 index 00000000..9a3d413a --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/alta_db/alta.pinmap @@ -0,0 +1,859 @@ +SW_L~input|datain SW_L~input|datain +SW_L~input|oe SW_L~input|oe +SW_L~input|outclk SW_L~input|outclk +SW_L~input|outclkena SW_L~input|outclkena +SW_L~input|inclk SW_L~input|inclk +SW_L~input|inclkena SW_L~input|inclkena +SW_L~input|areset SW_L~input|areset +SW_L~input|sreset SW_L~input|sreset +SW_L~input|combout SW_L~input|combout +SW_L~input|padio SW_L~input|padio +SW_R~input|datain SW_R~input|datain +SW_R~input|oe SW_R~input|oe +SW_R~input|outclk SW_R~input|outclk +SW_R~input|outclkena SW_R~input|outclkena +SW_R~input|inclk SW_R~input|inclk +SW_R~input|inclkena SW_R~input|inclkena +SW_R~input|areset SW_R~input|areset +SW_R~input|sreset SW_R~input|sreset +SW_R~input|combout SW_R~input|combout +SW_R~input|padio SW_R~input|padio +TP_U~output|datain TP_U~output|datain +TP_U~output|oe TP_U~output|oe +TP_U~output|outclk TP_U~output|outclk +TP_U~output|outclkena TP_U~output|outclkena +TP_U~output|inclk TP_U~output|inclk +TP_U~output|inclkena TP_U~output|inclkena +TP_U~output|areset TP_U~output|areset +TP_U~output|sreset TP_U~output|sreset +TP_U~output|padio TP_U~output|padio +TP_L~output|datain TP_L~output|datain +TP_L~output|oe TP_L~output|oe +TP_L~output|outclk TP_L~output|outclk +TP_L~output|outclkena TP_L~output|outclkena +TP_L~output|inclk TP_L~output|inclk +TP_L~output|inclkena TP_L~output|inclkena +TP_L~output|areset TP_L~output|areset +TP_L~output|sreset TP_L~output|sreset +TP_L~output|padio TP_L~output|padio +SW_ROT_B~input|datain SW_ROT_B~input|datain +SW_ROT_B~input|oe SW_ROT_B~input|oe +SW_ROT_B~input|outclk SW_ROT_B~input|outclk +SW_ROT_B~input|outclkena SW_ROT_B~input|outclkena +SW_ROT_B~input|inclk SW_ROT_B~input|inclk +SW_ROT_B~input|inclkena SW_ROT_B~input|inclkena +SW_ROT_B~input|areset SW_ROT_B~input|areset +SW_ROT_B~input|sreset SW_ROT_B~input|sreset +SW_ROT_B~input|combout SW_ROT_B~input|combout +SW_ROT_B~input|padio SW_ROT_B~input|padio +TP_R~output|datain TP_R~output|datain +TP_R~output|oe TP_R~output|oe +TP_R~output|outclk TP_R~output|outclk +TP_R~output|outclkena TP_R~output|outclkena +TP_R~output|inclk TP_R~output|inclk +TP_R~output|inclkena TP_R~output|inclkena +TP_R~output|areset TP_R~output|areset +TP_R~output|sreset TP_R~output|sreset +TP_R~output|padio TP_R~output|padio +TP_D~output|datain TP_D~output|datain +TP_D~output|oe TP_D~output|oe +TP_D~output|outclk TP_D~output|outclk +TP_D~output|outclkena TP_D~output|outclkena +TP_D~output|inclk TP_D~output|inclk +TP_D~output|inclkena TP_D~output|inclkena +TP_D~output|areset TP_D~output|areset +TP_D~output|sreset TP_D~output|sreset +TP_D~output|padio TP_D~output|padio +MCU_D[1]~output|datain MCU_D[1]~output|datain +MCU_D[1]~output|oe MCU_D[1]~output|oe +MCU_D[1]~output|outclk MCU_D[1]~output|outclk +MCU_D[1]~output|outclkena MCU_D[1]~output|outclkena +MCU_D[1]~output|inclk MCU_D[1]~output|inclk +MCU_D[1]~output|inclkena MCU_D[1]~output|inclkena +MCU_D[1]~output|areset MCU_D[1]~output|areset +MCU_D[1]~output|sreset MCU_D[1]~output|sreset +MCU_D[1]~output|combout MCU_D[1]~output|combout +MCU_D[1]~output|padio MCU_D[1]~output|padio +MCU_D[2]~output|datain MCU_D[2]~output|datain +MCU_D[2]~output|oe MCU_D[2]~output|oe +MCU_D[2]~output|outclk MCU_D[2]~output|outclk +MCU_D[2]~output|outclkena MCU_D[2]~output|outclkena +MCU_D[2]~output|inclk MCU_D[2]~output|inclk +MCU_D[2]~output|inclkena MCU_D[2]~output|inclkena +MCU_D[2]~output|areset MCU_D[2]~output|areset +MCU_D[2]~output|sreset MCU_D[2]~output|sreset +MCU_D[2]~output|combout MCU_D[2]~output|combout +MCU_D[2]~output|padio MCU_D[2]~output|padio +MCU_DIR~input|datain MCU_DIR~input|datain +MCU_DIR~input|oe MCU_DIR~input|oe +MCU_DIR~input|outclk MCU_DIR~input|outclk +MCU_DIR~input|outclkena MCU_DIR~input|outclkena +MCU_DIR~input|inclk MCU_DIR~input|inclk +MCU_DIR~input|inclkena MCU_DIR~input|inclkena +MCU_DIR~input|areset MCU_DIR~input|areset +MCU_DIR~input|sreset MCU_DIR~input|sreset +MCU_DIR~input|combout MCU_DIR~input|combout +MCU_DIR~input|padio MCU_DIR~input|padio +MCU_D[0]~output|datain MCU_D[0]~output|datain +MCU_D[0]~output|oe MCU_D[0]~output|oe +MCU_D[0]~output|outclk MCU_D[0]~output|outclk +MCU_D[0]~output|outclkena MCU_D[0]~output|outclkena +MCU_D[0]~output|inclk MCU_D[0]~output|inclk +MCU_D[0]~output|inclkena MCU_D[0]~output|inclkena +MCU_D[0]~output|areset MCU_D[0]~output|areset +MCU_D[0]~output|sreset MCU_D[0]~output|sreset +MCU_D[0]~output|combout MCU_D[0]~output|combout +MCU_D[0]~output|padio MCU_D[0]~output|padio +MCU_D[6]~output|datain MCU_D[6]~output|datain +MCU_D[6]~output|oe MCU_D[6]~output|oe +MCU_D[6]~output|outclk MCU_D[6]~output|outclk +MCU_D[6]~output|outclkena MCU_D[6]~output|outclkena +MCU_D[6]~output|inclk MCU_D[6]~output|inclk +MCU_D[6]~output|inclkena MCU_D[6]~output|inclkena +MCU_D[6]~output|areset MCU_D[6]~output|areset +MCU_D[6]~output|sreset MCU_D[6]~output|sreset +MCU_D[6]~output|combout MCU_D[6]~output|combout +MCU_D[6]~output|padio MCU_D[6]~output|padio +MCU_D[7]~output|datain MCU_D[7]~output|datain +MCU_D[7]~output|oe MCU_D[7]~output|oe +MCU_D[7]~output|outclk MCU_D[7]~output|outclk +MCU_D[7]~output|outclkena MCU_D[7]~output|outclkena +MCU_D[7]~output|inclk MCU_D[7]~output|inclk +MCU_D[7]~output|inclkena MCU_D[7]~output|inclkena +MCU_D[7]~output|areset MCU_D[7]~output|areset +MCU_D[7]~output|sreset MCU_D[7]~output|sreset +MCU_D[7]~output|combout MCU_D[7]~output|combout +MCU_D[7]~output|padio MCU_D[7]~output|padio +LCD_DB[8]~output|datain LCD_DB[8]~output|datain +LCD_DB[8]~output|oe LCD_DB[8]~output|oe +LCD_DB[8]~output|outclk LCD_DB[8]~output|outclk +LCD_DB[8]~output|outclkena LCD_DB[8]~output|outclkena +LCD_DB[8]~output|inclk LCD_DB[8]~output|inclk +LCD_DB[8]~output|inclkena LCD_DB[8]~output|inclkena +LCD_DB[8]~output|areset LCD_DB[8]~output|areset +LCD_DB[8]~output|sreset LCD_DB[8]~output|sreset +LCD_DB[8]~output|combout LCD_DB[8]~output|combout +LCD_DB[8]~output|padio LCD_DB[8]~output|padio +LCD_DB[0]~output|datain LCD_DB[0]~output|datain +LCD_DB[0]~output|oe LCD_DB[0]~output|oe +LCD_DB[0]~output|outclk LCD_DB[0]~output|outclk +LCD_DB[0]~output|outclkena LCD_DB[0]~output|outclkena +LCD_DB[0]~output|inclk LCD_DB[0]~output|inclk +LCD_DB[0]~output|inclkena LCD_DB[0]~output|inclkena +LCD_DB[0]~output|areset LCD_DB[0]~output|areset +LCD_DB[0]~output|sreset LCD_DB[0]~output|sreset +LCD_DB[0]~output|combout LCD_DB[0]~output|combout +LCD_DB[0]~output|padio LCD_DB[0]~output|padio +LCD_DB[6]~output|datain LCD_DB[6]~output|datain +LCD_DB[6]~output|oe LCD_DB[6]~output|oe +LCD_DB[6]~output|outclk LCD_DB[6]~output|outclk +LCD_DB[6]~output|outclkena LCD_DB[6]~output|outclkena +LCD_DB[6]~output|inclk LCD_DB[6]~output|inclk +LCD_DB[6]~output|inclkena LCD_DB[6]~output|inclkena +LCD_DB[6]~output|areset LCD_DB[6]~output|areset +LCD_DB[6]~output|sreset LCD_DB[6]~output|sreset +LCD_DB[6]~output|combout LCD_DB[6]~output|combout +LCD_DB[6]~output|padio LCD_DB[6]~output|padio +LCD_DB[14]~output|datain LCD_DB[14]~output|datain +LCD_DB[14]~output|oe LCD_DB[14]~output|oe +LCD_DB[14]~output|outclk LCD_DB[14]~output|outclk +LCD_DB[14]~output|outclkena LCD_DB[14]~output|outclkena +LCD_DB[14]~output|inclk LCD_DB[14]~output|inclk +LCD_DB[14]~output|inclkena LCD_DB[14]~output|inclkena +LCD_DB[14]~output|areset LCD_DB[14]~output|areset +LCD_DB[14]~output|sreset LCD_DB[14]~output|sreset +LCD_DB[14]~output|combout LCD_DB[14]~output|combout +LCD_DB[14]~output|padio LCD_DB[14]~output|padio +LCD_DB[15]~output|datain LCD_DB[15]~output|datain +LCD_DB[15]~output|oe LCD_DB[15]~output|oe +LCD_DB[15]~output|outclk LCD_DB[15]~output|outclk +LCD_DB[15]~output|outclkena LCD_DB[15]~output|outclkena +LCD_DB[15]~output|inclk LCD_DB[15]~output|inclk +LCD_DB[15]~output|inclkena LCD_DB[15]~output|inclkena +LCD_DB[15]~output|areset LCD_DB[15]~output|areset +LCD_DB[15]~output|sreset LCD_DB[15]~output|sreset +LCD_DB[15]~output|combout LCD_DB[15]~output|combout +LCD_DB[15]~output|padio LCD_DB[15]~output|padio +LCD_DB[7]~output|datain LCD_DB[7]~output|datain +LCD_DB[7]~output|oe LCD_DB[7]~output|oe +LCD_DB[7]~output|outclk LCD_DB[7]~output|outclk +LCD_DB[7]~output|outclkena LCD_DB[7]~output|outclkena +LCD_DB[7]~output|inclk LCD_DB[7]~output|inclk +LCD_DB[7]~output|inclkena LCD_DB[7]~output|inclkena +LCD_DB[7]~output|areset LCD_DB[7]~output|areset +LCD_DB[7]~output|sreset LCD_DB[7]~output|sreset +LCD_DB[7]~output|combout LCD_DB[7]~output|combout +LCD_DB[7]~output|padio LCD_DB[7]~output|padio +LCD_DB[1]~output|datain LCD_DB[1]~output|datain +LCD_DB[1]~output|oe LCD_DB[1]~output|oe +LCD_DB[1]~output|outclk LCD_DB[1]~output|outclk +LCD_DB[1]~output|outclkena LCD_DB[1]~output|outclkena +LCD_DB[1]~output|inclk LCD_DB[1]~output|inclk +LCD_DB[1]~output|inclkena LCD_DB[1]~output|inclkena +LCD_DB[1]~output|areset LCD_DB[1]~output|areset +LCD_DB[1]~output|sreset LCD_DB[1]~output|sreset +LCD_DB[1]~output|combout LCD_DB[1]~output|combout +LCD_DB[1]~output|padio LCD_DB[1]~output|padio +MCU_D[5]~output|datain MCU_D[5]~output|datain +MCU_D[5]~output|oe MCU_D[5]~output|oe +MCU_D[5]~output|outclk MCU_D[5]~output|outclk +MCU_D[5]~output|outclkena MCU_D[5]~output|outclkena +MCU_D[5]~output|inclk MCU_D[5]~output|inclk +MCU_D[5]~output|inclkena MCU_D[5]~output|inclkena +MCU_D[5]~output|areset MCU_D[5]~output|areset +MCU_D[5]~output|sreset MCU_D[5]~output|sreset +MCU_D[5]~output|combout MCU_D[5]~output|combout +MCU_D[5]~output|padio MCU_D[5]~output|padio +MCU_D[3]~output|datain MCU_D[3]~output|datain +MCU_D[3]~output|oe MCU_D[3]~output|oe +MCU_D[3]~output|outclk MCU_D[3]~output|outclk +MCU_D[3]~output|outclkena MCU_D[3]~output|outclkena +MCU_D[3]~output|inclk MCU_D[3]~output|inclk +MCU_D[3]~output|inclkena MCU_D[3]~output|inclkena +MCU_D[3]~output|areset MCU_D[3]~output|areset +MCU_D[3]~output|sreset MCU_D[3]~output|sreset +MCU_D[3]~output|combout MCU_D[3]~output|combout +MCU_D[3]~output|padio MCU_D[3]~output|padio +MCU_D[4]~output|datain MCU_D[4]~output|datain +MCU_D[4]~output|oe MCU_D[4]~output|oe +MCU_D[4]~output|outclk MCU_D[4]~output|outclk +MCU_D[4]~output|outclkena MCU_D[4]~output|outclkena +MCU_D[4]~output|inclk MCU_D[4]~output|inclk +MCU_D[4]~output|inclkena MCU_D[4]~output|inclkena +MCU_D[4]~output|areset MCU_D[4]~output|areset +MCU_D[4]~output|sreset MCU_D[4]~output|sreset +MCU_D[4]~output|combout MCU_D[4]~output|combout +MCU_D[4]~output|padio MCU_D[4]~output|padio +LCD_DB[2]~output|datain LCD_DB[2]~output|datain +LCD_DB[2]~output|oe LCD_DB[2]~output|oe +LCD_DB[2]~output|outclk LCD_DB[2]~output|outclk +LCD_DB[2]~output|outclkena LCD_DB[2]~output|outclkena +LCD_DB[2]~output|inclk LCD_DB[2]~output|inclk +LCD_DB[2]~output|inclkena LCD_DB[2]~output|inclkena +LCD_DB[2]~output|areset LCD_DB[2]~output|areset +LCD_DB[2]~output|sreset LCD_DB[2]~output|sreset +LCD_DB[2]~output|combout LCD_DB[2]~output|combout +LCD_DB[2]~output|padio LCD_DB[2]~output|padio +LCD_DB[9]~output|datain LCD_DB[9]~output|datain +LCD_DB[9]~output|oe LCD_DB[9]~output|oe +LCD_DB[9]~output|outclk LCD_DB[9]~output|outclk +LCD_DB[9]~output|outclkena LCD_DB[9]~output|outclkena +LCD_DB[9]~output|inclk LCD_DB[9]~output|inclk +LCD_DB[9]~output|inclkena LCD_DB[9]~output|inclkena +LCD_DB[9]~output|areset LCD_DB[9]~output|areset +LCD_DB[9]~output|sreset LCD_DB[9]~output|sreset +LCD_DB[9]~output|combout LCD_DB[9]~output|combout +LCD_DB[9]~output|padio LCD_DB[9]~output|padio +LCD_DB[10]~output|datain LCD_DB[10]~output|datain +LCD_DB[10]~output|oe LCD_DB[10]~output|oe +LCD_DB[10]~output|outclk LCD_DB[10]~output|outclk +LCD_DB[10]~output|outclkena LCD_DB[10]~output|outclkena +LCD_DB[10]~output|inclk LCD_DB[10]~output|inclk +LCD_DB[10]~output|inclkena LCD_DB[10]~output|inclkena +LCD_DB[10]~output|areset LCD_DB[10]~output|areset +LCD_DB[10]~output|sreset LCD_DB[10]~output|sreset +LCD_DB[10]~output|combout LCD_DB[10]~output|combout +LCD_DB[10]~output|padio LCD_DB[10]~output|padio +SW_D~input|datain SW_D~input|datain +SW_D~input|oe SW_D~input|oe +SW_D~input|outclk SW_D~input|outclk +SW_D~input|outclkena SW_D~input|outclkena +SW_D~input|inclk SW_D~input|inclk +SW_D~input|inclkena SW_D~input|inclkena +SW_D~input|areset SW_D~input|areset +SW_D~input|sreset SW_D~input|sreset +SW_D~input|combout SW_D~input|combout +SW_D~input|padio SW_D~input|padio +LCD_DB[13]~output|datain LCD_DB[13]~output|datain +LCD_DB[13]~output|oe LCD_DB[13]~output|oe +LCD_DB[13]~output|outclk LCD_DB[13]~output|outclk +LCD_DB[13]~output|outclkena LCD_DB[13]~output|outclkena +LCD_DB[13]~output|inclk LCD_DB[13]~output|inclk +LCD_DB[13]~output|inclkena LCD_DB[13]~output|inclkena +LCD_DB[13]~output|areset LCD_DB[13]~output|areset +LCD_DB[13]~output|sreset LCD_DB[13]~output|sreset +LCD_DB[13]~output|combout LCD_DB[13]~output|combout +LCD_DB[13]~output|padio LCD_DB[13]~output|padio +LCD_DB[5]~output|datain LCD_DB[5]~output|datain +LCD_DB[5]~output|oe LCD_DB[5]~output|oe +LCD_DB[5]~output|outclk LCD_DB[5]~output|outclk +LCD_DB[5]~output|outclkena LCD_DB[5]~output|outclkena +LCD_DB[5]~output|inclk LCD_DB[5]~output|inclk +LCD_DB[5]~output|inclkena LCD_DB[5]~output|inclkena +LCD_DB[5]~output|areset LCD_DB[5]~output|areset +LCD_DB[5]~output|sreset LCD_DB[5]~output|sreset +LCD_DB[5]~output|combout LCD_DB[5]~output|combout +LCD_DB[5]~output|padio LCD_DB[5]~output|padio +LCD_DB[3]~output|datain LCD_DB[3]~output|datain +LCD_DB[3]~output|oe LCD_DB[3]~output|oe +LCD_DB[3]~output|outclk LCD_DB[3]~output|outclk +LCD_DB[3]~output|outclkena LCD_DB[3]~output|outclkena +LCD_DB[3]~output|inclk LCD_DB[3]~output|inclk +LCD_DB[3]~output|inclkena LCD_DB[3]~output|inclkena +LCD_DB[3]~output|areset LCD_DB[3]~output|areset +LCD_DB[3]~output|sreset LCD_DB[3]~output|sreset +LCD_DB[3]~output|combout LCD_DB[3]~output|combout +LCD_DB[3]~output|padio LCD_DB[3]~output|padio +LCD_DB[4]~output|datain LCD_DB[4]~output|datain +LCD_DB[4]~output|oe LCD_DB[4]~output|oe +LCD_DB[4]~output|outclk LCD_DB[4]~output|outclk +LCD_DB[4]~output|outclkena LCD_DB[4]~output|outclkena +LCD_DB[4]~output|inclk LCD_DB[4]~output|inclk +LCD_DB[4]~output|inclkena LCD_DB[4]~output|inclkena +LCD_DB[4]~output|areset LCD_DB[4]~output|areset +LCD_DB[4]~output|sreset LCD_DB[4]~output|sreset +LCD_DB[4]~output|combout LCD_DB[4]~output|combout +LCD_DB[4]~output|padio LCD_DB[4]~output|padio +SW_ROT_A~input|datain SW_ROT_A~input|datain +SW_ROT_A~input|oe SW_ROT_A~input|oe +SW_ROT_A~input|outclk SW_ROT_A~input|outclk +SW_ROT_A~input|outclkena SW_ROT_A~input|outclkena +SW_ROT_A~input|inclk SW_ROT_A~input|inclk +SW_ROT_A~input|inclkena SW_ROT_A~input|inclkena +SW_ROT_A~input|areset SW_ROT_A~input|areset +SW_ROT_A~input|sreset SW_ROT_A~input|sreset +SW_ROT_A~input|combout SW_ROT_A~input|combout +SW_ROT_A~input|padio SW_ROT_A~input|padio +SW_U~input|datain SW_U~input|datain +SW_U~input|oe SW_U~input|oe +SW_U~input|outclk SW_U~input|outclk +SW_U~input|outclkena SW_U~input|outclkena +SW_U~input|inclk SW_U~input|inclk +SW_U~input|inclkena SW_U~input|inclkena +SW_U~input|areset SW_U~input|areset +SW_U~input|sreset SW_U~input|sreset +SW_U~input|combout SW_U~input|combout +SW_U~input|padio SW_U~input|padio +LCD_DB[11]~output|datain LCD_DB[11]~output|datain +LCD_DB[11]~output|oe LCD_DB[11]~output|oe +LCD_DB[11]~output|outclk LCD_DB[11]~output|outclk +LCD_DB[11]~output|outclkena LCD_DB[11]~output|outclkena +LCD_DB[11]~output|inclk LCD_DB[11]~output|inclk +LCD_DB[11]~output|inclkena LCD_DB[11]~output|inclkena +LCD_DB[11]~output|areset LCD_DB[11]~output|areset +LCD_DB[11]~output|sreset LCD_DB[11]~output|sreset +LCD_DB[11]~output|combout LCD_DB[11]~output|combout +LCD_DB[11]~output|padio LCD_DB[11]~output|padio +LCD_DB[12]~output|datain LCD_DB[12]~output|datain +LCD_DB[12]~output|oe LCD_DB[12]~output|oe +LCD_DB[12]~output|outclk LCD_DB[12]~output|outclk +LCD_DB[12]~output|outclkena LCD_DB[12]~output|outclkena +LCD_DB[12]~output|inclk LCD_DB[12]~output|inclk +LCD_DB[12]~output|inclkena LCD_DB[12]~output|inclkena +LCD_DB[12]~output|areset LCD_DB[12]~output|areset +LCD_DB[12]~output|sreset LCD_DB[12]~output|sreset +LCD_DB[12]~output|combout LCD_DB[12]~output|combout +LCD_DB[12]~output|padio LCD_DB[12]~output|padio +LCD_RDX~output|datain LCD_RDX~output|datain +LCD_RDX~output|oe LCD_RDX~output|oe +LCD_RDX~output|outclk LCD_RDX~output|outclk +LCD_RDX~output|outclkena LCD_RDX~output|outclkena +LCD_RDX~output|inclk LCD_RDX~output|inclk +LCD_RDX~output|inclkena LCD_RDX~output|inclkena +LCD_RDX~output|areset LCD_RDX~output|areset +LCD_RDX~output|sreset LCD_RDX~output|sreset +LCD_RDX~output|padio LCD_RDX~output|padio +SW_SEL~input|datain SW_SEL~input|datain +SW_SEL~input|oe SW_SEL~input|oe +SW_SEL~input|outclk SW_SEL~input|outclk +SW_SEL~input|outclkena SW_SEL~input|outclkena +SW_SEL~input|inclk SW_SEL~input|inclk +SW_SEL~input|inclkena SW_SEL~input|inclkena +SW_SEL~input|areset SW_SEL~input|areset +SW_SEL~input|sreset SW_SEL~input|sreset +SW_SEL~input|combout SW_SEL~input|combout +SW_SEL~input|padio SW_SEL~input|padio +MCU_IO_STBX~input|datain MCU_IO_STBX~input|datain +MCU_IO_STBX~input|oe MCU_IO_STBX~input|oe +MCU_IO_STBX~input|outclk MCU_IO_STBX~input|outclk +MCU_IO_STBX~input|outclkena MCU_IO_STBX~input|outclkena +MCU_IO_STBX~input|inclk MCU_IO_STBX~input|inclk +MCU_IO_STBX~input|inclkena MCU_IO_STBX~input|inclkena +MCU_IO_STBX~input|areset MCU_IO_STBX~input|areset +MCU_IO_STBX~input|sreset MCU_IO_STBX~input|sreset +MCU_IO_STBX~input|combout MCU_IO_STBX~input|combout +MCU_IO_STBX~input|padio MCU_IO_STBX~input|padio +MCU_LCD_RDX~input|datain MCU_LCD_RDX~input|datain +MCU_LCD_RDX~input|oe MCU_LCD_RDX~input|oe +MCU_LCD_RDX~input|outclk MCU_LCD_RDX~input|outclk +MCU_LCD_RDX~input|outclkena MCU_LCD_RDX~input|outclkena +MCU_LCD_RDX~input|inclk MCU_LCD_RDX~input|inclk +MCU_LCD_RDX~input|inclkena MCU_LCD_RDX~input|inclkena +MCU_LCD_RDX~input|areset MCU_LCD_RDX~input|areset +MCU_LCD_RDX~input|sreset MCU_LCD_RDX~input|sreset +MCU_LCD_RDX~input|combout MCU_LCD_RDX~input|combout +MCU_LCD_RDX~input|padio MCU_LCD_RDX~input|padio +MCU_LCD_WRX~input|datain MCU_LCD_WRX~input|datain +MCU_LCD_WRX~input|oe MCU_LCD_WRX~input|oe +MCU_LCD_WRX~input|outclk MCU_LCD_WRX~input|outclk +MCU_LCD_WRX~input|outclkena MCU_LCD_WRX~input|outclkena +MCU_LCD_WRX~input|inclk MCU_LCD_WRX~input|inclk +MCU_LCD_WRX~input|inclkena MCU_LCD_WRX~input|inclkena +MCU_LCD_WRX~input|areset MCU_LCD_WRX~input|areset +MCU_LCD_WRX~input|sreset MCU_LCD_WRX~input|sreset +MCU_LCD_WRX~input|combout MCU_LCD_WRX~input|combout +MCU_LCD_WRX~input|padio MCU_LCD_WRX~input|padio +LCD_WRX~output|datain LCD_WRX~output|datain +LCD_WRX~output|oe LCD_WRX~output|oe +LCD_WRX~output|outclk LCD_WRX~output|outclk +LCD_WRX~output|outclkena LCD_WRX~output|outclkena +LCD_WRX~output|inclk LCD_WRX~output|inclk +LCD_WRX~output|inclkena LCD_WRX~output|inclkena +LCD_WRX~output|areset LCD_WRX~output|areset +LCD_WRX~output|sreset LCD_WRX~output|sreset +LCD_WRX~output|padio LCD_WRX~output|padio +LCD_RS~output|datain LCD_RS~output|datain +LCD_RS~output|oe LCD_RS~output|oe +LCD_RS~output|outclk LCD_RS~output|outclk +LCD_RS~output|outclkena LCD_RS~output|outclkena +LCD_RS~output|inclk LCD_RS~output|inclk +LCD_RS~output|inclkena LCD_RS~output|inclkena +LCD_RS~output|areset LCD_RS~output|areset +LCD_RS~output|sreset LCD_RS~output|sreset +LCD_RS~output|padio LCD_RS~output|padio +MCU_ADDR~input|datain MCU_ADDR~input|datain +MCU_ADDR~input|oe MCU_ADDR~input|oe +MCU_ADDR~input|outclk MCU_ADDR~input|outclk +MCU_ADDR~input|outclkena MCU_ADDR~input|outclkena +MCU_ADDR~input|inclk MCU_ADDR~input|inclk +MCU_ADDR~input|inclkena MCU_ADDR~input|inclkena +MCU_ADDR~input|areset MCU_ADDR~input|areset +MCU_ADDR~input|sreset MCU_ADDR~input|sreset +MCU_ADDR~input|combout MCU_ADDR~input|combout +MCU_ADDR~input|padio MCU_ADDR~input|padio +MCU_LCD_TE~output|datain MCU_LCD_TE~output|datain +MCU_LCD_TE~output|oe MCU_LCD_TE~output|oe +MCU_LCD_TE~output|outclk MCU_LCD_TE~output|outclk +MCU_LCD_TE~output|outclkena MCU_LCD_TE~output|outclkena +MCU_LCD_TE~output|inclk MCU_LCD_TE~output|inclk +MCU_LCD_TE~output|inclkena MCU_LCD_TE~output|inclkena +MCU_LCD_TE~output|areset MCU_LCD_TE~output|areset +MCU_LCD_TE~output|sreset MCU_LCD_TE~output|sreset +MCU_LCD_TE~output|padio MCU_LCD_TE~output|padio +LCD_TE~input|datain LCD_TE~input|datain +LCD_TE~input|oe LCD_TE~input|oe +LCD_TE~input|outclk LCD_TE~input|outclk +LCD_TE~input|outclkena LCD_TE~input|outclkena +LCD_TE~input|inclk LCD_TE~input|inclk +LCD_TE~input|inclkena LCD_TE~input|inclkena +LCD_TE~input|areset LCD_TE~input|areset +LCD_TE~input|sreset LCD_TE~input|sreset +LCD_TE~input|combout LCD_TE~input|combout +LCD_TE~input|padio LCD_TE~input|padio +LCD_RESETX~output|datain LCD_RESETX~output|datain +LCD_RESETX~output|oe LCD_RESETX~output|oe +LCD_RESETX~output|outclk LCD_RESETX~output|outclk +LCD_RESETX~output|outclkena LCD_RESETX~output|outclkena +LCD_RESETX~output|inclk LCD_RESETX~output|inclk +LCD_RESETX~output|inclkena LCD_RESETX~output|inclkena +LCD_RESETX~output|areset LCD_RESETX~output|areset +LCD_RESETX~output|sreset LCD_RESETX~output|sreset +LCD_RESETX~output|padio LCD_RESETX~output|padio +REF_EN~output|datain REF_EN~output|datain +REF_EN~output|oe REF_EN~output|oe +REF_EN~output|outclk REF_EN~output|outclk +REF_EN~output|outclkena REF_EN~output|outclkena +REF_EN~output|inclk REF_EN~output|inclk +REF_EN~output|inclkena REF_EN~output|inclkena +REF_EN~output|areset REF_EN~output|areset +REF_EN~output|sreset REF_EN~output|sreset +REF_EN~output|padio REF_EN~output|padio +LCD_BACKLIGHT~output|datain LCD_BACKLIGHT~output|datain +LCD_BACKLIGHT~output|oe LCD_BACKLIGHT~output|oe +LCD_BACKLIGHT~output|outclk LCD_BACKLIGHT~output|outclk +LCD_BACKLIGHT~output|outclkena LCD_BACKLIGHT~output|outclkena +LCD_BACKLIGHT~output|inclk LCD_BACKLIGHT~output|inclk +LCD_BACKLIGHT~output|inclkena LCD_BACKLIGHT~output|inclkena +LCD_BACKLIGHT~output|areset LCD_BACKLIGHT~output|areset +LCD_BACKLIGHT~output|sreset LCD_BACKLIGHT~output|sreset +LCD_BACKLIGHT~output|padio LCD_BACKLIGHT~output|padio +SYSOFF~output|datain SYSOFF~output|datain +SYSOFF~output|oe SYSOFF~output|oe +SYSOFF~output|outclk SYSOFF~output|outclk +SYSOFF~output|outclkena SYSOFF~output|outclkena +SYSOFF~output|inclk SYSOFF~output|inclk +SYSOFF~output|inclkena SYSOFF~output|inclkena +SYSOFF~output|areset SYSOFF~output|areset +SYSOFF~output|sreset SYSOFF~output|sreset +SYSOFF~output|padio SYSOFF~output|padio +AUDIO_RESETX~output|datain AUDIO_RESETX~output|datain +AUDIO_RESETX~output|oe AUDIO_RESETX~output|oe +AUDIO_RESETX~output|outclk AUDIO_RESETX~output|outclk +AUDIO_RESETX~output|outclkena AUDIO_RESETX~output|outclkena +AUDIO_RESETX~output|inclk AUDIO_RESETX~output|inclk +AUDIO_RESETX~output|inclkena AUDIO_RESETX~output|inclkena +AUDIO_RESETX~output|areset AUDIO_RESETX~output|areset +AUDIO_RESETX~output|sreset AUDIO_RESETX~output|sreset +AUDIO_RESETX~output|padio AUDIO_RESETX~output|padio +MCU_P2_8~input|datain MCU_P2_8~input|datain +MCU_P2_8~input|oe MCU_P2_8~input|oe +MCU_P2_8~input|outclk MCU_P2_8~input|outclk +MCU_P2_8~input|outclkena MCU_P2_8~input|outclkena +MCU_P2_8~input|inclk MCU_P2_8~input|inclk +MCU_P2_8~input|inclkena MCU_P2_8~input|inclkena +MCU_P2_8~input|areset MCU_P2_8~input|areset +MCU_P2_8~input|sreset MCU_P2_8~input|sreset +MCU_P2_8~input|combout MCU_P2_8~input|combout +MCU_P2_8~input|padio MCU_P2_8~input|padio +GPS_TX_READY~input|datain GPS_TX_READY~input|datain +GPS_TX_READY~input|oe GPS_TX_READY~input|oe +GPS_TX_READY~input|outclk GPS_TX_READY~input|outclk +GPS_TX_READY~input|outclkena GPS_TX_READY~input|outclkena +GPS_TX_READY~input|inclk GPS_TX_READY~input|inclk +GPS_TX_READY~input|inclkena GPS_TX_READY~input|inclkena +GPS_TX_READY~input|areset GPS_TX_READY~input|areset +GPS_TX_READY~input|sreset GPS_TX_READY~input|sreset +GPS_TX_READY~input|combout GPS_TX_READY~input|combout +GPS_TX_READY~input|padio GPS_TX_READY~input|padio +DEVICE_RESET~input|datain DEVICE_RESET~input|datain +DEVICE_RESET~input|oe DEVICE_RESET~input|oe +DEVICE_RESET~input|outclk DEVICE_RESET~input|outclk +DEVICE_RESET~input|outclkena DEVICE_RESET~input|outclkena +DEVICE_RESET~input|inclk DEVICE_RESET~input|inclk +DEVICE_RESET~input|inclkena DEVICE_RESET~input|inclkena +DEVICE_RESET~input|areset DEVICE_RESET~input|areset +DEVICE_RESET~input|sreset DEVICE_RESET~input|sreset +DEVICE_RESET~input|combout DEVICE_RESET~input|combout +DEVICE_RESET~input|padio DEVICE_RESET~input|padio +GPS_TIMEPULSE~input|datain GPS_TIMEPULSE~input|datain +GPS_TIMEPULSE~input|oe GPS_TIMEPULSE~input|oe +GPS_TIMEPULSE~input|outclk GPS_TIMEPULSE~input|outclk +GPS_TIMEPULSE~input|outclkena GPS_TIMEPULSE~input|outclkena +GPS_TIMEPULSE~input|inclk GPS_TIMEPULSE~input|inclk +GPS_TIMEPULSE~input|inclkena GPS_TIMEPULSE~input|inclkena +GPS_TIMEPULSE~input|areset GPS_TIMEPULSE~input|areset +GPS_TIMEPULSE~input|sreset GPS_TIMEPULSE~input|sreset +GPS_TIMEPULSE~input|combout GPS_TIMEPULSE~input|combout +GPS_TIMEPULSE~input|padio GPS_TIMEPULSE~input|padio +DEVICE_RESET_V~input|datain DEVICE_RESET_V~input|datain +DEVICE_RESET_V~input|oe DEVICE_RESET_V~input|oe +DEVICE_RESET_V~input|outclk DEVICE_RESET_V~input|outclk +DEVICE_RESET_V~input|outclkena DEVICE_RESET_V~input|outclkena +DEVICE_RESET_V~input|inclk DEVICE_RESET_V~input|inclk +DEVICE_RESET_V~input|inclkena DEVICE_RESET_V~input|inclkena +DEVICE_RESET_V~input|areset DEVICE_RESET_V~input|areset +DEVICE_RESET_V~input|sreset DEVICE_RESET_V~input|sreset +DEVICE_RESET_V~input|combout DEVICE_RESET_V~input|combout +DEVICE_RESET_V~input|padio DEVICE_RESET_V~input|padio +GPS_RESETX~output|datain GPS_RESETX~output|datain +GPS_RESETX~output|oe GPS_RESETX~output|oe +GPS_RESETX~output|outclk GPS_RESETX~output|outclk +GPS_RESETX~output|outclkena GPS_RESETX~output|outclkena +GPS_RESETX~output|inclk GPS_RESETX~output|inclk +GPS_RESETX~output|inclkena GPS_RESETX~output|inclkena +GPS_RESETX~output|areset GPS_RESETX~output|areset +GPS_RESETX~output|sreset GPS_RESETX~output|sreset +GPS_RESETX~output|padio GPS_RESETX~output|padio +lcd_reset_q~0|dataa lcd_reset_q~0|A +lcd_reset_q~0|datab lcd_reset_q~0|B +lcd_reset_q~0|datac lcd_reset_q~0|C +lcd_reset_q~0|datad lcd_reset_q~0|D +lcd_reset_q~0|combout lcd_reset_q~0|LutOut +|datac tp_q[3]|C +tp_q[3]|clk tp_q[3]|Clk +tp_q[3]|clrn tp_q[3]|AsyncReset +tp_q[3]|sclr tp_q[3]|SyncReset +tp_q[3]|sload tp_q[3]|SyncLoad +tp_q[3]|q tp_q[3]|Q +tp_q[4]~feeder|dataa tp_q[4]|A +tp_q[4]~feeder|datab tp_q[4]|B +tp_q[4]~feeder|datac tp_q[4]|C +tp_q[4]~feeder|datad tp_q[4]|D +tp_q[4]|clk tp_q[4]|Clk +tp_q[4]|clrn tp_q[4]|AsyncReset +tp_q[4]~feeder|combout tp_q[4]|LutOut +tp_q[4]|q tp_q[4]|Q +lcd_backlight_q~feeder|dataa lcd_backlight_q|A +lcd_backlight_q~feeder|datab lcd_backlight_q|B +lcd_backlight_q~feeder|datac lcd_backlight_q|C +lcd_backlight_q~feeder|datad lcd_backlight_q|D +lcd_backlight_q|clk lcd_backlight_q|Clk +lcd_backlight_q|clrn lcd_backlight_q|AsyncReset +lcd_backlight_q~feeder|combout lcd_backlight_q|LutOut +lcd_backlight_q|q lcd_backlight_q|Q +|datac tp_q[0]|C +tp_q[0]|clk tp_q[0]|Clk +tp_q[0]|clrn tp_q[0]|AsyncReset +tp_q[0]|sclr tp_q[0]|SyncReset +tp_q[0]|sload tp_q[0]|SyncLoad +tp_q[0]|q tp_q[0]|Q +lcd_reset_q~1|dataa lcd_reset_q|A +lcd_reset_q~1|datab lcd_reset_q|B +lcd_reset_q~1|datac lcd_reset_q|C +lcd_reset_q~1|datad lcd_reset_q|D +lcd_reset_q|clk lcd_reset_q|Clk +lcd_reset_q|clrn lcd_reset_q|AsyncReset +lcd_reset_q~1|combout lcd_reset_q|LutOut +lcd_reset_q|q lcd_reset_q|Q +|datac tp_q[1]|C +tp_q[1]|clk tp_q[1]|Clk +tp_q[1]|clrn tp_q[1]|AsyncReset +tp_q[1]|sclr tp_q[1]|SyncReset +tp_q[1]|sload tp_q[1]|SyncLoad +tp_q[1]|q tp_q[1]|Q +audio_reset_q~0|dataa audio_reset_q|A +audio_reset_q~0|datab audio_reset_q|B +audio_reset_q~0|datac audio_reset_q|C +audio_reset_q~0|datad audio_reset_q|D +audio_reset_q|clk audio_reset_q|Clk +audio_reset_q|clrn audio_reset_q|AsyncReset +audio_reset_q~0|combout audio_reset_q|LutOut +audio_reset_q|q audio_reset_q|Q +tp_q[7]~feeder|dataa tp_q[7]|A +tp_q[7]~feeder|datab tp_q[7]|B +tp_q[7]~feeder|datac tp_q[7]|C +tp_q[7]~feeder|datad tp_q[7]|D +tp_q[7]|clk tp_q[7]|Clk +tp_q[7]|clrn tp_q[7]|AsyncReset +tp_q[7]~feeder|combout tp_q[7]|LutOut +tp_q[7]|q tp_q[7]|Q +tp_q[2]~feeder|dataa tp_q[2]|A +tp_q[2]~feeder|datab tp_q[2]|B +tp_q[2]~feeder|datac tp_q[2]|C +tp_q[2]~feeder|datad tp_q[2]|D +tp_q[2]|clk tp_q[2]|Clk +tp_q[2]|clrn tp_q[2]|AsyncReset +tp_q[2]~feeder|combout tp_q[2]|LutOut +tp_q[2]|q tp_q[2]|Q +|datac tp_q[5]|C +tp_q[5]|clk tp_q[5]|Clk +tp_q[5]|clrn tp_q[5]|AsyncReset +tp_q[5]|sclr tp_q[5]|SyncReset +tp_q[5]|sload tp_q[5]|SyncLoad +tp_q[5]|q tp_q[5]|Q +ref_en_q~feeder|dataa ref_en_q|A +ref_en_q~feeder|datab ref_en_q|B +ref_en_q~feeder|datac ref_en_q|C +ref_en_q~feeder|datad ref_en_q|D +ref_en_q|clk ref_en_q|Clk +ref_en_q|clrn ref_en_q|AsyncReset +ref_en_q~feeder|combout ref_en_q|LutOut +ref_en_q|q ref_en_q|Q +tp_q[3]~0|dataa tp_q[3]~0|A +tp_q[3]~0|datab tp_q[3]~0|B +tp_q[3]~0|datac tp_q[3]~0|C +tp_q[3]~0|datad tp_q[3]~0|D +tp_q[3]~0|combout tp_q[3]~0|LutOut +sysoff_q~feeder|dataa sysoff_q|A +sysoff_q~feeder|datab sysoff_q|B +sysoff_q~feeder|datac sysoff_q|C +sysoff_q~feeder|datad sysoff_q|D +sysoff_q|clk sysoff_q|Clk +sysoff_q|clrn sysoff_q|AsyncReset +sysoff_q~feeder|combout sysoff_q|LutOut +sysoff_q|q sysoff_q|Q +tp_q[6]~feeder|dataa tp_q[6]|A +tp_q[6]~feeder|datab tp_q[6]|B +tp_q[6]~feeder|datac tp_q[6]|C +tp_q[6]~feeder|datad tp_q[6]|D +tp_q[6]|clk tp_q[6]|Clk +tp_q[6]|clrn tp_q[6]|AsyncReset +tp_q[6]~feeder|combout tp_q[6]|LutOut +tp_q[6]|q tp_q[6]|Q +tp_q[3]|ena clken_ctrl_X1_Y15_N0|ClkEn +tp_q[4]|ena clken_ctrl_X1_Y15_N0|ClkEn +lcd_backlight_q|ena clken_ctrl_X1_Y15_N1|ClkEn +tp_q[0]|ena clken_ctrl_X1_Y15_N0|ClkEn +lcd_reset_q|ena clken_ctrl_X1_Y15_N1|ClkEn +tp_q[1]|ena clken_ctrl_X1_Y15_N0|ClkEn +audio_reset_q|ena clken_ctrl_X1_Y15_N1|ClkEn +tp_q[7]|ena clken_ctrl_X1_Y15_N0|ClkEn +tp_q[2]|ena clken_ctrl_X1_Y15_N0|ClkEn +tp_q[5]|ena clken_ctrl_X1_Y15_N0|ClkEn +ref_en_q|ena clken_ctrl_X1_Y15_N1|ClkEn +sysoff_q|ena clken_ctrl_X1_Y15_N1|ClkEn +tp_q[6]|ena clken_ctrl_X1_Y15_N0|ClkEn +mcu_data_out[7]~15|dataa mcu_data_out[7]~15|A +mcu_data_out[7]~15|datab mcu_data_out[7]~15|B +mcu_data_out[7]~15|datac mcu_data_out[7]~15|C +mcu_data_out[7]~15|datad mcu_data_out[7]~15|D +mcu_data_out[7]~15|combout mcu_data_out[7]~15|LutOut +mcu_data_out[6]~13|dataa mcu_data_out[6]~13|A +mcu_data_out[6]~13|datab mcu_data_out[6]~13|B +mcu_data_out[6]~13|datac mcu_data_out[6]~13|C +mcu_data_out[6]~13|datad mcu_data_out[6]~13|D +mcu_data_out[6]~13|combout mcu_data_out[6]~13|LutOut +mcu_data_out[1]~3|dataa mcu_data_out[1]~3|A +mcu_data_out[1]~3|datab mcu_data_out[1]~3|B +mcu_data_out[1]~3|datac mcu_data_out[1]~3|C +mcu_data_out[1]~3|datad mcu_data_out[1]~3|D +mcu_data_out[1]~3|combout mcu_data_out[1]~3|LutOut +mcu_data_out[0]~1|dataa mcu_data_out[0]~1|A +mcu_data_out[0]~1|datab mcu_data_out[0]~1|B +mcu_data_out[0]~1|datac mcu_data_out[0]~1|C +mcu_data_out[0]~1|datad mcu_data_out[0]~1|D +mcu_data_out[0]~1|combout mcu_data_out[0]~1|LutOut +mcu_data_out[0]~0|dataa lcd_data_in_q[0]|A +mcu_data_out[0]~0|datab lcd_data_in_q[0]|B +mcu_data_out[0]~0|datac lcd_data_in_q[0]|C +mcu_data_out[0]~0|datad lcd_data_in_q[0]|D +lcd_data_in_q[0]|clk lcd_data_in_q[0]|Clk +lcd_data_in_q[0]|clrn lcd_data_in_q[0]|AsyncReset +lcd_data_in_q[0]|sclr lcd_data_in_q[0]|SyncReset +lcd_data_in_q[0]|sload lcd_data_in_q[0]|SyncLoad +mcu_data_out[0]~0|combout lcd_data_in_q[0]|LutOut +lcd_data_in_q[0]|q lcd_data_in_q[0]|Q +mcu_data_out[6]~12|dataa lcd_data_in_q[6]|A +mcu_data_out[6]~12|datab lcd_data_in_q[6]|B +mcu_data_out[6]~12|datac lcd_data_in_q[6]|C +mcu_data_out[6]~12|datad lcd_data_in_q[6]|D +lcd_data_in_q[6]|clk lcd_data_in_q[6]|Clk +lcd_data_in_q[6]|clrn lcd_data_in_q[6]|AsyncReset +lcd_data_in_q[6]|sclr lcd_data_in_q[6]|SyncReset +lcd_data_in_q[6]|sload lcd_data_in_q[6]|SyncLoad +mcu_data_out[6]~12|combout lcd_data_in_q[6]|LutOut +lcd_data_in_q[6]|q lcd_data_in_q[6]|Q +lcd_data_in_q[0]|ena clken_ctrl_X1_Y19_N0|ClkEn +lcd_data_in_q[6]|ena clken_ctrl_X1_Y19_N0|ClkEn +lcd_data_out_q[1]~feeder|dataa lcd_data_out_q[1]|A +lcd_data_out_q[1]~feeder|datab lcd_data_out_q[1]|B +lcd_data_out_q[1]~feeder|datac lcd_data_out_q[1]|C +lcd_data_out_q[1]~feeder|datad lcd_data_out_q[1]|D +lcd_data_out_q[1]|clk lcd_data_out_q[1]|Clk +lcd_data_out_q[1]|clrn lcd_data_out_q[1]|AsyncReset +lcd_data_out_q[1]~feeder|combout lcd_data_out_q[1]|LutOut +lcd_data_out_q[1]|q lcd_data_out_q[1]|Q +lcd_data_out_q[2]~feeder|dataa lcd_data_out_q[2]|A +lcd_data_out_q[2]~feeder|datab lcd_data_out_q[2]|B +lcd_data_out_q[2]~feeder|datac lcd_data_out_q[2]|C +lcd_data_out_q[2]~feeder|datad lcd_data_out_q[2]|D +lcd_data_out_q[2]|clk lcd_data_out_q[2]|Clk +lcd_data_out_q[2]|clrn lcd_data_out_q[2]|AsyncReset +lcd_data_out_q[2]~feeder|combout lcd_data_out_q[2]|LutOut +lcd_data_out_q[2]|q lcd_data_out_q[2]|Q +|datac lcd_data_out_q[6]|C +lcd_data_out_q[6]|clk lcd_data_out_q[6]|Clk +lcd_data_out_q[6]|clrn lcd_data_out_q[6]|AsyncReset +lcd_data_out_q[6]|sclr lcd_data_out_q[6]|SyncReset +lcd_data_out_q[6]|sload lcd_data_out_q[6]|SyncLoad +lcd_data_out_q[6]|q lcd_data_out_q[6]|Q +lcd_data_out_q[7]~feeder|dataa lcd_data_out_q[7]|A +lcd_data_out_q[7]~feeder|datab lcd_data_out_q[7]|B +lcd_data_out_q[7]~feeder|datac lcd_data_out_q[7]|C +lcd_data_out_q[7]~feeder|datad lcd_data_out_q[7]|D +lcd_data_out_q[7]|clk lcd_data_out_q[7]|Clk +lcd_data_out_q[7]|clrn lcd_data_out_q[7]|AsyncReset +lcd_data_out_q[7]~feeder|combout lcd_data_out_q[7]|LutOut +lcd_data_out_q[7]|q lcd_data_out_q[7]|Q +lcd_data_out_q[0]~feeder|dataa lcd_data_out_q[0]|A +lcd_data_out_q[0]~feeder|datab lcd_data_out_q[0]|B +lcd_data_out_q[0]~feeder|datac lcd_data_out_q[0]|C +lcd_data_out_q[0]~feeder|datad lcd_data_out_q[0]|D +lcd_data_out_q[0]|clk lcd_data_out_q[0]|Clk +lcd_data_out_q[0]|clrn lcd_data_out_q[0]|AsyncReset +lcd_data_out_q[0]~feeder|combout lcd_data_out_q[0]|LutOut +lcd_data_out_q[0]|q lcd_data_out_q[0]|Q +lcd_data_out_q[1]|ena clken_ctrl_X1_Y20_N0|ClkEn +lcd_data_out_q[2]|ena clken_ctrl_X1_Y20_N0|ClkEn +lcd_data_out_q[6]|ena clken_ctrl_X1_Y20_N0|ClkEn +lcd_data_out_q[7]|ena clken_ctrl_X1_Y20_N0|ClkEn +lcd_data_out_q[0]|ena clken_ctrl_X1_Y20_N0|ClkEn +mcu_data_out[7]~14|dataa lcd_data_in_q[7]|A +mcu_data_out[7]~14|datab lcd_data_in_q[7]|B +mcu_data_out[7]~14|datac lcd_data_in_q[7]|C +mcu_data_out[7]~14|datad lcd_data_in_q[7]|D +lcd_data_in_q[7]|clk lcd_data_in_q[7]|Clk +lcd_data_in_q[7]|clrn lcd_data_in_q[7]|AsyncReset +lcd_data_in_q[7]|sclr lcd_data_in_q[7]|SyncReset +lcd_data_in_q[7]|sload lcd_data_in_q[7]|SyncLoad +mcu_data_out[7]~14|combout lcd_data_in_q[7]|LutOut +lcd_data_in_q[7]|q lcd_data_in_q[7]|Q +mcu_data_out[1]~2|dataa lcd_data_in_q[1]|A +mcu_data_out[1]~2|datab lcd_data_in_q[1]|B +mcu_data_out[1]~2|datac lcd_data_in_q[1]|C +mcu_data_out[1]~2|datad lcd_data_in_q[1]|D +lcd_data_in_q[1]|clk lcd_data_in_q[1]|Clk +lcd_data_in_q[1]|clrn lcd_data_in_q[1]|AsyncReset +lcd_data_in_q[1]|sclr lcd_data_in_q[1]|SyncReset +lcd_data_in_q[1]|sload lcd_data_in_q[1]|SyncLoad +mcu_data_out[1]~2|combout lcd_data_in_q[1]|LutOut +lcd_data_in_q[1]|q lcd_data_in_q[1]|Q +lcd_data_in_q[7]|ena clken_ctrl_X1_Y21_N0|ClkEn +lcd_data_in_q[1]|ena clken_ctrl_X1_Y21_N0|ClkEn +mcu_data_out[3]~7|dataa mcu_data_out[3]~7|A +mcu_data_out[3]~7|datab mcu_data_out[3]~7|B +mcu_data_out[3]~7|datac mcu_data_out[3]~7|C +mcu_data_out[3]~7|datad mcu_data_out[3]~7|D +mcu_data_out[3]~7|combout mcu_data_out[3]~7|LutOut +mcu_data_out[4]~9|dataa mcu_data_out[4]~9|A +mcu_data_out[4]~9|datab mcu_data_out[4]~9|B +mcu_data_out[4]~9|datac mcu_data_out[4]~9|C +mcu_data_out[4]~9|datad mcu_data_out[4]~9|D +mcu_data_out[4]~9|combout mcu_data_out[4]~9|LutOut +mcu_data_out[2]~5|dataa mcu_data_out[2]~5|A +mcu_data_out[2]~5|datab mcu_data_out[2]~5|B +mcu_data_out[2]~5|datac mcu_data_out[2]~5|C +mcu_data_out[2]~5|datad mcu_data_out[2]~5|D +mcu_data_out[2]~5|combout mcu_data_out[2]~5|LutOut +mcu_data_out[5]~11|dataa mcu_data_out[5]~11|A +mcu_data_out[5]~11|datab mcu_data_out[5]~11|B +mcu_data_out[5]~11|datac mcu_data_out[5]~11|C +mcu_data_out[5]~11|datad mcu_data_out[5]~11|D +mcu_data_out[5]~11|combout mcu_data_out[5]~11|LutOut +mcu_data_out[2]~4|dataa lcd_data_in_q[2]|A +mcu_data_out[2]~4|datab lcd_data_in_q[2]|B +mcu_data_out[2]~4|datac lcd_data_in_q[2]|C +mcu_data_out[2]~4|datad lcd_data_in_q[2]|D +lcd_data_in_q[2]|clk lcd_data_in_q[2]|Clk +lcd_data_in_q[2]|clrn lcd_data_in_q[2]|AsyncReset +lcd_data_in_q[2]|sclr lcd_data_in_q[2]|SyncReset +lcd_data_in_q[2]|sload lcd_data_in_q[2]|SyncLoad +mcu_data_out[2]~4|combout lcd_data_in_q[2]|LutOut +lcd_data_in_q[2]|q lcd_data_in_q[2]|Q +lcd_data_in_q[2]|ena clken_ctrl_X1_Y24_N0|ClkEn +mcu_data_out[4]~8|dataa lcd_data_in_q[4]|A +mcu_data_out[4]~8|datab lcd_data_in_q[4]|B +mcu_data_out[4]~8|datac lcd_data_in_q[4]|C +mcu_data_out[4]~8|datad lcd_data_in_q[4]|D +lcd_data_in_q[4]|clk lcd_data_in_q[4]|Clk +lcd_data_in_q[4]|clrn lcd_data_in_q[4]|AsyncReset +lcd_data_in_q[4]|sclr lcd_data_in_q[4]|SyncReset +lcd_data_in_q[4]|sload lcd_data_in_q[4]|SyncLoad +mcu_data_out[4]~8|combout lcd_data_in_q[4]|LutOut +lcd_data_in_q[4]|q lcd_data_in_q[4]|Q +lcd_data_out_q[4]~feeder|dataa lcd_data_out_q[4]|A +lcd_data_out_q[4]~feeder|datab lcd_data_out_q[4]|B +lcd_data_out_q[4]~feeder|datac lcd_data_out_q[4]|C +lcd_data_out_q[4]~feeder|datad lcd_data_out_q[4]|D +lcd_data_out_q[4]|clk lcd_data_out_q[4]|Clk +lcd_data_out_q[4]|clrn lcd_data_out_q[4]|AsyncReset +lcd_data_out_q[4]~feeder|combout lcd_data_out_q[4]|LutOut +lcd_data_out_q[4]|q lcd_data_out_q[4]|Q +|datac lcd_data_out_q[3]|C +lcd_data_out_q[3]|clk lcd_data_out_q[3]|Clk +lcd_data_out_q[3]|clrn lcd_data_out_q[3]|AsyncReset +lcd_data_out_q[3]|sclr lcd_data_out_q[3]|SyncReset +lcd_data_out_q[3]|sload lcd_data_out_q[3]|SyncLoad +lcd_data_out_q[3]|q lcd_data_out_q[3]|Q +|datac lcd_data_out_q[5]|C +lcd_data_out_q[5]|clk lcd_data_out_q[5]|Clk +lcd_data_out_q[5]|clrn lcd_data_out_q[5]|AsyncReset +lcd_data_out_q[5]|sclr lcd_data_out_q[5]|SyncReset +lcd_data_out_q[5]|sload lcd_data_out_q[5]|SyncLoad +lcd_data_out_q[5]|q lcd_data_out_q[5]|Q +mcu_data_out[3]~6|dataa lcd_data_in_q[3]|A +mcu_data_out[3]~6|datab lcd_data_in_q[3]|B +mcu_data_out[3]~6|datac lcd_data_in_q[3]|C +mcu_data_out[3]~6|datad lcd_data_in_q[3]|D +lcd_data_in_q[3]|clk lcd_data_in_q[3]|Clk +lcd_data_in_q[3]|clrn lcd_data_in_q[3]|AsyncReset +lcd_data_in_q[3]|sclr lcd_data_in_q[3]|SyncReset +lcd_data_in_q[3]|sload lcd_data_in_q[3]|SyncLoad +mcu_data_out[3]~6|combout lcd_data_in_q[3]|LutOut +lcd_data_in_q[3]|q lcd_data_in_q[3]|Q +mcu_data_out[5]~10|dataa lcd_data_in_q[5]|A +mcu_data_out[5]~10|datab lcd_data_in_q[5]|B +mcu_data_out[5]~10|datac lcd_data_in_q[5]|C +mcu_data_out[5]~10|datad lcd_data_in_q[5]|D +lcd_data_in_q[5]|clk lcd_data_in_q[5]|Clk +lcd_data_in_q[5]|clrn lcd_data_in_q[5]|AsyncReset +lcd_data_in_q[5]|sclr lcd_data_in_q[5]|SyncReset +lcd_data_in_q[5]|sload lcd_data_in_q[5]|SyncLoad +mcu_data_out[5]~10|combout lcd_data_in_q[5]|LutOut +lcd_data_in_q[5]|q lcd_data_in_q[5]|Q +lcd_data_in_q[4]|ena clken_ctrl_X1_Y26_N0|ClkEn +lcd_data_out_q[4]|ena clken_ctrl_X1_Y26_N1|ClkEn +lcd_data_out_q[3]|ena clken_ctrl_X1_Y26_N1|ClkEn +lcd_data_out_q[5]|ena clken_ctrl_X1_Y26_N1|ClkEn +lcd_data_in_q[3]|ena clken_ctrl_X1_Y26_N0|ClkEn +lcd_data_in_q[5]|ena clken_ctrl_X1_Y26_N0|ClkEn diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/alta_lib.v b/hardware/portapack_h4m/CPLD/Supra/alta_db/alta_lib.v new file mode 100644 index 00000000..35366174 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/alta_db/alta_lib.v @@ -0,0 +1,1935 @@ + +O*A1C-HW#SWiW/qH` +)).=q{vSI8TYJgW|p,`F:/ `% +%%rpJ[C=&4}[Cfp=/z}0(9BH} +EE}~BEo5f +;C +8\|1ittA-Dq#?TMH/gFW?&X).=qvY^ +Q{G cK``)%:d^V2%:dp~RG +RK4jN%0i;,n%RK r4< +B;9H;90433Tg 0)lr +&)jR)jEo5f# +*\AO*A1C- + + +v*F-W:K9Vc9A93^QNV |TK) +::::l^V2!`% +%%%% Qrfp[ +0000()Bud} +EEEE}2j2 &)jB +WWWW5y +ttttV; + +TTW & D=dY|`g**|Fia``O`!^ +xxG9j9^`p|`%QLL`\Ao%%=%,3 +**tSdST/9NkE*&&k}bsWWhWZ# +1bIb+*i-?H#wQiSIwg)J)^ -2 Z sDlu-?qR^* + +2pm-x`FgWk2p^ +Q{G cK3|`!`G +RK4jN% \LRK3 +fpt9aC2/r +&)jR)jE}2j2 &)jH + +*\AO*A1C-HH}}HW#SWiW{QYr#Rq0 +D?.p-=8w_dwQwcH0GGdS_5m.0I8mvDd1t + +G9j9^`p|`%s oKQ N`/7j8%=%C>h{,3 + + HX+XRNjo1Wf551s0[WWhWZ# +ss1bIb+*i-?HqRR?/iIHH1H<$ +TTW & D=dY|`g**|FirKK7K+E +R*C*r|NrdC4tTyaMt/0s0|Xz9XKX(kd889+z|r + +\HwqBWW \H# +XMk1MkuHXMkC + +g0.D?.p-= + + +r~lKV|%1/N1AhLLN%. +CCfyJ22a[ +00uRK^N*j&kb1oYD +uuv2X'g2*\#m +HHRiR{qM +)).=q{vSI +``F:/|Vj{H +::l|OLr +:r + +wK1K4yk*ct!**cAo:tt]tl; +wW?WQg2=S8GvvSTQH88~8Ct +mw|wv:c`C:^~~Cl9h%%=%,3 +tSdST/9NkE3RhbjXRoWhWoKYBK0j55Bo# + +8\|1it8o#**i; +YTwlSH,Bp< +B;9H;9043=Tg 0qX9XU;9[}0qX9XU;9xr +P5R)jEEw3J BEw3J[HZDWN7*HfCy'*il; +YTwlSHH.#0BMH.#0b0KX)ysw0qx=cYxS^ +Q{G cKK:`e|Ks*%lrR/dxr +P5R)jEE}o)fY1HDWsyr1XIxu{*W*-$ + +****{wSwfYx:jK| jUAMKK7K+E +IIIIR*C*r|NrdC&22d%yMCCWC_< + HX+XRNjo1Wf551s0Ouu~u5C +|BcBO-Sg&)-WDZ2wW=8~8(w_dwQkSwf(t + +G9j9^`p|`% fW7+TwCCCCCCCCCWCwjJ_< +HX+XRNjo1W(_C/N0%I /9WWWWWhWMnjZZZZ# +1bIb+*i-?H(%*+Fi3d-+kHHHHH1H Lr<<<<$ +W & D=dY|`Eb~\Pi1~$\e2.va:>:S$)&G +41`1Vra/+0\UZPxKtZ_Pm70n[WhW:S$)&G +41`1Vra/+0\UZP[KUhPZm-EEEElEfm~ H +wK1K4yk*ctP>3@uo>&@3y6HHHH1HBLr<$ +W & D=dY|`Eb~\Bi~eqv.\PWKK7Kz=N+E +R*C*r|NrdCA(A?yUN|CCCCCCCCWCvg_XjJ_< +HX+XRNjo1W{Y!Z{g2WWWWWWWWWhW&njZ# +1bIb+*i-?H.#0B.)6HHHHHHHHH1HmLr<$ + +YpFv*F-W: + + +T2%94/0Xz9XKl+XRpv0# +EEn2j2,5gBEEn2j2,5VB +WWNss1y''ZxuZ{{I*44um +HHFISgh0FI883HdYe{hH +::n*p*@Kp?%:n*p*@KpX% +%% /B,*% /Bwp_[CN=Mp&R/(Nj B +WW{Y!* +.0{Dd884^AKC|88mwdw 0FI88mwdw 03t +2pm-x``@S=4!o`PFF|:33qHKqUUj`ddXG +RK4jN%%0%{;,n%%qoNrPd[}00xk9N[H`# +XMk1Mku.L&)5luHbkbBMkZxuHbkbBMkpC +8\|1itt9C?lmt9C?yTSyHHHHHHHHH1HmLr<$ +W & D=dY|`EPf0ev2.va::::::>:S$)&G +41`1Vra/+0\UZP[Kt_qP&00000s0wMlggggr +R2k2hoByIuWBndp2y=Hd_uuuuu~uj^!5555C +|BcBO-Sg&)`bxPyZ+xUPhy\Lb8~8^9kCt +mw|wv:c`C:W@eaX9QeDa\JFMc%=%{>h,3 +tSdST/9NkEx0yrgbw6#,9b[uWWhW~\Aa_::>:S$)&G +41`1Vra/+0\UZPxK*>,UhPKm9ElEfm~ H +wK1K4yk*ctP>3@ o3=@F5oy8HH1HBLr<$ +W & D=dY|`Eb~\Pi~I\bG\ie\K7Kz=N+E +R*C*r|NrdC'-R?>yR:?A(yPC00s03Mlgr +R2k2hoByIuWBndp2nOdBVd2E5t]tR0#l; +wW?WQg2=S86WLyFQWbyLN<````O`S.3!^ +G9j9^`p|`%U+MJqA+cJMw^CCCCWCwjJ_< +HX+XRNjo1WIuI/0tN=WWWWWWWWhW^&<-njZ# +1bIb+*i-?H*Kb[ZYfa))))))))J)m4u;* +{wSwfYx:jKvPW[~2a:::::::::>:}$)&G +41`1Vra/+0*zvg*"2000000000s0nMlgr +R2k2hoByIu:&G +41`1Vra/+0)N32Xb*]2P5EEEEEEEEEElE NI HEEQQE&kE fC.UR1 +wK1K4yk*ctA-#WIiqvWYTiQR/g)))))J)^s2 2lq^* +{wSwfYx:jK 3`d9^*V!)C*p!~`:::::>:cF*Vd|$3 +tSdST/9NkE)1o0Hy%2'k-J*oAh,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,3 +tSdST/9NkE}oYK*0fB1Y07\40syJb-2 &2`wu~ujLw^!55555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555C +|BcBO-Sg&).=_wHQGdS_Qc.fQTYWw#i5Qit9`O`US=.3!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!^ + +!`RKp:^V2G: +RK4jN%0:;,n%\r4SM&ad4fp>mw|wv:c`C:^~~Cl90::>:&G +##41`1Vra/+08BB+)KfEElE H +wK1K4yk*ctC|Ooi$|-H1HOW#SWiq#0qS?#O$ + +{wSwfYx:jK|V |TAc8G`:>:c*Kp~cG +41`1Vra/+0N52bkoG\7ByI2+X{*t]tqEBCC8\Lt-/og^* + +2pm-x`@Q4!o`2pgWk^ +Q{G cK,z6+wK|VT3`V|QN3 +fpt9aC/dXr0 +P5R)jE}o)w51#W +v71Mku{*W!Cc\;t +RlSwlSHRlSq#0$ + +YpFv*F-W: + + +T2%94/0Xz9XK8zvN5*jk3@w3J,5BEw3J[HDW{Y!_qB;# + +|BcBO-Sg&)t-R]pe)J)m4uK;* +{wSwfYx:jK0VTa`qKP:>:}$)S&G + +**tSdST/9NkE*&&k}b8EElE H +,,wK1K4yk*ct!**cAo$tt]tl; +}}wW?WQg2=S8GvvSTQ:``O`!^ +G9j9^`p|`%/4VANo4rCWC;S4aSy&4}/d89+z|r + +\HwqBW{Y!IHDW{Y!:7C +*1i|1it9C?>1i; + +=0TfvTD_Y + +r~lKV|%1/N1AQV4%. +CC%/^HB+}0)Nq*3k5BE}o)5yx +tt-TrBMHYQ{g-KX)lWs=_^I8UHcd^I8fvTYS, +KK``)}%:!rd|/C*%R4 r4k[CuM=ak[CT2%/n} +EE&)jfBE&)jUB +WW7B5w +;C +8\|1ittA-Dq#?TMH/gFW?&X).=qvY^ +Q{G cK``)S%:|KhC*%[o N{*%[o NC*%VL\rw[CT2%/n}0(9BHr +P5R)jE{Ue MEPh1oY:S$)&G +41`1Vra/+0_CK\Utmy4xEEEEEEEElEfm~ H +wK1K4yk*ctF5o =M59oSF= u+yHH1HBLr<$ +W & D=dY|`$XiIDXfi)$IPBseKKK7Kz=N+E +R*C*r|NrdC- ?yRP2K.UqmEEEEEElEfm~ H +wK1K4yk*ct>&@o =M59oa>SyHHHH1HBLr<$ +W & D=dY|`bG\iIDXfi8b)eKKKKK7Kz=N+E +R*C*r|NrdC- ?y'-"PZh\0000000s03Mlgr +R2k2hoByIuBVd2<$aE5oSF= u+yH1HBLr<$ +W & D=dY|`bG\iPIDXfi)$IPBseK7Kz=N+E +R*C*r|NrdC- ?y: ({y+A:N>|P00s03Mlgr +R2k2hoByIuBVd2HH=Buuuuuuuuuu~uL^!5C +|BcBO-Sg&)bhQLNyiKt8.in%-b))))))J)K4u;* +{wSwfYx:jK.a9W@Q\McU%%%%%%%%=%{>h,3 +tSdST/9NkE0[0{=A:,2H=OZp$Ett]tR0#l; +wW?WQg2=S8WNiPIDXfi)$IPBseKK7Kz=N+E +R*C*r|NrdC-PK1VC*Kq_1[x>mEEElEfm~ H +wK1K4yk*ct>yi--d%HHHHHHHHHHH1HBLr<$ +W & D=dY|`2pgWkf <``````````O`=.3!^ +G9j9^`p|`%LjNQ/B kb%%%%%%%%%=%C>h,3 + +HX+XRNjo1W{g20/CI0Iu(+/WWWWWhWa\U%%%%%%%%%%=%C>h,3 +tSdST/9NkEwO-b6`n(b04rb[uWWWhW:S&$)&SS&&&&&&&G +41`1Vra/+0*"2K>aq1K_CKm9EEEElEfm~ H +wK1K4yk*ct9.,o==@+o>&@oy8HHH1HBLr<$ +W & D=dY|`f K*h[00s0:S$)&G +41`1Vra/+0*"2KZU*PKm9EEEEEEElEfm~ H + +1bIb+*i-?H%!+i-bfya))))))J)K4u;* +{wSwfYx:jK~\Avq[qAvaA?T::>:f$)&G +41`1Vra/+0_CKZm-bn[=N"WWWhWXnjZ# +1bIb+*i-?H-(.A\i-bfya))))J)M4u;* + +:{U^ U V` + +T2%94/0Xz9XK)H8zv)N3@*3JP5BE*3J&)jFH +\HwqBWWfY!\H# +XMk1MkugJRXMkC +-T/QR/l#g + +v*F-W:K9Vc9Al|VTl``7^V2!`%:|K1*%Q/BLjN^3 +fpt9aCC&4}fp[C/dXr +&)jR)jE*3J&)jH +wK1K4yk*cty8]i*bGZ]bYh8~8^9kCt +:{U^ U V` + +T2%94/0Xz9XK78zv7N5U@*3JP5BEoHKDW45syxugJRXMk;C +8\|1itt!C?8\mt-TWMHQR/g* +vDd{Dd8G_jvDdt + +``lr~lKV| + +RB);zNE23j2b?*3J1oY6fY!\HDW7yJ*!imt!C?*1iV; +YTwlSHH,yp00000s0|3Mly|r +R2k2hoByIuWH<,d$uuuuu~uGw^!>>GC +|BcBO-Sg&)[Yt[Pf)))))J)^m4uee^* +{wSwfYx:jKJt(A_PtKKKK7Kdz=NMdE +R*C*r|NrdC{)^y$PmxEEElE Um~88 H +wK1K4yk*ctP&ttttttttt]tqH0#::::q; + +W & D=dY|`E~K\00000s0|3Mly|r +R2k2hoByIuWH<,d$2Wuuuuu~uGw^!>>GC +|BcBO-Sg&)[Yt[PfZ`)))))J)^m4uee^* +{wSwfYx:jKJt(A_PtAJKKKK7Kdz=NMdE +R*C*r|NrdC{)^y$PmxbxEEElE Um~88 H + +1bIb+*i-?H(*6i-bfyajZ[)J)^K4ue^* +{wSwfYx:jKtYA_aA9_:::::>:cS$)PcG +41`1Vra/+0\q*CP>KC00000s0|nMlyy|r +R2k2hoByIu,H<,d$2,uuuuu~uGw^!>>GC +|BcBO-Sg&)`xGZ"fxZ[))))J)^K4ue^* +{wSwfYx:jK0-(A>a\UAd%%%=%$C>h88$3 + +HX+XRNjo1W=t l0Cl l0IC:@uuu~uGLw^!>>>>>>>>>>>>GC +|BcBO-Sg&)tcGZfAY"Zx"Y"Zh/8~8(^9k=(t + +xxG9j9^`p|`%QLL`\A8%%=%,3 +**tSdST/9NkE*&&k}bXEElE H +,,wK1K4yk*ct!**cAorHH1H<$ +W & D=dY|`Wmvix#m:K7Kd9Vc9AQ dE + +41`1Vra/+0BHNk2jP&5bh&}oWhWo\HwqBo# +1bIb+*i-?HRwg0Z.& l0Z?p2Wp2)J)^Q -s=(t +mw|wv:c`C:)Kd9B~Vl:>:cF*Vd|$3 + +udB;9'HX)uBr +P5R)j>}2j2P5BE&o# +v71Mk#XMkgJRxuXMkgJR*\Bmt8\!C?mt8\!C?-TWMHW?gs=dI8cSY{:cE +!`RKp3l|OQ/`K*%\rht2d[C%/^BNH +\HwqBWWWY\H!\H# +v71Mk#{v??*c-TSYW#YT$ +?p2Wp2 .lQQ=SYpx2wW*-x^ + cG co| ^N cHKj`b~KpG +LjN4jN%%/RKBLjN3 + +N5}h&})3o + + +QR/l#g) -2 Zl?Z{q-Rd +8888.0G_jI8 +````*-xgWk +KKKKpE +::: +##41`1Vra/+08BB+)Ky00s0gr +QQR2k2hoByIugXXI{2-uu~u5C +YY|BcBO-Sg&)q??&.Z(88~8Ct +mw|wv:c`C:VRr9p0R|%=%$1/N1ARLA]Q/B$3 + +HX+XRNjo1WfY5f!0B*wyu~uGqJX!bJugJXgRGC +|BcBO-Sg&)=0wQSY(2{x:jA^ U`:>:c`~`|$3 + +udH;900ud8zvr +&)jR)jE&)j*3JH + +*\AO*A1C- + +fvTD_Y`wWxwi2|Fw`] +KKQjA|VTHKQjAj`d|N* +CC&S4y/d}09uXK+N1oBD +uu1M2vrI*Emt|1o|LBmt|1oAB!m +HHDYwMHDYTM +))l&eZ. 2 X)q -Z&=wTHI8TwGQGw_QSY(, +KKU`5R~C%:l|OQ/`K*%\rh2/ +FH +\HwqBW\10fY!# +v71MkuvI2I*4-S$ +l0Wp2)q -Z=0t +2pm-x`m-i2J|:%E +!`RKp:RK9Rb*G +RK4jN%4jA\1Q3 +fpt9aCafSyd/(NjH +\HwqBW)\w# +v71Mkurv7C +*1i|1it8c:oABiB; +RlSwlSHqW#i?g .w* +vDd{Dd84AKC|8TwGQGw_QSY(^ +Q{G cKU`5^VC`%:l|O4L`*%\rh2/r + +wK1K4yk*ctC|Ooi$|-H1HOW#SWiY?/WO$ +W & D=dY|`f K1V1000000000s03Mlgr +R2k2hoByIu<$a2H=f2<0W2O}Ouuuuu~u`^!5L5C +|BcBO-Sg&)tf/ZYUAZ"a")))))))))J)|4u;K;* +{wSwfYx:jKJnA?W_[ae9gTg:::::::>:S$)&G +41`1Vra/+0Zm-bV_xg((b(_(EEEEEElEfm~ H +wK1K4yk*ct>&@P&@o=yAiKtKHHHHHH1HBLr<$ +W & D=dY|`fPsi~eqvWAtaj9gTg:::>:S$)&G +41`1Vra/+0*[>KZmgn_bnyb(_(EEEElEfm~ H +wK1K4yk*ct9 +o@FayiKtKHHHHHHHH1HmLrB<$ +W & D=dY|`fPsi)ePqWA_W_KKKKKKK7Ks=Nz+E +R*C*r|NrdC{N|y:'Pmnb(_(EEEEEEElEUm~f H +wK1K4yk*ctS9o 99o, F5o=M=ttttt]tJ0#llR; +wW?WQg2=S83g6FrrQmVQVF`VQrgr88~8^9kCt +mw|wv:c`C:nM9aDq\A"w|y: :CCCCCWC!jJ_< +HX+XRNjo1WC:e2fp=d2O}Ouuuuuuuu~uw^!5LC +|BcBO-Sg&)x1ZtyfZjUPZ"a"))))))J)C4uK;;;;;;;* +{wSwfYx:jKtYA0qPAh~[AvtA_W_KKK7Kz=N+E +R*C*r|NrdCRGy+{y'-|NRA? y: :CCWCwjJ_< +HX+XRNjo1WCL0{N=0(_=NCI/"0l"lWhW:S$)&G +41`1Vra/+0\2[K2[_CnK1V10000000s0nMlg3r +R2k2hoByIuWeZ2eZ=,2O}Ouuuuuuuu~u`^!L55C +|BcBO-Sg&)YUccZh/Qrgr888888888~8^9kCt +mw|wv:c`C:aD?9j?D_9gTg::::::::>:}$)&SG +41`1Vra/+0x2K1m6b(_(EEEEEEEEEElEfm~ H + +*\AO*A1C- + + +v*F-W:K9Vc9A}c9lK) +::::pl~Kd|`* +CCCCaT=9aSt[ +000098v;9XH} +EEEEj}P)j2RB +WWWW7 \~Bq7yIx +tttt!C?Ac14-?M +))))pW. 2=DcY|, +KKKKj {QUV`Kd|`* +CCCC9=dw9=/+ +EEEEFH + +ss1bIb+*i-?HqRR?/ixHH1H<$ +TTW & D=dY|`g**|Fi#``O`!^ +xxG9j9^`p|`%QLL`\AZCCWC_< +HX+XRNjo1WYw40B*wyu~uGbJkb29kbqGC + +YTwlSHS/Rl{g&* + +*-xm-x`xv{-xwm^ + cG cKc|T c9GE +~KpRKp:pl!Kp*RG +LjN4jN% [RHNj rd< +B;9H;908zv)+;(NkH +5qBwqBWqwsKByM'*c; +RlSwlSH?lTY/#gps=St +*-xm-x`-{|S-{:jE + +rp%T2%94/ + + ++X{MJ*tBCiBoOB!oO1Cik +HHHH/WSWWMH +)))). 2 uX +8888c. 0wI8 +````{2(p3, +KKKK|VTHK +::::*^VC%: +%%%%rpS[ +0000)X9XB;9} +EEEE}o)fY1HD +uuuu{*W|*c +HHHHz$ +)))) +**{wSwfYx:jK| jUAMKK7K+E +IIR*C*r|NrdC&22d%yMCCWC_< + HX+XRNjo1Wf551s0Ouu~u5C +|BcBO-Sg&)-WDZ2wW=8~8(w_dwQfwGQfD_d(t + +G9j9^`p|`%\1N11A@R\N[%%%=%{~3 +tSdST/9NkE}2j2~bvP}j]EEElEf%H +wK1K4yk*ctABiBBo!C*!?z]tq\*\-O$ +W & D=dY|`Fwxw3igW*gk_O`%p*p:dE +R*C*r|NrdC=frpSy&42&}3WC;p2p/|r0 +R2k2hoByIu'vq7!2gJXgR#~uG7X7*q; +wW?WQg2=S8_{fQU.0d888888~8(dSDY%^ + +!`RKp:-l*p**9z!lpBsSo&J:l*p**G +RK4jN%0\1N1hA@R\N[x{;,n%\1N1h3 +fpt9aC=frpS< +udH;90(u7dlr +P5R)jE*3JH +\HwqBWKfY1# +v71Mku*\B; +YTwlSH/gFq-&0* +.0{Dd8TYJm*|^ + cG cK,U9c99A$QUcmiU9c9NA$QUcmuz6+woU9c9 cE +:::: +rp%T2%94/ + + ++X{MJ*tBCiBoOB!o*1itk +HHHH/WSWWMH +))))q-RX +8888wG_SI +````:{9H +::::l*p*~Kp% +%%%%\rh&4dp[ +0000)NqR&k +WWWW;# +u +YY|BcBO-Sg&)q??&.Ze))J);* +**{wSwfYx:jK| jUA8KK7K+E +IIR*C*r|NrdC&22d%y700s0gr +R2k2hoByIuJ1+2k-1*t]tqBCiBoOB!o*1iq; + +W & D=dY|`FwxwwiL2FxM```O`Q5^ +G9j9^`p|`%/4VA[RKN%%%%%%=%$N`jr;< +HX+XRNjo1W5qBwqB0fY5f!WWhWoH5HyGC + +YTwlS>,/WSWWi Y/SvGBp/WSWW$ +?p2Wp2 S. 2 ZIl.2r8K3;% . 2 ?p2* +.0{Dd888G_jt +2pm-x```wgW|^ +Q{G cKKK``*G +RK4jN%t\rh&4dp< +udH;90')NqR&kH + +*\AO*A1C- + +fvTD_Y`wWxwivg-`] +KK0P>H +::,aMx% +%%U+MAK* +CCPoPK*\hKZ1PKd} +EE"ry(rb5B +WW+NC/0CL D +uuVZnd2NoxP\m +HH)A]Kkid%yik%A-TM +))cfy",ZUb;Z"UZlX +88Z`Fr\Q W^QrWQ.I +`` sPIji$b=i1Epi2, +KK-Pq_?A~.!A?.Pv{AQH +::KmZrH +5qBwqBWVX[1&K1_KUmH +5qBwqBWg=Nl90l_0_:C +*1i|1itxP\oF>No>y$ +?p2Wp2),bfY0ZUb|Zbht +2pm-x`@T4!o``H +::W@e9`% +%%wG?y{' yR:?yp[ +00JPZ1PKd} +EE4gyrbyZnB +WW+NC/0{/l0HD +uu(dH=x +ttd@a=m +HHK3-%MHHHHHHHHH +))"+Ybh/I888888888 +``eY[Atq2Aa_% +%%wG?yRN8y"R[ +00mZrbyg7bgnnyB +WW:Kd2nZ02p}dEoy8M +))h!yQLF%Q;mFyFI +``j~e_JAa"a% +%%FMwN+ y- ?yPoP} +EE;yngrgb[L/D +uu_dnZ,O2E_@m +HHk]--*ib1PX +88\;L yNieY[H +::=g\fAwG?[ +00&tq[P[KmZrB +WW9lIUEoyX+M +)),xhFmgQ /QN/\, +KK?tagW9\-J7* +CCiRP[qVKUhPKmZr7B +WW9C N/N0:Kd0x +tt2@3 5=oyX+nM +)),yYYxZh!y%I +``j1~$\eAa"aq% +%%F"w|yPoP.} +EE;$ngrgb[L/PD +uu_O=Yyib1P]X +88\LNP)Di$XieY[2H +::=X[egaq% +%%FUM+J7* +CC)|N:iy:{$[ +00">[1&K*1Kd} +EE4gyrbrZnB +WW+NC/0C/l0HD +uu(dHBx +ttyX+i*]ni*-]+]M +))cfy",ZUb;Z"UX +88Z`Fr\Q W^QrWI +`` sPIji$b=i1Ep, +KK-Pq_?A~.!A?.Pv{H +::[1&K_UqdKu} +EEO6g(;b(,b0[D +uu@$ZO_2OB2BEm +HH3(Tid%mi%bX +88\W`m0Q W"QWN, +KK(J~.+A~H +::jWD@S9D% +%%bUG+CAG* +CC^'A-_y-[ +002\_U3KU} +EE-x,0Ub0B +WWH2(:,5x +tt\,Py8BM +))0G`h/Jo2>+S\; +YTwlSHH)A]Kkid%loF; +YTwlSH,~p:}O$)&G +41`1Vra/+0*>,K"ZmSEEElE%m~ H +wK1K4yk*ctu>>@oSyA]tH1HBLr<$ +W & D=dY|`fs0f <`````O`=.3!^ +``lr~lKV| + +RB);zNE23j2bh)3jE@ +WW{Y!DW{Y!:7xuZ'-7gn*4-SM +))"l{0yX)"l{0jX +88mwdw 0FCI8mwdw 03CI8mwdw 0F^I8mwdw 03^I +``)wxwb-x!,`)wxwb-xS, +KKU`5R~C% +%%\rh&4dp[ +00)Nq&o +;C +8\|1itt9C?mt9C?yTMH]{ITq*gs=dt +2pm-x``I2(pP,`I2(pB^ +Q{G cKK,f6+wKv9c9~{q+HKv9c9~{h+HKv9c9~{qzHKv9c9~{hzE +~KpRKp:-Sio&J:n*p*@Kp&%:n*p*@KpSG +RK4jN%%\rh&4dp[C%/^HB+}0)Nq&o# + +|BcBO-Sg&)-WDZ2wW=8~8(w_dwQfD_d(t +mw|wv:c`C:q[Aa9q@n\%%%%=%{>h,3%##%,;%{~8{~*%{;%(8( +tSdST/9NkEx0yrgb,9y[2ZWhW:S$)&G +41`1Vra/+0\UZPxK_CZm-fElEfm~ H +wK1K4yk*ct=F,5 o3y6HHHH1HBLr<$ +W & D=dY|`I$h,3 +tSdST/9NkE(,-9Vbg(_9wEEElEfm~ H +wK1K4yk*ct=F,5xo =M59ttt]tR0#l; +wW?WQg2=S8Fmmrb3CQFrg/V8~8^9kCt +mw|wv:c`C:?nng[XS9?gT_M:>:S$)&G +41`1Vra/+0U\.Uqmbg(_9wEElEfm~ H +wK1K4yk*cta&+@ o =M59ttt]tR0#l; +wW?WQg2=S8%b`y3QFrg/V888~8^9kCt +mw|wv:c`C:?MM[?9?gT_M:::>:S$)&G +41`1Vra/+0[**hxK[1VC*000s03Mlgr +R2k2hoByIuBVd52ZO},KKKK7Ks=N+E +R*C*r|NrdC'-R?Nwy{|$CCCCWCkjJ_< +HX+XRNjo1W(_C/`Z0{=AWWWWhW&njZ# +1bIb+*i-?H(%*+FBi.A\HHHH1HmLr<$ +W & D=dY|`Eb~\1!ifs0````O`=.3!^ +G9j9^`p|`%U+MJl{A fW%%%%=%C>h,3 +tSdST/9NkE(,-9gbw6#EEEEElEUm~ H +wK1K4yk*ct=F,5uo9+Uttttt]tN0#l; +wW?WQg2=S8r h/;QV`i88888~8<9kCt +mw|wv:c`C:?nng[X&9MAx:::>:}$)&G +41`1Vra/+0[qq1hx3K*>,000s0nMlgr +R2k2hoByIuBW0BHEo9+Utttt]tN0#l; +wW?WQg2=S8%b`yFQV`i88888~8<9kCt +mw|wv:c`C:q[AaX9MAx:::::>:}$)&G +41`1Vra/+0[**h[K*>,00000s0nMlgr +R2k2hoByIuZ<KKKKKK7Ks=N+E +R*C*r|NrdC{4}_{)^CCCCCCCWCkjJ_< +HX+XRNjo1W{Y!<{g2WWWWWWWhW&njZ# + +-T/QR/l#g + +v*F-W:K9Vc9A |cK) +::^V2KdC%:Cdp`KdC% +%%LQN\LKr[C2&a%2p/;(NkB +WW1qwf54w5qBDW1sHf54w5qBD +uuIM1XgkgbJ7XMkxuI{7XgkgbJ7XMk +V; +YTwlSHHq#0l{?MH?{STl{?$ +?p2Wp2)?q2.?0=I8vGdTv0Y-{:jE +~KpRKp:CKR^~rR~Kp%:Cl`^~rR~KpG +LjN4jN%`j4LQNQ1/KLjN*%`\KLQNQ1/KLjN3 + +HX+XRNjo1W_{/0{=A ItWhW&njZZ# +1bIb+*i-?H%.+ib[)))))J)K4u;* +{wSwfYx:jK.0[An_tKKKK7Kz=N+E + +rp%T2%94/ + +45sqYyubJkb2X'guD +tt8o*4!o-TrMHRiR{qM +)).=q{vSI8TYJgW|p,`F:/ ` +^3 +fpt9aCCfy2=&y/dlr +&)jR)jE&b&1*H +\HwqBWWsyrgJI7xu{*W|*cmtA-DRg* +YpFv*F-W: + + +T2%94/0Xz9XKHzz0# +EE*3JP5B +WWfY!~jD +uu1JJ*\m +HH?gs=d0I +``mZF:{H +::^V2~Kp&% +%%Q/BLjN{* +CC42&}[ +00)NqR&kB +WWsyrgJI7x +ttA-DRg +1t + +xxG9j9^`p|`%QLL`\A8%%=%,3 +**tSdST/9NkE*&&k}bXEElE H +,,wK1K4yk*ct!**cAorHH1H<$ +W & D=dY|`Wmvix#m:K7Kd9Vc9AGVVdE + +41`1Vra/+0*>,_CKq_a00000s0]M?3r +R2k2hoByIu<$a@p2H=fuuuuu~u ^SLC +|BcBO-Sg&)tf/bkP;ZYUA)))J)N4r|Q* +{wSwfYx:jK0P>.n[zAv~DKKK7Kr=m!%E +R*C*r|NrdC{|$- ?_y+P>000s0]M?gr +R2k2hoByIu<$aBVdL2HE+ttt]t"0nl; +wW?WQg2=S8V`iWbyCQ6\FrN`O`Q.M!^ +G9j9^`p|`% fW+cJ{AUFs"wCWC!ju_< +HX+XRNjo1Wg:ESu 9Uoa>SyH1HBLr<$ +W & D=dY|` eanX?Mx9MA@Mx:>:S$)&G +41`1Vra/+0*>,UhPgKm9EEEElEfm]fH +wK1K4yk*ct9+U>&@Roy8HHHH1HBLvB$ +W & D=dY|`fs0$Xi ~eOKKKK7Kz+E +R*C*r|NrdC{|$)>y)RPS0000s03gr +R2k2hoByIu<$aBVd52@nE}tt]tRl; +wW?WQg2=S8V`iWby^QZLN7``O`S!^ + +!`RKp:^V2!`%:^V2F)G +RK4jN%4//rp[Cd/(Nj5BERu}oH# +XMk1MkugJRXMk5xugJRXMkLC +*1i|1itC*!?; +YTwlSH/gFq-&0X).=q{vSI8TYJ*:E + +rp%T2%94/ + +45sqYyubJkb21JJruD +tt!C?8\mt!C?E#m +HHw##g0X)&=cYxp, +KK|VT c+``%:^V2~KpS|K*%Q/BLjNCrp[C&4}29a!/d}08zvB;9cN5B +WWfY!5qBZDWfY!5qB: $)&G +41`1Vra/+0*>,q_agKm9EEEEEElEfm~ H +wK1K4yk*ct9+USFQRoy8HHHHHH1HBLr<$ +W & D=dY|`fs0)$h=ie\KKKKKK7Kz=N+E +R*C*r|NrdC{|$+AU!yPC000000s03Mlgr +R2k2hoByIu<$aH=f 2E5tttttt]tR0#l; +wW?WQg2=S8V`iWbyCQ\ h\8888~8@9kCt +mw|wv:c`C:MAx@[a&9A@Q:::::>:u$)&G +41`1Vra/+0*>,UhPgKPZ_.0000s03Mlgr +R2k2hoByIu<$aBVd52p}WZOOuu~uL^!5C +|BcBO-Sg&)tf/bkPKZ,UG,))))J)C4u;* +{wSwfYx:jK0P>.n[zAP.:KKKKK7Kf=N+E +R*C*r|NrdC{|$- ?wy?RA8CCCCWCwjJ_< +HX+XRNjo1W{=A_+/<0`"(NllWWhWh,3 +tSdST/9NkEw6#04rUbV_xg((EElEfm~ H +wK1K4yk*ct9+U>&@Jo2F,2tttt]tZ0#l; +wW?WQg2=S8V`iWby"Q`W;88888~8@9kCt +mw|wv:c`C:MAx@[af9aeDq::::>:S$)&G +41`1Vra/+0*>,UhP.n[1A[t~2KKKK7Kz=N+E +R*C*r|NrdC{|$- ?vy> 'N::CCWCwjJ_< +HX+XRNjo1W{=A_+/Z0 :$uuuuu~uN^!5C +|BcBO-Sg&)tf/bkPKZYh`88888~8@9kCt +mw|wv:c`C:MAx@[a}9n\f%%%%%=%~>h,3 +tSdST/9NkEw6#04rCbn[=WWWWWhWcnjZ# +1bIb+*i-?H.A\%!+ i-bf)))))J)C4u;* +{wSwfYx:jK0P>.n[+AJ?q_a:::>:f$)&G +41`1Vra/+0*>,UhP3K\&[1mEEElECm~ H +wK1K4yk*ct9+U>&@NoP2 =yHHH1HyLr<$ +W & D=dY|`fs0bG\QiEjPIeKKK7K!=N+E +R*C*r|NrdC{|$- ?vy'iN:P000s0h,3 +tSdST/9NkEO[:HpZh,3 +tSdST/9NkEw6#04rCbwg(wgn[WhWh,3 +tSdST/9NkEw6#,9bV_xg((EEEElEfm~ H +wK1K4yk*ct9+U.uo2F,2tttttt]tZ0#l; +wW?WQg2=S8V`iZ3Q`W;8888888~8@9kCt +mw|wv:c`C:MAx:S$)&G +41`1Vra/+0*>,"xKxV\[110000s03Mlgr +R2k2hoByIu<$aH=f52E5tttttt]tR0#l; +wW?WQg2=S8V`im u^QNX``````O`S.3!^ +G9j9^`p|`% fWTGgCAw(CCCCCCWCwjJ_< +HX+XRNjo1W{=A ItX0:,uuuuuu~uL^!5C +|BcBO-Sg&)tf/YUAMZh/888888~8^9kCt +mw|wv:c`C:MAx@[a&9=Dj=::::>:u$)&G +41`1Vra/+0*>,UhPgK>Ut00000s0iMlgr +R2k2hoByIu<$aBVd52dn=0uuuu~uL^!5C +|BcBO-Sg&)tf/bkP;Zja`y""))J)K4u;* +{wSwfYx:jK0P>.n[zA?~(?KKKK7Kf=N+E +R*C*r|NrdC{|$- ?wy|-"CCCCCWCXjJ_< +HX+XRNjo1W{=A_+/<0/CIPWWWWhWh,3 +tSdST/9NkEw6#04rUbry,7EEEElEfm~ H +wK1K4yk*ct9+U>&@NouMP ==tt]tR0#l; +wW?WQg2=S8V`iWby"Q\ h\8888~8@9kCt +mw|wv:c`C:MAx@[af9A@Q:::::>:u$)&G +41`1Vra/+0*>,UhP.n[1AP.:KKKKK7Kf=N+E +R*C*r|NrdC{|$- ?vy?RA8CCCCWCwjJ_< +HX+XRNjo1W{=A_+/M0`"(NllWWhW.n[zAvaA:::::>:u$)&G +41`1Vra/+0*>,UhPnKqm6EEEEElE%m~ H +wK1K4yk*ct9+U>&@JoSyAHHHHH1H:Lr<$ +W & D=dY|`fs0bG\ti)ePKKKKK7Kf=N+E +R*C*r|NrdC{|$- ?_y'iN:P000s0h,3 +tSdST/9NkEO[:HpZh,3 +tSdST/9NkEw6#04rCbwg(wgn[WhW00000000s0nMlyyr +R2k2hoByIu>>C +|BcBO-Sg&)xxhZ888888888888~8<9k==t +mw|wv:c`C:eLD:::::::::::::>:}$)PPG +41`1Vra/+0_a*U000000000000s0v~D+Aa_:::::>:S$)&G +41`1Vra/+0*>,q_a3Km9EEEEElEfm~ H +wK1K4yk*ct9+USFQNoy8HHHHH1HBLr<$ +W & D=dY|`fs0)$hQie\KKKKK7Kz=N+E +R*C*r|NrdC{|$- ?_y+AUCCCWCgju!@< +HX+XRNjo1W{=A_+/<0 ItWWWhW-n X~# +1bIb+*i-?H.A\%!+mi-duHHH1HfLvyj$ +W & D=dY|`fs0bG\Qi)$h```O`5.MQZ^ +G9j9^`p|`% fW+cJ,ATw|CCCWCgju_< +HX+XRNjo1W{=A_+/<0 :$uuu~u ^S5C +|BcBO-Sg&)tf/bkPmZYh`888~8R9UCt +mw|wv:c`C:MAx@[af9n\f%%%=%a>[,3 +tSdST/9NkEw6#04r bx;g([WhWXn Z# +1bIb+*i-?H.A\%!+Bi(k]Kb)J)|4r;* +{wSwfYx:jK0P>.n[sAJ?q_a:>:f$B&G +41`1Vra/+0*>,UhPN{$y{|-{$CWCkjJ_< +HX+XRNjo1W{=AIu0gC:tuuuu~uL5C +|BcBO-Sg&)tf/cjZcxh]8888~8^Ct +mw|wv:c`C:MAx@[a&9.n[!A-taH::>:S&G + +fpt9aC&4}fp[C&4}@J< +udH;90HzzN5BEko7yk7C +8\|1it!C?*1il-TMHq#0RlSBg0X)q-R?p2m=0I8G_jvDd"Yp^ + cG cK|VT c+HK|VT czHK|VT csHK|VT c!E +~KpRKp:V~^2G +RK4jN%\rh&4dp[C%/^HB+}0)Nq&o# + +-T/QR/l#g + + +^ U V`:*Vp*9C*r9)V~^2:7 +%%%%%4L`N1\1N1RK* +CCCCCt2daSS%%d[ +00000HB+9XWNB +WWWWWw51BjsKBK\HD +uuuuu1XIk!b{{Ix +ttttt|*ci#c- gX +88888G_jCI8G_j^I +`````:{9+HK``*S% +%%%%%Q/`,*%Q/`{* +CCCCCt2daSJMa/N52h21J1B +WWWWWw51Bjj*By*\BOB4?4m +HHHHHwR?SWW//?{SW##M +)))))W?&2u ..&s2 --X +88888TYJgW|p, +KKKKKU`5R~C% +%%%%%4L`N1\1N1LjN* +CCCCCt2daJ%SaS29a +00000:r + +,,wK1K4yk*ct!**cAo:tt]tl; +}}wW?WQg2=S8GvvSTQH88~8Ct +>>mw|wv:c`C:^~~Cl9h%%=%,3 +tSdST/9NkE3RhbjXRoWhWoKYBK01K40jY5f!o# + +|BcBO-Sg&)?W=Swd.v0QfvTY`O`%{2p(W:AG jcdE +R*C*r|NrdCTfq/)KHB+9KGNos0B 15qG 045syu~uG{X7k2gbI*q; +wW?WQg2=S8SwfQk_vGjQdH{Y`O`%w-x*%^ +G9j9^`p|`%/L]RQ1/A`1VAK1VrCWC;dSTypST/|r + +wK1K4yk*ct8\8ioE8C-H1HOYTYSijY#g:r==(t +mw|wv:c`C:!`!p9F!V|A/1oLjN%=%$KLKr;< + +R2k2hoByIu{bkb2v7k*cC-WDgZIl.2rZl0Zul2s)J)K* +{wSwfYx:jKU9c9AQ{c`CV|1Ory2@@=/9KudKlu9(0s03r +R2k2hoByIu1XIk2b2JXqvgbJ2Ib+2{*|int]tl; +wW?WQg2=S8{vSdQwQ_v .Gw_QSwfQ>.TdU8~8Ct +mw|wv:c`C:R~Cp9*9F!Cdp9*llC| %=%,3 +tSdST/9NkER&kjb2b321jb2}}ko77WhWZ# +1bIb+*i-?HwR?SiWijY?{SirYSiTlQrg&)J);* + +mw|wv:c`C:R~Cp9*9l*p*9~Kp9^V|1`%=%$KLKr;< + +R2k2hoByIu1XIk2b2{bkb2XMk2gJXgRu~uG7X7*q; + +W & D=dY|`m*|xiwiFwxwiL2FxM`O`5t^ +G9j9^`p|`%4L`NA1A1\\`r==y1f%auCWC!k< +HX+XRNjo1Ww51B0K0j*By2*\B#C-iQW{0i Y/SvH1H:$ + +{wSwfYx:jKG jcANAV lQ|9VAj9^AU`RpB:>:&G +41`1Vra/+0HB+9KlKzB7u8XzK+XRKWu)9?0s0gr +R2k2hoByIu1XIk2!2?vI'k2b{{I*44t]tl; +wW?WQg2=S8{vSdQkQ_wcdQwTTSY{{`O`!^ +G9j9^`p|`%4L`NAhAHR` NAhRNAKjVhrdCWC_< + +R2k2hoByIu1XIk2!2{bkb2v72gJ*Bct]tq\*\-O$ +W & D=dY|`m*|xi3iwFF|:33A|V`*C:>:c`~`|$3 +tSdST/9NkER&kjb~bkoKs0y7b!J*o'c8i-ig0 u-=QG_Yw|`O`%p*p:dE +R*C*r|NrdCt2dayJyJMa/KN52~3o0fYybIu~uG7X7*q; +wW?WQg2=S8{vSdQkQTwdwQvDdQG_Yw|`O`%p*p:dE + +41`1Vra/+0HB+9KlK)X9XKudK8zB8v0s0|8zB8v3|r +R2k2hoByIu1XIk2!2b{{I*44o!C*!?t]tq!C*!?Rq; +wW?WQg2=S8{vSdQkQSYwFi:{9NV`9zC!p|ArpSJ4/K8zB8v0s0|8zB8v3|r +R2k2hoByIu1XIk2!2!-k*o-TWr#gZq-?qR)J)^q-?qRK^* +{wSwfYx:jKG jcANAU9c9A cA|V |TK7Kd{ {`cG + +tSdST/9NkER&kjb~b}2j2bvP}j]ElE.IH +wK1K4yk*ct|*cio#oBAAc-{{i Y/SvH1Hym$ +W & D=dY|`m*|xi3i3#x:A``*)V|AV1 BA@R\N[%=%~3 + +HX+XRNjo1Ww5pyI2M12M7v7vkvbJv/-/H1HOjW#{g^* +{wSwfYx:jKVG^AmQ{cK7Kdcj `cG +41`1Vra/+08BddN*jPqPjXb*]of!\HGWhWo5~~o# + +|BcBO-Sg&)D=fQ.0.dC8~8h,3 + +HX+XRNjo1Ww51B0K0j*By2'v/-H1H<$ +W & D=dY|`m*|xiwiF2{w3W:A|`9~`9!`RKp9C|]R Nrd=CWC;2@@;< +HX+XRNjo1Ww51B0K0s\7KjYy2g*o*\o*1i|1ioc-oY{Sg&s)J)^?QQ^* +{wSwfYx:jKG jcANAN8c`9d!hrCWC_< +HX+XRNjo1Ww51B0j0s\7KjYy2g*o*\o8\|1ioc-oY{Sg&s)J)^?QQ^* +{wSwfYx:jKG jcANAUQ39NV`9^|ALKALjN4jNA`rrf=a/+(0s0|BGG|r +R2k2hoByIu'b?*o'c8i-H1HOg&&Z?0Zmq-R^* +{wSwfYx:jKQ{QcA%QV`9C| N`jQNj`r%CWC;9p9=/)|r + +wK1K4yk*ct|*cioBoABiBo8\o!C-W?H1HOTRTg^* +{wSwfYx:jKG jcA9A9UUj`dd9^V|1`%=%$KLKr;< +HX+XRNjo1Ww51B0K0p1\By2*\B#C-iq#g &)J)^0?0=(t +mw|wv:c`C:R~Cp9*9)0p|ArpSJ4/K8zN2kElE 5&5oo# + +|BcBO-Sg&)W?&2Z Z. 2 Zl0Zq-?qR)J)^q-?qR;^* +{wSwfYx:jKG jcA9A9UUj`dd9^V~^2:>:c^V~^2&cG +41`1Vra/+0HB+9KXKW+u9NboHKjYy2gJXgRu~uGgJXgR5GC +|BcBO-Sg&)W?&2Z Zuw2=QYpw3W:A|V |TK7Kd|V |T+dE + +RK4jN%4L`N1@r< +udH;904HB+9KXK)X9XKWu)9?0603Tg 0HB+9X)X9Xudr +P5R)jE{R&kjb2b2}}ko770p\sB WdW:c*Vp*9C!~cG + +tSdST/9NkE,9bg(_9wb70n[WWhW:S$)&G +41`1Vra/+0UhPKZm-b70n[WWWhW:S$)&G +41`1Vra/+0UhPK\Utmy4xEEEElEfm~ H +wK1K4yk*ct>yi*bGZ]bYh8888~8^9kCt +mw|wv:c`C:@\As"6d A7+TwCCWCwjJ_< +HX+XRNjo1W_:2O},<20BHEttt]tR0#l; +wW?WQg2=S8WNiEb1etnJKKKKK7Kz=N+E +R*C*r|NrdCfp&4}{)^CCCCCCCWCkjJ_< +HX+XRNjo1W5qBfY!{g2WWWWWWhW&njZ# + +|BcBO-Sg&)tcGZPxUZU[`kP))))J)K4u;* +{wSwfYx:jK0-(AJnPPAnJKKKKKK7Kz=N+E +R*C*r|NrdC{)^y:|RCCCCCCCCCCWCwjJ_< +HX+XRNjo1W{g20_(:,2HnZ=,uuu~uL^!5C +|BcBO-Sg&)tcGZ`YxtPxf))))))J)M4u;;K;* +{wSwfYx:jK0-(A>a\U%%%%%%%%%=%C>h,3 +tSdST/9NkEwO-b6`n(b04rb[uWWhW:S&$)&SS&&&&&&&G +41`1Vra/+0*"2K>aq1K_CKm9EEElEfm~ H + +1bIb+*i-?H%!+i-bfya))))))J)K4u;* +{wSwfYx:jK~\Avq[qAvaA?T::>:f$)&G +41`1Vra/+0_CKZm-bn[=N"WWWhWXnjZ# +1bIb+*i-?H-(.A\i-bfya))))J)M4u;* + +:{U^ U V` + +T2%94/0Xz9XK+^S.dY, +KK3V9/`9*B)9B*llC% +%% /1OrySuJyu1%SaS[ +00(zX^Nb2]~b]ko7wD +uu'Jbr*oBn#oncABiBm +HHowYR&QXyFh/r;I +``{LniN\PZ} +EEo[B0s4K0 PN{/{D +uuJXgbJ2v7kx +tti-{SiQR/gX +88DckCQ=GqSQG_jI +``-{3!i2F, +KKU`5R~C% +%%\rh&4dp[ +00)Nq&o +;C +8\|1ittA-Dq#?TMH/gFW?&X).=qvY^ +Q{G cKKKKKKKKK383A|VTE +~KpRKp::::::::r|VA1[hA[`rS%M< +udH;9000000000RNhb2]~b]koKs*5qB# +XMk1Mku.L)5luu+*OoBn#onicB\4; +RlSwlSH,mpTwdwt +*-xm-x````````{WwJ:A9mNAmj`dRG +LjN4jN%0|{;,n% /1OrySuJyud%SaS< +udH;9004=Tg 007HuBgKuBKudr +&)jR)jE{de MEE?RP& bP&b&)jb}2j2H +5qBwqBWV>TZ'WWGw\5Z0\505qB0y7C +8\|1ittT^{l`ttL|8*Ro8*o8\; +RlSwlSH,~pTZ'WWGw\5&0\505qB0y7C +8\|1ittT^{l`ttL|8*Jo8*o8\; +RlSwlSH,~pTZ'WWGw\5^0\50\H# +XMk1Mku.&)5luuq1vX\2vX2XMk2{bkbC +*1i|1itT^{l`ttL|8*Go8*o*1io-T$ +l0Wp2)))))))))==dQSY{:c{E +~KpRKp::::::::C| rapy29a< +B;9H;900000000)RX89u^NH +5qBwqBWWWWWWWW7p.0e/N2ul%# +XMk1Mku.`)5luu'%92(dZeOdZdE; +RlSwlSH,ypRPSr +P5R)jEE{Ce MEEo[B0s4K0 PN{lC:tC +8\|1ittTJ{l`tt-xSi/QWi-n].AK*b9* +vDd{Dd84"KC|88YaxiFvwi)8Pffs~^ + cG cK,!6+wKK`Pp9lr*9nq?MaMG +RK4jN%%0|;,n%%/LQ1/ARKN3 +fpt9aCC#wZ_BCCa/(9KRB)NH +\HwqBWWWWWWWWWq7jZ0[f)10fY!# +v71MkuuuuuuuuuM'!52v{C +-T/QR/l#g + +v*F-W:K9Vc9A39j9U|K) +::*l^|Kh*% Q/B*%RK r4[Cd/G(N3B +WWs\))\cDWjGy7!xuI*E8\mtB8\m +HH/rMHg?qX +88TYJm*|,`F:/|Vj{HKU`5~| +E< +udH;900)Nq*3k5BE}o)w51DWsyrX*; +YTwlSHHW/qg0uX)sq-R* +.0{Dd884"KC|8.0cYW^ +Q{G cKKj`Fd|/*%`r@fp[C%fhhfX[CJr/dlr +P5R)jEE{%e ME2P5H +5qBwqBWyXgC +*1i|1itTRR{l`tA#; + +W & D=dY|`{gWkf <`O`=.3!^ + +|K\VL\j/r + + +45sqYyubJkb2'Jvg*k +HHHH]MHFMH.MH-MH.YTMH9YTM +))))t-RX)ysw0qx=cYx,`I#pg~:3`p%:gB!Fpn*p*%:g0`^A~*l% +%%%%fjN+jN*% LjN*%Y +CCCCE< + +QQEr]oW~5YY5p\HGWh{,3 +tSdST/9NkE(X5*6&2}7)8ElEUm~f H +,,W/ y'*t!*\ic*Ct#8i4tBc-H YSvYTHg qr)s-lq= +mw|wv:c`C:r~l|%=%$/L]RQ$3 +tSdST/9NkEh&}oPq[WhWh,3 +tSdST/9NkEVXR211[HWhW>mw|wv:c`C:^~~Cl9P::>:&G +##41`1Vra/+08BB+)Kk00s0gr +QQR2k2hoByIugXXI{2/tt]tl; +wW?WQg2=S8_{fQdH{Y`O`%wWxwi{W2g:dE + +41`1Vra/+0RX(v0s03]M?""""r + +\HwqBWNDW`DW{DW DW{\HDW$\H# +v71Mku1im +HH/gFW?&X +88TYJgW|p, +KKU`5~| +E< +udH;90*zv}0Z(9r +P5R)jE$ky}5BE(jk&~o# +v71Mku.&)5luHbkb=7C +8\|1itT^{l`t AAc-{{$ +l0Wp2)]lX)"lX)"qRlX)tsl* +vDd{Dd8;wjY-m,`$|',`Pgk^ + cG cK_ HK_ `%:q~%:q~|*%"QBL*%"QBLr< +B;9H;904>mw|wv:c`C:^~~Cl90::>:&G +##41`1Vra/+08BB+)KfEElE H +wK1K4yk*ctC|Ooi$|-H1HOW#SWi{?WQO$ + +{wSwfYx:jK~\~[ADqPK7Kr1=m+E + +RK4jN%lwpS[C"{4}< +udH;904>mw|wv:c`C:^~~Cl9h%%=%,3 +tSdST/9NkE3RhbjXRoWhWoKYBK0q~4o# + +8\|1itt8o1EOo4-SHHHHHHHHHHHHHHHHHHHHHH$}}BpHljQHY{HYT{SWTSYWSg.)uw)ps=S8CK0vd8888 +2pm-x``2im|*(|wv``````````````````````^>>I2(pwW`xMwx`2p2x2wx:3K9KGj lj9^K3`'K|KQr +udH;900uKNk21oWWWWWWWWWWWWWWWWWWWWWWWW#,,l\GHKYWB KBW\H\B\KBy'ub7u*cB4-H{g=9t*1i|1it84t14-/P +l0Wp2))lZ &q-R))))))))))))))))))))))))*TTt-?qR)l0Wp2)2r 2)q?02&?-s)2r=8wTTSY{{`|:lQ3c`C +RK4jN%%RA1` [RHN%%%%%%%%%%%%%%%%%%%%%%3##"R]K1/%N[1N%\ra/+RudN1Ev]oB yIukXu'Sv?kukS*tBAAc-{{H?g{ls2=S8vS8.0GSYv:{cKQcK {K9{Kqt0P>K`lb|? +fpt9aCCfySd%fpCCCCCCCCCCCCCCCCCCCCCCCC<**:/+uXz0udH;909B09?NE2}}ko77W1yqv'k*c +YTwlSHHYi/?/YTHHHHHHHHHHHHHHHHHHHHHHHH$}}Kg&l -)l0Wp2)2?)2r=8Twdw8SY(2{x:jSK~cKQ3K 3`l:p~:|KNrdCSC%SaSC12d%C1u/d0W+u9ud709B09?NE4O7= +\HwqBWW\0s1fY!WWWWWWWWWWWWWWWWWWWWWWWW#,,{Y5f!W\HwqBWB KBWf5HB15Y7WB yu{bkbuI*L84i-?HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH +l0Wp2))lZ.&srlQ2))))))))))))))))))))))*TT"l{0 -)2r 2).=dY|v2p:3K$m`pB|`%NL% [RHN%N[rC%SaSCd/7u(9NkE&kE3&2}EPjE&5E2Enyw6#EosGyQ +8\|1itt8oiA*o1tttttttttttttttttttttttt; +RlSwlSHRiS/YilHHHHHHHHHHHHHHHHHHHHHHHH$ +?p2Wp2)?Z2DsZp))))))))))))))))))))))))* +vDd{Dd8vQdGjQD888888888888888888888888t +*-xm-x`*i{M2Zxi-``````````````````````^ + cG cK A GU9c`9K:::::::::::::::::::::G +LjN4jN%LA`jKR\/ry9CCCCCCCCCCCCCCCCCCCC< +B;9H;90BK+9HKl;(k000000000000000000000r P?u(0B;9H;90(u7dXz0u(0BH9uBdXz0Xd)0Bdzk0dNosy{uv?ukS*tc-W#GSYQg)U"`)Q=wdDSY`2{`-{:US +~KpRKp:~9KFr9)Kd0:::::::::::::::::::::GIIg!b`*V:pB*p:!`l!^*p| %@[rpCau/0RNh&kXEP1EV4(_ERo1~514\HGWKW(C_2CNPW51W:nZOEt8\4ic1!i8*\s +RlSwlSHRiR{qHHHHHHHHHHHHHHHHHHHHHHHHHH$}}%lSwlSHRjHSvg)l02=S0w_8vcG.__wdvSn +*-xm-x`*iF|F*-x```````````````````````^>>I:jQ9VK cG cK %Kcm`:l*p*:C|]R NrdK +B;9H;90BK;(Nkfbq23P}EEEEEEEEEEEEEEEEEEH +5qBwqBW50q7yI52rbJv{uuuuuuuuuuuuuuuuuuC + +g0.D?.p-= + + +r~lKV|%1/N1AjHVA]\\\.RK*%LjN^3 + + HX+XRNjo1Wf551s0[WWhWZ# +ss1bIb+*i-?HqRR?/iIHH1H<$ +TTW & D=dY|`g**|FirKK7K+E +R*C*r|NrdC4tTyaMt/0s0|Xz9XK;GRK7)))|r + +\HwqBWW\H# +XMk1MkuXMkC + +g0.D?.p-= + +^ U V`:*Vp*9KFrV:7 +%%jHVAQ K*%jHVA QB*%jHVA \R*%jHVA \L* +CC%/^HB+}0)Nq*3k5BE}o)5y +V; +YTwlSHHljQiq{TMHljQi{q0MHljQi{/Y$ +?p2Wp2)pQDZs.?* +.0{Dd88TYJgW|p,`F:/G jHKU`5~|3 +/d)RB);zN + + +O*A1C-HW#SWiljQ{H` +))))lZpQDZs=dI +````2i*{gi:{9H +::::!9KFr9FV*dB9^d`% +%%%%RAjHVAH/1 [A Q/B* +CCCCfy9@Ty@4S=uy=%f[ +0000BKB(8} +EEEE&b)uhbu321]b1}&B +WWWWsyr1XIx +ttttA-Dq#?TM +)))).=qvY +KKKKpE + +##41`1Vra/+08BB+)Ky00s0gr +QQR2k2hoByIugXXI{2-uu~u5C +YY|BcBO-Sg&)q??&.Z(88~8Ct +mw|wv:c`C:VRr9p0R|%=%$1/N1AjHV $3 + +udH;900uK;GRK(NjH +\HwqBWW\057f0y7bC +8\|1itt8o1EOoECB4no!4\; +YTwlSHHYiljQij#W{vi{q#0$ +l0Wp2))lZpQDZQ- srZs.l* +vDd{Dd8vQvcGt +*-xm-x`*i-ZviZWw{Mi{F*^ +Q{G coKU`5^VC`%:l|O4L`*%\rh2/r + +y7{+X{MJ* + + +fvTD_Y`wWxwiL|wv] +KK:a`*% +%%l /B* +CC+fp[ +00t[))+} +EEyg}}kB +WW 5qBD +uu{*W|*cm +HH/gFq-&0X +88TYJ*: +8G + +**tSdST/9NkE*&&k}b8EElE H +,,wK1K4yk*ct!**cAo$tt]tl; +}}wW?WQg2=S8GvvSTQ:``O`!^ +G9j9^`p|`%/4VANo4rCWC;S4aSy1dST;< + +R2k2hoByIu=,=d2fZ$u~uLwN^S5C + +YTwlSH3b0 X)+t-R* +.0{Dd84AKC|8m.0t +2pm-x`@Q4!o`1PFF|^ +Q{G cK,!6+wKtqUUjE +~KpRKp:-io&J:n~KpG +RK4jN%\rh&4dp[C%/^HB+}0)Nq&o# + +-T/QR/l#g diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/coverage.rpt.gz b/hardware/portapack_h4m/CPLD/Supra/alta_db/coverage.rpt.gz new file mode 100644 index 00000000..c1ae0075 Binary files /dev/null and b/hardware/portapack_h4m/CPLD/Supra/alta_db/coverage.rpt.gz differ diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/filtered.vx b/hardware/portapack_h4m/CPLD/Supra/alta_db/filtered.vx new file mode 100644 index 00000000..457460e9 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/alta_db/filtered.vx @@ -0,0 +1,2929 @@ +`timescale 1 ps/ 1 ps + +module top( + MCU_D, + MCU_DIR, + MCU_IO_STBX, + MCU_LCD_WRX, + MCU_ADDR, + MCU_LCD_TE, + MCU_P2_8, + MCU_LCD_RDX, + TP_U, + TP_D, + TP_L, + TP_R, + SW_SEL, + SW_ROT_A, + SW_ROT_B, + SW_U, + SW_D, + SW_L, + SW_R, + LCD_RESETX, + LCD_RS, + LCD_WRX, + LCD_RDX, + LCD_DB, + LCD_TE, + LCD_BACKLIGHT, + SYSOFF, + AUDIO_RESETX, + REF_EN, + GPS_RESETX, + GPS_TX_READY, + GPS_TIMEPULSE, + DEVICE_RESET, + DEVICE_RESET_V); +output [7:0] MCU_D; +input MCU_DIR; +input MCU_IO_STBX; +input MCU_LCD_WRX; +input MCU_ADDR; +output MCU_LCD_TE; +input MCU_P2_8; +input MCU_LCD_RDX; +output TP_U; +output TP_D; +output TP_L; +output TP_R; +input SW_SEL; +input SW_ROT_A; +input SW_ROT_B; +input SW_U; +input SW_D; +input SW_L; +input SW_R; +output LCD_RESETX; +output LCD_RS; +output LCD_WRX; +output LCD_RDX; +output [15:0] LCD_DB; +input LCD_TE; +output LCD_BACKLIGHT; +output SYSOFF; +output AUDIO_RESETX; +output REF_EN; +output GPS_RESETX; +input GPS_TX_READY; +input GPS_TIMEPULSE; +input DEVICE_RESET; +input DEVICE_RESET_V; + +// module hard_block +// Design Ports Information +// ~ALTERA_ASDO_DATA1~ => Location: PIN_F4, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_FLASH_nCE_nCSO~ => Location: PIN_E2, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_DCLK~ => Location: PIN_P3, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_DATA0~ => Location: PIN_N7, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_nCEO~ => Location: PIN_P28, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA + +// module top +// Design Ports Information +// MCU_LCD_TE => Location: PIN_AC4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_P2_8 => Location: PIN_D6, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// TP_U => Location: PIN_AA4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// TP_D => Location: PIN_AB3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// TP_L => Location: PIN_AA3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// TP_R => Location: PIN_AD1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_RESETX => Location: PIN_AB4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_RS => Location: PIN_AF2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_WRX => Location: PIN_M1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_RDX => Location: PIN_R6, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_BACKLIGHT => Location: PIN_W3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// SYSOFF => Location: PIN_AE2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// AUDIO_RESETX => Location: PIN_AE1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// REF_EN => Location: PIN_AC5, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// GPS_RESETX => Location: PIN_AC26, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// GPS_TX_READY => Location: PIN_D9, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// GPS_TIMEPULSE => Location: PIN_E25, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// DEVICE_RESET => Location: PIN_AF15, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// DEVICE_RESET_V => Location: PIN_AE25, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_D[0] => Location: PIN_AC1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[1] => Location: PIN_AC3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[2] => Location: PIN_AD3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[3] => Location: PIN_V3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[4] => Location: PIN_V2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[5] => Location: PIN_V1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[6] => Location: PIN_Y3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[7] => Location: PIN_AC2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[0] => Location: PIN_U5, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[1] => Location: PIN_AB1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[2] => Location: PIN_U2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[3] => Location: PIN_T3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[4] => Location: PIN_R5, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[5] => Location: PIN_T4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[6] => Location: PIN_Y4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[7] => Location: PIN_AB2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[8] => Location: PIN_U6, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[9] => Location: PIN_U1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[10] => Location: PIN_V4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[11] => Location: PIN_R2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[12] => Location: PIN_R1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[13] => Location: PIN_R4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[14] => Location: PIN_W2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[15] => Location: PIN_W1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_TE => Location: PIN_AB6, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_ADDR => Location: PIN_AB5, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_LCD_WRX => Location: PIN_Y1, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_LCD_RDX => Location: PIN_Y2, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_IO_STBX => Location: PIN_J1, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_DIR => Location: PIN_AD2, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_R => Location: PIN_U8, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_L => Location: PIN_U7, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_D => Location: PIN_T7, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_U => Location: PIN_R3, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_SEL => Location: PIN_U3, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_ROT_A => Location: PIN_U4, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_ROT_B => Location: PIN_T8, I/O Standard: 3.3-V LVTTL, Current Strength: Default + +//wire gnd; +//wire gnd; +//wire vcc; +//wire vcc; +//wire \AUDIO_RESETX~output_o ; +wire \DEVICE_RESET_V~input_o ; +wire \DEVICE_RESET~input_o ; +//wire \GPS_RESETX~output_o ; +wire \GPS_TIMEPULSE~input_o ; +wire \GPS_TX_READY~input_o ; +//wire \LCD_BACKLIGHT~output_o ; +//wire \LCD_DB[0]~output_o ; +wire \LCD_DB[0]~input_o ; +//wire \LCD_DB[10]~output_o ; +wire \LCD_DB[10]~input_o ; +//wire \LCD_DB[11]~output_o ; +wire \LCD_DB[11]~input_o ; +//wire \LCD_DB[12]~output_o ; +wire \LCD_DB[12]~input_o ; +//wire \LCD_DB[13]~output_o ; +wire \LCD_DB[13]~input_o ; +//wire \LCD_DB[14]~output_o ; +wire \LCD_DB[14]~input_o ; +//wire \LCD_DB[15]~output_o ; +wire \LCD_DB[15]~input_o ; +//wire \LCD_DB[1]~output_o ; +wire \LCD_DB[1]~input_o ; +//wire \LCD_DB[2]~output_o ; +wire \LCD_DB[2]~input_o ; +//wire \LCD_DB[3]~output_o ; +wire \LCD_DB[3]~input_o ; +//wire \LCD_DB[4]~output_o ; +wire \LCD_DB[4]~input_o ; +//wire \LCD_DB[5]~output_o ; +wire \LCD_DB[5]~input_o ; +//wire \LCD_DB[6]~output_o ; +wire \LCD_DB[6]~input_o ; +//wire \LCD_DB[7]~output_o ; +wire \LCD_DB[7]~input_o ; +//wire \LCD_DB[8]~output_o ; +wire \LCD_DB[8]~input_o ; +//wire \LCD_DB[9]~output_o ; +wire \LCD_DB[9]~input_o ; +//wire \LCD_RDX~output_o ; +//wire \LCD_RESETX~output_o ; +//wire \LCD_RS~output_o ; +wire \LCD_TE~input_o ; +//wire \LCD_WRX~output_o ; +wire \MCU_ADDR~input_o ; +wire \MCU_DIR~input_o ; +//wire \MCU_D[0]~output_o ; +wire \MCU_D[0]~input_o ; +//wire \MCU_D[1]~output_o ; +wire \MCU_D[1]~input_o ; +//wire \MCU_D[2]~output_o ; +wire \MCU_D[2]~input_o ; +//wire \MCU_D[3]~output_o ; +wire \MCU_D[3]~input_o ; +//wire \MCU_D[4]~output_o ; +wire \MCU_D[4]~input_o ; +//wire \MCU_D[5]~output_o ; +wire \MCU_D[5]~input_o ; +//wire \MCU_D[6]~output_o ; +wire \MCU_D[6]~input_o ; +//wire \MCU_D[7]~output_o ; +wire \MCU_D[7]~input_o ; +wire \MCU_IO_STBX~input_o ; +wire \MCU_IO_STBX~inputclkctrl_outclk ; +wire \MCU_LCD_RDX~input_o ; +wire \MCU_LCD_RDX~inputclkctrl_outclk ; +//wire \MCU_LCD_TE~output_o ; +wire \MCU_LCD_WRX~input_o ; +wire \MCU_LCD_WRX~inputclkctrl_outclk ; +wire \MCU_P2_8~input_o ; +//wire \REF_EN~output_o ; +wire \SW_D~input_o ; +wire \SW_L~input_o ; +wire \SW_ROT_A~input_o ; +wire \SW_ROT_B~input_o ; +wire \SW_R~input_o ; +wire \SW_SEL~input_o ; +wire \SW_U~input_o ; +//wire \SYSOFF~output_o ; +//wire \TP_D~output_o ; +//wire \TP_L~output_o ; +//wire \TP_R~output_o ; +//wire \TP_U~output_o ; +wire \audio_reset_q~0_combout ; +wire \audio_reset_q~q ; +//wire devclrn; +tri1 devclrn; +//wire devoe; +tri1 devoe; +//wire devpor; +tri1 devpor; +wire \lcd_backlight_q~feeder_combout ; +wire \lcd_backlight_q~q ; +wire [7:0] lcd_data_in_q; +//wire lcd_data_in_q[0]; +//wire lcd_data_in_q[1]; +//wire lcd_data_in_q[2]; +//wire lcd_data_in_q[3]; +//wire lcd_data_in_q[4]; +//wire lcd_data_in_q[5]; +//wire lcd_data_in_q[6]; +//wire lcd_data_in_q[7]; +wire [7:0] lcd_data_out_q; +//wire lcd_data_out_q[0]; +wire \lcd_data_out_q[0]~feeder_combout ; +//wire lcd_data_out_q[1]; +wire \lcd_data_out_q[1]~feeder_combout ; +//wire lcd_data_out_q[2]; +wire \lcd_data_out_q[2]~feeder_combout ; +//wire lcd_data_out_q[3]; +//wire lcd_data_out_q[4]; +wire \lcd_data_out_q[4]~feeder_combout ; +//wire lcd_data_out_q[5]; +//wire lcd_data_out_q[6]; +//wire lcd_data_out_q[7]; +wire \lcd_data_out_q[7]~feeder_combout ; +wire \lcd_reset_q~0_combout ; +wire \lcd_reset_q~1_combout ; +wire \lcd_reset_q~q ; +wire \mcu_data_out[0]~0_combout ; +wire \mcu_data_out[0]~1_combout ; +wire \mcu_data_out[1]~2_combout ; +wire \mcu_data_out[1]~3_combout ; +wire \mcu_data_out[2]~4_combout ; +wire \mcu_data_out[2]~5_combout ; +wire \mcu_data_out[3]~6_combout ; +wire \mcu_data_out[3]~7_combout ; +wire \mcu_data_out[4]~8_combout ; +wire \mcu_data_out[4]~9_combout ; +wire \mcu_data_out[5]~10_combout ; +wire \mcu_data_out[5]~11_combout ; +wire \mcu_data_out[6]~12_combout ; +wire \mcu_data_out[6]~13_combout ; +wire \mcu_data_out[7]~14_combout ; +wire \mcu_data_out[7]~15_combout ; +wire \ref_en_q~feeder_combout ; +wire \ref_en_q~q ; +wire \sysoff_q~feeder_combout ; +wire \sysoff_q~q ; +wire [7:0] tp_q; +//wire tp_q[0]; +//wire tp_q[1]; +//wire tp_q[2]; +wire \tp_q[2]~feeder_combout ; +//wire tp_q[3]; +wire \tp_q[3]~0_combout ; +//wire tp_q[4]; +wire \tp_q[4]~feeder_combout ; +//wire tp_q[5]; +//wire tp_q[6]; +wire \tp_q[6]~feeder_combout ; +//wire tp_q[7]; +wire \tp_q[7]~feeder_combout ; +wire unknown; +wire unknown; +wire \~ALTERA_ASDO_DATA1~~ibuf_o ; +wire \~ALTERA_ASDO_DATA1~~padout ; +wire \~ALTERA_DATA0~~ibuf_o ; +wire \~ALTERA_DATA0~~padout ; +wire \~ALTERA_FLASH_nCE_nCSO~~ibuf_o ; +wire \~ALTERA_FLASH_nCE_nCSO~~padout ; + +wire vcc; +wire gnd; +assign vcc = 1'b1; +assign gnd = 1'b0; + +// Location: IOIBUF_X0_Y10_N0 +// alta_io_ibuf \SW_L~input ( +alta_io \SW_L~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_L~input_o ), + .regout(), + .padio(SW_L)); +defparam \SW_L~input .CFG_KEEP = 2'b00; +// defparam \SW_L~input .simulate_z_as = "z"; + +defparam \SW_L~input .coord_x = 0; +defparam \SW_L~input .coord_y = 10; +defparam \SW_L~input .coord_z = 0; +// Location: IOIBUF_X0_Y10_N1 +// alta_io_ibuf \SW_R~input ( +alta_io \SW_R~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_R~input_o ), + .regout(), + .padio(SW_R)); +defparam \SW_R~input .CFG_KEEP = 2'b00; +// defparam \SW_R~input .simulate_z_as = "z"; + +defparam \SW_R~input .coord_x = 0; +defparam \SW_R~input .coord_y = 10; +defparam \SW_R~input .coord_z = 1; +// Location: IOOBUF_X0_Y11_N0 +// alta_io_obuf \TP_U~output ( +alta_io \TP_U~output ( + .datain(tp_q[3]), + .oe(tp_q[7]), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(TP_U)); +defparam \TP_U~output .CFG_KEEP = 2'b00; +// defparam \TP_U~output .open_drain_output = "false"; + +defparam \TP_U~output .coord_x = 0; +defparam \TP_U~output .coord_y = 11; +defparam \TP_U~output .coord_z = 0; +// Location: IOOBUF_X0_Y11_N1 +// alta_io_obuf \TP_L~output ( +alta_io \TP_L~output ( + .datain(tp_q[1]), + .oe(tp_q[5]), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(TP_L)); +defparam \TP_L~output .CFG_KEEP = 2'b00; +// defparam \TP_L~output .open_drain_output = "false"; + +defparam \TP_L~output .coord_x = 0; +defparam \TP_L~output .coord_y = 11; +defparam \TP_L~output .coord_z = 1; +// Location: IOIBUF_X0_Y14_N1 +// alta_io_ibuf \SW_ROT_B~input ( +alta_io \SW_ROT_B~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_ROT_B~input_o ), + .regout(), + .padio(SW_ROT_B)); +defparam \SW_ROT_B~input .CFG_KEEP = 2'b00; +// defparam \SW_ROT_B~input .simulate_z_as = "z"; + +defparam \SW_ROT_B~input .coord_x = 0; +defparam \SW_ROT_B~input .coord_y = 14; +defparam \SW_ROT_B~input .coord_z = 1; +// Location: IOOBUF_X0_Y15_N2 +// alta_io_obuf \TP_R~output ( +alta_io \TP_R~output ( + .datain(tp_q[0]), + .oe(tp_q[4]), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(TP_R)); +defparam \TP_R~output .CFG_KEEP = 2'b00; +// defparam \TP_R~output .open_drain_output = "false"; + +defparam \TP_R~output .coord_x = 0; +defparam \TP_R~output .coord_y = 15; +defparam \TP_R~output .coord_z = 2; +// Location: IOOBUF_X0_Y15_N3 +// alta_io_obuf \TP_D~output ( +alta_io \TP_D~output ( + .datain(tp_q[2]), + .oe(tp_q[6]), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(TP_D)); +defparam \TP_D~output .CFG_KEEP = 2'b00; +// defparam \TP_D~output .open_drain_output = "false"; + +defparam \TP_D~output .coord_x = 0; +defparam \TP_D~output .coord_y = 15; +defparam \TP_D~output .coord_z = 3; +// Location: IOIBUF_X0_Y16_N1 +// alta_io_ibuf \MCU_D[1]~input ( +// Location: IOOBUF_X0_Y16_N1 +// alta_io_obuf \MCU_D[1]~output ( +alta_io \MCU_D[1]~output ( + .datain(\mcu_data_out[1]~3_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[1]~input_o ), + .regout(), + .padio(MCU_D[1])); +defparam \MCU_D[1]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[1]~input .simulate_z_as = "z"; +// defparam \MCU_D[1]~output .open_drain_output = "false"; + +defparam \MCU_D[1]~output .coord_x = 0; +defparam \MCU_D[1]~output .coord_y = 16; +defparam \MCU_D[1]~output .coord_z = 1; +// Location: IOIBUF_X0_Y16_N2 +// alta_io_ibuf \MCU_D[2]~input ( +// Location: IOOBUF_X0_Y16_N2 +// alta_io_obuf \MCU_D[2]~output ( +alta_io \MCU_D[2]~output ( + .datain(\mcu_data_out[2]~5_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[2]~input_o ), + .regout(), + .padio(MCU_D[2])); +defparam \MCU_D[2]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[2]~input .simulate_z_as = "z"; +// defparam \MCU_D[2]~output .open_drain_output = "false"; + +defparam \MCU_D[2]~output .coord_x = 0; +defparam \MCU_D[2]~output .coord_y = 16; +defparam \MCU_D[2]~output .coord_z = 2; +// Location: IOIBUF_X0_Y16_N3 +// alta_io_ibuf \MCU_DIR~input ( +alta_io \MCU_DIR~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_DIR~input_o ), + .regout(), + .padio(MCU_DIR)); +defparam \MCU_DIR~input .CFG_KEEP = 2'b00; +// defparam \MCU_DIR~input .simulate_z_as = "z"; + +defparam \MCU_DIR~input .coord_x = 0; +defparam \MCU_DIR~input .coord_y = 16; +defparam \MCU_DIR~input .coord_z = 3; +// Location: IOIBUF_X0_Y17_N1 +// alta_io_ibuf \MCU_D[0]~input ( +// Location: IOOBUF_X0_Y17_N1 +// alta_io_obuf \MCU_D[0]~output ( +alta_io \MCU_D[0]~output ( + .datain(\mcu_data_out[0]~1_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[0]~input_o ), + .regout(), + .padio(MCU_D[0])); +defparam \MCU_D[0]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[0]~input .simulate_z_as = "z"; +// defparam \MCU_D[0]~output .open_drain_output = "false"; + +defparam \MCU_D[0]~output .coord_x = 0; +defparam \MCU_D[0]~output .coord_y = 17; +defparam \MCU_D[0]~output .coord_z = 1; +// Location: IOIBUF_X0_Y18_N2 +// alta_io_ibuf \MCU_D[6]~input ( +// Location: IOOBUF_X0_Y18_N2 +// alta_io_obuf \MCU_D[6]~output ( +alta_io \MCU_D[6]~output ( + .datain(\mcu_data_out[6]~13_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[6]~input_o ), + .regout(), + .padio(MCU_D[6])); +defparam \MCU_D[6]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[6]~input .simulate_z_as = "z"; +// defparam \MCU_D[6]~output .open_drain_output = "false"; + +defparam \MCU_D[6]~output .coord_x = 0; +defparam \MCU_D[6]~output .coord_y = 18; +defparam \MCU_D[6]~output .coord_z = 2; +// Location: IOIBUF_X0_Y18_N3 +// alta_io_ibuf \MCU_D[7]~input ( +// Location: IOOBUF_X0_Y18_N3 +// alta_io_obuf \MCU_D[7]~output ( +alta_io \MCU_D[7]~output ( + .datain(\mcu_data_out[7]~15_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[7]~input_o ), + .regout(), + .padio(MCU_D[7])); +defparam \MCU_D[7]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[7]~input .simulate_z_as = "z"; +// defparam \MCU_D[7]~output .open_drain_output = "false"; + +defparam \MCU_D[7]~output .coord_x = 0; +defparam \MCU_D[7]~output .coord_y = 18; +defparam \MCU_D[7]~output .coord_z = 3; +// Location: IOIBUF_X0_Y19_N0 +// alta_io_ibuf \LCD_DB[8]~input ( +// Location: IOOBUF_X0_Y19_N0 +// alta_io_obuf \LCD_DB[8]~output ( +alta_io \LCD_DB[8]~output ( + .datain(lcd_data_out_q[0]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[8]~input_o ), + .regout(), + .padio(LCD_DB[8])); +defparam \LCD_DB[8]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[8]~input .simulate_z_as = "z"; +// defparam \LCD_DB[8]~output .open_drain_output = "false"; + +defparam \LCD_DB[8]~output .coord_x = 0; +defparam \LCD_DB[8]~output .coord_y = 19; +defparam \LCD_DB[8]~output .coord_z = 0; +// Location: IOIBUF_X0_Y19_N2 +// alta_io_ibuf \LCD_DB[0]~input ( +// Location: IOOBUF_X0_Y19_N2 +// alta_io_obuf \LCD_DB[0]~output ( +alta_io \LCD_DB[0]~output ( + .datain(\MCU_D[0]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[0]~input_o ), + .regout(), + .padio(LCD_DB[0])); +defparam \LCD_DB[0]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[0]~input .simulate_z_as = "z"; +// defparam \LCD_DB[0]~output .open_drain_output = "false"; + +defparam \LCD_DB[0]~output .coord_x = 0; +defparam \LCD_DB[0]~output .coord_y = 19; +defparam \LCD_DB[0]~output .coord_z = 2; +// Location: IOIBUF_X0_Y19_N3 +// alta_io_ibuf \LCD_DB[6]~input ( +// Location: IOOBUF_X0_Y19_N3 +// alta_io_obuf \LCD_DB[6]~output ( +alta_io \LCD_DB[6]~output ( + .datain(\MCU_D[6]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[6]~input_o ), + .regout(), + .padio(LCD_DB[6])); +defparam \LCD_DB[6]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[6]~input .simulate_z_as = "z"; +// defparam \LCD_DB[6]~output .open_drain_output = "false"; + +defparam \LCD_DB[6]~output .coord_x = 0; +defparam \LCD_DB[6]~output .coord_y = 19; +defparam \LCD_DB[6]~output .coord_z = 3; +// Location: IOIBUF_X0_Y20_N0 +// alta_io_ibuf \LCD_DB[14]~input ( +// Location: IOOBUF_X0_Y20_N0 +// alta_io_obuf \LCD_DB[14]~output ( +alta_io \LCD_DB[14]~output ( + .datain(lcd_data_out_q[6]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[14]~input_o ), + .regout(), + .padio(LCD_DB[14])); +defparam \LCD_DB[14]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[14]~input .simulate_z_as = "z"; +// defparam \LCD_DB[14]~output .open_drain_output = "false"; + +defparam \LCD_DB[14]~output .coord_x = 0; +defparam \LCD_DB[14]~output .coord_y = 20; +defparam \LCD_DB[14]~output .coord_z = 0; +// Location: IOIBUF_X0_Y20_N1 +// alta_io_ibuf \LCD_DB[15]~input ( +// Location: IOOBUF_X0_Y20_N1 +// alta_io_obuf \LCD_DB[15]~output ( +alta_io \LCD_DB[15]~output ( + .datain(lcd_data_out_q[7]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[15]~input_o ), + .regout(), + .padio(LCD_DB[15])); +defparam \LCD_DB[15]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[15]~input .simulate_z_as = "z"; +// defparam \LCD_DB[15]~output .open_drain_output = "false"; + +defparam \LCD_DB[15]~output .coord_x = 0; +defparam \LCD_DB[15]~output .coord_y = 20; +defparam \LCD_DB[15]~output .coord_z = 1; +// Location: IOIBUF_X0_Y21_N0 +// alta_io_ibuf \LCD_DB[7]~input ( +// Location: IOOBUF_X0_Y21_N0 +// alta_io_obuf \LCD_DB[7]~output ( +alta_io \LCD_DB[7]~output ( + .datain(\MCU_D[7]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[7]~input_o ), + .regout(), + .padio(LCD_DB[7])); +defparam \LCD_DB[7]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[7]~input .simulate_z_as = "z"; +// defparam \LCD_DB[7]~output .open_drain_output = "false"; + +defparam \LCD_DB[7]~output .coord_x = 0; +defparam \LCD_DB[7]~output .coord_y = 21; +defparam \LCD_DB[7]~output .coord_z = 0; +// Location: IOIBUF_X0_Y21_N1 +// alta_io_ibuf \LCD_DB[1]~input ( +// Location: IOOBUF_X0_Y21_N1 +// alta_io_obuf \LCD_DB[1]~output ( +alta_io \LCD_DB[1]~output ( + .datain(\MCU_D[1]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[1]~input_o ), + .regout(), + .padio(LCD_DB[1])); +defparam \LCD_DB[1]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[1]~input .simulate_z_as = "z"; +// defparam \LCD_DB[1]~output .open_drain_output = "false"; + +defparam \LCD_DB[1]~output .coord_x = 0; +defparam \LCD_DB[1]~output .coord_y = 21; +defparam \LCD_DB[1]~output .coord_z = 1; +// Location: IOIBUF_X0_Y22_N1 +// alta_io_ibuf \MCU_D[5]~input ( +// Location: IOOBUF_X0_Y22_N1 +// alta_io_obuf \MCU_D[5]~output ( +alta_io \MCU_D[5]~output ( + .datain(\mcu_data_out[5]~11_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[5]~input_o ), + .regout(), + .padio(MCU_D[5])); +defparam \MCU_D[5]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[5]~input .simulate_z_as = "z"; +// defparam \MCU_D[5]~output .open_drain_output = "false"; + +defparam \MCU_D[5]~output .coord_x = 0; +defparam \MCU_D[5]~output .coord_y = 22; +defparam \MCU_D[5]~output .coord_z = 1; +// Location: IOIBUF_X0_Y23_N0 +// alta_io_ibuf \MCU_D[3]~input ( +// Location: IOOBUF_X0_Y23_N0 +// alta_io_obuf \MCU_D[3]~output ( +alta_io \MCU_D[3]~output ( + .datain(\mcu_data_out[3]~7_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[3]~input_o ), + .regout(), + .padio(MCU_D[3])); +defparam \MCU_D[3]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[3]~input .simulate_z_as = "z"; +// defparam \MCU_D[3]~output .open_drain_output = "false"; + +defparam \MCU_D[3]~output .coord_x = 0; +defparam \MCU_D[3]~output .coord_y = 23; +defparam \MCU_D[3]~output .coord_z = 0; +// Location: IOIBUF_X0_Y23_N1 +// alta_io_ibuf \MCU_D[4]~input ( +// Location: IOOBUF_X0_Y23_N1 +// alta_io_obuf \MCU_D[4]~output ( +alta_io \MCU_D[4]~output ( + .datain(\mcu_data_out[4]~9_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[4]~input_o ), + .regout(), + .padio(MCU_D[4])); +defparam \MCU_D[4]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[4]~input .simulate_z_as = "z"; +// defparam \MCU_D[4]~output .open_drain_output = "false"; + +defparam \MCU_D[4]~output .coord_x = 0; +defparam \MCU_D[4]~output .coord_y = 23; +defparam \MCU_D[4]~output .coord_z = 1; +// Location: IOIBUF_X0_Y24_N0 +// alta_io_ibuf \LCD_DB[2]~input ( +// Location: IOOBUF_X0_Y24_N0 +// alta_io_obuf \LCD_DB[2]~output ( +alta_io \LCD_DB[2]~output ( + .datain(\MCU_D[2]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[2]~input_o ), + .regout(), + .padio(LCD_DB[2])); +defparam \LCD_DB[2]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[2]~input .simulate_z_as = "z"; +// defparam \LCD_DB[2]~output .open_drain_output = "false"; + +defparam \LCD_DB[2]~output .coord_x = 0; +defparam \LCD_DB[2]~output .coord_y = 24; +defparam \LCD_DB[2]~output .coord_z = 0; +// Location: IOIBUF_X0_Y24_N1 +// alta_io_ibuf \LCD_DB[9]~input ( +// Location: IOOBUF_X0_Y24_N1 +// alta_io_obuf \LCD_DB[9]~output ( +alta_io \LCD_DB[9]~output ( + .datain(lcd_data_out_q[1]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[9]~input_o ), + .regout(), + .padio(LCD_DB[9])); +defparam \LCD_DB[9]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[9]~input .simulate_z_as = "z"; +// defparam \LCD_DB[9]~output .open_drain_output = "false"; + +defparam \LCD_DB[9]~output .coord_x = 0; +defparam \LCD_DB[9]~output .coord_y = 24; +defparam \LCD_DB[9]~output .coord_z = 1; +// Location: IOIBUF_X0_Y24_N3 +// alta_io_ibuf \LCD_DB[10]~input ( +// Location: IOOBUF_X0_Y24_N3 +// alta_io_obuf \LCD_DB[10]~output ( +alta_io \LCD_DB[10]~output ( + .datain(lcd_data_out_q[2]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[10]~input_o ), + .regout(), + .padio(LCD_DB[10])); +defparam \LCD_DB[10]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[10]~input .simulate_z_as = "z"; +// defparam \LCD_DB[10]~output .open_drain_output = "false"; + +defparam \LCD_DB[10]~output .coord_x = 0; +defparam \LCD_DB[10]~output .coord_y = 24; +defparam \LCD_DB[10]~output .coord_z = 3; +// Location: IOIBUF_X0_Y25_N2 +// alta_io_ibuf \SW_D~input ( +alta_io \SW_D~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_D~input_o ), + .regout(), + .padio(SW_D)); +defparam \SW_D~input .CFG_KEEP = 2'b00; +// defparam \SW_D~input .simulate_z_as = "z"; + +defparam \SW_D~input .coord_x = 0; +defparam \SW_D~input .coord_y = 25; +defparam \SW_D~input .coord_z = 2; +// Location: IOIBUF_X0_Y26_N0 +// alta_io_ibuf \LCD_DB[13]~input ( +// Location: IOOBUF_X0_Y26_N0 +// alta_io_obuf \LCD_DB[13]~output ( +alta_io \LCD_DB[13]~output ( + .datain(lcd_data_out_q[5]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[13]~input_o ), + .regout(), + .padio(LCD_DB[13])); +defparam \LCD_DB[13]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[13]~input .simulate_z_as = "z"; +// defparam \LCD_DB[13]~output .open_drain_output = "false"; + +defparam \LCD_DB[13]~output .coord_x = 0; +defparam \LCD_DB[13]~output .coord_y = 26; +defparam \LCD_DB[13]~output .coord_z = 0; +// Location: IOIBUF_X0_Y26_N1 +// alta_io_ibuf \LCD_DB[5]~input ( +// Location: IOOBUF_X0_Y26_N1 +// alta_io_obuf \LCD_DB[5]~output ( +alta_io \LCD_DB[5]~output ( + .datain(\MCU_D[5]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[5]~input_o ), + .regout(), + .padio(LCD_DB[5])); +defparam \LCD_DB[5]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[5]~input .simulate_z_as = "z"; +// defparam \LCD_DB[5]~output .open_drain_output = "false"; + +defparam \LCD_DB[5]~output .coord_x = 0; +defparam \LCD_DB[5]~output .coord_y = 26; +defparam \LCD_DB[5]~output .coord_z = 1; +// Location: IOIBUF_X0_Y26_N2 +// alta_io_ibuf \LCD_DB[3]~input ( +// Location: IOOBUF_X0_Y26_N2 +// alta_io_obuf \LCD_DB[3]~output ( +alta_io \LCD_DB[3]~output ( + .datain(\MCU_D[3]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[3]~input_o ), + .regout(), + .padio(LCD_DB[3])); +defparam \LCD_DB[3]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[3]~input .simulate_z_as = "z"; +// defparam \LCD_DB[3]~output .open_drain_output = "false"; + +defparam \LCD_DB[3]~output .coord_x = 0; +defparam \LCD_DB[3]~output .coord_y = 26; +defparam \LCD_DB[3]~output .coord_z = 2; +// Location: IOIBUF_X0_Y26_N3 +// alta_io_ibuf \LCD_DB[4]~input ( +// Location: IOOBUF_X0_Y26_N3 +// alta_io_obuf \LCD_DB[4]~output ( +alta_io \LCD_DB[4]~output ( + .datain(\MCU_D[4]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[4]~input_o ), + .regout(), + .padio(LCD_DB[4])); +defparam \LCD_DB[4]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[4]~input .simulate_z_as = "z"; +// defparam \LCD_DB[4]~output .open_drain_output = "false"; + +defparam \LCD_DB[4]~output .coord_x = 0; +defparam \LCD_DB[4]~output .coord_y = 26; +defparam \LCD_DB[4]~output .coord_z = 3; +// Location: IOIBUF_X0_Y28_N1 +// alta_io_ibuf \SW_ROT_A~input ( +alta_io \SW_ROT_A~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_ROT_A~input_o ), + .regout(), + .padio(SW_ROT_A)); +defparam \SW_ROT_A~input .CFG_KEEP = 2'b00; +// defparam \SW_ROT_A~input .simulate_z_as = "z"; + +defparam \SW_ROT_A~input .coord_x = 0; +defparam \SW_ROT_A~input .coord_y = 28; +defparam \SW_ROT_A~input .coord_z = 1; +// Location: IOIBUF_X0_Y28_N2 +// alta_io_ibuf \SW_U~input ( +alta_io \SW_U~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_U~input_o ), + .regout(), + .padio(SW_U)); +defparam \SW_U~input .CFG_KEEP = 2'b00; +// defparam \SW_U~input .simulate_z_as = "z"; + +defparam \SW_U~input .coord_x = 0; +defparam \SW_U~input .coord_y = 28; +defparam \SW_U~input .coord_z = 2; +// Location: IOIBUF_X0_Y29_N0 +// alta_io_ibuf \LCD_DB[11]~input ( +// Location: IOOBUF_X0_Y29_N0 +// alta_io_obuf \LCD_DB[11]~output ( +alta_io \LCD_DB[11]~output ( + .datain(lcd_data_out_q[3]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[11]~input_o ), + .regout(), + .padio(LCD_DB[11])); +defparam \LCD_DB[11]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[11]~input .simulate_z_as = "z"; +// defparam \LCD_DB[11]~output .open_drain_output = "false"; + +defparam \LCD_DB[11]~output .coord_x = 0; +defparam \LCD_DB[11]~output .coord_y = 29; +defparam \LCD_DB[11]~output .coord_z = 0; +// Location: IOIBUF_X0_Y29_N1 +// alta_io_ibuf \LCD_DB[12]~input ( +// Location: IOOBUF_X0_Y29_N1 +// alta_io_obuf \LCD_DB[12]~output ( +alta_io \LCD_DB[12]~output ( + .datain(lcd_data_out_q[4]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[12]~input_o ), + .regout(), + .padio(LCD_DB[12])); +defparam \LCD_DB[12]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[12]~input .simulate_z_as = "z"; +// defparam \LCD_DB[12]~output .open_drain_output = "false"; + +defparam \LCD_DB[12]~output .coord_x = 0; +defparam \LCD_DB[12]~output .coord_y = 29; +defparam \LCD_DB[12]~output .coord_z = 1; +// Location: IOOBUF_X0_Y29_N2 +// alta_io_obuf \LCD_RDX~output ( +alta_io \LCD_RDX~output ( + .datain(\MCU_LCD_RDX~input_o ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(LCD_RDX)); +defparam \LCD_RDX~output .CFG_KEEP = 2'b00; +// defparam \LCD_RDX~output .open_drain_output = "false"; + +defparam \LCD_RDX~output .coord_x = 0; +defparam \LCD_RDX~output .coord_y = 29; +defparam \LCD_RDX~output .coord_z = 2; +// Location: IOIBUF_X0_Y29_N3 +// alta_io_ibuf \SW_SEL~input ( +alta_io \SW_SEL~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_SEL~input_o ), + .regout(), + .padio(SW_SEL)); +defparam \SW_SEL~input .CFG_KEEP = 2'b00; +// defparam \SW_SEL~input .simulate_z_as = "z"; + +defparam \SW_SEL~input .coord_x = 0; +defparam \SW_SEL~input .coord_y = 29; +defparam \SW_SEL~input .coord_z = 3; +// Location: IOIBUF_X0_Y30_N1 +// alta_io_ibuf \MCU_IO_STBX~input ( +alta_io \MCU_IO_STBX~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_IO_STBX~input_o ), + .regout(), + .padio(MCU_IO_STBX)); +defparam \MCU_IO_STBX~input .CFG_KEEP = 2'b00; +// defparam \MCU_IO_STBX~input .simulate_z_as = "z"; + +defparam \MCU_IO_STBX~input .coord_x = 0; +defparam \MCU_IO_STBX~input .coord_y = 30; +defparam \MCU_IO_STBX~input .coord_z = 1; +// Location: IOIBUF_X0_Y30_N2 +// alta_io_ibuf \MCU_LCD_RDX~input ( +alta_io \MCU_LCD_RDX~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_LCD_RDX~input_o ), + .regout(), + .padio(MCU_LCD_RDX)); +defparam \MCU_LCD_RDX~input .CFG_KEEP = 2'b00; +// defparam \MCU_LCD_RDX~input .simulate_z_as = "z"; + +defparam \MCU_LCD_RDX~input .coord_x = 0; +defparam \MCU_LCD_RDX~input .coord_y = 30; +defparam \MCU_LCD_RDX~input .coord_z = 2; +// Location: IOIBUF_X0_Y30_N3 +// alta_io_ibuf \MCU_LCD_WRX~input ( +alta_io \MCU_LCD_WRX~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_LCD_WRX~input_o ), + .regout(), + .padio(MCU_LCD_WRX)); +defparam \MCU_LCD_WRX~input .CFG_KEEP = 2'b00; +// defparam \MCU_LCD_WRX~input .simulate_z_as = "z"; + +defparam \MCU_LCD_WRX~input .coord_x = 0; +defparam \MCU_LCD_WRX~input .coord_y = 30; +defparam \MCU_LCD_WRX~input .coord_z = 3; +// Location: IOOBUF_X0_Y37_N0 +// alta_io_obuf \LCD_WRX~output ( +alta_io \LCD_WRX~output ( + .datain(\MCU_LCD_WRX~input_o ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(LCD_WRX)); +defparam \LCD_WRX~output .CFG_KEEP = 2'b00; +// defparam \LCD_WRX~output .open_drain_output = "false"; + +defparam \LCD_WRX~output .coord_x = 0; +defparam \LCD_WRX~output .coord_y = 37; +defparam \LCD_WRX~output .coord_z = 0; +// Location: IOOBUF_X0_Y4_N2 +// alta_io_obuf \LCD_RS~output ( +alta_io \LCD_RS~output ( + .datain(\MCU_ADDR~input_o ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(LCD_RS)); +defparam \LCD_RS~output .CFG_KEEP = 2'b00; +// defparam \LCD_RS~output .open_drain_output = "false"; + +defparam \LCD_RS~output .coord_x = 0; +defparam \LCD_RS~output .coord_y = 4; +defparam \LCD_RS~output .coord_z = 2; +// Location: IOIBUF_X0_Y4_N3 +// alta_io_ibuf \MCU_ADDR~input ( +alta_io \MCU_ADDR~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_ADDR~input_o ), + .regout(), + .padio(MCU_ADDR)); +defparam \MCU_ADDR~input .CFG_KEEP = 2'b00; +// defparam \MCU_ADDR~input .simulate_z_as = "z"; + +defparam \MCU_ADDR~input .coord_x = 0; +defparam \MCU_ADDR~input .coord_y = 4; +defparam \MCU_ADDR~input .coord_z = 3; +// Location: IOOBUF_X0_Y6_N2 +// alta_io_obuf \MCU_LCD_TE~output ( +alta_io \MCU_LCD_TE~output ( + .datain(\LCD_TE~input_o ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(MCU_LCD_TE)); +defparam \MCU_LCD_TE~output .CFG_KEEP = 2'b00; +// defparam \MCU_LCD_TE~output .open_drain_output = "false"; + +defparam \MCU_LCD_TE~output .coord_x = 0; +defparam \MCU_LCD_TE~output .coord_y = 6; +defparam \MCU_LCD_TE~output .coord_z = 2; +// Location: IOIBUF_X0_Y6_N3 +// alta_io_ibuf \LCD_TE~input ( +alta_io \LCD_TE~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_TE~input_o ), + .regout(), + .padio(LCD_TE)); +defparam \LCD_TE~input .CFG_KEEP = 2'b00; +// defparam \LCD_TE~input .simulate_z_as = "z"; + +defparam \LCD_TE~input .coord_x = 0; +defparam \LCD_TE~input .coord_y = 6; +defparam \LCD_TE~input .coord_z = 3; +// Location: IOOBUF_X0_Y7_N0 +// alta_io_obuf \LCD_RESETX~output ( +alta_io \LCD_RESETX~output ( + .datain(\lcd_reset_q~q ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(LCD_RESETX)); +defparam \LCD_RESETX~output .CFG_KEEP = 2'b00; +// defparam \LCD_RESETX~output .open_drain_output = "false"; + +defparam \LCD_RESETX~output .coord_x = 0; +defparam \LCD_RESETX~output .coord_y = 7; +defparam \LCD_RESETX~output .coord_z = 0; +// Location: IOOBUF_X0_Y7_N1 +// alta_io_obuf \REF_EN~output ( +alta_io \REF_EN~output ( + .datain(\ref_en_q~q ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(REF_EN)); +defparam \REF_EN~output .CFG_KEEP = 2'b00; +// defparam \REF_EN~output .open_drain_output = "false"; + +defparam \REF_EN~output .coord_x = 0; +defparam \REF_EN~output .coord_y = 7; +defparam \REF_EN~output .coord_z = 1; +// Location: IOOBUF_X0_Y8_N3 +// alta_io_obuf \LCD_BACKLIGHT~output ( +alta_io \LCD_BACKLIGHT~output ( + .datain(\lcd_backlight_q~q ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(LCD_BACKLIGHT)); +defparam \LCD_BACKLIGHT~output .CFG_KEEP = 2'b00; +// defparam \LCD_BACKLIGHT~output .open_drain_output = "false"; + +defparam \LCD_BACKLIGHT~output .coord_x = 0; +defparam \LCD_BACKLIGHT~output .coord_y = 8; +defparam \LCD_BACKLIGHT~output .coord_z = 3; +// Location: IOOBUF_X0_Y9_N1 +// alta_io_obuf \SYSOFF~output ( +alta_io \SYSOFF~output ( + .datain(\sysoff_q~q ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(SYSOFF)); +defparam \SYSOFF~output .CFG_KEEP = 2'b00; +// defparam \SYSOFF~output .open_drain_output = "false"; + +defparam \SYSOFF~output .coord_x = 0; +defparam \SYSOFF~output .coord_y = 9; +defparam \SYSOFF~output .coord_z = 1; +// Location: IOOBUF_X0_Y9_N2 +// alta_io_obuf \AUDIO_RESETX~output ( +alta_io \AUDIO_RESETX~output ( + .datain(\audio_reset_q~q ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(AUDIO_RESETX)); +defparam \AUDIO_RESETX~output .CFG_KEEP = 2'b00; +// defparam \AUDIO_RESETX~output .open_drain_output = "false"; + +defparam \AUDIO_RESETX~output .coord_x = 0; +defparam \AUDIO_RESETX~output .coord_y = 9; +defparam \AUDIO_RESETX~output .coord_z = 2; +// Location: IOIBUF_X18_Y62_N2 +// alta_io_ibuf \MCU_P2_8~input ( +alta_io \MCU_P2_8~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_P2_8~input_o ), + .regout(), + .padio(MCU_P2_8)); +defparam \MCU_P2_8~input .CFG_KEEP = 2'b00; +// defparam \MCU_P2_8~input .simulate_z_as = "z"; + +defparam \MCU_P2_8~input .coord_x = 18; +defparam \MCU_P2_8~input .coord_y = 62; +defparam \MCU_P2_8~input .coord_z = 2; +// Location: IOIBUF_X23_Y62_N3 +// alta_io_ibuf \GPS_TX_READY~input ( +alta_io \GPS_TX_READY~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\GPS_TX_READY~input_o ), + .regout(), + .padio(GPS_TX_READY)); +defparam \GPS_TX_READY~input .CFG_KEEP = 2'b00; +// defparam \GPS_TX_READY~input .simulate_z_as = "z"; + +defparam \GPS_TX_READY~input .coord_x = 23; +defparam \GPS_TX_READY~input .coord_y = 62; +defparam \GPS_TX_READY~input .coord_z = 3; +// Location: IOIBUF_X51_Y0_N0 +// alta_io_ibuf \DEVICE_RESET~input ( +alta_io \DEVICE_RESET~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\DEVICE_RESET~input_o ), + .regout(), + .padio(DEVICE_RESET)); +defparam \DEVICE_RESET~input .CFG_KEEP = 2'b00; +// defparam \DEVICE_RESET~input .simulate_z_as = "z"; + +defparam \DEVICE_RESET~input .coord_x = 51; +defparam \DEVICE_RESET~input .coord_y = 0; +defparam \DEVICE_RESET~input .coord_z = 0; +// Location: IOIBUF_X56_Y62_N0 +// alta_io_ibuf \GPS_TIMEPULSE~input ( +alta_io \GPS_TIMEPULSE~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\GPS_TIMEPULSE~input_o ), + .regout(), + .padio(GPS_TIMEPULSE)); +defparam \GPS_TIMEPULSE~input .CFG_KEEP = 2'b00; +// defparam \GPS_TIMEPULSE~input .simulate_z_as = "z"; + +defparam \GPS_TIMEPULSE~input .coord_x = 56; +defparam \GPS_TIMEPULSE~input .coord_y = 62; +defparam \GPS_TIMEPULSE~input .coord_z = 0; +// Location: IOIBUF_X78_Y0_N1 +// alta_io_ibuf \DEVICE_RESET_V~input ( +alta_io \DEVICE_RESET_V~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\DEVICE_RESET_V~input_o ), + .regout(), + .padio(DEVICE_RESET_V)); +defparam \DEVICE_RESET_V~input .CFG_KEEP = 2'b00; +// defparam \DEVICE_RESET_V~input .simulate_z_as = "z"; + +defparam \DEVICE_RESET_V~input .coord_x = 78; +defparam \DEVICE_RESET_V~input .coord_y = 0; +defparam \DEVICE_RESET_V~input .coord_z = 1; +// Location: IOOBUF_X94_Y9_N2 +// alta_io_obuf \GPS_RESETX~output ( +alta_io \GPS_RESETX~output ( + .datain(vcc), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(GPS_RESETX)); +defparam \GPS_RESETX~output .CFG_KEEP = 2'b00; +// defparam \GPS_RESETX~output .open_drain_output = "false"; + +defparam \GPS_RESETX~output .coord_x = 94; +defparam \GPS_RESETX~output .coord_y = 9; +defparam \GPS_RESETX~output .coord_z = 2; +// Location: CLKCTRL_G2 +alta_io_gclk \MCU_IO_STBX~inputclkctrl ( + .inclk (\MCU_IO_STBX~input_o ), + .outclk(\MCU_IO_STBX~inputclkctrl_outclk )); +//defparam \MCU_IO_STBX~inputclkctrl .clock_type = "global clock"; +//defparam \MCU_IO_STBX~inputclkctrl .ena_register_mode = "none"; + +// Location: CLKCTRL_G3 +alta_io_gclk \MCU_LCD_WRX~inputclkctrl ( + .inclk (\MCU_LCD_WRX~input_o ), + .outclk(\MCU_LCD_WRX~inputclkctrl_outclk )); +//defparam \MCU_LCD_WRX~inputclkctrl .clock_type = "global clock"; +//defparam \MCU_LCD_WRX~inputclkctrl .ena_register_mode = "none"; + +// Location: CLKCTRL_G4 +alta_io_gclk \MCU_LCD_RDX~inputclkctrl ( + .inclk (\MCU_LCD_RDX~input_o ), + .outclk(\MCU_LCD_RDX~inputclkctrl_outclk )); +//defparam \MCU_LCD_RDX~inputclkctrl .clock_type = "global clock"; +//defparam \MCU_LCD_RDX~inputclkctrl .ena_register_mode = "none"; + +// Location: LCCOMB_X1_Y15_N10 +// alta_lcell_comb \lcd_reset_q~0 ( +alta_slice \lcd_reset_q~0 ( + .A(vcc), + .B(vcc), + .C(\MCU_ADDR~input_o ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_reset_q~0_combout ), + .Cout(), + .Q()); +defparam \lcd_reset_q~0 .mask = 16'h00F0; +defparam \lcd_reset_q~0 .mode = "logic"; +defparam \lcd_reset_q~0 .modeMux = 1'b0; +defparam \lcd_reset_q~0 .FeedbackMux = 1'b0; +defparam \lcd_reset_q~0 .ShiftMux = 1'b0; +defparam \lcd_reset_q~0 .BypassEn = 1'b0; +defparam \lcd_reset_q~0 .CarryEnb = 1'b1; +defparam \lcd_reset_q~0 .AsyncResetMux = 2'bxx; +defparam \lcd_reset_q~0 .SyncResetMux = 2'bxx; +defparam \lcd_reset_q~0 .SyncLoadMux = 2'bxx; +defparam \lcd_reset_q~0 .coord_x = 1; +defparam \lcd_reset_q~0 .coord_y = 15; +defparam \lcd_reset_q~0 .coord_z = 5; +// Location: FF_X1_Y15_N12 +// alta_lcell_ff \tp_q[3] ( +alta_slice \tp_q[3] ( + .A(), + .B(), + .C(\MCU_D[3]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[3]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[3])); +defparam \tp_q[3] .mask = 16'hFFFF; +defparam \tp_q[3] .mode = "ripple"; +defparam \tp_q[3] .modeMux = 1'b1; +defparam \tp_q[3] .FeedbackMux = 1'b0; +defparam \tp_q[3] .ShiftMux = 1'b0; +defparam \tp_q[3] .BypassEn = 1'b1; +defparam \tp_q[3] .CarryEnb = 1'b1; +defparam \tp_q[3] .AsyncResetMux = 2'b00; +defparam \tp_q[3] .SyncResetMux = 2'b00; +defparam \tp_q[3] .SyncLoadMux = 2'b01; +defparam \tp_q[3] .coord_x = 1; +defparam \tp_q[3] .coord_y = 15; +defparam \tp_q[3] .coord_z = 6; +// Location: FF_X1_Y15_N14 +// alta_lcell_ff \tp_q[4] ( +// Location: LCCOMB_X1_Y15_N14 +// alta_lcell_comb \tp_q[4]~feeder ( +alta_slice \tp_q[4] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[4]~input_o ), + .Cin(), + .Qin(tp_q[4]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[4]~feeder_combout ), + .Cout(), + .Q(tp_q[4])); +defparam \tp_q[4] .mask = 16'hFF00; +defparam \tp_q[4] .mode = "logic"; +defparam \tp_q[4] .modeMux = 1'b0; +defparam \tp_q[4] .FeedbackMux = 1'b0; +defparam \tp_q[4] .ShiftMux = 1'b0; +defparam \tp_q[4] .BypassEn = 1'b0; +defparam \tp_q[4] .CarryEnb = 1'b1; +defparam \tp_q[4] .AsyncResetMux = 2'b00; +defparam \tp_q[4] .SyncResetMux = 2'bxx; +defparam \tp_q[4] .SyncLoadMux = 2'bxx; +defparam \tp_q[4] .coord_x = 1; +defparam \tp_q[4] .coord_y = 15; +defparam \tp_q[4] .coord_z = 7; +// Location: FF_X1_Y15_N16 +// alta_lcell_ff lcd_backlight_q( +// Location: LCCOMB_X1_Y15_N16 +// alta_lcell_comb \lcd_backlight_q~feeder ( +alta_slice lcd_backlight_q( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[7]~input_o ), + .Cin(), + .Qin(\lcd_backlight_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_backlight_q~feeder_combout ), + .Cout(), + .Q(\lcd_backlight_q~q )); +defparam lcd_backlight_q.mask = 16'hFF00; +defparam lcd_backlight_q.mode = "logic"; +defparam lcd_backlight_q.modeMux = 1'b0; +defparam lcd_backlight_q.FeedbackMux = 1'b0; +defparam lcd_backlight_q.ShiftMux = 1'b0; +defparam lcd_backlight_q.BypassEn = 1'b0; +defparam lcd_backlight_q.CarryEnb = 1'b1; +defparam lcd_backlight_q.AsyncResetMux = 2'b00; +defparam lcd_backlight_q.SyncResetMux = 2'bxx; +defparam lcd_backlight_q.SyncLoadMux = 2'bxx; +defparam lcd_backlight_q.coord_x = 1; +defparam lcd_backlight_q.coord_y = 15; +defparam lcd_backlight_q.coord_z = 8; +// Location: FF_X1_Y15_N18 +// alta_lcell_ff \tp_q[0] ( +alta_slice \tp_q[0] ( + .A(), + .B(), + .C(\MCU_D[0]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[0]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[0])); +defparam \tp_q[0] .mask = 16'hFFFF; +defparam \tp_q[0] .mode = "ripple"; +defparam \tp_q[0] .modeMux = 1'b1; +defparam \tp_q[0] .FeedbackMux = 1'b0; +defparam \tp_q[0] .ShiftMux = 1'b0; +defparam \tp_q[0] .BypassEn = 1'b1; +defparam \tp_q[0] .CarryEnb = 1'b1; +defparam \tp_q[0] .AsyncResetMux = 2'b00; +defparam \tp_q[0] .SyncResetMux = 2'b00; +defparam \tp_q[0] .SyncLoadMux = 2'b01; +defparam \tp_q[0] .coord_x = 1; +defparam \tp_q[0] .coord_y = 15; +defparam \tp_q[0] .coord_z = 9; +// Location: FF_X1_Y15_N2 +// alta_lcell_ff lcd_reset_q( +// Location: LCCOMB_X1_Y15_N2 +// alta_lcell_comb \lcd_reset_q~1 ( +alta_slice lcd_reset_q( + .A(vcc), + .B(vcc), + .C(\MCU_D[0]~input_o ), + .D(vcc), + .Cin(), + .Qin(\lcd_reset_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_reset_q~1_combout ), + .Cout(), + .Q(\lcd_reset_q~q )); +defparam lcd_reset_q.mask = 16'h0F0F; +defparam lcd_reset_q.mode = "logic"; +defparam lcd_reset_q.modeMux = 1'b0; +defparam lcd_reset_q.FeedbackMux = 1'b0; +defparam lcd_reset_q.ShiftMux = 1'b0; +defparam lcd_reset_q.BypassEn = 1'b0; +defparam lcd_reset_q.CarryEnb = 1'b1; +defparam lcd_reset_q.AsyncResetMux = 2'b00; +defparam lcd_reset_q.SyncResetMux = 2'bxx; +defparam lcd_reset_q.SyncLoadMux = 2'bxx; +defparam lcd_reset_q.coord_x = 1; +defparam lcd_reset_q.coord_y = 15; +defparam lcd_reset_q.coord_z = 1; +// Location: FF_X1_Y15_N20 +// alta_lcell_ff \tp_q[1] ( +alta_slice \tp_q[1] ( + .A(), + .B(), + .C(\MCU_D[1]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[1]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[1])); +defparam \tp_q[1] .mask = 16'hFFFF; +defparam \tp_q[1] .mode = "ripple"; +defparam \tp_q[1] .modeMux = 1'b1; +defparam \tp_q[1] .FeedbackMux = 1'b0; +defparam \tp_q[1] .ShiftMux = 1'b0; +defparam \tp_q[1] .BypassEn = 1'b1; +defparam \tp_q[1] .CarryEnb = 1'b1; +defparam \tp_q[1] .AsyncResetMux = 2'b00; +defparam \tp_q[1] .SyncResetMux = 2'b00; +defparam \tp_q[1] .SyncLoadMux = 2'b01; +defparam \tp_q[1] .coord_x = 1; +defparam \tp_q[1] .coord_y = 15; +defparam \tp_q[1] .coord_z = 10; +// Location: FF_X1_Y15_N22 +// alta_lcell_ff audio_reset_q( +// Location: LCCOMB_X1_Y15_N22 +// alta_lcell_comb \audio_reset_q~0 ( +alta_slice audio_reset_q( + .A(vcc), + .B(vcc), + .C(\MCU_D[1]~input_o ), + .D(vcc), + .Cin(), + .Qin(\audio_reset_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\audio_reset_q~0_combout ), + .Cout(), + .Q(\audio_reset_q~q )); +defparam audio_reset_q.mask = 16'h0F0F; +defparam audio_reset_q.mode = "logic"; +defparam audio_reset_q.modeMux = 1'b0; +defparam audio_reset_q.FeedbackMux = 1'b0; +defparam audio_reset_q.ShiftMux = 1'b0; +defparam audio_reset_q.BypassEn = 1'b0; +defparam audio_reset_q.CarryEnb = 1'b1; +defparam audio_reset_q.AsyncResetMux = 2'b00; +defparam audio_reset_q.SyncResetMux = 2'bxx; +defparam audio_reset_q.SyncLoadMux = 2'bxx; +defparam audio_reset_q.coord_x = 1; +defparam audio_reset_q.coord_y = 15; +defparam audio_reset_q.coord_z = 11; +// Location: FF_X1_Y15_N24 +// alta_lcell_ff \tp_q[7] ( +// Location: LCCOMB_X1_Y15_N24 +// alta_lcell_comb \tp_q[7]~feeder ( +alta_slice \tp_q[7] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[7]~input_o ), + .Cin(), + .Qin(tp_q[7]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[7]~feeder_combout ), + .Cout(), + .Q(tp_q[7])); +defparam \tp_q[7] .mask = 16'hFF00; +defparam \tp_q[7] .mode = "logic"; +defparam \tp_q[7] .modeMux = 1'b0; +defparam \tp_q[7] .FeedbackMux = 1'b0; +defparam \tp_q[7] .ShiftMux = 1'b0; +defparam \tp_q[7] .BypassEn = 1'b0; +defparam \tp_q[7] .CarryEnb = 1'b1; +defparam \tp_q[7] .AsyncResetMux = 2'b00; +defparam \tp_q[7] .SyncResetMux = 2'bxx; +defparam \tp_q[7] .SyncLoadMux = 2'bxx; +defparam \tp_q[7] .coord_x = 1; +defparam \tp_q[7] .coord_y = 15; +defparam \tp_q[7] .coord_z = 12; +// Location: FF_X1_Y15_N26 +// alta_lcell_ff \tp_q[2] ( +// Location: LCCOMB_X1_Y15_N26 +// alta_lcell_comb \tp_q[2]~feeder ( +alta_slice \tp_q[2] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[2]~input_o ), + .Cin(), + .Qin(tp_q[2]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[2]~feeder_combout ), + .Cout(), + .Q(tp_q[2])); +defparam \tp_q[2] .mask = 16'hFF00; +defparam \tp_q[2] .mode = "logic"; +defparam \tp_q[2] .modeMux = 1'b0; +defparam \tp_q[2] .FeedbackMux = 1'b0; +defparam \tp_q[2] .ShiftMux = 1'b0; +defparam \tp_q[2] .BypassEn = 1'b0; +defparam \tp_q[2] .CarryEnb = 1'b1; +defparam \tp_q[2] .AsyncResetMux = 2'b00; +defparam \tp_q[2] .SyncResetMux = 2'bxx; +defparam \tp_q[2] .SyncLoadMux = 2'bxx; +defparam \tp_q[2] .coord_x = 1; +defparam \tp_q[2] .coord_y = 15; +defparam \tp_q[2] .coord_z = 13; +// Location: FF_X1_Y15_N28 +// alta_lcell_ff \tp_q[5] ( +alta_slice \tp_q[5] ( + .A(), + .B(), + .C(\MCU_D[5]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[5]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[5])); +defparam \tp_q[5] .mask = 16'hFFFF; +defparam \tp_q[5] .mode = "ripple"; +defparam \tp_q[5] .modeMux = 1'b1; +defparam \tp_q[5] .FeedbackMux = 1'b0; +defparam \tp_q[5] .ShiftMux = 1'b0; +defparam \tp_q[5] .BypassEn = 1'b1; +defparam \tp_q[5] .CarryEnb = 1'b1; +defparam \tp_q[5] .AsyncResetMux = 2'b00; +defparam \tp_q[5] .SyncResetMux = 2'b00; +defparam \tp_q[5] .SyncLoadMux = 2'b01; +defparam \tp_q[5] .coord_x = 1; +defparam \tp_q[5] .coord_y = 15; +defparam \tp_q[5] .coord_z = 14; +// Location: FF_X1_Y15_N30 +// alta_lcell_ff ref_en_q( +// Location: LCCOMB_X1_Y15_N30 +// alta_lcell_comb \ref_en_q~feeder ( +alta_slice ref_en_q( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[6]~input_o ), + .Cin(), + .Qin(\ref_en_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\ref_en_q~feeder_combout ), + .Cout(), + .Q(\ref_en_q~q )); +defparam ref_en_q.mask = 16'hFF00; +defparam ref_en_q.mode = "logic"; +defparam ref_en_q.modeMux = 1'b0; +defparam ref_en_q.FeedbackMux = 1'b0; +defparam ref_en_q.ShiftMux = 1'b0; +defparam ref_en_q.BypassEn = 1'b0; +defparam ref_en_q.CarryEnb = 1'b1; +defparam ref_en_q.AsyncResetMux = 2'b00; +defparam ref_en_q.SyncResetMux = 2'bxx; +defparam ref_en_q.SyncLoadMux = 2'bxx; +defparam ref_en_q.coord_x = 1; +defparam ref_en_q.coord_y = 15; +defparam ref_en_q.coord_z = 15; +// Location: LCCOMB_X1_Y15_N4 +// alta_lcell_comb \tp_q[3]~0 ( +alta_slice \tp_q[3]~0 ( + .A(vcc), + .B(vcc), + .C(\MCU_ADDR~input_o ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[3]~0_combout ), + .Cout(), + .Q()); +defparam \tp_q[3]~0 .mask = 16'h000F; +defparam \tp_q[3]~0 .mode = "logic"; +defparam \tp_q[3]~0 .modeMux = 1'b0; +defparam \tp_q[3]~0 .FeedbackMux = 1'b0; +defparam \tp_q[3]~0 .ShiftMux = 1'b0; +defparam \tp_q[3]~0 .BypassEn = 1'b0; +defparam \tp_q[3]~0 .CarryEnb = 1'b1; +defparam \tp_q[3]~0 .AsyncResetMux = 2'bxx; +defparam \tp_q[3]~0 .SyncResetMux = 2'bxx; +defparam \tp_q[3]~0 .SyncLoadMux = 2'bxx; +defparam \tp_q[3]~0 .coord_x = 1; +defparam \tp_q[3]~0 .coord_y = 15; +defparam \tp_q[3]~0 .coord_z = 2; +// Location: FF_X1_Y15_N6 +// alta_lcell_ff sysoff_q( +// Location: LCCOMB_X1_Y15_N6 +// alta_lcell_comb \sysoff_q~feeder ( +alta_slice sysoff_q( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[2]~input_o ), + .Cin(), + .Qin(\sysoff_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\sysoff_q~feeder_combout ), + .Cout(), + .Q(\sysoff_q~q )); +defparam sysoff_q.mask = 16'hFF00; +defparam sysoff_q.mode = "logic"; +defparam sysoff_q.modeMux = 1'b0; +defparam sysoff_q.FeedbackMux = 1'b0; +defparam sysoff_q.ShiftMux = 1'b0; +defparam sysoff_q.BypassEn = 1'b0; +defparam sysoff_q.CarryEnb = 1'b1; +defparam sysoff_q.AsyncResetMux = 2'b00; +defparam sysoff_q.SyncResetMux = 2'bxx; +defparam sysoff_q.SyncLoadMux = 2'bxx; +defparam sysoff_q.coord_x = 1; +defparam sysoff_q.coord_y = 15; +defparam sysoff_q.coord_z = 3; +// Location: FF_X1_Y15_N8 +// alta_lcell_ff \tp_q[6] ( +// Location: LCCOMB_X1_Y15_N8 +// alta_lcell_comb \tp_q[6]~feeder ( +alta_slice \tp_q[6] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[6]~input_o ), + .Cin(), + .Qin(tp_q[6]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[6]~feeder_combout ), + .Cout(), + .Q(tp_q[6])); +defparam \tp_q[6] .mask = 16'hFF00; +defparam \tp_q[6] .mode = "logic"; +defparam \tp_q[6] .modeMux = 1'b0; +defparam \tp_q[6] .FeedbackMux = 1'b0; +defparam \tp_q[6] .ShiftMux = 1'b0; +defparam \tp_q[6] .BypassEn = 1'b0; +defparam \tp_q[6] .CarryEnb = 1'b1; +defparam \tp_q[6] .AsyncResetMux = 2'b00; +defparam \tp_q[6] .SyncResetMux = 2'bxx; +defparam \tp_q[6] .SyncLoadMux = 2'bxx; + +defparam \tp_q[6] .coord_x = 1; +defparam \tp_q[6] .coord_y = 15; +defparam \tp_q[6] .coord_z = 4; +// Location: CLKENCTRL_X1_Y15_N0 +alta_clkenctrl clken_ctrl_X1_Y15_N0(.ClkIn(\MCU_IO_STBX~inputclkctrl_outclk ), .ClkEn(\tp_q[3]~0_combout ), .ClkOut(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG )); +defparam clken_ctrl_X1_Y15_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y15_N0.ClkEnMux = 2'b10; + +defparam clken_ctrl_X1_Y15_N0.coord_x = 1; +defparam clken_ctrl_X1_Y15_N0.coord_y = 15; +defparam clken_ctrl_X1_Y15_N0.coord_z = 0; +// Location: ASYNCCTRL_X1_Y15_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y15_N0(.Din(), .Dout(AsyncReset_X1_Y15_GND)); +defparam asyncreset_ctrl_X1_Y15_N0.AsyncCtrlMux = 2'b00; + +defparam asyncreset_ctrl_X1_Y15_N0.coord_x = 1; +defparam asyncreset_ctrl_X1_Y15_N0.coord_y = 15; +defparam asyncreset_ctrl_X1_Y15_N0.coord_z = 0; +// Location: CLKENCTRL_X1_Y15_N1 +alta_clkenctrl clken_ctrl_X1_Y15_N1(.ClkIn(\MCU_IO_STBX~inputclkctrl_outclk ), .ClkEn(\lcd_reset_q~0_combout ), .ClkOut(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG )); +defparam clken_ctrl_X1_Y15_N1.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y15_N1.ClkEnMux = 2'b10; + +defparam clken_ctrl_X1_Y15_N1.coord_x = 1; +defparam clken_ctrl_X1_Y15_N1.coord_y = 15; +defparam clken_ctrl_X1_Y15_N1.coord_z = 1; +// Location: SYNCCTRL_X1_Y15_N0 +alta_syncctrl syncreset_ctrl_X1_Y15(.Din(), .Dout(SyncReset_X1_Y15_GND)); +defparam syncreset_ctrl_X1_Y15.SyncCtrlMux = 2'b00; + +defparam syncreset_ctrl_X1_Y15.coord_x = 1; +defparam syncreset_ctrl_X1_Y15.coord_y = 15; +defparam syncreset_ctrl_X1_Y15.coord_z = 0; +// Location: SYNCCTRL_X1_Y15_N1 +alta_syncctrl syncload_ctrl_X1_Y15(.Din(), .Dout(SyncLoad_X1_Y15_VCC)); +defparam syncload_ctrl_X1_Y15.SyncCtrlMux = 2'b01; +defparam syncload_ctrl_X1_Y15.coord_x = 1; +defparam syncload_ctrl_X1_Y15.coord_y = 15; +defparam syncload_ctrl_X1_Y15.coord_z = 1; +// Location: LCCOMB_X1_Y18_N14 +// alta_lcell_comb \mcu_data_out[7]~15 ( +alta_slice \mcu_data_out[7]~15 ( + .A(\LCD_TE~input_o ), + .B(\MCU_DIR~input_o ), + .C(\MCU_IO_STBX~input_o ), + .D(\mcu_data_out[7]~14_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[7]~15_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[7]~15 .mask = 16'hFB08; +defparam \mcu_data_out[7]~15 .mode = "logic"; +defparam \mcu_data_out[7]~15 .modeMux = 1'b0; +defparam \mcu_data_out[7]~15 .FeedbackMux = 1'b0; +defparam \mcu_data_out[7]~15 .ShiftMux = 1'b0; +defparam \mcu_data_out[7]~15 .BypassEn = 1'b0; +defparam \mcu_data_out[7]~15 .CarryEnb = 1'b1; +defparam \mcu_data_out[7]~15 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[7]~15 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[7]~15 .SyncLoadMux = 2'bxx; +defparam \mcu_data_out[7]~15 .coord_x = 1; +defparam \mcu_data_out[7]~15 .coord_y = 18; +defparam \mcu_data_out[7]~15 .coord_z = 7; +// Location: LCCOMB_X1_Y18_N16 +// alta_lcell_comb \mcu_data_out[6]~13 ( +alta_slice \mcu_data_out[6]~13 ( + .A(\SW_ROT_B~input_o ), + .B(\MCU_IO_STBX~input_o ), + .C(\mcu_data_out[6]~12_combout ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[6]~13_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[6]~13 .mask = 16'hD1F0; +defparam \mcu_data_out[6]~13 .mode = "logic"; +defparam \mcu_data_out[6]~13 .modeMux = 1'b0; +defparam \mcu_data_out[6]~13 .FeedbackMux = 1'b0; +defparam \mcu_data_out[6]~13 .ShiftMux = 1'b0; +defparam \mcu_data_out[6]~13 .BypassEn = 1'b0; +defparam \mcu_data_out[6]~13 .CarryEnb = 1'b1; +defparam \mcu_data_out[6]~13 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[6]~13 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[6]~13 .SyncLoadMux = 2'bxx; +defparam \mcu_data_out[6]~13 .coord_x = 1; +defparam \mcu_data_out[6]~13 .coord_y = 18; +defparam \mcu_data_out[6]~13 .coord_z = 8; +// Location: LCCOMB_X1_Y18_N28 +// alta_lcell_comb \mcu_data_out[1]~3 ( +alta_slice \mcu_data_out[1]~3 ( + .A(\SW_L~input_o ), + .B(\MCU_DIR~input_o ), + .C(\MCU_IO_STBX~input_o ), + .D(\mcu_data_out[1]~2_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[1]~3_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[1]~3 .mask = 16'hF704; +defparam \mcu_data_out[1]~3 .mode = "logic"; +defparam \mcu_data_out[1]~3 .modeMux = 1'b0; +defparam \mcu_data_out[1]~3 .FeedbackMux = 1'b0; +defparam \mcu_data_out[1]~3 .ShiftMux = 1'b0; +defparam \mcu_data_out[1]~3 .BypassEn = 1'b0; +defparam \mcu_data_out[1]~3 .CarryEnb = 1'b1; +defparam \mcu_data_out[1]~3 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[1]~3 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[1]~3 .SyncLoadMux = 2'bxx; +defparam \mcu_data_out[1]~3 .coord_x = 1; +defparam \mcu_data_out[1]~3 .coord_y = 18; +defparam \mcu_data_out[1]~3 .coord_z = 14; +// Location: LCCOMB_X1_Y18_N30 +// alta_lcell_comb \mcu_data_out[0]~1 ( +alta_slice \mcu_data_out[0]~1 ( + .A(\SW_R~input_o ), + .B(\MCU_IO_STBX~input_o ), + .C(\mcu_data_out[0]~0_combout ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[0]~1_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[0]~1 .mask = 16'hD1F0; +defparam \mcu_data_out[0]~1 .mode = "logic"; +defparam \mcu_data_out[0]~1 .modeMux = 1'b0; +defparam \mcu_data_out[0]~1 .FeedbackMux = 1'b0; +defparam \mcu_data_out[0]~1 .ShiftMux = 1'b0; +defparam \mcu_data_out[0]~1 .BypassEn = 1'b0; +defparam \mcu_data_out[0]~1 .CarryEnb = 1'b1; +defparam \mcu_data_out[0]~1 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[0]~1 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[0]~1 .SyncLoadMux = 2'bxx; +defparam \mcu_data_out[0]~1 .coord_x = 1; +defparam \mcu_data_out[0]~1 .coord_y = 18; +defparam \mcu_data_out[0]~1 .coord_z = 15; +// Location: FF_X1_Y19_N30 +// alta_lcell_ff \lcd_data_in_q[0] ( +// Location: LCCOMB_X1_Y19_N30 +// alta_lcell_comb \mcu_data_out[0]~0 ( +alta_slice \lcd_data_in_q[0] ( + .A(\LCD_DB[8]~input_o ), + .B(vcc), + .C(\LCD_DB[0]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[0]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y19_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y19_GND), + .SyncReset(SyncReset_X1_Y19_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y19_VCC), + .LutOut(\mcu_data_out[0]~0_combout ), + .Cout(), + .Q(lcd_data_in_q[0])); +defparam \lcd_data_in_q[0] .mask = 16'hF0AA; +defparam \lcd_data_in_q[0] .mode = "logic"; +defparam \lcd_data_in_q[0] .modeMux = 1'b0; +defparam \lcd_data_in_q[0] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[0] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[0] .BypassEn = 1'b1; +defparam \lcd_data_in_q[0] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[0] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[0] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[0] .SyncLoadMux = 2'b01; +defparam \lcd_data_in_q[0] .coord_x = 1; +defparam \lcd_data_in_q[0] .coord_y = 19; +defparam \lcd_data_in_q[0] .coord_z = 15; +// Location: FF_X1_Y19_N4 +// alta_lcell_ff \lcd_data_in_q[6] ( +// Location: LCCOMB_X1_Y19_N4 +// alta_lcell_comb \mcu_data_out[6]~12 ( +alta_slice \lcd_data_in_q[6] ( + .A(\LCD_DB[14]~input_o ), + .B(vcc), + .C(\LCD_DB[6]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[6]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y19_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y19_GND), + .SyncReset(SyncReset_X1_Y19_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y19_VCC), + .LutOut(\mcu_data_out[6]~12_combout ), + .Cout(), + .Q(lcd_data_in_q[6])); +defparam \lcd_data_in_q[6] .mask = 16'hF0AA; +defparam \lcd_data_in_q[6] .mode = "logic"; +defparam \lcd_data_in_q[6] .modeMux = 1'b0; +defparam \lcd_data_in_q[6] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[6] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[6] .BypassEn = 1'b1; +defparam \lcd_data_in_q[6] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[6] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[6] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[6] .SyncLoadMux = 2'b01; + +defparam \lcd_data_in_q[6] .coord_x = 1; +defparam \lcd_data_in_q[6] .coord_y = 19; +defparam \lcd_data_in_q[6] .coord_z = 2; +// Location: CLKENCTRL_X1_Y19_N0 +alta_clkenctrl clken_ctrl_X1_Y19_N0(.ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y19_SIG_VCC )); +defparam clken_ctrl_X1_Y19_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y19_N0.ClkEnMux = 2'b01; + +defparam clken_ctrl_X1_Y19_N0.coord_x = 1; +defparam clken_ctrl_X1_Y19_N0.coord_y = 19; +defparam clken_ctrl_X1_Y19_N0.coord_z = 0; +// Location: ASYNCCTRL_X1_Y19_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y19_N0(.Din(), .Dout(AsyncReset_X1_Y19_GND)); +defparam asyncreset_ctrl_X1_Y19_N0.AsyncCtrlMux = 2'b00; + +defparam asyncreset_ctrl_X1_Y19_N0.coord_x = 1; +defparam asyncreset_ctrl_X1_Y19_N0.coord_y = 19; +defparam asyncreset_ctrl_X1_Y19_N0.coord_z = 0; +// Location: SYNCCTRL_X1_Y19_N0 +alta_syncctrl syncreset_ctrl_X1_Y19(.Din(), .Dout(SyncReset_X1_Y19_GND)); +defparam syncreset_ctrl_X1_Y19.SyncCtrlMux = 2'b00; + +defparam syncreset_ctrl_X1_Y19.coord_x = 1; +defparam syncreset_ctrl_X1_Y19.coord_y = 19; +defparam syncreset_ctrl_X1_Y19.coord_z = 0; +// Location: SYNCCTRL_X1_Y19_N1 +alta_syncctrl syncload_ctrl_X1_Y19(.Din(), .Dout(SyncLoad_X1_Y19_VCC)); +defparam syncload_ctrl_X1_Y19.SyncCtrlMux = 2'b01; +defparam syncload_ctrl_X1_Y19.coord_x = 1; +defparam syncload_ctrl_X1_Y19.coord_y = 19; +defparam syncload_ctrl_X1_Y19.coord_z = 1; +// Location: FF_X1_Y20_N0 +// alta_lcell_ff \lcd_data_out_q[1] ( +// Location: LCCOMB_X1_Y20_N0 +// alta_lcell_comb \lcd_data_out_q[1]~feeder ( +alta_slice \lcd_data_out_q[1] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[1]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[1]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[1]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[1])); +defparam \lcd_data_out_q[1] .mask = 16'hFF00; +defparam \lcd_data_out_q[1] .mode = "logic"; +defparam \lcd_data_out_q[1] .modeMux = 1'b0; +defparam \lcd_data_out_q[1] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[1] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[1] .BypassEn = 1'b0; +defparam \lcd_data_out_q[1] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[1] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[1] .SyncResetMux = 2'bxx; +defparam \lcd_data_out_q[1] .SyncLoadMux = 2'bxx; +defparam \lcd_data_out_q[1] .coord_x = 1; +defparam \lcd_data_out_q[1] .coord_y = 20; +defparam \lcd_data_out_q[1] .coord_z = 0; +// Location: FF_X1_Y20_N10 +// alta_lcell_ff \lcd_data_out_q[2] ( +// Location: LCCOMB_X1_Y20_N10 +// alta_lcell_comb \lcd_data_out_q[2]~feeder ( +alta_slice \lcd_data_out_q[2] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[2]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[2]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[2]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[2])); +defparam \lcd_data_out_q[2] .mask = 16'hFF00; +defparam \lcd_data_out_q[2] .mode = "logic"; +defparam \lcd_data_out_q[2] .modeMux = 1'b0; +defparam \lcd_data_out_q[2] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[2] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[2] .BypassEn = 1'b0; +defparam \lcd_data_out_q[2] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[2] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[2] .SyncResetMux = 2'bxx; +defparam \lcd_data_out_q[2] .SyncLoadMux = 2'bxx; +defparam \lcd_data_out_q[2] .coord_x = 1; +defparam \lcd_data_out_q[2] .coord_y = 20; +defparam \lcd_data_out_q[2] .coord_z = 5; +// Location: FF_X1_Y20_N12 +// alta_lcell_ff \lcd_data_out_q[6] ( +alta_slice \lcd_data_out_q[6] ( + .A(), + .B(), + .C(\MCU_D[6]~input_o ), + .D(), + .Cin(), + .Qin(lcd_data_out_q[6]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(SyncReset_X1_Y20_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y20_VCC), + .LutOut(), + .Cout(), + .Q(lcd_data_out_q[6])); +defparam \lcd_data_out_q[6] .mask = 16'hFFFF; +defparam \lcd_data_out_q[6] .mode = "ripple"; +defparam \lcd_data_out_q[6] .modeMux = 1'b1; +defparam \lcd_data_out_q[6] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[6] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[6] .BypassEn = 1'b1; +defparam \lcd_data_out_q[6] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[6] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[6] .SyncResetMux = 2'b00; +defparam \lcd_data_out_q[6] .SyncLoadMux = 2'b01; +defparam \lcd_data_out_q[6] .coord_x = 1; +defparam \lcd_data_out_q[6] .coord_y = 20; +defparam \lcd_data_out_q[6] .coord_z = 6; +// Location: FF_X1_Y20_N14 +// alta_lcell_ff \lcd_data_out_q[7] ( +// Location: LCCOMB_X1_Y20_N14 +// alta_lcell_comb \lcd_data_out_q[7]~feeder ( +alta_slice \lcd_data_out_q[7] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[7]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[7]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[7]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[7])); +defparam \lcd_data_out_q[7] .mask = 16'hFF00; +defparam \lcd_data_out_q[7] .mode = "logic"; +defparam \lcd_data_out_q[7] .modeMux = 1'b0; +defparam \lcd_data_out_q[7] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[7] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[7] .BypassEn = 1'b0; +defparam \lcd_data_out_q[7] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[7] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[7] .SyncResetMux = 2'bxx; +defparam \lcd_data_out_q[7] .SyncLoadMux = 2'bxx; +defparam \lcd_data_out_q[7] .coord_x = 1; +defparam \lcd_data_out_q[7] .coord_y = 20; +defparam \lcd_data_out_q[7] .coord_z = 7; +// Location: FF_X1_Y20_N30 +// alta_lcell_ff \lcd_data_out_q[0] ( +// Location: LCCOMB_X1_Y20_N30 +// alta_lcell_comb \lcd_data_out_q[0]~feeder ( +alta_slice \lcd_data_out_q[0] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[0]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[0]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[0]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[0])); +defparam \lcd_data_out_q[0] .mask = 16'hFF00; +defparam \lcd_data_out_q[0] .mode = "logic"; +defparam \lcd_data_out_q[0] .modeMux = 1'b0; +defparam \lcd_data_out_q[0] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[0] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[0] .BypassEn = 1'b0; +defparam \lcd_data_out_q[0] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[0] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[0] .SyncResetMux = 2'bxx; +defparam \lcd_data_out_q[0] .SyncLoadMux = 2'bxx; + +defparam \lcd_data_out_q[0] .coord_x = 1; +defparam \lcd_data_out_q[0] .coord_y = 20; +defparam \lcd_data_out_q[0] .coord_z = 15; +// Location: CLKENCTRL_X1_Y20_N0 +alta_clkenctrl clken_ctrl_X1_Y20_N0(.ClkIn(\MCU_LCD_WRX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC )); +defparam clken_ctrl_X1_Y20_N0.ClkMux = 2'b11; +defparam clken_ctrl_X1_Y20_N0.ClkEnMux = 2'b01; + +defparam clken_ctrl_X1_Y20_N0.coord_x = 1; +defparam clken_ctrl_X1_Y20_N0.coord_y = 20; +defparam clken_ctrl_X1_Y20_N0.coord_z = 0; +// Location: ASYNCCTRL_X1_Y20_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y20_N0(.Din(), .Dout(AsyncReset_X1_Y20_GND)); +defparam asyncreset_ctrl_X1_Y20_N0.AsyncCtrlMux = 2'b00; + +defparam asyncreset_ctrl_X1_Y20_N0.coord_x = 1; +defparam asyncreset_ctrl_X1_Y20_N0.coord_y = 20; +defparam asyncreset_ctrl_X1_Y20_N0.coord_z = 0; +// Location: SYNCCTRL_X1_Y20_N0 +alta_syncctrl syncreset_ctrl_X1_Y20(.Din(), .Dout(SyncReset_X1_Y20_GND)); +defparam syncreset_ctrl_X1_Y20.SyncCtrlMux = 2'b00; + +defparam syncreset_ctrl_X1_Y20.coord_x = 1; +defparam syncreset_ctrl_X1_Y20.coord_y = 20; +defparam syncreset_ctrl_X1_Y20.coord_z = 0; +// Location: SYNCCTRL_X1_Y20_N1 +alta_syncctrl syncload_ctrl_X1_Y20(.Din(), .Dout(SyncLoad_X1_Y20_VCC)); +defparam syncload_ctrl_X1_Y20.SyncCtrlMux = 2'b01; +defparam syncload_ctrl_X1_Y20.coord_x = 1; +defparam syncload_ctrl_X1_Y20.coord_y = 20; +defparam syncload_ctrl_X1_Y20.coord_z = 1; +// Location: FF_X1_Y21_N28 +// alta_lcell_ff \lcd_data_in_q[7] ( +// Location: LCCOMB_X1_Y21_N28 +// alta_lcell_comb \mcu_data_out[7]~14 ( +alta_slice \lcd_data_in_q[7] ( + .A(\LCD_DB[15]~input_o ), + .B(\MCU_LCD_RDX~input_o ), + .C(\LCD_DB[7]~input_o ), + .D(vcc), + .Cin(), + .Qin(lcd_data_in_q[7]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y21_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y21_GND), + .SyncReset(SyncReset_X1_Y21_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y21_VCC), + .LutOut(\mcu_data_out[7]~14_combout ), + .Cout(), + .Q(lcd_data_in_q[7])); +defparam \lcd_data_in_q[7] .mask = 16'hE2E2; +defparam \lcd_data_in_q[7] .mode = "logic"; +defparam \lcd_data_in_q[7] .modeMux = 1'b0; +defparam \lcd_data_in_q[7] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[7] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[7] .BypassEn = 1'b1; +defparam \lcd_data_in_q[7] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[7] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[7] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[7] .SyncLoadMux = 2'b01; +defparam \lcd_data_in_q[7] .coord_x = 1; +defparam \lcd_data_in_q[7] .coord_y = 21; +defparam \lcd_data_in_q[7] .coord_z = 14; +// Location: FF_X1_Y21_N4 +// alta_lcell_ff \lcd_data_in_q[1] ( +// Location: LCCOMB_X1_Y21_N4 +// alta_lcell_comb \mcu_data_out[1]~2 ( +alta_slice \lcd_data_in_q[1] ( + .A(\LCD_DB[9]~input_o ), + .B(\MCU_LCD_RDX~input_o ), + .C(\LCD_DB[1]~input_o ), + .D(vcc), + .Cin(), + .Qin(lcd_data_in_q[1]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y21_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y21_GND), + .SyncReset(SyncReset_X1_Y21_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y21_VCC), + .LutOut(\mcu_data_out[1]~2_combout ), + .Cout(), + .Q(lcd_data_in_q[1])); +defparam \lcd_data_in_q[1] .mask = 16'hE2E2; +defparam \lcd_data_in_q[1] .mode = "logic"; +defparam \lcd_data_in_q[1] .modeMux = 1'b0; +defparam \lcd_data_in_q[1] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[1] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[1] .BypassEn = 1'b1; +defparam \lcd_data_in_q[1] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[1] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[1] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[1] .SyncLoadMux = 2'b01; + +defparam \lcd_data_in_q[1] .coord_x = 1; +defparam \lcd_data_in_q[1] .coord_y = 21; +defparam \lcd_data_in_q[1] .coord_z = 2; +// Location: CLKENCTRL_X1_Y21_N0 +alta_clkenctrl clken_ctrl_X1_Y21_N0(.ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y21_SIG_VCC )); +defparam clken_ctrl_X1_Y21_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y21_N0.ClkEnMux = 2'b01; + +defparam clken_ctrl_X1_Y21_N0.coord_x = 1; +defparam clken_ctrl_X1_Y21_N0.coord_y = 21; +defparam clken_ctrl_X1_Y21_N0.coord_z = 0; +// Location: ASYNCCTRL_X1_Y21_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y21_N0(.Din(), .Dout(AsyncReset_X1_Y21_GND)); +defparam asyncreset_ctrl_X1_Y21_N0.AsyncCtrlMux = 2'b00; + +defparam asyncreset_ctrl_X1_Y21_N0.coord_x = 1; +defparam asyncreset_ctrl_X1_Y21_N0.coord_y = 21; +defparam asyncreset_ctrl_X1_Y21_N0.coord_z = 0; +// Location: SYNCCTRL_X1_Y21_N0 +alta_syncctrl syncreset_ctrl_X1_Y21(.Din(), .Dout(SyncReset_X1_Y21_GND)); +defparam syncreset_ctrl_X1_Y21.SyncCtrlMux = 2'b00; + +defparam syncreset_ctrl_X1_Y21.coord_x = 1; +defparam syncreset_ctrl_X1_Y21.coord_y = 21; +defparam syncreset_ctrl_X1_Y21.coord_z = 0; +// Location: SYNCCTRL_X1_Y21_N1 +alta_syncctrl syncload_ctrl_X1_Y21(.Din(), .Dout(SyncLoad_X1_Y21_VCC)); +defparam syncload_ctrl_X1_Y21.SyncCtrlMux = 2'b01; +defparam syncload_ctrl_X1_Y21.coord_x = 1; +defparam syncload_ctrl_X1_Y21.coord_y = 21; +defparam syncload_ctrl_X1_Y21.coord_z = 1; +// Location: LCCOMB_X1_Y23_N12 +// alta_lcell_comb \mcu_data_out[3]~7 ( +alta_slice \mcu_data_out[3]~7 ( + .A(\SW_U~input_o ), + .B(\MCU_IO_STBX~input_o ), + .C(\MCU_DIR~input_o ), + .D(\mcu_data_out[3]~6_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[3]~7_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[3]~7 .mask = 16'hDF10; +defparam \mcu_data_out[3]~7 .mode = "logic"; +defparam \mcu_data_out[3]~7 .modeMux = 1'b0; +defparam \mcu_data_out[3]~7 .FeedbackMux = 1'b0; +defparam \mcu_data_out[3]~7 .ShiftMux = 1'b0; +defparam \mcu_data_out[3]~7 .BypassEn = 1'b0; +defparam \mcu_data_out[3]~7 .CarryEnb = 1'b1; +defparam \mcu_data_out[3]~7 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[3]~7 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[3]~7 .SyncLoadMux = 2'bxx; +defparam \mcu_data_out[3]~7 .coord_x = 1; +defparam \mcu_data_out[3]~7 .coord_y = 23; +defparam \mcu_data_out[3]~7 .coord_z = 6; +// Location: LCCOMB_X1_Y23_N14 +// alta_lcell_comb \mcu_data_out[4]~9 ( +alta_slice \mcu_data_out[4]~9 ( + .A(\MCU_DIR~input_o ), + .B(\SW_SEL~input_o ), + .C(\MCU_IO_STBX~input_o ), + .D(\mcu_data_out[4]~8_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[4]~9_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[4]~9 .mask = 16'hF702; +defparam \mcu_data_out[4]~9 .mode = "logic"; +defparam \mcu_data_out[4]~9 .modeMux = 1'b0; +defparam \mcu_data_out[4]~9 .FeedbackMux = 1'b0; +defparam \mcu_data_out[4]~9 .ShiftMux = 1'b0; +defparam \mcu_data_out[4]~9 .BypassEn = 1'b0; +defparam \mcu_data_out[4]~9 .CarryEnb = 1'b1; +defparam \mcu_data_out[4]~9 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[4]~9 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[4]~9 .SyncLoadMux = 2'bxx; +defparam \mcu_data_out[4]~9 .coord_x = 1; +defparam \mcu_data_out[4]~9 .coord_y = 23; +defparam \mcu_data_out[4]~9 .coord_z = 7; +// Location: LCCOMB_X1_Y23_N16 +// alta_lcell_comb \mcu_data_out[2]~5 ( +alta_slice \mcu_data_out[2]~5 ( + .A(\SW_D~input_o ), + .B(\MCU_IO_STBX~input_o ), + .C(\mcu_data_out[2]~4_combout ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[2]~5_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[2]~5 .mask = 16'hD1F0; +defparam \mcu_data_out[2]~5 .mode = "logic"; +defparam \mcu_data_out[2]~5 .modeMux = 1'b0; +defparam \mcu_data_out[2]~5 .FeedbackMux = 1'b0; +defparam \mcu_data_out[2]~5 .ShiftMux = 1'b0; +defparam \mcu_data_out[2]~5 .BypassEn = 1'b0; +defparam \mcu_data_out[2]~5 .CarryEnb = 1'b1; +defparam \mcu_data_out[2]~5 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[2]~5 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[2]~5 .SyncLoadMux = 2'bxx; +defparam \mcu_data_out[2]~5 .coord_x = 1; +defparam \mcu_data_out[2]~5 .coord_y = 23; +defparam \mcu_data_out[2]~5 .coord_z = 8; +// Location: LCCOMB_X1_Y23_N30 +// alta_lcell_comb \mcu_data_out[5]~11 ( +alta_slice \mcu_data_out[5]~11 ( + .A(\MCU_DIR~input_o ), + .B(\SW_ROT_A~input_o ), + .C(\MCU_IO_STBX~input_o ), + .D(\mcu_data_out[5]~10_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[5]~11_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[5]~11 .mask = 16'hF702; +defparam \mcu_data_out[5]~11 .mode = "logic"; +defparam \mcu_data_out[5]~11 .modeMux = 1'b0; +defparam \mcu_data_out[5]~11 .FeedbackMux = 1'b0; +defparam \mcu_data_out[5]~11 .ShiftMux = 1'b0; +defparam \mcu_data_out[5]~11 .BypassEn = 1'b0; +defparam \mcu_data_out[5]~11 .CarryEnb = 1'b1; +defparam \mcu_data_out[5]~11 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[5]~11 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[5]~11 .SyncLoadMux = 2'bxx; +defparam \mcu_data_out[5]~11 .coord_x = 1; +defparam \mcu_data_out[5]~11 .coord_y = 23; +defparam \mcu_data_out[5]~11 .coord_z = 15; +// Location: FF_X1_Y24_N30 +// alta_lcell_ff \lcd_data_in_q[2] ( +// Location: LCCOMB_X1_Y24_N30 +// alta_lcell_comb \mcu_data_out[2]~4 ( +alta_slice \lcd_data_in_q[2] ( + .A(\LCD_DB[10]~input_o ), + .B(vcc), + .C(\LCD_DB[2]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[2]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y24_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y24_GND), + .SyncReset(SyncReset_X1_Y24_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y24_VCC), + .LutOut(\mcu_data_out[2]~4_combout ), + .Cout(), + .Q(lcd_data_in_q[2])); +defparam \lcd_data_in_q[2] .mask = 16'hF0AA; +defparam \lcd_data_in_q[2] .mode = "logic"; +defparam \lcd_data_in_q[2] .modeMux = 1'b0; +defparam \lcd_data_in_q[2] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[2] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[2] .BypassEn = 1'b1; +defparam \lcd_data_in_q[2] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[2] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[2] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[2] .SyncLoadMux = 2'b01; + +defparam \lcd_data_in_q[2] .coord_x = 1; +defparam \lcd_data_in_q[2] .coord_y = 24; +defparam \lcd_data_in_q[2] .coord_z = 15; +// Location: CLKENCTRL_X1_Y24_N0 +alta_clkenctrl clken_ctrl_X1_Y24_N0(.ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y24_SIG_VCC )); +defparam clken_ctrl_X1_Y24_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y24_N0.ClkEnMux = 2'b01; + +defparam clken_ctrl_X1_Y24_N0.coord_x = 1; +defparam clken_ctrl_X1_Y24_N0.coord_y = 24; +defparam clken_ctrl_X1_Y24_N0.coord_z = 0; +// Location: ASYNCCTRL_X1_Y24_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y24_N0(.Din(), .Dout(AsyncReset_X1_Y24_GND)); +defparam asyncreset_ctrl_X1_Y24_N0.AsyncCtrlMux = 2'b00; + +defparam asyncreset_ctrl_X1_Y24_N0.coord_x = 1; +defparam asyncreset_ctrl_X1_Y24_N0.coord_y = 24; +defparam asyncreset_ctrl_X1_Y24_N0.coord_z = 0; +// Location: SYNCCTRL_X1_Y24_N0 +alta_syncctrl syncreset_ctrl_X1_Y24(.Din(), .Dout(SyncReset_X1_Y24_GND)); +defparam syncreset_ctrl_X1_Y24.SyncCtrlMux = 2'b00; + +defparam syncreset_ctrl_X1_Y24.coord_x = 1; +defparam syncreset_ctrl_X1_Y24.coord_y = 24; +defparam syncreset_ctrl_X1_Y24.coord_z = 0; +// Location: SYNCCTRL_X1_Y24_N1 +alta_syncctrl syncload_ctrl_X1_Y24(.Din(), .Dout(SyncLoad_X1_Y24_VCC)); +defparam syncload_ctrl_X1_Y24.SyncCtrlMux = 2'b01; +defparam syncload_ctrl_X1_Y24.coord_x = 1; +defparam syncload_ctrl_X1_Y24.coord_y = 24; +defparam syncload_ctrl_X1_Y24.coord_z = 1; +// Location: FF_X1_Y26_N10 +// alta_lcell_ff \lcd_data_in_q[4] ( +// Location: LCCOMB_X1_Y26_N10 +// alta_lcell_comb \mcu_data_out[4]~8 ( +alta_slice \lcd_data_in_q[4] ( + .A(\MCU_LCD_RDX~input_o ), + .B(\LCD_DB[12]~input_o ), + .C(\LCD_DB[4]~input_o ), + .D(vcc), + .Cin(), + .Qin(lcd_data_in_q[4]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(\mcu_data_out[4]~8_combout ), + .Cout(), + .Q(lcd_data_in_q[4])); +defparam \lcd_data_in_q[4] .mask = 16'hE4E4; +defparam \lcd_data_in_q[4] .mode = "logic"; +defparam \lcd_data_in_q[4] .modeMux = 1'b0; +defparam \lcd_data_in_q[4] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[4] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[4] .BypassEn = 1'b1; +defparam \lcd_data_in_q[4] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[4] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[4] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[4] .SyncLoadMux = 2'b01; +defparam \lcd_data_in_q[4] .coord_x = 1; +defparam \lcd_data_in_q[4] .coord_y = 26; +defparam \lcd_data_in_q[4] .coord_z = 5; +// Location: FF_X1_Y26_N12 +// alta_lcell_ff \lcd_data_out_q[4] ( +// Location: LCCOMB_X1_Y26_N12 +// alta_lcell_comb \lcd_data_out_q[4]~feeder ( +alta_slice \lcd_data_out_q[4] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[4]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[4]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[4]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[4])); +defparam \lcd_data_out_q[4] .mask = 16'hFF00; +defparam \lcd_data_out_q[4] .mode = "logic"; +defparam \lcd_data_out_q[4] .modeMux = 1'b0; +defparam \lcd_data_out_q[4] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[4] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[4] .BypassEn = 1'b0; +defparam \lcd_data_out_q[4] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[4] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[4] .SyncResetMux = 2'bxx; +defparam \lcd_data_out_q[4] .SyncLoadMux = 2'bxx; +defparam \lcd_data_out_q[4] .coord_x = 1; +defparam \lcd_data_out_q[4] .coord_y = 26; +defparam \lcd_data_out_q[4] .coord_z = 6; +// Location: FF_X1_Y26_N14 +// alta_lcell_ff \lcd_data_out_q[3] ( +alta_slice \lcd_data_out_q[3] ( + .A(), + .B(), + .C(\MCU_D[3]~input_o ), + .D(), + .Cin(), + .Qin(lcd_data_out_q[3]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(), + .Cout(), + .Q(lcd_data_out_q[3])); +defparam \lcd_data_out_q[3] .mask = 16'hFFFF; +defparam \lcd_data_out_q[3] .mode = "ripple"; +defparam \lcd_data_out_q[3] .modeMux = 1'b1; +defparam \lcd_data_out_q[3] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[3] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[3] .BypassEn = 1'b1; +defparam \lcd_data_out_q[3] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[3] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[3] .SyncResetMux = 2'b00; +defparam \lcd_data_out_q[3] .SyncLoadMux = 2'b01; +defparam \lcd_data_out_q[3] .coord_x = 1; +defparam \lcd_data_out_q[3] .coord_y = 26; +defparam \lcd_data_out_q[3] .coord_z = 7; +// Location: FF_X1_Y26_N4 +// alta_lcell_ff \lcd_data_out_q[5] ( +alta_slice \lcd_data_out_q[5] ( + .A(), + .B(), + .C(\MCU_D[5]~input_o ), + .D(), + .Cin(), + .Qin(lcd_data_out_q[5]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(), + .Cout(), + .Q(lcd_data_out_q[5])); +defparam \lcd_data_out_q[5] .mask = 16'hFFFF; +defparam \lcd_data_out_q[5] .mode = "ripple"; +defparam \lcd_data_out_q[5] .modeMux = 1'b1; +defparam \lcd_data_out_q[5] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[5] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[5] .BypassEn = 1'b1; +defparam \lcd_data_out_q[5] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[5] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[5] .SyncResetMux = 2'b00; +defparam \lcd_data_out_q[5] .SyncLoadMux = 2'b01; +defparam \lcd_data_out_q[5] .coord_x = 1; +defparam \lcd_data_out_q[5] .coord_y = 26; +defparam \lcd_data_out_q[5] .coord_z = 2; +// Location: FF_X1_Y26_N6 +// alta_lcell_ff \lcd_data_in_q[3] ( +// Location: LCCOMB_X1_Y26_N6 +// alta_lcell_comb \mcu_data_out[3]~6 ( +alta_slice \lcd_data_in_q[3] ( + .A(\MCU_LCD_RDX~input_o ), + .B(\LCD_DB[11]~input_o ), + .C(\LCD_DB[3]~input_o ), + .D(vcc), + .Cin(), + .Qin(lcd_data_in_q[3]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(\mcu_data_out[3]~6_combout ), + .Cout(), + .Q(lcd_data_in_q[3])); +defparam \lcd_data_in_q[3] .mask = 16'hE4E4; +defparam \lcd_data_in_q[3] .mode = "logic"; +defparam \lcd_data_in_q[3] .modeMux = 1'b0; +defparam \lcd_data_in_q[3] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[3] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[3] .BypassEn = 1'b1; +defparam \lcd_data_in_q[3] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[3] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[3] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[3] .SyncLoadMux = 2'b01; +defparam \lcd_data_in_q[3] .coord_x = 1; +defparam \lcd_data_in_q[3] .coord_y = 26; +defparam \lcd_data_in_q[3] .coord_z = 3; +// Location: FF_X1_Y26_N8 +// alta_lcell_ff \lcd_data_in_q[5] ( +// Location: LCCOMB_X1_Y26_N8 +// alta_lcell_comb \mcu_data_out[5]~10 ( +alta_slice \lcd_data_in_q[5] ( + .A(\MCU_LCD_RDX~input_o ), + .B(vcc), + .C(\LCD_DB[5]~input_o ), + .D(\LCD_DB[13]~input_o ), + .Cin(), + .Qin(lcd_data_in_q[5]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(\mcu_data_out[5]~10_combout ), + .Cout(), + .Q(lcd_data_in_q[5])); +defparam \lcd_data_in_q[5] .mask = 16'hF5A0; +defparam \lcd_data_in_q[5] .mode = "logic"; +defparam \lcd_data_in_q[5] .modeMux = 1'b0; +defparam \lcd_data_in_q[5] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[5] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[5] .BypassEn = 1'b1; +defparam \lcd_data_in_q[5] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[5] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[5] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[5] .SyncLoadMux = 2'b01; + +defparam \lcd_data_in_q[5] .coord_x = 1; +defparam \lcd_data_in_q[5] .coord_y = 26; +defparam \lcd_data_in_q[5] .coord_z = 4; +// Location: CLKENCTRL_X1_Y26_N0 +alta_clkenctrl clken_ctrl_X1_Y26_N0(.ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC )); +defparam clken_ctrl_X1_Y26_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y26_N0.ClkEnMux = 2'b01; + +defparam clken_ctrl_X1_Y26_N0.coord_x = 1; +defparam clken_ctrl_X1_Y26_N0.coord_y = 26; +defparam clken_ctrl_X1_Y26_N0.coord_z = 0; +// Location: ASYNCCTRL_X1_Y26_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y26_N0(.Din(), .Dout(AsyncReset_X1_Y26_GND)); +defparam asyncreset_ctrl_X1_Y26_N0.AsyncCtrlMux = 2'b00; + +defparam asyncreset_ctrl_X1_Y26_N0.coord_x = 1; +defparam asyncreset_ctrl_X1_Y26_N0.coord_y = 26; +defparam asyncreset_ctrl_X1_Y26_N0.coord_z = 0; +// Location: CLKENCTRL_X1_Y26_N1 +alta_clkenctrl clken_ctrl_X1_Y26_N1(.ClkIn(\MCU_LCD_WRX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC )); +defparam clken_ctrl_X1_Y26_N1.ClkMux = 2'b11; +defparam clken_ctrl_X1_Y26_N1.ClkEnMux = 2'b01; + +defparam clken_ctrl_X1_Y26_N1.coord_x = 1; +defparam clken_ctrl_X1_Y26_N1.coord_y = 26; +defparam clken_ctrl_X1_Y26_N1.coord_z = 1; +// Location: SYNCCTRL_X1_Y26_N0 +alta_syncctrl syncreset_ctrl_X1_Y26(.Din(), .Dout(SyncReset_X1_Y26_GND)); +defparam syncreset_ctrl_X1_Y26.SyncCtrlMux = 2'b00; + +defparam syncreset_ctrl_X1_Y26.coord_x = 1; +defparam syncreset_ctrl_X1_Y26.coord_y = 26; +defparam syncreset_ctrl_X1_Y26.coord_z = 0; +// Location: SYNCCTRL_X1_Y26_N1 +alta_syncctrl syncload_ctrl_X1_Y26(.Din(), .Dout(SyncLoad_X1_Y26_VCC)); +defparam syncload_ctrl_X1_Y26.SyncCtrlMux = 2'b01; +defparam syncload_ctrl_X1_Y26.coord_x = 1; +defparam syncload_ctrl_X1_Y26.coord_y = 26; +defparam syncload_ctrl_X1_Y26.coord_z = 1; +endmodule + diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/flatten.vx b/hardware/portapack_h4m/CPLD/Supra/alta_db/flatten.vx new file mode 100644 index 00000000..3b7eac7d --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/alta_db/flatten.vx @@ -0,0 +1,1975 @@ +`timescale 1 ps/ 1 ps + +module top( + MCU_D, + MCU_DIR, + MCU_IO_STBX, + MCU_LCD_WRX, + MCU_ADDR, + MCU_LCD_TE, + MCU_P2_8, + MCU_LCD_RDX, + TP_U, + TP_D, + TP_L, + TP_R, + SW_SEL, + SW_ROT_A, + SW_ROT_B, + SW_U, + SW_D, + SW_L, + SW_R, + LCD_RESETX, + LCD_RS, + LCD_WRX, + LCD_RDX, + LCD_DB, + LCD_TE, + LCD_BACKLIGHT, + SYSOFF, + AUDIO_RESETX, + REF_EN, + GPS_RESETX, + GPS_TX_READY, + GPS_TIMEPULSE, + DEVICE_RESET, + DEVICE_RESET_V); +output [7:0] MCU_D; +input MCU_DIR; +input MCU_IO_STBX; +input MCU_LCD_WRX; +input MCU_ADDR; +output MCU_LCD_TE; +input MCU_P2_8; +input MCU_LCD_RDX; +output TP_U; +output TP_D; +output TP_L; +output TP_R; +input SW_SEL; +input SW_ROT_A; +input SW_ROT_B; +input SW_U; +input SW_D; +input SW_L; +input SW_R; +output LCD_RESETX; +output LCD_RS; +output LCD_WRX; +output LCD_RDX; +output [15:0] LCD_DB; +input LCD_TE; +output LCD_BACKLIGHT; +output SYSOFF; +output AUDIO_RESETX; +output REF_EN; +output GPS_RESETX; +input GPS_TX_READY; +input GPS_TIMEPULSE; +input DEVICE_RESET; +input DEVICE_RESET_V; + +// module hard_block +// Design Ports Information +// ~ALTERA_ASDO_DATA1~ => Location: PIN_F4, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_FLASH_nCE_nCSO~ => Location: PIN_E2, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_DCLK~ => Location: PIN_P3, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_DATA0~ => Location: PIN_N7, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_nCEO~ => Location: PIN_P28, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA + +// module top +// Design Ports Information +// MCU_LCD_TE => Location: PIN_AC4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_P2_8 => Location: PIN_D6, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// TP_U => Location: PIN_AA4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// TP_D => Location: PIN_AB3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// TP_L => Location: PIN_AA3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// TP_R => Location: PIN_AD1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_RESETX => Location: PIN_AB4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_RS => Location: PIN_AF2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_WRX => Location: PIN_M1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_RDX => Location: PIN_R6, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_BACKLIGHT => Location: PIN_W3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// SYSOFF => Location: PIN_AE2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// AUDIO_RESETX => Location: PIN_AE1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// REF_EN => Location: PIN_AC5, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// GPS_RESETX => Location: PIN_AC26, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// GPS_TX_READY => Location: PIN_D9, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// GPS_TIMEPULSE => Location: PIN_E25, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// DEVICE_RESET => Location: PIN_AF15, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// DEVICE_RESET_V => Location: PIN_AE25, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_D[0] => Location: PIN_AC1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[1] => Location: PIN_AC3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[2] => Location: PIN_AD3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[3] => Location: PIN_V3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[4] => Location: PIN_V2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[5] => Location: PIN_V1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[6] => Location: PIN_Y3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[7] => Location: PIN_AC2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[0] => Location: PIN_U5, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[1] => Location: PIN_AB1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[2] => Location: PIN_U2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[3] => Location: PIN_T3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[4] => Location: PIN_R5, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[5] => Location: PIN_T4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[6] => Location: PIN_Y4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[7] => Location: PIN_AB2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[8] => Location: PIN_U6, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[9] => Location: PIN_U1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[10] => Location: PIN_V4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[11] => Location: PIN_R2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[12] => Location: PIN_R1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[13] => Location: PIN_R4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[14] => Location: PIN_W2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[15] => Location: PIN_W1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_TE => Location: PIN_AB6, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_ADDR => Location: PIN_AB5, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_LCD_WRX => Location: PIN_Y1, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_LCD_RDX => Location: PIN_Y2, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_IO_STBX => Location: PIN_J1, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_DIR => Location: PIN_AD2, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_R => Location: PIN_U8, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_L => Location: PIN_U7, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_D => Location: PIN_T7, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_U => Location: PIN_R3, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_SEL => Location: PIN_U3, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_ROT_A => Location: PIN_U4, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_ROT_B => Location: PIN_T8, I/O Standard: 3.3-V LVTTL, Current Strength: Default + +//wire gnd; +//wire gnd; +//wire vcc; +//wire vcc; +//wire \AUDIO_RESETX~output_o ; +wire \DEVICE_RESET_V~input_o ; +wire \DEVICE_RESET~input_o ; +//wire \GPS_RESETX~output_o ; +wire \GPS_TIMEPULSE~input_o ; +wire \GPS_TX_READY~input_o ; +//wire \LCD_BACKLIGHT~output_o ; +//wire \LCD_DB[0]~output_o ; +wire \LCD_DB[0]~input_o ; +//wire \LCD_DB[10]~output_o ; +wire \LCD_DB[10]~input_o ; +//wire \LCD_DB[11]~output_o ; +wire \LCD_DB[11]~input_o ; +//wire \LCD_DB[12]~output_o ; +wire \LCD_DB[12]~input_o ; +//wire \LCD_DB[13]~output_o ; +wire \LCD_DB[13]~input_o ; +//wire \LCD_DB[14]~output_o ; +wire \LCD_DB[14]~input_o ; +//wire \LCD_DB[15]~output_o ; +wire \LCD_DB[15]~input_o ; +//wire \LCD_DB[1]~output_o ; +wire \LCD_DB[1]~input_o ; +//wire \LCD_DB[2]~output_o ; +wire \LCD_DB[2]~input_o ; +//wire \LCD_DB[3]~output_o ; +wire \LCD_DB[3]~input_o ; +//wire \LCD_DB[4]~output_o ; +wire \LCD_DB[4]~input_o ; +//wire \LCD_DB[5]~output_o ; +wire \LCD_DB[5]~input_o ; +//wire \LCD_DB[6]~output_o ; +wire \LCD_DB[6]~input_o ; +//wire \LCD_DB[7]~output_o ; +wire \LCD_DB[7]~input_o ; +//wire \LCD_DB[8]~output_o ; +wire \LCD_DB[8]~input_o ; +//wire \LCD_DB[9]~output_o ; +wire \LCD_DB[9]~input_o ; +//wire \LCD_RDX~output_o ; +//wire \LCD_RESETX~output_o ; +//wire \LCD_RS~output_o ; +wire \LCD_TE~input_o ; +//wire \LCD_WRX~output_o ; +wire \MCU_ADDR~input_o ; +wire \MCU_DIR~input_o ; +//wire \MCU_D[0]~output_o ; +wire \MCU_D[0]~input_o ; +//wire \MCU_D[1]~output_o ; +wire \MCU_D[1]~input_o ; +//wire \MCU_D[2]~output_o ; +wire \MCU_D[2]~input_o ; +//wire \MCU_D[3]~output_o ; +wire \MCU_D[3]~input_o ; +//wire \MCU_D[4]~output_o ; +wire \MCU_D[4]~input_o ; +//wire \MCU_D[5]~output_o ; +wire \MCU_D[5]~input_o ; +//wire \MCU_D[6]~output_o ; +wire \MCU_D[6]~input_o ; +//wire \MCU_D[7]~output_o ; +wire \MCU_D[7]~input_o ; +wire \MCU_IO_STBX~input_o ; +wire \MCU_IO_STBX~inputclkctrl_outclk ; +wire \MCU_LCD_RDX~input_o ; +wire \MCU_LCD_RDX~inputclkctrl_outclk ; +//wire \MCU_LCD_TE~output_o ; +wire \MCU_LCD_WRX~input_o ; +wire \MCU_LCD_WRX~inputclkctrl_outclk ; +wire \MCU_P2_8~input_o ; +//wire \REF_EN~output_o ; +wire \SW_D~input_o ; +wire \SW_L~input_o ; +wire \SW_ROT_A~input_o ; +wire \SW_ROT_B~input_o ; +wire \SW_R~input_o ; +wire \SW_SEL~input_o ; +wire \SW_U~input_o ; +//wire \SYSOFF~output_o ; +//wire \TP_D~output_o ; +//wire \TP_L~output_o ; +//wire \TP_R~output_o ; +//wire \TP_U~output_o ; +wire \audio_reset_q~0_combout ; +wire \audio_reset_q~q ; +//wire devclrn; +tri1 devclrn; +//wire devoe; +tri1 devoe; +//wire devpor; +tri1 devpor; +wire \lcd_backlight_q~feeder_combout ; +wire \lcd_backlight_q~q ; +wire [7:0] lcd_data_in_q; +//wire lcd_data_in_q[0]; +//wire lcd_data_in_q[1]; +//wire lcd_data_in_q[2]; +//wire lcd_data_in_q[3]; +//wire lcd_data_in_q[4]; +//wire lcd_data_in_q[5]; +//wire lcd_data_in_q[6]; +//wire lcd_data_in_q[7]; +wire [7:0] lcd_data_out_q; +//wire lcd_data_out_q[0]; +wire \lcd_data_out_q[0]~feeder_combout ; +//wire lcd_data_out_q[1]; +wire \lcd_data_out_q[1]~feeder_combout ; +//wire lcd_data_out_q[2]; +wire \lcd_data_out_q[2]~feeder_combout ; +//wire lcd_data_out_q[3]; +//wire lcd_data_out_q[4]; +wire \lcd_data_out_q[4]~feeder_combout ; +//wire lcd_data_out_q[5]; +//wire lcd_data_out_q[6]; +//wire lcd_data_out_q[7]; +wire \lcd_data_out_q[7]~feeder_combout ; +wire \lcd_reset_q~0_combout ; +wire \lcd_reset_q~1_combout ; +wire \lcd_reset_q~q ; +wire \mcu_data_out[0]~0_combout ; +wire \mcu_data_out[0]~1_combout ; +wire \mcu_data_out[1]~2_combout ; +wire \mcu_data_out[1]~3_combout ; +wire \mcu_data_out[2]~4_combout ; +wire \mcu_data_out[2]~5_combout ; +wire \mcu_data_out[3]~6_combout ; +wire \mcu_data_out[3]~7_combout ; +wire \mcu_data_out[4]~8_combout ; +wire \mcu_data_out[4]~9_combout ; +wire \mcu_data_out[5]~10_combout ; +wire \mcu_data_out[5]~11_combout ; +wire \mcu_data_out[6]~12_combout ; +wire \mcu_data_out[6]~13_combout ; +wire \mcu_data_out[7]~14_combout ; +wire \mcu_data_out[7]~15_combout ; +wire \ref_en_q~feeder_combout ; +wire \ref_en_q~q ; +wire \sysoff_q~feeder_combout ; +wire \sysoff_q~q ; +wire [7:0] tp_q; +//wire tp_q[0]; +//wire tp_q[1]; +//wire tp_q[2]; +wire \tp_q[2]~feeder_combout ; +//wire tp_q[3]; +wire \tp_q[3]~0_combout ; +//wire tp_q[4]; +wire \tp_q[4]~feeder_combout ; +//wire tp_q[5]; +//wire tp_q[6]; +wire \tp_q[6]~feeder_combout ; +//wire tp_q[7]; +wire \tp_q[7]~feeder_combout ; +wire unknown; +wire unknown; +wire \~ALTERA_ASDO_DATA1~~ibuf_o ; +wire \~ALTERA_ASDO_DATA1~~padout ; +wire \~ALTERA_DATA0~~ibuf_o ; +wire \~ALTERA_DATA0~~padout ; +wire \~ALTERA_FLASH_nCE_nCSO~~ibuf_o ; +wire \~ALTERA_FLASH_nCE_nCSO~~padout ; + +wire vcc; +wire gnd; +assign vcc = 1'b1; +assign gnd = 1'b0; + +// Location: IOOBUF_X0_Y9_N16 +cycloneive_io_obuf \AUDIO_RESETX~output ( + .i(\audio_reset_q~q ), + .oe(vcc), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(AUDIO_RESETX), + .obar()); +defparam \AUDIO_RESETX~output .bus_hold = "false"; +defparam \AUDIO_RESETX~output .open_drain_output = "false"; + +// Location: IOIBUF_X78_Y0_N8 +cycloneive_io_ibuf \DEVICE_RESET_V~input ( + .i(DEVICE_RESET_V), + .ibar(gnd), + .o(\DEVICE_RESET_V~input_o )); +defparam \DEVICE_RESET_V~input .bus_hold = "false"; +defparam \DEVICE_RESET_V~input .simulate_z_as = "z"; + +// Location: IOIBUF_X51_Y0_N1 +cycloneive_io_ibuf \DEVICE_RESET~input ( + .i(DEVICE_RESET), + .ibar(gnd), + .o(\DEVICE_RESET~input_o )); +defparam \DEVICE_RESET~input .bus_hold = "false"; +defparam \DEVICE_RESET~input .simulate_z_as = "z"; + +// Location: IOOBUF_X94_Y9_N16 +cycloneive_io_obuf \GPS_RESETX~output ( + .i(vcc), + .oe(vcc), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(GPS_RESETX), + .obar()); +defparam \GPS_RESETX~output .bus_hold = "false"; +defparam \GPS_RESETX~output .open_drain_output = "false"; + +// Location: IOIBUF_X56_Y62_N1 +cycloneive_io_ibuf \GPS_TIMEPULSE~input ( + .i(GPS_TIMEPULSE), + .ibar(gnd), + .o(\GPS_TIMEPULSE~input_o )); +defparam \GPS_TIMEPULSE~input .bus_hold = "false"; +defparam \GPS_TIMEPULSE~input .simulate_z_as = "z"; + +// Location: IOIBUF_X23_Y62_N22 +cycloneive_io_ibuf \GPS_TX_READY~input ( + .i(GPS_TX_READY), + .ibar(gnd), + .o(\GPS_TX_READY~input_o )); +defparam \GPS_TX_READY~input .bus_hold = "false"; +defparam \GPS_TX_READY~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y8_N23 +cycloneive_io_obuf \LCD_BACKLIGHT~output ( + .i(\lcd_backlight_q~q ), + .oe(vcc), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_BACKLIGHT), + .obar()); +defparam \LCD_BACKLIGHT~output .bus_hold = "false"; +defparam \LCD_BACKLIGHT~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y19_N15 +cycloneive_io_ibuf \LCD_DB[0]~input ( + .i(LCD_DB[0]), + .ibar(gnd), + .o(\LCD_DB[0]~input_o )); +defparam \LCD_DB[0]~input .bus_hold = "false"; +defparam \LCD_DB[0]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y19_N16 +cycloneive_io_obuf \LCD_DB[0]~output ( + .i(\MCU_D[0]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[0]), + .obar()); +defparam \LCD_DB[0]~output .bus_hold = "false"; +defparam \LCD_DB[0]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y24_N22 +cycloneive_io_ibuf \LCD_DB[10]~input ( + .i(LCD_DB[10]), + .ibar(gnd), + .o(\LCD_DB[10]~input_o )); +defparam \LCD_DB[10]~input .bus_hold = "false"; +defparam \LCD_DB[10]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y24_N23 +cycloneive_io_obuf \LCD_DB[10]~output ( + .i(lcd_data_out_q[2]), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[10]), + .obar()); +defparam \LCD_DB[10]~output .bus_hold = "false"; +defparam \LCD_DB[10]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y29_N1 +cycloneive_io_ibuf \LCD_DB[11]~input ( + .i(LCD_DB[11]), + .ibar(gnd), + .o(\LCD_DB[11]~input_o )); +defparam \LCD_DB[11]~input .bus_hold = "false"; +defparam \LCD_DB[11]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y29_N2 +cycloneive_io_obuf \LCD_DB[11]~output ( + .i(lcd_data_out_q[3]), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[11]), + .obar()); +defparam \LCD_DB[11]~output .bus_hold = "false"; +defparam \LCD_DB[11]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y29_N8 +cycloneive_io_ibuf \LCD_DB[12]~input ( + .i(LCD_DB[12]), + .ibar(gnd), + .o(\LCD_DB[12]~input_o )); +defparam \LCD_DB[12]~input .bus_hold = "false"; +defparam \LCD_DB[12]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y29_N9 +cycloneive_io_obuf \LCD_DB[12]~output ( + .i(lcd_data_out_q[4]), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[12]), + .obar()); +defparam \LCD_DB[12]~output .bus_hold = "false"; +defparam \LCD_DB[12]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y26_N1 +cycloneive_io_ibuf \LCD_DB[13]~input ( + .i(LCD_DB[13]), + .ibar(gnd), + .o(\LCD_DB[13]~input_o )); +defparam \LCD_DB[13]~input .bus_hold = "false"; +defparam \LCD_DB[13]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y26_N2 +cycloneive_io_obuf \LCD_DB[13]~output ( + .i(lcd_data_out_q[5]), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[13]), + .obar()); +defparam \LCD_DB[13]~output .bus_hold = "false"; +defparam \LCD_DB[13]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y20_N1 +cycloneive_io_ibuf \LCD_DB[14]~input ( + .i(LCD_DB[14]), + .ibar(gnd), + .o(\LCD_DB[14]~input_o )); +defparam \LCD_DB[14]~input .bus_hold = "false"; +defparam \LCD_DB[14]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y20_N2 +cycloneive_io_obuf \LCD_DB[14]~output ( + .i(lcd_data_out_q[6]), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[14]), + .obar()); +defparam \LCD_DB[14]~output .bus_hold = "false"; +defparam \LCD_DB[14]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y20_N8 +cycloneive_io_ibuf \LCD_DB[15]~input ( + .i(LCD_DB[15]), + .ibar(gnd), + .o(\LCD_DB[15]~input_o )); +defparam \LCD_DB[15]~input .bus_hold = "false"; +defparam \LCD_DB[15]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y20_N9 +cycloneive_io_obuf \LCD_DB[15]~output ( + .i(lcd_data_out_q[7]), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[15]), + .obar()); +defparam \LCD_DB[15]~output .bus_hold = "false"; +defparam \LCD_DB[15]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y21_N8 +cycloneive_io_ibuf \LCD_DB[1]~input ( + .i(LCD_DB[1]), + .ibar(gnd), + .o(\LCD_DB[1]~input_o )); +defparam \LCD_DB[1]~input .bus_hold = "false"; +defparam \LCD_DB[1]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y21_N9 +cycloneive_io_obuf \LCD_DB[1]~output ( + .i(\MCU_D[1]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[1]), + .obar()); +defparam \LCD_DB[1]~output .bus_hold = "false"; +defparam \LCD_DB[1]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y24_N1 +cycloneive_io_ibuf \LCD_DB[2]~input ( + .i(LCD_DB[2]), + .ibar(gnd), + .o(\LCD_DB[2]~input_o )); +defparam \LCD_DB[2]~input .bus_hold = "false"; +defparam \LCD_DB[2]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y24_N2 +cycloneive_io_obuf \LCD_DB[2]~output ( + .i(\MCU_D[2]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[2]), + .obar()); +defparam \LCD_DB[2]~output .bus_hold = "false"; +defparam \LCD_DB[2]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y26_N15 +cycloneive_io_ibuf \LCD_DB[3]~input ( + .i(LCD_DB[3]), + .ibar(gnd), + .o(\LCD_DB[3]~input_o )); +defparam \LCD_DB[3]~input .bus_hold = "false"; +defparam \LCD_DB[3]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y26_N16 +cycloneive_io_obuf \LCD_DB[3]~output ( + .i(\MCU_D[3]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[3]), + .obar()); +defparam \LCD_DB[3]~output .bus_hold = "false"; +defparam \LCD_DB[3]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y26_N22 +cycloneive_io_ibuf \LCD_DB[4]~input ( + .i(LCD_DB[4]), + .ibar(gnd), + .o(\LCD_DB[4]~input_o )); +defparam \LCD_DB[4]~input .bus_hold = "false"; +defparam \LCD_DB[4]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y26_N23 +cycloneive_io_obuf \LCD_DB[4]~output ( + .i(\MCU_D[4]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[4]), + .obar()); +defparam \LCD_DB[4]~output .bus_hold = "false"; +defparam \LCD_DB[4]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y26_N8 +cycloneive_io_ibuf \LCD_DB[5]~input ( + .i(LCD_DB[5]), + .ibar(gnd), + .o(\LCD_DB[5]~input_o )); +defparam \LCD_DB[5]~input .bus_hold = "false"; +defparam \LCD_DB[5]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y26_N9 +cycloneive_io_obuf \LCD_DB[5]~output ( + .i(\MCU_D[5]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[5]), + .obar()); +defparam \LCD_DB[5]~output .bus_hold = "false"; +defparam \LCD_DB[5]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y19_N22 +cycloneive_io_ibuf \LCD_DB[6]~input ( + .i(LCD_DB[6]), + .ibar(gnd), + .o(\LCD_DB[6]~input_o )); +defparam \LCD_DB[6]~input .bus_hold = "false"; +defparam \LCD_DB[6]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y19_N23 +cycloneive_io_obuf \LCD_DB[6]~output ( + .i(\MCU_D[6]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[6]), + .obar()); +defparam \LCD_DB[6]~output .bus_hold = "false"; +defparam \LCD_DB[6]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y21_N1 +cycloneive_io_ibuf \LCD_DB[7]~input ( + .i(LCD_DB[7]), + .ibar(gnd), + .o(\LCD_DB[7]~input_o )); +defparam \LCD_DB[7]~input .bus_hold = "false"; +defparam \LCD_DB[7]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y21_N2 +cycloneive_io_obuf \LCD_DB[7]~output ( + .i(\MCU_D[7]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[7]), + .obar()); +defparam \LCD_DB[7]~output .bus_hold = "false"; +defparam \LCD_DB[7]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y19_N1 +cycloneive_io_ibuf \LCD_DB[8]~input ( + .i(LCD_DB[8]), + .ibar(gnd), + .o(\LCD_DB[8]~input_o )); +defparam \LCD_DB[8]~input .bus_hold = "false"; +defparam \LCD_DB[8]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y19_N2 +cycloneive_io_obuf \LCD_DB[8]~output ( + .i(lcd_data_out_q[0]), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[8]), + .obar()); +defparam \LCD_DB[8]~output .bus_hold = "false"; +defparam \LCD_DB[8]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y24_N8 +cycloneive_io_ibuf \LCD_DB[9]~input ( + .i(LCD_DB[9]), + .ibar(gnd), + .o(\LCD_DB[9]~input_o )); +defparam \LCD_DB[9]~input .bus_hold = "false"; +defparam \LCD_DB[9]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y24_N9 +cycloneive_io_obuf \LCD_DB[9]~output ( + .i(lcd_data_out_q[1]), + .oe(\MCU_LCD_RDX~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_DB[9]), + .obar()); +defparam \LCD_DB[9]~output .bus_hold = "false"; +defparam \LCD_DB[9]~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y29_N16 +cycloneive_io_obuf \LCD_RDX~output ( + .i(\MCU_LCD_RDX~input_o ), + .oe(vcc), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_RDX), + .obar()); +defparam \LCD_RDX~output .bus_hold = "false"; +defparam \LCD_RDX~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y7_N2 +cycloneive_io_obuf \LCD_RESETX~output ( + .i(\lcd_reset_q~q ), + .oe(vcc), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_RESETX), + .obar()); +defparam \LCD_RESETX~output .bus_hold = "false"; +defparam \LCD_RESETX~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y4_N16 +cycloneive_io_obuf \LCD_RS~output ( + .i(\MCU_ADDR~input_o ), + .oe(vcc), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_RS), + .obar()); +defparam \LCD_RS~output .bus_hold = "false"; +defparam \LCD_RS~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y6_N22 +cycloneive_io_ibuf \LCD_TE~input ( + .i(LCD_TE), + .ibar(gnd), + .o(\LCD_TE~input_o )); +defparam \LCD_TE~input .bus_hold = "false"; +defparam \LCD_TE~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y37_N2 +cycloneive_io_obuf \LCD_WRX~output ( + .i(\MCU_LCD_WRX~input_o ), + .oe(vcc), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(LCD_WRX), + .obar()); +defparam \LCD_WRX~output .bus_hold = "false"; +defparam \LCD_WRX~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y4_N22 +cycloneive_io_ibuf \MCU_ADDR~input ( + .i(MCU_ADDR), + .ibar(gnd), + .o(\MCU_ADDR~input_o )); +defparam \MCU_ADDR~input .bus_hold = "false"; +defparam \MCU_ADDR~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y16_N22 +cycloneive_io_ibuf \MCU_DIR~input ( + .i(MCU_DIR), + .ibar(gnd), + .o(\MCU_DIR~input_o )); +defparam \MCU_DIR~input .bus_hold = "false"; +defparam \MCU_DIR~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y17_N8 +cycloneive_io_ibuf \MCU_D[0]~input ( + .i(MCU_D[0]), + .ibar(gnd), + .o(\MCU_D[0]~input_o )); +defparam \MCU_D[0]~input .bus_hold = "false"; +defparam \MCU_D[0]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y17_N9 +cycloneive_io_obuf \MCU_D[0]~output ( + .i(\mcu_data_out[0]~1_combout ), + .oe(\MCU_DIR~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(MCU_D[0]), + .obar()); +defparam \MCU_D[0]~output .bus_hold = "false"; +defparam \MCU_D[0]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y16_N8 +cycloneive_io_ibuf \MCU_D[1]~input ( + .i(MCU_D[1]), + .ibar(gnd), + .o(\MCU_D[1]~input_o )); +defparam \MCU_D[1]~input .bus_hold = "false"; +defparam \MCU_D[1]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y16_N9 +cycloneive_io_obuf \MCU_D[1]~output ( + .i(\mcu_data_out[1]~3_combout ), + .oe(\MCU_DIR~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(MCU_D[1]), + .obar()); +defparam \MCU_D[1]~output .bus_hold = "false"; +defparam \MCU_D[1]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y16_N15 +cycloneive_io_ibuf \MCU_D[2]~input ( + .i(MCU_D[2]), + .ibar(gnd), + .o(\MCU_D[2]~input_o )); +defparam \MCU_D[2]~input .bus_hold = "false"; +defparam \MCU_D[2]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y16_N16 +cycloneive_io_obuf \MCU_D[2]~output ( + .i(\mcu_data_out[2]~5_combout ), + .oe(\MCU_DIR~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(MCU_D[2]), + .obar()); +defparam \MCU_D[2]~output .bus_hold = "false"; +defparam \MCU_D[2]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y23_N1 +cycloneive_io_ibuf \MCU_D[3]~input ( + .i(MCU_D[3]), + .ibar(gnd), + .o(\MCU_D[3]~input_o )); +defparam \MCU_D[3]~input .bus_hold = "false"; +defparam \MCU_D[3]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y23_N2 +cycloneive_io_obuf \MCU_D[3]~output ( + .i(\mcu_data_out[3]~7_combout ), + .oe(\MCU_DIR~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(MCU_D[3]), + .obar()); +defparam \MCU_D[3]~output .bus_hold = "false"; +defparam \MCU_D[3]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y23_N8 +cycloneive_io_ibuf \MCU_D[4]~input ( + .i(MCU_D[4]), + .ibar(gnd), + .o(\MCU_D[4]~input_o )); +defparam \MCU_D[4]~input .bus_hold = "false"; +defparam \MCU_D[4]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y23_N9 +cycloneive_io_obuf \MCU_D[4]~output ( + .i(\mcu_data_out[4]~9_combout ), + .oe(\MCU_DIR~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(MCU_D[4]), + .obar()); +defparam \MCU_D[4]~output .bus_hold = "false"; +defparam \MCU_D[4]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y22_N8 +cycloneive_io_ibuf \MCU_D[5]~input ( + .i(MCU_D[5]), + .ibar(gnd), + .o(\MCU_D[5]~input_o )); +defparam \MCU_D[5]~input .bus_hold = "false"; +defparam \MCU_D[5]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y22_N9 +cycloneive_io_obuf \MCU_D[5]~output ( + .i(\mcu_data_out[5]~11_combout ), + .oe(\MCU_DIR~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(MCU_D[5]), + .obar()); +defparam \MCU_D[5]~output .bus_hold = "false"; +defparam \MCU_D[5]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y18_N15 +cycloneive_io_ibuf \MCU_D[6]~input ( + .i(MCU_D[6]), + .ibar(gnd), + .o(\MCU_D[6]~input_o )); +defparam \MCU_D[6]~input .bus_hold = "false"; +defparam \MCU_D[6]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y18_N16 +cycloneive_io_obuf \MCU_D[6]~output ( + .i(\mcu_data_out[6]~13_combout ), + .oe(\MCU_DIR~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(MCU_D[6]), + .obar()); +defparam \MCU_D[6]~output .bus_hold = "false"; +defparam \MCU_D[6]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y18_N22 +cycloneive_io_ibuf \MCU_D[7]~input ( + .i(MCU_D[7]), + .ibar(gnd), + .o(\MCU_D[7]~input_o )); +defparam \MCU_D[7]~input .bus_hold = "false"; +defparam \MCU_D[7]~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y18_N23 +cycloneive_io_obuf \MCU_D[7]~output ( + .i(\mcu_data_out[7]~15_combout ), + .oe(\MCU_DIR~input_o ), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(MCU_D[7]), + .obar()); +defparam \MCU_D[7]~output .bus_hold = "false"; +defparam \MCU_D[7]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y30_N8 +cycloneive_io_ibuf \MCU_IO_STBX~input ( + .i(MCU_IO_STBX), + .ibar(gnd), + .o(\MCU_IO_STBX~input_o )); +defparam \MCU_IO_STBX~input .bus_hold = "false"; +defparam \MCU_IO_STBX~input .simulate_z_as = "z"; + +// Location: CLKCTRL_G2 +cycloneive_clkctrl \MCU_IO_STBX~inputclkctrl ( + .inclk({vcc, vcc, vcc, \MCU_IO_STBX~input_o }), + .clkselect({gnd, gnd}), + .ena(vcc), + .devpor(devpor), + .devclrn(devclrn), + .outclk(\MCU_IO_STBX~inputclkctrl_outclk )); +defparam \MCU_IO_STBX~inputclkctrl .clock_type = "global clock"; +defparam \MCU_IO_STBX~inputclkctrl .ena_register_mode = "none"; + +// Location: IOIBUF_X0_Y30_N15 +cycloneive_io_ibuf \MCU_LCD_RDX~input ( + .i(MCU_LCD_RDX), + .ibar(gnd), + .o(\MCU_LCD_RDX~input_o )); +defparam \MCU_LCD_RDX~input .bus_hold = "false"; +defparam \MCU_LCD_RDX~input .simulate_z_as = "z"; + +// Location: CLKCTRL_G4 +cycloneive_clkctrl \MCU_LCD_RDX~inputclkctrl ( + .inclk({vcc, vcc, vcc, \MCU_LCD_RDX~input_o }), + .clkselect({gnd, gnd}), + .ena(vcc), + .devpor(devpor), + .devclrn(devclrn), + .outclk(\MCU_LCD_RDX~inputclkctrl_outclk )); +defparam \MCU_LCD_RDX~inputclkctrl .clock_type = "global clock"; +defparam \MCU_LCD_RDX~inputclkctrl .ena_register_mode = "none"; + +// Location: IOOBUF_X0_Y6_N16 +cycloneive_io_obuf \MCU_LCD_TE~output ( + .i(\LCD_TE~input_o ), + .oe(vcc), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(MCU_LCD_TE), + .obar()); +defparam \MCU_LCD_TE~output .bus_hold = "false"; +defparam \MCU_LCD_TE~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y30_N22 +cycloneive_io_ibuf \MCU_LCD_WRX~input ( + .i(MCU_LCD_WRX), + .ibar(gnd), + .o(\MCU_LCD_WRX~input_o )); +defparam \MCU_LCD_WRX~input .bus_hold = "false"; +defparam \MCU_LCD_WRX~input .simulate_z_as = "z"; + +// Location: CLKCTRL_G3 +cycloneive_clkctrl \MCU_LCD_WRX~inputclkctrl ( + .inclk({vcc, vcc, vcc, \MCU_LCD_WRX~input_o }), + .clkselect({gnd, gnd}), + .ena(vcc), + .devpor(devpor), + .devclrn(devclrn), + .outclk(\MCU_LCD_WRX~inputclkctrl_outclk )); +defparam \MCU_LCD_WRX~inputclkctrl .clock_type = "global clock"; +defparam \MCU_LCD_WRX~inputclkctrl .ena_register_mode = "none"; + +// Location: IOIBUF_X18_Y62_N15 +cycloneive_io_ibuf \MCU_P2_8~input ( + .i(MCU_P2_8), + .ibar(gnd), + .o(\MCU_P2_8~input_o )); +defparam \MCU_P2_8~input .bus_hold = "false"; +defparam \MCU_P2_8~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y7_N9 +cycloneive_io_obuf \REF_EN~output ( + .i(\ref_en_q~q ), + .oe(vcc), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(REF_EN), + .obar()); +defparam \REF_EN~output .bus_hold = "false"; +defparam \REF_EN~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y25_N15 +cycloneive_io_ibuf \SW_D~input ( + .i(SW_D), + .ibar(gnd), + .o(\SW_D~input_o )); +defparam \SW_D~input .bus_hold = "false"; +defparam \SW_D~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y10_N1 +cycloneive_io_ibuf \SW_L~input ( + .i(SW_L), + .ibar(gnd), + .o(\SW_L~input_o )); +defparam \SW_L~input .bus_hold = "false"; +defparam \SW_L~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y28_N8 +cycloneive_io_ibuf \SW_ROT_A~input ( + .i(SW_ROT_A), + .ibar(gnd), + .o(\SW_ROT_A~input_o )); +defparam \SW_ROT_A~input .bus_hold = "false"; +defparam \SW_ROT_A~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y14_N8 +cycloneive_io_ibuf \SW_ROT_B~input ( + .i(SW_ROT_B), + .ibar(gnd), + .o(\SW_ROT_B~input_o )); +defparam \SW_ROT_B~input .bus_hold = "false"; +defparam \SW_ROT_B~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y10_N8 +cycloneive_io_ibuf \SW_R~input ( + .i(SW_R), + .ibar(gnd), + .o(\SW_R~input_o )); +defparam \SW_R~input .bus_hold = "false"; +defparam \SW_R~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y29_N22 +cycloneive_io_ibuf \SW_SEL~input ( + .i(SW_SEL), + .ibar(gnd), + .o(\SW_SEL~input_o )); +defparam \SW_SEL~input .bus_hold = "false"; +defparam \SW_SEL~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y28_N15 +cycloneive_io_ibuf \SW_U~input ( + .i(SW_U), + .ibar(gnd), + .o(\SW_U~input_o )); +defparam \SW_U~input .bus_hold = "false"; +defparam \SW_U~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y9_N9 +cycloneive_io_obuf \SYSOFF~output ( + .i(\sysoff_q~q ), + .oe(vcc), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(SYSOFF), + .obar()); +defparam \SYSOFF~output .bus_hold = "false"; +defparam \SYSOFF~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y15_N23 +cycloneive_io_obuf \TP_D~output ( + .i(tp_q[2]), + .oe(tp_q[6]), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(TP_D), + .obar()); +defparam \TP_D~output .bus_hold = "false"; +defparam \TP_D~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y11_N9 +cycloneive_io_obuf \TP_L~output ( + .i(tp_q[1]), + .oe(tp_q[5]), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(TP_L), + .obar()); +defparam \TP_L~output .bus_hold = "false"; +defparam \TP_L~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y15_N16 +cycloneive_io_obuf \TP_R~output ( + .i(tp_q[0]), + .oe(tp_q[4]), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(TP_R), + .obar()); +defparam \TP_R~output .bus_hold = "false"; +defparam \TP_R~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y11_N2 +cycloneive_io_obuf \TP_U~output ( + .i(tp_q[3]), + .oe(tp_q[7]), + .seriesterminationcontrol({gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd, gnd}), + .devoe(devoe), + .o(TP_U), + .obar()); +defparam \TP_U~output .bus_hold = "false"; +defparam \TP_U~output .open_drain_output = "false"; + +// Location: FF_X1_Y15_N23 +dffeas audio_reset_q( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(\audio_reset_q~0_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(\lcd_reset_q~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(\audio_reset_q~q ), + .prn(vcc)); +defparam audio_reset_q.is_wysiwyg = "true"; +defparam audio_reset_q.power_up = "low"; + +// Location: LCCOMB_X1_Y15_N22 +cycloneive_lcell_comb \audio_reset_q~0 ( + .dataa(gnd), + .datab(gnd), + .datac(\MCU_D[1]~input_o ), + .datad(gnd), + .cin(gnd), + .combout(\audio_reset_q~0_combout ), + .cout()); +defparam \audio_reset_q~0 .lut_mask = 16'h0F0F; +defparam \audio_reset_q~0 .sum_lutc_input = "datac"; + +// Location: FF_X1_Y15_N17 +dffeas lcd_backlight_q( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(\lcd_backlight_q~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(\lcd_reset_q~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(\lcd_backlight_q~q ), + .prn(vcc)); +defparam lcd_backlight_q.is_wysiwyg = "true"; +defparam lcd_backlight_q.power_up = "low"; + +// Location: LCCOMB_X1_Y15_N16 +cycloneive_lcell_comb \lcd_backlight_q~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[7]~input_o ), + .cin(gnd), + .combout(\lcd_backlight_q~feeder_combout ), + .cout()); +defparam \lcd_backlight_q~feeder .lut_mask = 16'hFF00; +defparam \lcd_backlight_q~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y19_N31 +dffeas \lcd_data_in_q[0] ( + .clk(\MCU_LCD_RDX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\LCD_DB[0]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_in_q[0]), + .prn(vcc)); +defparam \lcd_data_in_q[0] .is_wysiwyg = "true"; +defparam \lcd_data_in_q[0] .power_up = "low"; + +// Location: FF_X1_Y21_N5 +dffeas \lcd_data_in_q[1] ( + .clk(\MCU_LCD_RDX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\LCD_DB[1]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_in_q[1]), + .prn(vcc)); +defparam \lcd_data_in_q[1] .is_wysiwyg = "true"; +defparam \lcd_data_in_q[1] .power_up = "low"; + +// Location: FF_X1_Y24_N31 +dffeas \lcd_data_in_q[2] ( + .clk(\MCU_LCD_RDX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\LCD_DB[2]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_in_q[2]), + .prn(vcc)); +defparam \lcd_data_in_q[2] .is_wysiwyg = "true"; +defparam \lcd_data_in_q[2] .power_up = "low"; + +// Location: FF_X1_Y26_N7 +dffeas \lcd_data_in_q[3] ( + .clk(\MCU_LCD_RDX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\LCD_DB[3]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_in_q[3]), + .prn(vcc)); +defparam \lcd_data_in_q[3] .is_wysiwyg = "true"; +defparam \lcd_data_in_q[3] .power_up = "low"; + +// Location: FF_X1_Y26_N11 +dffeas \lcd_data_in_q[4] ( + .clk(\MCU_LCD_RDX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\LCD_DB[4]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_in_q[4]), + .prn(vcc)); +defparam \lcd_data_in_q[4] .is_wysiwyg = "true"; +defparam \lcd_data_in_q[4] .power_up = "low"; + +// Location: FF_X1_Y26_N9 +dffeas \lcd_data_in_q[5] ( + .clk(\MCU_LCD_RDX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\LCD_DB[5]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_in_q[5]), + .prn(vcc)); +defparam \lcd_data_in_q[5] .is_wysiwyg = "true"; +defparam \lcd_data_in_q[5] .power_up = "low"; + +// Location: FF_X1_Y19_N5 +dffeas \lcd_data_in_q[6] ( + .clk(\MCU_LCD_RDX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\LCD_DB[6]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_in_q[6]), + .prn(vcc)); +defparam \lcd_data_in_q[6] .is_wysiwyg = "true"; +defparam \lcd_data_in_q[6] .power_up = "low"; + +// Location: FF_X1_Y21_N29 +dffeas \lcd_data_in_q[7] ( + .clk(\MCU_LCD_RDX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\LCD_DB[7]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_in_q[7]), + .prn(vcc)); +defparam \lcd_data_in_q[7] .is_wysiwyg = "true"; +defparam \lcd_data_in_q[7] .power_up = "low"; + +// Location: FF_X1_Y20_N31 +dffeas \lcd_data_out_q[0] ( + .clk(!\MCU_LCD_WRX~inputclkctrl_outclk ), + .d(\lcd_data_out_q[0]~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_out_q[0]), + .prn(vcc)); +defparam \lcd_data_out_q[0] .is_wysiwyg = "true"; +defparam \lcd_data_out_q[0] .power_up = "low"; + +// Location: LCCOMB_X1_Y20_N30 +cycloneive_lcell_comb \lcd_data_out_q[0]~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[0]~input_o ), + .cin(gnd), + .combout(\lcd_data_out_q[0]~feeder_combout ), + .cout()); +defparam \lcd_data_out_q[0]~feeder .lut_mask = 16'hFF00; +defparam \lcd_data_out_q[0]~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y20_N1 +dffeas \lcd_data_out_q[1] ( + .clk(!\MCU_LCD_WRX~inputclkctrl_outclk ), + .d(\lcd_data_out_q[1]~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_out_q[1]), + .prn(vcc)); +defparam \lcd_data_out_q[1] .is_wysiwyg = "true"; +defparam \lcd_data_out_q[1] .power_up = "low"; + +// Location: LCCOMB_X1_Y20_N0 +cycloneive_lcell_comb \lcd_data_out_q[1]~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[1]~input_o ), + .cin(gnd), + .combout(\lcd_data_out_q[1]~feeder_combout ), + .cout()); +defparam \lcd_data_out_q[1]~feeder .lut_mask = 16'hFF00; +defparam \lcd_data_out_q[1]~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y20_N11 +dffeas \lcd_data_out_q[2] ( + .clk(!\MCU_LCD_WRX~inputclkctrl_outclk ), + .d(\lcd_data_out_q[2]~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_out_q[2]), + .prn(vcc)); +defparam \lcd_data_out_q[2] .is_wysiwyg = "true"; +defparam \lcd_data_out_q[2] .power_up = "low"; + +// Location: LCCOMB_X1_Y20_N10 +cycloneive_lcell_comb \lcd_data_out_q[2]~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[2]~input_o ), + .cin(gnd), + .combout(\lcd_data_out_q[2]~feeder_combout ), + .cout()); +defparam \lcd_data_out_q[2]~feeder .lut_mask = 16'hFF00; +defparam \lcd_data_out_q[2]~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y26_N15 +dffeas \lcd_data_out_q[3] ( + .clk(!\MCU_LCD_WRX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\MCU_D[3]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_out_q[3]), + .prn(vcc)); +defparam \lcd_data_out_q[3] .is_wysiwyg = "true"; +defparam \lcd_data_out_q[3] .power_up = "low"; + +// Location: FF_X1_Y26_N13 +dffeas \lcd_data_out_q[4] ( + .clk(!\MCU_LCD_WRX~inputclkctrl_outclk ), + .d(\lcd_data_out_q[4]~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_out_q[4]), + .prn(vcc)); +defparam \lcd_data_out_q[4] .is_wysiwyg = "true"; +defparam \lcd_data_out_q[4] .power_up = "low"; + +// Location: LCCOMB_X1_Y26_N12 +cycloneive_lcell_comb \lcd_data_out_q[4]~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[4]~input_o ), + .cin(gnd), + .combout(\lcd_data_out_q[4]~feeder_combout ), + .cout()); +defparam \lcd_data_out_q[4]~feeder .lut_mask = 16'hFF00; +defparam \lcd_data_out_q[4]~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y26_N5 +dffeas \lcd_data_out_q[5] ( + .clk(!\MCU_LCD_WRX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\MCU_D[5]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_out_q[5]), + .prn(vcc)); +defparam \lcd_data_out_q[5] .is_wysiwyg = "true"; +defparam \lcd_data_out_q[5] .power_up = "low"; + +// Location: FF_X1_Y20_N13 +dffeas \lcd_data_out_q[6] ( + .clk(!\MCU_LCD_WRX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\MCU_D[6]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_out_q[6]), + .prn(vcc)); +defparam \lcd_data_out_q[6] .is_wysiwyg = "true"; +defparam \lcd_data_out_q[6] .power_up = "low"; + +// Location: FF_X1_Y20_N15 +dffeas \lcd_data_out_q[7] ( + .clk(!\MCU_LCD_WRX~inputclkctrl_outclk ), + .d(\lcd_data_out_q[7]~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(vcc), + .devclrn(devclrn), + .devpor(devpor), + .q(lcd_data_out_q[7]), + .prn(vcc)); +defparam \lcd_data_out_q[7] .is_wysiwyg = "true"; +defparam \lcd_data_out_q[7] .power_up = "low"; + +// Location: LCCOMB_X1_Y20_N14 +cycloneive_lcell_comb \lcd_data_out_q[7]~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[7]~input_o ), + .cin(gnd), + .combout(\lcd_data_out_q[7]~feeder_combout ), + .cout()); +defparam \lcd_data_out_q[7]~feeder .lut_mask = 16'hFF00; +defparam \lcd_data_out_q[7]~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y15_N3 +dffeas lcd_reset_q( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(\lcd_reset_q~1_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(\lcd_reset_q~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(\lcd_reset_q~q ), + .prn(vcc)); +defparam lcd_reset_q.is_wysiwyg = "true"; +defparam lcd_reset_q.power_up = "low"; + +// Location: LCCOMB_X1_Y15_N10 +cycloneive_lcell_comb \lcd_reset_q~0 ( + .dataa(gnd), + .datab(gnd), + .datac(\MCU_ADDR~input_o ), + .datad(\MCU_DIR~input_o ), + .cin(gnd), + .combout(\lcd_reset_q~0_combout ), + .cout()); +defparam \lcd_reset_q~0 .lut_mask = 16'h00F0; +defparam \lcd_reset_q~0 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y15_N2 +cycloneive_lcell_comb \lcd_reset_q~1 ( + .dataa(gnd), + .datab(gnd), + .datac(\MCU_D[0]~input_o ), + .datad(gnd), + .cin(gnd), + .combout(\lcd_reset_q~1_combout ), + .cout()); +defparam \lcd_reset_q~1 .lut_mask = 16'h0F0F; +defparam \lcd_reset_q~1 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y19_N30 +cycloneive_lcell_comb \mcu_data_out[0]~0 ( + .dataa(\LCD_DB[8]~input_o ), + .datab(gnd), + .datac(lcd_data_in_q[0]), + .datad(\MCU_LCD_RDX~input_o ), + .cin(gnd), + .combout(\mcu_data_out[0]~0_combout ), + .cout()); +defparam \mcu_data_out[0]~0 .lut_mask = 16'hF0AA; +defparam \mcu_data_out[0]~0 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y18_N30 +cycloneive_lcell_comb \mcu_data_out[0]~1 ( + .dataa(\SW_R~input_o ), + .datab(\MCU_IO_STBX~input_o ), + .datac(\mcu_data_out[0]~0_combout ), + .datad(\MCU_DIR~input_o ), + .cin(gnd), + .combout(\mcu_data_out[0]~1_combout ), + .cout()); +defparam \mcu_data_out[0]~1 .lut_mask = 16'hD1F0; +defparam \mcu_data_out[0]~1 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y21_N4 +cycloneive_lcell_comb \mcu_data_out[1]~2 ( + .dataa(\LCD_DB[9]~input_o ), + .datab(\MCU_LCD_RDX~input_o ), + .datac(lcd_data_in_q[1]), + .datad(gnd), + .cin(gnd), + .combout(\mcu_data_out[1]~2_combout ), + .cout()); +defparam \mcu_data_out[1]~2 .lut_mask = 16'hE2E2; +defparam \mcu_data_out[1]~2 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y18_N28 +cycloneive_lcell_comb \mcu_data_out[1]~3 ( + .dataa(\SW_L~input_o ), + .datab(\MCU_DIR~input_o ), + .datac(\MCU_IO_STBX~input_o ), + .datad(\mcu_data_out[1]~2_combout ), + .cin(gnd), + .combout(\mcu_data_out[1]~3_combout ), + .cout()); +defparam \mcu_data_out[1]~3 .lut_mask = 16'hF704; +defparam \mcu_data_out[1]~3 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y24_N30 +cycloneive_lcell_comb \mcu_data_out[2]~4 ( + .dataa(\LCD_DB[10]~input_o ), + .datab(gnd), + .datac(lcd_data_in_q[2]), + .datad(\MCU_LCD_RDX~input_o ), + .cin(gnd), + .combout(\mcu_data_out[2]~4_combout ), + .cout()); +defparam \mcu_data_out[2]~4 .lut_mask = 16'hF0AA; +defparam \mcu_data_out[2]~4 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y23_N16 +cycloneive_lcell_comb \mcu_data_out[2]~5 ( + .dataa(\SW_D~input_o ), + .datab(\MCU_IO_STBX~input_o ), + .datac(\mcu_data_out[2]~4_combout ), + .datad(\MCU_DIR~input_o ), + .cin(gnd), + .combout(\mcu_data_out[2]~5_combout ), + .cout()); +defparam \mcu_data_out[2]~5 .lut_mask = 16'hD1F0; +defparam \mcu_data_out[2]~5 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y26_N6 +cycloneive_lcell_comb \mcu_data_out[3]~6 ( + .dataa(\MCU_LCD_RDX~input_o ), + .datab(\LCD_DB[11]~input_o ), + .datac(lcd_data_in_q[3]), + .datad(gnd), + .cin(gnd), + .combout(\mcu_data_out[3]~6_combout ), + .cout()); +defparam \mcu_data_out[3]~6 .lut_mask = 16'hE4E4; +defparam \mcu_data_out[3]~6 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y23_N12 +cycloneive_lcell_comb \mcu_data_out[3]~7 ( + .dataa(\SW_U~input_o ), + .datab(\MCU_IO_STBX~input_o ), + .datac(\MCU_DIR~input_o ), + .datad(\mcu_data_out[3]~6_combout ), + .cin(gnd), + .combout(\mcu_data_out[3]~7_combout ), + .cout()); +defparam \mcu_data_out[3]~7 .lut_mask = 16'hDF10; +defparam \mcu_data_out[3]~7 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y26_N10 +cycloneive_lcell_comb \mcu_data_out[4]~8 ( + .dataa(\MCU_LCD_RDX~input_o ), + .datab(\LCD_DB[12]~input_o ), + .datac(lcd_data_in_q[4]), + .datad(gnd), + .cin(gnd), + .combout(\mcu_data_out[4]~8_combout ), + .cout()); +defparam \mcu_data_out[4]~8 .lut_mask = 16'hE4E4; +defparam \mcu_data_out[4]~8 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y23_N14 +cycloneive_lcell_comb \mcu_data_out[4]~9 ( + .dataa(\MCU_DIR~input_o ), + .datab(\SW_SEL~input_o ), + .datac(\MCU_IO_STBX~input_o ), + .datad(\mcu_data_out[4]~8_combout ), + .cin(gnd), + .combout(\mcu_data_out[4]~9_combout ), + .cout()); +defparam \mcu_data_out[4]~9 .lut_mask = 16'hF702; +defparam \mcu_data_out[4]~9 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y26_N8 +cycloneive_lcell_comb \mcu_data_out[5]~10 ( + .dataa(\MCU_LCD_RDX~input_o ), + .datab(gnd), + .datac(lcd_data_in_q[5]), + .datad(\LCD_DB[13]~input_o ), + .cin(gnd), + .combout(\mcu_data_out[5]~10_combout ), + .cout()); +defparam \mcu_data_out[5]~10 .lut_mask = 16'hF5A0; +defparam \mcu_data_out[5]~10 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y23_N30 +cycloneive_lcell_comb \mcu_data_out[5]~11 ( + .dataa(\MCU_DIR~input_o ), + .datab(\SW_ROT_A~input_o ), + .datac(\MCU_IO_STBX~input_o ), + .datad(\mcu_data_out[5]~10_combout ), + .cin(gnd), + .combout(\mcu_data_out[5]~11_combout ), + .cout()); +defparam \mcu_data_out[5]~11 .lut_mask = 16'hF702; +defparam \mcu_data_out[5]~11 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y19_N4 +cycloneive_lcell_comb \mcu_data_out[6]~12 ( + .dataa(\LCD_DB[14]~input_o ), + .datab(gnd), + .datac(lcd_data_in_q[6]), + .datad(\MCU_LCD_RDX~input_o ), + .cin(gnd), + .combout(\mcu_data_out[6]~12_combout ), + .cout()); +defparam \mcu_data_out[6]~12 .lut_mask = 16'hF0AA; +defparam \mcu_data_out[6]~12 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y18_N16 +cycloneive_lcell_comb \mcu_data_out[6]~13 ( + .dataa(\SW_ROT_B~input_o ), + .datab(\MCU_IO_STBX~input_o ), + .datac(\mcu_data_out[6]~12_combout ), + .datad(\MCU_DIR~input_o ), + .cin(gnd), + .combout(\mcu_data_out[6]~13_combout ), + .cout()); +defparam \mcu_data_out[6]~13 .lut_mask = 16'hD1F0; +defparam \mcu_data_out[6]~13 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y21_N28 +cycloneive_lcell_comb \mcu_data_out[7]~14 ( + .dataa(\LCD_DB[15]~input_o ), + .datab(\MCU_LCD_RDX~input_o ), + .datac(lcd_data_in_q[7]), + .datad(gnd), + .cin(gnd), + .combout(\mcu_data_out[7]~14_combout ), + .cout()); +defparam \mcu_data_out[7]~14 .lut_mask = 16'hE2E2; +defparam \mcu_data_out[7]~14 .sum_lutc_input = "datac"; + +// Location: LCCOMB_X1_Y18_N14 +cycloneive_lcell_comb \mcu_data_out[7]~15 ( + .dataa(\LCD_TE~input_o ), + .datab(\MCU_DIR~input_o ), + .datac(\MCU_IO_STBX~input_o ), + .datad(\mcu_data_out[7]~14_combout ), + .cin(gnd), + .combout(\mcu_data_out[7]~15_combout ), + .cout()); +defparam \mcu_data_out[7]~15 .lut_mask = 16'hFB08; +defparam \mcu_data_out[7]~15 .sum_lutc_input = "datac"; + +// Location: FF_X1_Y15_N31 +dffeas ref_en_q( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(\ref_en_q~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(\lcd_reset_q~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(\ref_en_q~q ), + .prn(vcc)); +defparam ref_en_q.is_wysiwyg = "true"; +defparam ref_en_q.power_up = "low"; + +// Location: LCCOMB_X1_Y15_N30 +cycloneive_lcell_comb \ref_en_q~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[6]~input_o ), + .cin(gnd), + .combout(\ref_en_q~feeder_combout ), + .cout()); +defparam \ref_en_q~feeder .lut_mask = 16'hFF00; +defparam \ref_en_q~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y15_N7 +dffeas sysoff_q( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(\sysoff_q~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(\lcd_reset_q~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(\sysoff_q~q ), + .prn(vcc)); +defparam sysoff_q.is_wysiwyg = "true"; +defparam sysoff_q.power_up = "low"; + +// Location: LCCOMB_X1_Y15_N6 +cycloneive_lcell_comb \sysoff_q~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[2]~input_o ), + .cin(gnd), + .combout(\sysoff_q~feeder_combout ), + .cout()); +defparam \sysoff_q~feeder .lut_mask = 16'hFF00; +defparam \sysoff_q~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y15_N19 +dffeas \tp_q[0] ( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\MCU_D[0]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(\tp_q[3]~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(tp_q[0]), + .prn(vcc)); +defparam \tp_q[0] .is_wysiwyg = "true"; +defparam \tp_q[0] .power_up = "low"; + +// Location: FF_X1_Y15_N21 +dffeas \tp_q[1] ( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\MCU_D[1]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(\tp_q[3]~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(tp_q[1]), + .prn(vcc)); +defparam \tp_q[1] .is_wysiwyg = "true"; +defparam \tp_q[1] .power_up = "low"; + +// Location: FF_X1_Y15_N27 +dffeas \tp_q[2] ( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(\tp_q[2]~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(\tp_q[3]~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(tp_q[2]), + .prn(vcc)); +defparam \tp_q[2] .is_wysiwyg = "true"; +defparam \tp_q[2] .power_up = "low"; + +// Location: LCCOMB_X1_Y15_N26 +cycloneive_lcell_comb \tp_q[2]~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[2]~input_o ), + .cin(gnd), + .combout(\tp_q[2]~feeder_combout ), + .cout()); +defparam \tp_q[2]~feeder .lut_mask = 16'hFF00; +defparam \tp_q[2]~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y15_N13 +dffeas \tp_q[3] ( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\MCU_D[3]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(\tp_q[3]~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(tp_q[3]), + .prn(vcc)); +defparam \tp_q[3] .is_wysiwyg = "true"; +defparam \tp_q[3] .power_up = "low"; + +// Location: LCCOMB_X1_Y15_N4 +cycloneive_lcell_comb \tp_q[3]~0 ( + .dataa(gnd), + .datab(gnd), + .datac(\MCU_ADDR~input_o ), + .datad(\MCU_DIR~input_o ), + .cin(gnd), + .combout(\tp_q[3]~0_combout ), + .cout()); +defparam \tp_q[3]~0 .lut_mask = 16'h000F; +defparam \tp_q[3]~0 .sum_lutc_input = "datac"; + +// Location: FF_X1_Y15_N15 +dffeas \tp_q[4] ( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(\tp_q[4]~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(\tp_q[3]~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(tp_q[4]), + .prn(vcc)); +defparam \tp_q[4] .is_wysiwyg = "true"; +defparam \tp_q[4] .power_up = "low"; + +// Location: LCCOMB_X1_Y15_N14 +cycloneive_lcell_comb \tp_q[4]~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[4]~input_o ), + .cin(gnd), + .combout(\tp_q[4]~feeder_combout ), + .cout()); +defparam \tp_q[4]~feeder .lut_mask = 16'hFF00; +defparam \tp_q[4]~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y15_N29 +dffeas \tp_q[5] ( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(gnd), + .asdata(\MCU_D[5]~input_o ), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(vcc), + .ena(\tp_q[3]~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(tp_q[5]), + .prn(vcc)); +defparam \tp_q[5] .is_wysiwyg = "true"; +defparam \tp_q[5] .power_up = "low"; + +// Location: FF_X1_Y15_N9 +dffeas \tp_q[6] ( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(\tp_q[6]~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(\tp_q[3]~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(tp_q[6]), + .prn(vcc)); +defparam \tp_q[6] .is_wysiwyg = "true"; +defparam \tp_q[6] .power_up = "low"; + +// Location: LCCOMB_X1_Y15_N8 +cycloneive_lcell_comb \tp_q[6]~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[6]~input_o ), + .cin(gnd), + .combout(\tp_q[6]~feeder_combout ), + .cout()); +defparam \tp_q[6]~feeder .lut_mask = 16'hFF00; +defparam \tp_q[6]~feeder .sum_lutc_input = "datac"; + +// Location: FF_X1_Y15_N25 +dffeas \tp_q[7] ( + .clk(\MCU_IO_STBX~inputclkctrl_outclk ), + .d(\tp_q[7]~feeder_combout ), + .asdata(vcc), + .clrn(vcc), + .aload(gnd), + .sclr(gnd), + .sload(gnd), + .ena(\tp_q[3]~0_combout ), + .devclrn(devclrn), + .devpor(devpor), + .q(tp_q[7]), + .prn(vcc)); +defparam \tp_q[7] .is_wysiwyg = "true"; +defparam \tp_q[7] .power_up = "low"; + +// Location: LCCOMB_X1_Y15_N24 +cycloneive_lcell_comb \tp_q[7]~feeder ( + .dataa(gnd), + .datab(gnd), + .datac(gnd), + .datad(\MCU_D[7]~input_o ), + .cin(gnd), + .combout(\tp_q[7]~feeder_combout ), + .cout()); +defparam \tp_q[7]~feeder .lut_mask = 16'hFF00; +defparam \tp_q[7]~feeder .sum_lutc_input = "datac"; + +endmodule diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/fmax.rpt b/hardware/portapack_h4m/CPLD/Supra/alta_db/fmax.rpt new file mode 100644 index 00000000..e69de29b diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/hold.rpt.gz b/hardware/portapack_h4m/CPLD/Supra/alta_db/hold.rpt.gz new file mode 100644 index 00000000..8c9a6c32 Binary files /dev/null and b/hardware/portapack_h4m/CPLD/Supra/alta_db/hold.rpt.gz differ diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/hold_summary.rpt.gz b/hardware/portapack_h4m/CPLD/Supra/alta_db/hold_summary.rpt.gz new file mode 100644 index 00000000..22ccfac1 Binary files /dev/null and b/hardware/portapack_h4m/CPLD/Supra/alta_db/hold_summary.rpt.gz differ diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/io.asf b/hardware/portapack_h4m/CPLD/Supra/alta_db/io.asf new file mode 100644 index 00000000..c3c3ca05 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/alta_db/io.asf @@ -0,0 +1,112 @@ +set_location_assignment -to MCU_D[7] PIN_26 +set_location_assignment -to MCU_D[6] PIN_27 +set_location_assignment -to MCU_D[5] PIN_29 +set_location_assignment -to MCU_D[4] PIN_28 +set_location_assignment -to MCU_D[3] PIN_30 +set_location_assignment -to MCU_D[2] PIN_33 +set_location_assignment -to MCU_D[1] PIN_36 +set_location_assignment -to MCU_D[0] PIN_35 +set_location_assignment -to MCU_DIR PIN_72 +set_location_assignment -to MCU_IO_STBX PIN_41 +set_location_assignment -to MCU_LCD_WRX PIN_71 +set_location_assignment -to MCU_ADDR PIN_42 +set_location_assignment -to MCU_LCD_TE PIN_40 +set_location_assignment -to MCU_P2_8 PIN_43 +set_location_assignment -to MCU_LCD_RDX PIN_39 +set_location_assignment -to TP_U PIN_8 +set_location_assignment -to TP_D PIN_6 +set_location_assignment -to TP_L PIN_7 +set_location_assignment -to TP_R PIN_5 +set_location_assignment -to SW_SEL PIN_17 +set_location_assignment -to SW_ROT_A PIN_15 +set_location_assignment -to SW_ROT_B PIN_16 +set_location_assignment -to SW_U PIN_34 +set_location_assignment -to SW_D PIN_14 +set_location_assignment -to SW_L PIN_37 +set_location_assignment -to SW_R PIN_12 +set_location_assignment -to LCD_RESETX PIN_100 +set_location_assignment -to LCD_RS PIN_3 +set_location_assignment -to LCD_WRX PIN_2 +set_location_assignment -to LCD_RDX PIN_1 +set_location_assignment -to LCD_DB[15] PIN_82 +set_location_assignment -to LCD_DB[14] PIN_83 +set_location_assignment -to LCD_DB[13] PIN_84 +set_location_assignment -to LCD_DB[12] PIN_85 +set_location_assignment -to LCD_DB[11] PIN_86 +set_location_assignment -to LCD_DB[10] PIN_87 +set_location_assignment -to LCD_DB[9] PIN_88 +set_location_assignment -to LCD_DB[8] PIN_89 +set_location_assignment -to LCD_DB[7] PIN_90 +set_location_assignment -to LCD_DB[6] PIN_91 +set_location_assignment -to LCD_DB[5] PIN_92 +set_location_assignment -to LCD_DB[4] PIN_95 +set_location_assignment -to LCD_DB[3] PIN_96 +set_location_assignment -to LCD_DB[2] PIN_97 +set_location_assignment -to LCD_DB[1] PIN_98 +set_location_assignment -to LCD_DB[0] PIN_99 +set_location_assignment -to LCD_TE PIN_4 +set_location_assignment -to LCD_BACKLIGHT PIN_76 +set_location_assignment -to SYSOFF PIN_47 +set_location_assignment -to AUDIO_RESETX PIN_57 +set_location_assignment -to REF_EN PIN_58 +set_location_assignment -to GPS_RESETX PIN_73 +set_location_assignment -to GPS_TX_READY PIN_75 +set_location_assignment -to GPS_TIMEPULSE PIN_74 +set_location_assignment -to DEVICE_RESET PIN_44 +set_location_assignment -to DEVICE_RESET_V PIN_38 +set_instance_assignment -name IO_STANDARD -to MCU_D[7] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_D[6] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_D[5] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_D[4] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_D[3] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_D[2] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_D[1] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_D[0] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_DIR "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_IO_STBX "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_LCD_WRX "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_ADDR "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_LCD_TE "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_P2_8 "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to MCU_LCD_RDX "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to TP_U "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to TP_D "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to TP_L "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to TP_R "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to SW_SEL "3.3V Schmitt Trigger Input" +set_instance_assignment -name IO_STANDARD -to SW_ROT_A "3.3V Schmitt Trigger Input" +set_instance_assignment -name IO_STANDARD -to SW_ROT_B "3.3V Schmitt Trigger Input" +set_instance_assignment -name IO_STANDARD -to SW_U "3.3V Schmitt Trigger Input" +set_instance_assignment -name IO_STANDARD -to SW_D "3.3V Schmitt Trigger Input" +set_instance_assignment -name IO_STANDARD -to SW_L "3.3V Schmitt Trigger Input" +set_instance_assignment -name IO_STANDARD -to SW_R "3.3V Schmitt Trigger Input" +set_instance_assignment -name IO_STANDARD -to LCD_RESETX "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_RS "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_WRX "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_RDX "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[15] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[14] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[13] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[12] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[11] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[10] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[9] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[8] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[7] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[6] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[5] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[4] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[3] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[2] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[1] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_DB[0] "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_TE "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to LCD_BACKLIGHT "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to SYSOFF "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to AUDIO_RESETX "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to REF_EN "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to GPS_RESETX "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to GPS_TX_READY "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to GPS_TIMEPULSE "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to DEVICE_RESET "3.3-V LVCMOS" +set_instance_assignment -name IO_STANDARD -to DEVICE_RESET_V "3.3-V LVCMOS" diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/packed.vx b/hardware/portapack_h4m/CPLD/Supra/alta_db/packed.vx new file mode 100644 index 00000000..4347c04f --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/alta_db/packed.vx @@ -0,0 +1,2565 @@ +`timescale 1 ps/ 1 ps + +module top( + MCU_D, + MCU_DIR, + MCU_IO_STBX, + MCU_LCD_WRX, + MCU_ADDR, + MCU_LCD_TE, + MCU_P2_8, + MCU_LCD_RDX, + TP_U, + TP_D, + TP_L, + TP_R, + SW_SEL, + SW_ROT_A, + SW_ROT_B, + SW_U, + SW_D, + SW_L, + SW_R, + LCD_RESETX, + LCD_RS, + LCD_WRX, + LCD_RDX, + LCD_DB, + LCD_TE, + LCD_BACKLIGHT, + SYSOFF, + AUDIO_RESETX, + REF_EN, + GPS_RESETX, + GPS_TX_READY, + GPS_TIMEPULSE, + DEVICE_RESET, + DEVICE_RESET_V); +output [7:0] MCU_D; +input MCU_DIR; +input MCU_IO_STBX; +input MCU_LCD_WRX; +input MCU_ADDR; +output MCU_LCD_TE; +input MCU_P2_8; +input MCU_LCD_RDX; +output TP_U; +output TP_D; +output TP_L; +output TP_R; +input SW_SEL; +input SW_ROT_A; +input SW_ROT_B; +input SW_U; +input SW_D; +input SW_L; +input SW_R; +output LCD_RESETX; +output LCD_RS; +output LCD_WRX; +output LCD_RDX; +output [15:0] LCD_DB; +input LCD_TE; +output LCD_BACKLIGHT; +output SYSOFF; +output AUDIO_RESETX; +output REF_EN; +output GPS_RESETX; +input GPS_TX_READY; +input GPS_TIMEPULSE; +input DEVICE_RESET; +input DEVICE_RESET_V; + +// module hard_block +// Design Ports Information +// ~ALTERA_ASDO_DATA1~ => Location: PIN_F4, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_FLASH_nCE_nCSO~ => Location: PIN_E2, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_DCLK~ => Location: PIN_P3, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_DATA0~ => Location: PIN_N7, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// ~ALTERA_nCEO~ => Location: PIN_P28, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA + +// module top +// Design Ports Information +// MCU_LCD_TE => Location: PIN_AC4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_P2_8 => Location: PIN_D6, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// TP_U => Location: PIN_AA4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// TP_D => Location: PIN_AB3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// TP_L => Location: PIN_AA3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// TP_R => Location: PIN_AD1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_RESETX => Location: PIN_AB4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_RS => Location: PIN_AF2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_WRX => Location: PIN_M1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_RDX => Location: PIN_R6, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_BACKLIGHT => Location: PIN_W3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// SYSOFF => Location: PIN_AE2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// AUDIO_RESETX => Location: PIN_AE1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// REF_EN => Location: PIN_AC5, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// GPS_RESETX => Location: PIN_AC26, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// GPS_TX_READY => Location: PIN_D9, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// GPS_TIMEPULSE => Location: PIN_E25, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// DEVICE_RESET => Location: PIN_AF15, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// DEVICE_RESET_V => Location: PIN_AE25, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_D[0] => Location: PIN_AC1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[1] => Location: PIN_AC3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[2] => Location: PIN_AD3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[3] => Location: PIN_V3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[4] => Location: PIN_V2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[5] => Location: PIN_V1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[6] => Location: PIN_Y3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// MCU_D[7] => Location: PIN_AC2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[0] => Location: PIN_U5, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[1] => Location: PIN_AB1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[2] => Location: PIN_U2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[3] => Location: PIN_T3, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[4] => Location: PIN_R5, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[5] => Location: PIN_T4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[6] => Location: PIN_Y4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[7] => Location: PIN_AB2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[8] => Location: PIN_U6, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[9] => Location: PIN_U1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[10] => Location: PIN_V4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[11] => Location: PIN_R2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[12] => Location: PIN_R1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[13] => Location: PIN_R4, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[14] => Location: PIN_W2, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_DB[15] => Location: PIN_W1, I/O Standard: 3.3-V LVTTL, Current Strength: 8mA +// LCD_TE => Location: PIN_AB6, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_ADDR => Location: PIN_AB5, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_LCD_WRX => Location: PIN_Y1, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_LCD_RDX => Location: PIN_Y2, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_IO_STBX => Location: PIN_J1, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// MCU_DIR => Location: PIN_AD2, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_R => Location: PIN_U8, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_L => Location: PIN_U7, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_D => Location: PIN_T7, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_U => Location: PIN_R3, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_SEL => Location: PIN_U3, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_ROT_A => Location: PIN_U4, I/O Standard: 3.3-V LVTTL, Current Strength: Default +// SW_ROT_B => Location: PIN_T8, I/O Standard: 3.3-V LVTTL, Current Strength: Default + +//wire gnd; +//wire gnd; +//wire vcc; +//wire vcc; +//wire \AUDIO_RESETX~output_o ; +wire \DEVICE_RESET_V~input_o ; +wire \DEVICE_RESET~input_o ; +//wire \GPS_RESETX~output_o ; +wire \GPS_TIMEPULSE~input_o ; +wire \GPS_TX_READY~input_o ; +//wire \LCD_BACKLIGHT~output_o ; +//wire \LCD_DB[0]~output_o ; +wire \LCD_DB[0]~input_o ; +//wire \LCD_DB[10]~output_o ; +wire \LCD_DB[10]~input_o ; +//wire \LCD_DB[11]~output_o ; +wire \LCD_DB[11]~input_o ; +//wire \LCD_DB[12]~output_o ; +wire \LCD_DB[12]~input_o ; +//wire \LCD_DB[13]~output_o ; +wire \LCD_DB[13]~input_o ; +//wire \LCD_DB[14]~output_o ; +wire \LCD_DB[14]~input_o ; +//wire \LCD_DB[15]~output_o ; +wire \LCD_DB[15]~input_o ; +//wire \LCD_DB[1]~output_o ; +wire \LCD_DB[1]~input_o ; +//wire \LCD_DB[2]~output_o ; +wire \LCD_DB[2]~input_o ; +//wire \LCD_DB[3]~output_o ; +wire \LCD_DB[3]~input_o ; +//wire \LCD_DB[4]~output_o ; +wire \LCD_DB[4]~input_o ; +//wire \LCD_DB[5]~output_o ; +wire \LCD_DB[5]~input_o ; +//wire \LCD_DB[6]~output_o ; +wire \LCD_DB[6]~input_o ; +//wire \LCD_DB[7]~output_o ; +wire \LCD_DB[7]~input_o ; +//wire \LCD_DB[8]~output_o ; +wire \LCD_DB[8]~input_o ; +//wire \LCD_DB[9]~output_o ; +wire \LCD_DB[9]~input_o ; +//wire \LCD_RDX~output_o ; +//wire \LCD_RESETX~output_o ; +//wire \LCD_RS~output_o ; +wire \LCD_TE~input_o ; +//wire \LCD_WRX~output_o ; +wire \MCU_ADDR~input_o ; +wire \MCU_DIR~input_o ; +//wire \MCU_D[0]~output_o ; +wire \MCU_D[0]~input_o ; +//wire \MCU_D[1]~output_o ; +wire \MCU_D[1]~input_o ; +//wire \MCU_D[2]~output_o ; +wire \MCU_D[2]~input_o ; +//wire \MCU_D[3]~output_o ; +wire \MCU_D[3]~input_o ; +//wire \MCU_D[4]~output_o ; +wire \MCU_D[4]~input_o ; +//wire \MCU_D[5]~output_o ; +wire \MCU_D[5]~input_o ; +//wire \MCU_D[6]~output_o ; +wire \MCU_D[6]~input_o ; +//wire \MCU_D[7]~output_o ; +wire \MCU_D[7]~input_o ; +wire \MCU_IO_STBX~input_o ; +wire \MCU_IO_STBX~inputclkctrl_outclk ; +wire \MCU_LCD_RDX~input_o ; +wire \MCU_LCD_RDX~inputclkctrl_outclk ; +//wire \MCU_LCD_TE~output_o ; +wire \MCU_LCD_WRX~input_o ; +wire \MCU_LCD_WRX~inputclkctrl_outclk ; +wire \MCU_P2_8~input_o ; +//wire \REF_EN~output_o ; +wire \SW_D~input_o ; +wire \SW_L~input_o ; +wire \SW_ROT_A~input_o ; +wire \SW_ROT_B~input_o ; +wire \SW_R~input_o ; +wire \SW_SEL~input_o ; +wire \SW_U~input_o ; +//wire \SYSOFF~output_o ; +//wire \TP_D~output_o ; +//wire \TP_L~output_o ; +//wire \TP_R~output_o ; +//wire \TP_U~output_o ; +wire \audio_reset_q~0_combout ; +wire \audio_reset_q~q ; +//wire devclrn; +tri1 devclrn; +//wire devoe; +tri1 devoe; +//wire devpor; +tri1 devpor; +wire \lcd_backlight_q~feeder_combout ; +wire \lcd_backlight_q~q ; +wire [7:0] lcd_data_in_q; +//wire lcd_data_in_q[0]; +//wire lcd_data_in_q[1]; +//wire lcd_data_in_q[2]; +//wire lcd_data_in_q[3]; +//wire lcd_data_in_q[4]; +//wire lcd_data_in_q[5]; +//wire lcd_data_in_q[6]; +//wire lcd_data_in_q[7]; +wire [7:0] lcd_data_out_q; +//wire lcd_data_out_q[0]; +wire \lcd_data_out_q[0]~feeder_combout ; +//wire lcd_data_out_q[1]; +wire \lcd_data_out_q[1]~feeder_combout ; +//wire lcd_data_out_q[2]; +wire \lcd_data_out_q[2]~feeder_combout ; +//wire lcd_data_out_q[3]; +//wire lcd_data_out_q[4]; +wire \lcd_data_out_q[4]~feeder_combout ; +//wire lcd_data_out_q[5]; +//wire lcd_data_out_q[6]; +//wire lcd_data_out_q[7]; +wire \lcd_data_out_q[7]~feeder_combout ; +wire \lcd_reset_q~0_combout ; +wire \lcd_reset_q~1_combout ; +wire \lcd_reset_q~q ; +wire \mcu_data_out[0]~0_combout ; +wire \mcu_data_out[0]~1_combout ; +wire \mcu_data_out[1]~2_combout ; +wire \mcu_data_out[1]~3_combout ; +wire \mcu_data_out[2]~4_combout ; +wire \mcu_data_out[2]~5_combout ; +wire \mcu_data_out[3]~6_combout ; +wire \mcu_data_out[3]~7_combout ; +wire \mcu_data_out[4]~8_combout ; +wire \mcu_data_out[4]~9_combout ; +wire \mcu_data_out[5]~10_combout ; +wire \mcu_data_out[5]~11_combout ; +wire \mcu_data_out[6]~12_combout ; +wire \mcu_data_out[6]~13_combout ; +wire \mcu_data_out[7]~14_combout ; +wire \mcu_data_out[7]~15_combout ; +wire \ref_en_q~feeder_combout ; +wire \ref_en_q~q ; +wire \sysoff_q~feeder_combout ; +wire \sysoff_q~q ; +wire [7:0] tp_q; +//wire tp_q[0]; +//wire tp_q[1]; +//wire tp_q[2]; +wire \tp_q[2]~feeder_combout ; +//wire tp_q[3]; +wire \tp_q[3]~0_combout ; +//wire tp_q[4]; +wire \tp_q[4]~feeder_combout ; +//wire tp_q[5]; +//wire tp_q[6]; +wire \tp_q[6]~feeder_combout ; +//wire tp_q[7]; +wire \tp_q[7]~feeder_combout ; +wire unknown; +wire unknown; +wire \~ALTERA_ASDO_DATA1~~ibuf_o ; +wire \~ALTERA_ASDO_DATA1~~padout ; +wire \~ALTERA_DATA0~~ibuf_o ; +wire \~ALTERA_DATA0~~padout ; +wire \~ALTERA_FLASH_nCE_nCSO~~ibuf_o ; +wire \~ALTERA_FLASH_nCE_nCSO~~padout ; + +wire vcc; +wire gnd; +assign vcc = 1'b1; +assign gnd = 1'b0; + +// Location: IOIBUF_X0_Y10_N0 +// alta_io_ibuf \SW_L~input ( +alta_io \SW_L~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_L~input_o ), + .regout(), + .padio(SW_L)); +defparam \SW_L~input .CFG_KEEP = 2'b00; +// defparam \SW_L~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y10_N1 +// alta_io_ibuf \SW_R~input ( +alta_io \SW_R~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_R~input_o ), + .regout(), + .padio(SW_R)); +defparam \SW_R~input .CFG_KEEP = 2'b00; +// defparam \SW_R~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y11_N0 +// alta_io_obuf \TP_U~output ( +alta_io \TP_U~output ( + .datain(tp_q[3]), + .oe(tp_q[7]), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(TP_U)); +defparam \TP_U~output .CFG_KEEP = 2'b00; +// defparam \TP_U~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y11_N1 +// alta_io_obuf \TP_L~output ( +alta_io \TP_L~output ( + .datain(tp_q[1]), + .oe(tp_q[5]), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(TP_L)); +defparam \TP_L~output .CFG_KEEP = 2'b00; +// defparam \TP_L~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y14_N1 +// alta_io_ibuf \SW_ROT_B~input ( +alta_io \SW_ROT_B~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_ROT_B~input_o ), + .regout(), + .padio(SW_ROT_B)); +defparam \SW_ROT_B~input .CFG_KEEP = 2'b00; +// defparam \SW_ROT_B~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y15_N2 +// alta_io_obuf \TP_R~output ( +alta_io \TP_R~output ( + .datain(tp_q[0]), + .oe(tp_q[4]), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(TP_R)); +defparam \TP_R~output .CFG_KEEP = 2'b00; +// defparam \TP_R~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y15_N3 +// alta_io_obuf \TP_D~output ( +alta_io \TP_D~output ( + .datain(tp_q[2]), + .oe(tp_q[6]), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(TP_D)); +defparam \TP_D~output .CFG_KEEP = 2'b00; +// defparam \TP_D~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y16_N1 +// alta_io_ibuf \MCU_D[1]~input ( +// Location: IOOBUF_X0_Y16_N1 +// alta_io_obuf \MCU_D[1]~output ( +alta_io \MCU_D[1]~output ( + .datain(\mcu_data_out[1]~3_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[1]~input_o ), + .regout(), + .padio(MCU_D[1])); +defparam \MCU_D[1]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[1]~input .simulate_z_as = "z"; +// defparam \MCU_D[1]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y16_N2 +// alta_io_ibuf \MCU_D[2]~input ( +// Location: IOOBUF_X0_Y16_N2 +// alta_io_obuf \MCU_D[2]~output ( +alta_io \MCU_D[2]~output ( + .datain(\mcu_data_out[2]~5_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[2]~input_o ), + .regout(), + .padio(MCU_D[2])); +defparam \MCU_D[2]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[2]~input .simulate_z_as = "z"; +// defparam \MCU_D[2]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y16_N3 +// alta_io_ibuf \MCU_DIR~input ( +alta_io \MCU_DIR~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_DIR~input_o ), + .regout(), + .padio(MCU_DIR)); +defparam \MCU_DIR~input .CFG_KEEP = 2'b00; +// defparam \MCU_DIR~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y17_N1 +// alta_io_ibuf \MCU_D[0]~input ( +// Location: IOOBUF_X0_Y17_N1 +// alta_io_obuf \MCU_D[0]~output ( +alta_io \MCU_D[0]~output ( + .datain(\mcu_data_out[0]~1_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[0]~input_o ), + .regout(), + .padio(MCU_D[0])); +defparam \MCU_D[0]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[0]~input .simulate_z_as = "z"; +// defparam \MCU_D[0]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y18_N2 +// alta_io_ibuf \MCU_D[6]~input ( +// Location: IOOBUF_X0_Y18_N2 +// alta_io_obuf \MCU_D[6]~output ( +alta_io \MCU_D[6]~output ( + .datain(\mcu_data_out[6]~13_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[6]~input_o ), + .regout(), + .padio(MCU_D[6])); +defparam \MCU_D[6]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[6]~input .simulate_z_as = "z"; +// defparam \MCU_D[6]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y18_N3 +// alta_io_ibuf \MCU_D[7]~input ( +// Location: IOOBUF_X0_Y18_N3 +// alta_io_obuf \MCU_D[7]~output ( +alta_io \MCU_D[7]~output ( + .datain(\mcu_data_out[7]~15_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[7]~input_o ), + .regout(), + .padio(MCU_D[7])); +defparam \MCU_D[7]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[7]~input .simulate_z_as = "z"; +// defparam \MCU_D[7]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y19_N0 +// alta_io_ibuf \LCD_DB[8]~input ( +// Location: IOOBUF_X0_Y19_N0 +// alta_io_obuf \LCD_DB[8]~output ( +alta_io \LCD_DB[8]~output ( + .datain(lcd_data_out_q[0]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[8]~input_o ), + .regout(), + .padio(LCD_DB[8])); +defparam \LCD_DB[8]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[8]~input .simulate_z_as = "z"; +// defparam \LCD_DB[8]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y19_N2 +// alta_io_ibuf \LCD_DB[0]~input ( +// Location: IOOBUF_X0_Y19_N2 +// alta_io_obuf \LCD_DB[0]~output ( +alta_io \LCD_DB[0]~output ( + .datain(\MCU_D[0]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[0]~input_o ), + .regout(), + .padio(LCD_DB[0])); +defparam \LCD_DB[0]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[0]~input .simulate_z_as = "z"; +// defparam \LCD_DB[0]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y19_N3 +// alta_io_ibuf \LCD_DB[6]~input ( +// Location: IOOBUF_X0_Y19_N3 +// alta_io_obuf \LCD_DB[6]~output ( +alta_io \LCD_DB[6]~output ( + .datain(\MCU_D[6]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[6]~input_o ), + .regout(), + .padio(LCD_DB[6])); +defparam \LCD_DB[6]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[6]~input .simulate_z_as = "z"; +// defparam \LCD_DB[6]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y20_N0 +// alta_io_ibuf \LCD_DB[14]~input ( +// Location: IOOBUF_X0_Y20_N0 +// alta_io_obuf \LCD_DB[14]~output ( +alta_io \LCD_DB[14]~output ( + .datain(lcd_data_out_q[6]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[14]~input_o ), + .regout(), + .padio(LCD_DB[14])); +defparam \LCD_DB[14]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[14]~input .simulate_z_as = "z"; +// defparam \LCD_DB[14]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y20_N1 +// alta_io_ibuf \LCD_DB[15]~input ( +// Location: IOOBUF_X0_Y20_N1 +// alta_io_obuf \LCD_DB[15]~output ( +alta_io \LCD_DB[15]~output ( + .datain(lcd_data_out_q[7]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[15]~input_o ), + .regout(), + .padio(LCD_DB[15])); +defparam \LCD_DB[15]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[15]~input .simulate_z_as = "z"; +// defparam \LCD_DB[15]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y21_N0 +// alta_io_ibuf \LCD_DB[7]~input ( +// Location: IOOBUF_X0_Y21_N0 +// alta_io_obuf \LCD_DB[7]~output ( +alta_io \LCD_DB[7]~output ( + .datain(\MCU_D[7]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[7]~input_o ), + .regout(), + .padio(LCD_DB[7])); +defparam \LCD_DB[7]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[7]~input .simulate_z_as = "z"; +// defparam \LCD_DB[7]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y21_N1 +// alta_io_ibuf \LCD_DB[1]~input ( +// Location: IOOBUF_X0_Y21_N1 +// alta_io_obuf \LCD_DB[1]~output ( +alta_io \LCD_DB[1]~output ( + .datain(\MCU_D[1]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[1]~input_o ), + .regout(), + .padio(LCD_DB[1])); +defparam \LCD_DB[1]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[1]~input .simulate_z_as = "z"; +// defparam \LCD_DB[1]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y22_N1 +// alta_io_ibuf \MCU_D[5]~input ( +// Location: IOOBUF_X0_Y22_N1 +// alta_io_obuf \MCU_D[5]~output ( +alta_io \MCU_D[5]~output ( + .datain(\mcu_data_out[5]~11_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[5]~input_o ), + .regout(), + .padio(MCU_D[5])); +defparam \MCU_D[5]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[5]~input .simulate_z_as = "z"; +// defparam \MCU_D[5]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y23_N0 +// alta_io_ibuf \MCU_D[3]~input ( +// Location: IOOBUF_X0_Y23_N0 +// alta_io_obuf \MCU_D[3]~output ( +alta_io \MCU_D[3]~output ( + .datain(\mcu_data_out[3]~7_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[3]~input_o ), + .regout(), + .padio(MCU_D[3])); +defparam \MCU_D[3]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[3]~input .simulate_z_as = "z"; +// defparam \MCU_D[3]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y23_N1 +// alta_io_ibuf \MCU_D[4]~input ( +// Location: IOOBUF_X0_Y23_N1 +// alta_io_obuf \MCU_D[4]~output ( +alta_io \MCU_D[4]~output ( + .datain(\mcu_data_out[4]~9_combout ), + .oe(\MCU_DIR~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_D[4]~input_o ), + .regout(), + .padio(MCU_D[4])); +defparam \MCU_D[4]~output .CFG_KEEP = 2'b00; +// defparam \MCU_D[4]~input .simulate_z_as = "z"; +// defparam \MCU_D[4]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y24_N0 +// alta_io_ibuf \LCD_DB[2]~input ( +// Location: IOOBUF_X0_Y24_N0 +// alta_io_obuf \LCD_DB[2]~output ( +alta_io \LCD_DB[2]~output ( + .datain(\MCU_D[2]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[2]~input_o ), + .regout(), + .padio(LCD_DB[2])); +defparam \LCD_DB[2]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[2]~input .simulate_z_as = "z"; +// defparam \LCD_DB[2]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y24_N1 +// alta_io_ibuf \LCD_DB[9]~input ( +// Location: IOOBUF_X0_Y24_N1 +// alta_io_obuf \LCD_DB[9]~output ( +alta_io \LCD_DB[9]~output ( + .datain(lcd_data_out_q[1]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[9]~input_o ), + .regout(), + .padio(LCD_DB[9])); +defparam \LCD_DB[9]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[9]~input .simulate_z_as = "z"; +// defparam \LCD_DB[9]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y24_N3 +// alta_io_ibuf \LCD_DB[10]~input ( +// Location: IOOBUF_X0_Y24_N3 +// alta_io_obuf \LCD_DB[10]~output ( +alta_io \LCD_DB[10]~output ( + .datain(lcd_data_out_q[2]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[10]~input_o ), + .regout(), + .padio(LCD_DB[10])); +defparam \LCD_DB[10]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[10]~input .simulate_z_as = "z"; +// defparam \LCD_DB[10]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y25_N2 +// alta_io_ibuf \SW_D~input ( +alta_io \SW_D~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_D~input_o ), + .regout(), + .padio(SW_D)); +defparam \SW_D~input .CFG_KEEP = 2'b00; +// defparam \SW_D~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y26_N0 +// alta_io_ibuf \LCD_DB[13]~input ( +// Location: IOOBUF_X0_Y26_N0 +// alta_io_obuf \LCD_DB[13]~output ( +alta_io \LCD_DB[13]~output ( + .datain(lcd_data_out_q[5]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[13]~input_o ), + .regout(), + .padio(LCD_DB[13])); +defparam \LCD_DB[13]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[13]~input .simulate_z_as = "z"; +// defparam \LCD_DB[13]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y26_N1 +// alta_io_ibuf \LCD_DB[5]~input ( +// Location: IOOBUF_X0_Y26_N1 +// alta_io_obuf \LCD_DB[5]~output ( +alta_io \LCD_DB[5]~output ( + .datain(\MCU_D[5]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[5]~input_o ), + .regout(), + .padio(LCD_DB[5])); +defparam \LCD_DB[5]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[5]~input .simulate_z_as = "z"; +// defparam \LCD_DB[5]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y26_N2 +// alta_io_ibuf \LCD_DB[3]~input ( +// Location: IOOBUF_X0_Y26_N2 +// alta_io_obuf \LCD_DB[3]~output ( +alta_io \LCD_DB[3]~output ( + .datain(\MCU_D[3]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[3]~input_o ), + .regout(), + .padio(LCD_DB[3])); +defparam \LCD_DB[3]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[3]~input .simulate_z_as = "z"; +// defparam \LCD_DB[3]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y26_N3 +// alta_io_ibuf \LCD_DB[4]~input ( +// Location: IOOBUF_X0_Y26_N3 +// alta_io_obuf \LCD_DB[4]~output ( +alta_io \LCD_DB[4]~output ( + .datain(\MCU_D[4]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[4]~input_o ), + .regout(), + .padio(LCD_DB[4])); +defparam \LCD_DB[4]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[4]~input .simulate_z_as = "z"; +// defparam \LCD_DB[4]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y28_N1 +// alta_io_ibuf \SW_ROT_A~input ( +alta_io \SW_ROT_A~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_ROT_A~input_o ), + .regout(), + .padio(SW_ROT_A)); +defparam \SW_ROT_A~input .CFG_KEEP = 2'b00; +// defparam \SW_ROT_A~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y28_N2 +// alta_io_ibuf \SW_U~input ( +alta_io \SW_U~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_U~input_o ), + .regout(), + .padio(SW_U)); +defparam \SW_U~input .CFG_KEEP = 2'b00; +// defparam \SW_U~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y29_N0 +// alta_io_ibuf \LCD_DB[11]~input ( +// Location: IOOBUF_X0_Y29_N0 +// alta_io_obuf \LCD_DB[11]~output ( +alta_io \LCD_DB[11]~output ( + .datain(lcd_data_out_q[3]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[11]~input_o ), + .regout(), + .padio(LCD_DB[11])); +defparam \LCD_DB[11]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[11]~input .simulate_z_as = "z"; +// defparam \LCD_DB[11]~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y29_N1 +// alta_io_ibuf \LCD_DB[12]~input ( +// Location: IOOBUF_X0_Y29_N1 +// alta_io_obuf \LCD_DB[12]~output ( +alta_io \LCD_DB[12]~output ( + .datain(lcd_data_out_q[4]), + .oe(\MCU_LCD_RDX~input_o ), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_DB[12]~input_o ), + .regout(), + .padio(LCD_DB[12])); +defparam \LCD_DB[12]~output .CFG_KEEP = 2'b00; +// defparam \LCD_DB[12]~input .simulate_z_as = "z"; +// defparam \LCD_DB[12]~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y29_N2 +// alta_io_obuf \LCD_RDX~output ( +alta_io \LCD_RDX~output ( + .datain(\MCU_LCD_RDX~input_o ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(LCD_RDX)); +defparam \LCD_RDX~output .CFG_KEEP = 2'b00; +// defparam \LCD_RDX~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y29_N3 +// alta_io_ibuf \SW_SEL~input ( +alta_io \SW_SEL~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\SW_SEL~input_o ), + .regout(), + .padio(SW_SEL)); +defparam \SW_SEL~input .CFG_KEEP = 2'b00; +// defparam \SW_SEL~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y30_N1 +// alta_io_ibuf \MCU_IO_STBX~input ( +alta_io \MCU_IO_STBX~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_IO_STBX~input_o ), + .regout(), + .padio(MCU_IO_STBX)); +defparam \MCU_IO_STBX~input .CFG_KEEP = 2'b00; +// defparam \MCU_IO_STBX~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y30_N2 +// alta_io_ibuf \MCU_LCD_RDX~input ( +alta_io \MCU_LCD_RDX~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_LCD_RDX~input_o ), + .regout(), + .padio(MCU_LCD_RDX)); +defparam \MCU_LCD_RDX~input .CFG_KEEP = 2'b00; +// defparam \MCU_LCD_RDX~input .simulate_z_as = "z"; + +// Location: IOIBUF_X0_Y30_N3 +// alta_io_ibuf \MCU_LCD_WRX~input ( +alta_io \MCU_LCD_WRX~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_LCD_WRX~input_o ), + .regout(), + .padio(MCU_LCD_WRX)); +defparam \MCU_LCD_WRX~input .CFG_KEEP = 2'b00; +// defparam \MCU_LCD_WRX~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y37_N0 +// alta_io_obuf \LCD_WRX~output ( +alta_io \LCD_WRX~output ( + .datain(\MCU_LCD_WRX~input_o ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(LCD_WRX)); +defparam \LCD_WRX~output .CFG_KEEP = 2'b00; +// defparam \LCD_WRX~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y4_N2 +// alta_io_obuf \LCD_RS~output ( +alta_io \LCD_RS~output ( + .datain(\MCU_ADDR~input_o ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(LCD_RS)); +defparam \LCD_RS~output .CFG_KEEP = 2'b00; +// defparam \LCD_RS~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y4_N3 +// alta_io_ibuf \MCU_ADDR~input ( +alta_io \MCU_ADDR~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_ADDR~input_o ), + .regout(), + .padio(MCU_ADDR)); +defparam \MCU_ADDR~input .CFG_KEEP = 2'b00; +// defparam \MCU_ADDR~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y6_N2 +// alta_io_obuf \MCU_LCD_TE~output ( +alta_io \MCU_LCD_TE~output ( + .datain(\LCD_TE~input_o ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(MCU_LCD_TE)); +defparam \MCU_LCD_TE~output .CFG_KEEP = 2'b00; +// defparam \MCU_LCD_TE~output .open_drain_output = "false"; + +// Location: IOIBUF_X0_Y6_N3 +// alta_io_ibuf \LCD_TE~input ( +alta_io \LCD_TE~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\LCD_TE~input_o ), + .regout(), + .padio(LCD_TE)); +defparam \LCD_TE~input .CFG_KEEP = 2'b00; +// defparam \LCD_TE~input .simulate_z_as = "z"; + +// Location: IOOBUF_X0_Y7_N0 +// alta_io_obuf \LCD_RESETX~output ( +alta_io \LCD_RESETX~output ( + .datain(\lcd_reset_q~q ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(LCD_RESETX)); +defparam \LCD_RESETX~output .CFG_KEEP = 2'b00; +// defparam \LCD_RESETX~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y7_N1 +// alta_io_obuf \REF_EN~output ( +alta_io \REF_EN~output ( + .datain(\ref_en_q~q ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(REF_EN)); +defparam \REF_EN~output .CFG_KEEP = 2'b00; +// defparam \REF_EN~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y8_N3 +// alta_io_obuf \LCD_BACKLIGHT~output ( +alta_io \LCD_BACKLIGHT~output ( + .datain(\lcd_backlight_q~q ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(LCD_BACKLIGHT)); +defparam \LCD_BACKLIGHT~output .CFG_KEEP = 2'b00; +// defparam \LCD_BACKLIGHT~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y9_N1 +// alta_io_obuf \SYSOFF~output ( +alta_io \SYSOFF~output ( + .datain(\sysoff_q~q ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(SYSOFF)); +defparam \SYSOFF~output .CFG_KEEP = 2'b00; +// defparam \SYSOFF~output .open_drain_output = "false"; + +// Location: IOOBUF_X0_Y9_N2 +// alta_io_obuf \AUDIO_RESETX~output ( +alta_io \AUDIO_RESETX~output ( + .datain(\audio_reset_q~q ), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(AUDIO_RESETX)); +defparam \AUDIO_RESETX~output .CFG_KEEP = 2'b00; +// defparam \AUDIO_RESETX~output .open_drain_output = "false"; + +// Location: IOIBUF_X18_Y62_N2 +// alta_io_ibuf \MCU_P2_8~input ( +alta_io \MCU_P2_8~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\MCU_P2_8~input_o ), + .regout(), + .padio(MCU_P2_8)); +defparam \MCU_P2_8~input .CFG_KEEP = 2'b00; +// defparam \MCU_P2_8~input .simulate_z_as = "z"; + +// Location: IOIBUF_X23_Y62_N3 +// alta_io_ibuf \GPS_TX_READY~input ( +alta_io \GPS_TX_READY~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\GPS_TX_READY~input_o ), + .regout(), + .padio(GPS_TX_READY)); +defparam \GPS_TX_READY~input .CFG_KEEP = 2'b00; +// defparam \GPS_TX_READY~input .simulate_z_as = "z"; + +// Location: IOIBUF_X51_Y0_N0 +// alta_io_ibuf \DEVICE_RESET~input ( +alta_io \DEVICE_RESET~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\DEVICE_RESET~input_o ), + .regout(), + .padio(DEVICE_RESET)); +defparam \DEVICE_RESET~input .CFG_KEEP = 2'b00; +// defparam \DEVICE_RESET~input .simulate_z_as = "z"; + +// Location: IOIBUF_X56_Y62_N0 +// alta_io_ibuf \GPS_TIMEPULSE~input ( +alta_io \GPS_TIMEPULSE~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\GPS_TIMEPULSE~input_o ), + .regout(), + .padio(GPS_TIMEPULSE)); +defparam \GPS_TIMEPULSE~input .CFG_KEEP = 2'b00; +// defparam \GPS_TIMEPULSE~input .simulate_z_as = "z"; + +// Location: IOIBUF_X78_Y0_N1 +// alta_io_ibuf \DEVICE_RESET_V~input ( +alta_io \DEVICE_RESET_V~input ( + .datain(gnd), + .oe(gnd), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(\DEVICE_RESET_V~input_o ), + .regout(), + .padio(DEVICE_RESET_V)); +defparam \DEVICE_RESET_V~input .CFG_KEEP = 2'b00; +// defparam \DEVICE_RESET_V~input .simulate_z_as = "z"; + +// Location: IOOBUF_X94_Y9_N2 +// alta_io_obuf \GPS_RESETX~output ( +alta_io \GPS_RESETX~output ( + .datain(vcc), + .oe(vcc), + .outclk(gnd), + .outclkena(vcc), + .inclk(gnd), + .inclkena(vcc), + .areset(gnd), + .sreset(gnd), + .combout(), + .regout(), + .padio(GPS_RESETX)); +defparam \GPS_RESETX~output .CFG_KEEP = 2'b00; +// defparam \GPS_RESETX~output .open_drain_output = "false"; + +// Location: CLKCTRL_G2 +alta_io_gclk \MCU_IO_STBX~inputclkctrl ( + .inclk (\MCU_IO_STBX~input_o ), + .outclk(\MCU_IO_STBX~inputclkctrl_outclk )); +//defparam \MCU_IO_STBX~inputclkctrl .clock_type = "global clock"; +//defparam \MCU_IO_STBX~inputclkctrl .ena_register_mode = "none"; + +// Location: CLKCTRL_G3 +alta_io_gclk \MCU_LCD_WRX~inputclkctrl ( + .inclk (\MCU_LCD_WRX~input_o ), + .outclk(\MCU_LCD_WRX~inputclkctrl_outclk )); +//defparam \MCU_LCD_WRX~inputclkctrl .clock_type = "global clock"; +//defparam \MCU_LCD_WRX~inputclkctrl .ena_register_mode = "none"; + +// Location: CLKCTRL_G4 +alta_io_gclk \MCU_LCD_RDX~inputclkctrl ( + .inclk (\MCU_LCD_RDX~input_o ), + .outclk(\MCU_LCD_RDX~inputclkctrl_outclk )); +//defparam \MCU_LCD_RDX~inputclkctrl .clock_type = "global clock"; +//defparam \MCU_LCD_RDX~inputclkctrl .ena_register_mode = "none"; + +// Location: LCCOMB_X1_Y15_N10 +// alta_lcell_comb \lcd_reset_q~0 ( +alta_slice \lcd_reset_q~0 ( + .A(vcc), + .B(vcc), + .C(\MCU_ADDR~input_o ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_reset_q~0_combout ), + .Cout(), + .Q()); +defparam \lcd_reset_q~0 .mask = 16'h00F0; +defparam \lcd_reset_q~0 .mode = "logic"; +defparam \lcd_reset_q~0 .modeMux = 1'b0; +defparam \lcd_reset_q~0 .FeedbackMux = 1'b0; +defparam \lcd_reset_q~0 .ShiftMux = 1'b0; +defparam \lcd_reset_q~0 .BypassEn = 1'b0; +defparam \lcd_reset_q~0 .CarryEnb = 1'b1; +defparam \lcd_reset_q~0 .AsyncResetMux = 2'bxx; +defparam \lcd_reset_q~0 .SyncResetMux = 2'bxx; +defparam \lcd_reset_q~0 .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y15_N12 +// alta_lcell_ff \tp_q[3] ( +alta_slice \tp_q[3] ( + .A(), + .B(), + .C(\MCU_D[3]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[3]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[3])); +defparam \tp_q[3] .mask = 16'hFFFF; +defparam \tp_q[3] .mode = "ripple"; +defparam \tp_q[3] .modeMux = 1'b1; +defparam \tp_q[3] .FeedbackMux = 1'b0; +defparam \tp_q[3] .ShiftMux = 1'b0; +defparam \tp_q[3] .BypassEn = 1'b1; +defparam \tp_q[3] .CarryEnb = 1'b1; +defparam \tp_q[3] .AsyncResetMux = 2'b00; +defparam \tp_q[3] .SyncResetMux = 2'b00; +defparam \tp_q[3] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y15_N14 +// alta_lcell_ff \tp_q[4] ( +// Location: LCCOMB_X1_Y15_N14 +// alta_lcell_comb \tp_q[4]~feeder ( +alta_slice \tp_q[4] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[4]~input_o ), + .Cin(), + .Qin(tp_q[4]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[4]~feeder_combout ), + .Cout(), + .Q(tp_q[4])); +defparam \tp_q[4] .mask = 16'hFF00; +defparam \tp_q[4] .mode = "logic"; +defparam \tp_q[4] .modeMux = 1'b0; +defparam \tp_q[4] .FeedbackMux = 1'b0; +defparam \tp_q[4] .ShiftMux = 1'b0; +defparam \tp_q[4] .BypassEn = 1'b0; +defparam \tp_q[4] .CarryEnb = 1'b1; +defparam \tp_q[4] .AsyncResetMux = 2'b00; +defparam \tp_q[4] .SyncResetMux = 2'bxx; +defparam \tp_q[4] .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y15_N16 +// alta_lcell_ff lcd_backlight_q( +// Location: LCCOMB_X1_Y15_N16 +// alta_lcell_comb \lcd_backlight_q~feeder ( +alta_slice lcd_backlight_q( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[7]~input_o ), + .Cin(), + .Qin(\lcd_backlight_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_backlight_q~feeder_combout ), + .Cout(), + .Q(\lcd_backlight_q~q )); +defparam lcd_backlight_q.mask = 16'hFF00; +defparam lcd_backlight_q.mode = "logic"; +defparam lcd_backlight_q.modeMux = 1'b0; +defparam lcd_backlight_q.FeedbackMux = 1'b0; +defparam lcd_backlight_q.ShiftMux = 1'b0; +defparam lcd_backlight_q.BypassEn = 1'b0; +defparam lcd_backlight_q.CarryEnb = 1'b1; +defparam lcd_backlight_q.AsyncResetMux = 2'b00; +defparam lcd_backlight_q.SyncResetMux = 2'bxx; +defparam lcd_backlight_q.SyncLoadMux = 2'bxx; +// Location: FF_X1_Y15_N18 +// alta_lcell_ff \tp_q[0] ( +alta_slice \tp_q[0] ( + .A(), + .B(), + .C(\MCU_D[0]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[0]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[0])); +defparam \tp_q[0] .mask = 16'hFFFF; +defparam \tp_q[0] .mode = "ripple"; +defparam \tp_q[0] .modeMux = 1'b1; +defparam \tp_q[0] .FeedbackMux = 1'b0; +defparam \tp_q[0] .ShiftMux = 1'b0; +defparam \tp_q[0] .BypassEn = 1'b1; +defparam \tp_q[0] .CarryEnb = 1'b1; +defparam \tp_q[0] .AsyncResetMux = 2'b00; +defparam \tp_q[0] .SyncResetMux = 2'b00; +defparam \tp_q[0] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y15_N2 +// alta_lcell_ff lcd_reset_q( +// Location: LCCOMB_X1_Y15_N2 +// alta_lcell_comb \lcd_reset_q~1 ( +alta_slice lcd_reset_q( + .A(vcc), + .B(vcc), + .C(\MCU_D[0]~input_o ), + .D(vcc), + .Cin(), + .Qin(\lcd_reset_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_reset_q~1_combout ), + .Cout(), + .Q(\lcd_reset_q~q )); +defparam lcd_reset_q.mask = 16'h0F0F; +defparam lcd_reset_q.mode = "logic"; +defparam lcd_reset_q.modeMux = 1'b0; +defparam lcd_reset_q.FeedbackMux = 1'b0; +defparam lcd_reset_q.ShiftMux = 1'b0; +defparam lcd_reset_q.BypassEn = 1'b0; +defparam lcd_reset_q.CarryEnb = 1'b1; +defparam lcd_reset_q.AsyncResetMux = 2'b00; +defparam lcd_reset_q.SyncResetMux = 2'bxx; +defparam lcd_reset_q.SyncLoadMux = 2'bxx; +// Location: FF_X1_Y15_N20 +// alta_lcell_ff \tp_q[1] ( +alta_slice \tp_q[1] ( + .A(), + .B(), + .C(\MCU_D[1]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[1]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[1])); +defparam \tp_q[1] .mask = 16'hFFFF; +defparam \tp_q[1] .mode = "ripple"; +defparam \tp_q[1] .modeMux = 1'b1; +defparam \tp_q[1] .FeedbackMux = 1'b0; +defparam \tp_q[1] .ShiftMux = 1'b0; +defparam \tp_q[1] .BypassEn = 1'b1; +defparam \tp_q[1] .CarryEnb = 1'b1; +defparam \tp_q[1] .AsyncResetMux = 2'b00; +defparam \tp_q[1] .SyncResetMux = 2'b00; +defparam \tp_q[1] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y15_N22 +// alta_lcell_ff audio_reset_q( +// Location: LCCOMB_X1_Y15_N22 +// alta_lcell_comb \audio_reset_q~0 ( +alta_slice audio_reset_q( + .A(vcc), + .B(vcc), + .C(\MCU_D[1]~input_o ), + .D(vcc), + .Cin(), + .Qin(\audio_reset_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\audio_reset_q~0_combout ), + .Cout(), + .Q(\audio_reset_q~q )); +defparam audio_reset_q.mask = 16'h0F0F; +defparam audio_reset_q.mode = "logic"; +defparam audio_reset_q.modeMux = 1'b0; +defparam audio_reset_q.FeedbackMux = 1'b0; +defparam audio_reset_q.ShiftMux = 1'b0; +defparam audio_reset_q.BypassEn = 1'b0; +defparam audio_reset_q.CarryEnb = 1'b1; +defparam audio_reset_q.AsyncResetMux = 2'b00; +defparam audio_reset_q.SyncResetMux = 2'bxx; +defparam audio_reset_q.SyncLoadMux = 2'bxx; +// Location: FF_X1_Y15_N24 +// alta_lcell_ff \tp_q[7] ( +// Location: LCCOMB_X1_Y15_N24 +// alta_lcell_comb \tp_q[7]~feeder ( +alta_slice \tp_q[7] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[7]~input_o ), + .Cin(), + .Qin(tp_q[7]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[7]~feeder_combout ), + .Cout(), + .Q(tp_q[7])); +defparam \tp_q[7] .mask = 16'hFF00; +defparam \tp_q[7] .mode = "logic"; +defparam \tp_q[7] .modeMux = 1'b0; +defparam \tp_q[7] .FeedbackMux = 1'b0; +defparam \tp_q[7] .ShiftMux = 1'b0; +defparam \tp_q[7] .BypassEn = 1'b0; +defparam \tp_q[7] .CarryEnb = 1'b1; +defparam \tp_q[7] .AsyncResetMux = 2'b00; +defparam \tp_q[7] .SyncResetMux = 2'bxx; +defparam \tp_q[7] .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y15_N26 +// alta_lcell_ff \tp_q[2] ( +// Location: LCCOMB_X1_Y15_N26 +// alta_lcell_comb \tp_q[2]~feeder ( +alta_slice \tp_q[2] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[2]~input_o ), + .Cin(), + .Qin(tp_q[2]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[2]~feeder_combout ), + .Cout(), + .Q(tp_q[2])); +defparam \tp_q[2] .mask = 16'hFF00; +defparam \tp_q[2] .mode = "logic"; +defparam \tp_q[2] .modeMux = 1'b0; +defparam \tp_q[2] .FeedbackMux = 1'b0; +defparam \tp_q[2] .ShiftMux = 1'b0; +defparam \tp_q[2] .BypassEn = 1'b0; +defparam \tp_q[2] .CarryEnb = 1'b1; +defparam \tp_q[2] .AsyncResetMux = 2'b00; +defparam \tp_q[2] .SyncResetMux = 2'bxx; +defparam \tp_q[2] .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y15_N28 +// alta_lcell_ff \tp_q[5] ( +alta_slice \tp_q[5] ( + .A(), + .B(), + .C(\MCU_D[5]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[5]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[5])); +defparam \tp_q[5] .mask = 16'hFFFF; +defparam \tp_q[5] .mode = "ripple"; +defparam \tp_q[5] .modeMux = 1'b1; +defparam \tp_q[5] .FeedbackMux = 1'b0; +defparam \tp_q[5] .ShiftMux = 1'b0; +defparam \tp_q[5] .BypassEn = 1'b1; +defparam \tp_q[5] .CarryEnb = 1'b1; +defparam \tp_q[5] .AsyncResetMux = 2'b00; +defparam \tp_q[5] .SyncResetMux = 2'b00; +defparam \tp_q[5] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y15_N30 +// alta_lcell_ff ref_en_q( +// Location: LCCOMB_X1_Y15_N30 +// alta_lcell_comb \ref_en_q~feeder ( +alta_slice ref_en_q( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[6]~input_o ), + .Cin(), + .Qin(\ref_en_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\ref_en_q~feeder_combout ), + .Cout(), + .Q(\ref_en_q~q )); +defparam ref_en_q.mask = 16'hFF00; +defparam ref_en_q.mode = "logic"; +defparam ref_en_q.modeMux = 1'b0; +defparam ref_en_q.FeedbackMux = 1'b0; +defparam ref_en_q.ShiftMux = 1'b0; +defparam ref_en_q.BypassEn = 1'b0; +defparam ref_en_q.CarryEnb = 1'b1; +defparam ref_en_q.AsyncResetMux = 2'b00; +defparam ref_en_q.SyncResetMux = 2'bxx; +defparam ref_en_q.SyncLoadMux = 2'bxx; +// Location: LCCOMB_X1_Y15_N4 +// alta_lcell_comb \tp_q[3]~0 ( +alta_slice \tp_q[3]~0 ( + .A(vcc), + .B(vcc), + .C(\MCU_ADDR~input_o ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[3]~0_combout ), + .Cout(), + .Q()); +defparam \tp_q[3]~0 .mask = 16'h000F; +defparam \tp_q[3]~0 .mode = "logic"; +defparam \tp_q[3]~0 .modeMux = 1'b0; +defparam \tp_q[3]~0 .FeedbackMux = 1'b0; +defparam \tp_q[3]~0 .ShiftMux = 1'b0; +defparam \tp_q[3]~0 .BypassEn = 1'b0; +defparam \tp_q[3]~0 .CarryEnb = 1'b1; +defparam \tp_q[3]~0 .AsyncResetMux = 2'bxx; +defparam \tp_q[3]~0 .SyncResetMux = 2'bxx; +defparam \tp_q[3]~0 .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y15_N6 +// alta_lcell_ff sysoff_q( +// Location: LCCOMB_X1_Y15_N6 +// alta_lcell_comb \sysoff_q~feeder ( +alta_slice sysoff_q( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[2]~input_o ), + .Cin(), + .Qin(\sysoff_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\sysoff_q~feeder_combout ), + .Cout(), + .Q(\sysoff_q~q )); +defparam sysoff_q.mask = 16'hFF00; +defparam sysoff_q.mode = "logic"; +defparam sysoff_q.modeMux = 1'b0; +defparam sysoff_q.FeedbackMux = 1'b0; +defparam sysoff_q.ShiftMux = 1'b0; +defparam sysoff_q.BypassEn = 1'b0; +defparam sysoff_q.CarryEnb = 1'b1; +defparam sysoff_q.AsyncResetMux = 2'b00; +defparam sysoff_q.SyncResetMux = 2'bxx; +defparam sysoff_q.SyncLoadMux = 2'bxx; +// Location: FF_X1_Y15_N8 +// alta_lcell_ff \tp_q[6] ( +// Location: LCCOMB_X1_Y15_N8 +// alta_lcell_comb \tp_q[6]~feeder ( +alta_slice \tp_q[6] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[6]~input_o ), + .Cin(), + .Qin(tp_q[6]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[6]~feeder_combout ), + .Cout(), + .Q(tp_q[6])); +defparam \tp_q[6] .mask = 16'hFF00; +defparam \tp_q[6] .mode = "logic"; +defparam \tp_q[6] .modeMux = 1'b0; +defparam \tp_q[6] .FeedbackMux = 1'b0; +defparam \tp_q[6] .ShiftMux = 1'b0; +defparam \tp_q[6] .BypassEn = 1'b0; +defparam \tp_q[6] .CarryEnb = 1'b1; +defparam \tp_q[6] .AsyncResetMux = 2'b00; +defparam \tp_q[6] .SyncResetMux = 2'bxx; +defparam \tp_q[6] .SyncLoadMux = 2'bxx; + +// Location: CLKENCTRL_X1_Y15_N0 +alta_clkenctrl clken_ctrl_X1_Y15_N0(.ClkIn(\MCU_IO_STBX~inputclkctrl_outclk ), .ClkEn(\tp_q[3]~0_combout ), .ClkOut(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG )); +defparam clken_ctrl_X1_Y15_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y15_N0.ClkEnMux = 2'b10; + +// Location: ASYNCCTRL_X1_Y15_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y15_N0(.Din(), .Dout(AsyncReset_X1_Y15_GND)); +defparam asyncreset_ctrl_X1_Y15_N0.AsyncCtrlMux = 2'b00; + +// Location: CLKENCTRL_X1_Y15_N1 +alta_clkenctrl clken_ctrl_X1_Y15_N1(.ClkIn(\MCU_IO_STBX~inputclkctrl_outclk ), .ClkEn(\lcd_reset_q~0_combout ), .ClkOut(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG )); +defparam clken_ctrl_X1_Y15_N1.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y15_N1.ClkEnMux = 2'b10; + +// Location: SYNCCTRL_X1_Y15_N0 +alta_syncctrl syncreset_ctrl_X1_Y15(.Din(), .Dout(SyncReset_X1_Y15_GND)); +defparam syncreset_ctrl_X1_Y15.SyncCtrlMux = 2'b00; + +// Location: SYNCCTRL_X1_Y15_N1 +alta_syncctrl syncload_ctrl_X1_Y15(.Din(), .Dout(SyncLoad_X1_Y15_VCC)); +defparam syncload_ctrl_X1_Y15.SyncCtrlMux = 2'b01; +// Location: LCCOMB_X1_Y18_N14 +// alta_lcell_comb \mcu_data_out[7]~15 ( +alta_slice \mcu_data_out[7]~15 ( + .A(\LCD_TE~input_o ), + .B(\MCU_DIR~input_o ), + .C(\MCU_IO_STBX~input_o ), + .D(\mcu_data_out[7]~14_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[7]~15_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[7]~15 .mask = 16'hFB08; +defparam \mcu_data_out[7]~15 .mode = "logic"; +defparam \mcu_data_out[7]~15 .modeMux = 1'b0; +defparam \mcu_data_out[7]~15 .FeedbackMux = 1'b0; +defparam \mcu_data_out[7]~15 .ShiftMux = 1'b0; +defparam \mcu_data_out[7]~15 .BypassEn = 1'b0; +defparam \mcu_data_out[7]~15 .CarryEnb = 1'b1; +defparam \mcu_data_out[7]~15 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[7]~15 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[7]~15 .SyncLoadMux = 2'bxx; +// Location: LCCOMB_X1_Y18_N16 +// alta_lcell_comb \mcu_data_out[6]~13 ( +alta_slice \mcu_data_out[6]~13 ( + .A(\SW_ROT_B~input_o ), + .B(\MCU_IO_STBX~input_o ), + .C(\mcu_data_out[6]~12_combout ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[6]~13_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[6]~13 .mask = 16'hD1F0; +defparam \mcu_data_out[6]~13 .mode = "logic"; +defparam \mcu_data_out[6]~13 .modeMux = 1'b0; +defparam \mcu_data_out[6]~13 .FeedbackMux = 1'b0; +defparam \mcu_data_out[6]~13 .ShiftMux = 1'b0; +defparam \mcu_data_out[6]~13 .BypassEn = 1'b0; +defparam \mcu_data_out[6]~13 .CarryEnb = 1'b1; +defparam \mcu_data_out[6]~13 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[6]~13 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[6]~13 .SyncLoadMux = 2'bxx; +// Location: LCCOMB_X1_Y18_N28 +// alta_lcell_comb \mcu_data_out[1]~3 ( +alta_slice \mcu_data_out[1]~3 ( + .A(\SW_L~input_o ), + .B(\MCU_DIR~input_o ), + .C(\MCU_IO_STBX~input_o ), + .D(\mcu_data_out[1]~2_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[1]~3_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[1]~3 .mask = 16'hF704; +defparam \mcu_data_out[1]~3 .mode = "logic"; +defparam \mcu_data_out[1]~3 .modeMux = 1'b0; +defparam \mcu_data_out[1]~3 .FeedbackMux = 1'b0; +defparam \mcu_data_out[1]~3 .ShiftMux = 1'b0; +defparam \mcu_data_out[1]~3 .BypassEn = 1'b0; +defparam \mcu_data_out[1]~3 .CarryEnb = 1'b1; +defparam \mcu_data_out[1]~3 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[1]~3 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[1]~3 .SyncLoadMux = 2'bxx; +// Location: LCCOMB_X1_Y18_N30 +// alta_lcell_comb \mcu_data_out[0]~1 ( +alta_slice \mcu_data_out[0]~1 ( + .A(\SW_R~input_o ), + .B(\MCU_IO_STBX~input_o ), + .C(\mcu_data_out[0]~0_combout ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[0]~1_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[0]~1 .mask = 16'hD1F0; +defparam \mcu_data_out[0]~1 .mode = "logic"; +defparam \mcu_data_out[0]~1 .modeMux = 1'b0; +defparam \mcu_data_out[0]~1 .FeedbackMux = 1'b0; +defparam \mcu_data_out[0]~1 .ShiftMux = 1'b0; +defparam \mcu_data_out[0]~1 .BypassEn = 1'b0; +defparam \mcu_data_out[0]~1 .CarryEnb = 1'b1; +defparam \mcu_data_out[0]~1 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[0]~1 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[0]~1 .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y19_N30 +// alta_lcell_ff \lcd_data_in_q[0] ( +// Location: LCCOMB_X1_Y19_N30 +// alta_lcell_comb \mcu_data_out[0]~0 ( +alta_slice \lcd_data_in_q[0] ( + .A(\LCD_DB[8]~input_o ), + .B(vcc), + .C(\LCD_DB[0]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[0]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y19_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y19_GND), + .SyncReset(SyncReset_X1_Y19_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y19_VCC), + .LutOut(\mcu_data_out[0]~0_combout ), + .Cout(), + .Q(lcd_data_in_q[0])); +defparam \lcd_data_in_q[0] .mask = 16'hF0AA; +defparam \lcd_data_in_q[0] .mode = "logic"; +defparam \lcd_data_in_q[0] .modeMux = 1'b0; +defparam \lcd_data_in_q[0] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[0] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[0] .BypassEn = 1'b1; +defparam \lcd_data_in_q[0] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[0] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[0] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[0] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y19_N4 +// alta_lcell_ff \lcd_data_in_q[6] ( +// Location: LCCOMB_X1_Y19_N4 +// alta_lcell_comb \mcu_data_out[6]~12 ( +alta_slice \lcd_data_in_q[6] ( + .A(\LCD_DB[14]~input_o ), + .B(vcc), + .C(\LCD_DB[6]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[6]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y19_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y19_GND), + .SyncReset(SyncReset_X1_Y19_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y19_VCC), + .LutOut(\mcu_data_out[6]~12_combout ), + .Cout(), + .Q(lcd_data_in_q[6])); +defparam \lcd_data_in_q[6] .mask = 16'hF0AA; +defparam \lcd_data_in_q[6] .mode = "logic"; +defparam \lcd_data_in_q[6] .modeMux = 1'b0; +defparam \lcd_data_in_q[6] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[6] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[6] .BypassEn = 1'b1; +defparam \lcd_data_in_q[6] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[6] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[6] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[6] .SyncLoadMux = 2'b01; + +// Location: CLKENCTRL_X1_Y19_N0 +alta_clkenctrl clken_ctrl_X1_Y19_N0(.ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y19_SIG_VCC )); +defparam clken_ctrl_X1_Y19_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y19_N0.ClkEnMux = 2'b01; + +// Location: ASYNCCTRL_X1_Y19_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y19_N0(.Din(), .Dout(AsyncReset_X1_Y19_GND)); +defparam asyncreset_ctrl_X1_Y19_N0.AsyncCtrlMux = 2'b00; + +// Location: SYNCCTRL_X1_Y19_N0 +alta_syncctrl syncreset_ctrl_X1_Y19(.Din(), .Dout(SyncReset_X1_Y19_GND)); +defparam syncreset_ctrl_X1_Y19.SyncCtrlMux = 2'b00; + +// Location: SYNCCTRL_X1_Y19_N1 +alta_syncctrl syncload_ctrl_X1_Y19(.Din(), .Dout(SyncLoad_X1_Y19_VCC)); +defparam syncload_ctrl_X1_Y19.SyncCtrlMux = 2'b01; +// Location: FF_X1_Y20_N0 +// alta_lcell_ff \lcd_data_out_q[1] ( +// Location: LCCOMB_X1_Y20_N0 +// alta_lcell_comb \lcd_data_out_q[1]~feeder ( +alta_slice \lcd_data_out_q[1] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[1]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[1]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[1]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[1])); +defparam \lcd_data_out_q[1] .mask = 16'hFF00; +defparam \lcd_data_out_q[1] .mode = "logic"; +defparam \lcd_data_out_q[1] .modeMux = 1'b0; +defparam \lcd_data_out_q[1] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[1] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[1] .BypassEn = 1'b0; +defparam \lcd_data_out_q[1] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[1] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[1] .SyncResetMux = 2'bxx; +defparam \lcd_data_out_q[1] .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y20_N10 +// alta_lcell_ff \lcd_data_out_q[2] ( +// Location: LCCOMB_X1_Y20_N10 +// alta_lcell_comb \lcd_data_out_q[2]~feeder ( +alta_slice \lcd_data_out_q[2] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[2]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[2]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[2]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[2])); +defparam \lcd_data_out_q[2] .mask = 16'hFF00; +defparam \lcd_data_out_q[2] .mode = "logic"; +defparam \lcd_data_out_q[2] .modeMux = 1'b0; +defparam \lcd_data_out_q[2] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[2] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[2] .BypassEn = 1'b0; +defparam \lcd_data_out_q[2] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[2] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[2] .SyncResetMux = 2'bxx; +defparam \lcd_data_out_q[2] .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y20_N12 +// alta_lcell_ff \lcd_data_out_q[6] ( +alta_slice \lcd_data_out_q[6] ( + .A(), + .B(), + .C(\MCU_D[6]~input_o ), + .D(), + .Cin(), + .Qin(lcd_data_out_q[6]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(SyncReset_X1_Y20_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y20_VCC), + .LutOut(), + .Cout(), + .Q(lcd_data_out_q[6])); +defparam \lcd_data_out_q[6] .mask = 16'hFFFF; +defparam \lcd_data_out_q[6] .mode = "ripple"; +defparam \lcd_data_out_q[6] .modeMux = 1'b1; +defparam \lcd_data_out_q[6] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[6] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[6] .BypassEn = 1'b1; +defparam \lcd_data_out_q[6] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[6] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[6] .SyncResetMux = 2'b00; +defparam \lcd_data_out_q[6] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y20_N14 +// alta_lcell_ff \lcd_data_out_q[7] ( +// Location: LCCOMB_X1_Y20_N14 +// alta_lcell_comb \lcd_data_out_q[7]~feeder ( +alta_slice \lcd_data_out_q[7] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[7]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[7]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[7]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[7])); +defparam \lcd_data_out_q[7] .mask = 16'hFF00; +defparam \lcd_data_out_q[7] .mode = "logic"; +defparam \lcd_data_out_q[7] .modeMux = 1'b0; +defparam \lcd_data_out_q[7] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[7] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[7] .BypassEn = 1'b0; +defparam \lcd_data_out_q[7] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[7] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[7] .SyncResetMux = 2'bxx; +defparam \lcd_data_out_q[7] .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y20_N30 +// alta_lcell_ff \lcd_data_out_q[0] ( +// Location: LCCOMB_X1_Y20_N30 +// alta_lcell_comb \lcd_data_out_q[0]~feeder ( +alta_slice \lcd_data_out_q[0] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[0]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[0]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[0]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[0])); +defparam \lcd_data_out_q[0] .mask = 16'hFF00; +defparam \lcd_data_out_q[0] .mode = "logic"; +defparam \lcd_data_out_q[0] .modeMux = 1'b0; +defparam \lcd_data_out_q[0] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[0] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[0] .BypassEn = 1'b0; +defparam \lcd_data_out_q[0] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[0] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[0] .SyncResetMux = 2'bxx; +defparam \lcd_data_out_q[0] .SyncLoadMux = 2'bxx; + +// Location: CLKENCTRL_X1_Y20_N0 +alta_clkenctrl clken_ctrl_X1_Y20_N0(.ClkIn(\MCU_LCD_WRX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC )); +defparam clken_ctrl_X1_Y20_N0.ClkMux = 2'b11; +defparam clken_ctrl_X1_Y20_N0.ClkEnMux = 2'b01; + +// Location: ASYNCCTRL_X1_Y20_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y20_N0(.Din(), .Dout(AsyncReset_X1_Y20_GND)); +defparam asyncreset_ctrl_X1_Y20_N0.AsyncCtrlMux = 2'b00; + +// Location: SYNCCTRL_X1_Y20_N0 +alta_syncctrl syncreset_ctrl_X1_Y20(.Din(), .Dout(SyncReset_X1_Y20_GND)); +defparam syncreset_ctrl_X1_Y20.SyncCtrlMux = 2'b00; + +// Location: SYNCCTRL_X1_Y20_N1 +alta_syncctrl syncload_ctrl_X1_Y20(.Din(), .Dout(SyncLoad_X1_Y20_VCC)); +defparam syncload_ctrl_X1_Y20.SyncCtrlMux = 2'b01; +// Location: FF_X1_Y21_N28 +// alta_lcell_ff \lcd_data_in_q[7] ( +// Location: LCCOMB_X1_Y21_N28 +// alta_lcell_comb \mcu_data_out[7]~14 ( +alta_slice \lcd_data_in_q[7] ( + .A(\LCD_DB[15]~input_o ), + .B(\MCU_LCD_RDX~input_o ), + .C(\LCD_DB[7]~input_o ), + .D(vcc), + .Cin(), + .Qin(lcd_data_in_q[7]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y21_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y21_GND), + .SyncReset(SyncReset_X1_Y21_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y21_VCC), + .LutOut(\mcu_data_out[7]~14_combout ), + .Cout(), + .Q(lcd_data_in_q[7])); +defparam \lcd_data_in_q[7] .mask = 16'hE2E2; +defparam \lcd_data_in_q[7] .mode = "logic"; +defparam \lcd_data_in_q[7] .modeMux = 1'b0; +defparam \lcd_data_in_q[7] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[7] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[7] .BypassEn = 1'b1; +defparam \lcd_data_in_q[7] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[7] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[7] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[7] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y21_N4 +// alta_lcell_ff \lcd_data_in_q[1] ( +// Location: LCCOMB_X1_Y21_N4 +// alta_lcell_comb \mcu_data_out[1]~2 ( +alta_slice \lcd_data_in_q[1] ( + .A(\LCD_DB[9]~input_o ), + .B(\MCU_LCD_RDX~input_o ), + .C(\LCD_DB[1]~input_o ), + .D(vcc), + .Cin(), + .Qin(lcd_data_in_q[1]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y21_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y21_GND), + .SyncReset(SyncReset_X1_Y21_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y21_VCC), + .LutOut(\mcu_data_out[1]~2_combout ), + .Cout(), + .Q(lcd_data_in_q[1])); +defparam \lcd_data_in_q[1] .mask = 16'hE2E2; +defparam \lcd_data_in_q[1] .mode = "logic"; +defparam \lcd_data_in_q[1] .modeMux = 1'b0; +defparam \lcd_data_in_q[1] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[1] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[1] .BypassEn = 1'b1; +defparam \lcd_data_in_q[1] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[1] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[1] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[1] .SyncLoadMux = 2'b01; + +// Location: CLKENCTRL_X1_Y21_N0 +alta_clkenctrl clken_ctrl_X1_Y21_N0(.ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y21_SIG_VCC )); +defparam clken_ctrl_X1_Y21_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y21_N0.ClkEnMux = 2'b01; + +// Location: ASYNCCTRL_X1_Y21_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y21_N0(.Din(), .Dout(AsyncReset_X1_Y21_GND)); +defparam asyncreset_ctrl_X1_Y21_N0.AsyncCtrlMux = 2'b00; + +// Location: SYNCCTRL_X1_Y21_N0 +alta_syncctrl syncreset_ctrl_X1_Y21(.Din(), .Dout(SyncReset_X1_Y21_GND)); +defparam syncreset_ctrl_X1_Y21.SyncCtrlMux = 2'b00; + +// Location: SYNCCTRL_X1_Y21_N1 +alta_syncctrl syncload_ctrl_X1_Y21(.Din(), .Dout(SyncLoad_X1_Y21_VCC)); +defparam syncload_ctrl_X1_Y21.SyncCtrlMux = 2'b01; +// Location: LCCOMB_X1_Y23_N12 +// alta_lcell_comb \mcu_data_out[3]~7 ( +alta_slice \mcu_data_out[3]~7 ( + .A(\SW_U~input_o ), + .B(\MCU_IO_STBX~input_o ), + .C(\MCU_DIR~input_o ), + .D(\mcu_data_out[3]~6_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[3]~7_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[3]~7 .mask = 16'hDF10; +defparam \mcu_data_out[3]~7 .mode = "logic"; +defparam \mcu_data_out[3]~7 .modeMux = 1'b0; +defparam \mcu_data_out[3]~7 .FeedbackMux = 1'b0; +defparam \mcu_data_out[3]~7 .ShiftMux = 1'b0; +defparam \mcu_data_out[3]~7 .BypassEn = 1'b0; +defparam \mcu_data_out[3]~7 .CarryEnb = 1'b1; +defparam \mcu_data_out[3]~7 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[3]~7 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[3]~7 .SyncLoadMux = 2'bxx; +// Location: LCCOMB_X1_Y23_N14 +// alta_lcell_comb \mcu_data_out[4]~9 ( +alta_slice \mcu_data_out[4]~9 ( + .A(\MCU_DIR~input_o ), + .B(\SW_SEL~input_o ), + .C(\MCU_IO_STBX~input_o ), + .D(\mcu_data_out[4]~8_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[4]~9_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[4]~9 .mask = 16'hF702; +defparam \mcu_data_out[4]~9 .mode = "logic"; +defparam \mcu_data_out[4]~9 .modeMux = 1'b0; +defparam \mcu_data_out[4]~9 .FeedbackMux = 1'b0; +defparam \mcu_data_out[4]~9 .ShiftMux = 1'b0; +defparam \mcu_data_out[4]~9 .BypassEn = 1'b0; +defparam \mcu_data_out[4]~9 .CarryEnb = 1'b1; +defparam \mcu_data_out[4]~9 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[4]~9 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[4]~9 .SyncLoadMux = 2'bxx; +// Location: LCCOMB_X1_Y23_N16 +// alta_lcell_comb \mcu_data_out[2]~5 ( +alta_slice \mcu_data_out[2]~5 ( + .A(\SW_D~input_o ), + .B(\MCU_IO_STBX~input_o ), + .C(\mcu_data_out[2]~4_combout ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[2]~5_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[2]~5 .mask = 16'hD1F0; +defparam \mcu_data_out[2]~5 .mode = "logic"; +defparam \mcu_data_out[2]~5 .modeMux = 1'b0; +defparam \mcu_data_out[2]~5 .FeedbackMux = 1'b0; +defparam \mcu_data_out[2]~5 .ShiftMux = 1'b0; +defparam \mcu_data_out[2]~5 .BypassEn = 1'b0; +defparam \mcu_data_out[2]~5 .CarryEnb = 1'b1; +defparam \mcu_data_out[2]~5 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[2]~5 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[2]~5 .SyncLoadMux = 2'bxx; +// Location: LCCOMB_X1_Y23_N30 +// alta_lcell_comb \mcu_data_out[5]~11 ( +alta_slice \mcu_data_out[5]~11 ( + .A(\MCU_DIR~input_o ), + .B(\SW_ROT_A~input_o ), + .C(\MCU_IO_STBX~input_o ), + .D(\mcu_data_out[5]~10_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[5]~11_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[5]~11 .mask = 16'hF702; +defparam \mcu_data_out[5]~11 .mode = "logic"; +defparam \mcu_data_out[5]~11 .modeMux = 1'b0; +defparam \mcu_data_out[5]~11 .FeedbackMux = 1'b0; +defparam \mcu_data_out[5]~11 .ShiftMux = 1'b0; +defparam \mcu_data_out[5]~11 .BypassEn = 1'b0; +defparam \mcu_data_out[5]~11 .CarryEnb = 1'b1; +defparam \mcu_data_out[5]~11 .AsyncResetMux = 2'bxx; +defparam \mcu_data_out[5]~11 .SyncResetMux = 2'bxx; +defparam \mcu_data_out[5]~11 .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y24_N30 +// alta_lcell_ff \lcd_data_in_q[2] ( +// Location: LCCOMB_X1_Y24_N30 +// alta_lcell_comb \mcu_data_out[2]~4 ( +alta_slice \lcd_data_in_q[2] ( + .A(\LCD_DB[10]~input_o ), + .B(vcc), + .C(\LCD_DB[2]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[2]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y24_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y24_GND), + .SyncReset(SyncReset_X1_Y24_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y24_VCC), + .LutOut(\mcu_data_out[2]~4_combout ), + .Cout(), + .Q(lcd_data_in_q[2])); +defparam \lcd_data_in_q[2] .mask = 16'hF0AA; +defparam \lcd_data_in_q[2] .mode = "logic"; +defparam \lcd_data_in_q[2] .modeMux = 1'b0; +defparam \lcd_data_in_q[2] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[2] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[2] .BypassEn = 1'b1; +defparam \lcd_data_in_q[2] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[2] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[2] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[2] .SyncLoadMux = 2'b01; + +// Location: CLKENCTRL_X1_Y24_N0 +alta_clkenctrl clken_ctrl_X1_Y24_N0(.ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y24_SIG_VCC )); +defparam clken_ctrl_X1_Y24_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y24_N0.ClkEnMux = 2'b01; + +// Location: ASYNCCTRL_X1_Y24_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y24_N0(.Din(), .Dout(AsyncReset_X1_Y24_GND)); +defparam asyncreset_ctrl_X1_Y24_N0.AsyncCtrlMux = 2'b00; + +// Location: SYNCCTRL_X1_Y24_N0 +alta_syncctrl syncreset_ctrl_X1_Y24(.Din(), .Dout(SyncReset_X1_Y24_GND)); +defparam syncreset_ctrl_X1_Y24.SyncCtrlMux = 2'b00; + +// Location: SYNCCTRL_X1_Y24_N1 +alta_syncctrl syncload_ctrl_X1_Y24(.Din(), .Dout(SyncLoad_X1_Y24_VCC)); +defparam syncload_ctrl_X1_Y24.SyncCtrlMux = 2'b01; +// Location: FF_X1_Y26_N10 +// alta_lcell_ff \lcd_data_in_q[4] ( +// Location: LCCOMB_X1_Y26_N10 +// alta_lcell_comb \mcu_data_out[4]~8 ( +alta_slice \lcd_data_in_q[4] ( + .A(\MCU_LCD_RDX~input_o ), + .B(\LCD_DB[12]~input_o ), + .C(\LCD_DB[4]~input_o ), + .D(vcc), + .Cin(), + .Qin(lcd_data_in_q[4]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(\mcu_data_out[4]~8_combout ), + .Cout(), + .Q(lcd_data_in_q[4])); +defparam \lcd_data_in_q[4] .mask = 16'hE4E4; +defparam \lcd_data_in_q[4] .mode = "logic"; +defparam \lcd_data_in_q[4] .modeMux = 1'b0; +defparam \lcd_data_in_q[4] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[4] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[4] .BypassEn = 1'b1; +defparam \lcd_data_in_q[4] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[4] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[4] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[4] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y26_N12 +// alta_lcell_ff \lcd_data_out_q[4] ( +// Location: LCCOMB_X1_Y26_N12 +// alta_lcell_comb \lcd_data_out_q[4]~feeder ( +alta_slice \lcd_data_out_q[4] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[4]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[4]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[4]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[4])); +defparam \lcd_data_out_q[4] .mask = 16'hFF00; +defparam \lcd_data_out_q[4] .mode = "logic"; +defparam \lcd_data_out_q[4] .modeMux = 1'b0; +defparam \lcd_data_out_q[4] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[4] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[4] .BypassEn = 1'b0; +defparam \lcd_data_out_q[4] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[4] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[4] .SyncResetMux = 2'bxx; +defparam \lcd_data_out_q[4] .SyncLoadMux = 2'bxx; +// Location: FF_X1_Y26_N14 +// alta_lcell_ff \lcd_data_out_q[3] ( +alta_slice \lcd_data_out_q[3] ( + .A(), + .B(), + .C(\MCU_D[3]~input_o ), + .D(), + .Cin(), + .Qin(lcd_data_out_q[3]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(), + .Cout(), + .Q(lcd_data_out_q[3])); +defparam \lcd_data_out_q[3] .mask = 16'hFFFF; +defparam \lcd_data_out_q[3] .mode = "ripple"; +defparam \lcd_data_out_q[3] .modeMux = 1'b1; +defparam \lcd_data_out_q[3] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[3] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[3] .BypassEn = 1'b1; +defparam \lcd_data_out_q[3] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[3] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[3] .SyncResetMux = 2'b00; +defparam \lcd_data_out_q[3] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y26_N4 +// alta_lcell_ff \lcd_data_out_q[5] ( +alta_slice \lcd_data_out_q[5] ( + .A(), + .B(), + .C(\MCU_D[5]~input_o ), + .D(), + .Cin(), + .Qin(lcd_data_out_q[5]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(), + .Cout(), + .Q(lcd_data_out_q[5])); +defparam \lcd_data_out_q[5] .mask = 16'hFFFF; +defparam \lcd_data_out_q[5] .mode = "ripple"; +defparam \lcd_data_out_q[5] .modeMux = 1'b1; +defparam \lcd_data_out_q[5] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[5] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[5] .BypassEn = 1'b1; +defparam \lcd_data_out_q[5] .CarryEnb = 1'b1; +defparam \lcd_data_out_q[5] .AsyncResetMux = 2'b00; +defparam \lcd_data_out_q[5] .SyncResetMux = 2'b00; +defparam \lcd_data_out_q[5] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y26_N6 +// alta_lcell_ff \lcd_data_in_q[3] ( +// Location: LCCOMB_X1_Y26_N6 +// alta_lcell_comb \mcu_data_out[3]~6 ( +alta_slice \lcd_data_in_q[3] ( + .A(\MCU_LCD_RDX~input_o ), + .B(\LCD_DB[11]~input_o ), + .C(\LCD_DB[3]~input_o ), + .D(vcc), + .Cin(), + .Qin(lcd_data_in_q[3]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(\mcu_data_out[3]~6_combout ), + .Cout(), + .Q(lcd_data_in_q[3])); +defparam \lcd_data_in_q[3] .mask = 16'hE4E4; +defparam \lcd_data_in_q[3] .mode = "logic"; +defparam \lcd_data_in_q[3] .modeMux = 1'b0; +defparam \lcd_data_in_q[3] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[3] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[3] .BypassEn = 1'b1; +defparam \lcd_data_in_q[3] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[3] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[3] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[3] .SyncLoadMux = 2'b01; +// Location: FF_X1_Y26_N8 +// alta_lcell_ff \lcd_data_in_q[5] ( +// Location: LCCOMB_X1_Y26_N8 +// alta_lcell_comb \mcu_data_out[5]~10 ( +alta_slice \lcd_data_in_q[5] ( + .A(\MCU_LCD_RDX~input_o ), + .B(vcc), + .C(\LCD_DB[5]~input_o ), + .D(\LCD_DB[13]~input_o ), + .Cin(), + .Qin(lcd_data_in_q[5]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(\mcu_data_out[5]~10_combout ), + .Cout(), + .Q(lcd_data_in_q[5])); +defparam \lcd_data_in_q[5] .mask = 16'hF5A0; +defparam \lcd_data_in_q[5] .mode = "logic"; +defparam \lcd_data_in_q[5] .modeMux = 1'b0; +defparam \lcd_data_in_q[5] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[5] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[5] .BypassEn = 1'b1; +defparam \lcd_data_in_q[5] .CarryEnb = 1'b1; +defparam \lcd_data_in_q[5] .AsyncResetMux = 2'b00; +defparam \lcd_data_in_q[5] .SyncResetMux = 2'b00; +defparam \lcd_data_in_q[5] .SyncLoadMux = 2'b01; + +// Location: CLKENCTRL_X1_Y26_N0 +alta_clkenctrl clken_ctrl_X1_Y26_N0(.ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC )); +defparam clken_ctrl_X1_Y26_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y26_N0.ClkEnMux = 2'b01; + +// Location: ASYNCCTRL_X1_Y26_N0 +alta_asyncctrl asyncreset_ctrl_X1_Y26_N0(.Din(), .Dout(AsyncReset_X1_Y26_GND)); +defparam asyncreset_ctrl_X1_Y26_N0.AsyncCtrlMux = 2'b00; + +// Location: CLKENCTRL_X1_Y26_N1 +alta_clkenctrl clken_ctrl_X1_Y26_N1(.ClkIn(\MCU_LCD_WRX~inputclkctrl_outclk ), .ClkEn(), .ClkOut(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC )); +defparam clken_ctrl_X1_Y26_N1.ClkMux = 2'b11; +defparam clken_ctrl_X1_Y26_N1.ClkEnMux = 2'b01; + +// Location: SYNCCTRL_X1_Y26_N0 +alta_syncctrl syncreset_ctrl_X1_Y26(.Din(), .Dout(SyncReset_X1_Y26_GND)); +defparam syncreset_ctrl_X1_Y26.SyncCtrlMux = 2'b00; + +// Location: SYNCCTRL_X1_Y26_N1 +alta_syncctrl syncload_ctrl_X1_Y26(.Din(), .Dout(SyncLoad_X1_Y26_VCC)); +defparam syncload_ctrl_X1_Y26.SyncCtrlMux = 2'b01; +endmodule diff --git a/hardware/portapack_h4m/CPLD/Supra/alta_db/place.tx b/hardware/portapack_h4m/CPLD/Supra/alta_db/place.tx new file mode 100644 index 00000000..f308aa97 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/alta_db/place.tx @@ -0,0 +1,125 @@ +ssWJbg*O-TSHdTjR +^ykYUbZxhrN\/z*-xm-x%`T`=`t +dvaLDM\AMw:PPKa/udH;9|0c0g0w + n[tI{:2nE=y+CYTwlSOHfH#vBe29at9a;CkCvC] +|>*qKqx4w /B;9H;9|0<0c0g + 6wnbnV{.MD&)jR)j ECEIEf +o={ 0 `V>'35qBwqBoWXWMW& +G$*qKZqo/udH;98zv89+z|0=0n0g + 7w4b6wnbr[35qBwqBoWRWZW< +G0efpt9a;C_CkC! +|1tKZ/udH;9|0g0n0g + ($b([=3\HwqBoWZW&WM +GOy2VFv71MkGu u5uL +q=M=>..%*1i|1iqt"tltR +O+(i-CRlSwlSOH'oWRWXW^ +GJg{2{bkb2XMk2h.5lGu u`uLj +qC!AoABiBo*1io3ysw0q]k1K;^ +888AK^RK[^CC8(`v .Gy `N]Q,Q[4P{#pg8G/!t% +KKKg6zr6Lzz+KdP lQ|[~Pa7f%f8o?d0`^q["SOc +%%%9;{a;}{,{%$fL]RQJGfwV![!EZN=Mp&8 G_]; +000=T3]T~3gn0|>B7u8P_>m@CBCFeg1X5*74Z . +WWW>T<-Tb<<B7u8P_>m@CBCFe23j2b21X5**jk3 +WWW>TM&Tb<&Wo=5G\f/I=:D`x`;)bJkb2b'-7ggkIJ55G +ttt^{HN{DRNtq+*L8!@F+y`yMyzpW#SWiW{ITqqS?#<3 -2 Z sw0qq2&-;;^ +888AK-T<-Tb3ysw0q]k1KM^);:m;C +888AK^RK[^C^8(`v .Gy `N]Q,Q[4P{#pg8G/!U%`!V=!9 +KKKg6zr6Lz+sKdP lQ|[~Pa7f%f8o?d0`^q["&#c:&.}&u +%%%9;{a;}{{{%$fL]RQJGfwV![!EZN=Mp&8 Gw];C_Kk_X +000=T3]T~3g=0|>B7u8P_>m@CBCFeg1X5*74Zff E =U % +WHyku)u[wucuGZ'-7gn*4-SiXBitB5i68-O +))W 2r)3)m +888AK^RK[Al8(`v .Gy `N]Q,S[4P{#pg8G/SU% +KKKg6zr6LrrKdP lQ|[~Pa7f%S8o?d0`^q["&}c +%% Nrfp/+0T0n +EEEdeIUe^%E 6&?P*r,6[6XD<;TKYBK0K7*HffB1YZZo +uuu&) w)[NuG$Xqvgd=$EkJmRV{BCiBoB4$\!!icCllq +HH{g{D=0d8K8< +```S +KKKz +::C|1Q[r%CZCk +000=T3]T~=p0|>B7u8P_>m@CBfFeg1X5*74ZfN E =U % +WWW>T<-Tb--Wo=5G\f/I=:D`xL;)Z'-7g0VK5wGu5Qw5N +t\-SHpH4yHGHO]{ITq*gs=dQ!^QgB7u8P_>m@IBCFeg1X5*74Z N +WWW>T<-TbB7u8P_>m@IBCFe23j2b21X5**jk3 +WWW>TM&TbB7u8P_>m@NBCFe23j2b21X5**jk3 +WWW>TM&Tb&MWo=5G\f/I=:Djx`;)bJkb2b'-7ggkIJ55G +tt4-oQg02)3)m +888^ +```S +KKj`*^B|\%;%C +CCC,ZwgZ~wx,C;|2rf&?A|P#w}<:T[(kd8.hogw|0gbngi +EEEdef.e^U fE 6&?P*r,6[6RDX;TN7*HfP+LZ^oWZJ&Zc +u7*it{tD t/tq 4$\!3-{g2Z1KZamMZG[Y^ +88{wdU8K8^ +```T4S54RS;S`%s*(2g\$se)&Hsp6q38{|2nYz&d +::dp|RKrdCZCw +000=TcnT~nn0|>B7u8P_>m@NBUFe23j2b21X5**jk3 +WW7yq+*\it{tR +HHHB +))&=wGUYF`4`S +KKKg6zr6LzezKdP lQ|[~Pa7v%}8o?d0`^q["Svc:&.}&u +%KraCZC~gCbC;N=Mp&R/(NjbZfb_U.b-9n +WWwKB WTW- +uuu&)L )[N`uG$Xqvgd=$EkJmNV{ 4$\!a&_lJq +HHH~pBfp4:;HOARoYq+dAbd|Xm>3ysw0q]k1;B^ +888AK^RK[@-8(`v .Gy `N]Q,=[4P{#pg8G/!t% +KKKg6zr6LfgKdP lQ|[~Pa7f%}8o?d0`^q["&ic +%%%9;{a;}~a%$fL]RQJGfwV![kEZN=Mp&8 G_g; +000=T3]T~in0|>B7u8P_>m@CBUFeg1X5*74Z U +WW7Byv7*ct{t" +HHH~p mp4B3 -2 Z sw0qq2&-;;^ +888AK-B7u8P_>m@CBUFe23j2b21X5**jk3 +WWW>TM&Tb3ysw0q]k1;B^);:m;C +888AK^RK[@-8(`v .Gy `N]Q,=[4P{#pg8G/!t%`!V=!9 +KKKg6zr6LfgKdP lQ|[~Pa7f%}8o?d0`^q["&ic:&.}&u +%%%9;{a;}~a%$fL]RQJGfwV![kEZN=Mp&8 G_g;C_Kk_X +000=T3]T~in0|>B7u8P_>m@CBUFeg1X5*74Z U E =U % +WHyku)u[&ucuGHEQF9yi*b"hy( +``mwxM`4`! +KK3c`!`|`%;%, +CC=/7RN5jEeE +WW1ybgS*At{tl +HTg2)3)'C)8)^Yhu VNi~e_aa9Lc +%%41N[%;%, +CC=a/udNkEeE +WW7yq+*\it{tl +HH?g qr=T8K8C +`p:cK6KLeKuKdvaLDM\AMw:PPKa/udH;9KB| +EER2j]EeE +WW7Byv7*ct{tl +HH{g{D=0d8K8C +``|:9|m`l:o:& +%KraCZC~w_CbC;+Pa_*mby[l:dFv71Mk2XG +tt|Bint{tl +HH{Sgl0=S8K8C +``{:l^``p:o:& +%%`rS&u/)0T0g +E5oBWTWb<3x]k1KB^ +888AKCK[7-l8(`v .Gy `N]Q,=[4~8G/5;% +KKKg6+6L1r+KdP lQ|[~Pa7f%S8oeq["i#c +%%%9;i;}|{~%$fL]RQJGfwV![wEZA8 Ggk; +00(9NP5o1WTW< +uuuw) )[&uG=Bd=$EkNmHV{BCiBo8*lRq +HH{g{D=0d8K8^ +```t +KKj`*^B|\%;%{ +CCC,ZvZ~!wXC;|2rf&?A|P#<}3:T_.ho]n|0nbcpi +E5oBWTWb<^WdWo={ 0 `V3x]k1m|^ +888AK-K[AR78(`v .Gy `N]U,=[4$8G/5S% +KK3c`!`|`%;%{ +CCCkZvvZ~wXC;A-?A|P#c}c:TXz9XKuBgg| +EE1oG4y7ku)uL +tttJ +HH?g qr=T8K8^ +```T4t4RT5U`%s*(2g\$se)&Hsp6~2nYrzdKzSf1f +:`|N%;%}C{%x%$f TATq0{{n$ +CCtSauCZC_ +00(9NP5o1WTWZ +uu'*LO-TSHpH< +))&=wGUYF`4`! +K{`p:o:Y}}:s:cAMn9nX-SSJ6!`RKp9~c +%%41N[%;%C +CCC,Z_Z~,xkC;|2rf&?A|P#c}n:TZ.honc| +EEEdeIe^CCUE 6&?P*r,6[6XD&;TIP+L<&o +uu'k*8\-?HpHB +)))m3MM3'Kz)^UbPUfh5-I-1Kw_dwQ.vC^( +``{:l^``p:o:S +%%%C +CCd/X8?N}EeEf +WWW>TMTbXX&Wo=5G\f/I=:D`xw;)=0VKLwGuLQ`&N +t\-SHpH4myHGHOA.-i-F,BmVO +))W 2r)3); +88cdY2p:jK6K+ +::d|]VrpaCZC_ +00+N2*]osWTWZ +u7*it{tDNHt/tq+9SoSuTRN`%8\|1io*q +HHwWSvHpHm +)))@3;3'CK;)^f?{lqPUfh5-I<1KL%b!-<( +```T4t4RQtQ`%s*(2g\$se)!Hsp6~2nYs!d +::dp|RKrdCZCw +000nTccT~ng0|_UP_>m@IBIFe23j2bP& U +WW7yq+*\it{tR +HHHm +))&=wGUYF`4`S +KKKg616L!1!KdP lQ|[~Pa7f%}8oDq["}fc:&.ui +%KraCZC~k]CbC;|{+y+>#w!B; +00HX9?0T0g +EE1jo\HyIu)u5 +tt4-oQg02)3); +88SYwgM:UK6K+ +:`|N%;%}Ca%x%$f TATq0{|n5RK4jNAL$ +CCtSauCZCk +000=TgT~i3]0|>B7u8P_>m@IBUFey74ZI% +WWW>TMTbXX-Wo=5G\f/I=:D`xw;)=0VKL G +tt4i-YTg&)3)K +8883U]k1|@^ +88cdY2p:jK6Kz +:::}oOOoY}O:cD@aDA\.:*i^;1/N1ARL,,$ +CC=/7RN5jEeEf +WWW& +uuI*B!n-/HpHB +)))@3M3'C;B)^f?{lqPUfh57I"1K %b!"A(8^n"<" +`p:cK6KL!zKuKdP0vAvh,zwd +::R*pB:o:& +%% Nrfp/+0T0g +EE1oG4y7ku)u5 +ttc-Wqvg.)3); +80Yx`4`RQ=`Y`%sf)i)B@Soz2pm-xi*% +KKG9cmK6K! +:::io&oYfff:cA~b!^aDA\.C*|^;M7c-i:$ +CCC,Z_Z~wk!vC;|2rf&?A|P#w}<:TZ.hoin| +EEEdeIe^da E 6&?P*r,6[6RDX;TIP+L&&o +uu'k*8\-?HpHB +)))m3MM3'C)^UbPUfh5TMTb>^ZWo=5G\f/I=:Djx`;)=0VKwwGuLQ&5& +t\-SHpH4yyHGHOA.-i-F,mVO +))W 2r)3); +88cdY2p:jK6K+ +::d|]VrpaCZC_ +00+N2*]osWTWZ +u7*it{tDJHt/tq+9SoSuTN`%8\|1io*q +HHwWSvHpHy +)))@3;3'mM|)^f?{lqPUfh5*qKqx4< /udH;9KB| +EER2j]EeEC +WWW>TZTb&RRWo=5G\f/I=:Dwxw;)n0VK `G +ttt^{l{D JZtq+*L8!@F+y`yMmzp*n!X;:O +)))@3M3'||M)^f?{lqPUfh5"I<1K %b!^-( +``{x:Q{`C:o:S +%%%C;ii;}{,%$G+JGfwVk[vEZS4aSyf2_v; +00(N?hoHBWTW< +uuu` +ttc-Wqvg.)3)K +888AK-K[""-8(`v .Gy `N]Q,=[4$8G/St%`SVT!; +K{`p:o:Yfi:s:cAMn9nX-OJc +%%41N[%;%, +CC=a/udNkEeE +WW7yq+*\it{tl +HH?g qr=T8K8C +`p:cK6KL!fKuKdP0vAvh,1w]Q{G cA d +::R*pB:o:f +%%%9;,;}C~|%$fL]RQJGfwVk[kEZR8 Gxw; +000=TgT~w=c0|>B7u8P_>m@CBUFey74ZaI +WWW>TMTbXM&Wo=5G\f/I=:D`xw;)=0VKwwG +tt4i-YTg&)3)K +888*qKqx4] | +EER2j]EeE +WW7Byv7*ct{tl +HH{g{D=0d8K8C +``|:9|m`l:o:& +%KraCZC~vkCbC;|{+y+>#gBefpt9ay2; +00HX9?0T0n +EEEde e^C%%E 6&?P*r,6[6XD<;TCP+LZMo +uuu&) )[w uG$Xqvgd=$EkJmRV{Fa&_Rlq +HH{Sgl0=S8K8^ +```=4tt4RSQ`%$b\$se)!H1p69Vc9AQ +zd +::d|]VrpaCZCw +000n +EEkoKf y{u)uL +ttt^{H{DN""tq+*L8!@F+y`yMBzpdn!XB@F+y`yM zpW#SWiYRB7u8P_>m@NBCFe,74ZC% Ef=.a% +WHyku)u[ jucuG$B7u8P_>m@.BCFey74Za +WWW>TMTb>^3x]k1m@^ +888AKCK[lA-8(`v .Gy `N]U,S[4~8G/St% +KKK!6zf6L!fKd~.[~Pa7v%&8oD@q["&}c +%% Nrfp/+0T0n +EEENeIIe^fE ,0r,6[6ZDX;TKYBK0\5Zm@NB Fe,074Z U EU=CIN +WWW>TMTbM>>Wo=5G\f/I=:D xL;)=0VKw\GuwQ 5\ +t\-SHpH4; HGHOA.-i3*XO +))W 2r)3); +88cdY2p:jK6K+ +::d|]VrpaCZC_ +00+N2*]osWTWZ +u7*it{tD t/tqa9&o SS3q +HHwWSvHpH< +))s2=.0Y|`4`! +KK3`br|KN%;%, +CCd/X8?N}EeE +WHyku)u[j ucuG03x]k1Mz^ +888AKCK[7l<8(`v .Gy `N]Q,Q[4~8G/S5% +KKKg616L1z1KdP lQ|[~Pa7f%f8oDq["f&c +%%%9;i;}|(~%$fL]RQJGfwV![!EZA8 Gwv; +000=TgT~p]0|>B7u8P_>m@fBCFey74Z +WWWRTB7u8P_>m@CBCFe,74ZfI Ef=.aC +WHyku)u[j&ucuG0@F+y`~Myzp*n!XfyO +)))@3;3'N|B)^f?{lqPUfh5"I"1KL%b!7l( +```T4t4RtSU`%s*(2g\$se)!H!p6~2nY!zd +:::ioOoYf :cA~b!^aDA\.|*|^;G7c-{:$ +CCC_Z_Z~wvgC;A-?A|P#=}<:TZ.howg| +EEEfe e^fCE ,0r,6[6>D&;TCP+L3U]k1mC^ +888AK-K[7"@8(`v .Gy `N]t,=[4$8G/=5% +KKKg616L&rfKdP lQ|[~Pa7O%}8oDq["v#c +%%%9;i;}:9i%$fL]RQJGfwVv[kEZA8 Ggk; +000gTgT~<0|_UP_>m@dBfFey74Z C +WWW>TZTb->-Wo=5G\f/I=:D xL;)n0VK5 G +ttt^{H{D Rltq+*L8!@F+y` MBzpdn!XfmO +)))@3M3'B;N)^f?{lqPUfh5-I^1K %b!7@( +```T4t4Rt9=`%s*(2g\$se)1Hzp6~2nY!1d +:::ioOoYOiu:cA~b!^aDA\.i*{^;G7c-|,$ +CCC,Z_Z~gx!C;|2rf&?A|P#c}3:TZ.hon3| +EEECef%e^UaE ,0r,6[6MDZ;TI_P+LZRo +uuu`)LN)[`LuG=Bd=$EkHmlV{F>a&_l^q +HHHypB:p4m;HOd%+dAbdMX;>3Ub]k1;K^ +888AKCK[-C78(`v .Gy `N]Q,S[4~8G/=S% +KKK!6zf6LszKd~.[~Pa7f%&8oD@q["& c +%%%|;{~;}{9%$G+JGfwV![_EZA-8 G_]; +000m@CB Fe,074Z d +WWWXT@F+y`yMm@dBCFe23j2bP& f +WWW>TZTbcXcWo=5G\f/I=:D xw;)n0VK&5G +ttt^{l{DZJZtq+*L8!@F+y` Mmzp*n!X~3x]k1mK^ +888AKCK[Rl"8(`v .Gy `N]t,S[4~8G/=S% +KKK+6+6L!Kd~.[~Pa7i%S8oeq["&fc +%%%9;,;}i,:%$fL]RQJGfwV![wEZR8 Gkw; +000=TgT~cgw0|>B7u8P_>m@CBfFey74ZUf +WWW>TZTbMZRWo=5G\f/I=:D`xL;)n0VKwLG +ttt^{l{DHl tq+*L8!@F+y`yMBzp*n!XmBO +))s= fYpx`4`S9 +KKK! +:::S +%%%i +CCCw +0003 +EEEf +WWWX +uuuL +tttR +HHHB +)))m +888^ +```S +KKKs +:::S +%%%{ +CCCw +0003 +EEkoKf y{u)uLN +tttJ{RZ{DNGtqF>@F+y` MoW&JX>& +uuu`)LN)[LjuG=Bd=$EkJmlV{F>a&_lJqtNsJ^N +HHHypB:p4ByHOd%+dAbd|X;>3Ub]k1;K^)m:|@m +888AK-K[-^78(`v .Gy `N]Q,Q[4$8G/QS%`SVQTU +KKKg616L&z+KdP lQ|[~Pa7O%S8oDq["#}c:}.Oi +%%%9;i;}:,a%$fL]RQJGfwVv[wEZA8 G]X;CkKv,x +000=TcT~wcg0|>B7u8P_>m@IBUFe,74ZU% EU=.fd +WWW>TMTbRXcWo=5G\f/I=:D xw;)=0VKw GuwQ +ttt^{H{D "Ztq+*L8!@F+y` Mmzpdn!X;fOHmPfB~ +)))@3M3'B@M)^f?{lqPUfh5-I<1K %b!R<(83U]k1N|^ +888AKCK[lCR8(`v .Gy `N]t,Q[4~8G/t=% +KKKg616L!ezKdP lQ|[~Pa7f%f8oDq["&ic +%%%9;,;}(,,%$fL]RQJGfwVv[!EZR8 G!g; +000=TcT~cnn0|>B7u8P_>m@CBCFe,74ZC% +WWW>TZTbc^ZWo=5G\f/I=:D x`;)n0VKw G +ttt^{l{DNGltq+*L8!@F+y`mMyzp*n!Xm@IB Fe23j2bP& U +WWWXTMMTb@F+y` Ma&_lNqtRs ZH +HHH~p p4fy5HOARoYq+dAbdMX|>3U]k1N|^);:C|z +888AK-K["l^8(`v .Gy `N]Q,Q[4$8G/!T%`!V9Tt +KKKg616L1ssKdP lQ|[~Pa7f%f8oDq["fuc:S.S # +%KraCZC~gwCbC;8{ y+#wB; +00HX9?0T0g +EE1jo\HyIu)u5 +tt4-oQg02)3); +88SYwgM:UK6K+ +:`|N%;%}aC%x%$7 cAT0{n5RK4jNAL$ +CCtSauCZCw_ +000=TgT~pnp0|>B7u8P_>m@IBCFey74Z.N +WWW>TMTbR>^Wo=5G\f/I=:D x`;)=0VK5`G +ttt^{l{DGRNtq+*L8!@F+y` Myzp*n!X :O +)))@3M3'M|m)^f?{lqPUfh5"I"1K %b!-@( +```T4!4R;=t`%s*(2g\$se)1H!p6t2nYr+d +:::ioOoYO}#:cA~b!^aDA\.|*|^;G7c-iC$ +CCC,Z_Z~XkvC;|2rf&?A|P#c}n:TZ.how]| +EEEde e^UUIE 6&?P*r,6[6&D&;TCP+LX&o +uuu&)5)[`w5uG$Xqvgd=$EkNmJV{3a&_JNq +HHHmpB:p4BfHOd%+dAbdmXM>3Ub]k1;M^ +88cdY2p:jK6K1 +:::foOOoYSv:cD@aDA\.i*,^;1/N1ARL,|$ +CCC!ZvvZ~w]C;A-?A|P#c}g:TXz9XKuBg<| +EEECeIIe^fNE ,0r,6[6MDZ;TKYBK0\5ZXo +uuu`) )[LjuG=Bd=$EkHmlV{BCiBo8*lJq +HH{g{D=0d8K8- +```= +KKKs +:::} +%%%i +CCd/X8?N}EeEI +WWW&T3U]k1;C^ +888AK-K[-CC8(`v .Gy `N]Q,Q[4$8G/S5% +KKKg6+6LfggKdP lQ|[~Pa7O%f8oeq["Sfc +%%%9;,;}|i|%$fL]RQJGfwVk[!EZR8 G]]; +000nT3iT~3i0|_UP_>m@UBIFe,074Z . +WW7Byv7*ct{tH +HHHyp p4BmHOd%+dAbdMX;>3 -2 Zl?;;^ +888"K--K[^<8( Wy `N]t,![4wWxwi2*!!% +KKKg6+6Lfr1KdP lQ|[~Pa7O%f8oeq["&&c +%%%|;ii;}{C%$G+JGfwVv[_EZS4aSyf2__; +00(N?hoHBWTWM +uuuw +tttN +HHHB +)))| +88SYwgM:UK6K1 +:::}oSuoYSu:cD@aDA\.C*i^;G+7c-,a$%{?:~i +CCC,ZvZ~]xxC;|2rf&?A|P#c}<:T_.hon<|0gbi

X +uuu&) )[ 55uG$Xqvgd=$EkJmJV{Fa&_R"qtRsJ^J +HTg2)3)'NB)8)^]tkZYS|%^ +88{wdU8K8C +``{x:Q{`C:o:& +%% rrT/d90T0g +EEkoKf y{u)u5 +t\-SHpH4ffHGHOn.!i-,yVCYTwlSiRO +))W 2r)3)@ +888AKCK[7"<8(`v .Gy `N]Q,=[4~8G/U=% +KKKg616L!&+KdP lQ|[~Pa7f%}8oDq["f&c +%%%9;,;}aC~%$fL]RQJGfwV![!EZR8 G]k; +000=TcT~ccn0|>B7u8P_>m@CBCFe,74ZN% +WWW>TZTb-X^Wo=5G\f/I=:D`x`;)n0VK `G +ttt^{l{DJ ^tq+*L8!@F+y`mMyzp*n!Xf5O +)))m3KC3'm;)^UbPUfh5m@CB Fe23j2bP& I +WWWXTMMTbm@UBIFe,074Z % Ef=Ndd +WWW>TMTbXRZWo=5G\f/I=:D`xw;)=0VK`5GuLQL L +ttt^{H{DHHNtq+*L8!@F+y`yMyzpdn!X;:OHBPBfB +)0=d8K8[RA8s8(%VbQm4-|( +``mwxM`4`! +KK3c`!`|`%;%, +CC=/7RN5jEeE +WW1ybgS*At{tl +HTg2)3)'NC)8)^]tkZYSM%$l0Wp2Z?^ +88{wdU8K8A +```T4!4RU!;`%s*(2g\$se)!Hsp6t2nYsed +:::ioOoYfOi:cA~b!^aDA\.|*C^;G7c-C9$ +CCC,Z_Z~g_]C;|2rf&?A|P#<}<:TZ.honp| +EEEdeIe^I dE 6&?P*r,6[6XDX;TIP+L&Xo +uuu&)5)[ 5\uG$Xqvgd=$EkJmJV{3a&_JJq +HHH~p3x]k1|z^ +888> +uuu&) )[` &uG$Xqvgd=$EkJmNV{Fa&_N^qtlsZJG +HHH~p p4 <~HOARoYq+dAbd|X|>3U]k1m|^);:C|z +80Yx`4`R5;`Y`%8fGi)@Uo% +KKG9cmK6K+ +::dp|RKrdCZC_ +00(N?hoHBWTWZ +uuI*B!n-/HpH< +)0=d8K8[AC8s8(%VbQm47|M.0{DdQv( +``mwxM`4`T +KKKg6+6L&11KdP lQ|[~Pa7f%}8oeq["#Oc +%%%9;i;}||,%$fL]RQJGfwV![kEZA8 Gw_; +000=TgT~]cg0|>B7u8P_>m@CBCFey74Z.I +WWW>TMTbMm@CB Fe23j2bP& C +WWWXTMMTb^WoI_/I=:D`x5;)bJkb2vX5`G +tttJ{HH{DGtqF>@F+y`yM3Ub]k1;m^ +888AKCK[RCA8(`v .Gy `N]Q,Q[4~8G/QS% +KKKg6+6Le+1KdP lQ|[~Pa7O%f8oeq["O&c +%%%9;i;}a,C%$fL]RQJGfwVv[!EZA8 Gkg; +00(9NP5o1WTWM +uuu`) )[&uG=Bd=$EkJmlV{BCiBo8*lRq +HHH~p3x]k1;B^ +888"K--K[A8( Wy `N]Q,![4wWxwi2*!S% +KKK!6116LgKd~.[~Pa7f%&8o*Vp*9!~&Sc +%% rrT/d90T0c +EEEU +WWW< +uuuw +tttJ +HH?g qr=T8K8- +```=4S94R=5`%$b\$se)!H1p6~.2nY+sdKzS+&s +:::ioOoY#&}:cA~b!^aDA\.i*|^;G7c-Ca$%{?a~a +CCC,ZvZ~v!xC;|2rf&?A|P#<}<:T_.howw|0gbi

3x]k1K@^ +888AK-K[-^l8(`v .Gy `N]Q,Q[4$8G/QU% +KKKg616L1!zKdP lQ|[~Pa7f%f8oDq["Oic +%%%9;,;}:(:%$fL]RQJGfwV![!EZR8 Gwx; +000nT3iT~ni0|_UP_>m@CBIFe,074Z I +WWW>TZTbR>>Wo=5G\f/I=:D`x`;)n0VK5LG +ttt^{l{DZZ^tq+*L8!@F+y` Myzp*n!XmyO +)))@3M3'NKz)^f?{lqPUfh5-I"1K %b!-"( +``{x:Q{`C:o:O +%%%|;ii;}a%$G+JGfwV![_EZS4aSyf2__; +000=TgT~wp<0|>B7u8P_>m@CBCFey74Zfd +WWWXTMMTb-WoI_/I=:D`x5;)bJkb2vX55G +tttJ{HH{D"tqF>@F+y`yMa&_lHqtRsl N +HHH~p p4 B5HOARoYq+dAbd|X|>3U]k1|B^);:C|z +888AK-K[R^l8(`v .Gy `N]t,Q[4$8G/tQ%`SVQ5t +KKKg616L1!zKdP lQ|[~Pa7f%f8oDq["Oic:&.uf +%KraCZC~,]CbC;8{ yA-y:?>G; +00HX9?0T0g +EE1jo\HyIu)u5 +tt4-oQg02)3); +88SYwgM:UK6K+ +:`|N%;%}9a%x%$7 cAG+A"Jq-5RK4jNAL$ +CCtSauCZCw, +000=TgT~3gin0|>B7u8P_>m@NBUFey74ZU. +WWW>TZTb<&Wo=5G\f/I=:DLxw;)n0VKLwG +tttH{RG{DRtqF>@F+y`3U]k1|K^ +888AKCK[^Cl<8(`v .Gy `N]U,=[4~8G/Q5% +KKKg616L&1sKdP lQ|[~Pa7O%}8oDq["f&c +%%%9;,;}99{%$fL]RQJGfwVv[kEZR8 G_!; +000=TgT~==<0|>B7u8P_>m@IBUFey74Z N +WWW>TMTbRX^Wo=5G\f/I=:D xw;)=0VKw&G +ttt^{H{D ^Rtq+*L8!@F+y` Mmzpdn!X;5O +)))@3M3'B@B)^f?{lqPUfh5-I<1K %b!R"( +``{x:Q{`C:o: +%%%|;ii;}C,%$G+JGfwV][_EZS4aSyf2_k; +000m@NB Fe23j2bP& U +WWWXTMMTb&ZWoI_/I=:Djx5;)bJkb2vX5wG +ttt^{l{D^l^tq+*L8!@F+y` MBzp*n!Xy;O +)))@3;3'@;@)^f?{lqPUfh5-I^1KL%b!"7( +```Q4tt4R=!`%$b\$se)&H+p69Vc9AQ +sd +:::io&oYS&u}:cA~b!^aDA\.:*C^;M7c-Ca$ +CCC,Z_Z~,,!C;|2rf&?A|P#c}n:TZ.hogw| +EEEde e^ddCE 6&?P*r,6[6MD&;TCP+LZRo +uu'*LO-TSHpH5 +)))| +888< +```Q +KKKz +:::S +%%%C +CCC! +0003 +EEEf +WW1ybgS*At{tG +HHH pB5p4BHOd%+dAbd;Xm>3Gq-R]k1;K^)K:|B +888AK-K[7^^8(`v .Gy `N]t,S[4$8G/5Q%`!V9Tt +KKKg616L&+gKdP lQ|[~Pa7O%S8oDq["v c:S.f#O +%%%9;i;}:iC%$fL]RQJGfwVv[kEZA8 G!_;CwKwxg +000=TcT~wB7u8P_>m@IBUFe,74ZUd Ef=daa +WWW>TMTbR>B7u8P_>m@CBCFe(oK4P+LZ@F+y`3t-R]k1;C^ +888AK^7K[^C@8(`v .Gy `N]Q,Q[4fWk8G/S=% +KK3c`!`|`%;%: +CCC,ZvwZ~w!C;|2rf&?A|P#<}<:TXz9XK8zvN5*jk3 f +WWW>TM3 -2 Zq-R=0GdS_C^( +```T4tS4RSQ`%s*(2g\$se)!H!p69Vc9A|VT``^pCV&Sc +%%%9;i{;}{|%$fL]RQJGfwV![!EZS4aSy&4}/d89+zg3| +EE1oG4y7ku)uj +tttR +HHHB +)))K +888^ +```S +KKj`*^B|\%;%: +CCC,Zw]Z~w_XC;|2rf&?A|P#<}<:T*zv.ho3n|0gbngw +EEEdefNe^f IE 6&?P*r,6[6XDX;T{Y!P+LZcoWZJ&ZR +uuu&)Lj)[\&uG$Xqvgd=$EkJmJV{9C?a&_lRqtlsNl +HHH~pB;p4B<5HOARoYq+dAbd|X|>3t-R]k1K|^);:m;B +888AK^7K[l@8(`v .Gy `N]Q,Q[4fWk8G/!=%`!V=!U +K{`p:o:Yi :s:cqM[9D@9gaX"6!`RKp^V2^pCV9~Kp^V299pR9'-fJ6&9^~r)~Kp9"S9TSv9gDj9gDjc +%%41N[%;%~ +CCC,Zw]Z~w_,C;|2rf&?A|P#<}<:T*zv.ho33| +EEEdefNe^fffE 6&?P*r,6[6XDX;T{Y!P+L3t-R]k1;B^ +888AK^7K[^^C8(`v .Gy `N]Q,Q[4fWk8G/St% +KKKg6z&6Lz++KdP lQ|[~Pa7f%f8oMV2q["&Oc +%%%9;{:;}{,a%$fL]RQJGfwV![!EZ{4}8 Gw_; +000=T3wT~3gw0|>B7u8P_>m@CBCFew3J74Z a +WW7Byv7*ct{tZ +HHH~p Bp4BmHOARoYq+dAbd|X|>3 -2 Zq-R=0GdS_CC( +```T4tS4RS=`%s*(2g\$se)!H!p69Vc9A|VT``^pCV&&c +%%%9;i{;}{C%$fL]RQJGfwV![!EZS4aSy&4}/d89+zgg| +EEEdeIfe^fUE 6&?P*r,6[6XDX;TKYBK0fY!y7gkIJ55G +ttt^{HR{DRNtq+*L8!@F+y`yMyzpW#SWiq#0g0q2&-;;^ +888AK-^K[^<8(`v .Gy `N]Q,Q[4wWxwigWk:{|cjV++d +:::ioOSoYS}:cA~b!^aDA\.|*|^;1/N1AQ/Brp&ad4__; +000=Tc3T~3n0|>B7u8P_>m@CBCFe23j2b*3JoHfB1YZZo +uu'*LO-TSHpH: +)))K +888^ +```S +KKKz +:::S +%%%{ +CCCw +0003 +EEkoKf y{u)uN +ttt^{R {DRl tq+*L8!@F+y`yMyzp.#0n!X<5OH3t-R]k1KK^);:m;B +80Yx`4`R9!`Y`%8fGisf)i~)/% +KKG9cmK6K+ +::dp|RKrdCZC_ +00(N?hoHBWTWZ +uuI*B!n-/HpH< +)0=d8K8[@^8s8(%VbQ`VmQLm!M.0{DdQv( +``mwxM`4`t= +KKKg6+6Lz+&gKdP lQ|[~Pa7v%}8oeq["&Sc +%%%{;,;}CC%$G+JGfwV,[kEZR8 Gkk; +0003T3pT~g0|_UP_>m@dBUFe-*3J74Z +WWW>TZTbXWo=5G\f/I=:Djxw;)n0VKL&G +ttt^{H{D^"^tq+*L8!@F+y`;Mmzpdn!XfyO +)))@3;3'KKNz)^f?{lqPUfh57I"1KL%b!^A( +```T4t4RT9;`%s*(2g\$se)&H!p6~2nYszd +:::ioOoYu&i:cA~b!^aDA\.:*|^;G7c-|($ +CCC,Z_Z~ww,wC;|2rf&?A|P#w}<:TZ.ho3p| +EEEUef%e^IaE ,0r,6[6RDM;TI_P+LZ3x]k1BB^ +888m@IBIFe,074Z d +WWW&T3x]k1m;^ +888AKCK["R"8(`v .Gy `N]=,Q[4~8G/TU% +KKKs6zf6Lz&Kd~.[~Pa7}%O8oD@q["&fc +%%%C;{~;}{9%$G+JGfwVk[vEZA-8 G_]; +000nT3iT~3p0|_UP_>m@UBIFe,074Z d +WWW&T@F+y`mM zpd%n!XBBO +)))@3;3'KBK)^f?{lqPUfh5^I"1KL%b!77( +```=4S94R=`%$b\$se)zH1p6~.2nY+sd +:::io&oYS&v :cA~b!^aDA\.:*C^;M7c-,|$ +CCC,Z_Z~vX]C;|2rf&?A|P#<}n:TZ.hogw| +EEEdeIe^CCNE 6&?P*r,6[6XD&;TIP+L3U]k1Kz^ +888AKCK[lR"8(`v .Gy `N]U,S[4~8G/!Q% +KKKg6+6L!e&KdP lQ|[~Pa7f%S8oeq["SSc +%%%9;i;}|{(%$fL]RQJGfwV![wEZA8 Gg!; +000=TcT~n]=0|>B7u8P_>m@CBfFe,74Zff +WW7Byv7*ct{tN" +HHHyp p4B:HOd%+dAbdBX;>3 -2 Zl?;;^ +888"K--K[^@8( Wy `N]U,![4wWxwi2*!!% +KKK!6116LzfKd~.[~Pa7v%&8o*Vp*9!~&&c +%%%9;,;}{{a(%$fL]RQJGfwV][!EZR8 Gw,; +000m@NB Fe23j2bP& +WWWXTMMTb3x]k1BB^ +888AKCK[R"^8(`v .Gy `N]Q,Q[4~8G/UU% +KKK!6116LzfKd~.[~Pa7v%&8o*Vp*9!~&&c +%%%9;,;}|a|%$fL]RQJGfwVk[!EZR8 G,]; +000=TgT~<]<0|>B7u8P_>m@UBCFey74ZdN +WWW>TZTbX-XWo=5G\f/I=:Dwx`;)n0VK&jG +ttt^{l{DJ"Jtq+*L8!@F+y`mMyzp*n!X~;O +)))@3;3'KKNB)^f?{lqPUfh57I"1KL%b!^"( +```Q4tt4RS9`%$b\$se)&H+p69Vc9AQ ++d +:::io&oYOuv:cA~b!^aDA\.|*C^;M7c-,:$ +CCC,Z_Z~vX]C;|2rf&?A|P#<}n:TZ.hogw| +EEECeIIe^f%E ,0r,6[6RDZ;TKYBK0\5ZZo +uuu&)5)[`\juG$Xqvgd=$EkJmRV{3a&_RRq +HH{g{D=0d8K8m@IBIFe,074Z f Ef=Ndd +WWW&T@F+y` M zpd%n!X<;OHBP;~~ +)))m3KC3'M|)^UbPUfh5-I-1K W%b!CA(8^n7AA +```=4S94RtU`%$b\$se)1H1p6~.2nY+edKzS&gg +:::}oSuoYO :cD@aDA\.:*i^;G+7c-,{$%{?,:C +CCCkZwXZ~w,C;A-?A|P#n}c:T_U.hogw|0nb3oW&Ja&_lGqtNsRJH +HHHmpB:p4myHOd%+dAbdmXM>3Ub]k1KK^)m:K|M +888m@CBIFe,074Z d Ef=N%I +WWW&T@F+y`BM zpd%n!X< +uuu&) )[` LuG$Xqvgd=$EkJmNV{Fa&_NRqtRsZ +HHH~p p4yy5HOARoYq+dAbd|Xm>3U]k1Kz^)K:|@K +888AK-K[B7u8P_>m@NBCFe(oK4P+LZZo +uuu&)L5)[w uG$Xqvgd=$Ek mJV{@8C-.#0n!X<@F+y`~MmzpW#SWiYRioq#0<B7u8P_>m@NBUFerP3o{Y!P+LZZoWB7u8P_>m@NBCFew3J74Z N +WW7Byv7*ct{tN +HHH~p Bp4m HOARoYq+dAbdBX|>3 -2 Zq-R=0GdS_CC( +```T4tS4R=t`%s*(2g\$se)&H!p69Vc9A|VT``^pCV&&c +%% rrT/d90T0n +EEEf +WWW< +uuI*B!n-/HpHm +)))@3KB3'Kz@)^f?{lqPUfh57I"1KV_j%b!C7(8CnB7u8P_>m@NBUFew3J74ZfN +WW7Byv7*ct{tR +HHH~p Bp4mmHOARoYq+dAbdBXm>3 -2 Zq-R=0GdS_CC( +``{:l^``p:o:S +%%%{ +CCd/X8?N}EeEf +WWW>TWdWoP{+0={ 0/:G +tt|Bint{tl +HH{Sgl0=S8K8C +``{:l^``p:o:& +%%`rS&u/)0T0g +E5oBWTWbccWdWoP{+0={ 0%CLo +uu1bkSu)u5 +tt4i-YTg&)3); +88cY(v:{cK6K+ +::C|1Q[r%CZC_ +0dNjEeE^%aE\E 7w4b6wnb$yZDP5R)jb& +WWwKB WTW> +uuu5)5)[L5`uG=Bd=$Ek^mJV{3a&_l^q +HHHBp3x]k1MN^ +888^K^lK[^8( Wy `N]T,=[4B7u8P_>m@fBCFey74ZdN +WWW&TB7u8P_>m@CBUFe(oK4P+LZ@F+y`~MmzpW#SWiYRioq#03t-R]k1KB^ +88cdY2p:jK6K& +:::ioOSoYSu:cA~b!^aDA\.i*|^;1/N1AQ/Brp&ad4__; +000=Tc3T~3i0|>B7u8P_>m@IBCFe23j2b*3JoHfB1YZZo +uuu&) L)[LNuG$Xqvgd=$EkHmJV{BCiBo!C?-TqS?#<3t-R]k1K;^);:m;B +80Yx`4`R;=`Y`%8fGisf)i1~/z2pm-xgWkgx|Wi*-xgWki/SiD=5i$Xhihff% +KKG9cmK6K! +:::ioSvoYu}:cA~b!^aDA\.|*C^; /B7c-,C$ +CCC,Zw]Z~XgC;|2rf&?A|P#<}n:T*zv.hog]| +EEEdefNe^%dE 6&?P*r,6[6XD&;T{Y!P+LZ>o +uu'k*8\-?HpHy +)))@3MK3'KK)^f?{lqPUfh5"I<1Kw_dwQG_jYpgx|W!S% +KKKg61z6LzzKdP lQ|[~Pa7f%}8o*Vp*9^V2|KQN`/,{$ +CCC,ZvwZ~wwC;|2rf&?A|P#<}n:TXz9XK8zvN5*jk3 f +WW7yq+*\it{tJ +HHHB +)))K +888^ +``|:9|m`l:o:f +%%%9;{:;}~9%$fL]RQJGfwV![kEZ{4}8 G_,;C_Kk_] +000=T3wT~i]0|>B7u8P_>m@CBUFew3J74Z . E =U N +WWW>T3x]k1KB^ +888AKCK[@| +EER2j]EeE +WW7Byv7*ct{tl +HH{g{D=0d8K8C +``|:9|m`l:o:& +%KraCZC~xxCbC;:"y|efpt9ay2; +00HX9?0T0n +EEEde e^dUIE 6&?P*r,6[6MD<;TCP+LR&o +uuu&) )[j5 uG$Xqvgd=$EkHmRV{Fa&_ "q +HH{Sgl0=S8K8^ +```Q4tt4RS5`%$b\$se)1H+p69Vc9AQ +1d +::d|]VrpaCZCw +000n +EEkoKf y{u)uL +ttt^{H{D lHtq+*L8!@F+y` MBzpdn!X;fOHBPyy: +)0=d8K8[^CC8s8(r;QL( +``mwxM`4`! +KK3c`!`|`%;%, +CC=/7RN5jEeE +WW1ybgS*At{tl +HTg2)3)'K;K)8)^"+ZxbPZy^ +88{wdU8K8C +``{x:Q{`C:o:& +%% rrT/d90T0g +EEkoKf y{u)u5 +t\-SHpH4B3x]k1B@^ +888AKCK[AC^8(`v .Gy `N]t,S[4~8G/=;% +KKKg616L1fzKdP lQ|[~Pa7O%S8oDq["ffc +%% Nrfp/+0T03 +EEEIeIIe^CE ,0r,6[6ZD&;TKYBK0\5ZXo +uu'*LO-TSHpHB +)))M +88SYwgM:UK6Kz +:::ioOoYOuS:cA~b!^aDA\.i*{^;G7c-||$%C?:iC +Cp/90T0~3gw060|1tKZ/udH;9KB| +EER2j]EeEI +WWW>TZTbm@ BUFe23j2bP& +WW7yq+*\it{tR +HHH +))&=wGUYF`4`S +KKKg616L&+eKdP lQ|[~Pa7O%S8oDq["#Sc:}.vO} +%KraCZC~w_gCbC;:"y:P>| +EER2j]EeE +WW7Byv7*ct{tl +HH{g{D=0d8K8C +``|:9|m`l:o:& +%KraCZC~w_,CbC;:"y:P>/udH;9KB| +EER2j]EeEC +WWW>TZTb-B7u8P_>m@IBUFe,74ZUI +WW7Byv7*ct{tR +HHHyp p4ByHOd%+dAbdMX;>3 -2 Zl?;K^ +88cY(v:{cK6Kz +:::} +%%`rS&u/)0T03 +EEEdeIe^NC.E 6&?P*r,6[6MD&;TIP+L&MoW..q +HHwWSvHpH< +))s2=.0Y|`4`! +KK3`br|KN%;%, +CCd/X8?N}EeE +WHyku)u[LLLucuGO-7g$Xb{2KL2}Lj2f<3"l0R]k1`s=DTv^l( +```T4QU4R=SQ`%s*(2g\$se)!H!p6_Q{T2nYJ3`Kl~}Sc +%%%9;|:;}CC{%$fL]RQJGfwV![!EZ:fp}8 G'=/;)Bnp| +EEEdeCNe^U NE 6&?P*r,6[6XDX;Tl\H!P+L(7yM{XL`G +tt4i-YTg&)3)M +888AK-"K[^"8(`v .Gy `N]Q,Q[4wWxwi{#pggx|W!S% +KKKg61!6Lz!KdP lQ|[~Pa7f%f8o*Vp*9d0`^^pCV&Sc +%%%9;i|;}{|%$fL]RQJGfwV![!EZS4aSy=Mp&&ad4_w; +000=TcB7u8P_>m@CBCFe23j2b1X5**jk3 f +WW7yq+*\it{tH +HHHB +)))K +888^ +```S +KKj`*^B|\%;%i +CCC,Z!]Z~kwwC;|2rf&?A|P#<}<:T1udv.ho\(N)}&fa E +WWW>TXRTb&3"l0R]k1`s=DTv3"l0R]k1`s=DTv^"( +``{x:Q{`C:o:S +%%%9;i|;}{(%$fL]RQJGfwVv[!EZS4aSy=Mp&&ad4_w; +00(N?hoHBWTW< +uuuL +ttc-Wqvg.)3)K +888AK"7K["C^8(`v .Gy `N]t,Q[4I2pk8G/E{: U z!dK+ +:`|N%;%}{{i%x%$"oKQfL1\A-{A6C{Ag $ +CCtSauCZCk +000=TB7u8P_>m@NBCFe(P5J74Zx1oqs5<TXRTb<>3"l0R]k1`s=DTvCl( +```T4QU4RSTU`%s*(2g\$se)!Hsp6_Q{T2nYJ3`Kl~Svc +%%%9;|:;}{a:%$fL]RQJGfwV![kEZ:fp}8 G'=/;)Bgw| +EE1jo\HyIu)uj +ttt^{HJ{DRRtq+*L8!@F+y`yMmzpW#SWi{ITqqS?#TXRTb<>3"l0R]k1`s=DTvCl(8C +```T4QU4RSTU`%s*(2g\$se)!Hsp6_Q{T2nYJ3`Kl~Svc:& +%%%9;|:;}{a:%$fL]RQJGfwV![kEZ:fp}8 G'=/;)Bgw|0g +E5oBWTWb<<>WdWol*HfCy'*io_RoMR o,5Sq +HHwWSvHpH +)))@3|B3'mK;)^f?{lqPUfh5"I"1Kr.0j%b!6cY-F*S9% +KKKg6!&6LszsKdP lQ|[~Pa7f%f8og!`2q["Wd|j\LC,$ +CCC,Z!]Z~kk_C;|2rf&?A|P#<}<:T1udv.ho\(N)}&U% +WWW>TXRTb&ZMWo=5G\f/I=:D`x`;)Ov7R0VKW'*1A*RNq +HH{Sgl0=S8K8- +```T4tQ4RS=`%s*(2g\$se)!H!p69Vc9A38{||cjV++d +:::ioOfoYS}:cA~b!^aDA\.|*|^;1/N1A oKQQN`/,,$ +CCC,Zv!Z~wkC;|2rf&?A|P#<}<:TXz9XK(kd889+zgg| +EEEdeICe^fUE 6&?P*r,6[6XDX;TKYBK07*HffB1YZZo +uu'*LO-TSHpH +)))K +888^ +```S +KKKz +::C|1Q[r%CZCv +000=TB7u8P_>m@CBCFe(P5J74Zx1oqs5B7u8P_>m@CBfFe23j2b1X5**jk3 +WWW>TMXTbcWo=5G\f/I=:D`xL;)bJkb2'-7ggkIJ55G +tt4-oQg02)3)m +888^ +```S +KKj`*^B|\%;%C +CCC,Z!]Z~w]XC;|2rf&?A|P#<}3:T1udv.ho\(N)}&C E +WWW>TXRTb3 -2 Zsw0qq2&-;;^ +88cY(v:{cK6Ks +:::S +%%%{ +CCd/X8?N}EeEU +WWW>TXRTbX^MWo=5G\f/I=:Djx`;)Ov7R0VKW'*1A*Rlqtl +HHH~py;p4 3"l0R]k1`s=DTv^@(8C +`p:cK6KLzszKuKd_8{|t`d|NA-{A6CiAbdT$ +CCtSauCZCw +000=TB7u8P_>m@NBUFe(P5J74Zx1oqs5XZo +uu'k*8\-?HpHB +)))@3M|3'mm)^f?{lqPUfh57I<1Kw_dwQcH0GGdS_CC( +``{:l^``p:o:S +%%%{ +CCd/X8?N}EeEf +WWW>TXRTbXc&Wo=5G\f/I=:Djxw;)Ov7R0VKW'*1A*Jlqtl +HTg2)3)'Kmm)8)^"w0qx=cYxi/SiD=5iB7u8P_>m@CBUFe(P5J74Zx1oqs5TMXTbB7u8P_>m@CBUFe(P5J74Zx1oqs53x]k1|z^ +888^KCK[7@8( Wy `N]T,=[4~8G/U9% +KKKz6zf6LfKd~.[~Pa7i%}8oD@q["&uc +%% Nrfp/+0T03 +EEEdeC.e^f %E 6&?P*r,6[6XDX;TKYBK07Y\fyLwG +tt4-oQg02)3)K +8887 +``|:9|m`l:o:S +%%%{;{~;}~%$G+JGfwV,[kEZA-8 G_X;CkK!X +0dNjEeE^fUaE\E }o)fY1Ho +uu1bkSu)u5 +tt4i-YTg&)3); +88cY(v:{cK6K+ +::C|1Q[r%CZC_ +0dNjEeE^fC E\E }o)5yG +tt|Bint{tl +HH{Sgl0=S8K8C +``{:l^``p:o:& +%%`rS&u/)0T0g +E5oBWTWbB7u8P_>m@NBCFey74ZaC +WWW>TZTb--cWo=5G\f/I=:D`x`;)n0VK\wG +tttN{RZ{DJltqF>@F+y`yM zpd%n!XB7u8P_>m@IBCFe074Z +WWW>TZTb<<>&Wo=5G\f/I=:Djx`;)n0VKw5G +ttt^{l{D""Rtq+*L8!@F+y`yMyzp*n!X:;O +)))m3KC3'|m)^UbPUfh5"I-1K W%b!C@( +``{x:Q{`C:o:S +%%%9;|a;}{ii%$fL]RQJGfwVv[!EZS4aSy=4f&/gg| +EE1oG4y7ku)uL +tttH +HH?g qr=T8K8^ +```=4S94RQ=`%$b\$se)!H1p6~.2nY+fdKzSfr& +:`|N%;%}{i:%x%$/Q\A\1N1ALjNAv0{n5Hr/)Nkb*&h~&)j +WWwKB WTWZ +uu'k*8\-?HpH< +))s= fYpx`4`! +KKj`*^B|\%;%, +Cp/90T0~3c]060|z8)K)X9XKB;9KA4n | +EER2j]EeEC +WWW>TXTbMM^Wo=5G\f/I=:D x`;)B0VKL&G +ttt^{l{DGlJtq+*L8!@F+y` Myzp*n!Xy5O +)))m3KC3'|N)^UbPUfh5-I-1K W%b!CC( +``{x:Q{`C:o:S +%%%9;|a;}{i(%$fL]RQJGfwVv[!EZS4aSy=4f&/gw| +EE1oG4y7ku)uL +tttJ +HH?g qr=T8K8^ +```=4S94RQ5`%$b\$se)1H1p6~.2nY++dKzS!!! +:`|N%;%}{i9%x%$/Q\A\1N1ALjNAv0Cn5Hr/)Nkb*&h~&)j +WWwKB WTWZ +uu'k*8\-?HpH< +))s= fYpx`4`! +KKj`*^B|\%;%, +Cp/90T0~3ci060|z8)K)X9XKB;9KA4< | +EER2j]EeEI +WWW>TXTb&-B7u8P_>m@CBUFe23j2b13P*oZ>o +uu'*LO-TSHpHB +)))M +88SYwgM:UK6Kz +:::}oSuoYfu:cD@aDA\.i*i^;G+7c-,C$%C?,C| +Cp/90T0~3cp060|z8)K)X9XKB;9KA4c | +EER2j]EeEI +WWW>TXTb&RcWo=5G\f/I=:D`xw;)B0VKLNG +ttt^{l{DZlltq+*L8!@F+y` Mmzp*n!XymO +)))@3;3'CzN)^f?{lqPUfh5-I"1KL%b!"<( +```=4S94Rt!`%$b\$se)1H1p6~.2nY+1d +::dp|RKrdCZCw +000=T<]T~i]0|>B7u8P_>m@CBUFe23j2b13P*oZ-o +uu'*LO-TSHpHB +)))M +88SYwgM:UK6Kz +:::}oSuoYO&:cD@aDA\.i*i^;G+7c-,i$%C?,C| +Cp/90T0~3wg060|z8)K)X9XKB;9KA4c /GNosyI2gX+!XMkG +tt|Bint{tl +HH{Sgl0=S8K8C +``{:l^``p:o:& +%%`rS&u/)0T0g +E5oBWTWbTX-Tbc&Wo=5G\f/I=:D`xw;)bJkb2'Jvg*lNq +HH{g{D=0d8K8^ +```t +KKj`*^B|\%;%{ +CCCkZwXZ~vkC;A-?A|P#c}c:T_U.hog]|0nbgn< +E5oBWTWbB7u8P_>m@IBCFe23j2b13P*oZ-o +uu'*LO-TSHpHB +)))| +88SYwgM:UK6Kz +:::}oSuoYOO:cD@aDA\.i*i^;G+7c-,~$%{?||| +Cp/90T0~3w<060|z8)K)X9XKB;9KA4= | +EER2j]EeEC +WWW>TXTbM-&Wo=5G\f/I=:D x`;)B0VK`5G +ttt^{l{DRNNRtq+*L8!@F+y`;Myzp*n!Xf5O +)))m3KC3'MC)^UbPUfh57I-1K W%b!CC( +``{x:Q{`C:o:S +%%%9;|a;}{:i%$fL]RQJGfwVv[!EZS4aSy=4f&/3g| +EE1oG4y7ku)uL +tttJ +HH?g qr=T8K8^ +```=4S94Rt9`%$b\$se)&H1p6~.2nY++dKzS!!! +:`|N%;%}{:i%x%$/Q\A\1N1ALjNAv09n5Hr/)Nkb*&h~&)j +WWwKB WTWZ +uu'k*8\-?HpH< +))s= fYpx`4`! +KKj`*^B|\%;%, +Cp/90T0~3ww060|z8)K+N1oB0x3Z0f54j5qBo +uu1bkSu)u` +ttt^{J{DJRltq+*L8!@F+y`yMyzp%n!XmmO +)))@3@3'mB)^f?{lqPUfh5"I"1KVdS_%b!C^( +```T4;4RSQ`%s*(2g\$se)!H!p6[QV`MV2\K7c-,{$ +CC=a/udNkEeEf +WWW>TX-Tb- +u7*it{tDR "t/tqC!Aoc-{g2Z<$KZq?Du?p2^ +88{wdU8K8C +``{x:Q{`C:o:& +%% rrT/d90T0g +EEkoKf y{u)u5 +t\-SHpH4B;~HGHO#q/i?gs=dQ)M)( +``mwxM`4`t +KKKg6!6LsezKdP lQ|[~Pa7f%f8o@q["&fc +%%%9;,;}~~i%$fL]RQJGfwVv[!EZR8 Gk_; +000=TgT~<=<0|>B7u8P_>m@UBCFey74Z%N +WWW&T@F+y`mM zpd%n!X<B7u8P_>m@IBfFe,74Z. +WW7Byv7*ct{tR +HHH~pyfp4~5HOARoYq+dAbd|XK>3 -2 Zs-lq=^7( +``{:l^``p:o:S +%%%| +CCd/X8?N}EeEf +WWW>TMTbRZcWo=5G\f/I=:D xL;)=0VK 5GuLQ L\ +t\-SHpH4B;5HGHOQqli/WSWiRlS,m@IB Fe,074Z I Ef=CCC +WHyku)u[L 5ucuG+gM2{bkb2XMk.LlFw2gX+!XMkG +tt|Bint{tH +HHH~pyp4;5yHOARoYq+dAbdBX|>3b]k1K@^ +888AKCK[^^@l8(`v .Gy `N]U,Q[4~8G/QT% +KKKg6+6Lz+z1KdP lQ|[~Pa7v%S8oeq["vOc +%%%9;i;}:,:%$fL]RQJGfwVv[wEZA8 G],; +00(9NP5o1WTW< +uuu&)` )[L\&uG$Xqvgd=$Ek mJV{BCiBo4C8!-<;O +))s= fYpx`4`S +KKK1 +::C|1Q[r%CZCw +000=TcT~wgw0|>B7u8P_>m@IBfFe,74ZNd EU=Caf +WHyku)u[L LucuG+gM2{bkb2XMk.LlF`2gX+!XMkG +tt|Bint{tH +HHH~pyp4y:3b]k1MM^ +888AKCK[A7@8(`v .Gy `N]t,S[4~8G/95% +KKKg6+6LgssKdP lQ|[~Pa7O%S8oeq["v&c +%%%|;{~;}|,%$G+JGfwVv[_EZA-8 G_g; +00(9NP5o1WTW< +uuu&)` )[Lw uG$Xqvgd=$EkHmRV{BCiBo4C8!-B O +))s= fYpx`4`S +KKK1 +::C|1Q[r%CZCw +000m@IB Fe,074Z . Ef=%dI +WHyku)u[L wucuG+gM2{bkb2XMk.wlF 2gX+!XMkG +tt|Bint{tJ +HHH~pyp4;~;HOARoYq+dAbdBXm>3b]k1M@^ +888AKCK[^^-R8(`v .Gy `N]U,=[4~8G/;!% +KKKg616L&1!KdP lQ|[~Pa7O%}8oDq["fSc +%% Nrfp/+0T03 +EEEdeC.e^fafE 6&?P*r,6[6RD&;TKYBK07Y\fyLjG +tt4-oQg02)3)K +888" +``|:9|m`l:o:S +%%%9;i;}:i|%$fL]RQJGfwVv[kEZA8 G!w;CwKw]] +0dNjEeE^f.CE\E h*)b}2j2b&)j{UMDNb*&h~&)j +WWwKB WTWM +uuu&)`)[ 5&uG$Xqvgd=$EkHmNV{>a&_NJq +HHH~p3x]k1MM^ +888AKCK[A7<8(`v .Gy `N]t,S[4~8G/9!% +KKK!6zf6Ls1Kd~.[~Pa7O%&8oD@q["&&c +%% Nrfp/+0T03 +EEEdeC.e^fCNE 6&?P*r,6[6MD&;TKYBK07Y\fy5&G +tt4-oQg02)3)K +888- +``|:9|m`l:o:S +%%%|;{~;}Ci%$G+JGfwVv[_EZA-8 G__;CkK_k! +0dNjEeE^f.IE\E h*)b}2j2b&)j{CMD.b*&h~&)j +WWwKB WTWX +uuu&)`)[w \uG$Xqvgd=$EkJmNV{>a&_lGq +HHH~p3x]k1m|^ +888AK-K[7"A8(`v .Gy `N]t,=[4$8G/=U% +KK3c`!`|`%;%{ +CCC,Z!gZ~X!C;|2rf&?A|P#<}n:TXz9XK(zu8N C +WW7yq+*\it{tR +HHHy +))&=wGUYF`4`S +KKKg616L&!gKdP lQ|[~Pa7O%}8oDq["}vc:S.v +%KraCZC~wg]CbC;T&9y%SaSy29a#!Be,y&2TJ29a; +00HX9?0T0w +EEEdeCe^I IE 6&?P*r,6[6MD&;T_P+L&Zo +uuu&)5)[N5LuG$Xqvgd=$EkHmNV{3a&_JJq +HHH~p3x]k1MM^ +888AKCK[-R-8(`v .Gy `N]Q,S[4~8G/9!% +KKK!6zf6Ls+Kd~.[~Pa7f%&8oD@q["&uc +%% Nrfp/+0T03 +EEEdeC.e^fCIE 6&?P*r,6[6MD&;TKYBK07Y\fy5 G +tt4-oQg02)3)K +8887 +``|:9|m`l:o:S +%%%|;{~;}C,%$G+JGfwV![_EZA-8 G_X;CkK]vX +0dNjEeE^f..E\E h*)b}2j2b&)j{IMD%b*&h~&)j +WWwKB WTWX +uuu&)`)[wjjuG$Xqvgd=$EkJmNV{>a&_R q +HHH~p3x]k1|B^ +888AK-K[7Rl8(`v .Gy `N]t,=[4$8G/UT% +KK3c`!`|`%;%{ +CCC,Z!gZ~X]C;|2rf&?A|P#<}n:TXz9XK(zu8N N +WW7yq+*\it{tR +HHHy +))&=wGUYF`4`S +KKKg616L&reKdP lQ|[~Pa7O%}8oDq["vic:S.v +%KraCZC~wg,CbC;T&9y%SaSy29a#vBexy&2TJ29a; +00HX9?0T0w +EEEdeCe^IU%E 6&?P*r,6[6MD&;T_P+LMMo +uuu&)5)[N &uG$Xqvgd=$EkHmNV{3a&_^Gq +HHH~p3x]k1mB^ +888AKCK["l^8(`v .Gy `N]Q,S[4~8G/!T% +KKK!6zf6LzrKd~.[~Pa7f%&8oD@q["&Oc +%% Nrfp/+0T03 +EEEdeC.e^fIUE 6&?P*r,6[6MD&;TKYBK07Y\fyL G +tt4-oQg02)3)K +8887 +``|:9|m`l:o:S +%%%|;{~;}{a%$G+JGfwV![_EZA-8 G_v;CkKgg] +0dNjEeE^f.%E\E h*)b}2j2b&)j{NMDf b*&h~&)j +WWwKB WTWX +uuu&)`)[wjwuG$Xqvgd=$EkJmNV{>a&_RNq +HHH~p3x]k1M;^ +888AK-K[7A<8(`v .Gy `N]t,=[4$8G/5!% +KK3c`!`|`%;%{ +CCC,Z!gZ~XvC;|2rf&?A|P#<}n:TXz9XK(zu8N I +WW7yq+*\it{tR +HHHy +))&=wGUYF`4`S +KKKg616L&gsKdP lQ|[~Pa7O%}8oDq["#&c:S.#S +%KraCZC~wgxCbC;T&9y%SaSy29a#]Bewwy&2TJ29a; +00HX9?0T0w +EEEdeCe^ICfE 6&?P*r,6[6MD&;T_P+LM>o +uuu&)5)[Nj uG$Xqvgd=$EkHmNV{3a&_Z"q +HHH~p3x]k1B@^ +888AKCK[-<@8(`v .Gy `N]Q,S[4~8G/tt% +KKK!6zf6LzfKd~.[~Pa7f%&8oD@q["&#c +%% Nrfp/+0T03 +EEEdeC.e^fICE 6&?P*r,6[6MD&;TKYBK07Y\fyLjG +tt4-oQg02)3)K +8887 +``|:9|m`l:o:S +%%%|;{~;}{~%$G+JGfwV![_EZA-8 G_g;CkK]vX +0dNjEeE^fd E\E h*)b}2j2b&)j{.MDfUb*&h~&)j +WWwKB WTWX +uuu&)`)[L\NuG$Xqvgd=$EkJmRV{>a&_l"q +HHH~p3x]k1K;^ +888AK-K[-@C8(`v .Gy `N]t,S[4$8G/Q=% +KK3c`!`|`%;%{ +CCC,Z!gZ~ggC;|2rf&?A|P#<}3:TXz9XK(zu8N U +WW7yq+*\it{tR +HHHy +))&=wGUYF`4`S +KKKg616L1f+KdP lQ|[~Pa7O%S8oDq["f}c:S.#S +%KraCZC~w,wCbC;T&9y%SaSy29a#gBew!y&2TJ29a; +00HX9?0T0c +EEEdeCe^C.UE 6&?P*r,6[6MD<;T_P+L&-o +uuu&)5)[&wNuG$Xqvgd=$EkHmRV{3a&_ "q +HHH~p3x]k1m@^ +888"K^@K[^-8( Wy `N]Q,![4$b8G/!=% +KK3c`!`|`%;%{ +CCC,Z!gZ~wk_C;|2rf&?A|P#c}3:TXz9XK(zu8N % +WW7yq+*\it{tR +HHH +))&=wGUYF`4`S +KKK!6zf6Lz1Kd~.[~Pa7f%&8oD@q["&}c:S.uvu +%KraCZC~w,kCbC;T&9y%SaSy29a#,Bewvy&2TJ29a; +00HX9?0T0c +EEEdeCe^. NE 6&?P*r,6[6RDX;T_P+L&^o +uuu&)5)[LwL\uG$Xqvgd=$Ek mJV{3a&_"^q +HHH~p3x]k1@m^ +888AK-K[-AR8(`v .Gy `N]t,S[4$8G/=9% +KK3c`!`|`%;%{ +CCC,Z!gZ~k_wC;|2rf&?A|P#w}<:TXz9XK(zu8N a +WW7yq+*\it{tR +HHH +))&=wGUYF`4`S +KKKg616L1grKdP lQ|[~Pa7O%S8oDq["}uc:}.OSS +%KraCZC~w,!CbC;T&9y%SaSy29a#,Bew]y&2TJ29a; +00HX9?0T0c +EEEdeCe^CNdE 6&?P*r,6[6MD<;T_P+L&3x]k1@|^ +888"K^@K[^<8( Wy `N]Q,![4$b8G/!!% +KK3c`!`|`%;%{ +CCC,Z!gZ~wwxC;|2rf&?A|P#c}3:TXz9XK(zu8N d +WW7yq+*\it{tR +HHH +))&=wGUYF`4`S +KKK!6zf6LzsKd~.[~Pa7f%&8oD@q["&&c:S.u#v +%KraCZC~w,vCbC;d/GKN5bKDuoy{*co!*O#*1iq +HHwWSvHpH< +))s2=.0Y|`4`! +KK3`br|KN%;%, +CCd/X8?N}EeE +WHyku)u[L&jucuGI*Eo-TiJCJO +))W 2r)3)B +888AK"K["m@dBUFey74Zf. +WWW@F+y`~Mmzpd%n!XB7u8P_>m@IBCFey74Z % +WWW>TZTbWo=5G\f/I=:D x`;)n0VKw&G +ttt^{l{DRN"Gtq+*L8!@F+y`fMBzp*n!XmBO +)))|3KC3'B;)^UbPUfh5RIC1K W%b!C<( +``{x:Q{`C:o:S +%%%9;|a;}(~%$fL]RQJGfwV![!EZS4aSy=4f&/gn| +EE1oG4y7ku)uL +ttt +HH?g qr=T8K8^ +```Q4S94RU!`%$b\$se)rH+p6~.2nY+sdKsSrss +:`|N%;%}{9~%x%$N4Av0,n$ +CCtSauCZCv +000=TB7u8P_>m@CBCFe074ZUa +WWW>TZTb-X&Wo=5G\f/I=:D`x`;)n0VKj G +ttt^{l{DRJZtq+*L8!@F+y`BMyzp*n!X mO +)))B3KC3'M)^UbPUfh5CI"1K W%b!C-( +``{x:Q{`C:o:S +%%%9;|a;}{,:%$fL]RQJGfwV![!EZS4aSy=4f&/gp| +EE1oG4y7ku)uL +tttH +HH?g qr=T8K8^ +```U4S94Rt`%$b\$se)+H!p6~.2nY+1dKzS&e +:`|N%;%}{9(%x%$N4Av0{n$ +CCtSauCZCv +000=TB7u8P_>m@CBCFe074ZC +WWW>TZTb^&ZWo=5G\f/I=:D x`;)n0VKj G +ttt^{l{DRJNtq+*L8!@F+y`BMyzp*n!XyfO +)))B3KC3'K;)^UbPUfh5CI"1K W%b!^C( +``{x:Q{`C:o:S +%%%9;|a;}{,a%$fL]RQJGfwV![!EZS4aSy=4f&/3g| +EE1oG4y7ku)uL +tttH +HH?g qr=T8K8^ +```U4S94RS!`%$b\$se)+H!p6~.2nYz+dKzS&ee +:`|N%;%}{~,%x%$N4Av0Cn$ +CCtSauCZCv +000=TB7u8P_>m@CBCFe074ZfI +WWW>TZTb-Z&Wo=5G\f/I=:D`x`;)n0VKw G +ttt^{l{DRlZtq+*L8!@F+y`BMyzp*n!XBmO +)))B3KC3'C)^UbPUfh5CI"1K W%b!C@( +``{x:Q{`C:o:S +%%%9;|a;}{,,%$fL]RQJGfwV![!EZS4aSy=4f&/gc| +EE1oG4y7ku)uL +tttH +HH?g qr=T8K8^ +```U4S94R9`%$b\$se)+H!p6~.2nY+fdKzS&e +:`|N%;%}{~{%x%$N4Av0Cn5Hr/)Nkb*&h~&)j +WWwKB WTWZ +uu'k*8\-?HpH< +))s= fYpx`4`! +KKj`*^B|\%;%, +Cp/90T0~3in060|9HKA4< | +EER2j]EeEI +WWW>TXTbXX&Wo=5G\f/I=:D`x`;)B0VK G +ttt^{l{D" tq+*L8!@F+y`yMyzp*n!X~5O +)))@3;3'Km;)^f?{lqPUfh5^I"1KL%b!<-( +```U4S94RS=`%$b\$se)+H!p6~.2nYzsd +::dp|RKrdCZCw +000=T<]T~33g0|>B7u8P_>m@CBCFe23j2b13P*oTXTb&^cWo=5G\f/I=:D`x`;)B0VKL5G +ttt^{^{DN^tq+*L8!@F+y`yMyzp.S?#n!XB7u8P_>m@CBCFe23j2b13P*oZXo +uu'*LO-TSHpHB +)))| +88SYwgM:UK6Kz +:::io oYS}:cA~b!^aDA\.|*|^;JR/r{4}Pd.hogg|03b3=] +E5oBWTWbTX-Tba&_RJqtRs G +HTg2)3)'Kz;)8)^2WZD<;TCP+LZZoWWTWZWdWZW3x]k1;m^))3);)8);)K)K +888CKCK["8( Wy `N]T,S[4~8G/!Q%``4`!`Y`S`=VQ9!9Q`S +KKK+6+6L1Kd~.[~Pa7i%S8oeq["&Oc::o:&:s:&:S:S +%%%,;,;}:%$G+JGfwV,[wEZR8 G_];CCZC_CbC_CwCw +000gTgT~]0|_UP_>m@dBfFey74Z . EEeE E\E EfEf +WWWZTZTb>WoI_/I=:D&xL;)n0VK5&Guu)u5ucu5uLuL +tttl{l{DZtqF>@F+y`~MBzp*n!X<:OHHpHD<;TCP+L3x]k1KB^))3);)8);)K)K +888CKCK[^R8( Wy `N]T,S[4~8G/S5%``4`!`Y`!`S`S +KKK+6+6LzgKd~.[~Pa7i%S8oeq["Sic::o:&:s:&:S:S +%%%,;,;}{~%$G+JGfwV,[wEZR8 GwX;CCZC_CbC_CwCw +000gTgT~3p0|_UP_>m@dBfFey74Zfa EEeE E\E EfEf +WWWZTZTb&ZWoI_/I=:D&xL;)n0VKw5Guu)u5ucu5uLuL +tttl{l{DNRtqF>@F+y`~MBzp*n!XmBOHHpHD<;TCP+L&-oWWTWZWdWZW3x]k1mC^))3);)8);)K)K +888CKCK[m@dBfFey74ZCU EEeE E\E EfEf +WWWZTZTbXXWoI_/I=:D&xL;)n0VK``Guu)u5ucu5uLuL +tttl{l{DJHtqF>@F+y`~MBzp*n!Xy OHHpHD<;TCP+LX^oWWTWZWdWZW3x]k1MK^))3);)8);)K)K +888CKCK[-<8( Wy `N]T,S[4~8G/t=%``4`!`Y`!`S`S +KKK+6+6L1!Kd~.[~Pa7i%S8oeq["Ofc::o:&:s:&:S:S +%%%,;,;}ii%$G+JGfwV,[wEZR8 Gvv;CCZC_CbC_CwCw +000gTgT~cw0|_UP_>m@dBfFey74ZIN EEeE E\E EfEf +WWWZTZTbM-WoI_/I=:D&xL;)n0VK Guu)u5ucu5uLuL +tttl{l{DH^tqF>@F+y`~MBzp*n!X ~OHHpHD<;TCP+LR&oWWTWZWdWZW3x]k1BM^))3);)8);)K)K +888CKCK[778( Wy `N]T,S[4~8G/UU%``4`!`Y`!`S`S +KKK+6+6L&rKd~.[~Pa7i%S8oeq["v#c::o:&:s:&:S:S +%%%,;,;}:9%$G+JGfwV,[wEZR8 G],;CCZC_CbC_CwCw +000gTgT~wi0|_UP_>m@dBfFey74ZN% EEeE E\E EfEf +WWWZTZTbR^WoI_/I=:D&xL;)n0VKj\Guu)u5ucu5uLuL +tttl{l{D"ltqF>@F+y`~MBzp*n!XfD<;TCP+L-RoWWTWZWdWZW3x]k1N@^))3);)8);)K)K +888CKCK[R@8( Wy `N]T,S[4~8G/59%``4`!`Y`!`S`S +KKK+6+6LreKd~.[~Pa7i%S8oeq["# c::o:&:s:&:S:S +%%%,;,;}9,%$G+JGfwV,[wEZR8 G,_;CCZC_CbC_CwCw +000gTgT~=30|_UP_>m@dBfFey74Zdf EEeE E\E EfEf +WWWZTZTb>&WoI_/I=:D&xL;)n0VK&wGuu)u5ucu5uLuL +tttl{l{D^JtqF>@F+y`~MBzp*n!X~yOHHpHD<;TCP+L>coWWTWZWdWZW3x]k1C;^))3);)8);)K)K +888CKCK[@^8( Wy `N]T,S[4~8G/9S%``4`!`Y`!`S`S +KKK+6+6LfsKd~.[~Pa7i%S8oeq["u}c::o:&:s:&:S:S +%%%,;,;}~|%$G+JGfwV,[wEZR8 GX!;CCZC_CbC_CwCw +000gTgT~ic0|_UP_>m@dBfFey74Z%I EEeE E\E EfEf +WWWZTZTbcRWoI_/I=:D&xL;)n0VKNjGuu)u5ucu5uLuL +tttl{l{DZ"tqF>@F+y`~MBzp*n!X:fOHHpHD<;TCP+L^3x]k1z|^))3);)8);)K)K +888CKCK[l-8( Wy `N]T,S[4~8G/;t%``4`!`Y`!`S`S +KKK+6+6Le&Kd~.[~Pa7i%S8oeq[" vc::o:&:s:&:S:S +%%%,;,;}(a%$G+JGfwV,[!EZR8 G__;CCZC_CbC_CwCw +000gTgT~p=0|_UP_>m@dBCFey74Z f EEeE E\E EfEf +WWWZTZTb^cWoI_/I=:D&x`;)n0VK5wGuu)u5ucu5uLuL +tttl{l{DGGtqF>@F+y`~Myzp*n!XDX;TCP+LZcoWWTWZWdWZW3x]k1K;^))3);)8);)K)K +888CKCK[^CA8( Wy `N]T,Q[4~8G/SS%``4`!`Y`!`S`S +KKK+6+6Lz+fKd~.[~Pa7i%f8oeq["S}c::o:&:s:&:S:S +%%%,;,;}{,(%$G+JGfwV,[!EZR8 Gw!;CCZC_CbC_CwCw +000gTgT~33g0|_UP_>m@dBCFey74ZfI EEeE E\E EfEf +WWWZTZTb<<@F+y`~Myzp*n!XBfOHHpHDX;TCP+L&3x]k1m|^))3);)8);)K)K +888CKCK[^m@dBCFey74ZUd EEeE E\E EfEf +WWWZTZTb<&MWoI_/I=:D&x`;)n0VKwNGuu)u5ucu5uLuL +tttl{l{DRN tqF>@F+y`~Myzp*n!Xm5OHHpHDX;TCP+LXMoWWTWZWdWZW3x]k1|N^))3);)8);)K)K +888CKCK[^""8( Wy `N]T,Q[4~8G/QT%``4`!`Y`!`S`S +KKK+6+6Lz!1Kd~.[~Pa7i%f8oeq["fuc::o:&:s:&:S:S +%%%,;,;}{|:%$G+JGfwV,[!EZR8 G!x;CCZC_CbCwCkK!xX]gCw +000gTgT~3<]0|_UP_>m@dBCFey74ZI EEeE E\E EfEf +WWWZTZTbWoI_/I=:D&x`;)n0VK LGuu)u5ucu5uLuL +tttl{l{DRJZtqF>@F+y`~Myzp*n!X mOHHpHDX;TCP+LM>oWWTWZWdWZW3x]k1Mz^))3);)8);)K)K +888CKCK[^-R8( Wy `N]T,Q[4~8G/U!%``4`!`Y`S`=V=9QtS`S +KKK+6+6Lz1gKd~.[~Pa7i%f8oeq["vSc::o:&:s:&:S:S +%%%,;,;}{i~%$G+JGfwV,[!EZR8 G]k;CCZC_CbC_CwCw +000gTgT~3cp0|_UP_>m@dBCFey74ZNC EEeE E\E EfEf +WWWZTZTb@F+y`~Myzp*n!X;;OHHpHDX;TCP+L-ZoWWTWZWdWZW3x]k1Nm^))3);)8);)K)K +888CKCK[^7l8( Wy `N]T,Q[4~8G/5Q%``4`!`Y`S`=Vt!UU`S +KKK+6+6Lzr+Kd~.[~Pa7i%f8oeq["#Oc::o:&:s:&:S:S +%%%,;,;}{a{%$G+JGfwV,[!EZR8 Gg];CCZC_CbC_CwCw +000gTgT~3]n0|_UP_>m@dBCFey74Z.. EEeE E\E EfEf +WWWZTZTb<-XWoI_/I=:D&x`;)n0VK &Guu)u5ucu5uLuL +tttl{l{DR"HtqF>@F+y`~Myzp*n!Xf:OHHpHDX;TCP+L>XoWWTWZWdW3x]k1@B^))3);)8);)K)K +888CKCK[^A<8( Wy `N]T,Q[4~8G/T5%``4`!`Y`!`S`S +KKK+6+6Lzg!Kd~.[~Pa7i%f8oeq["iic::o:&:s:&:S:S +%%%,;,;}{9i%$G+JGfwV,[!EZR8 G,X;CCZC_CbC_CwCw +000gTgT~3=w0|_UP_>m@dBCFey74Zda EEeE E\E EfEf +WWWZTZTb<>-WoI_/I=:D&x`;)n0VKN5Guu)u5ucu5uLuL +tttl{l{DR^^tqF>@F+y`~Myzp*n!X:BOHHpHDX;TCP+Lc-oWWTWZWdWZW3x]k1CC^))3);)8);)K)K +888CKCK[^@78( Wy `N]T,Q[4~8G/9;%``4`!`Y`!`S`S +KKK+6+6LzfrKd~.[~Pa7i%f8oeq[" &c::o:&:s:&:S:S +%%%,;,;}{~9%$G+JGfwV,[!EZR8 Gxw;CCZC_CbC_CwCw +000gTgT~3ii0|_UP_>m@dBCFey74ZaU EEeE E\E EfEf +WWWZTZTb@F+y`~Myzp*n!X5 OHHpHD<;Tlyb+0VK5wGuu)uL\wucu5uLuL +tttl{Z{DJtqF>@F+y`~MBzpKg D]k1;|^))3)Kzm)8);)K)K +888CK@K[-8( Wy `N]T,S[4I:9^2nY+1dKK6KzesKuK+KzKz +:::&ouoYv:cD@aDA\.9*{^;"rST8 G_];CCZCwxkCbC_CwCw +000gTiT~]0|_UP_>m@dBfFe(oK4P+LZ-oWWTW<^&WdWZW3"=wf%b!^<(88K8^l<8s8C8^8^ +```!494RSQ`%$b\$se)gHzp6_`*rq["Sfc::o:S }:s:&:S:S +%%%,;~;}{i%$G+JGfwV,[wEZ:/XR.ho3c|00T03pn060g0303 +EEE e%e^fNE ,0r,6[6>D<;Tlyb+0VKLjGuu)uL\wucu5uLuL +tttl{Z{DR"tqF>@F+y`~MBzpKg D]k1KN^))3)Kzm)8);)K)K +888CK@K[^A8( Wy `N]T,S[4I:9^2nYzgdKK6KzesKuK+KzKz +:::&ouoYSu:cD@aDA\.9*{^;"rST8 GwX;CCZCwxkCbC_CwCw +000gTiT~3p0|_UP_>m@dBfFe(oK4P+L<^oWWTW<^&WdWZW3"=wf%b!C7(88K8^l<8s8C8^8^ +```!494R=5`%$b\$se)gH!p6_`*rq["&#c::o:S }:s:&:S:S +%%%,;~;}C9%$G+JGfwV,[!EZ:/XR.hog=|00T03pn060g0303 +EEE e%e^U%E ,0r,6[6>DX;Tlyb+0VK5NGuu)uL\wucu5uLuL +tttl{Z{DNGtqF>@F+y`~MyzpKg D]k1;z^))3)Kzm)8);)K)K +888CK@K["C8( Wy `N]T,Q[4I:9^2nYz+dKK6KzesKuK+KzKz +:::&ouoYfS:cD@aDA\.9*|^;"rST8 Gww;CCZCwxkCbC_CwCw +000gTiT~m@dBCFe(oK4P+L<&oWWTW<^&WdWZWWoI_/I=:D&x`;)O*BOa&_R^qtt{tRGNt/tltRtR +HHH3"=wf%b!^@(88K8^l<8s8C8^8^ +```!494RQ;`%$b\$se)gH!p6_`*rq["S c::o:S }:s:&:S:S +%%%,;{~;},%$G+JGfwV,[wEZA-8 G__;CCZCxgCbC_CwCw +000gT3iT~30|_UP_>m@dBfFe,074Z f EEeEa.E\E EfEf +WWWZT@F+y`~MBzpd%n!XD<;TI_P+LZcoWWTW^-WdWZWa&_lGqtt{tG"t/tltRtR +HHH3Ub]k1K;^))3)zN)8);)K)K +888CK^@K[^^8( Wy `N]T,S[4$b8G/SS%``4`;5`Y`!`S`S +KKK+6zf6LzsKd~.[~Pa7i%S8oD@q["S}c::o: #:s:&:S:S +%%%,;{~;}{|%$G+JGfwV,[wEZA-8 Gw!;CCZCxgCbC_CwCw +000gT3iT~3c0|_UP_>m@dBfFe,074ZfI EEeEa.E\E EfEf +WWWZT@F+y`~Myzpd%n!X<DX;TI_P+LZRoWWTW^-WdWZWa&_l"qtt{tG"t/tltRtR +HHH3Ub]k1;@^))3)zN)8);)K)K +888CK^@K[<-8( Wy `N]T,Q[4$b8G/!9%``4`;5`Y`!`S`S +KKK+6zf6Ls&Kd~.[~Pa7i%f8oD@q["& c::o: #:s:&:S:S +%%%,;{~;}Ca%$G+JGfwV,[!EZA-8 Gw_;CCZCxgCbC_CwCw +000gT3iT~n=0|_UP_>m@dBCFe,074Zff EEeEa.E\E EfEf +WWWZT@F+y`~Myzpd%n!XByOHHpH5fHGHm@dBfFe,1&74Zx1oqs5Z3Us?]k1`s=DTvC"(88K8^l<8s8C8^8^ +```!4tt4R!`%$b\$se)gHzp69Vc9AQ ++dKK6Kf+KuK+KzKz +:::&oOOoYS:cD@aDA\.9*{^;1/N1ARL,{$%%;%~,%x%,%{%{ +CCC_ZvvZ~kC;A-?A|P#=}3:TXz9XKuBgn|00T0ig060g0303 +EEE eIIe^CE ,0r,6[6>D<;TKYBK0\5ZXoWWTWcZWdWZW3 -2 Zl?;B^))3)C;)8);)K)K +888CK--K[R8( Wy `N]T,S[4wWxwi2*!5%``4`9!`Y`!`S`S +KKK+6116LgKd~.[~Pa7i%S8o*Vp*9!~&ic::o:u&:s:&:S:S +%%%,;ii;}~%$G+JGfwV,[!EZS4aSyf2__;CCZCX_CbC_CwCw +000gTccT~p0|_UP_>m@dBCFe23j2bP& f EEeE% E\E EfEf +WWWZTMMTb@F+y`~MyzpW#SWiYRD&;TCP+LZZoWWTWZWdWZW3x]k1;m^))3);)8);)K)K +888^KCK["8( Wy `N]T,=[4~8G/!Q%``4`!`Y`!`S`S +KKKz6+6L1Kd~.[~Pa7i%}8oeq["&Oc::o:&:s:&:S:S +%%%{;,;}:%$G+JGfwV,[kEZR8 G_];CCZC_CbC_CwCw +0003TgT~]0|_UP_>m@dBUFey74Z . EEeE E\E EfEf +WWWWoI_/I=:D&xw;)n0VK5&Guu)u5ucu5uLuL +tttR{l{DZtqF>@F+y`~Mmzp*n!X<:OHHpHD&;TCP+LW< +uuuL)5)[L uG=Bd=$Ek^mNV{3a&_RHqtt{tlt/tltRtR +HHHBp3x]k1KB^))3);)8);)K)K +888^KCK[^R8( Wy `N]T,=[4~8G/S5%``4`!`Y`S`=V!;T55`S +KKKz6+6LzgKd~.[~Pa7i%}8oeq["Sic::o:&:s:&:S:S +%%%{;,;}{~%$G+JGfwV,[kEZR8 GwX;CCZC_CbC_CwCw +0003TgT~3p0|_UP_>m@dBUFey74Zfa EEeE E\E EfEf +WWW@F+y`~Mmzp*n!XmBOHHpHD&;TCP+L&-oWWTWZWdWZW3x]k1mC^))3);)8);)K)K +888^KCK[m@dBUFey74ZCU EEeE E\E EfEf +WWW@F+y`~Mmzp*n!Xy OHHpHD&;TCP+LX^oWWTWZWdWZW3x]k1MK^))3);)8);)K)K +888^KCK[-<8( Wy `N]T,=[4~8G/t=%``4`!`Y`!`S`S +KKKz6+6L1!Kd~.[~Pa7i%}8oeq["Ofc::o:&:s:&:S:S +%%%{;,;}ii%$G+JGfwV,[kEZR8 Gvv;CCZC_CbC_CwCw +0003TgT~cw0|_UP_>m@dBUFey74ZIN EEeE E\E EfEf +WWW@F+y`~Mmzp*n!X ~OHHpHD&;TCP+LR&oWWTWZWdWZW3x]k1BM^))3);)8);)K)K +888^KCK[778( Wy `N]T,=[4~8G/UU%``4`!`Y`!`S`S +KKKz6+6L&rKd~.[~Pa7i%}8oeq["v#c::o:&:s:&:S:S +%%%{;,;}:9%$G+JGfwV,[kEZR8 G],;CCZC_CbC_CwCw +0003TgT~wi0|_UP_>m@dBUFey74ZN% EEeE E\EfEU= CdNfEf +WWW@F+y`~Mmzp*n!XfD&;TCP+L-RoWWTWZWdWZW3x]k1N@^))3);)8);)K)K +888^KCK[R@8( Wy `N]T,=[4~8G/59%``4`!`Y`!`S`S +KKKz6+6LreKd~.[~Pa7i%}8oeq["# c::o:&:s:&:S:S +%%%{;,;}9,%$G+JGfwV,[kEZR8 G,_;CCZC_CbC_CwCw +0003TgT~=30|_UP_>m@dBUFey74Zdf EEeE E\E EfEf +WWW&WoI_/I=:D&xw;)n0VK&wGuu)u5ucu5uLuL +tttR{l{D^JtqF>@F+y`~Mmzp*n!X~yOHHpHD&;TCP+L>coWWTWZWdWZW3x]k1C;^))3);)8);)K)K +888^KCK[@^8( Wy `N]T,=[4~8G/9S%``4`!`Y`!`S`S +KKKz6+6LfsKd~.[~Pa7i%}8oeq["u}c::o:&:s:&:S:S +%%%{;,;}~|%$G+JGfwV,[kEZR8 GX!;CCZC_CbC_CwCw +0003TgT~ic0|_UP_>m@dBUFey74Z%I EEeE E\E EfEf +WWW@F+y`~Mmzp*n!X:fOHHpHD&;TCP+L^3x]k1z|^))3);)8);)K)K +888^KCK[l-8( Wy `N]T,=[4~8G/;t%``4`!`Y`!`S`S +KKKz6+6Le&Kd~.[~Pa7i%}8oeq[" vc::o:&:s:&:S:S +%%%{;~;},%$G+JGfwV,[kEZ:/XR.hogg|00T03pn060g0303 +EEEfe%e^fE ,0r,6[6>D&;Tlyb+0VK5LGuu)uL\wucu5uLuL +tttR{Z{DNtqF>@F+y`~MmzpKg D]k1;m^))3)Kzm)8);)K)K +888^K@K["8( Wy `N]T,=[4I:9^2nY+!dKK6KzesKuK+KzKz +:::SouoYO:cD@aDA\.9*C^;"rST8 G_v;CCZCwxkCbC_CwCw +0003TiT~w0|_UP_>m@dBUFe(oK4P+LZRoWWTW<^&WdWZW3"=wf%b!^^(88K8^l<8s8C8^8^ +```S494RS=`%$b\$se)gHsp6_`*rq["S}c::o:S }:s:&:S:S +%%%{;~;}{|%$G+JGfwV,[kEZ:/XR.ho3<|00T03pn060g0303 +EEEfe%e^fIE ,0r,6[6>D&;Tlyb+0VKL Guu)uL\wucu5uLuL +tttR{Z{DR tqF>@F+y`~MmzpKg D]k1KB^))3)Kzm)8);)K)K +888^K@K[^R8( Wy `N]T,=[4I:9^2nYzrdKK6KzesKuK+KzKz +:::SouoYSi:cD@aDA\.9*C^;"rST8 Gw,;CCZCwxkCbC_CwCw +0003T3iT~g0|_UP_>m@dBUFe,074Z EEeEa.E\E EfEf +WWW@F+y`~Mmzpd%n!XD&;TI_P+LZ>oWWTW^-WdWZWa&_lZqtt{tG"t/tRtNsJ ZZ^tR +HHHBpB:p45HOd%+dAbd@Xm>3Ub]k1;z^))3)zN)8);)K)K +888^K^@K[^C8( Wy `N]T,=[4$b8G/S!%``4`;5`Y`!`S`S +KKKz6zf6LzzKd~.[~Pa7i%}8oD@q["SSc::o: #:s:&:S:S +%%%{;{~;}{C%$G+JGfwV,[kEZA-8 Gwk;CCZCxgCbC_CwCw +0003T3iT~3<0|_UP_>m@dBUFe,074ZfC EEeEa.E\E EfEf +WWW@F+y`~Mmzp6q#0n!X3 -2 Zl?;;^))3)C;)8);)K)K +888^K--K[^8( Wy `N]T,=[4wWxwi2*!S%``4`9!`Y`!`S`S +KKKz6116LsKd~.[~Pa7i%}8o*Vp*9!~&}c::o:u&:s:&:S:S +%%%{;ii;}|%$G+JGfwV,[kEZS4aSyf2_!;CCZCX_CbC_CwCw +0003TccT~c0|_UP_>m@dBUFe23j2bP& I EEeE% E\E EfEf +WWW@F+y`~MmzpW#SWiYRm@fBIFe(oK4P+LZ3"=wf%b!CA(88K8^l<8s8C8^8^ +```=494R9`%$b\$se)zH1p6_`*rq["&uc::o:S }:s:&:S:S +%%%C;~;}(%$G+JGfwVw[vEZ:/XR.hogp|00T03pn060g0303 +EEEUe%e^f E ,0r,6[6@F+y`BM zpKg D]k1KK^))3)Kzm)8);)K)K +888m@UBIFe(oK4P+LZ&oWWTW<^&WdWZW3"=wf%b!C@(88K8^l<8s8C8^8^ +```=494R=S`%$b\$se)sH1p6_`*rq["& c::o:S }:s:&:S:S +%%%C;~;}CC%$G+JGfwVk[vEZ:/XR.ho3g|00T03pn060g0303 +EEEUe%e^UCE ,0r,6[6&DM;Tlyb+0VKLLGuu)uL\wucu5uLuL +tttN{Z{DNHtqF>@F+y`yM zpKg D]k1;;^))3)Kzm)8);)K)K +888m@CBIFe(oK4P+LZXoWWTW<^&WdWZW3"=wf%b!Cl(88K8^l<8s8C8^8^ +```=494RQt`%$b\$se)!H1p6_`*rq["S&c::o:S }:s:&:S:S +%%%C;~;}|:%$G+JGfwV![vEZ:/XR.ho33|00T03pn060g0303 +EEEUe%e^C.E ,0r,6[6MDM;Tlyb+0VK55Guu)uL\wucu5uLuL +tttN{Z{DJ^tqF>@F+y` M zpKg D]k1;K^))3)Kzm)8);)K)K +888m@IBIFe(oK4P+LZMoWWTW<^&WdWZW3"=wf%b!^C(88K8^l<8s8C8^8^ +```=494RtT`%$b\$se)1H1p6_`*rq["SSc::o:S }:s:&:S:S +%%%C;~;}i~%$G+JGfwV][vEZ:/XR.hogg|00T03pn060g0303 +EEEUe%e^IaE ,0r,6[6RDM;Tlyb+0VK5LGuu)uL\wucu5uLuL +tttN{Z{D ltqF>@F+y`;M zpKg D]k1;m^))3)Kzm)8);)K)K +888m@NBIFe(oK4P+LZRoWWTW<^&WdWZW3"=wf%b!^^(88K8^l<8s8C8^8^ +```=494R5!`%$b\$se)rH1p6_`*rq["&&c::o:S }:s:&:S:S +%%%C;~;}a{%$G+JGfwVg[vEZ:/XR.hog3|00T03pn060g0303 +EEEUe%e^.UE ,0r,6[6-DM;Tlyb+0VK5wGuu)uL\wucu5uLuL +tttN{Z{D"JtqF>@F+y`fM zpKg D]k1;|^))3)Kzm)8);)K)K +888m@.BIFe(oK4P+LZ-oWWTW<^&WdWZW3Ub]k1;;^))3)zN)8)K)m:K|KMK)K +888m@fBIFe,074Z I EEeEa.E\E EfEf +WWW&T@F+y`BM zpd%n!Xa&_llqtt{tG"t/tRtNsNZ RtR +HHHmpB:p4ByHOd%+dAbdmXM>3Ub]k1;K^))3)zN)8);)K)K +888m@UBIFe,074Z N EEeEa.E\EfEU= % fEf +WWW&T@F+y`mM zpd%n!X<~OHHpH5fHGHBHmPyB <:HB +)))m3KC3'm;)^UbPUfh5a&_lRqtt{tG"t/tRtNslRZZ"tR +HHHmpB:p4mfHOd%+dAbd|XM>3Ub]k1;m^))3)zN)8)K)m:mKz;m)K +888m@CBIFe,074Z . EEeEa.E\EfEU=I%CUNEf +WWW&T@F+y`yM zpd%n!X<:OHHpH5fHGHBHmPy; ~mHB +)))m3KC3'||)^UbPUfh5"I-1K W%b!Cl(88K8lR8s8^8a&_lNqtt{tG"t/tRtNsHl"""tR +HHHmpB:p4y5HOd%+dAbdMXM>3Ub]k1;|^))3)zN)8)K)m:KKM|m)K +888m@IBIFe,074Z d EEeEa.E\EfEU=CNNC.Ef +WWW&T@F+y` M zpd%n!X<5OHHpH5fHGHBHmPy; ~5HB +)))m3KC3'MN)^UbPUfh5-I-1K W%b!^C(88K8lR8s8C8^8^ +```=4S94RtT`%$b\$se)1H1p6~.2nYzzdKK6KerKuK+KzKz +:::}oSuoYOu:cD@aDA\.:*i^;G+7c-,,$%%;%(a%x%{%C?{a|{{%{ +CCCkZwXZ~vxC;A-?A|P#w}c:T_U.hog3|00T0p]06030nbc33=303 +EEEUef%e^N E ,0r,6[6RDM;TI_P+LZ&oWWTW^-WdWZWa&_lJqtt{tG"t/tltRtR +HHHmpB:p4;mHOd%+dAbdBXM>3Ub]k1;M^))3)zN)8);)K)K +888m@NBIFe,074Z % EEeEa.E\EfEU=ICC%UEf +WWW&TWoI_/I=:Djx ;)=B0VK5\Guu)u\ ucu5uLuL +tttN{RZ{D ZtqF>@F+y`;M zpd%n!XBa&_lHqtt{tG"t/tltRtR +HHHmpB:p4f;HOd%+dAbdNXM>3Ub]k1;B^))3)zN)8);)K)K +888m@.BIFe,074Z a EEeEa.E\E EfEf +WWW&TZWoI_/I=:D x ;)=B0VKL5Guu)u\ ucu5uLuL +tttN{RZ{D^RtqF>@F+y`fM zpd%n!XBBOHHpH5fHGH3 -2 Zl?;;^))3)C;)8);)K)K +888m@UBIFe23j2bP& I EEeE% E\E EfEf +WWW&TMMTb<@F+y`yM zpW#SWiYR<3 -2 Zl?;K^))3)C;)8);)K)K +888m@IBIFe23j2bP& N EEeE% E\E EfEf +WWW&TMMTb&MWoI_/I=:Djx ;)bJkb2vX55Guu)uN5ucu5uLuL +tttN{HH{DN tqF>@F+y`;M zpW#SWiYR3 -2 Zl?;m^))3)C;)8);)K)K +888m@fBfFe(oK4P+LZZoWWTW<^&WdWZW3"=wf%b!CR(88K8^l<8s8C8^8^ +```Q494RT`%$b\$se)zHzp6_`*rq["&ic::o:S }:s:&:S:S +%%%|;~;}~%$G+JGfwVw[wEZ:/XR.hogi|00T03pn060g0303 +EEECe%e^aE ,0r,6[6@F+y`BMBzpKg D]k1K;^))3)Kzm)8);)K)K +888"K@K[^^8( Wy `N]S,S[4I:9^2nYzzdKK6KzesKuK+KzKz +:::fouoYS}:cD@aDA\.|*,^;"rST8 G__;CCZCwxkCbC_CwCw +000m@CB Fe(oK4P+LZ3"=wf%b!CA(88K8^l<8s8C8^8^ +```Q494R=!`%$b\$se)!H+p6_`*rq["&uc::o:S }:s:&:S:S +%%%|;~;}C{%$G+JGfwV![_EZ:/XR.hogp|00T03pn060g0303 +EEECe%e^UUE ,0r,6[6XDZ;Tlyb+0VKL5Guu)uL\wucu5uLuL +tttJ{Z{DNJtqF>@F+y`yMm@IB Fe(oK4P+LZ&oWWTW<^&WdWZW3"=wf%b!C@(88K8^l<8s8C8^8^ +```Q494RQQ`%$b\$se)1H+p6_`*rq["& c::o:S }:s:&:S:S +%%%|;~;}|i%$G+JGfwVv[_EZ:/XR.ho3g|00T03pn060g0303 +EEECe%e^CNE ,0r,6[6MDZ;Tlyb+0VKLLGuu)uL\wucu5uLuL +tttJ{Z{DJ"tqF>@F+y`;Mm@NB Fe(oK4P+LZXoWWTW<^&WdWZW3"=wf%b!Cl(88K8^l<8s8C8^8^ +```Q494Rt5`%$b\$se)&H+p6_`*rq["S&c::o:S }:s:&:S:S +%%%|;~;}i9%$G+JGfwV][_EZ:/XR.ho33|00T03pn060g0303 +EEECe%e^I%E ,0r,6[6-DZ;Tlyb+0VK55Guu)uL\wucu5uLuL +tttJ{Z{DHGtqF>@F+y`fMm@.B Fe(oK4P+LZMoWWTW<^&WdWZWWoI_/I=:D x5;)O*BOa&_lGqtt{tRGNt/tltRtR +HHHyp:p4;:HOd%+dAbdNX;>3"=wf%b!^C(88K8^l<8s8C8^8^ +```Q494RU;`%$b\$se)rH+p6_`*rq["SSc::o:S }:s:&:S:S +%%%|;{~;},%$G+JGfwVw[wEZA-8 G__;CCZCxgCbC_CwCw +000m@fBfFe,074Z f EEeEa.E\E EfEf +WWWXT@F+y`BMBzpd%n!Xa&_lGqtt{tG"t/tltRtR +HHHypB:p4B3Ub]k1K;^))3)zN)8);)K)K +888"K^@K[^^8( Wy `N]S,S[4$b8G/SS%``4`;5`Y`!`S`S +KKK!6zf6LzsKd~.[~Pa7f%&8oD@q["&&c::o: #:s:S:}.fOiiS:S +%%%|;{~;}{|%$G+JGfwV![_EZA-8 G_w;CCZCxgCbCwCkKvwwvXCw +000m@CB Fe,074Z U EEeEa.E\EfEU=f a.NEf +WWWXT@F+y`yMXW< +uuu`)LN)[wwuG=Bd=$EkJmlV{F>a&_Rlqtt{tG"t/tltRtR +HHHypB:p4myHOd%+dAbd|X;>3Ub]k1KK^))3)zN)8);)K)K +888"K^@K[<-8( Wy `N]t,![4$b8G/!!%``4`;5`Y`S`=VS5UU;`S +KKK!6zf6Ls&Kd~.[~Pa7O%&8oD@q["&Sc::o: #:s:S:}.}fuv :S +%%%|;{~;}Ca%$G+JGfwVv[_EZA-8 G_k;CCZCxgCbC_CwCw +000m@IB Fe,074Z C EEeEa.E\E EfEf +WWWXT@F+y` Ma&_RRqtt{tG"t/tltRtR +HHHypB:p4yfHOd%+dAbdBX;>3Ub]k1;;^))3)zN)8);)K)K +888"K^@K["A8( Wy `N]U,![4$b8G/!S%``4`;5`Y`!`S`S +KKK!6zf6L!fKd~.[~Pa7v%&8oD@q["&}c::o: #:s:S:}.}vv}#:S +%%%|;{~;}|(%$G+JGfwV][_EZA-8 G_!;CCZCxgCbC_CwCw +000m@NB Fe,074Z I EEeEa.E\E EfEf +WWWXT@F+y`;Ma&_llqtt{tG"t/tltRtR +HHHypB:p4 5HOd%+dAbdNX;>3Ub]k1;K^))3)zN)8);)K)K +888"K^@K[7C8( Wy `N]5,![4$b8G/!=%``4`;5`Y`S`=Vt;tU=`S +KKK!6zf6L&zKd~.[~Pa7#%&8oD@q["&fc::o: #:s:&:S:S +%%%|;{~;}:C%$G+JGfwVg[_EZA-8 G_v;CCZCxgCbC_CwCw +000m@.B Fe,074Z N EEeEa.E\E EfEf +WWWXT@F+y`fM3 -2 Zl?;m^))3)C;)8);)K)K +888"K--K["8( Wy `N]S,S[4wWxwi2*!Q%``4`9!`Y`!`S`S +KKK!6116L1Kd~.[~Pa7S%S8o*Vp*9!~&Oc::o:u&:s:&:S:S +%%%|;ii;}:%$G+JGfwVw[wEZS4aSyf2_];CCZCX_CbC_CwCw +000m@CB Fe23j2bP& EEeE% E\E EfEf +WWWXTMMTb>WoI_/I=:D`x5;)bJkb2vX5LGuu)uN5ucu5uLuL +tttJ{HH{DZtqF>@F+y`yM3 -2 Zl?;|^))3)C;)8);)K)K +888"K--K[^R8( Wy `N]t,![4wWxwi2*!t%``4`9!`Y`!`S`S +KKK!6116LzgKd~.[~Pa7O%&8o*Vp*9!~&vc::o:u&:s:&:S:S +%%%|;ii;}{~%$G+JGfwV][_EZS4aSyf2__;CCZCX_CbC_CwCw +000m@NB Fe23j2bP& f EEeE% E\E EfEf +WWWXTMMTb&ZWoI_/I=:Djx5;)bJkb2vX5wGuu)uN5ucu5uLuL +tttJ{HH{DNRtqF>@F+y`;M3 -2 Zl?;M^))3)C;)8);)K)K +888"K--K[3"=wf%b!C"(88K8^l<8s8C8^8^ +```t494Rt`%$b\$se)+Hsp6_`*rq["&Oc::o:S }:s:&:S:S +%%%i;~;}:%$G+JGfwV_[kEZ:/XR.hogw|00T03pn060g0303 +EEEIe%e^.E ,0r,6[6ZD&;Tlyb+0VK5 Guu)uL\wucu5uLuL +tttH{Z{D^tqF>@F+y`m@ BUFe(oK4P+LBBH.hogg|00T0g060g03g03 +EEEIefde^fE ,0r,6[6ZD&;T=55wP+LZ3f??W]k1;|^))3);)8);)K;)K +888-K^AK[-8( Wy `N]!,=[4s**m8G/!t%``4`!`Y`!`S!`S +KKK16zg6L&Kd~.[~Pa7&%}8oA~~Rq["&vc::o:&:s:&:S&:S +%%%i;{9;}a%$G+JGfwV_[kEZ|22t8 G_g;CCZC_CbC_Cw_Cw +000cT3=T~=0|_UP_>m@ BUFe6&&R74Z d EEeE E\E Ef Ef +WWWMT<>TbcWoI_/I=:D5xw;)$XX10VK5NGuu)u5ucu5uL5uL +tttH{R^{DGtqF>@F+y`BBH.ho3<|00T0g060g03g03 +EEEIef%e^ E ,0r,6[6ZD&;TI_P+LZZoWWTW^-WdWZWa&_lRqtt{tG"t/tltRtR +HHH pB:p4mHOd%+dAbd;Xm>3Ub]k1;m^))3)zN)8);)K)K +888-K^@K["8( Wy `N]!,=[4$b8G/!Q%``4`;5`Y`!`S`S +KKK16zf6L1Kd~.[~Pa7&%}8oD@q["&Oc::o: #:s:&:S:S +%%%i;{~;}:%$G+JGfwV_[kEZA-8 G_];CCZCxgCbC_CwCw +000cT3iT~]0|_UP_>m@ BUFe,074Z . EEeEa.E\E EfEf +WWWMTWoI_/I=:D5xw;)=B0VK5&Guu)u\ ucu5uLuL +tttH{RZ{DZtqF>@F+y`3Gq-R]k1;K^))3)zN)8)K)m:|mCz@)K +888-K--K[C8( Wy `N]!,=[4wWxwi2*!!%``4`9!`Y`!`S`S +KKK16116LzKd~.[~Pa7&%}8o*Vp*9!~&Sc::o:u&:s:&:S:S +%%%i;ii;}C%$G+JGfwV_[kEZS4aSyf2_k;CCZCX_CbC_CwCw +000cTccT~<0|_UP_>m@ BUFe23j2bP& C EEeE% E\E EfEf +WWWMTMMTbMWoI_/I=:D5xw;)bJkb2vX5 Guu)uN5ucu5uLuL +tttH{HH{D tqF>@F+y`3"=wf%b!C<(88K8^l<8s8C8^8^ +```U494RQ`%$b\$se)+H!p6_`*rq["&fc::o:S }:s:&:S:S +%%%:;~;}i%$G+JGfwV_[!EZ:/XR.hogc|00T03pn060g0303 +EEENe%e^NE ,0r,6[6ZDX;Tlyb+0VK5jGuu)uL\wucu5uLuL +ttt {Z{D"tqF>@F+y`m@ BCFe(oK4P+LZ^oWWTW<^&WdWZW3"=wf%b!^7(88K8^l<8s8C8^8^ +```U4ST4R!`%$b\$se)+H!p6P G2nY++dKK6K+KuK+Kz+Kz +:::voSioYS:cD@aDA\.,*|^;fLL47c-,{$%%;%,%x%,%{,%{ +CCC]Zw,Z~kC;A-?A|P#g}<:T>BBH.hogn|00T0g060g03g03 +EEENefde^CE ,0r,6[6ZDX;T=55wP+LZXoWWTWZWdWZW3f??W]k1;B^))3);)8);)K;)K +8887K^AK[R8( Wy `N]!,Q[4s**m8G/!5%``4`!`Y`!`S!`S +KKK&6zg6LgKd~.[~Pa7&%f8oA~~Rq["&ic::o:&:s:&:S&:S +%%%:;{9;}~%$G+JGfwV_[!EZ|22t8 G_X;CCZC_CbC_Cw_Cw +000wT3=T~p0|_UP_>m@ BCFe6&&R74Z a EEeE E\E Ef Ef +WWWRT<>Tb@F+y`a&_l qtt{tG"t/tRtNsN"NJ^tR +HHH;pB:p4fHOd%+dAbd;X|>3Ub]k1;N^))3)zN)8);)K)K +8887K^@K[A8( Wy `N]!,Q[4$b8G/!T%``4`;5`Y`!`S`S +KKK&6zf6LfKd~.[~Pa7&%f8oD@q["&uc::o: #:s:S:}.&}OvO:S +%%%:;{~;}(%$G+JGfwV_[!EZA-8 G_x;CCZCxgCbCwCkKkgw,vCw +000wT3iT~3g0|_UP_>m@ BCFe,074Zf EEeEa.E\EfEU=CNd%fEf +WWWRT@F+y`3 -2 Zl?;|^))3)C;)8);)K)K +8887K--K[-8( Wy `N]!,Q[4wWxwi2*!t%``4`9!`Y`!`S`S +KKK&6116L&Kd~.[~Pa7&%f8o*Vp*9!~&vc::o:u&:s:&:S:S +%%%:;ii;}a%$G+JGfwV_[!EZS4aSyf2_g;CCZCX_CbC_CwCw +000wTccT~=0|_UP_>m@ BCFe23j2bP& d EEeE% E\E EfEf +WWW-TcTbZWo+gP/I=:DwxL;)O*BOa&_llqtt{tRGNt/tltRtR +HHHfp:p4BHO!)n+dAbdmXK>3"=wf%b!C^(88K8^l<8s8C8^8^ +```5494R=`%G 8\$se)sHzp6_`*rq["&}c::o:S }:s:&:S:S +%%%a;~;}|%$ck7JGfwVk[wEZ:/XR.hog<|00T03pn060g0303 +EEE.e%e^IE 4O7r,6[6&D<;Tlyb+0VK5 Guu)uL\wucu5uLuL +ttt"{Z{D tq&.a@F+y`mMBzpKg D]k1;B^))3)Kzm)8);)K)K +888RK@K[R8(bZ%y `N]=,S[4I:9^2nY+rdKK6KzesKuK+KzKz +:::#oSioY&:c[BBH.hog3|00T0g060g03g03 +EEE.efde^UE 4O7r,6[6&D<;T=55wP+LZ&oWWTWZWdWZW3f??W]k1;M^))3);)8);)K;)K +888RK^AK[78(bZ%y `N]=,S[4s**m8G/!U%``4`!`Y`!`S!`S +KKKr6zg6LrKdn-2[~Pa7}%S8oA~~Rq["&#c::o:&:s:&:S&:S +%%%a;{9;}9%$ck7JGfwVk[wEZ|22t8 G_,;CCZC_CbC_Cw_Cw +000]T3=T~i0|h".P_>m@UBfFe6&&R74Z % EEeE E\E Ef Ef +WWW-T<>Tb^Wo+gP/I=:DwxL;)$XX10VK5\Guu)u5ucu5uL5uL +ttt"{R^{DRltq&.a@F+y`mMBzpARRwn!XBBBH.ho3c|00T0g060g03g03 +EEE.efde^fNE 4O7r,6[6&D<;T=55wP+L3f??W]k1K@^))3);)8);)K;)K +888RK^AK[^@8(bZ%y `N]=,S[4s**m8G/S9%``4`!`Y`!`S!`S +KKKr6zg6LzeKdn-2[~Pa7}%S8oA~~Rq["S c::o:&:s:&:S&:S +%%%a;{9;}C,%$ck7JGfwVk[wEZ|22t8 Gk_;CCZC_CbC_Cw_Cw +000]T3=T~n30|h".P_>m@UBfFe6&&R74ZUf EEeE E\E Ef Ef +WWW-T<>Tb&&Wo+gP/I=:DwxL;)$XX10VKwwGuu)u5ucu5uL5uL +ttt"{R^{DNJtq&.a@F+y`mMBzpARRwn!XmyOHHpHBBH.hon=|00T0g060g03g03 +EEE.eUfe^ E 4O7r,6[6&D<;T2s1)P+LZZoWWTWZWdWZW3jj]k1[;K^))3)zN)8);)K)K +888RK<"K[<8(bZ%y `N]=,S[4BB8G/X!=%``4`;5`Y`!`S`S +KKKr6s!6L!Kdn-2[~Pa7}%S8oXXq["_&fc::o: #:s:&:S:S +%%%a;C|;}i%$ck7JGfwVk[wEZ>>8 G(_v;CCZC_CbC_CwCw +000]Tnm@UBfFeVV74Z9 N EEeE E\E EfEf +WWW-T&XTb-Wo+gP/I=:DwxL;)pp0VK,5 Guu)u5ucu5uLuL +ttt"{N"{Dltq&.a@F+y`mMBzp.RT{Sn!X<m@UBfFe23j2b)uhb?}}} f EEeE E\E EfEf +WWW-Tc-Tb&Wo+gP/I=:DwxL;)bJkb2M?+2q{{{5wGuu)u5ucu5uLuL +ttt"{Z"{DJtq&.a@F+y`mMBzpW#SWiljQio///3x]k1;B^))3);)8);)K)K +888AKCK[R8(`v .Gy `N]S,=[4~8G/!5%``4`!`Y`!`S`S +KKKg6+6LgKdP lQ|[~Pa7S%}8oeq["&ic::o:&:s:&:S:S +%%%9;,;}~%$fL]RQJGfwVw[kEZR8 G_X;CCZC_CbC_CwCw +000=TgT~p0|>B7u8P_>m@fBUFey74Z a EEeE E\E EfEf +WWW>TZTb3x]k1KC^))3);)8);)K)K +888AKCK[^l8(`v .Gy `N]S,=[4~8G/S;%``4`!`Y`!`S`S +KKKg6+6Ls+KdP lQ|[~Pa7S%}8oeq["}&c::o:&:s:&:S:S +%%%9;,;}C{%$fL]RQJGfwVw[kEZR8 Gkw;CCZC_CbC_CwCw +000=TgT~nn0|>B7u8P_>m@fBUFey74ZUU EEeE E\E EfEf +WWW>TZTb&XWo=5G\f/I=:DLxw;)n0VKw`Guu)u5ucu5uLuL +ttt^{l{DNHtq+*L8!@F+y`BMmzp*n!Xm OHHpH3x]k1|K^))3);)8)K)m:|MCBM)K +888AKCK["<8(`v .Gy `N]S,=[4~8G/Q=%``4`!`Y`!`S`S +KKKg6+6L!!KdP lQ|[~Pa7S%}8oeq["ffc::o:&:s:&:S:S +%%%9;,;}|i%$fL]RQJGfwVw[kEZR8 G!v;CCZC_CbC_CwCw +000=TgT~B7u8P_>m@fBUFey74ZCN EEeE E\E EfEf +WWW>TZTbX-Wo=5G\f/I=:DLxw;)n0VK` Guu)u5ucu5uLuL +ttt^{l{DJ^tq+*L8!@F+y`BMmzp*n!Xy~OHHpH3x]k1MM^))3);)8);)K)K +888AKCK[-78(`v .Gy `N]S,=[4~8G/tU%``4`!`Y`!`S`S +KKKg6+6L1rKdP lQ|[~Pa7S%}8oeq["O#c::o:&:s:&:S:S +%%%9;,;}i9%$fL]RQJGfwVw[kEZR8 Gv,;CCZC_CbC_CwCw +000=TgT~ci0|>B7u8P_>m@fBUFey74ZI% EEeE E\E EfEf +WWW>TZTbM^Wo=5G\f/I=:DLxw;)n0VK \Guu)u5ucu5uLuL +ttt^{l{D ltq+*L8!@F+y`BMmzp*n!X;3x]k1B@^))3);)8);)K)K +888AKCK[7@8(`v .Gy `N]S,=[4~8G/U9%``4`!`Y`!`S`S +KKKg6+6L&eKdP lQ|[~Pa7S%}8oeq["v c::o:&:s:&:S:S +%%%9;,;}a,%$fL]RQJGfwVw[kEZR8 Gg_;CCZC_CbC_CwCw +000=TgT~]30|>B7u8P_>m@fBUFey74Z.f EEeE E\EfEU= Nd NEf +WWW>TZTb-&Wo=5G\f/I=:DLxw;)n0VK wGuu)u5ucu5uLuL +ttt^{l{D"Jtq+*L8!@F+y`BMmzp*n!XfyOHHpH3x]k1@;^))3);)8);)K)K +888AKCK[A^8(`v .Gy `N]S,=[4~8G/TS%``4`!`Y`!`S`S +KKKg6+6LgsKdP lQ|[~Pa7S%}8oeq["i}c::o:&:s:&:S:S +%%%9;,;}9|%$fL]RQJGfwVw[kEZR8 G,!;CCZC_CbC_CwCw +000=TgT~=c0|>B7u8P_>m@fBUFey74ZdI EEeE E\E EfEf +WWW>TZTb>RWo=5G\f/I=:DLxw;)n0VK&jGuu)u5ucu5uLuL +ttt^{l{D^"tq+*L8!@F+y`BMmzp*n!X~fOHHpH3x]k1C|^))3);)8);)K)K +888AKCK[@-8(`v .Gy `N]S,=[4~8G/9t%``4`!`Y`!`S`S +KKKg6+6Lf&KdP lQ|[~Pa7S%}8oeq["uvc::o:&:s:&:S:S +%%%9;,;}~a%$fL]RQJGfwVw[kEZR8 GXg;CCZC_CbC_CwCw +000=TgT~i=0|>B7u8P_>m@fBUFey74Z%d EEeE E\E EfEf +WWW>TZTbccWo=5G\f/I=:DLxw;)n0VKNNGuu)u5ucu5uLuL +ttt^{l{DZGtq+*L8!@F+y`BMmzp*n!X:5OHHpH3x]k1;;^))3);)8)K)m:|mC|C)K +888AKCK[lA8(`v .Gy `N]S,Q[4~8G/!S%``4`!`Y`S`=Vt=T9t`S +KKKg6+6LefKdP lQ|[~Pa7S%f8oeq["&}c::o:&:s:&:S:S +%%%9;,;}((%$fL]RQJGfwVw[!EZR8 G_!;CCZC_CbC_CwCw +000=TgT~3gg0|>B7u8P_>m@fBCFey74Z I EEeE E\E EfEf +WWW>TZTb3x]k1K|^))3);)8);)K)K +888AKCK[^^C8(`v .Gy `N]S,Q[4~8G/St%``4`!`Y`!`S`S +KKKg6+6LzzzKdP lQ|[~Pa7S%f8oeq["Svc::o:&:s:&:S:S +%%%9;,;}{{C%$fL]RQJGfwVw[!EZR8 Gwg;CCZC_CbC_CwCw +000=TgT~33<0|>B7u8P_>m@fBCFey74Zfd EEeE E\E EfEf +WWW>TZTb<3x]k1mN^))3);)8);)K)K +888AKCK[^<"8(`v .Gy `N]S,Q[4~8G/=T%``4`!`Y`!`S`S +KKKg6+6Lzs1KdP lQ|[~Pa7S%f8oeq["}uc::o:&:s:&:S:S +%%%9;,;}{C:%$fL]RQJGfwVw[!EZR8 Gkx;CCZC_CbC_CwCw +000=TgT~3n]0|>B7u8P_>m@fBCFey74ZC EEeE E\E EfEf +WWW>TZTb<&>Wo=5G\f/I=:DLx`;)n0VK`LGuu)u5ucu5uLuL +ttt^{l{DRNZtq+*L8!@F+y`BMyzp*n!XymOHHpHoWWTWZWdWZW3x]k1|z^))3);)8);)K)K +888AKCK[^"R8(`v .Gy `N]S,Q[4~8G/t!%``4`!`Y`!`S`S +KKKg6+6Lz!gKdP lQ|[~Pa7S%f8oeq["OSc::o:&:s:&:S:S +%%%9;,;}{|~%$fL]RQJGfwVw[!EZR8 Gvk;CCZC_CbCwCkK!,k,]Cw +000=TgT~3B7u8P_>m@fBCFey74ZIC EEeE E\E EfEf +WWW>TZTb3x]k1Bm^))3);)8);)K)K +888AKCK[^-l8(`v .Gy `N]S,Q[4~8G/UQ%``4`!`Y`!`S`S +KKKg6+6Lz&+KdP lQ|[~Pa7S%f8oeq["vOc::o:&:s:&:S:S +%%%9;,;}{:{%$fL]RQJGfwVw[!EZR8 G]];CCZC_CbCwCkKvXx,XCw +000=TgT~3wn0|>B7u8P_>m@fBCFey74ZN. EEeE E\E EfEf +WWW>TZTb3x]k1NB^))3);)8);)K)K +888AKCK[^R<8(`v .Gy `N]S,Q[4~8G/55%``4`!`Y`!`S`S +KKKg6+6Lzr!KdP lQ|[~Pa7S%f8oeq["#ic::o:&:s:&:S:S +%%%9;,;}{ai%$fL]RQJGfwVw[!EZR8 GgX;CCZC_CbC_CwCw +000=TgT~3]w0|>B7u8P_>m@fBCFey74Z.a EEeE E\E EfEf +WWW>TZTb<--Wo=5G\f/I=:DLx`;)n0VK&5Guu)u5ucu5uLuL +ttt^{l{DR"^tq+*L8!@F+y`BMyzp*n!X~BOHHpH-oWWTWZWdWZW3x]k1@C^))3);)8)K)m:|CmCm)K +888AKCK[^A78(`v .Gy `N]S,Q[4~8G/T;%``4`!`Y`!`S`S +KKKg6+6LzgrKdP lQ|[~Pa7S%f8oeq["u&c::o:&:s:&:S:S +%%%9;,;}{99%$fL]RQJGfwVw[!EZR8 GXw;CCZC_CbC_CwCw +000=TgT~3=i0|>B7u8P_>m@fBCFey74Z%U EEeE E\E EfEf +WWW>TZTb<>^Wo=5G\f/I=:DLx`;)n0VKN`Guu)u5ucu5uLuL +ttt^{l{DRZltq+*L8!@F+y`BMyzp*n!X: OHHpH3x]k1zK^))3);)8);)K)K +888AKCK[^@@8(`v .Gy `N]S,Q[4~8G/;=%``4`!`Y`!`S`S +KKKg6+6LzfeKdP lQ|[~Pa7S%f8oeq[" fc::o:&:s:&:S:S +%%%9;,;}{(,%$fL]RQJGfwVw[!EZR8 Gxv;CCZC_CbC_CwCw +000=TgT~3p30|>B7u8P_>m@fBCFey74ZaN EEeE E\E EfEf +WWW>TZTb<^&Wo=5G\f/I=:Dwxw;)n0VK55Guu)u5ucu5uLuL +ttt^{l{DRGJtq+*L8!@F+y`mMmzp*n!X3x]k1;C^))3);)8);)K)K +888AKCK[B7u8P_>m@UBUFey74ZfU EEeE E\E EfEf +WWW>TZTb&ZRWo=5G\f/I=:Dwxw;)n0VKL`Guu)u5ucu5uLuL +ttt^{l{DNl"tq+*L8!@F+y`mMmzp*n!XB OHHpH3x]k1mK^))3);)8);)K)K +888AKCK[<^-8(`v .Gy `N]=,=[4~8G/==%``4`!`Y`!`S`S +KKKg6+6Lsz&KdP lQ|[~Pa7}%}8oeq["}fc::o:&:s:&:S:S +%%%9;,;}C{a%$fL]RQJGfwVk[kEZR8 Gkv;CCZC_CbC_CwCw +000=TgT~n3=0|>B7u8P_>m@UBUFey74ZUN EEeE E\E EfEf +WWW>TZTb&ZMW< +uuu&)5)[wwjuG$Xqvgd=$EkNmNV{3a&_JJqtt{tlt/tltRtR +HHH~p3x]k1|M^))3);)8);)K)K +888AKCK[<B7u8P_>m@UBUFey74ZC% EEeE E\E EfEf +WWW>TZTb&X3x]k1M@^))3);)8);)K)K +888AKCK[<-C8(`v .Gy `N]=,=[4~8G/t9%``4`!`Y`!`S`S +KKKg6+6Ls1zKdP lQ|[~Pa7}%}8oeq["O c::o:&:s:&:S:S +%%%9;,;}CiC%$fL]RQJGfwVk[kEZR8 G]_;CCZC_CbC_CwCw +000=TgT~nc<0|>B7u8P_>m@UBUFey74ZNf EEeE E\EfEU= .C%%Ef +WWW>TZTb&MMWo=5G\f/I=:Dwxw;)n0VKjwGuu)u5ucu5uLuL +ttt^{l{DNH tq+*L8!@F+y`mMmzp*n!X;yOHHpH3x]k1N;^))3);)8);)K)K +888AKCK[<7"8(`v .Gy `N]=,=[4~8G/5S%``4`!`Y`!`S`S +KKKg6+6Ls&1KdP lQ|[~Pa7}%}8oeq["#}c::o:&:s:&:S:S +%%%9;,;}C::%$fL]RQJGfwVk[kEZR8 Gg!;CCZC_CbCwCkKw,x_kCw +000=TgT~nw]0|>B7u8P_>m@UBUFey74Z.I EEeE E\E EfEf +WWW>TZTb&R>Wo=5G\f/I=:Dwxw;)n0VK jGuu)u5ucu5uLuL +ttt^{l{DN Ztq+*L8!@F+y`mMmzp*n!XffOHHpH3x]k1@|^))3);)8);)K)K +888AKCK[B7u8P_>m@UBUFey74Zdd EEeE E\E EfEf +WWW>TZTb&>ZWo=5G\f/I=:Dwxw;)n0VK&NGuu)u5ucu5uLuL +ttt^{l{DN^Rtq+*L8!@F+y`mMmzp*n!X~5OHHpH3x]k1CN^))3);)8);)K)K +888AKCK[B7u8P_>m@UBUFey74Za EEeE E\E EfEf +WWW>TZTb&cXWo=5G\f/I=:Dwxw;)n0VK\LGuu)u5ucuLuwQwL 5`uL +ttt^{l{DNZHtq+*L8!@F+y`mMmzp*n!X5mOHHpH3x]k1;|^))3);)8);)K)K +888AKCK[B7u8P_>m@UBCFey74Z d EEeE E\E EfEf +WWW>TZTb&^-Wo=5G\f/I=:Dwx`;)n0VK5NGuu)u5ucu5uLuL +ttt^{l{DNG^tq+*L8!@F+y`mMyzp*n!X<5OHHpH3x]k1KN^))3);)8);)K)K +888AKCK["C78(`v .Gy `N]=,Q[4~8G/ST%``4`!`Y`!`S`S +KKKg6+6L!+rKdP lQ|[~Pa7}%f8oeq["Suc::o:&:s:&:S:S +%%%9;,;}|,9%$fL]RQJGfwVk[!EZR8 Gwx;CCZC_CbC_CwCw +000=TgT~B7u8P_>m@UBCFey74ZU EEeE E\EfEU=Id.IUEf +WWW>TZTbXZ^Wo=5G\f/I=:Dwx`;)n0VKwLGuu)u5ucu5uLuL +ttt^{l{DJRltq+*L8!@F+y`mMyzp*n!XmmOHHpHoWWTWZWdWZW3x]k1mz^))3);)8);)K)K +888AKCK["^@8(`v .Gy `N]=,Q[4~8G/Q!%``4`!`Y`!`S`S +KKKg6+6L!zeKdP lQ|[~Pa7}%f8oeq["fSc::o:&:s:&:S:S +%%%9;,;}|C,%$fL]RQJGfwVk[!EZR8 G!k;CCZC_CbCwCkKk]X,kCw +000=TgT~B7u8P_>m@UBCFey74ZCC EEeE E\E EfEf +WWW>TZTbX&&Wo=5G\f/I=:Dwx`;)n0VK` Guu)u5ucu5uLuL +ttt^{l{DJNJtq+*L8!@F+y`mMyzp*n!Xy;OHHpH3x]k1Mm^))3);)8);)K)K +888AKCK[""^8(`v .Gy `N]=,Q[4~8G/tQ%``4`!`Y`!`S`S +KKKg6+6L!!sKdP lQ|[~Pa7}%f8oeq["OOc::o:&:s:&:S:S +%%%9;,;}|||%$fL]RQJGfwVk[!EZR8 Gv];CCZC_CbCwCkKkk]!gCw +000=TgT~<B7u8P_>m@UBCFey74ZI. EEeE E\E EfEf +WWW>TZTbXXRWo=5G\f/I=:Dwx`;)n0VK &Guu)u5ucu5uLuL +ttt^{l{DJJ"tq+*L8!@F+y`mMyzp*n!X :OHHpH3x]k1BB^))3);)8)K)m:MKm;|)m +888AKCK["--8(`v .Gy `N]=,Q[4~8G/U5%``4`!`Y`!`S`S +KKKg6+6L!1&KdP lQ|[~Pa7}%f8oeq["vic::o:&:s:&:S:S +%%%9;,;}|ia%$fL]RQJGfwVk[!EZR8 G]X;CCZC_CbC_CwCw +000=TgT~B7u8P_>m@UBCFey74ZNa EEeE E\E EfEf +WWW>TZTbXMcWo=5G\f/I=:Dwx`;)n0VK 5Guu)u5ucu5uLuL +ttt^{l{DJHGtq+*L8!@F+y`mMyzp*n!XfBOHHpH3x]k1NC^))3);)8);)K)K +888AKCK["7A8(`v .Gy `N]=,Q[4~8G/5;%``4`!`Y`S`=VtUUtt`S +KKKg6+6L!&fKdP lQ|[~Pa7}%f8oeq["i&c::o:&:s:&:S:S +%%%9;,;}|:(%$fL]RQJGfwVk[!EZR8 G,w;CCZC_CbC_CwCw +000=TgT~<]g0|>B7u8P_>m@UBCFey74ZdU EEeE E\E EfEf +WWW>TZTbX-^oWWTWZWdWZW3x]k1CK^))3);)8);)K)K +888AKCK["AC8(`v .Gy `N]=,Q[4~8G/9=%``4`!`Y`!`S`S +KKKg6+6L!gzKdP lQ|[~Pa7}%f8oeq["ufc::o:&:s:&:S:S +%%%9;,;}|9C%$fL]RQJGfwVk[!EZR8 GXv;CCZC_CbC_CwCw +000=TgT~<=<0|>B7u8P_>m@UBCFey74Z%N EEeE E\EfEU= dd CEf +WWW>TZTbX>MWo=5G\f/I=:Dwx`;)n0VKN Guu)u5ucu5uLuL +ttt^{l{DJ^ tq+*L8!@F+y`mMyzp*n!X:~OHHpH3x]k1zM^))3);)8);)K)K +888AKCK["@"8(`v .Gy `N]=,Q[4~8G/;U%``4`!`Y`!`S`S +KKKg6+6L!f1KdP lQ|[~Pa7f%S8oeq["&&c::o:&:s:&:S:S +%%%9;,;}|~:%$fL]RQJGfwV![wEZR8 G_w;CCZC_CbC_CwCw +000=TgT~B7u8P_>m@CBfFey74Z U EEeE E\E EfEf +WWW>TZTbXc>Wo=5G\f/I=:D`xL;)n0VK5`Guu)u5ucu5uLuL +ttt^{l{DJZZtq+*L8!@F+y`yMBzp*n!X< OHHpH3x]k1KK^))3);)8)K)m:mzzC@)K +888AKCK["lR8(`v .Gy `N]Q,S[4~8G/S=%``4`!`Y`!`S`S +KKKg6+6L!egKdP lQ|[~Pa7f%S8oeq["Sfc::o:&:s:&:S:S +%%%9;,;}|(~%$fL]RQJGfwV![wEZR8 Gwv;CCZC_CbC_CwCw +000=TgT~B7u8P_>m@CBfFey74ZfN EEeE E\E EfEf +WWW>TZTbMZZWo=5G\f/I=:D`xL;)n0VKL Guu)u5ucu5uLuL +ttt^{l{DHlRtq+*L8!@F+y`yMBzp*n!XB~OHHpH3x]k1mM^))3);)8);)K)K +888AKCK[-Cl8(`v .Gy `N]Q,S[4~8G/=U%``4`!`Y`!`S`S +KKKg6+6L1z+KdP lQ|[~Pa7f%S8oeq["}#c::o:&:s:&:S:S +%%%9;,;}i{{%$fL]RQJGfwV![wEZR8 Gk,;CCZC_CbCwCkKvwXXvCw +000=TgT~c3n0|>B7u8P_>m@CBfFey74ZU% EEeE E\E EfEf +WWW>TZTbM3x]k1|@^))3);)8);)K)K +888AKCK[-<<8(`v .Gy `N]Q,S[4~8G/Q9%``4`!`Y`!`S`S +KKKg6+6L1s!KdP lQ|[~Pa7f%S8oeq["f c::o:&:s:&:S:S +%%%9;,;}iCi%$fL]RQJGfwV![wEZR8 Gv_;CCZC_CbC_CwCw +000=TgT~cnw0|>B7u8P_>m@CBfFey74ZIf EEeE E\E EfEf +WWW>TZTbM&-Wo=5G\f/I=:D`xL;)n0VK wGuu)u5ucu5uLuL +ttt^{l{DHN^tq+*L8!@F+y`yMBzp*n!X yOHHpH3x]k1B;^))3);)8);)K)K +888AKCK[-"78(`v .Gy `N]Q,S[4~8G/US%``4`!`Y`!`S`S +KKKg6+6L1!rKdP lQ|[~Pa7f%S8oeq["v}c::o:&:s:&:S:S +%%%9;,;}i|9%$fL]RQJGfwV![wEZR8 G]!;CCZC_CbCwCkK_kwkvCw +000=TgT~cB7u8P_>m@CBfFey74ZNI EEeE E\E EfEf +WWW>TZTbMX^Wo=5G\f/I=:D`xL;)n0VKjjGuu)u5ucu5uLuL +ttt^{l{DHHltq+*L8!@F+y`yMBzp*n!X;fOHHpH3x]k1N|^))3);)8);)K)K +888AKCK[--@8(`v .Gy `N]Q,S[4~8G/5t%``4`!`Y`!`S`S +KKKg6+6L11eKdP lQ|[~Pa7f%S8oeq["#vc::o:&:s:S:}.fu}&v:S +%%%9;,;}i:,%$fL]RQJGfwV![wEZR8 Ggg;CCZC_CbC_CwCw +000=TgT~cw30|>B7u8P_>m@CBfFey74Z.d EEeE E\E EfEf +WWW>TZTbMR&Wo=5G\f/I=:D`xL;)n0VK NGuu)u5ucu5uLuL +ttt^{l{DH Jtq+*L8!@F+y`yMBzp*n!Xf5OHHpHMoWWTWZWdWZW3x]k1@N^))3);)8)K)m:mm|CC)K +888AKCK[-R^8(`v .Gy `N]Q,S[4~8G/TT%``4`!`Y`!`S`S +KKKg6+6L1rsKdP lQ|[~Pa7f%S8oeq["iuc::o:&:s:&:S:S +%%%9;,;}ia|%$fL]RQJGfwV![wEZR8 G,x;CCZC_CbC_CwCw +000=TgT~c]c0|>B7u8P_>m@CBfFey74Z% EEeE E\EfEU=Uf%%aEf +WWW>TZTbM-RWo=5G\f/I=:D`xL;)n0VKNLGuu)u5ucu5uLuL +ttt^{l{DH""tq+*L8!@F+y`yMBzp*n!X:mOHHpHoWWTWZWdWZW3x]k1Cz^))3);)8);)K)K +888AKCK[-A-8(`v .Gy `N]Q,S[4~8G/;!%``4`!`Y`!`S`S +KKKg6+6L1g&KdP lQ|[~Pa7f%S8oeq[" Sc::o:&:s:&:S:S +%%%9;,;}i9a%$fL]RQJGfwV![wEZR8 Gxk;CCZC_CbC_CwCw +000=TgT~c==0|>B7u8P_>m@CBfFey74ZaC EEeE E\E EfEf +WWW>TZTbM>cWo=5G\f/I=:D`xL;)n0VK\ Guu)u5ucu5uLuL +ttt^{l{DH^Gtq+*L8!@F+y`yMBzp*n!X5;OHHpH3x]k1;N^))3);)8);)K)K +888AKCK[-@A8(`v .Gy `N]Q,=[4~8G/!T%``4`!`Y`!`S`S +KKKg6+6L1ffKdP lQ|[~Pa7f%}8oeq["&uc::o:&:s:&:S:S +%%%9;,;}i~(%$fL]RQJGfwV![kEZR8 G_x;CCZC_CbC_CwCw +000=TgT~cpg0|>B7u8P_>m@CBUFey74Zf EEeE E\E EfEf +WWW>TZTbM^oWWTWZWdWZW3x]k1Kz^))3);)8);)K)K +888AKCK[7CC8(`v .Gy `N]Q,=[4~8G/=!%``4`!`Y`!`S`S +KKKg6+6L&+zKdP lQ|[~Pa7f%}8oeq["}Sc::o:&:s:&:S:S +%%%9;,;}:,C%$fL]RQJGfwV![kEZR8 Gkk;CCZC_CbC_CwCw +000=TgT~wg<0|>B7u8P_>m@CBUFey74ZUC EEeE E\E EfEf +WWW>TZTbRZMWo=5G\f/I=:D`xw;)n0VKw Guu)u5ucu5uLuL +ttt^{l{D l tq+*L8!@F+y`yMmzp*n!Xm;OHHpH3x]k1|m^))3);)8);)K)K +888AKCK[7^"8(`v .Gy `N]Q,=[4~8G/QQ%``4`!`Y`!`S`S +KKKg6+6L&z1KdP lQ|[~Pa7f%}8oeq["fOc::o:&:s:&:S:S +%%%9;,;}:{:%$fL]RQJGfwV![kEZR8 G!];CCZC_CbC_CwCw +000=TgT~w3]0|>B7u8P_>m@CBUFey74ZC. EEeE E\E EfEf +WWW>TZTbR<>Wo=5G\f/I=:D`xw;)n0VK`&Guu)u5ucu5uLuL +ttt^{l{D RZtq+*L8!@F+y`yMmzp*n!Xy:OHHpH3x]k1MB^))3);)8);)K)K +888AKCK[7B7u8P_>m@CBUFey74ZIa EEeE E\E EfEf +WWW>TZTbRXZWo=5G\f/I=:D`xw;)n0VKj5Guu)u5ucuLuwQLNN``uL +ttt^{l{D JRtq+*L8!@F+y`yMmzp*n!X;BOHHpH3x]k1BC^))3);)8)K)m:m@NMC)K +888AKCK[7"l8(`v .Gy `N]Q,=[4~8G/U;%``4`!`Y`!`S`S +KKKg6+6L&1+KdP lQ|[~Pa7f%}8oeq["#&c::o:&:s:&:S:S +%%%9;,;}:i{%$fL]RQJGfwV![kEZR8 Ggw;CCZC_CbC_CwCw +000=TgT~wcn0|>B7u8P_>m@CBUFey74Z.U EEeE E\E EfEf +WWW>TZTbRMXWo=5G\f/I=:D`xw;)n0VK `Guu)u5ucu5uLuL +ttt^{l{D HHtq+*L8!@F+y`yMmzp*n!Xf OHHpH3x]k1@K^))3);)8);)K)K +888AKCK[77<8(`v .Gy `N]Q,=[4~8G/T=%``4`!`Y`!`S`S +KKKg6+6L&&!KdP lQ|[~Pa7f%}8oeq["ifc::o:&:s:&:S:S +%%%9;,;}::i%$fL]RQJGfwV![kEZR8 G,v;CCZC_CbC_CwCw +000=TgT~www0|>B7u8P_>m@CBUFey74ZdN EEeE E\E EfEf +WWW>TZTbRR-Wo=5G\f/I=:D`xw;)n0VK& Guu)u5ucu5uLuL +ttt^{l{D ^tq+*L8!@F+y`yMmzp*n!X~~OHHpH3x]k1CM^))3);)8);)K)K +888AKCK[7R78(`v .Gy `N]Q,=[4~8G/9U%``4`!`Y`!`S`S +KKKg6+6L&rrKdP lQ|[~Pa7f%}8oeq["u#c::o:&:s:&:S:S +%%%9;,;}:a9%$fL]RQJGfwV![kEZR8 GX,;CCZC_CbC_CwCw +000=TgT~w]i0|>B7u8P_>m@CBUFey74Z%% EEeE E\E EfEf +WWW>TZTbR-^Wo=5G\f/I=:D`xw;)n0VKN\Guu)u5ucu5uLuL +ttt^{l{D ^ltq+*L8!@F+y`yMmzp*n!X53x]k1;K^))3);)8)K)m:;BBKB)K +888AKCK[7A@8(`v .Gy `N]Q,Q[4~8G/!=%``4`!`Y`!`S`S +KKKg6+6L&geKdP lQ|[~Pa7f%f8oeq["&fc::o:&:s:&:S:S +%%%9;,;}:~,%$fL]RQJGfwV![!EZR8 G_v;CCZC_CbC_CwCw +000=TgT~wi30|>B7u8P_>m@CBCFey74Z N EEeE E\EfEU=faaCaEf +WWW>TZTbRc&Wo=5G\f/I=:D`x`;)n0VK5 Guu)u5ucu5uLuL +ttt^{l{D ZJtq+*L8!@F+y`yMyzp*n!X<~OHHpH3x]k1KM^))3);)8);)K)K +888AKCK[7l^8(`v .Gy `N]Q,Q[4~8G/SU%``4`!`Y`!`S`S +KKKg6+6L&esKdP lQ|[~Pa7f%f8oeq["S#c::o:&:s:S:}.&uvO}:S +%%%9;,;}:(|%$fL]RQJGfwV![!EZR8 Gw,;CCZC_CbCwCkK!g!_!Cw +000=TgT~wpc0|>B7u8P_>m@CBCFey74Zf% EEeE E\E EfEf +WWW>TZTbR^RWo=5G\f/I=:D`x`;)n0VKL\Guu)u5ucuLuwQLjwLuL +ttt^{l{D G"tq+*L8!@F+y`yMyzp*n!Xm3x]k1m@^))3);)8);)K)K +888AKCK[RC-8(`v .Gy `N]Q,Q[4~8G/=9%``4`!`Y`!`S`S +KKKg6+6Lr+&KdP lQ|[~Pa7f%f8oeq["} c::o:&:s:S:}.Sv i:S +%%%9;,;}a,a%$fL]RQJGfwV![!EZR8 G!_;CCZC_CbC_CwCw +000=TgT~]g=0|>B7u8P_>m@CBCFey74ZCf EEeE E\EfEU=CNdNUEf +WWW>TZTb-ZcWo=5G\f/I=:D`x`;)n0VK`wGuu)u5ucu5uLuL +ttt^{l{D"lGtq+*L8!@F+y`yMyzp*n!XyyOHHpH3x]k1M;^))3);)8);)K)K +888AKCK[R^A8(`v .Gy `N]Q,Q[4~8G/tS%``4`!`Y`!`S`S +KKKg6+6LrzfKdP lQ|[~Pa7f%f8oeq["O}c::o:&:s:&:S:S +%%%9;,;}a{(%$fL]RQJGfwV![!EZR8 Gv!;CCZC_CbCwCkK_wXxXCw +000=TgT~]ng0|>B7u8P_>m@CBCFey74ZII EEeE E\E EfEf +WWW>TZTb-&3x]k1B|^))3);)8);)K)K +888AKCK[R"C8(`v .Gy `N]Q,Q[4~8G/Ut%``4`!`Y`!`S`S +KKKg6+6Lr!zKdP lQ|[~Pa7f%f8oeq["vvc::o:&:s:S:}.fSOSi:} +%%%9;,;}a|C%$fL]RQJGfwV![!EZR8 G]g;CCZC_CbCwCkKkkXkXCw +000=TgT~]<<0|>B7u8P_>m@CBCFey74ZNd EEeE E\E EfEf +WWW>TZTb-XMWo=5G\f/I=:D`x`;)n0VKjNGuu)u5ucu5uLuL +ttt^{l{D"J tq+*L8!@F+y`yMyzp*n!X;5OHHpH3x]k1NN^))3);)8);)K)K +888AKCK[R-"8(`v .Gy `N]Q,Q[4~8G/5T%``4`!`Y`!`S`S +KKKg6+6Lr11KdP lQ|[~Pa7f%f8oeq["#uc::o:&:s:S:}.&vfOS:S +%%%9;,;}ai:%$fL]RQJGfwV![!EZR8 Ggx;CCZC_CbC_CwCw +000=TgT~]c]0|>B7u8P_>m@CBCFey74Zd EEeE E\E EfEf +WWW>TZTb-M>Wo=5G\f/I=:D`x`;)n0VK&LGuu)u5ucu5uLuL +ttt^{l{D"HZtq+*L8!@F+y`yMyzp*n!X~mOHHpH>oWWTWZWdWZW3x]k1@z^))3);)8)K)m:|;;z)K +888AKCK[R7R8(`v .Gy `N]Q,Q[4~8G/9!%``4`!`Y`!`S`S +KKKg6+6Lr&gKdP lQ|[~Pa7f%f8oeq["uSc::o:&:s:&:S:S +%%%9;,;}a:~%$fL]RQJGfwV![!EZR8 GXk;CCZC_CbC_CwCw +000=TgT~]wp0|>B7u8P_>m@CBCFey74Z%C EEeE E\E EfEf +WWW>TZTb--ZWo=5G\f/I=:D`x`;)n0VKN Guu)u5ucu5uLuL +ttt^{l{D""Rtq+*L8!@F+y`yMyzp*n!X:;OHHpH3x]k1zm^))3);)8)K)m:KC;@C)K +888AKCK[RRl8(`v .Gy `N]Q,Q[4~8G/;Q%``4`!`Y`!`S`S +KKKg6+6Lrg+KdP lQ|[~Pa7f%f8oeq[" Oc::o:&:s:&:S:S +%%%9;,;}a9{%$fL]RQJGfwV![!EZR8 Gx];CCZC_CbC_CwCw +000=TgT~]=n0|>B7u8P_>m@IBfFey74Z EEeE E\E EfEf +WWW>TZTb->XWo=5G\f/I=:D xL;)n0VK5LGuu)u5ucu5uLuL +ttt^{l{D"^Htq+*L8!@F+y` MBzp*n!XoWWTWZWdWZW3x]k1;z^))3);)8);)K)K +888AKCK[R@<8(`v .Gy `N]t,S[4~8G/S!%``4`!`Y`S`=VS=U5S`S +KKKg6+6Lrf!KdP lQ|[~Pa7O%S8oeq["SSc::o:&:s:&:S:S +%%%9;,;}a~i%$fL]RQJGfwVv[wEZR8 Gwk;CCZC_CbC_CwCw +000=TgT~]iw0|>B7u8P_>m@IBfFey74ZfC EEeE E\E EfEf +WWW>TZTb-c-Wo=5G\f/I=:D xL;)n0VKL Guu)u5ucu5uLuL +ttt^{l{D"Z^tq+*L8!@F+y` MBzp*n!XB;OHHpH3x]k1mm^))3);)8);)K)K +888AKCK[Rl78(`v .Gy `N]t,S[4~8G/=Q%``4`!`Y`!`S`S +KKKg6+6LrerKdP lQ|[~Pa7O%S8oeq["}Oc::o:&:s:&:S:S +%%%9;,;}a(9%$fL]RQJGfwVv[wEZR8 Gk];CCZC_CbC_CwCw +000=TgT~]pi0|>B7u8P_>m@IBfFey74ZU. EEeE E\E EfEf +WWW>TZTb-^^Wo=5G\f/I=:D xL;)n0VKw&Guu)u5ucu5uLuL +ttt^{l{D^lltq+*L8!@F+y` MBzp*n!Xm:OHHpH3x]k1|B^))3);)8)K)m:;;C@M)K +888AKCK[AC@8(`v .Gy `N]t,S[4~8G/Q5%``4`!`Y`!`S`S +KKKg6+6Lg+eKdP lQ|[~Pa7O%S8oeq["fic::o:&:s:&:S:S +%%%9;,;}9{,%$fL]RQJGfwVv[wEZR8 G!X;CCZC_CbC_CwCw +000=TgT~=330|>B7u8P_>m@IBfFey74ZCa EEeE E\E EfEf +WWW>TZTb><&Wo=5G\f/I=:D xL;)n0VK 5Guu)u5ucu5uLuL +ttt^{l{D^RJtq+*L8!@F+y` MBzp*n!X BOHHpH3x]k1MC^))3);)8);)K)K +888AKCK[A<^8(`v .Gy `N]t,S[4~8G/t;%``4`!`Y`!`S`S +KKKg6+6LgssKdP lQ|[~Pa7O%S8oeq["v&c::o:&:s:S:}.SvviO:S +%%%9;,;}9C|%$fL]RQJGfwVv[wEZR8 G]w;CCZC_CbC_CwCw +000=TgT~=nc0|>B7u8P_>m@IBfFey74ZNU EEeE E\EfEU=IU CUEf +WWW>TZTb>&RWo=5G\f/I=:D xL;)n0VKj`Guu)u5ucu5uLuL +ttt^{l{D^N"tq+*L8!@F+y` MBzp*n!X; OHHpH3x]k1NK^))3);)8);)K)K +888AKCK[A"-8(`v .Gy `N]t,S[4~8G/5=%``4`!`Y`!`S`S +KKKg6+6Lg!&KdP lQ|[~Pa7O%S8oeq["#fc::o:&:s:S:}.f}&if:S +%%%9;,;}9|a%$fL]RQJGfwVv[wEZR8 Ggv;CCZC_CbC_CwCw +000=TgT~=<=0|>B7u8P_>m@IBfFey74Z.N EEeE E\E EfEf +WWW>TZTb>XcWo=5G\f/I=:D xL;)n0VK Guu)u5ucu5uLuL +ttt^{l{D^JGtq+*L8!@F+y` MBzp*n!Xf~OHHpH&oWWTWZWdWZW3x]k1@M^))3);)8);)K)K +888AKCK[A-A8(`v .Gy `N]t,S[4~8G/TU%``4`!`Y`!`S`S +KKKg6+6Lg1fKdP lQ|[~Pa7O%S8oeq["i#c::o:&:s:&:S:S +%%%9;,;}9i(%$fL]RQJGfwVv[wEZR8 G,,;CCZC_CbC_CwCw +000=TgT~=wg0|>B7u8P_>m@IBfFey74Zd% EEeE E\E EfEf +WWW>TZTb>R3x]k1C@^))3);)8);)K)K +888AKCK[ARC8(`v .Gy `N]t,S[4~8G/99%``4`!`Y`!`S`S +KKKg6+6LgrzKdP lQ|[~Pa7O%S8oeq["u c::o:&:s:&:S:S +%%%9;,;}9aC%$fL]RQJGfwVv[wEZR8 Gx_;CCZC_CbC_CwCw +000=TgT~=]<0|>B7u8P_>m@IBfFey74Zaf EEeE E\E EfEf +WWW>TZTb>-MWo=5G\f/I=:D xL;)n0VK\wGuu)u5ucu5uLuL +ttt^{l{D^" tq+*L8!@F+y` MBzp*n!X5yOHHpHMW< +uuu&)5)[&&LuG$Xqvgd=$EkHmNV{3a&_lJqtt{tlt/tRtNslNNHtR +HHH~p3x]k1;M^))3);)8);)K)m +888AKCK[AA"8(`v .Gy `N]t,=[4~8G/!U%``4`!`Y`S`=V!!;Ut`S +KKKg6+6Lgg1KdP lQ|[~Pa7O%}8oeq["&#c::o:&:s:&:S:S +%%%9;,;}99:%$fL]RQJGfwVv[kEZR8 G_,;CCZC_CbCwCkK!vv,kCw +000=TgT~==]0|>B7u8P_>m@IBUFey74Z % EEeE E\E EfEf +WWW>TZTb>>>Wo=5G\f/I=:D xw;)n0VK5\Guu)u5ucu5uLuL +ttt^{l{D^^Ztq+*L8!@F+y` Mmzp*n!XB3x]k1K@^))3);)8);)K)K +888AKCK[A@R8(`v .Gy `N]t,=[4~8G/S9%``4`!`Y`!`S`S +KKKg6+6LgfgKdP lQ|[~Pa7O%}8oeq["S c::o:&:s:&:S:S +%%%9;,;}9~~%$fL]RQJGfwVv[kEZR8 Gk_;CCZC_CbC_CwCw +000=TgT~=ip0|>B7u8P_>m@IBUFey74ZUf EEeE E\E EfEf +WWW>TZTb>^ZWo=5G\f/I=:D xw;)n0VKwwGuu)u5ucu5uLuL +ttt^{l{D^GRtq+*L8!@F+y` Mmzp*n!XmyOHHpH3x]k1|;^))3);)8);)K)K +888AKCK[All8(`v .Gy `N]t,=[4~8G/QS%``4`!`Y`!`S`S +KKKg6+6Lf++KdP lQ|[~Pa7O%}8oeq["f}c::o:&:s:S:}.Suf# :S +%%%9;,;}~,{%$fL]RQJGfwVv[kEZR8 G!!;CCZC_CbCwCkKk_],,Cw +000=TgT~ign0|>B7u8P_>m@IBUFey74ZCI EEeE E\E EfEf +WWW>TZTbcZXWo=5G\f/I=:D xw;)n0VK`jGuu)u5ucuLuwQ`N`\NuL +ttt^{l{DZlHtq+*L8!@F+y` Mmzp*n!XyfOHHpH3x]k1M|^))3);)8);)K)K +888AKCK[@^<8(`v .Gy `N]t,=[4~8G/tt%``4`!`Y`S`=VSt`S +KKKg6+6Lfz!KdP lQ|[~Pa7O%}8oeq["Ovc::o:&:s:&:S:S +%%%9;,;}~{i%$fL]RQJGfwVv[kEZR8 Gvg;CCZC_CbC_CwCk +000=TgT~i3w0|>B7u8P_>m@IBUFey74ZId EEeE E\EfEU=f%N.CEf +WWW>TZTbc<-Wo=5G\f/I=:D xw;)n0VK NGuu)u5ucuLuwQ`5N uL +ttt^{l{DZR^tq+*L8!@F+y` Mmzp*n!X 5OHHpH3x]k1BN^))3);)8)K)m:m;BN|)K +888AKCK[@<78(`v .Gy `N]t,=[4~8G/UT%``4`!`Y`S`=V=S;QT`S +KKKg6+6LfsrKdP lQ|[~Pa7O%}8oeq["vuc::o:&:s:&:S:S +%%%9;,;}~C9%$fL]RQJGfwVv[kEZR8 G]x;CCZC_CbCwCkK!,v,XCw +000=TgT~ini0|>B7u8P_>m@IBUFey74Z. EEeE E\E EfEf +WWW>TZTbc&^Wo=5G\f/I=:D xw;)n0VK LGuu)u5ucu5uLuL +ttt^{l{DZJltq+*L8!@F+y` Mmzp*n!XfmOHHpHoWWTWZWdWZW3x]k1Nz^))3);)8);)K)K +888AKCK[@"@8(`v .Gy `N]t,=[4~8G/T!%``4`!`Y`S`=VS;Q;S`S +KKKg6+6Lf!eKdP lQ|[~Pa7O%}8oeq["iSc::o:&:s:&:S:S +%%%9;,;}~i,%$fL]RQJGfwVv[kEZR8 G,k;CCZC_CbC_CwCw +000=TgT~ic30|>B7u8P_>m@IBUFey74ZdC EEeE E\E EfEf +WWW>TZTbcM&Wo=5G\f/I=:D xw;)n0VK& Guu)u5ucu5uLuL +ttt^{l{DZHJtq+*L8!@F+y` Mmzp*n!X~;OHHpH3x]k1Cm^))3);)8);)K)K +888AKCK[@7^8(`v .Gy `N]t,=[4~8G/9Q%``4`!`Y`!`S`S +KKKg6+6Lf&sKdP lQ|[~Pa7O%}8oeq["uOc::o:&:s:&:S:S +%%%9;,;}~:|%$fL]RQJGfwVv[kEZR8 GX];CCZC_CbC_CwCw +000=TgT~iwc0|>B7u8P_>m@IBUFey74Z%. EEeE E\EfEU=CUCCfEf +WWW>TZTbcRRWo=5G\f/I=:D xw;)n0VKN&Guu)u5ucu5uLuL +ttt^{l{DZ "tq+*L8!@F+y` Mmzp*n!X::OHHpH3x]k1zB^))3);)8);)K)K +888AKCK[@R-8(`v .Gy `N]t,Q[4~8G/!!%``4`!`Y`S`=VS95QU`S +KKKg6+6Lfr&KdP lQ|[~Pa7O%f8oeq["&Sc::o:&:s:&:S:S +%%%9;,;}~aa%$fL]RQJGfwVv[!EZR8 G_k;CCZC_CbC_CwCw +000=TgT~i]=0|>B7u8P_>m@IBCFey74Z C EEeE E\E EfEf +WWW>TZTbc-cWo=5G\f/I=:D x`;)n0VK5 Guu)u5ucu5uLuL +ttt^{l{DZ"Gtq+*L8!@F+y` Myzp*n!X<;OHHpH3x]k1Km^))3);)8);)K)K +888AKCK[@AA8(`v .Gy `N]t,Q[4~8G/SQ%``4`!`Y`S`=Vt599t`S +KKKg6+6LfgfKdP lQ|[~Pa7O%f8oeq["SOc::o:&:s:&:S:S +%%%9;,;}~9(%$fL]RQJGfwVv[!EZR8 Gw];CCZC_CbC_CwCw +000=TgT~iig0|>B7u8P_>m@IBCFey74Zf. EEeE E\E EfEf +WWW>TZTbcc3x]k1mB^))3);)8)K)m:KM@C|)K +888AKCK[@lC8(`v .Gy `N]t,Q[4~8G/=5%``4`!`Y`S`=V=t;UQ`S +KKKg6+6LfezKdP lQ|[~Pa7O%f8oeq["}ic::o:&:s:&:S:S +%%%9;,;}~(C%$fL]RQJGfwVv[!EZR8 GkX;CCZC_CbC_CwCw +000=TgT~ip<0|>B7u8P_>m@IBCFey74ZUa EEeE E\EfEU=fCI dEf +WWW>TZTbc^MWo=5G\f/I=:D x`;)n0VK`5Guu)u5ucu5uLuL +ttt^{l{DZG tq+*L8!@F+y` Myzp*n!XyBOHHpH3x]k1|C^))3);)8);)K)K +888AKCK[lC"8(`v .Gy `N]t,Q[4~8G/Q;%``4`!`Y`S`=V=TU9S`S +KKKg6+6Le+1KdP lQ|[~Pa7O%f8oeq["O&c::o:&:s:S:}.}Of} :S +%%%9;,;}(,:%$fL]RQJGfwVv[!EZR8 Gvw;CCZC_CbC_CwCw +000=TgT~pg]0|>B7u8P_>m@IBCFey74ZIU EEeE E\EfEU= .NddEf +WWW>TZTb^Z>Wo=5G\f/I=:D x`;)n0VK `Guu)u5ucuLuwQL&w5 uL +ttt^{l{DGlZtq+*L8!@F+y` Myzp*n!X OHHpH3x]k1BK^))3);)8);)K)K +888AKCK[l^R8(`v .Gy `N]t,Q[4~8G/U=%``4`!`Y`!`S`S +KKKg6+6LezgKdP lQ|[~Pa7O%f8oeq["vfc::o:&:s:&:S:S +%%%9;,;}({~%$fL]RQJGfwVv[!EZR8 G]v;CCZC_CbC_CwCw +000=TgT~p3p0|>B7u8P_>m@IBCFey74ZNN EEeE E\EfEU=CCfffEf +WWW>TZTb^&ZWo=5G\f/I=:D x`;)n0VKj Guu)u5ucuLuwQ5j &uw +ttt^{l{DGNRtq+*L8!@F+y` Myzp*n!X;~OHHpH3x]k1NM^))3);)8);)K)K +888AKCK[lB7u8P_>m@IBCFey74Z.% EEeE E\EfEU=f..UNEf +WWW>TZTb^XXWo=5G\f/I=:D x`;)n0VK \Guu)u5ucuLuwQ`jN`juL +ttt^{l{DGJHtq+*L8!@F+y` Myzp*n!X~RoWWTWZWdWZW3x]k1@@^))3);)8);)K)K +888AKCK[l-<8(`v .Gy `N]t,Q[4~8G/T9%``4`!`Y`!`S`S +KKKg6+6Le1!KdP lQ|[~Pa7O%f8oeq["i c::o:&:s:&:S:S +%%%9;,;}(ii%$fL]RQJGfwVv[!EZR8 GX_;CCZC_CbC_CwCw +000=TgT~pcw0|>B7u8P_>m@IBCFey74Z%f EEeE E\EfEU= .NU%Ef +WWW>TZTb^M-Wo=5G\f/I=:D x`;)n0VKNwGuu)u5ucu5uLuL +ttt^{l{DGH^tq+*L8!@F+y` Myzp*n!X:yOHHpH3x]k1z;^))3);)8);)K)K +888AKCK[l778(`v .Gy `N]t,Q[4~8G/;S%``4`!`Y`!`S`S +KKKg6+6Le&rKdP lQ|[~Pa7O%f8oeq[" }c::o:&:s:&:S:S +%%%9;,;}(:9%$fL]RQJGfwVv[!EZR8 Gx!;CCZC_CbC_CwCw +000=TgT~pwi0|>B7u8P_>m@IBCFey74ZaI EEeE E\E EfEf +WWW>TZTb^R^Wo=5G\f/I=:D x`;)n0VK\jGuu)u5ucu5uLuL +ttt^{l{DG"ltq+*L8!@F+y`;MBzp*n!X<3x]k1;@^))3);)8);)K)K +888AKCK[lR@8(`v .Gy `N]U,S[4~8G/!9%``4`!`Y`!`S`S +KKKg6+6LereKdP lQ|[~Pa7v%S8oeq["& c::o:&:s:&:S:S +%%%9;,;}(9,%$fL]RQJGfwV][wEZR8 Gw_;CCZC_CbC_CwCw +000=TgT~p=30|>B7u8P_>m@NBfFey74Zff EEeE E\E EfEf +WWW>TZTb^>&Wo=5G\f/I=:DjxL;)n0VKLwGuu)u5ucu5uLuL +ttt^{l{DG^Jtq+*L8!@F+y`;MBzp*n!XByOHHpH3x]k1m;^))3);)8);)K)K +888AKCK[l@^8(`v .Gy `N]U,S[4~8G/=S%``4`!`Y`!`S`S +KKKg6+6LefsKdP lQ|[~Pa7v%S8oeq["}}c::o:&:s:&:S:S +%%%9;,;}(~|%$fL]RQJGfwV][wEZR8 Gk!;CCZC_CbC_CwCw +000=TgT~pic0|>B7u8P_>m@NBfFey74ZUI EEeE E\E EfEf +WWW>TZTb^cRWo=5G\f/I=:DjxL;)n0VKwjGuu)u5ucu5uLuL +ttt^{l{DGZ"tq+*L8!@F+y`;MBzp*n!XmfOHHpH3x]k1||^))3);)8)K)m:KmKBN)K +888AKCK[ll-8(`v .Gy `N]U,S[4~8G/Qt%``4`!`Y`!`S`S +KKKg6+6Lee&KdP lQ|[~Pa7v%S8oeq["fvc::o:&:s:&:S:S +%%%9;,;}((a%$fL]RQJGfwV][wEZR8 G!g;CCZC_CbC_CwCw +000=TgT~pp=0|>B7u8P_>m@NBfFey74ZCd EEeE E\E EfEf +WWW>TZTb^^cWo=5G\f/I=:DjxL;)n0VK`NGuu)u5ucu5uLuL +ttt^{l{DGGGtq+*L8!@F+y`;MBzp*n!Xy5OHHpH3x]k1MN^))3);)8);)K)K +888AKCK[^CCA8(`v .Gy `N]U,S[4~8G/tT%``4`!`Y`!`S`S +KKKg6+6Lz++fKdP lQ|[~Pa7v%S8oeq["Ouc::o:&:s:&:S:S +%%%9;,;}{,,(%$fL]RQJGfwV][wEZR8 Gvx;CCZC_CbC_CwCw +000=TgT~3g3g0|>B7u8P_>m@NBfFey74ZN EEeE E\E EfEf +WWW>TZTboWWTWZWdWZW3x]k1Bz^))3);)8);)K)K +888AKCK[^CB7u8P_>m@NBfFey74Z.C EEeE E\E EfEf +WWW>TZTbZoWWTWZWdWZW3x]k1@m^))3);)8)K)m:|N;|m)K +888AKCK[^C""8(`v .Gy `N]U,S[4~8G/TQ%``4`!`Y`!`S`S +KKKg6+6Lz+!1KdP lQ|[~Pa7v%S8oeq["iOc::o:&:s:&:S:S +%%%9;,;}{,|:%$fL]RQJGfwV][wEZR8 G,];CCZC_CbC_CwCw +000=TgT~3g<]0|>B7u8P_>m@NBfFey74Zd. EEeE E\E EfEf +WWW>TZTbWo=5G\f/I=:DjxL;)n0VK&&Guu)u5ucu5uLuL +ttt^{l{DRlJZtq+*L8!@F+y`;MBzp*n!X~:OHHpH3x]k1CB^))3);)8);)K)K +888AKCK[^C-R8(`v .Gy `N]U,S[4~8G/95%``4`!`Y`!`S`S +KKKg6+6Lz+1gKdP lQ|[~Pa7v%S8oeq["uic::o:&:s:&:S:S +%%%9;,;}{,i~%$fL]RQJGfwV][wEZR8 GXX;CCZC_CbC_CwCw +000=TgT~3gcp0|>B7u8P_>m@NBfFey74Z%a EEeE E\E EfEf +WWW>TZTb3x]k1;m^))3);)8);)K)K +888AKCK[^C7l8(`v .Gy `N]U,=[4~8G/!Q%``4`!`Y`S`=VQU!=9`S +KKKg6+6Lz+r+KdP lQ|[~Pa7v%}8oeq["&Oc::o:&:s:&:S:S +%%%9;,;}{,a{%$fL]RQJGfwV][kEZR8 G_];CCZC_CbC_CwCw +000=TgT~3g]n0|>B7u8P_>m@NBUFey74Z . EEeE E\E EfEf +WWW>TZTb3x]k1KB^))3);)8);)K)K +888AKCK[^CA<8(`v .Gy `N]U,=[4~8G/S5%``4`!`Y`!`S`S +KKKg6+6Lz+g!KdP lQ|[~Pa7v%}8oeq["Sic::o:&:s:S:}.fui&O:S +%%%9;,;}{,9i%$fL]RQJGfwV][kEZR8 GwX;CCZC_CbC_CwCw +000=TgT~3g=w0|>B7u8P_>m@NBUFey74Zfa EEeE E\E EfEf +WWW>TZTb-Wo=5G\f/I=:Djxw;)n0VKw5Guu)u5ucu5uLuL +ttt^{l{DRl^^tq+*L8!@F+y`;Mmzp*n!XmBOHHpH3x]k1mC^))3);)8);)K)K +888AKCK[^C@78(`v .Gy `N]U,=[4~8G/=;%``4`!`Y`!`S`S +KKKg6+6Lz+frKdP lQ|[~Pa7v%}8oeq["f&c::o:&:s:&:S:S +%%%9;,;}{,~9%$fL]RQJGfwV][kEZR8 G!w;CCZC_CbC_CwCw +000=TgT~3gii0|>B7u8P_>m@NBUFey74ZCU EEeE E\E EfEf +WWW>TZTb3x]k1MK^))3);)8);)K)K +888AKCK[^Cl@8(`v .Gy `N]U,=[4~8G/t=%``4`!`Y`!`S`S +KKKg6+6Lz+eeKdP lQ|[~Pa7v%}8oeq["Ofc::o:&:s:&:S:S +%%%9;,;}{{,,%$fL]RQJGfwV][kEZR8 Gvv;CCZC_CbC_CwCw +000=TgT~33g30|>B7u8P_>m@NBUFey74ZIN EEeE E\E EfEf +WWW>TZTb<3x]k1BM^))3);)8);)K)K +888AKCK[^^^^8(`v .Gy `N]U,=[4~8G/UU%``4`!`Y`!`S`S +KKKg6+6LzzzsKdP lQ|[~Pa7v%}8oeq["v#c::o:&:s:&:S:S +%%%9;,;}{{{|%$fL]RQJGfwV][kEZR8 G],;CCZC_CbC_CwCw +000=TgT~333c0|>B7u8P_>m@NBUFey74ZN% EEeE E\E EfEf +WWW>TZTb<<3x]k1N@^))3);)8);)K)K +888AKCK[^^<-8(`v .Gy `N]U,=[4~8G/59%``4`!`Y`!`S`S +KKKg6+6Lzzs&KdP lQ|[~Pa7v%}8oeq["# c::o:&:s:&:S:S +%%%9;,;}{{Ca%$fL]RQJGfwV][kEZR8 G,_;CCZC_CbC_CwCw +000=TgT~33n=0|>B7u8P_>m@NBUFey74Zdf EEeE E\E EfEf +WWW>TZTb<<&cWo=5G\f/I=:Djxw;)n0VK&wGuu)u5ucu5uLuL +ttt^{l{DRRNGtq+*L8!@F+y`;Mmzp*n!X~yOHHpHcoWWTWZWdWZW3x]k1C;^))3);)8);)K)K +888AKCK[^^"A8(`v .Gy `N]U,=[4~8G/9S%``4`!`Y`!`S`S +KKKg6+6Lzz!fKdP lQ|[~Pa7v%}8oeq["u}c::o:&:s:&:S:S +%%%9;,;}{{|(%$fL]RQJGfwV][kEZR8 GX!;CCZC_CbC_CwCw +000=TgT~33cg0|>B7u8P_>m@NBUFey74Z%I EEeE E\E EfEf +WWW>TZTb<3x]k1z|^))3);)8);)K)K +888AKCK[^^7C8(`v .Gy `N]U,=[4~8G/;t%``4`!`Y`!`S`S +KKKg6+6Lzz&zKdP lQ|[~Pa7v%}8oeq[" vc::o:&:s:&:S:S +%%%9;,;}{{:C%$fL]RQJGfwV][!EZR8 G__;CCZC_CbC_CwCw +000=TgT~33w<0|>B7u8P_>m@NBCFey74Z f EEeE E\E EfEf +WWW>TZTb<3x]k1K;^))3);)8);)K)K +888AKCK[^^R"8(`v .Gy `N]U,Q[4~8G/SS%``4`!`Y`!`S`S +KKKg6+6Lzzr1KdP lQ|[~Pa7v%f8oeq["S}c::o:&:s:&:S:S +%%%9;,;}{{a:%$fL]RQJGfwV][!EZR8 Gw!;CCZC_CbCwCkK_X_!xCw +000=TgT~33]]0|>B7u8P_>m@NBCFey74ZfI EEeE E\E EfEf +WWW>TZTb<<->Wo=5G\f/I=:Djx`;)n0VKLjGuu)u5ucu5uLuL +ttt^{l{DRR"Ztq+*L8!@F+y`;Myzp*n!XBfOHHpH3x]k1m|^))3);)8)K)m:KB;CC)K +888AKCK[^^AR8(`v .Gy `N]U,Q[4~8G/=t%``4`!`Y`!`S`S +KKKg6+6LzzggKdP lQ|[~Pa7v%f8oeq["}vc::o:&:s:&:S:S +%%%9;,;}{{9~%$fL]RQJGfwV][!EZR8 Gkg;CCZC_CbC_CwCw +000=TgT~33=p0|>B7u8P_>m@NBCFey74ZUd EEeE E\EfEU= IIC.Ef +WWW>TZTb<3x]k1|N^))3);)8);)K)K +888AKCK[^^@l8(`v .Gy `N]U,Q[4~8G/QT%``4`!`Y`S`=VttQUt`S +KKKg6+6Lzze+KdP lQ|[~Pa7v%f8oeq["fuc::o:&:s:&:S:S +%%%9;,;}{{({%$fL]RQJGfwV][!EZR8 G!x;CCZC_CbC_CwCw +000=TgT~33pn0|>B7u8P_>m@NBCFey74ZI EEeE E\E EfEf +WWW>TZTb<<^XWo=5G\f/I=:Djx`;)n0VK LGuu)u5ucu5uLuL +ttt^{l{DRRGHtq+*L8!@F+y`;Myzp*n!X mOHHpHoWWTWZWdWZW3x]k1Mz^))3);)8)K)m:MNKMN)K +888AKCK[^B7u8P_>m@NBCFey74ZNC EEeE E\E EfEf +WWW>TZTb<&Z-Wo=5G\f/I=:Djx`;)n0VKj Guu)u5ucu5uLuL +ttt^{l{DRNl^tq+*L8!@F+y`;Myzp*n!X;;OHHpH3x]k1Nm^))3);)8);)K)K +888AKCK[^<^78(`v .Gy `N]U,Q[4~8G/5Q%``4`!`Y`!`S`S +KKKg6+6LzszrKdP lQ|[~Pa7v%f8oeq["#Oc::o:&:s:&:S:S +%%%9;,;}{C{9%$fL]RQJGfwV][!EZR8 Gg];CCZC_CbC_CwCw +000=TgT~3n3i0|>B7u8P_>m@NBCFey74Z.. EEeE E\E EfEf +WWW>TZTb<&<^Wo=5G\f/I=:Djx`;)n0VK &Guu)u5ucuLuwQwNL&\uL +ttt^{l{DRNNltq+*L8!@F+y`;Myzp*n!Xf:OHHpHXoWWTWZWdWZW3x]k1@B^))3);)8);)K)K +888AKCK[^<<@8(`v .Gy `N]U,Q[4~8G/T5%``4`!`Y`S`=V!QT=Q`S +KKKg6+6LzsseKdP lQ|[~Pa7v%f8oeq["iic::o:&:s:&:S:S +%%%9;,;}{C|,%$fL]RQJGfwV][!EZR8 G,X;CCZC_CbC_CwCw +000=TgT~3n<30|>B7u8P_>m@NBCFey74Zda EEeE E\E EfEf +WWW>TZTb<&X&Wo=5G\f/I=:Djx`;)n0VKN5Guu)u5ucu5uLuL +ttt^{l{DRNJJtq+*L8!@F+y`;Myzp*n!X:BOHHpH3x]k1CC^))3);)8);)K)K +888AKCK[^<-^8(`v .Gy `N]U,Q[4~8G/9;%``4`!`Y`!`S`S +KKKg6+6Lzs1sKdP lQ|[~Pa7v%f8oeq[" &c::o:&:s:&:S:S +%%%9;,;}{Ci|%$fL]RQJGfwV][!EZR8 Gxw;CCZC_CbC_CwCw +000=TgT~3ncc0|>B7u8P_>m@NBCFey74ZaU EEeE E\E EfEf +WWW>TZTb<&MRWo=5G\f/I=:Djx`;)n0VK\`Guu)u5ucuLuwQL&` uL +ttt^{l{DRNH"tq+*L8!@F+y`;Myzp*n!X5 OHHpH3x]k1;B^))3);)8);)K)K +888AKCK[^<7-8(`v .Gy `N]5,S[4~8G/!5%``4`!`Y`!`S`S +KKKg6+6Lzs&&KdP lQ|[~Pa7#%S8oeq["&ic::o:&:s:&:S:S +%%%9;,;}{C:a%$fL]RQJGfwVg[wEZR8 G_X;CCZC_CbC_CwCw +000=TgT~3nw=0|>B7u8P_>m@.BfFey74Z a EEeE E\E EfEf +WWW>TZTb<&RcWo=5G\f/I=:D xL;)n0VKL5Guu)u5ucu5uLuL +ttt^{l{DRN Gtq+*L8!@F+y`fMBzp*n!XBBOHHpH3x]k1KC^))3);)8);)K)K +888AKCK[^B7u8P_>m@.BfFey74ZUU EEeE E\E EfEf +WWW>TZTb<&>3x]k1|K^))3);)8);)K)K +888AKCK[^<@C8(`v .Gy `N]5,S[4~8G/Q=%``4`!`Y`!`S`S +KKKg6+6LzsfzKdP lQ|[~Pa7#%S8oeq["ffc::o:&:s:&:S:S +%%%9;,;}{C~C%$fL]RQJGfwVg[wEZR8 G!v;CCZC_CbC_CwCw +000=TgT~3ni<0|>B7u8P_>m@.BfFey74ZCN EEeE E\E EfEf +WWW>TZTb<&cMWo=5G\f/I=:D xL;)n0VK` Guu)u5ucu5uLuL +ttt^{l{DRNZ tq+*L8!@F+y`fMBzp*n!Xy~OHHpH3x]k1MM^))3);)8);)K)K +888AKCK[^B7u8P_>m@.BfFey74ZI% EEeE E\E EfEf +WWW>TZTb<&^>Wo=5G\f/I=:D xL;)n0VK \Guu)u5ucu5uLuL +ttt^{l{DRNGZtq+*L8!@F+y`fMBzp*n!X;3x]k1B@^))3);)8);)K)K +888AKCK[^"CR8(`v .Gy `N]5,S[4~8G/U9%``4`!`Y`!`S`S +KKKg6+6Lz!+gKdP lQ|[~Pa7#%S8oeq["v c::o:&:s:&:S:S +%%%9;,;}{|,~%$fL]RQJGfwVg[wEZR8 Gg_;CCZC_CbC_CwCw +000=TgT~3B7u8P_>m@.BfFey74Z.f EEeE E\E EfEf +WWW>TZTb3x]k1@;^))3);)8);)K)K +888AKCK[^"^l8(`v .Gy `N]5,S[4~8G/TS%``4`!`Y`!`S`S +KKKg6+6Lz!s+KdP lQ|[~Pa7#%S8oeq["i}c::o:&:s:&:S:S +%%%9;,;}{|C{%$fL]RQJGfwVg[wEZR8 G,!;CCZC_CbC_CwCw +000=TgT~3B7u8P_>m@.BfFey74ZdI EEeE E\E EfEf +WWW>TZTb3x]k1C|^))3);)8);)K)K +888AKCK[^""<8(`v .Gy `N]5,S[4~8G/9t%``4`!`Y`!`S`S +KKKg6+6Lz!!!KdP lQ|[~Pa7#%S8oeq["uvc::o:&:s:&:S:S +%%%9;,;}{||i%$fL]RQJGfwVg[wEZR8 GXg;CCZC_CbC_CwCw +000=TgT~3<B7u8P_>m@.BfFey74Z%d EEeE E\E EfEf +WWW>TZTb3x]k1;;^))3);)8);)K)K +888AKCK[^"-78(`v .Gy `N]5,=[4~8G/!S%``4`!`Y`!`S`S +KKKg6+6Lz!1rKdP lQ|[~Pa7#%}8oeq["&}c::o:&:s:&:S:S +%%%9;,;}{|i9%$fL]RQJGfwVg[kEZR8 G_!;CCZC_CbC_CwCw +000=TgT~3B7u8P_>m@.BUFey74Z I EEeE E\E EfEf +WWW>TZTb3x]k1K|^))3);)8);)K)K +888AKCK[^"7@8(`v .Gy `N]5,=[4~8G/St%``4`!`Y`!`S`S +KKKg6+6Lz!&eKdP lQ|[~Pa7#%}8oeq["Svc::o:&:s:&:S:S +%%%9;,;}{|a,%$fL]RQJGfwVg[kEZR8 Gwg;CCZC_CbC_CwCw +000=TgT~3<]30|>B7u8P_>m@.BUFey74Zfd EEeE E\E EfEf +WWW>TZTb3x]k1mN^))3);)8);)K)K +888AKCK[^"A^8(`v .Gy `N]5,=[4~8G/=T%``4`!`Y`!`S`S +KKKg6+6Lz!gsKdP lQ|[~Pa7#%}8oeq["}uc::o:&:s:&:S:S +%%%9;,;}{|9|%$fL]RQJGfwVg[kEZR8 Gkx;CCZC_CbC_CwCw +000=TgT~3<=c0|>B7u8P_>m@.BUFey74ZC EEeE E\E EfEf +WWW>TZTbRWo=5G\f/I=:D xw;)n0VK`LGuu)u5ucu5uLuL +ttt^{l{DRJ^"tq+*L8!@F+y`fMmzp*n!XymOHHpHoWWTWZWdWZW3x]k1|z^))3);)8);)K)K +888AKCK[^"@-8(`v .Gy `N]5,=[4~8G/t!%``4`!`Y`!`S`S +KKKg6+6Lz!f&KdP lQ|[~Pa7#%}8oeq["OSc::o:&:s:&:S:S +%%%9;,;}{|~a%$fL]RQJGfwVg[kEZR8 Gvk;CCZC_CbC_CwCw +000=TgT~3B7u8P_>m@.BUFey74ZIC EEeE E\E EfEf +WWW>TZTb3x]k1Bm^))3);)8);)K)K +888AKCK[^"lA8(`v .Gy `N]5,=[4~8G/UQ%``4`!`Y`!`S`S +KKKg6+6Lz!efKdP lQ|[~Pa7#%}8oeq["vOc::o:&:s:&:S:S +%%%9;,;}{|((%$fL]RQJGfwVg[kEZR8 G]];CCZC_CbC_CwCw +000=TgT~3cgg0|>B7u8P_>m@.BUFey74ZN. EEeE E\E EfEf +WWW>TZTb3x]k1NB^))3);)8);)K)K +888AKCK[^-^C8(`v .Gy `N]5,=[4~8G/55%``4`!`Y`!`S`S +KKKg6+6Lz1zzKdP lQ|[~Pa7#%}8oeq["#ic::o:&:s:&:S:S +%%%9;,;}{i{C%$fL]RQJGfwVg[kEZR8 GgX;CCZC_CbC_CwCw +000=TgT~3c3<0|>B7u8P_>m@.BUFey74Z.a EEeE E\E EfEf +WWW>TZTb-oWWTWZWdWZW3x]k1@C^))3);)8);)K)K +888AKCK[^-<"8(`v .Gy `N]5,=[4~8G/T;%``4`!`Y`!`S`S +KKKg6+6Lz1s1KdP lQ|[~Pa7#%}8oeq["u&c::o:&:s:&:S:S +%%%9;,;}{iC:%$fL]RQJGfwVg[kEZR8 GXw;CCZC_CbC_CwCw +000=TgT~3cn]0|>B7u8P_>m@.BUFey74Z%U EEeE E\E EfEf +WWW>TZTbWo=5G\f/I=:D xw;)n0VKN`Guu)u5ucu5uLuL +ttt^{l{DRHNZtq+*L8!@F+y`fMmzp*n!X: OHHpH3x]k1zK^))3);)8);)K)K +888AKCK[^-"R8(`v .Gy `N]5,=[4~8G/;=%``4`!`Y`!`S`S +KKKg6+6Lz1!gKdP lQ|[~Pa7#%}8oeq[" fc::o:&:s:&:S:S +%%%9;,;}{i|~%$fL]RQJGfwVg[kEZR8 Gxv;CCZC_CbC_CwCw +000=TgT~3cB7u8P_>m@.BUFey74ZaN EEeE E\E EfEf +WWW>TZTb3x]k1;C^))3);)8);)K)K +888AKCK[^--l8(`v .Gy `N]5,Q[4~8G/!;%``4`!`Y`!`S`S +KKKg6+6Lz1&+KdP lQ|[~Pa7#%f8oeq["S&c::o:&:s:&:S:S +%%%9;,;}{i:{%$fL]RQJGfwVg[!EZR8 Gww;CCZC_CbC_CwCw +000=TgT~3cwn0|>B7u8P_>m@.BCFey74ZfU EEeE E\E EfEf +WWW>TZTb3x]k1mK^))3);)8);)K)K +888AKCK[^-R<8(`v .Gy `N]5,Q[4~8G/==%``4`!`Y`!`S`S +KKKg6+6Lz1r!KdP lQ|[~Pa7#%f8oeq["}fc::o:&:s:&:S:S +%%%9;,;}{iai%$fL]RQJGfwVg[!EZR8 Gkv;CCZC_CbC_CwCw +000=TgT~3c]w0|>B7u8P_>m@.BCFey74ZUN EEeE E\E EfEf +WWW>TZTb3x]k1|M^))3);)8);)K)K +888AKCK[^-A78(`v .Gy `N]5,Q[4~8G/QU%``4`!`Y`!`S`S +KKKg6+6Lz1grKdP lQ|[~Pa7#%f8oeq["f#c::o:&:s:&:S:S +%%%9;,;}{i99%$fL]RQJGfwVg[!EZR8 G!,;CCZC_CbC_CwCw +000=TgT~3c=i0|>B7u8P_>m@.BCFey74ZC% EEeE E\E EfEf +WWW>TZTb^Wo=5G\f/I=:D x`;)n0VK`\Guu)u5ucu5uLuL +ttt^{l{DRHZltq+*L8!@F+y`fMyzp*n!X 3x]k1M@^))3);)8);)K)K +888AKCK[^-@@8(`v .Gy `N]5,Q[4~8G/t9%``4`!`Y`!`S`S +KKKg6+6Lz1feKdP lQ|[~Pa7#%f8oeq["O c::o:&:s:&:S:S +%%%9;,;}{i(,%$fL]RQJGfwVg[!EZR8 G]_;CCZC_CbC_CwCw +000=TgT~3cp30|>B7u8P_>m@.BCFey74ZNf EEeE E\E EfEf +WWW>TZTb3x]k1N;^))3);)8);)K)K +888AKCK[^7C^8(`v .Gy `N]5,Q[4~8G/5S%``4`!`Y`!`S`S +KKKg6+6Lz&+sKdP lQ|[~Pa7#%f8oeq["#}c::o:&:s:&:S:S +%%%9;,;}{:,|%$fL]RQJGfwVg[!EZR8 Gg!;CCZC_CbC_CwCw +000=TgT~3wgc0|>B7u8P_>m@.BCFey74Z.I EEeE E\E EfEf +WWW>TZTb3x]k1@|^))3);)8);)K)K +888AKCK[^7^-8(`v .Gy `N]5,Q[4~8G/Tt%``4`!`Y`!`S`S +KKKg6+6Lz&z&KdP lQ|[~Pa7#%f8oeq["ivc::o:&:s:&:S:S +%%%9;,;}{:{a%$fL]RQJGfwVg[!EZR8 G,g;CCZC_CbC_CwCw +000=TgT~3w3=0|>B7u8P_>m@.BCFey74Zdd EEeE E\E EfEf +WWW>TZTb3x]k1CN^))3);)8);)K)K +888AKCK[^7B7u8P_>m@.BCFey74Za EEeE E\EfEU=C%CCaEf +WWW>TZTba&_lNqtt{tlt/tltRtR +HHH~pyp4yHOARoYq+dAbdKXm>3b]k1;|^))3);)8);)K)K +888AK"K[-8(`v .Gy `N]S,=[4b8G/!t%``4`!`Y`!`S`S +KKKg6!6L&KdP lQ|[~Pa7S%}8o@q["&vc::o:&:s:&:S:S +%%%9;|;}a%$fL]RQJGfwVw[kEZ-8 G_g;CCZC_CbC_CwCw +000=TB7u8P_>m@fBUFe074Z d EEeE E\E EfEf +WWW>TXTbcWo=5G\f/I=:DLxw;)B0VK5NGuu)u5ucu5uLuL +ttt^{J{DGtq+*L8!@F+y`BMmzp%n!X<5OHHpHa&_R qtt{tlt/tltRtR +HHH~pyp4BfHOARoYq+dAbdKXm>3b]k1KN^))3);)8);)K)K +888AK"K[^A8(`v .Gy `N]S,=[4b8G/ST%``4`!`Y`!`S`S +KKKg6!6LzfKdP lQ|[~Pa7S%}8o@q["Suc::o:&:s:&:S:S +%%%9;|;}{(%$fL]RQJGfwVw[kEZ-8 Gwx;CCZC_CbC_CwCw +000=TB7u8P_>m@fBUFe074ZU EEeE E\E EfEf +WWW>TXTb&oWWTWZWdWZWa&_NZqtt{tlt/tltRtR +HHH~pyp4m5HOARoYq+dAbdKXm>3b]k1mz^))3);)8);)K)K +888AK"K["C8(`v .Gy `N]S,=[4b8G/Q!%``4`!`Y`!`S`S +KKKg6!6L!zKdP lQ|[~Pa7S%}8o@q["fSc::o:&:s:&:S:S +%%%9;|;}|C%$fL]RQJGfwVw[kEZ-8 G!k;CCZC_CbC_CwCw +000=TB7u8P_>m@fBUFe074ZCC EEeE E\E EfEf +WWW>TXTbXMWo=5G\f/I=:DLxw;)B0VK` Guu)u5ucu5uLuL +ttt^{J{DJ tq+*L8!@F+y`BMmzp%n!Xy;OHHpHa&_HRqtt{tlt/tltRtR +HHH~pyp4 mHOARoYq+dAbdKXm>3b]k1Mm^))3);)8);)K)K +888AK"K[-"8(`v .Gy `N]S,=[4b8G/tQ%``4`!`Y`!`S`S +KKKg6!6L11KdP lQ|[~Pa7S%}8o@q["OOc::o:&:s:&:S:S +%%%9;|;}i:%$fL]RQJGfwVw[kEZ-8 Gv];CCZC_CbC_CwCw +000=TB7u8P_>m@fBUFe074ZI. EEeE E\E EfEf +WWW>TXTbM>Wo=5G\f/I=:DLxw;)B0VK &Guu)u5ucu5uLuL +ttt^{J{DHZtq+*L8!@F+y`BMyzp%n!X<a&_l"qtt{tlt/tltRtR +HHH~pyp4;;HOARoYq+dAbdKX|>3b]k1;@^))3);)8);)K)K +888AK"K[7R8(`v .Gy `N]S,Q[4b8G/!9%``4`!`Y`!`S`S +KKKg6!6L&gKdP lQ|[~Pa7S%f8o@q["& c::o:&:s:&:S:S +%%%9;|;}:~%$fL]RQJGfwVw[!EZ-8 Gw_;CCZC_CbC_CwCw +000=TB7u8P_>m@fBCFe074Zff EEeE E\E EfEf +WWW>TXTb-ZWo=5G\f/I=:DLx`;)B0VKLwGuu)u5ucu5uLuL +ttt^{J{D"Rtq+*L8!@F+y`BMyzp%n!XByOHHpHa&_RGqtt{tlt/tltRtR +HHH~pyp4f:HOARoYq+dAbdKX|>3b]k1m;^))3);)8);)K)K +888AK"K[Rl8(`v .Gy `N]S,Q[4b8G/=S%``4`!`Y`!`S`S +KKKg6!6Lg+KdP lQ|[~Pa7S%f8o@q["}}c::o:&:s:&:S:S +%%%9;|;}9{%$fL]RQJGfwVw[!EZ-8 Gk!;CCZC_CbC_CwCw +000=TB7u8P_>m@fBCFe074ZUI EEeE E\E EfEf +WWW>TXTb>XWo=5G\f/I=:DLx`;)B0VKwjGuu)u5ucu5uLuL +ttt^{J{D^Htq+*L8!@F+y`BMyzp%n!XmfOHHpHa&_JNqtt{tlt/tltRtR +HHH~pyp4:BHOARoYq+dAbdKX|>3b]k1||^))3);)8);)K)K +888AK"K[@<8(`v .Gy `N]S,Q[4b8G/Qt%``4`!`Y`!`S`S +KKKg6!6Lf!KdP lQ|[~Pa7S%f8o@q["fvc::o:&:s:&:S:S +%%%9;|;}~i%$fL]RQJGfwVw[!EZ-8 G!g;CCZC_CbC_CwCw +000=TB7u8P_>m@fBCFe074ZCd EEeE E\E EfEf +WWW>TXTbc-Wo=5G\f/I=:DLx`;)B0VK`NGuu)u5ucu5uLuL +ttt^{J{DZ^tq+*L8!@F+y`BMyzp%n!Xy5OHHpHa&_H qtt{tlt/tltRtR +HHH~pyp45 HOARoYq+dAbdKX|>3b]k1MN^))3);)8);)K)K +888AK"K[l78(`v .Gy `N]S,Q[4b8G/tT%``4`!`Y`!`S`S +KKKg6!6LerKdP lQ|[~Pa7}%}8o@q["&&c::o:&:s:&:S:S +%%%9;|;}(9%$fL]RQJGfwVk[kEZ-8 G_w;CCZC_CbC_CwCw +000=TB7u8P_>m@UBUFe074Z U EEeE E\E EfEf +WWW>TXTb^^Wo=5G\f/I=:Dwxw;)B0VK5`Guu)u5ucu5uLuL +ttt^{J{DRlltq+*L8!@F+y`mMmzp%n!X< OHHpHa&_Rlqtt{tlt/tltRtR +HHH~pyp4B<~HOARoYq+dAbdmXm>3b]k1KK^))3);)8);)K)K +888AK"K[^C@8(`v .Gy `N]=,=[4b8G/S=%``4`!`Y`!`S`S +KKKg6!6Lz+eKdP lQ|[~Pa7}%}8o@q["Sfc::o:&:s:&:S:S +%%%9;|;}{{,%$fL]RQJGfwVk[kEZ-8 Gwv;CCZC_CbC_CwCw +000=TB7u8P_>m@UBUFe074ZfN EEeE E\E EfEf +WWW>TXTb<<&Wo=5G\f/I=:Dwxw;)B0VKL Guu)u5ucu5uLuL +ttt^{J{DRRJtq+*L8!@F+y`mMmzp%n!XB~OHHpHa&_NJqtt{tlt/tltRtR +HHH~pyp4Bm3b]k1mM^))3);)8);)K)K +888AK"K[^<^8(`v .Gy `N]=,=[4b8G/=U%``4`!`Y`!`S`S +KKKg6!6LzssKdP lQ|[~Pa7}%}8o@q["}#c::o:&:s:&:S:S +%%%9;|;}{C|%$fL]RQJGfwVk[kEZ-8 Gk,;CCZC_CbC_CwCw +000=TB7u8P_>m@UBUFe074ZU% EEeE E\E EfEf +WWW>TXTb<&RWo=5G\f/I=:Dwxw;)B0VKw\Guu)u5ucu5uLuL +ttt^{J{DRN"tq+*L8!@F+y`mMmzp%n!Xya&_J"qtt{tlt/tltRtR +HHH~pyp4ByyHOARoYq+dAbdmXm>3b]k1|@^))3);)8);)K)K +888AK"K[^"-8(`v .Gy `N]=,=[4b8G/Q9%``4`!`Y`!`S`S +KKKg6!6Lz!&KdP lQ|[~Pa7}%}8o@q["f c::o:&:s:&:S:S +%%%9;|;}{|a%$fL]RQJGfwVk[kEZ-8 Gv_;CCZC_CbC_CwCw +000=TB7u8P_>m@UBUFe074ZIf EEeE E\E EfEf +WWW>TXTba&_lRqtt{tlt/tltRtR +HHH~pyp4B fHOARoYq+dAbdmX|>3b]k1;m^))3);)8);)K)K +888AK"K[^-A8(`v .Gy `N]=,Q[4b8G/!Q%``4`!`Y`!`S`S +KKKg6!6Lz1fKdP lQ|[~Pa7}%f8o@q["&Oc::o:&:s:&:S:S +%%%9;|;}{i(%$fL]RQJGfwVk[!EZ-8 G_];CCZC_CbC_CwCw +000=TB7u8P_>m@UBCFe074Z . EEeE E\E EfEf +WWW>TXTba&_RHqtt{tlt/tltRtR +HHH~pyp4B;5HOARoYq+dAbdmX|>3b]k1KB^))3);)8);)K)K +888AK"K[^RC8(`v .Gy `N]=,Q[4b8G/S5%``4`!`Y`!`S`S +KKKg6!6LzrzKdP lQ|[~Pa7}%f8o@q["Sic::o:&:s:&:S:S +%%%9;|;}{aC%$fL]RQJGfwVk[!EZ-8 GwX;CCZC_CbC_CwCw +000=TB7u8P_>m@UBCFe074Zfa EEeE E\E EfEf +WWW>TXTb<-MWo=5G\f/I=:Dwx`;)B0VKw5Guu)u5ucu5uLuL +ttt^{J{DR" tq+*L8!@F+y`mMyzp%n!XmBOHHpHa&_N^qtt{tlt/tltRtR +HHH~pyp4B~mHOARoYq+dAbdmX|>3b]k1mC^))3);)8);)K)K +888AK"K[^A"8(`v .Gy `N]=,Q[4b8G/=;%``4`!`Y`!`S`S +KKKg6!6Lzg1KdP lQ|[~Pa7}%f8o@q["f&c::o:&:s:&:S:S +%%%9;|;}{9:%$fL]RQJGfwVk[!EZ-8 G!w;CCZC_CbC_CwCw +000=TB7u8P_>m@UBCFe074ZCU EEeE E\E EfEf +WWW>TXTb<>>Wo=5G\f/I=:Dwx`;)B0VK``Guu)u5ucu5uLuL +ttt^{J{DR^Ztq+*L8!@F+y`mMyzp%n!Xy OHHpHa&_Hlqtt{tlt/tltRtR +HHH~pyp4B:;HOARoYq+dAbdmX|>3b]k1MK^))3);)8);)K)K +888AK"K[^@R8(`v .Gy `N]=,Q[4b8G/t=%``4`!`Y`!`S`S +KKKg6!6LzfgKdP lQ|[~Pa7}%f8o@q["Ofc::o:&:s:&:S:S +%%%9;|;}{~~%$fL]RQJGfwVk[!EZ-8 Gvv;CCZC_CbC_CwCw +000=TB7u8P_>m@UBCFe074ZIN EEeE E\E EfEf +WWW>TXTb<^ZWo=5G\f/I=:Dwx`;)B0VK Guu)u5ucu5uLuL +ttt^{J{DRGRtq+*L8!@F+y`mMyzp%n!X ~OHHpHa&_l qtt{tlt/tltRtR +HHH~pyp4B5:HOARoYq+dAbd|XK>3b]k1;N^))3);)8)K)m:mzM|C)K +888AK"K[^ll8(`v .Gy `N]Q,S[4b8G/!T%``4`!`Y`!`S`S +KKKg6!6Ls++KdP lQ|[~Pa7f%S8o@q["&uc::o:&:s:&:S:S +%%%9;|;}C,{%$fL]RQJGfwV![wEZ-8 G_x;CCZC_CbC_CwCw +000=TB7u8P_>m@CBfFe074Zf EEeE E\E EfEf +WWW>TXTb&ZXWo=5G\f/I=:D`xL;)B0VKLLGuu)u5ucu5uLuL +ttt^{J{DNlHtq+*L8!@F+y`yMBzp%n!XBmOHHpHoWWTWZWdWZWa&_RZqtt{tlt/tltRtR +HHH~pyp4mBBHOARoYq+dAbd|XK>3b]k1Kz^))3);)8);)K)K +888AK"K[<^<8(`v .Gy `N]Q,S[4b8G/=!%``4`!`Y`!`S`S +KKKg6!6Lsz!KdP lQ|[~Pa7f%S8o@q["}Sc::o:&:s:&:S:S +%%%9;|;}C{i%$fL]RQJGfwV![wEZ-8 Gkk;CCZC_CbC_CwCw +000=TB7u8P_>m@CBfFe074ZUC EEeE E\E EfEf +WWW>TXTb&<-Wo=5G\f/I=:D`xL;)B0VKw Guu)u5ucu5uLuL +ttt^{J{DNR^tq+*L8!@F+y`yMBzp%n!Xm;OHHpHa&_JRqtt{tlt/tltRtR +HHH~pyp4mm HOARoYq+dAbd|XK>3b]k1|m^))3);)8);)K)K +888AK"K[<<78(`v .Gy `N]Q,S[4b8G/QQ%``4`!`Y`!`S`S +KKKg6!6LssrKdP lQ|[~Pa7f%S8o@q["fOc::o:&:s:&:S:S +%%%9;|;}CC9%$fL]RQJGfwV![wEZ-8 G!];CCZC_CbC_CwCw +000=TB7u8P_>m@CBfFe074ZC. EEeE E\E EfEf +WWW>TXTb&&^Wo=5G\f/I=:D`xL;)B0VK`&Guu)u5ucu5uLuL +ttt^{J{DNJltq+*L8!@F+y`yMBzp%n!Xy:OHHpHa&_HHqtt{tlt/tltRtR +HHH~pyp4my~HOARoYq+dAbd|XK>3b]k1MB^))3);)8)K)m:;|mBm)K +888AK"K[<"@8(`v .Gy `N]Q,S[4b8G/t5%``4`!`Y`!`S`S +KKKg6!6Ls!eKdP lQ|[~Pa7f%S8o@q["Oic::o:&:s:&:S:S +%%%9;|;}Ci,%$fL]RQJGfwV![kEZ-8 G__;CCZC_CbC_CwCw +000=TB7u8P_>m@CBUFe074Z f EEeE E\E EfEf +WWW>TXTb&M&Wo=5G\f/I=:D`xw;)B0VK5wGuu)u5ucu5uLuL +ttt^{J{DNHJtq+*L8!@F+y`yMmzp%n!Xa&_lGqtt{tlt/tRtNsJl H^tR +HHH~pyp4m;3b]k1K;^))3);)8);)K)K +888AK"K[<7^8(`v .Gy `N]Q,=[4b8G/SS%``4`!`Y`!`S`S +KKKg6!6Ls&sKdP lQ|[~Pa7f%}8o@q["S}c::o:&:s:S:}.f##u#:S +%%%9;|;}C:|%$fL]RQJGfwV![kEZ-8 Gw!;CCZC_CbC_CwCw +000=TB7u8P_>m@CBUFe074ZfI EEeE E\E EfEf +WWW>TXTb&RRWo=5G\f/I=:D`xw;)B0VKLjGuu)u5ucuLuwQ`&\5LuL +ttt^{J{DN "tq+*L8!@F+y`yMmzp%n!XBfOHHpHa&_NNqtt{tlt/tltRtR +HHH~pyp4mfyHOARoYq+dAbd|Xm>3b]k1m|^))3);)8);)K)K +888AK"K[B7u8P_>m@CBUFe074ZUd EEeE E\E EfEf +WWW>TXTb&-cWo=5G\f/I=:D`xw;)B0VKwNGuu)u5ucu5uLuL +ttt^{J{DN"Gtq+*L8!@F+y`yMmzp%n!Xm5OHHpHa&_J qtt{tlt/tltRtR +HHH~pyp4m~fHOARoYq+dAbd|Xm>3b]k1|N^))3);)8);)K)K +888AK"K[B7u8P_>m@CBUFe074ZI EEeE E\E EfEf +WWW>TXTb&coWWTWZWdWZWa&_llqtt{tlt/tltRtR +HHH~pyp4m:5HOARoYq+dAbd|X|>3b]k1;K^))3);)8);)K)K +888AK"K[B7u8P_>m@CBCFe074Z N EEeE E\E EfEf +WWW>TXTb&^MWo=5G\f/I=:D`x`;)B0VK5 Guu)u5ucuLuwQ5j \uL +ttt^{J{DNG tq+*L8!@F+y`yMyzp%n!X<~OHHpHa&_RJqtt{tlt/tltRtR +HHH~pyp4y3b]k1KM^))3);)8)K)m:M@M@m)K +888AK"K["C"8(`v .Gy `N]Q,Q[4b8G/SU%``4`!`Y`!`S`S +KKKg6!6L!+1KdP lQ|[~Pa7f%f8o@q["S#c::o:&:s:&:S:S +%%%9;|;}|,:%$fL]RQJGfwV![!EZ-8 Gw,;CCZC_CbCwCkKw,x,wCw +000=TB7u8P_>m@CBCFe074Zf% EEeE E\EfEU=UNN CEf +WWW>TXTbXZ>Wo=5G\f/I=:D`x`;)B0VKL\Guu)u5ucu5uLuL +ttt^{J{DJlZtq+*L8!@F+y`yMyzp%n!Xma&_N"qtt{tlt/tltRtR +HHH~pyp4yB;HOARoYq+dAbd|X|>3b]k1m@^))3);)8);)K)K +888AK"K["^R8(`v .Gy `N]Q,Q[4b8G/=9%``4`!`Y`!`S`S +KKKg6!6L!zgKdP lQ|[~Pa7f%f8o@q["} c::o:&:s:S:}.fv iO:S +%%%9;|;}|{~%$fL]RQJGfwV![!EZ-8 G!_;CCZC_CbCwCkKvx,]xCw +000=TB7u8P_>m@CBCFe074ZCf EEeE E\E EfEf +WWW>TXTbX&ZWo=5G\f/I=:D`x`;)B0VK`wGuu)u5ucu5uLuL +ttt^{J{DJNRtq+*L8!@F+y`yMyzp%n!XyyOHHpHa&_JGqtt{tlt/tltRtR +HHH~pyp4ym:HOARoYq+dAbd|X|>3b]k1M;^))3);)8);)K)K +888AK"K["B7u8P_>m@CBCFe074ZII EEeE E\EfEU=ffa%CEf +WWW>TXTbXXXWo=5G\f/I=:D`x`;)B0VK jGuu)u5ucu5uLuL +ttt^{J{DJJHtq+*L8!@F+y`yMyzp%n!X fOHHpHa&_lHqtt{tlt/tltRtR +HHH~pyp4y BHOARoYq+dAbdMXK>3b]k1;B^))3);)8);)K)K +888AK"K["-<8(`v .Gy `N]t,S[4b8G/!5%``4`!`Y`!`S`S +KKKg6!6L!1!KdP lQ|[~Pa7O%S8o@q["&ic::o:&:s:&:S:S +%%%9;|;}|ii%$fL]RQJGfwVv[wEZ-8 G_X;CCZC_CbC_CwCw +000=TB7u8P_>m@IBfFe074Z a EEeE E\E EfEf +WWW>TXTbXM-Wo=5G\f/I=:D xL;)B0VKL5Guu)u5ucu5uLuL +ttt^{J{DJH^tq+*L8!@F+y` MBzp%n!XBBOHHpHa&_R^qtt{tlt/tltRtR +HHH~pyp4y; HOARoYq+dAbdMXK>3b]k1KC^))3);)8);)K)K +888AK"K["778(`v .Gy `N]t,S[4b8G/S;%``4`!`Y`!`S`S +KKKg6!6L!&rKdP lQ|[~Pa7O%S8o@q["}&c::o:&:s:&:S:S +%%%9;|;}|:9%$fL]RQJGfwVv[wEZ-8 Gkw;CCZC_CbCwCkKkg!vwCw +000=TB7u8P_>m@IBfFe074ZUU EEeE E\E EfEf +WWW>TXTbXR^Wo=5G\f/I=:D xL;)B0VKw`Guu)u5ucu5uLuL +ttt^{J{DJ"ltq+*L8!@F+y` MBzp%n!Xm OHHpHa&_Jlqtt{tlt/tltRtR +HHH~pyp4yf~HOARoYq+dAbdMXK>3b]k1|K^))3);)8);)K)K +888AK"K["R@8(`v .Gy `N]t,S[4b8G/Q=%``4`!`Y`!`S`S +KKKg6!6L!reKdP lQ|[~Pa7O%S8o@q["ffc::o:&:s:&:S:S +%%%9;|;}|9,%$fL]RQJGfwVv[wEZ-8 G!v;CCZC_CbC_CwCw +000=TB7u8P_>m@IBfFe074ZCN EEeE E\E EfEf +WWW>TXTbX>&Wo=5G\f/I=:D xL;)B0VK` Guu)u5ucu5uLuL +ttt^{J{DJ^Jtq+*L8!@F+y` MBzp%n!Xy~OHHpHa&_HJqtt{tlt/tltRtR +HHH~pyp4y:3b]k1MM^))3);)8)K)m:Mz|z)K +888AK"K["@^8(`v .Gy `N]t,S[4b8G/tU%``4`!`Y`!`S`S +KKKg6!6L!fsKdP lQ|[~Pa7O%S8o@q["O#c::o:&:s:&:S:S +%%%9;|;}|~|%$fL]RQJGfwVv[wEZ-8 Gv,;CCZC_CbCwCkK!_]wvCw +000=TB7u8P_>m@IBUFe074Z EEeE E\E EfEf +WWW>TXTbXcRWo=5G\f/I=:D xw;)B0VK5LGuu)u5ucu5uLuL +ttt^{J{DJZ"tq+*L8!@F+y` Mmzp%n!XoWWTWZWdWZWa&_lZqtt{tlt/tltRtR +HHH~pyp4y5yHOARoYq+dAbdMXm>3b]k1;z^))3);)8);)K)K +888AK"K["l-8(`v .Gy `N]t,=[4b8G/S!%``4`!`Y`!`S`S +KKKg6!6L!e&KdP lQ|[~Pa7O%}8o@q["SSc::o:&:s:&:S:S +%%%9;|;}|(a%$fL]RQJGfwVv[kEZ-8 Gwk;CCZC_CbC_CwCw +000=TB7u8P_>m@IBUFe074ZfC EEeE E\E EfEf +WWW>TXTbX^cWo=5G\f/I=:D xw;)B0VKL Guu)u5ucu5uLuL +ttt^{J{DJGGtq+*L8!@F+y` Mmzp%n!XB;OHHpHa&_NRqtt{tlt/tltRtR +HHH~pyp4 3b]k1mm^))3);)8);)K)K +888AK"K[-CA8(`v .Gy `N]t,=[4b8G/=Q%``4`!`Y`S`=VtU!9U`S +KKKg6!6L1+fKdP lQ|[~Pa7O%}8o@q["}Oc::o:&:s:&:S:S +%%%9;|;}i,(%$fL]RQJGfwVv[kEZ-8 Gk];CCZC_CbC_CwCw +000=TB7u8P_>m@IBUFe074ZU. EEeE E\E EfEf +WWW>TXTbM<a&_JHqtt{tlt/tltRtR +HHH~pyp4 B5HOARoYq+dAbdMXm>3b]k1|B^))3);)8);)K)K +888AK"K[-B7u8P_>m@IBUFe074ZCa EEeE E\E EfEf +WWW>TXTbM&MWo=5G\f/I=:D xw;)B0VK 5Guu)u5ucu5uLuL +ttt^{J{DHN tq+*L8!@F+y` Mmzp%n!X BOHHpHa&_H^qtt{tlt/tRtNsllG"JtR +HHH~pyp4 ymHOARoYq+dAbdMX|>3b]k1;;^))3);)8)K)m:|mN|)K +888AK"K[-""8(`v .Gy `N]t,Q[4b8G/!S%``4`!`Y`!`S`S +KKKg6!6L1!1KdP lQ|[~Pa7O%f8o@q["&}c::o:&:s:&:S:S +%%%9;|;}i|:%$fL]RQJGfwVv[!EZ-8 G_!;CCZC_CbC_CwCw +000=TB7u8P_>m@IBCFe074Z I EEeE E\E EfEf +WWW>TXTbMX>Wo=5G\f/I=:D x`;)B0VK5jGuu)u5ucu5uLuL +ttt^{J{DHJZtq+*L8!@F+y` Myzp%n!Xa&_RNqtt{tlt/tltRtR +HHH~pyp4 ;HOARoYq+dAbdMX|>3b]k1K|^))3);)8);)K)K +888AK"K[--R8(`v .Gy `N]t,Q[4b8G/St%``4`!`Y`!`S`S +KKKg6!6L11gKdP lQ|[~Pa7O%f8o@q["Svc::o:&:s:&:S:S +%%%9;|;}ii~%$fL]RQJGfwVv[!EZ-8 Gwg;CCZC_CbC_CwCw +000=TB7u8P_>m@IBCFe074Zfd EEeE E\EfEU=C U%IEf +WWW>TXTbMRZWo=5G\f/I=:D x`;)B0VKLNGuu)u5ucu5uLuL +ttt^{J{DH Rtq+*L8!@F+y` Myzp%n!XB5OHHpHa&_N qtt{tlt/tltRtR +HHH~pyp4 ;:HOARoYq+dAbdMX|>3b]k1mN^))3);)8);)K)K +888AK"K[-7l8(`v .Gy `N]t,Q[4b8G/=T%``4`!`Y`!`S`S +KKKg6!6L1r+KdP lQ|[~Pa7O%f8o@q["}uc::o:&:s:&:S:S +%%%9;|;}ia{%$fL]RQJGfwVv[!EZ-8 Gkx;CCZC_CbC_CwCw +000=TB7u8P_>m@IBCFe074ZC EEeE E\EfEU=ffU.Ef +WWW>TXTbM-XWo=5G\f/I=:D x`;)B0VK`LGuu)u5ucu5uLuL +ttt^{J{DH"Htq+*L8!@F+y` Myzp%n!XymOHHpHoWWTWZWdWZWa&_JZqtt{tlt/tltRtR +HHH~pyp4 ~BHOARoYq+dAbdMX|>3b]k1|z^))3);)8);)K)K +888AK"K[-A<8(`v .Gy `N]t,Q[4b8G/t!%``4`!`Y`!`S`S +KKKg6!6L1g!KdP lQ|[~Pa7O%f8o@q["OSc::o:&:s:&:S:S +%%%9;|;}i9i%$fL]RQJGfwVv[!EZ-8 Gvk;CCZC_CbC_CwCw +000=TB7u8P_>m@IBCFe074ZIC EEeE E\E EfEf +WWW>TXTbM>-Wo=5G\f/I=:D x`;)B0VK Guu)u5ucu5uLuL +ttt^{J{DH^^tq+*L8!@F+y` Myzp%n!X ;OHHpHa&_lJqtt{tlt/tltRtR +HHH~pyp4 : HOARoYq+dAbdBXK>3b]k1;M^))3);)8);)K)K +888AK"K[-@78(`v .Gy `N]U,S[4b8G/!U%``4`!`Y`!`S`S +KKKg6!6L1frKdP lQ|[~Pa7v%S8o@q["&#c::o:&:s:&:S:S +%%%9;|;}i~9%$fL]RQJGfwV][wEZ-8 G_,;CCZC_CbC_CwCw +000=TB7u8P_>m@NBfFe074Z % EEeE E\E EfEf +WWW>TXTbMc^Wo=5G\f/I=:DjxL;)B0VK5\Guu)u5ucu5uLuL +ttt^{J{DHGltq+*L8!@F+y`;MBzp%n!XBa&_R"qtt{tlt/tltRtR +HHH~pyp4 5~HOARoYq+dAbdBXK>3b]k1K@^))3);)8);)K)K +888AK"K[-l@8(`v .Gy `N]U,S[4b8G/S9%``4`!`Y`!`S`S +KKKg6!6L1eeKdP lQ|[~Pa7v%S8o@q["S c::o:&:s:&:S:S +%%%9;|;}:,,%$fL]RQJGfwV][wEZ-8 Gk_;CCZC_CbC_CwCw +000=TB7u8P_>m@NBfFe074ZUf EEeE E\E EfEf +WWW>TXTbRZ&Wo=5G\f/I=:DjxL;)B0VKwwGuu)u5ucu5uLuL +ttt^{J{D lJtq+*L8!@F+y`;MBzp%n!XmyOHHpHa&_NGqtt{tlt/tltRtR +HHH~pyp4;B3b]k1|;^))3);)8);)K)K +888AK"K[7^^8(`v .Gy `N]U,S[4b8G/QS%``4`!`Y`!`S`S +KKKg6!6L&zsKdP lQ|[~Pa7v%S8o@q["f}c::o:&:s:&:S:S +%%%9;|;}:{|%$fL]RQJGfwV][wEZ-8 G!!;CCZC_CbC_CwCw +000=TB7u8P_>m@NBfFe074ZCI EEeE E\E EfEf +WWW>TXTbRa&_HNqtt{tlt/tltRtR +HHH~pyp4;myHOARoYq+dAbdBXK>3b]k1M|^))3);)8);)K)K +888AK"K[7<-8(`v .Gy `N]U,S[4b8G/tt%``4`!`Y`!`S`S +KKKg6!6L&s&KdP lQ|[~Pa7v%S8o@q["Ovc::o:&:s:&:S:S +%%%9;|;}:Ca%$fL]RQJGfwV][wEZ-8 Gvg;CCZC_CbC_CwCw +000=TB7u8P_>m@NBfFe074ZId EEeE E\E EfEf +WWW>TXTbR&cWo=5G\f/I=:Djxw;)B0VK55Guu)u5ucu5uLuL +ttt^{J{D NGtq+*L8!@F+y`;Mmzp%n!Xa&_l^qtt{tlt/tltRtR +HHH~pyp4;yfHOARoYq+dAbdBXm>3b]k1;C^))3);)8);)K)K +888AK"K[7"A8(`v .Gy `N]U,=[4b8G/!;%``4`!`Y`!`S`S +KKKg6!6L&!fKdP lQ|[~Pa7v%}8o@q["S&c::o:&:s:&:S:S +%%%9;|;}:|(%$fL]RQJGfwV][kEZ-8 Gww;CCZC_CbC_CwCw +000=TB7u8P_>m@NBUFe074ZfU EEeE E\E EfEf +WWW>TXTbRMa&_Nlqtt{tlt/tltRtR +HHH~pyp4; 5HOARoYq+dAbdBXm>3b]k1mK^))3);)8);)K)K +888AK"K[77C8(`v .Gy `N]U,=[4b8G/==%``4`!`Y`!`S`S +KKKg6!6L&&zKdP lQ|[~Pa7v%}8o@q["}fc::o:&:s:&:S:S +%%%9;|;}::C%$fL]RQJGfwV][kEZ-8 Gkv;CCZC_CbC_CwCw +000=TB7u8P_>m@NBUFe074ZUN EEeE E\E EfEf +WWW>TXTbRRMWo=5G\f/I=:Djxw;)B0VKw Guu)u5ucu5uLuL +ttt^{J{D tq+*L8!@F+y`;Mmzp%n!Xm~OHHpHa&_JJqtt{tlt/tltRtR +HHH~pyp4;fmHOARoYq+dAbdBXm>3b]k1|M^))3);)8);)K)K +888AK"K[7R"8(`v .Gy `N]U,=[4b8G/QU%``4`!`Y`!`S`S +KKKg6!6L&r1KdP lQ|[~Pa7v%}8o@q["f#c::o:&:s:&:S:S +%%%9;|;}:a:%$fL]RQJGfwV][kEZ-8 G!,;CCZC_CbC_CwCw +000=TB7u8P_>m@NBUFe074ZC% EEeE E\E EfEf +WWW>TXTbR->Wo=5G\f/I=:Djxw;)B0VK`\Guu)u5ucu5uLuL +ttt^{J{D "Ztq+*L8!@F+y`;Mmzp%n!X a&_H"qtt{tlt/tltRtR +HHH~pyp4;~;HOARoYq+dAbdBXm>3b]k1M@^))3);)8)K)m:KK;Mz)K +888AK"K[7AR8(`v .Gy `N]U,Q[4b8G/!!%``4`!`Y`!`S`S +KKKg6!6L&ggKdP lQ|[~Pa7v%f8o@q["&Sc::o:&:s:&:S:S +%%%9;|;}:9~%$fL]RQJGfwV][!EZ-8 G_k;CCZC_CbC_CwCw +000=TB7u8P_>m@NBCFe074Z C EEeE E\E EfEf +WWW>TXTbRcZWo=5G\f/I=:Djx`;)B0VK5 Guu)u5ucu5uLuL +ttt^{J{D ZRtq+*L8!@F+y`;Myzp%n!X<;OHHpHa&_RRqtt{tlt/tltRtR +HHH~pyp4;::HOARoYq+dAbdBX|>3b]k1Km^))3);)8);)K)K +888AK"K[7@l8(`v .Gy `N]U,Q[4b8G/SQ%``4`!`Y`!`S`S +KKKg6!6L&e+KdP lQ|[~Pa7v%f8o@q["SOc::o:&:s:&:S:S +%%%9;|;}:({%$fL]RQJGfwV][!EZ-8 Gw];CCZC_CbC_CwCw +000=TB7u8P_>m@NBCFe074Zf. EEeE E\E EfEf +WWW>TXTbR^XWo=5G\f/I=:Djx`;)B0VKL&Guu)u5ucuLuwQw `L\uL +ttt^{J{D GHtq+*L8!@F+y`;Myzp%n!XB:OHHpHa&_NHqtt{tlt/tltRtR +HHH~pyp4f3b]k1mB^))3);)8);)K)K +888AK"K[RC<8(`v .Gy `N]U,Q[4b8G/=5%``4`!`Y`!`S`S +KKKg6!6Lr+!KdP lQ|[~Pa7v%f8o@q["}ic::o:&:s:&:S:S +%%%9;|;}a,i%$fL]RQJGfwV][!EZ-8 GkX;CCZC_CbC_CwCw +000=TB7u8P_>m@NBCFe074ZUa EEeE E\EfEU=INdICEf +WWW>TXTb-Z-Wo=5G\f/I=:Djx`;)B0VK`5Guu)u5ucu5uLuL +ttt^{J{D"l^tq+*L8!@F+y`;Myzp%n!XyBOHHpHa&_J^qtt{tlt/tltRtR +HHH~pyp4fB HOARoYq+dAbdBX|>3b]k1|C^))3);)8);)K)K +888AK"K[R^78(`v .Gy `N]U,Q[4b8G/Q;%``4`!`Y`!`S`S +KKKg6!6LrzrKdP lQ|[~Pa7v%f8o@q["O&c::o:&:s:&:S:S +%%%9;|;}a{9%$fL]RQJGfwV][!EZ-8 Gvw;CCZC_CbC_CwCw +000=TB7u8P_>m@NBCFe074ZIU EEeE E\E EfEf +WWW>TXTb-<^Wo=5G\f/I=:Djx`;)B0VK `Guu)u5ucu5uLuL +ttt^{J{D"Nltq+*L8!@F+y`;Myzp%n!X OHHpHa&_lNqtt{tlt/tltRtR +HHH~pyp4fm~HOARoYq+dAbdNXK>3b]k1;|^))3);)8);)K)K +888AK"K[R<@8(`v .Gy `N]5,S[4b8G/!t%``4`!`Y`!`S`S +KKKg6!6LrseKdP lQ|[~Pa7#%S8o@q["&vc::o:&:s:&:S:S +%%%9;|;}a|,%$fL]RQJGfwVg[wEZ-8 G_g;CCZC_CbC_CwCw +000=TB7u8P_>m@.BfFe074Z d EEeE E\E EfEf +WWW>TXTb-X&Wo=5G\f/I=:D xL;)B0VK5NGuu)u5ucu5uLuL +ttt^{J{D"JJtq+*L8!@F+y`fMBzp%n!X<5OHHpHa&_R qtt{tlt/tltRtR +HHH~pyp4f 3b]k1KN^))3);)8);)K)K +888AK"K[R-^8(`v .Gy `N]5,S[4b8G/ST%``4`!`Y`!`S`S +KKKg6!6Lr1sKdP lQ|[~Pa7#%S8o@q["Suc::o:&:s:&:S:S +%%%9;|;}ai|%$fL]RQJGfwVg[wEZ-8 Gwx;CCZC_CbC_CwCw +000=TB7u8P_>m@.BfFe074ZU EEeE E\E EfEf +WWW>TXTb-MRWo=5G\f/I=:D xL;)B0VKwLGuu)u5ucu5uLuL +ttt^{J{D"H"tq+*L8!@F+y`fMBzp%n!XmmOHHpHoWWTWZWdWZWa&_NZqtt{tlt/tltRtR +HHH~pyp4f;yHOARoYq+dAbdNXK>3b]k1mz^))3);)8);)K)K +888AK"K[R7-8(`v .Gy `N]5,S[4b8G/Q!%``4`!`Y`!`S`S +KKKg6!6Lr&&KdP lQ|[~Pa7#%S8o@q["fSc::o:&:s:&:S:S +%%%9;|;}a:a%$fL]RQJGfwVg[wEZ-8 G!k;CCZC_CbC_CwCw +000=TB7u8P_>m@.BfFe074ZCC EEeE E\E EfEf +WWW>TXTb-RcWo=5G\f/I=:D xL;)B0VK` Guu)u5ucu5uLuL +ttt^{J{D" Gtq+*L8!@F+y`fMBzp%n!Xy;OHHpHa&_HRqtt{tlt/tltRtR +HHH~pyp4fffHOARoYq+dAbdNXK>3b]k1Mm^))3);)8);)K)K +888AK"K[RRA8(`v .Gy `N]5,S[4b8G/tQ%``4`!`Y`!`S`S +KKKg6!6LrrfKdP lQ|[~Pa7#%S8o@q["OOc::o:&:s:&:S:S +%%%9;|;}aa(%$fL]RQJGfwVg[wEZ-8 Gv];CCZC_CbC_CwCw +000=TB7u8P_>m@.BfFe074ZI. EEeE E\E EfEf +WWW>TXTb->a&_l"qtt{tlt/tltRtR +HHH~pyp4f~5HOARoYq+dAbdNXm>3b]k1;@^))3);)8);)K)K +888AK"K[R@C8(`v .Gy `N]5,=[4b8G/!9%``4`!`Y`!`S`S +KKKg6!6LrfzKdP lQ|[~Pa7#%}8o@q["& c::o:&:s:&:S:S +%%%9;|;}a~C%$fL]RQJGfwVg[kEZ-8 Gw_;CCZC_CbC_CwCw +000=TB7u8P_>m@.BUFe074Zff EEeE E\E EfEf +WWW>TXTb-cMWo=5G\f/I=:D xw;)B0VKLwGuu)u5ucu5uLuL +ttt^{J{D"Z tq+*L8!@F+y`fMmzp%n!XByOHHpHa&_RGqtt{tlt/tltRtR +HHH~pyp4f5mHOARoYq+dAbdNXm>3b]k1m;^))3);)8);)K)K +888AK"K[Rl"8(`v .Gy `N]5,=[4b8G/=S%``4`!`Y`!`S`S +KKKg6!6Lre1KdP lQ|[~Pa7#%}8o@q["}}c::o:&:s:&:S:S +%%%9;|;}a(:%$fL]RQJGfwVg[kEZ-8 Gk!;CCZC_CbC_CwCw +000=TB7u8P_>m@.BUFe074ZUI EEeE E\E EfEf +WWW>TXTb-^>Wo=5G\f/I=:D xw;)B0VKwjGuu)u5ucu5uLuL +ttt^{J{D"GZtq+*L8!@F+y`fMmzp%n!XmfOHHpHa&_JNqtt{tlt/tltRtR +HHH~pyp4~<;HOARoYq+dAbdNXm>3b]k1||^))3);)8);)K)K +888AK"K[ACR8(`v .Gy `N]5,=[4b8G/Qt%``4`!`Y`!`S`S +KKKg6!6Lg+gKdP lQ|[~Pa7#%}8o@q["fvc::o:&:s:&:S:S +%%%9;|;}9,~%$fL]RQJGfwVg[kEZ-8 G!g;CCZC_CbC_CwCw +000=TB7u8P_>m@.BUFe074ZCd EEeE E\E EfEf +WWW>TXTb>a&_H qtt{tlt/tltRtR +HHH~pyp4~B:HOARoYq+dAbdNXm>3b]k1MN^))3);)8);)K)K +888AK"K[A^l8(`v .Gy `N]5,=[4b8G/tT%``4`!`Y`!`S`S +KKKg6!6Lgs+KdP lQ|[~Pa7#%f8o@q["&&c::o:&:s:&:S:S +%%%9;|;}9C{%$fL]RQJGfwVg[!EZ-8 G_w;CCZC_CbC_CwCw +000=TB7u8P_>m@.BCFe074Z U EEeE E\E EfEf +WWW>TXTb>&XWo=5G\f/I=:D x`;)B0VK5`Guu)u5ucu5uLuL +ttt^{J{D^NHtq+*L8!@F+y`fMyzp%n!X< OHHpHa&_Rlqtt{tlt/tltRtR +HHH~pyp4~yBHOARoYq+dAbdNX|>3b]k1KK^))3);)8);)K)K +888AK"K[A"<8(`v .Gy `N]5,Q[4b8G/S=%``4`!`Y`!`S`S +KKKg6!6Lg!!KdP lQ|[~Pa7#%f8o@q["Sfc::o:&:s:&:S:S +%%%9;|;}9|i%$fL]RQJGfwVg[!EZ-8 Gwv;CCZC_CbC_CwCw +000=TB7u8P_>m@.BCFe074ZfN EEeE E\E EfEf +WWW>TXTb>X-Wo=5G\f/I=:D x`;)B0VKL Guu)u5ucu5uLuL +ttt^{J{D^J^tq+*L8!@F+y`fMyzp%n!XB~OHHpHa&_NJqtt{tlt/tltRtR +HHH~pyp4~ HOARoYq+dAbdNX|>3b]k1mM^))3);)8);)K)K +888AK"K[A-78(`v .Gy `N]5,Q[4b8G/=U%``4`!`Y`!`S`S +KKKg6!6Lg1rKdP lQ|[~Pa7#%f8o@q["}#c::o:&:s:&:S:S +%%%9;|;}9i9%$fL]RQJGfwVg[!EZ-8 Gk,;CCZC_CbC_CwCw +000=TB7u8P_>m@.BCFe074ZU% EEeE E\E EfEf +WWW>TXTb>M^Wo=5G\f/I=:D x`;)B0VKw\Guu)u5ucu5uLuL +ttt^{J{D^ ltq+*L8!@F+y`fMyzp%n!Xya&_J"qtt{tlt/tltRtR +HHH~pyp4~;~HOARoYq+dAbdNX|>3b]k1|@^))3);)8);)K)K +888AK"K[A7@8(`v .Gy `N]5,Q[4b8G/Q9%``4`!`Y`!`S`S +KKKg6!6Lg&eKdP lQ|[~Pa7#%f8o@q["f c::o:&:s:&:S:S +%%%9;|;}9a,%$fL]RQJGfwVg[!EZ-8 Gv_;CCZC_CbC_CwCw +000=TB7u8P_>m@.BCFe074ZIf EEeE E\E EfEf +WWW>TXTb>-&Wo=5G\f/I=:D x`;)B0VK wGuu)u5ucu5uLuL +ttt^{J{D^"Jtq+*L8!@F+y`fMyzp%n!X yOHHpH3U]k1;m^))3);)8);)K)K +888AK-K["8(`v .Gy `N]S,=[4$8G/!Q%``4`!`Y`!`S`S +KKKg616L1KdP lQ|[~Pa7S%}8oDq["&Oc::o:&:s:&:S:S +%%%9;i;}:%$fL]RQJGfwVw[kEZA8 G_];CCZC_CbC_CwCw +000=TcT~]0|>B7u8P_>m@fBUFe,74Z . EEeE E\E EfEf +WWW>TMTb>Wo=5G\f/I=:DLxw;)=0VK5&Guu)u5ucu5uLuL +ttt^{H{DZtq+*L8!@F+y`BMmzpdn!X<:OHHpH3U]k1KB^))3);)8);)K)K +888AK-K[^R8(`v .Gy `N]S,=[4$8G/S5%``4`!`Y`!`S`S +KKKg616LzgKdP lQ|[~Pa7S%}8oDq["Sic::o:&:s:&:S:S +%%%9;i;}{~%$fL]RQJGfwVw[kEZA8 GwX;CCZC_CbC_CwCw +000=TcT~3p0|>B7u8P_>m@fBUFe,74Zfa EEeE E\E EfEf +WWW>TMTb&ZWo=5G\f/I=:DLxw;)=0VKw5Guu)u5ucu5uLuL +ttt^{H{DNRtq+*L8!@F+y`BMmzpdn!XmBOHHpH3U]k1mC^))3);)8);)K)K +888AK-K[B7u8P_>m@fBUFe,74ZCU EEeE E\E EfEf +WWW>TMTbXXWo=5G\f/I=:DLxw;)=0VK``Guu)u5ucu5uLuL +ttt^{H{DJHtq+*L8!@F+y`BMmzpdn!Xy OHHpH3U]k1MK^))3);)8);)K)K +888AK-K[-<8(`v .Gy `N]S,=[4$8G/t=%``4`!`Y`!`S`S +KKKg616L1!KdP lQ|[~Pa7S%}8oDq["Ofc::o:&:s:&:S:S +%%%9;i;}ii%$fL]RQJGfwVw[kEZA8 Gvv;CCZC_CbC_CwCw +000=TcT~cw0|>B7u8P_>m@fBUFe,74ZIN EEeE E\E EfEf +WWW>TMTbM-Wo=5G\f/I=:DLxw;)=0VK Guu)u5ucu5uLuL +ttt^{H{DH^tq+*L8!@F+y`BMmzpdn!X ~OHHpH3U]k1BM^))3);)8);)K)K +888AK-K[778(`v .Gy `N]S,=[4$8G/UU%``4`!`Y`!`S`S +KKKg616L&rKdP lQ|[~Pa7S%}8oDq["v#c::o:&:s:&:S:S +%%%9;i;}:9%$fL]RQJGfwVw[kEZA8 G],;CCZC_CbC_CwCw +000=TcT~wi0|>B7u8P_>m@fBUFe,74ZN% EEeE E\E EfEf +WWW>TMTbR^Wo=5G\f/I=:DLxw;)=0VKj\Guu)u5ucu5uLuL +ttt^{H{D"ltq+*L8!@F+y`BMmzpdn!Xf3U]k1;|^))3);)8);)K)K +888AK-K[R@8(`v .Gy `N]S,Q[4$8G/!t%``4`!`Y`!`S`S +KKKg616LreKdP lQ|[~Pa7S%f8oDq["&vc::o:&:s:&:S:S +%%%9;i;}9,%$fL]RQJGfwVw[!EZA8 G_g;CCZC_CbC_CwCw +000=TcT~=30|>B7u8P_>m@fBCFe,74Z d EEeE E\E EfEf +WWW>TMTb>&Wo=5G\f/I=:DLx`;)=0VK5NGuu)u5ucu5uLuL +ttt^{H{D^Jtq+*L8!@F+y`BMyzpdn!X<5OHHpH3U]k1KN^))3);)8);)K)K +888AK-K[@^8(`v .Gy `N]S,Q[4$8G/ST%``4`!`Y`!`S`S +KKKg616LfsKdP lQ|[~Pa7S%f8oDq["Suc::o:&:s:&:S:S +%%%9;i;}~|%$fL]RQJGfwVw[!EZA8 Gwx;CCZC_CbC_CwCw +000=TcT~ic0|>B7u8P_>m@fBCFe,74ZU EEeE E\E EfEf +WWW>TMTbcRWo=5G\f/I=:DLx`;)=0VKwLGuu)u5ucu5uLuL +ttt^{H{DZ"tq+*L8!@F+y`BMyzpdn!XmmOHHpHoWWTWZWdWZW3U]k1mz^))3);)8);)K)K +888AK-K[l-8(`v .Gy `N]S,Q[4$8G/Q!%``4`!`Y`!`S`S +KKKg616Le&KdP lQ|[~Pa7S%f8oDq["fSc::o:&:s:&:S:S +%%%9;i;}(a%$fL]RQJGfwVw[!EZA8 G!k;CCZC_CbC_CwCw +000=TcT~p=0|>B7u8P_>m@fBCFe,74ZCC EEeE E\E EfEf +WWW>TMTb^cWo=5G\f/I=:DLx`;)=0VK` Guu)u5ucu5uLuL +ttt^{H{DGGtq+*L8!@F+y`BMyzpdn!Xy;OHHpH3U]k1Mm^))3);)8);)K)K +888AK-K[^CA8(`v .Gy `N]S,Q[4$8G/tQ%``4`!`Y`!`S`S +KKKg616Lz+fKdP lQ|[~Pa7S%f8oDq["OOc::o:&:s:&:S:S +%%%9;i;}{,(%$fL]RQJGfwVw[!EZA8 Gv];CCZC_CbC_CwCw +000=TcT~33g0|>B7u8P_>m@fBCFe,74ZI. EEeE E\E EfEf +WWW>TMTb<<3U]k1BB^))3);)8);)K)K +888AK-K[^B7u8P_>m@fBCFe,74ZNa EEeE E\E EfEf +WWW>TMTb<&MWo=5G\f/I=:DLx`;)=0VK 5Guu)u5ucu5uLuL +ttt^{H{DRN tq+*L8!@F+y`BMyzpdn!XfBOHHpH3U]k1;M^))3);)8);)K)K +888AK-K[^""8(`v .Gy `N]=,=[4$8G/!U%``4`!`Y`!`S`S +KKKg616Lz!1KdP lQ|[~Pa7}%}8oDq["&#c::o:&:s:&:S:S +%%%9;i;}{|:%$fL]RQJGfwVk[kEZA8 G_,;CCZC_CbC_CwCw +000=TcT~3<]0|>B7u8P_>m@UBUFe,74Z % EEeE E\E EfEf +WWW>TMTbWo=5G\f/I=:Dwxw;)=0VK5\Guu)u5ucu5uLuL +ttt^{H{DRJZtq+*L8!@F+y`mMmzpdn!XB3U]k1K@^))3);)8);)K)K +888AK-K[^-R8(`v .Gy `N]=,=[4$8G/S9%``4`!`Y`!`S`S +KKKg616Lz1gKdP lQ|[~Pa7}%}8oDq["S c::o:&:s:&:S:S +%%%9;i;}{i~%$fL]RQJGfwVk[kEZA8 Gk_;CCZC_CbC_CwCw +000=TcT~3cp0|>B7u8P_>m@UBUFe,74ZUf EEeE E\E EfEf +WWW>TMTb3U]k1|;^))3);)8);)K)K +888AK-K[^7l8(`v .Gy `N]=,=[4$8G/QS%``4`!`Y`!`S`S +KKKg616Lzr+KdP lQ|[~Pa7}%}8oDq["f}c::o:&:s:&:S:S +%%%9;i;}{a{%$fL]RQJGfwVk[kEZA8 G!!;CCZC_CbC_CwCw +000=TcT~3]n0|>B7u8P_>m@UBUFe,74ZCI EEeE E\E EfEf +WWW>TMTb<-XWo=5G\f/I=:Dwxw;)=0VK`jGuu)u5ucu5uLuL +ttt^{H{DR"Htq+*L8!@F+y`mMmzpdn!XyfOHHpH3U]k1M|^))3);)8);)K)K +888AK-K[^A<8(`v .Gy `N]=,=[4$8G/tt%``4`!`Y`!`S`S +KKKg616Lzg!KdP lQ|[~Pa7}%}8oDq["Ovc::o:&:s:&:S:S +%%%9;i;}{9i%$fL]RQJGfwVk[kEZA8 Gvg;CCZC_CbC_CwCw +000=TcT~3=w0|>B7u8P_>m@UBUFe,74ZId EEeE E\E EfEf +WWW>TMTb<>-Wo=5G\f/I=:Dwxw;)=0VK NGuu)u5ucu5uLuL +ttt^{H{DR^^tq+*L8!@F+y`mMmzpdn!X 5OHHpH3U]k1BN^))3);)8);)K)K +888AK-K[^@78(`v .Gy `N]=,=[4$8G/UT%``4`!`Y`!`S`S +KKKg616LzfrKdP lQ|[~Pa7}%}8oDq["vuc::o:&:s:&:S:S +%%%9;i;}{~9%$fL]RQJGfwVk[kEZA8 G]x;CCZC_CbC_CwCw +000=TcT~3ii0|>B7u8P_>m@UBUFe,74Z. EEeE E\E EfEf +WWW>TMTb3U]k1;B^))3);)8);)K)K +888AK-K[^l@8(`v .Gy `N]=,Q[4$8G/!5%``4`!`Y`!`S`S +KKKg616LzeeKdP lQ|[~Pa7}%f8oDq["&ic::o:&:s:&:S:S +%%%9;i;}C,,%$fL]RQJGfwVk[!EZA8 G_X;CCZC_CbC_CwCw +000=TcT~ng30|>B7u8P_>m@UBCFe,74Z a EEeE E\E EfEf +WWW>TMTb&Z&Wo=5G\f/I=:Dwx`;)=0VKL5Guu)u5ucu5uLuL +ttt^{H{DNlJtq+*L8!@F+y`mMyzpdn!XBBOHHpH3U]k1KC^))3);)8);)K)K +888AK-K[<^^8(`v .Gy `N]=,Q[4$8G/S;%``4`!`Y`!`S`S +KKKg616LszsKdP lQ|[~Pa7}%f8oDq["}&c::o:&:s:&:S:S +%%%9;i;}C{|%$fL]RQJGfwVk[!EZA8 Gkw;CCZC_CbC_CwCw +000=TcT~n3c0|>B7u8P_>m@UBCFe,74ZUU EEeE E\E EfEf +WWW>TMTb&3U]k1|K^))3);)8);)K)K +888AK-K[<<-8(`v .Gy `N]=,Q[4$8G/Q=%``4`!`Y`!`S`S +KKKg616Lss&KdP lQ|[~Pa7}%f8oDq["ffc::o:&:s:&:S:S +%%%9;i;}CCa%$fL]RQJGfwVk[!EZA8 G!v;CCZC_CbC_CwCw +000=TcT~nn=0|>B7u8P_>m@UBCFe,74ZCN EEeE E\E EfEf +WWW>TMTb&&cWo=5G\f/I=:Dwx`;)=0VK` Guu)u5ucu5uLuL +ttt^{H{DNNGtq+*L8!@F+y`mMyzpdn!Xy~OHHpH3U]k1MM^))3);)8);)K)K +888AK-K[<"A8(`v .Gy `N]=,Q[4$8G/tU%``4`!`Y`!`S`S +KKKg616Ls!fKdP lQ|[~Pa7}%f8oDq["O#c::o:&:s:&:S:S +%%%9;i;}C|(%$fL]RQJGfwVk[!EZA8 Gv,;CCZC_CbC_CwCw +000=TcT~ncg0|>B7u8P_>m@UBCFe,74ZI% EEeE E\E EfEf +WWW>TMTb&M3U]k1B@^))3);)8);)K)K +888AK-K[<7C8(`v .Gy `N]=,Q[4$8G/U9%``4`!`Y`!`S`S +KKKg616Ls&zKdP lQ|[~Pa7}%f8oDq["v c::o:&:s:&:S:S +%%%9;i;}C:C%$fL]RQJGfwVk[!EZA8 Gg_;CCZC_CbC_CwCw +000=TcT~nw<0|>B7u8P_>m@UBCFe,74Z.f EEeE E\E EfEf +WWW>TMTb&RMWo=5G\f/I=:Dwx`;)=0VK wGuu)u5ucu5uLuL +ttt^{H{DN tq+*L8!@F+y`mMyzpdn!XfyOHHpH3U]k1;N^))3);)8);)K)K +888AK-K[B7u8P_>m@CBfFe,74Zf EEeEa.E\EfEU= NUEf +WWW>TMTb&->Wo=5G\f/I=:D`xL;)=0VKLLGuu)u\ ucuLuwQ5N L&uL +ttt^{H{DN"Ztq+*L8!@F+y`yMBzpdn!XBmOHHpHoWWTWZWdWZW3U]k1Kz^))3);)8);)K)K +888AK-K[B7u8P_>m@CBfFe,74ZUC EEeE E\E EfEf +WWW>TMTb&cZWo=5G\f/I=:D`xL;)=0VKw Guu)u5ucu5uLuL +ttt^{H{DNZRtq+*L8!@F+y`yMBzpdn!Xm;OHHpH3U]k1|m^))3);)8);)K)K +888AK-K[<@l8(`v .Gy `N]Q,S[4$8G/QQ%``4`!`Y`!`S`S +KKKg616Lse+KdP lQ|[~Pa7f%S8oDq["fOc::o:&:s:&:S:S +%%%9;i;}C({%$fL]RQJGfwV![wEZA8 G!];CCZC_CbC_CwCw +000=TcT~npn0|>B7u8P_>m@CBfFe,74ZC. EEeE E\E EfEf +WWW>TMTb&^XWo=5G\f/I=:D`xL;)=0VK`&Guu)u5ucu5uLuL +ttt^{H{DNGHtq+*L8!@F+y`yMBzpdn!Xy:OHHpH3U]k1MB^))3);)8);)K)K +888AK-K["C<8(`v .Gy `N]Q,S[4$8G/t5%``4`!`Y`!`S`S +KKKg616L!+!KdP lQ|[~Pa7f%S8oDq["Oic::o:&:s:&:S:S +%%%9;i;}|,i%$fL]RQJGfwV![wEZA8 GvX;CCZC_CbC_CwCw +000=TcT~B7u8P_>m@CBfFe,74ZIa EEeE E\E EfEf +WWW>TMTbXZ-Wo=5G\f/I=:D`xL;)=0VKj5Guu)u5ucu5uLuL +ttt^{H{DJl^tq+*L8!@F+y`yMBzpdn!X;BOHHpH3U]k1BC^))3);)8);)K)K +888AK-K["^78(`v .Gy `N]Q,S[4$8G/U;%``4`!`Y`!`S`S +KKKg616L!zrKdP lQ|[~Pa7f%S8oDq["#&c::o: #:s:&:S:S +%%%9;i;}|{9%$fL]RQJGfwV![wEZA8 Ggw;CCZCxgCbCwCkK_!kgwCw +000=TcT~<3i0|>B7u8P_>m@CBfFe,74Z.U EEeEa.E\EfEU= Ca.dEf +WWW>TMTbX<^Wo=5G\f/I=:D`xL;)=0VK `Guu)u\ ucuLuwQ5L`&juL +ttt^{H{DJNltq+*L8!@F+y`yMmzpdn!X<3U]k1;@^))3);)8);)K)K +888AK-K["<@8(`v .Gy `N]Q,=[4$8G/!9%``4`;5`Y`!`S`S +KKKg616L!seKdP lQ|[~Pa7f%}8oDq["& c::o: #:s:&:S:S +%%%9;i;}||,%$fL]RQJGfwV![kEZA8 Gw_;CCZCxgCbCwCkK!v,Cw +000=TcT~<<30|>B7u8P_>m@CBUFe,74Zff EEeEa.E\E EfEf +WWW>TMTbXX&Wo=5G\f/I=:D`xw;)=0VKLwGuu)u\ ucuLuwQ5\ w`uL +ttt^{H{DJJJtq+*L8!@F+y`yMmzpdn!XByOHHpH5fHGH3U]k1m;^))3)zN)8);)K)K +888AK-K["-^8(`v .Gy `N]Q,=[4$8G/=S%``4`;5`Y`S`=VQTQQU`S +KKKg616L!1sKdP lQ|[~Pa7f%}8oDq["}}c::o: #:s:S:}.Oi }u:S +%%%9;i;}|i|%$fL]RQJGfwV![kEZA8 Gk!;CCZCxgCbCwCkKvXkv,Ck +000=TcT~B7u8P_>m@CBUFe,74ZUI EEeEa.E\E EfEf +WWW>TMTbXMRWo=5G\f/I=:D`xw;)=0VKwjGuu)u\ ucu5uLuL +ttt^{H{DJH"tq+*L8!@F+y`yMmzpdn!XmfOHHpH5fHGH3U]k1||^))3);)8);)K)K +888AK-K["7-8(`v .Gy `N]Q,=[4$8G/Qt%``4`!`Y`!`S`S +KKKg616L!&&KdP lQ|[~Pa7f%}8oDq["fvc::o:&:s:&:S:S +%%%9;i;}|:a%$fL]RQJGfwV![kEZA8 G!g;CCZC_CbC_CwCw +000=TcT~B7u8P_>m@CBUFe,74ZCd EEeE E\E EfEf +WWW>TMTbXRcWo=5G\f/I=:D`xw;)=0VK`NGuu)u5ucu5uLuL +ttt^{H{DJ Gtq+*L8!@F+y`yMmzpdn!Xy5OHHpH3U]k1MN^))3);)8);)K)K +888AK-K["RA8(`v .Gy `N]Q,=[4$8G/tT%``4`!`Y`!`S`S +KKKg616L!rfKdP lQ|[~Pa7f%}8oDq["Ouc::o:&:s:&:S:S +%%%9;i;}|a(%$fL]RQJGfwV![kEZA8 Gvx;CCZC_CbC_CwCw +000=TcT~<=g0|>B7u8P_>m@CBUFe,74ZN EEeE E\E EfEf +WWW>TMTbX>oWWTWZWdWZW3U]k1Bz^))3);)8);)K)K +888AK-K["@C8(`v .Gy `N]Q,=[4$8G/5!%``4`!`Y`!`S`S +KKKg616L!fzKdP lQ|[~Pa7f%}8oDq["#Sc::o:&:s:&:S:S +%%%9;i;}|~C%$fL]RQJGfwV![kEZA8 Ggk;CCZC_CbC_CwCw +000=TcT~B7u8P_>m@CBUFe,74Z.C EEeE E\E EfEf +WWW>TMTbXcMWo=5G\f/I=:D`x`;)=0VK55Guu)u5ucu5uLuL +ttt^{H{DJZ tq+*L8!@F+y`yMyzpdn!X3U]k1;C^))3)zN)8)K)m:KBMz|)K +888AK-K["l"8(`v .Gy `N]Q,Q[4$8G/!;%``4`;5`Y`!`S`S +KKKg616L!e1KdP lQ|[~Pa7f%f8oDq["S&c::o: #:s:&:S:S +%%%9;i;}|(:%$fL]RQJGfwV![!EZA8 Gww;CCZCxgCbC_CwCw +000=TcT~B7u8P_>m@CBCFe,74ZfU EEeEa.E\E EfEf +WWW>TMTbX^>Wo=5G\f/I=:D`x`;)=0VKL`Guu)u\ ucu5uLuL +ttt^{H{DJGZtq+*L8!@F+y`yMyzpdn!XB OHHpH5fHGHBHmP mf3U]k1mK^))3)zN)8);)K)K +888AK-K[-CR8(`v .Gy `N]Q,Q[4$8G/==%``4`;5`Y`!`S`S +KKKg616L1+gKdP lQ|[~Pa7f%f8oDq["}fc::o: #:s:S:}.OO vS:S +%%%9;i;}i,~%$fL]RQJGfwV![!EZA8 Gkv;CCZCxgCbC_CwCw +000=TcT~cgp0|>B7u8P_>m@CBCFe,74ZUN EEeEa.E\E EfEf +WWW>TMTbM3U]k1|M^))3)zN)8);)K)K +888AK-K[-^l8(`v .Gy `N]Q,Q[4$8G/QU%``4`;5`Y`S`=VQ!;=;`S +KKKg616L1s+KdP lQ|[~Pa7f%f8oDq["f#c::o: #:s:&:S:S +%%%9;i;}iC{%$fL]RQJGfwV![!EZA8 G!,;CCZCxgCbC_CwCw +000=TcT~cnn0|>B7u8P_>m@CBCFe,74ZC% EEeEa.E\EfEU= f.afEf +WWW>TMTbM&XWo=5G\f/I=:D`x`;)=0VK`\Guu)u\ ucu5uLuL +ttt^{H{DHNHtq+*L8!@F+y`yMyzpdn!X 3U]k1M@^))3)zN)8)K)m:|M@C|)K +888AK-K[-"<8(`v .Gy `N]Q,Q[4$8G/t9%``4`;5`Y`S`=V=QQTT`S +KKKg616L1!!KdP lQ|[~Pa7f%f8oDq["O c::o: #:s:&:S:S +%%%9;i;}i|i%$fL]RQJGfwV![!EZA8 G]_;CCZCxgCbC_CwCw +000=TcT~cB7u8P_>m@CBCFe,74ZNf EEeEa.E\E EfEf +WWW>TMTbMX-Wo=5G\f/I=:D`x`;)=0VKjwGuu)u\ ucu5uLuL +ttt^{H{DHJ^tq+*L8!@F+y`yMyzpdn!X;yOHHpH5fHGH3U]k1N;^))3)zN)8);)K)K +888AK-K[--78(`v .Gy `N]Q,Q[4$8G/5S%``4`;5`Y`!`S`S +KKKg616L11rKdP lQ|[~Pa7f%f8oDq["#}c::o: #:s:&:S:S +%%%9;i;}ii9%$fL]RQJGfwV![!EZA8 Gg!;CCZCxgCbCwCkKkwkXwCw +000=TcT~cci0|>B7u8P_>m@IBfFe,74Z EEeE E\E EfEf +WWW>TMTbMM^Wo=5G\f/I=:D xL;)=0VK5LGuu)u5ucu5uLuL +ttt^{H{DH ltq+*L8!@F+y` MBzpdn!XoWWTWZWdWZW3U]k1;z^))3);)8);)K)K +888AK-K[-7@8(`v .Gy `N]t,S[4$8G/S!%``4`!`Y`!`S`S +KKKg616L1&eKdP lQ|[~Pa7O%S8oDq["SSc::o:&:s:&:S:S +%%%9;i;}ia,%$fL]RQJGfwVv[wEZA8 Gwk;CCZC_CbC_CwCw +000=TcT~c]30|>B7u8P_>m@IBfFe,74ZfC EEeE E\E EfEf +WWW>TMTbM-&Wo=5G\f/I=:D xL;)=0VKL Guu)u5ucu5uLuL +ttt^{H{DH"Jtq+*L8!@F+y` MBzpdn!XB;OHHpH3U]k1mm^))3);)8);)K)K +888AK-K[-A^8(`v .Gy `N]t,S[4$8G/=Q%``4`!`Y`!`S`S +KKKg616L1gsKdP lQ|[~Pa7O%S8oDq["}Oc::o:&:s:&:S:S +%%%9;i;}i9|%$fL]RQJGfwVv[wEZA8 Gk];CCZC_CbC_CwCw +000=TcT~c=c0|>B7u8P_>m@IBfFe,74ZU. EEeE E\E EfEf +WWW>TMTbM>RWo=5G\f/I=:D xL;)=0VKw&Guu)u5ucu5uLuL +ttt^{H{DH^"tq+*L8!@F+y` MBzpdn!Xm:OHHpH5fHGHBHmPy<;~;HB +)))@3M3'M@@)^f?{lqPUfh5-I^1K %b!W< +uuu&) )[ NwuG$Xqvgd=$EkHmRV{Fa&_JHqtt{tG"t/tRtNsR ZlRtR +HHH~p p4 :yHOARoYq+dAbdMXK>3U]k1|B^))3)zN)8)K)m:;KB@m)K +888AK-K[-@-8(`v .Gy `N]t,S[4$8G/Q5%``4`!`Y`!`S`S +KKKg616L1f&KdP lQ|[~Pa7O%S8oDq["fic::o:&:s:&:S:S +%%%9;i;}i~a%$fL]RQJGfwVv[wEZA8 G!X;CCZC_CbC_CwCw +000=TcT~ci=0|>B7u8P_>m@IBfFe,74ZCa EEeE E\E EfEf +WWW>TMTbMccWo=5G\f/I=:D xL;)=0VK 5Guu)u5ucu5uLuL +ttt^{H{DHZGtq+*L8!@F+y` MBzpdn!X BOHHpH3U]k1MC^))3);)8);)K)K +888AK-K[-lA8(`v .Gy `N]t,S[4$8G/t;%``4`!`Y`!`S`S +KKKg616L1efKdP lQ|[~Pa7O%S8oDq["v&c::o:&:s:&:S:S +%%%9;i;}i((%$fL]RQJGfwVv[wEZA8 G]w;CCZC_CbC_CwCw +000=TcT~wgg0|>B7u8P_>m@IBfFe,74ZNU EEeE E\E EfEf +WWW>TMTbRZ3U]k1NK^))3)zN)8)K)m:;z@@C)K +888AK-K[7^C8(`v .Gy `N]t,S[4$8G/5=%``4`;5`Y`S`=VQU;TU`S +KKKg616L&zzKdP lQ|[~Pa7O%S8oDq["#fc::o: #:s:S:}.}&Oi :S +%%%9;i;}:{C%$fL]RQJGfwVv[kEZA8 G__;CCZC_CbC_CwCw +000=TcT~w3<0|>B7u8P_>m@IBUFe,74Z f EEeE E\E EfEf +WWW>TMTbR3U]k1K;^))3);)8);)K)K +888AK-K[7<"8(`v .Gy `N]t,=[4$8G/SS%``4`!`Y`!`S`S +KKKg616L&s1KdP lQ|[~Pa7O%}8oDq["S}c::o:&:s:&:S:S +%%%9;i;}:C:%$fL]RQJGfwVv[kEZA8 Gw!;CCZC_CbC_CwCw +000=TcT~wn]0|>B7u8P_>m@IBUFe,74ZfI EEeE E\E EfEf +WWW>TMTbR&>Wo=5G\f/I=:D xw;)=0VKLjGuu)u5ucu5uLuL +ttt^{H{D NZtq+*L8!@F+y` Mmzpdn!XBfOHHpH3U]k1m|^))3);)8);)K)K +888AK-K[7"R8(`v .Gy `N]t,=[4$8G/=t%``4`;5`Y`S`=V!!UT=`S +KKKg616L&!gKdP lQ|[~Pa7O%}8oDq["}vc::o: #:s:S:}.&i&Oi:S +%%%9;i;}:|~%$fL]RQJGfwVv[kEZA8 Gkg;CCZCxgCbCwCkKw!!X,Cw +000=TcT~wB7u8P_>m@IBUFe,74ZUd EEeEa.E\EfEU= a.Ef +WWW>TMTbRMZWo=5G\f/I=:D xw;)=0VKwNGuu)u\ ucuLuwQLN j&uL +ttt^{H{D HRtq+*L8!@F+y` Mmzpdn!Xm5OHHpH5fHGHBHmPB :;HB +)))@3M3'BMm)^f?{lqPUfh5-I<1K %b!"C(88K8lR8s8^83U]k1|N^))3);)8);)K)K +888AK-K[7-l8(`v .Gy `N]t,=[4$8G/QT%``4`!`Y`!`S`S +KKKg616L&&+KdP lQ|[~Pa7O%}8oDq["fuc::o:&:s:&:S:S +%%%9;i;}::{%$fL]RQJGfwVv[kEZA8 G!x;CCZC_CbC_CwCw +000=TcT~wwn0|>B7u8P_>m@IBUFe,74ZI EEeE E\E EfEf +WWW>TMTbRRXWo=5G\f/I=:D xw;)=0VK LGuu)u5ucu5uLuL +ttt^{H{D Htq+*L8!@F+y` Mmzpdn!X mOHHpHoWWTWZWdWZW3U]k1Mz^))3);)8);)K)K +888AK-K[7R<8(`v .Gy `N]t,=[4$8G/U!%``4`!`Y`!`S`S +KKKg616L&r!KdP lQ|[~Pa7O%}8oDq["vSc::o:&:s:&:S:S +%%%9;i;}:ai%$fL]RQJGfwVv[kEZA8 G]k;CCZC_CbC_CwCw +000=TcT~w]w0|>B7u8P_>m@IBUFe,74ZNC EEeE E\E EfEf +WWW>TMTbR--Wo=5G\f/I=:D xw;)=0VKj Guu)u5ucu5uLuL +ttt^{H{D "^tq+*L8!@F+y` Mmzpdn!X;;OHHpH3U]k1Nm^))3)zN)8)K)m:mzmMN)K +888AK-K[7A78(`v .Gy `N]t,=[4$8G/5Q%``4`;5`Y`S`=V=t;Qt`S +KKKg616L&grKdP lQ|[~Pa7O%f8oDq["&&c::o: #:s:&:S:S +%%%9;i;}:99%$fL]RQJGfwVv[!EZA8 G_w;CCZCxgCbC_CwCw +000=TcT~w=i0|>B7u8P_>m@IBCFe,74Z U EEeEa.E\E EfEf +WWW>TMTbR>^Wo=5G\f/I=:D x`;)=0VK5`Guu)u\ ucuLuwQL5\ NuL +ttt^{H{D Zltq+*L8!@F+y` Myzpdn!X< OHHpH3U]k1KK^))3);)8);)K)K +888AK-K[7@@8(`v .Gy `N]t,Q[4$8G/S=%``4`!`Y`!`S`S +KKKg616L&feKdP lQ|[~Pa7O%f8oDq["Sfc::o:&:s:&:S:S +%%%9;i;}:(,%$fL]RQJGfwVv[!EZA8 Gwv;CCZC_CbC_CwCw +000=TcT~wp30|>B7u8P_>m@IBCFe,74ZfN EEeE E\E EfEf +WWW>TMTbR^&Wo=5G\f/I=:D x`;)=0VKL Guu)u5ucu5uLuL +ttt^{H{D GJtq+*L8!@F+y` Myzpdn!XB~OHHpH3U]k1mM^))3)zN)8);)K)K +888AK-K[RC^8(`v .Gy `N]t,Q[4$8G/=U%``4`;5`Y`!`S`S +KKKg616Lr+sKdP lQ|[~Pa7O%f8oDq["}#c::o: #:s:S:}.OfOO :S +%%%9;i;}a,|%$fL]RQJGfwVv[!EZA8 Gk,;CCZCxgCbC_CwCw +000=TcT~]gc0|>B7u8P_>m@IBCFe,74ZU% EEeE E\E EfEf +WWW>TMTb-ZRWo=5G\f/I=:D x`;)=0VKw\Guu)u5ucu5uLuL +ttt^{H{D"l"tq+*L8!@F+y` Myzpdn!Xy3U]k1|@^))3);)8);)K)K +888AK-K[R^-8(`v .Gy `N]t,Q[4$8G/Q9%``4`!`Y`!`S`S +KKKg616Lrz&KdP lQ|[~Pa7O%f8oDq["f c::o:&:s:&:S:S +%%%9;i;}a{a%$fL]RQJGfwVv[!EZA8 Gv_;CCZCxgCbC_CwCw +000=TcT~]3=0|>B7u8P_>m@IBCFe,74ZIf EEeEa.E\E EfEf +WWW>TMTb-3U]k1B;^))3);)8);)K)K +888AK-K[RB7u8P_>m@IBCFe,74ZNI EEeE E\E EfEf +WWW>TMTb-X3U]k1N|^))3)zN)8)K)m:||mNM)K +888AK-K[R-C8(`v .Gy `N]U,S[4$8G/!!%``4`!`Y`!`S`S +KKKg616Lr1zKdP lQ|[~Pa7v%S8oDq["&Sc::o:&:s:&:S:S +%%%9;i;}aiC%$fL]RQJGfwV][wEZA8 G_k;CCZC_CbC_CwCw +000=TcT~]c<0|>B7u8P_>m@NBfFe,74Z C EEeE E\E EfEf +WWW>TMTb-MMWo=5G\f/I=:DjxL;)=0VK5 Guu)u5ucu5uLuL +ttt^{H{D"H tq+*L8!@F+y`;MBzpdn!X<;OHHpH3U]k1Km^))3);)8);)K)K +888AK-K[R7"8(`v .Gy `N]U,S[4$8G/SQ%``4`!`Y`!`S`S +KKKg616Lr&1KdP lQ|[~Pa7v%S8oDq["SOc::o:&:s:&:S:S +%%%9;i;}a::%$fL]RQJGfwV][wEZA8 Gw];CCZC_CbC_CwCw +000=TcT~]w]0|>B7u8P_>m@NBfFe,74Zf. EEeE E\E EfEf +WWW>TMTb-R>Wo=5G\f/I=:DjxL;)=0VKL&Guu)u5ucu5uLuL +ttt^{H{D" Ztq+*L8!@F+y`;MBzpdn!XB:OHHpH3U]k1mB^))3);)8);)K)K +888AK-K[RRR8(`v .Gy `N]U,S[4$8G/=5%``4`!`Y`!`S`S +KKKg616LrrgKdP lQ|[~Pa7v%S8oDq["}ic::o:&:s:&:S:S +%%%9;i;}aa~%$fL]RQJGfwV][wEZA8 GkX;CCZC_CbC_CwCw +000=TcT~]]p0|>B7u8P_>m@NBfFe,74ZUa EEeE E\E EfEf +WWW>TMTb->ZWo=5G\f/I=:DjxL;)=0VK`5Guu)u5ucu5uLuL +ttt^{H{D"^Rtq+*L8!@F+y`;MBzpdn!XyBOHHpH3U]k1|C^))3);)8);)K)K +888AK-K[RAl8(`v .Gy `N]U,S[4$8G/Q;%``4`!`Y`!`S`S +KKKg616Lrf+KdP lQ|[~Pa7v%S8oDq["O&c::o:&:s:&:S:S +%%%9;i;}a~{%$fL]RQJGfwV][wEZA8 Gvw;CCZC_CbC_CwCw +000=TcT~]in0|>B7u8P_>m@NBfFe,74ZIU EEeE E\E EfEf +WWW>TMTb-cXWo=5G\f/I=:DjxL;)=0VK `Guu)u5ucu5uLuL +ttt^{H{D"ZHtq+*L8!@F+y`;MBzpdn!X OHHpH3U]k1BK^))3);)8);)K)K +888AK-K[Rl<8(`v .Gy `N]U,S[4$8G/U=%``4`!`Y`!`S`S +KKKg616Lre!KdP lQ|[~Pa7v%S8oDq["vfc::o:&:s:&:S:S +%%%9;i;}a(i%$fL]RQJGfwV][wEZA8 G]v;CCZC_CbC_CwCw +000=TcT~]pw0|>B7u8P_>m@NBfFe,74ZNN EEeE E\E EfEf +WWW>TMTb-^-Wo=5G\f/I=:DjxL;)=0VKj Guu)u5ucu5uLuL +ttt^{H{D"G^tq+*L8!@F+y`;MBzpdn!X;~OHHpH3U]k1;;^))3);)8);)K)K +888AK-K[AC78(`v .Gy `N]U,=[4$8G/!S%``4`!`Y`!`S`S +KKKg616Lg+rKdP lQ|[~Pa7v%}8oDq["&}c::o:&:s:&:S:S +%%%9;i;}9,9%$fL]RQJGfwV][kEZA8 G_!;CCZC_CbC_CwCw +000=TcT~=gi0|>B7u8P_>m@NBUFe,74Z I EEeE E\E EfEf +WWW>TMTb>Z^Wo=5G\f/I=:Djxw;)=0VK5jGuu)u5ucu5uLuL +ttt^{H{D^Rltq+*L8!@F+y`;Mmzpdn!X3U]k1K|^))3);)8);)K)K +888AK-K[A^@8(`v .Gy `N]U,=[4$8G/St%``4`!`Y`!`S`S +KKKg616LgzeKdP lQ|[~Pa7v%}8oDq["Svc::o:&:s:&:S:S +%%%9;i;}9C,%$fL]RQJGfwV][kEZA8 Gwg;CCZC_CbC_CwCw +000=TcT~=n30|>B7u8P_>m@NBUFe,74Zfd EEeE E\E EfEf +WWW>TMTb>&&Wo=5G\f/I=:Djxw;)=0VKLNGuu)u5ucu5uLuL +ttt^{H{D^NJtq+*L8!@F+y`;Mmzpdn!XB5OHHpH3U]k1mN^))3);)8);)K)K +888AK-K[A"^8(`v .Gy `N]U,=[4$8G/=T%``4`!`Y`!`S`S +KKKg616Lg!sKdP lQ|[~Pa7v%}8oDq["}uc::o:&:s:&:S:S +%%%9;i;}9||%$fL]RQJGfwV][kEZA8 Gkx;CCZC_CbC_CwCw +000=TcT~=B7u8P_>m@NBUFe,74ZC EEeE E\E EfEf +WWW>TMTb>XRWo=5G\f/I=:Djxw;)=0VK`LGuu)u5ucu5uLuL +ttt^{H{D^J"tq+*L8!@F+y`;Mmzpdn!XymOHHpHoWWTWZWdWZW3U]k1|z^))3);)8);)K)K +888AK-K[A--8(`v .Gy `N]U,=[4$8G/t!%``4`!`Y`!`S`S +KKKg616Lg1&KdP lQ|[~Pa7v%}8oDq["OSc::o:&:s:&:S:S +%%%9;i;}9ia%$fL]RQJGfwV][kEZA8 Gvk;CCZC_CbC_CwCw +000=TcT~=c=0|>B7u8P_>m@NBUFe,74ZIC EEeE E\E EfEf +WWW>TMTb>McWo=5G\f/I=:Djxw;)=0VK Guu)u5ucu5uLuL +ttt^{H{D^HGtq+*L8!@F+y`;Mmzpdn!X ;OHHpH3U]k1Bm^))3);)8);)K)K +888AK-K[A7A8(`v .Gy `N]U,=[4$8G/UQ%``4`!`Y`!`S`S +KKKg616Lg&fKdP lQ|[~Pa7v%}8oDq["vOc::o:&:s:&:S:S +%%%9;i;}9:(%$fL]RQJGfwV][kEZA8 G]];CCZC_CbC_CwCw +000=TcT~=]g0|>B7u8P_>m@NBUFe,74ZN. EEeE E\E EfEf +WWW>TMTb>-3U]k1;K^))3);)8);)K)K +888AK-K[AAC8(`v .Gy `N]U,Q[4$8G/!=%``4`!`Y`!`S`S +KKKg616LggzKdP lQ|[~Pa7v%f8oDq["&fc::o:&:s:&:S:S +%%%9;i;}99C%$fL]RQJGfwV][!EZA8 G_v;CCZC_CbC_CwCw +000=TcT~==<0|>B7u8P_>m@NBCFe,74Z N EEeE E\E EfEf +WWW>TMTb>>MWo=5G\f/I=:Djx`;)=0VK5 Guu)u5ucu5uLuL +ttt^{H{D^^ tq+*L8!@F+y`;Myzpdn!X<~OHHpH3U]k1KM^))3);)8);)K)K +888AK-K[A@"8(`v .Gy `N]U,Q[4$8G/SU%``4`!`Y`!`S`S +KKKg616Lgf1KdP lQ|[~Pa7v%f8oDq["S#c::o:&:s:&:S:S +%%%9;i;}9~:%$fL]RQJGfwV][!EZA8 Gw,;CCZC_CbC_CwCw +000=TcT~=i]0|>B7u8P_>m@NBCFe,74Zf% EEeE E\E EfEf +WWW>TMTb>c>Wo=5G\f/I=:Djx`;)=0VKL\Guu)u5ucu5uLuL +ttt^{H{D^ZZtq+*L8!@F+y`;Myzpdn!Xm3U]k1m@^))3);)8);)K)K +888AK-K[AlR8(`v .Gy `N]U,Q[4$8G/=9%``4`!`Y`!`S`S +KKKg616LgegKdP lQ|[~Pa7v%f8oDq["} c::o:&:s:&:S:S +%%%9;i;}9(~%$fL]RQJGfwV][!EZA8 G!_;CCZC_CbC_CwCw +000=TcT~=pp0|>B7u8P_>m@NBCFe,74ZCf EEeE E\E EfEf +WWW>TMTbcZZWo=5G\f/I=:Djx`;)=0VK`wGuu)u5ucu5uLuL +ttt^{H{DZlRtq+*L8!@F+y`;Myzpdn!XyyOHHpHc>-W< +uuu&) )[N5&uG$Xqvgd=$Ek mJV{Fa&_JGqtt{tG"t/tRtNsHllHGtR +HHH~p p4:<:HOARoYq+dAbdBX|>3U]k1M;^))3);)8);)K)K +888AK-K[@Cl8(`v .Gy `N]U,Q[4$8G/tS%``4`!`Y`!`S`S +KKKg616Lfz+KdP lQ|[~Pa7v%f8oDq["O}c::o:&:s:&:S:S +%%%9;i;}~{{%$fL]RQJGfwV][!EZA8 Gv!;CCZC_CbC_CwCw +000=TcT~i3n0|>B7u8P_>m@NBCFe,74ZII EEeE E\E EfEf +WWW>TMTbc3U]k1B|^))3);)8);)K)K +888AK-K[@<<8(`v .Gy `N]U,Q[4$8G/Ut%``4`!`Y`!`S`S +KKKg616Lfs!KdP lQ|[~Pa7v%f8oDq["vvc::o:&:s:&:S:S +%%%9;i;}~Ci%$fL]RQJGfwV][!EZA8 G]g;CCZC_CbC_CwCw +000=TcT~inw0|>B7u8P_>m@NBCFe,74ZNd EEeE E\E EfEf +WWW>TMTbc&-Wo=5G\f/I=:Djx`;)=0VKjNGuu)u5ucu5uLuL +ttt^{H{DZN^tq+*L8!@F+y`;Myzpdn!X;5OHHpH3U]k1;m^))3);)8);)K)K +888AK-K[@"78(`v .Gy `N]5,S[4$8G/!Q%``4`!`Y`!`S`S +KKKg616Lf!rKdP lQ|[~Pa7#%S8oDq["&Oc::o:&:s:&:S:S +%%%9;i;}~|9%$fL]RQJGfwVg[wEZA8 G_];CCZC_CbC_CwCw +000=TcT~iB7u8P_>m@.BfFe,74Z . EEeE E\E EfEf +WWW>TMTbcX^Wo=5G\f/I=:D xL;)=0VK5&Guu)u5ucu5uLuL +ttt^{H{DZHltq+*L8!@F+y`fMBzpdn!X<:OHHpH3U]k1KB^))3);)8);)K)K +888AK-K[@-@8(`v .Gy `N]5,S[4$8G/S5%``4`!`Y`!`S`S +KKKg616Lf1eKdP lQ|[~Pa7#%S8oDq["Sic::o:&:s:&:S:S +%%%9;i;}~:,%$fL]RQJGfwVg[wEZA8 GwX;CCZC_CbC_CwCw +000=TcT~iw30|>B7u8P_>m@.BfFe,74Zfa EEeE E\E EfEf +WWW>TMTbcR&Wo=5G\f/I=:D xL;)=0VKw5Guu)u5ucu5uLuL +ttt^{H{DZ Jtq+*L8!@F+y`fMBzpdn!XmBOHHpH3U]k1mC^))3);)8);)K)K +888AK-K[@R^8(`v .Gy `N]5,S[4$8G/=;%``4`!`Y`!`S`S +KKKg616LfrsKdP lQ|[~Pa7#%S8oDq["f&c::o:&:s:&:S:S +%%%9;i;}~a|%$fL]RQJGfwVg[wEZA8 G!w;CCZC_CbC_CwCw +000=TcT~i]c0|>B7u8P_>m@.BfFe,74ZCU EEeE E\E EfEf +WWW>TMTbc-RWo=5G\f/I=:D xL;)=0VK``Guu)u5ucu5uLuL +ttt^{H{DZ""tq+*L8!@F+y`fMBzpdn!Xy OHHpH3U]k1MK^))3);)8);)K)K +888AK-K[@A-8(`v .Gy `N]5,S[4$8G/t=%``4`!`Y`!`S`S +KKKg616Lfg&KdP lQ|[~Pa7#%S8oDq["Ofc::o:&:s:&:S:S +%%%9;i;}~9a%$fL]RQJGfwVg[wEZA8 Gvv;CCZC_CbC_CwCw +000=TcT~i==0|>B7u8P_>m@.BfFe,74ZIN EEeE E\E EfEf +WWW>TMTbc>cWo=5G\f/I=:D xL;)=0VK Guu)u5ucu5uLuL +ttt^{H{DZ^Gtq+*L8!@F+y`fMBzpdn!X ~OHHpH3U]k1BM^))3);)8);)K)K +888AK-K[@@A8(`v .Gy `N]5,S[4$8G/UU%``4`!`Y`!`S`S +KKKg616LfffKdP lQ|[~Pa7#%S8oDq["v#c::o:&:s:&:S:S +%%%9;i;}~~(%$fL]RQJGfwVg[wEZA8 G],;CCZC_CbC_CwCw +000=TcT~ipg0|>B7u8P_>m@.BfFe,74ZN% EEeE E\E EfEf +WWW>TMTbc^3U]k1;|^))3);)8);)K)K +888AK-K[lCC8(`v .Gy `N]5,=[4$8G/!t%``4`!`Y`!`S`S +KKKg616Le+zKdP lQ|[~Pa7#%}8oDq["&vc::o:&:s:&:S:S +%%%9;i;}(,C%$fL]RQJGfwVg[kEZA8 G_g;CCZC_CbC_CwCw +000=TcT~pg<0|>B7u8P_>m@.BUFe,74Z d EEeE E\E EfEf +WWW>TMTb^ZMWo=5G\f/I=:D xw;)=0VK5NGuu)u5ucu5uLuL +ttt^{H{DGl tq+*L8!@F+y`fMmzpdn!X<5OHHpH3U]k1KN^))3);)8);)K)K +888AK-K[l^"8(`v .Gy `N]5,=[4$8G/ST%``4`!`Y`!`S`S +KKKg616Lez1KdP lQ|[~Pa7#%}8oDq["Suc::o:&:s:&:S:S +%%%9;i;}({:%$fL]RQJGfwVg[kEZA8 Gwx;CCZC_CbC_CwCw +000=TcT~p3]0|>B7u8P_>m@.BUFe,74ZU EEeE E\E EfEf +WWW>TMTb^<>Wo=5G\f/I=:D xw;)=0VKwLGuu)u5ucu5uLuL +ttt^{H{DGRZtq+*L8!@F+y`fMmzpdn!XmmOHHpHoWWTWZWdWZW3U]k1mz^))3);)8);)K)K +888AK-K[lB7u8P_>m@.BUFe,74ZCC EEeE E\E EfEf +WWW>TMTb^XZWo=5G\f/I=:D xw;)=0VK` Guu)u5ucu5uLuL +ttt^{H{DGJRtq+*L8!@F+y`fMmzpdn!Xy;OHHpH3U]k1Mm^))3);)8);)K)K +888AK-K[l"l8(`v .Gy `N]5,=[4$8G/tQ%``4`!`Y`!`S`S +KKKg616Le1+KdP lQ|[~Pa7#%}8oDq["OOc::o:&:s:&:S:S +%%%9;i;}(i{%$fL]RQJGfwVg[kEZA8 Gv];CCZC_CbC_CwCw +000=TcT~pcn0|>B7u8P_>m@.BUFe,74ZI. EEeE E\E EfEf +WWW>TMTb^MXWo=5G\f/I=:D xw;)=0VK &Guu)u5ucu5uLuL +ttt^{H{DGHHtq+*L8!@F+y`fMmzpdn!X :OHHpH3U]k1BB^))3);)8);)K)K +888AK-K[l7<8(`v .Gy `N]5,=[4$8G/U5%``4`!`Y`!`S`S +KKKg616Le&!KdP lQ|[~Pa7#%}8oDq["vic::o:&:s:&:S:S +%%%9;i;}(:i%$fL]RQJGfwVg[kEZA8 G]X;CCZC_CbC_CwCw +000=TcT~pww0|>B7u8P_>m@.BUFe,74ZNa EEeE E\E EfEf +WWW>TMTb^R-Wo=5G\f/I=:D xw;)=0VK 5Guu)u5ucu5uLuL +ttt^{H{DG ^tq+*L8!@F+y`fMmzpdn!XfBOHHpH3U]k1;M^))3);)8);)K)K +888AK-K[lR78(`v .Gy `N]5,Q[4$8G/!U%``4`!`Y`!`S`S +KKKg616LerrKdP lQ|[~Pa7#%f8oDq["&#c::o:&:s:&:S:S +%%%9;i;}(a9%$fL]RQJGfwVg[!EZA8 G_,;CCZC_CbC_CwCw +000=TcT~p]i0|>B7u8P_>m@.BCFe,74Z % EEeE E\E EfEf +WWW>TMTb^-^Wo=5G\f/I=:D x`;)=0VK5\Guu)u5ucu5uLuL +ttt^{H{DG^ltq+*L8!@F+y`fMyzpdn!XB3U]k1K@^))3);)8);)K)K +888AK-K[lA@8(`v .Gy `N]5,Q[4$8G/S9%``4`!`Y`!`S`S +KKKg616LegeKdP lQ|[~Pa7#%f8oDq["S c::o:&:s:&:S:S +%%%9;i;}(~,%$fL]RQJGfwVg[!EZA8 Gk_;CCZC_CbC_CwCw +000=TcT~pi30|>B7u8P_>m@.BCFe,74ZUf EEeE E\E EfEf +WWW>TMTb^c&Wo=5G\f/I=:D x`;)=0VKwwGuu)u5ucu5uLuL +ttt^{H{DGZJtq+*L8!@F+y`fMyzpdn!XmyOHHpH3U]k1|;^))3);)8);)K)K +888AK-K[ll^8(`v .Gy `N]5,Q[4$8G/QS%``4`!`Y`!`S`S +KKKg616LeesKdP lQ|[~Pa7#%f8oDq["f}c::o:&:s:&:S:S +%%%9;i;}((|%$fL]RQJGfwVg[!EZA8 G!!;CCZC_CbC_CwCw +000=TcT~ppc0|>B7u8P_>m@.BCFe,74ZCI EEeE E\E EfEf +WWW>TMTb^^RWo=5G\f/I=:D x`;)=0VK`jGuu)u5ucu5uLuL +ttt^{H{DGG"tq+*L8!@F+y`fMyzpdn!XyfOHHpH3U]k1M|^))3);)8);)K)K +888AK-K[^CC-8(`v .Gy `N]5,Q[4$8G/tt%``4`!`Y`!`S`S +KKKg616Lz++&KdP lQ|[~Pa7#%f8oDq["Ovc::o:&:s:&:S:S +%%%9;i;}{,,a%$fL]RQJGfwVg[!EZA8 Gvg;CCZC_CbC_CwCw +000=TcT~3gg=0|>B7u8P_>m@.BCFe,74ZId EEeE E\E EfEf +WWW>TMTb3U]k1BN^))3);)8);)K)K +888AK-K[^C^A8(`v .Gy `N]5,Q[4$8G/UT%``4`!`Y`!`S`S +KKKg616Lz+zfKdP lQ|[~Pa7#%f8oDq["vuc::o:&:s:&:S:S +%%%9;i;}{,{(%$fL]RQJGfwVg[!EZA8 G]x;CCZC_CbC_CwCw +000=TcT~3gng0|>B7u8P_>m@.BCFe,74Z. EEeE E\E EfEf +WWW>TMTb3t2&-]k1;K^))3)NM)8);)K)K +888AKAK[R8(`v .Gy `N]S,Q[4fx|W8G/!=%``4`5t`Y`!`S`S +KKKg6g6LgKdP lQ|[~Pa7S%f8oMpCVq["&fc::o:#O:s:&:S:S +%%%9;9;}~%$fL]RQJGfwVk[kEZ{ad48 G__;CCZCgvCbC_CwCw +000=T=T~p0|>B7u8P_>m@UBUFewjk374Z f EEeE.IE\E EfEf +WWW>T>Tb3t2&-]k1;m^))3)NM)8);)K)K +888AKAK[^l8(`v .Gy `N]Q,S[4fx|W8G/!Q%``4`5t`Y`!`S`S +KKKg6g6Ls+KdP lQ|[~Pa7f%}8oMpCVq["&&c::o:#O:s:&:S:S +%%%9;9;}C{%$fL]RQJGfwV![kEZ{ad48 G_w;CCZCgvCbC_CwCw +000=T=T~nn0|>B7u8P_>m@CBUFewjk374Z U EEeE.IE\E EfEf +WWW>T>Tb&XWo=5G\f/I=:D`xw;)3t2&-]k1;|^))3)NM)8);)K)K +888AKAK["<8(`v .Gy `N]t,=[4fx|W8G/!!%``4`5t`Y`!`S`S +KKKg6g6L!!KdP lQ|[~Pa7O%}8oMpCVq["&Sc::o:#O:s:&:S:S +%%%9;9;}|i%$fL]RQJGfwVv[kEZ{ad48 G_k;CCZCgvCbC_CwCw +000=T=T~B7u8P_>m@IBUFewjk374Z C EEeE.IE\E EfEf +WWW>T>TbX-Wo=5G\f/I=:D x`;)3t2&-]k1;;^))3)NM)8);)K)K +888AKAK[-78(`v .Gy `N]U,=[4fx|W8G/!S%``4`5t`Y`!`S`S +KKKg6g6L1rKdP lQ|[~Pa7v%}8oMpCVq["&}c::o:#O:s:&:S:S +%%%9;9;}i9%$fL]RQJGfwV][kEZ{ad48 G_!;CCZCgvCbC_CwCw +000=T=T~ci0|>B7u8P_>m@NBCFewjk374Z EEeE.IE\E EfEf +WWW>T>TbM^Wo=5G\f/I=:Djx`;)3t2&-]k1;K^))3)NM)8);)K)K +888AKAK[7@8(`v .Gy `N]5,=[4fx|W8G/!=%``4`5t`Y`!`S`S +KKKg6g6L&eKdP lQ|[~Pa7#%}8oMpCVq["&fc::o:#O:s:&:S:S +%%%9;9;}a,%$fL]RQJGfwVg[!EZ{ad48 G__;CCZCgvCbC_CwCw +000=T=T~]30|>B7u8P_>m@.BCFewjk374Z f EEeE.IE\E EfEf +WWW>T>Tb-&Wo=5G\f/I=:D x`;)TcTbXWo=5G\f/I=:DLxw;)O*BOa&_lJqtt{tRGNt/tltRtR +HHH~p:p4 HOARoYq+dAbdKX|>3"=wf%b!CC(88K8^l<8s8C8^8^ +```T494RU`%s*(2g\$se)zH!p6_`*rq["&Sc::o:S }:s:&:S:S +%%%9;~;}a%$fL]RQJGfwVw[!EZ:/XR.hogn|00T03pn060g0303 +EEEde%e^dE 6&?P*r,6[6B7u8P_>m@UBUFe(oK4P+LZXoWWTW<^&WdWZWTcTb<-Wo=5G\f/I=:D`xL;)O*BOa&_llqtt{tRGNt/tRtNsJN"^GtR +HHH~p:p4B~HOARoYq+dAbd|XK>3"=wf%b!C^(88K8^l<8s8C8^8^ +```T494RS9`%s*(2g\$se)!Hzp6_`*rq["&}c::o:S }:s:&:S:S +%%%9;~;}{(%$fL]RQJGfwV![wEZ:/XR.hog<|00T03pn060g0303 +EEEde%e^U E 6&?P*r,6[6XD&;Tlyb+0VK55Guu)uL\wucuLuwQwN`LuL +ttt^{Z{DNRtq+*L8!@F+y`yMmzpKg D]k1;K^))3)Kzm)8)K)m:KmK||)K +888AK@K[<<8(`v .Gy `N]Q,=[4I:9^2nY+sdKK6KzesKuK+KzKz +:::iouoY}f:cA~b!^aDA\.|*C^;"rST8 G_!;CCZCwxkCbC_CwCw +000=TiT~nc0|>B7u8P_>m@CBCFe(oK4P+LZZoWWTW<^&WdWTcTb&^Wo=5G\f/I=:D xL;)O*BOa&_lRqtt{tRGNt/tltRtR +HHH~p:p4y3"=wf%b!C<(88K8^l<8s8C8^8^ +```T494RQS`%s*(2g\$se)1Hzp6_`*rq["&fc::o:S }:s:&:S:S +%%%9;~;}|C%$fL]RQJGfwVv[kEZ:/XR.hogg|00T03pn060g0303 +EEEde%e^CCE 6&?P*r,6[6MD&;Tlyb+0VK5LGuu)uL\wucu5uLuL +ttt^{Z{DJHtq+*L8!@F+y` MmzpKg D]k1;m^))3)Kzm)8);)K)K +888AK@K["78(`v .Gy `N]t,=[4I:9^2nY+!dKK6KzesKuK+KzKz +:::iouoYf#:cA~b!^aDA\.i*|^;"rST8 G__;CCZCwxkCbCwCkK_w]_]Cw +000=TiT~<=0|>B7u8P_>m@IBCFe(oK4P+LZTcTbM&Wo=5G\f/I=:DjxL;)O*BOa&_lNqtt{tRGNt/tltRtR +HHH~p:p4 yHOARoYq+dAbdBXK>3"=wf%b!C"(88K8^l<8s8C8^8^ +```T494Rtt`%s*(2g\$se)&Hsp6_`*rq["&&c::o:S }:s:S:}.OO#fu:S +%%%9;~;}i:%$fL]RQJGfwV][kEZ:/XR.hog3|00T03pn060g0303 +EEEde%e^I.E 6&?P*r,6[6RD&;Tlyb+0VK5wGuu)uL\wucu5uLuL +ttt^{Z{DH^tq+*L8!@F+y`;MmzpKg D]k1;|^))3)Kzm)8);)K)K +888AK@K[-@8(`v .Gy `N]U,Q[4I:9^2nY++dKK6KzesKuKzKsS!fzegKz +:::iouoYO :cA~b!^aDA\.:*|^;"rST8 G_w;CCZCwxkCbC_CwCw +000=TiT~wg0|>B7u8P_>m@NBCFe(oK4P+LZ&oWWTW<^&WdWZWTcTbRRWo=5G\f/I=:D xL;)O*BOa&_lJqtt{tRGNt/tltRtR +HHH~p:p4;fHOARoYq+dAbdNXm>3"=wf%b!CC(88K8^l<8s8C8^8^ +```T494RUT`%s*(2g\$se)rHsp6_`*rq["&Sc::o:S }:s:&:S:S +%%%9;~;}:~%$fL]RQJGfwVg[kEZ:/XR.hogn|00T03pn060g0303 +EEEde%e^NaE 6&?P*r,6[6-D&;Tlyb+0VK5`Guu)uL\wucu5uLuL +ttt^{Z{D"ltq+*L8!@F+y`fMyzpKg D]k1;;^))3)Kzm)8);)K)K +888AK@K[R^8(`v .Gy `N]5,Q[4I:9^2nY+zdKK6KzesKuK+KzKz +:::iouoY#}:cA~b!^aDA\.a*|^;"rST8 G_k;CCZCwxkCbC_CwCw +000=TiT~]<0|>B7u8P_>m@.BCFe(oK4P+LZXoWWTW<^&WdWZWT^TbXWo=5G\f/I=:DLx`;)dvJ*9C?yTn!X3Pl-=V_jNp8G/!S%``4`;5`Y`!`S`S +KKKg6e6LfKdP lQ|[~Pa7f%S8oa!V| /Bwp8 G__;CCZCxgCbC_CwCw +000=TpT~p0|>B7u8P_>m@CBfFerP3o{Y!:70VK5LGuu)u\ ucu5uLuL +ttt^{G{DRltq+*L8!@F+y`yMmzp+Y#gt-Rh0%b!CC(88K8lR8s8C8^8^ +```T4;4RSS`%s*(2g\$se)!Hsp6[QV`MV2\K7c-,{$%%;%(a%x%,%{%{ +CCC,ZxZ~wkC;|2rf&?A|P#<}<:TPuzNw3J[HP+LZZoWWTW^-WdWT^Tb<-Wo=5G\f/I=:D xw;)dvJ*9C?yTn!X<3Pl-=V_jNp8G/!!%``4`;5`Y`!`S`S +KKKg6e6LszKdP lQ|[~Pa7v%S8oa!V| /Bwp8 G_w;CCZCxgCbC_CwCw +000=TpT~nn0|>B7u8P_>m@NBUFerP3o{Y!:70VK55Guu)u\ ucu5uLuL +ttt^{G{DNJtq+*L8!@F+y`;Mmzp+Y#gt-Rh0%b!C^(88K8lR8s8C8^8^ +```T4;4R=t`%s*(2g\$se)&H!p6[QV`MV2\K7c-,,$%%;%(a%x%,%{%{ +CCC,ZxZ~k]C;|2rf&?A|P#w}<:TPuzNw3J[HP+LZT^Tb&^Wo=5G\f/I=:D xw;)dvJ*9C?yTn!XB7u8P_>m@UBUFerP3o{Y!P+LZZoWWTW^-WdWZWT3Pl-=V_j%b!CC(88K8lR8s8^8B7u8P_>m@IBUFerP3o{Y!P+LZT3Pl-=V_j%b!C^(88K8lR8s8C8^8^ +```T4S!4R=t`%s*(2g\$se)&H!p6[QV`MV2q["&&c::o: #:s:S:}.&}}O#:S +%%%9;{,;}C:%$fL]RQJGfwV][!EZ?f4/*zv.hog3|00T0p]060g0303 +EEEdef e^U.E 6&?P*r,6[6-D<;T/\YyB7u8P_>m@.BCFerP3o{Y!P+LZZoWWTW^-WdWZWT<3Pl-=rH0G%b!CC(88K8lR8s8C8^8^ +```T4SS4RU`%s*(2g\$se)sHsp6[QV`g0`^q["&Sc::o: #:s:&:S:S +%%%9;{{;}a%$fL]RQJGfwVk[!EZ?f4/1kd8.hogg|00T0p]060g0303 +EEEdeffe^dE 6&?P*r,6[6&DX;T/\YyO-7g0VK5LGuu)u\ ucu5uLuL +ttt^{RR{DZtq+*L8!@F+y`yMBzp+Y#g"w0q]k1;;^))3)zN)8);)K)K +888AK^^K[l8(`v .Gy `N]Q,S[4\2W:_8{|2nY+zdKK6KerKuK+KzKz +:::ioSSoYS&:cA~b!^aDA\.|*C^;JR/r:Mp&8 G__;CCZCxgCbC_CwCw +000=T33T~330|>B7u8P_>m@CBUFerP3ol*HfP+LZT<3Pl-=rH0G%b!C^(88K8lR8s8C8^8^ +```T4SS4RS9`%s*(2g\$se)1H!p6[QV`g0`^q["&&c::o: #:s:&:S:S +%%%9;{{;}{(%$fL]RQJGfwVv[!EZ?f4/1kd8.hog3|00T0p]060g0303 +EEEdeffe^U E 6&?P*r,6[6RD<;T/\YyO-7g0VK55Guu)u\ ucu5uLuL +ttt^{RR{DNRtq+*L8!@F+y`;MBzp+Y#g"w0q]k1;K^))3)zN)8);)K)K +888AK^^K[<<8(`v .Gy `N]U,=[4\2W:_8{|2nY++dKK6KerKuK+KzKz +:::ioSSoY}f:cA~b!^aDA\.:*C^;JR/r:Mp&8 G_w;CCZCxgCbC_CwCw +000=T33T~nc0|>B7u8P_>m@NBCFerP3ol*HfP+LZZoWWTW^-WdWZWT<3Pl-=rH0G%b!CC(88K8lR8s8C8^8^ +```T4SS4RQS`%s*(2g\$se)rH!p6[QV`g0`^q["&Sc::o: #:s:&:S:S +%%%9;{C;},%$fL]RQJGfwVw[kEZ?f4/[(kd8.hogg|00T0p]060g0303 +EEEdefUe^fE 6&?P*r,6[6B7u8P_>m@UBUFerP3oN7*HfP+LZT<&Tb3Pl-=FcH0G%b!C^(88K8lR8s8C8^8^ +```T4S=4RS=`%s*(2g\$se)!H!p6[QV`?d0`^q["&&c::o: #:s:&:S:S +%%%9;{C;}{|%$fL]RQJGfwV![!EZ?f4/[(kd8.hog3|00T0p]060g0303 +EEEdefUe^fIE 6&?P*r,6[6MD<;T/\YyZ'-7g0VK55Guu)u\ ucu5uLuL +ttt^{RN{DR tq+*L8!@F+y` MBzp+Y#gysw0q]k1;K^))3)zN)8);)K)K +888AK^B7u8P_>m@IBCFerP3oN7*HfP+LZZoWWTW^-WdWZWT<&Tb&XWo=5G\f/I=:Djxw;)dvJ* 4$\!a&_lRqtt{tG"t/tltRtR +HHH~pBmp4m HOARoYq+dAbdBX|>3Pl-=FcH0G%b!CC(88K8lR8s8C8^8^ +```T4S=4R=U`%s*(2g\$se)&H!p6[QV`?d0`^q["&Sc::o: #:s:&:S:S +%%%9;{C;}Ca%$fL]RQJGfwVg[wEZ?f4/[(kd8.hogg|00T0p]060g0303 +EEEdefUe^UdE 6&?P*r,6[6-D<;T/\YyZ'-7g0VK5LGuu)u\ ucu5uLuL +ttt^{RN{DNZtq+*L8!@F+y`fMmzp+Y#gysw0q]k1;;^))3)zN)8);)K)K +888AK^B7u8P_>m@.BCFerP3oN7*HfP+LZ3t-R]k1;K^))3)zN)8);)K)K +888AK^7K[<8(`v .Gy `N]S,=[4fWk8G/!=%``4`;5`Y`!`S`S +KKKg6z&6L!KdP lQ|[~Pa7S%}8oMV2q["&fc::o: #:s:&:S:S +%%%9;{:;}i%$fL]RQJGfwVw[kEZ{4}8 G_v;CCZCxgCbC_CwCw +000=T3wT~w0|>B7u8P_>m@fBUFew3J74Z N EEeEa.E\E EfEf +WWW>T3t-R]k1KM^))3)zN)8);)K)K +888AK^7K[^78(`v .Gy `N]S,=[4fWk8G/SU%``4`;5`Y`!`S`S +KKKg6z&6LzrKdP lQ|[~Pa7S%f8oMV2q["&&c::o: #:s:&:S:S +%%%9;{:;}{9%$fL]RQJGfwVw[!EZ{4}8 G_w;CCZCxgCbC_CwCw +000=T3wT~3i0|>B7u8P_>m@fBCFew3J74Z U EEeEa.E\E EfEf +WWW>T3t-R]k1KK^))3)zN)8);)K)K +888AK^7K[<@8(`v .Gy `N]S,Q[4fWk8G/S=%``4`;5`Y`!`S`S +KKKg6z&6LseKdP lQ|[~Pa7S%f8oMV2q["Sfc::o: #:s:&:S:S +%%%9;{:;}|,%$fL]RQJGfwVw[!EZ{4}8 Gwv;CCZCxgCbC_CwCw +000=T3wT~<30|>B7u8P_>m@fBCFew3J74ZfN EEeEa.E\E EfEf +WWW>T3t-R]k1;C^))3)zN)8);)K)K +888AK^7K[-^8(`v .Gy `N]=,=[4fWk8G/!;%``4`;5`Y`!`S`S +KKKg6z&6L1sKdP lQ|[~Pa7}%}8oMV2q["S&c::o: #:s:&:S:S +%%%9;{:;}i|%$fL]RQJGfwVk[kEZ{4}8 Gww;CCZCxgCbC_CwCw +000=T3wT~cc0|>B7u8P_>m@UBUFew3J74ZfU EEeEa.E\E EfEf +WWW>T3t-R]k1;B^))3)zN)8);)K)K +888AK^7K[7-8(`v .Gy `N]=,Q[4fWk8G/!5%``4`;5`Y`!`S`S +KKKg6z&6L&&KdP lQ|[~Pa7}%f8oMV2q["&ic::o: #:s:&:S:S +%%%9;{:;}:a%$fL]RQJGfwVk[!EZ{4}8 G_X;CCZCxgCbC_CwCw +000=T3wT~w=0|>B7u8P_>m@UBCFew3J74Z a EEeEa.E\E EfEf +WWW>T3t-R]k1;m^))3)zN)8)K)m:;N@K@)K +888AK^7K[RA8(`v .Gy `N]Q,S[4fWk8G/!Q%``4`;5`Y`!`S`S +KKKg6z&6LrfKdP lQ|[~Pa7f%S8oMV2q["&Oc::o: #:s:&:S:S +%%%9;{:;}a(%$fL]RQJGfwV![wEZ{4}8 G_];CCZCxgCbC_CwCw +000=T3wT~=g0|>B7u8P_>m@CBfFew3J74Z . EEeEa.E\E EfEf +WWW>T3t-R]k1KB^))3)zN)8)K)m:MCMzm)K +888AK^7K[@C8(`v .Gy `N]Q,=[4fWk8G/!!%``4`;5`Y`!`S`S +KKKg6z&6LfzKdP lQ|[~Pa7f%}8oMV2q["&Sc::o: #:s:&:S:S +%%%9;{:;}~C%$fL]RQJGfwV![kEZ{4}8 G_k;CCZCxgCbCwCkK!gvX!Cw +000=T3wT~i<0|>B7u8P_>m@CBUFew3J74Z C EEeEa.E\EfEU=IfNINEf +WWW>T3t-R]k1Km^))3)zN)8);)K)K +888AK^7K[l"8(`v .Gy `N]Q,=[4fWk8G/SQ%``4`;5`Y`!`S`S +KKKg6z&6Le1KdP lQ|[~Pa7f%}8oMV2q["SOc::o: #:s:&:S:S +%%%9;{:;}(:%$fL]RQJGfwV![kEZ{4}8 Gw];CCZCxgCbC_CwCw +000=T3wT~p]0|>B7u8P_>m@CBCFew3J74Z EEeEa.E\E EfEf +WWW>TWo=5G\f/I=:D`x`;)oWWTW^-WdWZW3t-R]k1;z^))3)zN)8)K)m:MCMKN)K +888AK^7K[^CR8(`v .Gy `N]Q,Q[4fWk8G/S!%``4`;5`Y`S`=V!9tSt`S +KKKg6z&6Lz+gKdP lQ|[~Pa7f%f8oMV2q["SSc::o: #:s:S:}.&v&vi:S +%%%9;{:;}{,~%$fL]RQJGfwV![!EZ{4}8 Gwk;CCZCxgCbCwCkKk_w_!Cw +000=T3wT~3gp0|>B7u8P_>m@CBCFew3J74ZfC EEeEa.E\EfEU= dCdUEf +WWW>T3t-R]k1;N^))3)zN)8);)K)K +888AK^7K[^^l8(`v .Gy `N]t,S[4fWk8G/!T%``4`;5`Y`!`S`S +KKKg6z&6Lzs+KdP lQ|[~Pa7O%S8oMV2q["&uc::o: #:s:&:S:S +%%%9;{:;}{C{%$fL]RQJGfwVv[wEZ{4}8 G_x;CCZCxgCbC_CwCw +000=T3wT~3nn0|>B7u8P_>m@IBfFew3J74Zf EEeEa.E\E EfEf +WWW>T3t-R]k1;|^))3)zN)8);)K)K +888AK^7K[^"<8(`v .Gy `N]t,=[4fWk8G/!t%``4`;5`Y`!`S`S +KKKg6z&6Lz!!KdP lQ|[~Pa7O%}8oMV2q["&vc::o: #:s:&:S:S +%%%9;{:;}{|i%$fL]RQJGfwVv[kEZ{4}8 G_g;CCZCxgCbC_CwCw +000=T3wT~3B7u8P_>m@IBUFew3J74Z d EEeEa.E\E EfEf +WWW>T3t-R]k1;;^))3)zN)8)K)m:;mB|z)K +888AK^7K[^-78(`v .Gy `N]t,Q[4fWk8G/!S%``4`;5`Y`!`S`S +KKKg6z&6Lz1rKdP lQ|[~Pa7O%f8oMV2q["&}c::o: #:s:&:S:S +%%%9;{:;}{i9%$fL]RQJGfwVv[!EZ{4}8 G_!;CCZCxgCbC_CwCw +000=T3wT~3ci0|>B7u8P_>m@IBCFew3J74Z I EEeEa.E\E EfEf +WWW>T3t-R]k1K|^))3)zN)8);)K)K +888AK^7K[^7@8(`v .Gy `N]t,Q[4fWk8G/St%``4`;5`Y`!`S`S +KKKg6z&6Lz&eKdP lQ|[~Pa7O%f8oMV2q["Svc::o: #:s:S:}.SOvi :S +%%%9;{:;}{a,%$fL]RQJGfwV][wEZ{4}8 G__;CCZCxgCbC_CwCw +000=T3wT~3]30|>B7u8P_>m@NBfFew3J74Z f EEeEa.E\E EfEf +WWW>T3t-R]k1K;^))3)zN)8);)K)K +888AK^7K[^A^8(`v .Gy `N]U,S[4fWk8G/SS%``4`;5`Y`!`S`S +KKKg6z&6LzgsKdP lQ|[~Pa7v%S8oMV2q["S}c::o: #:s:&:S:S +%%%9;{:;}{9|%$fL]RQJGfwV][wEZ{4}8 Gw!;CCZCxgCbC_CwCw +000=T3wT~3=c0|>B7u8P_>m@NBfFew3J74ZfI EEeEa.E\E EfEf +WWW>TRWo=5G\f/I=:DjxL;)3t-R]k1;@^))3)zN)8);)K)K +888AK^7K[^@-8(`v .Gy `N]U,=[4fWk8G/!9%``4`;5`Y`!`S`S +KKKg6z&6Lzf&KdP lQ|[~Pa7v%}8oMV2q["& c::o: #:s:&:S:S +%%%9;{:;}{~a%$fL]RQJGfwV][kEZ{4}8 Gw_;CCZCxgCbC_CwCw +000=T3wT~3i=0|>B7u8P_>m@NBUFew3J74Zff EEeEa.E\E EfEf +WWW>T3t-R]k1;M^))3)zN)8);)K)K +888AK^7K[^lA8(`v .Gy `N]U,Q[4fWk8G/!U%``4`;5`Y`S`=VS==;5`S +KKKg6z&6LzefKdP lQ|[~Pa7v%f8oMV2q["&#c::o: #:s:&:S:S +%%%9;{:;}{((%$fL]RQJGfwV][!EZ{4}8 G_,;CCZCxgCbC_CwCw +000=T3wT~ngg0|>B7u8P_>m@NBCFew3J74Z % EEeEa.E\E EfEf +WWW>T3t-R]k1;K^))3)zN)8);)K)K +888AK^7K[<^C8(`v .Gy `N]5,S[4fWk8G/!=%``4`;5`Y`!`S`S +KKKg6z&6LszzKdP lQ|[~Pa7#%S8oMV2q["&fc::o: #:s:&:S:S +%%%9;{:;}C{C%$fL]RQJGfwVg[wEZ{4}8 G_v;CCZCxgCbC_CwCw +000=T3wT~n3<0|>B7u8P_>m@.BfFew3J74Z N EEeEa.E\E EfEf +WWW>T3t-R]k1KM^))3)zN)8);)K)K +888AK^7K[<<"8(`v .Gy `N]5,S[4fWk8G/SU%``4`;5`Y`!`S`S +KKKg6z&6Lss1KdP lQ|[~Pa7#%}8oMV2q["&&c::o: #:s:&:S:S +%%%9;{:;}CC:%$fL]RQJGfwVg[kEZ{4}8 G_w;CCZCxgCbC_CwCw +000=T3wT~nn]0|>B7u8P_>m@.BUFew3J74Z U EEeEa.E\E EfEf +WWW>TWo=5G\f/I=:D xw;)3t-R]k1KK^))3)zN)8);)K)K +888AK^7K[<"R8(`v .Gy `N]5,=[4fWk8G/S=%``4`;5`Y`!`S`S +KKKg6z&6Ls!gKdP lQ|[~Pa7#%}8oMV2q["Sfc::o: #:s:&:S:S +%%%9;{:;}C|~%$fL]RQJGfwVg[kEZ{4}8 Gwv;CCZCxgCbC_CwCw +000=T3wT~nB7u8P_>m@.BUFew3J74ZfN EEeEa.E\E EfEf +WWW>T3t-R]k1;C^))3)zN)8);)K)K +888AK^7K[<-l8(`v .Gy `N]5,Q[4fWk8G/!;%``4`;5`Y`!`S`S +KKKg6z&6Ls&+KdP lQ|[~Pa7#%f8oMV2q["S&c::o: #:s:&:S:S +%%%9;{:;}C:{%$fL]RQJGfwVg[!EZ{4}8 Gww;CCZCxgCbC_CwCw +000=T3wT~nwn0|>B7u8P_>m@.BCFew3J74ZfU EEeEa.E\E EfEf +WWW>T3ysw0q]k1;B^))3)zN)8);)K)K +888AK^RK[R8(`v .Gy `N]S,=[4P{#pg8G/!5%``4`;5`Y`!`S`S +KKKg6zr6LgKdP lQ|[~Pa7S%}8o?d0`^q["&ic::o: #:s:&:S:S +%%%9;{a;}~%$fL]RQJGfwVw[kEZN=Mp&8 G_X;CCZCxgCbC_CwCw +000=T3]T~p0|>B7u8P_>m@fBUFeg1X5*74Z a EEeEa.E\E EfEf +WWW>T<-Tb3ysw0q]k1;m^))3)zN)8);)K)K +888AK^RK[^l8(`v .Gy `N]S,Q[4P{#pg8G/!Q%``4`;5`Y`!`S`S +KKKg6zr6Ls+KdP lQ|[~Pa7S%f8o?d0`^q["&Oc::o: #:s:&:S:S +%%%9;{a;}C{%$fL]RQJGfwVw[!EZN=Mp&8 G_];CCZCxgCbC_CwCw +000=T3]T~nn0|>B7u8P_>m@fBCFeg1X5*74Z . EEeEa.E\E EfEf +WWW>T<-Tb&XWo=5G\f/I=:DLx`;)Z'-7g0VK5&Guu)u\ ucu5uLuL +ttt^{R"{DNHtq+*L8!@F+y`BMyzp]{ITqn!X<:OHHpH5fHGH3ysw0q]k1KB^))3)zN)8);)K)K +888AK^RK["<8(`v .Gy `N]=,=[4P{#pg8G/!!%``4`;5`Y`!`S`S +KKKg6zr6L!!KdP lQ|[~Pa7}%}8o?d0`^q["&Sc::o: #:s:&:S:S +%%%9;{a;}|i%$fL]RQJGfwVk[kEZN=Mp&8 G_k;CCZCxgCbC_CwCw +000=T3]T~B7u8P_>m@UBUFeg1X5*74Z C EEeEa.E\E EfEf +WWW>T<-TbX-Wo=5G\f/I=:Dwxw;)Z'-7g0VK5 Guu)u\ ucu5uLuL +ttt^{R"{DJ^tq+*L8!@F+y`mMmzp]{ITqn!X<;OHHpH5fHGH3ysw0q]k1Km^))3)zN)8);)K)K +888AK^RK[-78(`v .Gy `N]=,=[4P{#pg8G/SQ%``4`;5`Y`!`S`S +KKKg6zr6L1rKdP lQ|[~Pa7}%}8o?d0`^q["SOc::o: #:s:&:S:S +%%%9;{a;}i9%$fL]RQJGfwVk[kEZN=Mp&8 Gw];CCZCxgCbC_CwCw +000=T3]T~ci0|>B7u8P_>m@UBCFeg1X5*74Z EEeEa.E\E EfEf +WWW>T<-TbM^Wo=5G\f/I=:Dwx`;)Z'-7g0VK5LGuu)u\ ucu5uLuL +ttt^{R"{D ltq+*L8!@F+y`mMyzp]{ITqn!XoWWTW^-WdWZW3ysw0q]k1;z^))3)zN)8);)K)K +888AK^RK[7@8(`v .Gy `N]=,Q[4P{#pg8G/S!%``4`;5`Y`!`S`S +KKKg6zr6L&eKdP lQ|[~Pa7}%f8o?d0`^q["SSc::o: #:s:&:S:S +%%%9;{a;}a,%$fL]RQJGfwVk[!EZN=Mp&8 Gwk;CCZCxgCbC_CwCw +000=T3]T~]30|>B7u8P_>m@UBCFeg1X5*74ZfC EEeEa.E\E EfEf +WWW>T<-Tb-&Wo=5G\f/I=:Dwx`;)Z'-7g0VKL Guu)u\ ucu5uLuL +ttt^{R"{D"Jtq+*L8!@F+y`mMyzp]{ITqn!XB;OHHpH5fHGH3ysw0q]k1;N^))3)zN)8);)K)K +888AK^RK[A^8(`v .Gy `N]Q,S[4P{#pg8G/!T%``4`;5`Y`!`S`S +KKKg6zr6LgsKdP lQ|[~Pa7f%S8o?d0`^q["&uc::o: #:s:&:S:S +%%%9;{a;}9|%$fL]RQJGfwV![wEZN=Mp&8 G_x;CCZCxgCbC_CwCw +000=T3]T~=c0|>B7u8P_>m@CBfFeg1X5*74Zf EEeEa.E\E EfEf +WWW>T<-Tb>RWo=5G\f/I=:D`xL;)Z'-7g0VKLLGuu)u\ ucu5uLuL +ttt^{R"{D^"tq+*L8!@F+y`yMBzp]{ITqn!XBmOHHpH5fHGH3ysw0q]k1;|^))3)zN)8)K)m:mzK;B)K +888AK^RK[@-8(`v .Gy `N]Q,=[4P{#pg8G/!t%``4`;5`Y`S`=Vt559`S +KKKg6zr6Lf&KdP lQ|[~Pa7f%}8o?d0`^q["&vc::o: #:s:S:}.&vffu:S +%%%9;{a;}~a%$fL]RQJGfwV![kEZN=Mp&8 G_g;CCZCxgCbCwCkKvwXg,Cw +000=T3]T~i=0|>B7u8P_>m@CBUFeg1X5*74Z d EEeEa.E\EfEU=IadNfEf +WWW>T<-TbccWo=5G\f/I=:D`xw;)Z'-7g0VK5NGuu)u\ ucu5uLuL +ttt^{R"{DZGtq+*L8!@F+y`yMmzp]{ITqn!X<5OHHpH5fHGH3ysw0q]k1;;^))3)zN)8);)K)K +888AK^RK[lA8(`v .Gy `N]Q,Q[4P{#pg8G/!S%``4`;5`Y`S`=Vt5;;T`S +KKKg6zr6LefKdP lQ|[~Pa7f%f8o?d0`^q["&}c::o: #:s:S:}.ffSvO:S +%%%9;{a;}((%$fL]RQJGfwV![!EZN=Mp&8 G_!;CCZCxgCbC_CwCw +000=T3]T~3gg0|>B7u8P_>m@CBCFeg1X5*74Z I EEeEa.E\EfEU=ICfNaEf +WWW>T<-Tb3ysw0q]k1K|^))3)zN)8)K)m:MN|NM)K +888AK^RK[^^C8(`v .Gy `N]Q,Q[4P{#pg8G/St%``4`;5`Y`S`=V=TSQS`S +KKKg6zr6LzzzKdP lQ|[~Pa7f%f8o?d0`^q["Svc::o: #:s:S:}.S&fui:S +%%%9;{a;}{{C%$fL]RQJGfwVv[wEZN=Mp&8 G__;CCZCxgCbC_CwCw +000=T3]T~33<0|>B7u8P_>m@IBfFeg1X5*74Z f EEeEa.E\E EfEf +WWW>T<-Tb<3ysw0q]k1K;^))3)zN)8);)K)K +888AK^RK[^<"8(`v .Gy `N]t,S[4P{#pg8G/SS%``4`;5`Y`!`S`S +KKKg6zr6Lzs1KdP lQ|[~Pa7O%S8o?d0`^q["S}c::o: #:s:&:S:S +%%%9;{a;}{C:%$fL]RQJGfwVv[wEZN=Mp&8 Gw!;CCZCxgCbC_CwCw +000=T3]T~3n]0|>B7u8P_>m@IBfFeg1X5*74ZfI EEeEa.E\E EfEf +WWW>T<-Tb<&>Wo=5G\f/I=:D xL;)Z'-7g0VKLjGuu)u\ ucu5uLuL +ttt^{R"{DRNZtq+*L8!@F+y` Mmzp]{ITqn!X<3ysw0q]k1;@^))3)zN)8);)K)K +888AK^RK[^"R8(`v .Gy `N]t,=[4P{#pg8G/!9%``4`;5`Y`!`S`S +KKKg6zr6Lz!gKdP lQ|[~Pa7O%}8o?d0`^q["& c::o: #:s:&:S:S +%%%9;{a;}{|~%$fL]RQJGfwVv[kEZN=Mp&8 Gw_;CCZCxgCbC_CwCw +000=T3]T~3B7u8P_>m@IBUFeg1X5*74Zff EEeEa.E\E EfEf +WWW>T<-Tb3ysw0q]k1;M^))3)zN)8);)K)K +888AK^RK[^-l8(`v .Gy `N]t,Q[4P{#pg8G/!U%``4`;5`Y`S`=VSS5`S +KKKg6zr6Lz&+KdP lQ|[~Pa7O%f8o?d0`^q["&#c::o: #:s:S:}.f&&#}:S +%%%9;{a;}{:{%$fL]RQJGfwVv[!EZN=Mp&8 G_,;CCZCxgCbC_CwCw +000=T3]T~3wn0|>B7u8P_>m@IBCFeg1X5*74Z % EEeEa.E\E EfEf +WWW>T<-Tb3ysw0q]k1;K^))3)zN)8);)K)K +888AK^RK[^R<8(`v .Gy `N]U,S[4P{#pg8G/!=%``4`;5`Y`!`S`S +KKKg6zr6Lzr!KdP lQ|[~Pa7v%S8o?d0`^q["&fc::o: #:s:&:S:S +%%%9;{a;}{ai%$fL]RQJGfwV][wEZN=Mp&8 G_v;CCZCxgCbC_CwCw +000=T3]T~3]w0|>B7u8P_>m@NBfFeg1X5*74Z N EEeEa.E\E EfEf +WWW>T<-Tb<--Wo=5G\f/I=:DjxL;)Z'-7g0VK5 Guu)u\ ucu5uLuL +ttt^{R"{DR"^tq+*L8!@F+y`;MBzp]{ITqn!X<~OHHpH5fHGH3ysw0q]k1KM^))3)zN)8);)K)K +888AK^RK[^A78(`v .Gy `N]U,S[4P{#pg8G/SU%``4`;5`Y`!`S`S +KKKg6zr6LzgrKdP lQ|[~Pa7v%}8o?d0`^q["&&c::o: #:s:&:S:S +%%%9;{a;}{99%$fL]RQJGfwV][kEZN=Mp&8 G_w;CCZCxgCbC_CwCw +000=T3]T~3=i0|>B7u8P_>m@NBUFeg1X5*74Z U EEeEa.E\E EfEf +WWW>T<-Tb<>^Wo=5G\f/I=:Djxw;)Z'-7g0VK5`Guu)u\ ucu5uLuL +ttt^{R"{DRZltq+*L8!@F+y`;Mmzp]{ITqn!X< OHHpH5fHGH3ysw0q]k1KK^))3)zN)8);)K)K +888AK^RK[^@@8(`v .Gy `N]U,=[4P{#pg8G/S=%``4`;5`Y`!`S`S +KKKg6zr6LzfeKdP lQ|[~Pa7v%}8o?d0`^q["Sfc::o: #:s:&:S:S +%%%9;{a;}{(,%$fL]RQJGfwV][kEZN=Mp&8 Gwv;CCZCxgCbC_CwCw +000=T3]T~3p30|>B7u8P_>m@NBUFeg1X5*74ZfN EEeEa.E\EfEU=I..ddEf +WWW>T<-Tb<^&Wo=5G\f/I=:Djx`;)Z'-7g0VK55Guu)u\ ucu5uLuL +ttt^{R"{DRGJtq+*L8!@F+y`;Myzp]{ITqn!X3ysw0q]k1;C^))3)zN)8);)K)K +888AK^RK[B7u8P_>m@NBCFeg1X5*74ZfU EEeEa.E\E EfEf +WWW>T<-Tb&ZRWo=5G\f/I=:Djx`;)Z'-7g0VKL`Guu)u\ ucu5uLuL +ttt^{R"{DNl"tq+*L8!@F+y`;Myzp]{ITqn!XB OHHpH5fHGH3ysw0q]k1;B^))3)zN)8);)K)K +888AK^RK[<^-8(`v .Gy `N]5,S[4P{#pg8G/!5%``4`;5`Y`!`S`S +KKKg6zr6Lsz&KdP lQ|[~Pa7#%S8o?d0`^q["&ic::o: #:s:&:S:S +%%%9;{a;}C{a%$fL]RQJGfwVg[wEZN=Mp&8 G_X;CCZCxgCbC_CwCw +000=T3]T~n3=0|>B7u8P_>m@.BfFeg1X5*74Z a EEeEa.E\E EfEf +WWW>T<-Tb&3ysw0q]k1;m^))3)zN)8);)K)K +888AK^RK[<B7u8P_>m@.BUFeg1X5*74Z . EEeEa.E\E EfEf +WWW>T<-Tb&X3ysw0q]k1KB^))3)zN)8);)K)K +888AK^RK[<-C8(`v .Gy `N]5,Q[4P{#pg8G/!!%``4`;5`Y`!`S`S +KKKg6zr6Ls1zKdP lQ|[~Pa7#%f8o?d0`^q["&Sc::o: #:s:&:S:S +%%%9;{a;}CiC%$fL]RQJGfwVg[!EZN=Mp&8 G_k;CCZCxgCbC_CwCw +000=T3]T~nc<0|>B7u8P_>m@.BCFeg1X5*74Z C EEeEa.E\E EfEf +WWW>T<-Tb&MMWo=5G\f/I=:D x`;)Z'-7g0VK5 Guu)u\ ucu5uLuL +ttt^{R"{DNH tq+*L8!@F+y`fMyzp]{ITqn!X<;OHHpH5fHGH3ysw0q]k1Km^))3)zN)8);)K)K +888AK^RK[<7"8(`v .Gy `N]5,Q[4P{#pg8G/SQ%``4`;5`Y`!`S`S +KKKg6zr6Ls&1KdP lQ|[~Pa7#%f8o?d0`^q["SOc::o: #:s:&:S:S +%%%9;{a;}C::%$fL]RQJGfwVg[!EZN=Mp&8 Gw];CCZCxgCbC_CwCw +000=TB7u8P_>m@fBUFe,1&74Zx1oqs5ZZoWWTW<^&WdWZWTXMTbRWo=5G\f/I=:DLx`;)='X0VKW'*1A*lRqtt{tRGNt/tltRtR +HHH~py p4fHOARoYq+dAbdKX|>3Us?]k1`s=DTvC<(88K8^l<8s8C8^8^ +```T4Qt4RT`%s*(2g\$se)zH!p6~3 2nYJ3`Kl~&fc::o:S }:s:&:S:S +%%%9;|i;}~%$fL]RQJGfwVk[kEZA=28 G'=/;)Bgg|00T03pn060g0303 +EEEdeCIe^aE 6&?P*r,6[6&D&;TI75P+L(7yM{X5LGuu)uL\wucu5uLuL +ttt^{JH{DRltq+*L8!@F+y`mMmzpd{Rn!X({gp.?;m^))3)Kzm)8);)K)K +888AK"-K[^^8(`v .Gy `N]=,=[4${*8G/E{: U +!dKK6KzesKuK+KzKz +:::iofOoYS}:cA~b!^aDA\.C*|^;G L7c-U r9%2__;CCZCwxkCbC_CwCw +000=TB7u8P_>m@UBCFe,1&74Zx1oqs5ZTXMTb3Us?]k1`s=DTvC"(88K8^l<8s8C8^8^ +```T4Qt4R=!`%s*(2g\$se)!Hsp6~3 2nYJ3`Kl~&&c::o:S }:s:&:S:S +%%%9;|i;}C{%$fL]RQJGfwV![kEZA=28 G'=/;)Bg3|00T03pn060g0303 +EEEdeCIe^UUE 6&?P*r,6[6XD&;TI75P+L(7yM{X5wGuu)uL\wucu5uLuL +ttt^{JH{DNJtq+*L8!@F+y`yMmzpd{Rn!X({gp.?;|^))3)Kzm)8);)K)K +888AK"-K[<-8(`v .Gy `N]Q,Q[4${*8G/E{: U ++dKK6KzesKuK+KzKz +:::iofOoY}v:cA~b!^aDA\.|*|^;G L7c-U r9%2_w;CCZCwxkCbC_CwCw +000=TB7u8P_>m@CBCFe,1&74Zx1oqs5Z&oWWTW<^&WdWZWTXMTbX3Us?]k1`s=DTvCC(88K8^l<8s8C8^8^ +```T4Qt4RQQ`%s*(2g\$se)1Hsp6~3 2nYJ3`Kl~&Sc::o:S }:s:&:S:S +%%%9;|i;}|i%$fL]RQJGfwVv[kEZA=28 G'=/;)Bgn|00T03pn060g0303 +EEEdeCIe^CNE 6&?P*r,6[6MD&;TI75P+L(7yM{X5`Guu)uL\wucu5uLuL +ttt^{JH{DJ"tq+*L8!@F+y` Myzpd{Rn!X({gp.?;;^))3)Kzm)8);)K)K +888AK"-K["A8(`v .Gy `N]t,Q[4${*8G/E{: U +zdKK6KzesKuK+KzKz +:::iofOoYfu:cA~b!^aDA\.i*|^;G L7c-U r9%2_k;CCZCwxkCbC_CwCw +000=TB7u8P_>m@IBCFe,1&74Zx1oqs5ZXoWWTW<^&WdWZWTXMTbMMWo=5G\f/I=:Djxw;)='X0VKW'*1A*llqtt{tRGNt/tltRtR +HHH~py p4 ;HOARoYq+dAbdBXm>3Us?]k1`s=DTvC^(88K8^l<8s8C8^8^ +```T4Qt4Rt5`%s*(2g\$se)&Hsp6~3 2nYJ3`Kl~&}c::o:S }:s:&:S:S +%%%9;|i;}i9%$fL]RQJGfwV][kEZA=28 G'=/;)Bg<|00T03pn060g0303 +EEEdeCIe^I%E 6&?P*r,6[6RDX;TI75P+L(7yM{X55Guu)uL\wucu5uLuL +ttt^{JH{DHGtq+*L8!@F+y`;Myzpd{Rn!X({gp.?;K^))3)Kzm)8);)K)K +888AK"-K[7C8(`v .Gy `N]U,Q[4${*8G/E{: U +sdKK6KzesKuK+KzKz +:::iofOoYvS:cA~b!^aDA\.:*|^;G L7c-U r9%2_!;CCZCwxkCbC_CwCw +000=TB7u8P_>m@.BfFe,1&74Zx1oqs5ZZoWWTW<^&WdWZWTXMTbR>Wo=5G\f/I=:D xw;)='X0VKW'*1A*lRqtt{tRGNt/tltRtR +HHH~py p4;:HOARoYq+dAbdNXm>3Us?]k1`s=DTvC<(88K8^l<8s8C8^8^ +```T4Qt4RU;`%s*(2g\$se)rHsp6~3 2nYJ3`Kl~&fc::o:S }:s:&:S:S +%%%9;|i;}a,%$fL]RQJGfwVg[!EZA=28 G'=/;)Bgg|00T03pn060g0303 +EEEdeCIe^.fE 6&?P*r,6[6-DX;TI75P+L(7yM{X5LGuu)uL\wucu5uLuL +ttt^{JH{D"Ntq+*L8!@F+y`fMyzpd{Rn!X({gp.?;m^))3)Kzm)8);)K)K +888AK"-K[R"8(`v .Gy `N]5,Q[4${*8G/E{: U +!dKK6KzesKuK+KzKz +:::iofvoY&:cA~b!^aDA\.{*C^;"RKB7c-U r9%2__;CCZCxgCbC_CwCw +000=TB7u8P_>m@fBUFe(P5J74Zx1oqs5ZTXRTb-Wo=5G\f/I=:DLxw;)Ov7R0VKW'*1A*l"qtt{tG"t/tltRtR +HHH~py;p4~HOARoYq+dAbdKXm>3"l0R]k1`s=DTvCA(88K8lR8s8C8^8^ +```T4QU4R9`%s*(2g\$se)zHsp6_Q{T2nYJ3`Kl~&uc::o: #:s:&:S:S +%%%9;|:;}(%$fL]RQJGfwVw[kEZ:fp}8 G'=/;)Bgp|00T0p]060g0303 +EEEdeCNe^f E 6&?P*r,6[6B7u8P_>m@fBUFe(P5J74Zx1oqs5TXRTb<^Wo=5G\f/I=:DLxw;)Ov7R0VKW'*1A*RGqtt{tG"t/tltRtR +HHH~py;p4m3"l0R]k1`s=DTvB7u8P_>m@fBUFe(P5J74Zx1oqs5&>oWWTW^-WdWZWTXRTbX&Wo=5G\f/I=:DLx`;)Ov7R0VKW'*1A*llqtt{tG"t/tltRtR +HHH~py;p4yyHOARoYq+dAbdKX|>3"l0R]k1`s=DTvC^(88K8lR8s8C8^8^ +```T4QU4RQt`%s*(2g\$se)zH!p6_Q{T2nYJ3`Kl~&}c::o: #:s:&:S:S +%%%9;|:;}|:%$fL]RQJGfwVw[!EZ:fp}8 G'=/;)Bg<|00T0p]060g0303 +EEEdeCNe^C.E 6&?P*r,6[6B7u8P_>m@fBCFe(P5J74Zx1oqs5ZcoWWTW^-WdWZWTXRTbMRWo=5G\f/I=:DLx`;)Ov7R0VKW'*1A*RJqtt{tG"t/tltRtR +HHH~py;p4 fHOARoYq+dAbdKX|>3"l0R]k1`s=DTv^-(88K8lR8s8C8^8^ +```T4QU4RtT`%s*(2g\$se)zH!p6_Q{T2nYJ3`Kl~Svc::o: #:s:&:S:S +%%%9;|:;}i~%$fL]RQJGfwVw[!EZ:fp}8 G'=/;)B3]|00T0p]060g0303 +EEEdeCNe^IaE 6&?P*r,6[6B7u8P_>m@fBCFe(P5J74Zx1oqs5&TXRTbRcWo=5G\f/I=:DLx`;)Ov7R0VKW'*1A*N"qtt{tG"t/tltRtR +HHH~py;p4;5HOARoYq+dAbdKX|>3"l0R]k1`s=DTvB7u8P_>m@UBUFe(P5J74Zx1oqs5Z&oWWTW^-WdWZWTXRTb>3"l0R]k1`s=DTvC@(88K8lR8s8C8^8^ +```T4QU4RTQ`%s*(2g\$se)sHsp6_Q{T2nYJ3`Kl~& c::o: #:s:&:S:S +%%%9;|:;}9i%$fL]RQJGfwVk[kEZ:fp}8 G'=/;)B3g|00T0p]060g0303 +EEEdeCNe^dNE 6&?P*r,6[6&D&;Tl\H!P+L(7yM{XLLGuu)u\ ucu5uLuL +ttt^{J {D^"tq+*L8!@F+y`mMmzpKYT0n!X({gp.?Km^))3)zN)8);)K)K +888AK"7K[AA8(`v .Gy `N]=,=[4I2pk8G/E{: U z!dKK6KerKuK+KzKz +:::iofvoYiu:cA~b!^aDA\.C*C^;"RKB7c-U r9%2wv;CCZCxgCbC_CwCw +000=TB7u8P_>m@UBUFe(P5J74Zx1oqs5TXRTbcMWo=5G\f/I=:Dwxw;)Ov7R0VKW'*1A*Nlqtt{tG"t/tltRtR +HHH~py;p4:;HOARoYq+dAbdmXm>3"l0R]k1`s=DTv<^(88K8lR8s8C8^8^ +```T4QU4R95`%s*(2g\$se)sHsp6_Q{T2nYJ3`Kl~}}c::o: #:s:&:S:S +%%%9;|:;}~9%$fL]RQJGfwVk[kEZ:fp}8 G'=/;)Bn<|00T0p]060g0303 +EEEdeCNe^%%E 6&?P*r,6[6&D&;Tl\H!P+L(7yM{Xw Guu)u\ ucu5uLuL +ttt^{J {DZGtq+*L8!@F+y`mMmzpKYT0n!X({gp.?mB^))3)zN)8);)K)K +888AK"7K[lC8(`v .Gy `N]=,=[4I2pk8G/E{: U srdKK6KerKuK+KzKz +:::iofvoY S:cA~b!^aDA\.C*C^;"RKB7c-U r9%2k,;CCZCxgCbC_CwCw +000=TB7u8P_>m@UBUFe(P5J74Zx1oqs5&coWWTW^-WdWZWTXRTb^>Wo=5G\f/I=:Dwx`;)Ov7R0VKW'*1A*lRqtt{tG"t/tltRtR +HHH~py;p45:HOARoYq+dAbdmX|>3"l0R]k1`s=DTvC<(88K8lR8s8C8^8^ +```T4QU4R;;`%s*(2g\$se)sH!p6_Q{T2nYJ3`Kl~&fc::o: #:s:&:S:S +%%%9;|:;}{,,%$fL]RQJGfwVk[!EZ:fp}8 G'=/;)Bgc|00T0p]060g0303 +EEEdeCNe^f fE 6&?P*r,6[6&DX;Tl\H!P+L(7yM{X5jGuu)u\ ucu5uLuL +ttt^{J {DRlNtq+*L8!@F+y`mMyzpKYT0n!X({gp.?;N^))3)zN)8);)K)K +888AK"7K[^C"8(`v .Gy `N]=,Q[4I2pk8G/E{: U +gdKK6KerKuK+KzKz +:::iofvoYS&O:cA~b!^aDA\.C*|^;"RKB7c-U r9%2_X;CCZCxgCbC_CwCw +000=TB7u8P_>m@UBCFe(P5J74Zx1oqs5Z^oWWTW^-WdWZWTXRTb<3"l0R]k1`s=DTv^7(88K8lR8s8C8^8^ +```T4QU4RSS=`%s*(2g\$se)sH!p6_Q{T2nYJ3`Kl~S#c::o: #:s:&:S:S +%%%9;|:;}{{|%$fL]RQJGfwVk[!EZ:fp}8 G'=/;)B3=|00T0p]060g0303 +EEEdeCNe^ffIE 6&?P*r,6[6&DX;Tl\H!P+L(7yM{XLNGuu)u\ ucu5uLuL +ttt^{J {DRR tq+*L8!@F+y`mMyzpKYT0n!X({gp.?Kz^))3)zN)8);)K)K +888AK"7K[^^R8(`v .Gy `N]=,Q[4I2pk8G/E{: U s+dKK6KerKuK+KzKz +:::iofvoYSSi:cA~b!^aDA\.C*|^;"RKB7c-U r9%2kw;CCZCxgCbC_CwCw +000=TB7u8P_>m@UBCFe(P5J74Zx1oqs5&&oWWTW^-WdWZWTXRTb<&XWo=5G\f/I=:Dwx`;)Ov7R0VKW'*1A*N^qtt{tG"t/tltRtR +HHH~py;p4Bm HOARoYq+dAbdmX|>3"l0R]k1`s=DTv<@(88K8lR8s8C8^8^ +```T4QU4RS=U`%s*(2g\$se)sH!p6_Q{T2nYJ3`Kl~} c::o: #:s:&:S:S +%%%9;|:;}{Ca%$fL]RQJGfwVk[!EZ:fp}8 G'=/;)BB7u8P_>m@CBfFe(P5J74Zx1oqs5ZXoWWTW^-WdWZWTXRTb3"l0R]k1`s=DTvCl(88K8lR8s8C8^8^ +```T4QU4RSQ9`%s*(2g\$se)!Hzp6_Q{T2nYJ3`Kl~S&c::o: #:s:&:S:S +%%%9;|:;}{|(%$fL]RQJGfwV![wEZ:fp}8 G'=/;)B33|00T0p]060g0303 +EEEdeCNe^fI E 6&?P*r,6[6XD<;Tl\H!P+L(7yM{XLwGuu)u\ ucu5uLuL +ttt^{J {DRHRtq+*L8!@F+y`yMBzpKYT0n!X({gp.?K|^))3)zN)8);)K)K +888AK"7K[^-<8(`v .Gy `N]Q,S[4I2pk8G/E{: U z1dKK6KerKuK+KzKz +:::iofvoYSOf:cA~b!^aDA\.|*{^;"RKB7c-U r9%2w];CCZCxgCbC_CwCw +000=TB7u8P_>m@CBfFe(P5J74Zx1oqs5<-oWWTW^-WdWZWTXRTb3"l0R]k1`s=DTv<<(88K8lR8s8C8^8^ +```T4QU4RSUS`%s*(2g\$se)!Hzp6_Q{T2nYJ3`Kl~}fc::o: #:s:&:S:S +%%%9;|:;}{:C%$fL]RQJGfwV![wEZ:fp}8 G'=/;)Bnc|00T0p]060g0303 +EEEdeCNe^fNCE 6&?P*r,6[6XD<;Tl\H!P+L(7yM{XwjGuu)u\ ucu5uLuL +ttt^{J {DR Htq+*L8!@F+y`yMBzpKYT0n!X({gp.?mN^))3)zN)8);)K)K +888AK"7K[^778(`v .Gy `N]Q,S[4I2pk8G/E{: U sgdKK6KerKuK+KzKz +:::iofvoYSv#:cA~b!^aDA\.|*{^;"RKB7c-U r9%2kX;CCZCxgCbC_CwCw +000=TB7u8P_>m@CBfFe(P5J74Zx1oqs5&^oWWTW^-WdWZWTXRTb<-&Wo=5G\f/I=:D`xw;)Ov7R0VKW'*1A*lNqtt{tG"t/tltRtR +HHH~py;p4BfyHOARoYq+dAbd|Xm>3"l0R]k1`s=DTvC"(88K8lR8s8C8^8^ +```T4QU4RS5t`%s*(2g\$se)!Hsp6_Q{T2nYJ3`Kl~&Oc::o: #:s:S:}.f& i:S +%%%9;|:;}{a:%$fL]RQJGfwV![kEZ:fp}8 G'=/;)Bgw|00T0p]06030nbg]]3i03 +EEEdeCNe^f..E 6&?P*r,6[6XD&;Tl\H!P+L(7yM{X5 Guu)u\ ucuLuwQL \`NuL +ttt^{J {DR"^tq+*L8!@F+y`yMmzpKYT0n!X({gp.?;@^))3)zN)8)K)m:K;|zN)K +888AK"7K[^R@8(`v .Gy `N]Q,=[4I2pk8G/E{: U +fdKK6KerKuKzKsSss1egKz +:::iofvoYS# :cA~b!^aDA\.|*C^;"RKB7c-U r9%2_x;CCZCxgCbCwCkKw!,X,Cw +000=TB7u8P_>m@CBUFe(P5J74Zx1oqs5X&W< +uuu&)`j)[L&LuG$Xqvgd=$EkJmNV{=8\?a&_P4-l/RBBOHHpH5fHGHBHmPyTXRTb<>RWo=5G\f/I=:D`xw;)Ov7R0VKW'*1A*R qtt{tG"t/tRtNsRHJHNtR +HHH~py;p4B~fHOARoYq+dAbd|Xm>3"l0R]k1`s=DTv^R(88K8lR8s8C8^8^ +```T4QU4RSTT`%s*(2g\$se)!Hsp6_Q{T2nYJ3`Kl~Sic::o: #:s:&:S:S +%%%9;|:;}{9~%$fL]RQJGfwV![kEZ:fp}8 G'=/;)B3i|00T0p]060g0303 +EEEdeCNe^fdaE 6&?P*r,6[6XD&;Tl\H!P+L(7yM{XL\Guu)u\ ucu5uLuL +ttt^{J {DRZltq+*L8!@F+y`yMmzpKYT0n!X({gp.?m;^))3)zN)8);)K)K +888AK"7K[^@^8(`v .Gy `N]Q,=[4I2pk8G/E{: U szdKK6KerKuK+KzKz +:::iofvoYSu}:cA~b!^aDA\.|*C^;"RKB7c-U r9%2kk;CCZCxgCbC_CwCw +000=TB7u8P_>m@CBUFe(P5J74Zx1oqs5&XoWWTW^-WdWZWTXRTb3"l0R]k1`s=DTvB7u8P_>m@CBCFe(P5J74Zx1oqs5ZMoWWTW^-WdWZWTXRTb&Z3"l0R]k1`s=DTv^C(88K8lR8s8C8^8^ +```T4QU4R=!Q`%s*(2g\$se)!H!p6_Q{T2nYJ3`Kl~SSc::o: #:s:&:S:S +%%%9;|:;}C,i%$fL]RQJGfwV![!EZ:fp}8 G'=/;)B3n|00T0p]06030nb3B7u8P_>m@CBCFe(P5J74Zx1oqs5<>oWWTW^-WdWZWTXRTb&3"l0R]k1`s=DTv<"(88K8lR8s8C8^8^ +```T4QU4R=S5`%s*(2g\$se)!H!p6_Q{T2nYJ3`Kl~}Oc::o: #:s:&:S:S +%%%9;|:;}C{9%$fL]RQJGfwV![!EZ:fp}8 G'=/;)Bnw|00T0p]060g0303 +EEEdeCNe^Uf%E 6&?P*r,6[6XDX;Tl\H!P+L(7yM{Xw Guu)u\ ucu5uLuL +ttt^{J {DNRGtq+*L8!@F+y`yMyzpKYT0n!X({gp.?m@^))3)zN)8);)K)K +888AK"7K[<B7u8P_>m@CBCFe(P5J74Zx1oqs5XZoWWTW^-WdWZWTXRTb&&>Wo=5G\f/I=:D xL;)Ov7R0VKW'*1A*lJqtt{tG"t/tltRtR +HHH~py;p4mm:HOARoYq+dAbdMXK>3"l0R]k1`s=DTvC-(88K8lR8s8C8^8^ +```T4QU4R==;`%s*(2g\$se)1Hzp6_Q{T2nYJ3`Kl~&vc::o: #:s:&:S:S +%%%9;|:;}C|,%$fL]RQJGfwVv[wEZ:fp}8 G'=/;)Bg]|00T0p]060g0303 +EEEdeCNe^UCfE 6&?P*r,6[6MD<;Tl\H!P+L(7yM{X5&Guu)u\ ucu5uLuL +ttt^{J {DNJNtq+*L8!@F+y` MBzpKYT0n!X({gp.?;C^))3)zN)8);)K)K +888AK"7K[<""8(`v .Gy `N]t,S[4I2pk8G/E{: U +edKK6KerKuK+KzKz +:::iofvoY}fO:cA~b!^aDA\.i*{^;"RKB7c-U r9%2w_;CCZCxgCbC_CwCw +000=TB7u8P_>m@IBfFe(P5J74Zx1oqs5<TXRTb&MZWo=5G\f/I=:D xL;)Ov7R0VKW'*1A*R"qtt{tG"t/tltRtR +HHH~py;p4m BHOARoYq+dAbdMXK>3"l0R]k1`s=DTv^A(88K8lR8s8C8^8^ +```T4QU4R=t=`%s*(2g\$se)1Hzp6_Q{T2nYJ3`Kl~Suc::o: #:s:&:S:S +%%%9;|:;}Ci|%$fL]RQJGfwVv[wEZ:fp}8 G'=/;)B3p|00T0p]060g0303 +EEEdeCNe^UIIE 6&?P*r,6[6MD<;Tl\H!P+L(7yM{Xw5Guu)u\ ucu5uLuL +ttt^{J {DNH tq+*L8!@F+y` MBzpKYT0n!X({gp.?mK^))3)zN)8);)K)K +888AK"7K[<-R8(`v .Gy `N]t,S[4I2pk8G/E{: U ssdKK6KerKuK+KzKz +:::iofvoY}Oi:cA~b!^aDA\.i*{^;"RKB7c-U r9%2k!;CCZCxgCbC_CwCw +000=TB7u8P_>m@IBfFe(P5J74Zx1oqs5&MoWWTW^-WdWZWTXRTb&RXWo=5G\f/I=:D xL;)Ov7R0VKW'*1A*NGqtt{tG"t/tltRtR +HHH~py;p4m; HOARoYq+dAbdMXK>3"l0R]k1`s=DTv"C(88K8lR8s8C8^8^ +```T4QU4R=UU`%s*(2g\$se)1Hzp6_Q{T2nYJ3`Kl~fSc::o: #:s:&:S:S +%%%9;|:;}C:a%$fL]RQJGfwVv[kEZ:fp}8 G'=/;)Bgg|00T0p]060g0303 +EEEdeCNe^UNdE 6&?P*r,6[6MD&;Tl\H!P+L(7yM{X5LGuu)u\ ucu5uLuL +ttt^{J {DN Ztq+*L8!@F+y` MmzpKYT0n!X({gp.?;m^))3)zN)8);)K)K +888AK"7K[<7l8(`v .Gy `N]t,=[4I2pk8G/E{: U +!dKK6KerKuK+KzKz +:::iofvoY}#&:cA~b!^aDA\.i*C^;"RKB7c-U r9%2_v;CCZCxgCbC_CwCw +000=TB7u8P_>m@IBUFe(P5J74Zx1oqs5ZRoWWTW^-WdWZWTXRTb&--Wo=5G\f/I=:D xw;)Ov7R0VKW'*1A*Rlqtt{tG"t/tltRtR +HHH~py;p4mf~HOARoYq+dAbdMXm>3"l0R]k1`s=DTv^^(88K8lR8s8C8^8^ +```T4QU4R=59`%s*(2g\$se)1Hsp6_Q{T2nYJ3`Kl~S}c::o: #:s:&:S:S +%%%9;|:;}Ca(%$fL]RQJGfwVv[kEZ:fp}8 G'=/;)B3<|00T0p]060g0303 +EEEdeCNe^Ud E 6&?P*r,6[6MD&;Tl\H!P+L(7yM{XL Guu)u\ ucu5uLuL +ttt^{J {DN^Rtq+*L8!@F+y` MmzpKYT0n!X({gp.?KB^))3)zN)8);)K)K +888AK"7K[B7u8P_>m@IBUFe(P5J74Zx1oqs5TXRTb&>^Wo=5G\f/I=:D xw;)Ov7R0VKW'*1A*NJqtt{tG"t/tltRtR +HHH~py;p4m:3"l0R]k1`s=DTv<-(88K8lR8s8C8^8^ +```T4QU4R=9S`%s*(2g\$se)1Hsp6_Q{T2nYJ3`Kl~}vc::o: #:s:&:S:S +%%%9;|:;}C~C%$fL]RQJGfwVv[kEZ:fp}8 G'=/;)Bn]|00T0p]060g0303 +EEEdeCNe^U%CE 6&?P*r,6[6MD&;Tl\H!P+L(7yM{Xw&Guu)u\ ucu5uLuL +ttt^{J {DNZHtq+*L8!@F+y` MmzpKYT0n!X({gp.?mC^))3)zN)8);)K)K +888AK"7K[<@78(`v .Gy `N]t,=[4I2pk8G/E{: U sedKK6KerKuK+KzKz +:::iofvoY}u#:cA~b!^aDA\.i*C^;"RKB7c-U r9%2!_;CCZCxgCbC_CwCw +000=TB7u8P_>m@IBUFe(P5J74Zx1oqs5XTXRTb&^&Wo=5G\f/I=:D x`;)Ov7R0VKW'*1A*lHqtt{tG"t/tltRtR +HHH~py;p4m5yHOARoYq+dAbdMX|>3"l0R]k1`s=DTvC7(88K8lR8s8C8^8^ +```T4QU4R=;t`%s*(2g\$se)1H!p6_Q{T2nYJ3`Kl~&#c::o: #:s:&:S:S +%%%9;|:;}C(:%$fL]RQJGfwVv[!EZ:fp}8 G'=/;)Bg=|00T0p]060g0303 +EEEdeCNe^Ua.E 6&?P*r,6[6MDX;Tl\H!P+L(7yM{X5NGuu)u\ ucu5uLuL +ttt^{J {DNG^tq+*L8!@F+y` MyzpKYT0n!X({gp.?;z^))3)zN)8);)K)K +888AK"7K[B7u8P_>m@IBCFe(P5J74Zx1oqs5<&oWWTW^-WdW<^-W< +uuu&)`j)[`5LuG$Xqvgd=$EkHmJV{=8\?a&_P4-l/RByOHHpH5fHGHBHmP ffHB +)))@3|B3'|;m)^f?{lqPUfh5-I"1Kr.0j%b!6cY-F*St%``4`;5`Y`!`S`S +KKKg6!&6L!+!KdP lQ|[~Pa7O%f8og!`2q["Wd|j\L{:$%%;%(a%x%,%{%{ +CCC,Z!]Z~!_vC;|2rf&?A|P#c}<:T1udv.ho\(N)}&f. EEeEa.E\E EfEf +WWW>TXRTbXZRWo=5G\f/I=:D x`;)Ov7R0VKW'*1A*R^qtt{tG"t/tltRtR +HHH~py;p4y3"l0R]k1`s=DTv^@(88K8lR8s8C8^8^ +```T4QU4RQ!T`%s*(2g\$se)1H!p6_Q{T2nYJ3`Kl~S c::o: #:s:&:S:S +%%%9;|:;}|,~%$fL]RQJGfwVv[!EZ:fp}8 G'=/;)Bng|00T0p]060g0303 +EEEdeCNe^C aE 6&?P*r,6[6MDX;Tl\H!P+L(7yM{XwLGuu)u\ ucu5uLuL +ttt^{J {DJRltq+*L8!@F+y` MyzpKYT0n!X({gp.?mm^))3)zN)8);)K)K +888AK"7K["^^8(`v .Gy `N]t,Q[4I2pk8G/E{: U s!dKK6KerKuK+KzKz +:::iofvoYfS}:cA~b!^aDA\.i*|^;"RKB7c-U r9%2kv;CCZCxgCbC_CwCw +000=TB7u8P_>m@IBCFe(P5J74Zx1oqs5&RoWWTW^-WdWZWTXRTbX3"l0R]k1`s=DTv"^(88K8lR8s8C8^8^ +```T4QU4RQ=!`%s*(2g\$se)&Hzp6_Q{T2nYJ3`Kl~&&c::o: #:s:&:S:S +%%%9;|:;}|C{%$fL]RQJGfwV][wEZ:fp}8 G'=/;)Bg3|00T0p]060g0303 +EEEdeCNe^CUUE 6&?P*r,6[6RD<;Tl\H!P+L(7yM{X5wGuu)u\ ucu5uLuL +ttt^{J {DJNJtq+*L8!@F+y`;MBzpKYT0n!X({gp.?;|^))3)zN)8);)K)K +888AK"7K["<-8(`v .Gy `N]U,S[4I2pk8G/E{: U +1dKK6KerKuK+KzKz +:::iofvoYf}v:cA~b!^aDA\.:*{^;"RKB7c-U r9%2_];CCZCxgCbC_CwCw +000=TB7u8P_>m@NBfFe(P5J74Zx1oqs5Z-oWWTW^-WdWZWTXRTbXX3"l0R]k1`s=DTv^<(88K8lR8s8C8^8^ +```T4QU4RQQQ`%s*(2g\$se)&Hzp6_Q{T2nYJ3`Kl~Sfc::o: #:s:&:S:S +%%%9;|:;}||i%$fL]RQJGfwV][wEZ:fp}8 G'=/;)B3c|00T0p]060g0303 +EEEdeCNe^CCNE 6&?P*r,6[6RD<;Tl\H!P+L(7yM{XLjGuu)u\ ucu5uLuL +ttt^{J {DJJ"tq+*L8!@F+y`;MBzpKYT0n!X({gp.?KN^))3)zN)8);)K)K +888AK"7K[""A8(`v .Gy `N]U,S[4I2pk8G/E{: U zgdKK6KerKuK+KzKz +:::iofvoYffu:cA~b!^aDA\.:*{^;"RKB7c-U r9%2wX;CCZCxgCbC_CwCw +000=TB7u8P_>m@NBfFe(P5J74Zx1oqs5<^oWWTW^-WdWZWTXRTbXMMWo=5G\f/I=:DjxL;)Ov7R0VKW'*1A*NHqtt{tG"t/tltRtR +HHH~py;p4y ;HOARoYq+dAbdBXK>3"l0R]k1`s=DTv<7(88K8lR8s8C8^8^ +```T4QU4RQt5`%s*(2g\$se)&Hzp6_Q{T2nYJ3`Kl~}#c::o: #:s:&:S:S +%%%9;|:;}|i9%$fL]RQJGfwV][wEZ:fp}8 G'=/;)Bn=|00T0p]060g0303 +EEEdeCNe^CI%E 6&?P*r,6[6RD<;Tl\H!P+L(7yM{XwNGuu)u\ ucu5uLuL +ttt^{J {DJHGtq+*L8!@F+y`;MBzpKYT0n!X({gp.?mz^))3)zN)8);)K)K +888AK"7K["7C8(`v .Gy `N]U,S[4I2pk8G/E{: U !+dKK6KerKuK+KzKz +:::iofvoYfvS:cA~b!^aDA\.:*{^;"RKB7c-U r9%2!w;CCZCxgCbC_CwCw +000=TB7u8P_>m@NBUFe(P5J74Zx1oqs5ZZoWWTW^-WdWZWTXRTbXR>Wo=5G\f/I=:Djxw;)Ov7R0VKW'*1A*l qtt{tG"t/tltRtR +HHH~py;p4y;:HOARoYq+dAbdBXm>3"l0R]k1`s=DTvCR(88K8lR8s8C8^8^ +```T4QU4RQU;`%s*(2g\$se)&Hsp6_Q{T2nYJ3`Kl~&ic::o: #:s:&:S:S +%%%9;|:;}|a,%$fL]RQJGfwV][kEZ:fp}8 G'=/;)Bgi|00T0p]060g0303 +EEEdeCNe^C.fE 6&?P*r,6[6RD&;Tl\H!P+L(7yM{X5\Guu)u\ ucu5uLuL +ttt^{J {DJ"Ntq+*L8!@F+y`;MmzpKYT0n!X({gp.?K;^))3)zN)8);)K)K +888AK"7K["R"8(`v .Gy `N]U,=[4I2pk8G/E{: U zzdKK6KerKuK+KzKz +:::iofvoYf#O:cA~b!^aDA\.:*C^;"RKB7c-U r9%2wk;CCZCxgCbC_CwCw +000=TB7u8P_>m@NBUFe(P5J74Zx1oqs5TXRTbX>ZWo=5G\f/I=:Djxw;)Ov7R0VKW'*1A*RZqtt{tG"t/tltRtR +HHH~py;p4y~BHOARoYq+dAbdBXm>3"l0R]k1`s=DTv^l(88K8lR8s8C8^8^ +```T4QU4RQT=`%s*(2g\$se)&Hsp6_Q{T2nYJ3`Kl~}&c::o: #:s:&:S:S +%%%9;|:;}|9|%$fL]RQJGfwV][kEZ:fp}8 G'=/;)Bn3|00T0p]060g0303 +EEEdeCNe^CdIE 6&?P*r,6[6RD&;Tl\H!P+L(7yM{XwwGuu)u\ ucu5uLuL +ttt^{J {DJ^ tq+*L8!@F+y`;MmzpKYT0n!X({gp.?m|^))3)zN)8);)K)K +888AK"7K["AR8(`v .Gy `N]U,=[4I2pk8G/E{: U s1dKK6KerKuK+KzKz +:::iofvoYfii:cA~b!^aDA\.:*C^;"RKB7c-U r9%2k];CCZCxgCbC_CwCw +000=TB7u8P_>m@NBUFe(P5J74Zx1oqs5&-oWWTW^-WdWZWTXRTbXcXWo=5G\f/I=:Djxw;)Ov7R0VKW'*1A*JRqtt{tG"t/tRtNsR"GHZtR +HHH~py;p4y: HOARoYq+dAbdBX|>3"l0R]k1`s=DTvCC(88K8lR8s8C8^8^ +```T4QU4RQ9U`%s*(2g\$se)&H!p6_Q{T2nYJ3`Kl~&Sc::o: #:s:&:S:S +%%%9;|:;}|~a%$fL]RQJGfwV][!EZ:fp}8 G'=/;)Bgn|00T0p]060g0303 +EEEdeCNe^C%dE 6&?P*r,6[6RDX;Tl\H!P+L(7yM{X5`Guu)u\ ucu5uLuL +ttt^{J {DJZZtq+*L8!@F+y`;MyzpKYT0n!X({gp.?;M^))3)zN)8);)K)K +888AK"7K["@l8(`v .Gy `N]U,Q[4I2pk8G/E{: U +&dKK6KerKuK+KzKz +:::iofvoYf &:cA~b!^aDA\.:*|^;"RKB7c-U r9%2_g;CCZCxgCbC_CwCw +000=TB7u8P_>m@NBCFe(P5J74Zx1oqs5Z>oWWTW^-WdWZWTXRTbX^-Wo=5G\f/I=:Djx`;)Ov7R0VKW'*1A*RNqtt{tG"t/tltRtR +HHH~py;p4y5~HOARoYq+dAbdBX|>3"l0R]k1`s=DTv^"(88K8lR8s8C8^8^ +```T4QU4RQ;9`%s*(2g\$se)&H!p6_Q{T2nYJ3`Kl~SOc::o: #:s:&:S:S +%%%9;|:;}|((%$fL]RQJGfwV][!EZ:fp}8 G'=/;)B3w|00T0p]060g0303 +EEEdeCNe^I E 6&?P*r,6[6RDX;Tl\H!P+L(7yM{XL Guu)u\ ucu5uLuL +ttt^{J {DHlRtq+*L8!@F+y`;MyzpKYT0n!X({gp.?K@^))3)zN)8);)K)K +888AK"7K[-C<8(`v .Gy `N]U,Q[4I2pk8G/E{: U zfdKK6KerKuKzKsSss+sfKz +:::iofvoYO&f:cA~b!^aDA\.:*|^;"RKB7c-U r9%2wx;CCZCxgCbCwCkKvg!]XCw +000=TB7u8P_>m@NBCFe(P5J74Zx1oqs5&ZoWWTW^-WdWZWTXRTbMZ^Wo=5G\f/I=:Djx`;)Ov7R0VKW'*1A*N qtt{tG"t/tltRtR +HHH~py;p4 B3"l0R]k1`s=DTvB7u8P_>m@.BfFe(P5J74Zx1oqs5ZTXRTbM&&Wo=5G\f/I=:D xL;)Ov7R0VKW'*1A*l"qtt{tG"t/tltRtR +HHH~py;p4 myHOARoYq+dAbdNXK>3"l0R]k1`s=DTvCA(88K8lR8s8C8^8^ +```T4QU4Rt=t`%s*(2g\$se)rHzp6_Q{T2nYJ3`Kl~&uc::o: #:s:&:S:S +%%%9;|:;}iC:%$fL]RQJGfwVg[wEZ:fp}8 G'=/;)Bgp|00T0p]060g0303 +EEEdeCNe^IU.E 6&?P*r,6[6-D<;Tl\H!P+L(7yM{XL5Guu)u\ ucu5uLuL +ttt^{J {DHN^tq+*L8!@F+y`fMBzpKYT0n!X({gp.?KK^))3)zN)8);)K)K +888AK"7K[-<@8(`v .Gy `N]5,S[4I2pk8G/E{: U zsdKK6KerKuK+KzKz +:::iofvoYO} :cA~b!^aDA\.a*{^;"RKB7c-U r9%2w!;CCZCxgCbC_CwCw +000=TB7u8P_>m@.BfFe(P5J74Zx1oqs5TXRTbMXRWo=5G\f/I=:D xL;)Ov7R0VKW'*1A*RGqtt{tG"t/tltRtR +HHH~py;p4 yfHOARoYq+dAbdNXK>3"l0R]k1`s=DTvB7u8P_>m@.BfFe(P5J74Zx1oqs5&>oWWTW^-WdWZWTXRTbMMcWo=5G\f/I=:D xw;)Ov7R0VKW'*1A*llqtt{tG"t/tltRtR +HHH~py;p4 5HOARoYq+dAbdNXm>3"l0R]k1`s=DTvC^(88K8lR8s8C8^8^ +```T4QU4RtU!`%s*(2g\$se)rHsp6_Q{T2nYJ3`Kl~&}c::o: #:s:&:S:S +%%%9;|:;}i:{%$fL]RQJGfwVg[kEZ:fp}8 G'=/;)Bg<|00T0p]060g0303 +EEEdeCNe^INUE 6&?P*r,6[6-D&;Tl\H!P+L(7yM{X5 Guu)u\ ucu5uLuL +ttt^{J {DH Jtq+*L8!@F+y`fMmzpKYT0n!X({gp.?;B^))3)zN)8);)K)K +888AK"7K[-7-8(`v .Gy `N]5,=[4I2pk8G/E{: U +rdKK6KerKuK+KzKz +:::iofvoYOvv:cA~b!^aDA\.a*C^;"RKB7c-U r9%2_,;CCZCxgCbC_CwCw +000=TB7u8P_>m@.BUFe(P5J74Zx1oqs5ZcoWWTW^-WdWZWTXRTbM-3"l0R]k1`s=DTv^-(88K8lR8s8C8^8^ +```T4QU4Rt5Q`%s*(2g\$se)rHsp6_Q{T2nYJ3`Kl~Svc::o: #:s:&:S:S +%%%9;|:;}iai%$fL]RQJGfwVg[kEZ:fp}8 G'=/;)B3]|00T0p]060g0303 +EEEdeCNe^I.NE 6&?P*r,6[6-D&;Tl\H!P+L(7yM{XL&Guu)u\ ucu5uLuL +ttt^{J {DH""tq+*L8!@F+y`fMmzpKYT0n!X({gp.?KC^))3)zN)8);)K)K +888AK"7K[-RA8(`v .Gy `N]5,=[4I2pk8G/E{: U zedKK6KerKuK+KzKz +:::iofvoYO#u:cA~b!^aDA\.a*C^;"RKB7c-U r9%2k_;CCZCxgCbC_CwCw +000=TB7u8P_>m@.BUFe(P5J74Zx1oqs5&TXRTbM>MWo=5G\f/I=:D xw;)Ov7R0VKW'*1A*N"qtt{tG"t/tltRtR +HHH~py;p4 ~;HOARoYq+dAbdNXm>3"l0R]k1`s=DTvB7u8P_>m@.BCFe(P5J74Zx1oqs5Z&oWWTW^-WdWZWTXRTbMc>Wo=5G\f/I=:D x`;)Ov7R0VKW'*1A*l^qtt{tG"t/tltRtR +HHH~py;p4 ::HOARoYq+dAbdNX|>3"l0R]k1`s=DTvC@(88K8lR8s8C8^8^ +```T4QU4Rt9;`%s*(2g\$se)rH!p6_Q{T2nYJ3`Kl~& c::o: #:s:&:S:S +%%%9;|:;}i(,%$fL]RQJGfwVg[!EZ:fp}8 G'=/;)B3g|00T0p]060g0303 +EEEdeCNe^IafE 6&?P*r,6[6-DX;Tl\H!P+L(7yM{XLLGuu)u\ ucu5uLuL +ttt^{J {DHGNtq+*L8!@F+y`fMyzpKYT0n!X({gp.?Km^))3)zN)8);)K)K +888AK"7K[-l"8(`v .Gy `N]5,Q[4I2pk8G/E{: U z!dKK6KerKuK+KzKz +:::iofvoYO O:cA~b!^aDA\.a*|^;"RKB7c-U r9%2wv;CCZCxgCbC_CwCw +000=TB7u8P_>m@.BCFe(P5J74Zx1oqs5TXRTbRZZWo=5G\f/I=:D x`;)Ov7R0VKW'*1A*Nlqtt{tG"t/tltRtR +HHH~py;p4;3"l0R]k1`s=DTv<^(88K8lR8s8C8^8^ +```T4QU4RU!=`%s*(2g\$se)rH!p6_Q{T2nYJ3`Kl~}}c::o: #:s:&:S:S +%%%9;|:;}:,|%$fL]RQJGfwVg[!EZ:fp}8 G'=/;)Bn<|00T0p]060g0303 +EEEdeCNe^N IE 6&?P*r,6[6-DX;Tl\H!P+L(7yM{Xw Guu)u\ ucu5uLuL +ttt^{J {D l tq+*L8!@F+y`fMyzpKYT0n!X({gp.?mB^))3)zN)8);)K)K +888AK"7K[7CR8(`v .Gy `N]5,Q[4I2pk8G/E{: U srdKK6KerKuK+KzKz +:::iofvoYv&i:cA~b!^aDA\.a*|^;"RKB7c-U r9%2k,;CCZCxgCbC_CwCw +000=TB7u8P_>m@.BCFe(P5J74Zx1oqs5&coWWTW^-WdWZWTX-Tb3 -2 Zs-lq=C<(88K8C8s8C8^8^ +```T4Q54RQ`%s*(2g\$se)zHsp69Vc9A3VQ|`&fc::o:&:s:&:S:S +%%%9;|a;}i%$fL]RQJGfwVw[kEZS4aSy=4f&/gc|00T0g060g0303 +EEEdeC.e^NE 6&?P*r,6[6B7u8P_>m@fBUFe23j2b13P*oZ^oWWTWZWdWZWTX-Tb3 -2 Zs-lq=^7(88K8C8s8C8^8^ +```T4Q54RS5`%s*(2g\$se)zH!p69Vc9A3VQ|`&&c::o:&:s:&:S:S +%%%9;|a;}{9%$fL]RQJGfwVw[!EZS4aSy=4f&/g3|00T0g060g0303 +EEEdeC.e^f%E 6&?P*r,6[6B7u8P_>m@fBCFe23j2b13P*oZ-oWWTWZWdWZWTX-Tb&>Wo=5G\f/I=:DLx`;)bJkb2'Jvg*RRqtt{tlt/tltRtR +HHH~pyfp4m:HOARoYq+dAbdKX|>3 -2 Zs-lq=^<(88K8C8s8C8^8^ +```T4Q54R=;`%s*(2g\$se)zH!p69Vc9A3VQ|`Sfc::o:&:s:&:S:S +%%%9;|a;}|,%$fL]RQJGfwVw[!EZS4aSy=4f&/3c|00T0g060g0303 +EEEdeC.e^CfE 6&?P*r,6[6B7u8P_>m@UBUFe23j2b13P*oZXoWWTWZWdWZWTX-TbMZWo=5G\f/I=:Dwxw;)bJkb2'Jvg*lZqtt{tlt/tltRtR +HHH~pyfp4 BHOARoYq+dAbdmXm>3 -2 Zs-lq=Cl(88K8C8s8C8^8^ +```T4Q54Rt=`%s*(2g\$se)sHsp69Vc9A3VQ|`S&c::o:&:s:&:S:S +%%%9;|a;}i|%$fL]RQJGfwVk[kEZS4aSy=4f&/33|00T0g060g0303 +EEEdeC.e^IIE 6&?P*r,6[6&D&;TKYBK07Y\fyLwGuu)u5ucu5uLuL +ttt^{J"{DH tq+*L8!@F+y`mMmzpW#SWi{#YqgK|^))3);)8);)K)K +888AK"RK[-R8(`v .Gy `N]=,=[4wWxwi{W2g:z1dKK6K+KuK+KzKz +:::iof#oYOi:cA~b!^aDA\.C*C^;1/N1A /RQrw];CCZC_CbC_CwCw +000=T<]T~ci0|>B7u8P_>m@UBCFe23j2b13P*oZZoWWTWZWdWZWTX-TbRXWo=5G\f/I=:Dwx`;)bJkb2'Jvg*l qtt{tlt/tltRtR +HHH~pyfp4; HOARoYq+dAbdmX|>3 -2 Zs-lq=CR(88K8C8s8C8^8^ +```T4Q54RUU`%s*(2g\$se)sH!p69Vc9A3VQ|`&ic::o:&:s:&:S:S +%%%9;|a;}:a%$fL]RQJGfwVk[!EZS4aSy=4f&/gi|00T0g060g0303 +EEEdeC.e^NdE 6&?P*r,6[6&DX;TKYBK07Y\fy5\Guu)u5ucu5uLuL +ttt^{J"{D Ztq+*L8!@F+y`mMyzpW#SWi{#YqgK;^))3);)8);)K)K +888AK"RK[7l8(`v .Gy `N]=,Q[4wWxwi{W2g:zzdKK6K+KuK+KzKz +:::iof#oY#&:cA~b!^aDA\.C*|^;1/N1A /RQrwk;CCZC_CbC_CwCw +000=T<]T~]30|>B7u8P_>m@UBCFe23j2b13P*oTX-Tb--Wo=5G\f/I=:D`xL;)bJkb2'Jvg*lNqtt{tR"t/tltRtR +HHH~pyfp4f~HOARoYq+dAbd|XK>3 -2 Zs-lq=C"(88K8C8s8C8^8^ +```T4Q54R59`%s*(2g\$se)!Hzp69Vc9A3VQ|`&Oc::o:&:s:&:S:S +%%%9;|a;}a(%$fL]RQJGfwV![wEZS4aSy=4f&/gw|00T0g060g0303 +EEEdeC.e^d E 6&?P*r,6[6XD<;TKYBK07Y\fy5 Guu)u5ucu5uLuL +ttt^{J"{D^Rtq+*L8!@F+y`yMBzpW#SWi{#Yqg;@^))3);)8);)K)K +888AK"RK[A<8(`v .Gy `N]Q,S[4wWxwi{W2g:+fdKK6K+KuK+KzKz +:::iof#oYif:cA~b!^aDA\.|*{^;1/N1A /RQr_x;CCZC_CbC_CwCw +000=T<]T~=c0|>B7u8P_>m@CBfFe23j2b13P*oTX-Tb>^Wo=5G\f/I=:D`xL;)bJkb2'Jvg*R qtt{tR"t/tltRtR +HHH~pyfp4:3 -2 Zs-lq=CC(88K8C8s8C8^8^ +```T4Q54R9S`%s*(2g\$se)!Hsp69Vc9A3VQ|`&Sc::o:&:s:&:S:S +%%%9;|a;}~C%$fL]RQJGfwV![kEZS4aSy=4f&/gn|00T03]060g0303 +EEEdeC.e^%CE 6&?P*r,6[6XD&;TKYBK07Y\fy5`Guu)uL ucu5uLuL +ttt^{J"{DZHtq+*L8!@F+y`yMmzpW#SWi{#Yqg;M^))3)KN)8);)K)K +888AK"RK[@78(`v .Gy `N]Q,=[4wWxwi{W2g:+&dKK6KzrKuK+KzKz +:::iof#oYu#:cA~b!^aDA\.|*C^;1/N1A /RQr_g;CCZCwgCbC_CwCw +000=T<]T~i=0|>B7u8P_>m@CBUFe23j2b13P*oZ>oWWTW<-WdWZWTX-Tb^&Wo=5G\f/I=:D`xw;)bJkb2'Jvg*RNqtt{tlt/tltRtR +HHH~pyfp45yHOARoYq+dAbd|Xm>3 -2 Zs-lq=^"(88K8C8s8C8^8^ +```T4Q54R;t`%s*(2g\$se)!Hsp69Vc9A3VQ|`SOc::o:&:s:&:S:S +%%%9;|a;}(:%$fL]RQJGfwV![kEZS4aSy=4f&/3w|00T0g060g0303 +EEEdeC.e^a.E 6&?P*r,6[6XDX;TKYBK07Y\fy55Guu)u5ucu5uLuL +ttt^{J"{DG^tq+*L8!@F+y`yMyzpW#SWi{#Yqg;K^))3)KN)8);)K)K +888AK"RK[l@8(`v .Gy `N]Q,Q[4wWxwi{W2g:+sdKK6KzrKuK+KzKz +:::iof#oY :cA~b!^aDA\.|*|^;1/N1A /RQr_!;CCZCwgCbC_CwCw +000=T<]T~3gg0|>B7u8P_>m@CBCFe23j2b13P*oZMoWWTW<-WdWZWTX-Tb3 -2 Zs-lq=^C(88K8^R8s8C8^8^ +```T4Q54RS!T`%s*(2g\$se)!H!p69Vc9A3VQ|`SSc::o:S#:s:&:S:S +%%%9;|a;}{,~%$fL]RQJGfwV![!EZS4aSy=4f&/3n|00T03]060g0303 +EEEdeC.e^f aE 6&?P*r,6[6XDX;TKYBK07Y\fyL`Guu)uL ucu5uLuL +ttt^{J"{DRRltq+*L8!@F+y`yMyzpW#SWi{#YqgKM^))3)KN)8);)K)K +888AK"RK[^^^8(`v .Gy `N]Q,Q[4wWxwi{W2g:z&dKK6KzrKuK+KzKz +:::iof#oYSS}:cA~b!^aDA\.i*{^;1/N1A /RQr__;CCZC_CbC_CwCw +000=T<]T~33<0|>B7u8P_>m@IBfFe23j2b13P*oZTX-Tb<3 -2 Zs-lq=CA(88K8^R8s8C8^8^ +```T4Q54RS=!`%s*(2g\$se)1Hzp69Vc9A3VQ|`&uc::o:S#:s:&:S:S +%%%9;|a;}{C{%$fL]RQJGfwVv[wEZS4aSy=4f&/gp|00T0g060g0303 +EEEdeC.e^fUUE 6&?P*r,6[6MD<;TKYBK07Y\fyL5Guu)u5ucu5uLuL +ttt^{J"{DRNJtq+*L8!@F+y` MBzpW#SWi{#YqgKK^))3);)8);)K)K +888AK"RK[^<-8(`v .Gy `N]t,S[4wWxwi{W2g:zsdKK6K+KuK+KzKz +:::iof#oYS}v:cA~b!^aDA\.i*{^;1/N1A /RQrw!;CCZC_CbC_CwCw +000=T<]T~3n]0|>B7u8P_>m@IBfFe23j2b13P*oTX-Tb3 -2 Zs-lq=C-(88K8C8s8C8^8^ +```T4Q54RSQQ`%s*(2g\$se)1Hsp69Vc9A3VQ|`&vc::o:&:s:&:S:S +%%%9;|a;}{|i%$fL]RQJGfwVv[kEZS4aSy=4f&/g]|00T03]060g0303 +EEEdeC.e^fCNE 6&?P*r,6[6MD&;TKYBK07Y\fy5&Guu)uL ucu5uLuL +ttt^{J"{DRJ"tq+*L8!@F+y` MmzpW#SWi{#Yqg;C^))3);)8);)K)K +888AK"RK[^"A8(`v .Gy `N]t,=[4wWxwi{W2g:+edKK6K+KuK+KzKz +:::iof#oYSfu:cA~b!^aDA\.i*C^;1/N1A /RQrw_;CCZC_CbC_CwCw +000=T<]T~3B7u8P_>m@IBUFe23j2b13P*o<TX-Tb3 -2 Zs-lq=C^(88K8C8s8C8^8^ +```T4Q54RSt5`%s*(2g\$se)1H!p69Vc9A3VQ|`&}c::o:&:s:&:S:S +%%%9;|a;}{i9%$fL]RQJGfwVv[!EZS4aSy=4f&/g<|00T0g060g0303 +EEEdeC.e^fI%E 6&?P*r,6[6MDX;TKYBK07Y\fy5 Guu)u5ucu5uLuL +ttt^{J"{DRHGtq+*L8!@F+y` MyzpW#SWi{#Yqg;B^))3)KN)8);)K)K +888AK"RK[^7C8(`v .Gy `N]t,Q[4wWxwi{W2g:+rdKK6KzrKuK+KzKz +:::iof#oYSvS:cA~b!^aDA\.i*|^;1/N1A /RQr_,;CCZC_CbC_CwCw +000=T<]T~3wn0|>B7u8P_>m@IBCFe23j2b13P*oZcoWWTWZWdWZWTX-TbWo=5G\f/I=:D x`;)bJkb2'Jvg*RJqtt{tlt/tltRtR +HHH~pyfp4B;:HOARoYq+dAbdMX|>3 -2 Zs-lq=^-(88K8C8s8C8^8^ +```T4Q54RSU;`%s*(2g\$se)1H!p69Vc9A3VQ|`Svc::o:S#:s:&:S:S +%%%9;|a;}{a,%$fL]RQJGfwV][wEZS4aSy=4f&/gg|00T0g060g0303 +EEEdeC.e^f.fE 6&?P*r,6[6RD<;TKYBK07Y\fy5LGuu)u5ucu5uLuL +ttt^{J"{DR"Ntq+*L8!@F+y`;MBzpW#SWi{#Yqg;m^))3);)8);)K)K +888AK"RK[^R"8(`v .Gy `N]U,S[4wWxwi{W2g:+!dKK6K+KuK+KzKz +:::iof#oYS#O:cA~b!^aDA\.:*{^;1/N1A /RQr_v;CCZC_CbC_CwCw +000=T<]T~3]w0|>B7u8P_>m@NBfFe23j2b13P*oZRoWWTWZWdWZWTX-Tb<>ZWo=5G\f/I=:DjxL;)bJkb2'Jvg*Rlqtt{tlt/tltRtR +HHH~pyfp4B~BHOARoYq+dAbdBXK>3 -2 Zs-lq=^^(88K8C8s8C8^8^ +```T4Q54RST=`%s*(2g\$se)&Hzp69Vc9A3VQ|`S}c::o:&:s:&:S:S +%%%9;|a;}{9|%$fL]RQJGfwV][wEZS4aSy=4f&/3<|00T0g060g0303 +EEEdeC.e^fdIE 6&?P*r,6[6RD<;TKYBK07Y\fyL Guu)u5ucu5uLuL +ttt^{J"{DR^ tq+*L8!@F+y`;MBzpW#SWi{#YqgKB^))3);)8);)K)K +888AK"RK[^AR8(`v .Gy `N]U,=[4wWxwi{W2g:++dKK6K+KuK+KzKz +:::iof#oYSii:cA~b!^aDA\.:*C^;1/N1A /RQr_w;CCZC_CbC_CwCw +000=T<]T~3=i0|>B7u8P_>m@NBUFe23j2b13P*oZ&oWWTWZWdWZWTX-Tb3 -2 Zs-lq=C@(88K8C8s8C8^8^ +```T4Q54RS9U`%s*(2g\$se)&Hsp69Vc9A3VQ|`& c::o:&:s:&:S:S +%%%9;|a;}{~a%$fL]RQJGfwV][kEZS4aSy=4f&/3g|00T0g060g0303 +EEEdeC.e^f%dE 6&?P*r,6[6RD&;TKYBK07Y\fyLLGuu)u5ucu5uLuL +ttt^{J"{DRZZtq+*L8!@F+y`;MmzpW#SWi{#YqgKm^))3);)8);)K)K +888AK"RK[^@l8(`v .Gy `N]U,=[4wWxwi{W2g:z!dKK6K+KuK+KzKz +:::iof#oYS &:cA~b!^aDA\.:*C^;1/N1A /RQrwv;CCZC_CbC_CwCw +000=T<]T~3p30|>B7u8P_>m@NBUFe23j2b13P*oTX-Tb<^-Wo=5G\f/I=:Djx`;)bJkb2'Jvg*lHqtt{tlt/tltRtR +HHH~pyfp4B5~HOARoYq+dAbdBX|>3 -2 Zs-lq=C7(88K8^R8s8C8^8^ +```T4Q54RS;9`%s*(2g\$se)&H!p69Vc9A3VQ|`&#c::o:&:s:&:S:S +%%%9;|a;}{((%$fL]RQJGfwV][!EZS4aSy=4f&/g=|00T0g060g0303 +EEEdeC.e^U E 6&?P*r,6[6RDX;TKYBK07Y\fy5NGuu)u5ucu5uLuL +ttt^{J"{DNlRtq+*L8!@F+y`;MyzpW#SWi{#Yqg;z^))3)KN)8);)K)K +888AK"RK[B7u8P_>m@NBCFe23j2b13P*o<&oWWTWZWdWZWTX-Tb&Z^Wo=5G\f/I=:D xL;)bJkb2'Jvg*lRqtt{tlt/tltRtR +HHH~pyfp4mB3 -2 Zs-lq=C<(88K8C8s8C8^8^ +```T4Q54R=SS`%s*(2g\$se)rHzp69Vc9A3VQ|`&fc::o:&:s:&:S:S +%%%9;|a;}C{C%$fL]RQJGfwVg[wEZS4aSy=4f&/gc|00T0g060g0303 +EEEdeC.e^UfCE 6&?P*r,6[6-D<;TKYBK07Y\fy5jGuu)u5ucu5uLuL +ttt^{J"{DNRHtq+*L8!@F+y`fMBzpW#SWi{#Yqg;N^))3);)8);)K)K +888AK"RK[<^78(`v .Gy `N]5,S[4wWxwi{W2g:+gdKK6K+KuK+KzKz +:::iof#oY}S#:cA~b!^aDA\.a*{^;1/N1A /RQr_X;CCZC_CbC_CwCw +000=T<]T~n3=0|>B7u8P_>m@.BfFe23j2b13P*oZ^oWWTWZWdWZWTX-Tb&&&Wo=5G\f/I=:D xL;)bJkb2'Jvg*RHqtt{tlt/tltRtR +HHH~pyfp4mmyHOARoYq+dAbdNXK>3 -2 Zs-lq=^7(88K8C8s8C8^8^ +```T4Q54R==t`%s*(2g\$se)rHsp69Vc9A3VQ|`&&c::o:&:s:&:S:S +%%%9;|a;}CC:%$fL]RQJGfwVg[kEZS4aSy=4f&/g3|00T0g060g0303 +EEEdeC.e^UU.E 6&?P*r,6[6-D&;TKYBK07Y\fy5wGuu)u5ucu5uLuL +ttt^{J"{DNN^tq+*L8!@F+y`fMmzpW#SWi{#Yqg;|^))3);)8);)K)K +888AK"RK[<<@8(`v .Gy `N]5,=[4wWxwi{W2g:+1dKK6K+KuK+KzKz +:::iof#oY}} :cA~b!^aDA\.a*C^;1/N1A /RQr_];CCZC_CbC_CwCw +000=T<]T~nB7u8P_>m@.BUFe23j2b13P*oZ-oWWTWZWdWZWTX-Tb&XRWo=5G\f/I=:D xw;)bJkb2'Jvg*RRqtt{tlt/tltRtR +HHH~pyfp4myfHOARoYq+dAbdNXm>3 -2 Zs-lq=^<(88K8C8s8C8^8^ +```T4Q54R=QT`%s*(2g\$se)rHsp69Vc9A3VQ|`Sfc::o:&:s:&:S:S +%%%9;|a;}C|~%$fL]RQJGfwVg[kEZS4aSy=4f&/3c|00T0g060g0303 +EEEdeC.e^UCaE 6&?P*r,6[6-D&;TKYBK07Y\fyLjGuu)u5ucu5uLuL +ttt^{J"{DNHltq+*L8!@F+y`fMyzpW#SWi{#Yqg;;^))3);)8);)K)K +888AK"RK[<-^8(`v .Gy `N]5,Q[4wWxwi{W2g:+zdKK6K+KuK+KzKz +:::iof#oY}O}:cA~b!^aDA\.a*|^;1/N1A /RQr_k;CCZC_CbC_CwCw +000=T<]T~nc<0|>B7u8P_>m@.BCFe23j2b13P*oZXoWWTWZWdWZWTX-Tb&McWo=5G\f/I=:D x`;)bJkb2'Jvg*lZqtt{tlt/tltRtR +HHH~pyfp4m 5HOARoYq+dAbdNX|>3 -2 Zs-lq=Cl(88K8C8s8C8^8^ +```T4Q54R=U!`%s*(2g\$se)rH!p69Vc9A3VQ|`S&c::o:&:s:&:S:S +%%%9;|a;}C:{%$fL]RQJGfwVg[!EZS4aSy=4f&/33|00T0g060g0303 +EEEdeC.e^UNUE 6&?P*r,6[6-DX;TKYBK07Y\fyLwGuu)u5ucu5uLuL +ttt^{J"{DN Jtq+*L8!@F+y`fMyzpW#SWi{#YqgK|^))3);)8);)K)K +888AK"RK[<7-8(`v .Gy `N]5,Q[4wWxwi{W2g:z1dKK6K+KuK+KzKz +:::iof#oY}vv:cA~b!^aDA\.a*|^;1/N1A /RQrw];CCZC_CbC_CwCw +000=Tc3T~g0|>B7u8P_>m@fBUFe23j2b*3JoHfB1YZZoWWTWcZWdWZWTM3 -2 Zq-R=0GdS_CC(88K8@C8s8C8^8^ +```T4tS4RT`%s*(2g\$se)sH!p69Vc9A|VT``^pCV&Sc::o:u&:s:&:S:S +%%%9;i{;}~%$fL]RQJGfwV![wEZS4aSy&4}/d89+zgg|00T0ig060g0303 +EEEdeIfe^aE 6&?P*r,6[6XD<;TKYBK0fY!y7gkIJ5LGuu)uN5ucu5uLuL +ttt^{HR{DRltq+*L8!@F+y`yMmzpW#SWiq#0g0q2&-;;^))3)C;)8);)K)K +888AK-^K[^^8(`v .Gy `N]Q,=[4wWxwigWk:{|cjV+zdKK6Kf+KuK+KzKz +:::ioOSoYS}:cA~b!^aDA\.|*|^;1/N1AQ/Brp&ad4__;CCZCX_CbC_CwCw +000=Tc3T~3<0|>B7u8P_>m@CBCFe23j2b*3JoHfB1YZTM3 -2 Zq-R=0GdS_C^(88K8@C8s8C8^8^ +```T4tS4R=!`%s*(2g\$se)&Hzp69Vc9A|VT``^pCV&&c::o:u&:s:&:S:S +%%%9;i{;}C{%$fL]RQJGfwV][wEZS4aSy&4}/d89+zg3|00T0ig060g0303 +EEEdeIfe^UUE 6&?P*r,6[6RD&;TKYBK0fY!y7gkIJ55Guu)uN5ucu5uLuL +ttt^{HR{DNJtq+*L8!@F+y`;MmzpW#SWiq#0g0q2&-;K^))3)C;)8);)K)K +888AK-^K[<-8(`v .Gy `N]U,Q[4wWxwigWk:{|cjV++dKK6Kf+KuK+KzKz +:::ioOSoY}v:cA~b!^aDA\.:*|^;1/N1AQ/Brp&ad4_w;CCZCX_CbC_CwCw +000=Tc3T~n]0|>B7u8P_>m@.BfFe23j2b*3JoHfB1YZZoWWTWcZWdWZWTM3 -2 Z sw0qq2&-;;^))3)C;)8);)K)K +888AK-B7u8P_>m@UBUFe23j2b21X5**jk3 EEeE% E\E EfEf +WWW>TM&TbRWo=5G\f/I=:Dwxw;)bJkb2b'-7ggkIJ5LGuu)uN5ucu5uLuL +ttt^{HN{D"tq+*L8!@F+y`mMyzpW#SWiW{ITqqS?#<3 -2 Z sw0qq2&-;K^))3)C;)8);)K)K +888AK-B7u8P_>m@IBUFe23j2b21X5**jk3 f EEeE% E\E EfEf +WWW>TM&Tb3 -2 Z sw0qq2&-;;^))3)C;)8);)K)K +888AK-B7u8P_>m@.BCFe23j2b21X5**jk3 EEeE% E\E EfEf +WWW>TM&TbX3 -2 Zsw0qq2&-;K^))3)C;)8);)K)K +888AK-"K[@8(`v .Gy `N]Q,S[4wWxwi{#pggx|W!!%``4`9!`Y`!`S`S +KKKg61!6LeKdP lQ|[~Pa7f%S8o*Vp*9d0`^^pCV&Sc::o:u&:s:&:S:S +%%%9;i|;}{,%$fL]RQJGfwV![kEZS4aSy=Mp&&ad4__;CCZCX_CbC_CwCw +000=TcB7u8P_>m@CBUFe23j2b1X5**jk3 f EEeE% E\E EfEf +WWW>TMXTb<&Wo=5G\f/I=:D`x`;)bJkb2'-7ggkIJ55Guu)uN5ucu5uLuL +ttt^{HJ{DRJtq+*L8!@F+y`yMyzpW#SWi{ITqqS?#3 -2 Zsw0qq2&-;;^))3)C;)8);)K)K +888AK-"K[<^8(`v .Gy `N]U,S[4wWxwi{#pggx|W!S%``4`9!`Y`!`S`S +KKKg61!6LssKdP lQ|[~Pa7v%}8o*Vp*9d0`^^pCV&&c::o:u&:s:&:S:S +%%%9;i|;}C|%$fL]RQJGfwV][kEZS4aSy=Mp&&ad4_w;CCZCX_CbC_CwCw +000=TcB7u8P_>m@NBCFe23j2b1X5**jk3 EEeE% E\E EfEf +WWW>TMXTb&RWo=5G\f/I=:Djx`;)bJkb2'-7ggkIJ5LGuu)uN5ucu5uLuL +ttt^{HJ{DN"tq+*L8!@F+y`fMBzpW#SWi{ITqqS?#<" +set_global_assignment -name VERILOG_INPUT_VERSION Verilog_2001 +set_global_assignment -name VHDL_INPUT_VERSION VHDL_1993 +set_global_assignment -name FAMILY -value "Cyclone V" +set_global_assignment -name TRUE_WYSIWYG_FLOW Off +set_global_assignment -name SMART_COMPILE_IGNORES_TDC_FOR_STRATIX_PLL_CHANGES Off +set_global_assignment -name STATE_MACHINE_PROCESSING Auto +set_global_assignment -name SAFE_STATE_MACHINE Off +set_global_assignment -name EXTRACT_VERILOG_STATE_MACHINES On +set_global_assignment -name EXTRACT_VHDL_STATE_MACHINES On +set_global_assignment -name IGNORE_VERILOG_INITIAL_CONSTRUCTS Off +set_global_assignment -name VERILOG_CONSTANT_LOOP_LIMIT 5000 +set_global_assignment -name VERILOG_NON_CONSTANT_LOOP_LIMIT 250 +set_global_assignment -name INFER_RAMS_FROM_RAW_LOGIC On +set_global_assignment -name PARALLEL_SYNTHESIS On +set_global_assignment -name DSP_BLOCK_BALANCING Auto +set_global_assignment -name MAX_BALANCING_DSP_BLOCKS "-1 (Unlimited)" +set_global_assignment -name NOT_GATE_PUSH_BACK On +set_global_assignment -name ALLOW_POWER_UP_DONT_CARE On +set_global_assignment -name REMOVE_REDUNDANT_LOGIC_CELLS Off +set_global_assignment -name REMOVE_DUPLICATE_REGISTERS On +set_global_assignment -name IGNORE_CARRY_BUFFERS Off +set_global_assignment -name IGNORE_CASCADE_BUFFERS Off +set_global_assignment -name IGNORE_GLOBAL_BUFFERS Off +set_global_assignment -name IGNORE_ROW_GLOBAL_BUFFERS Off +set_global_assignment -name IGNORE_LCELL_BUFFERS Off +set_global_assignment -name MAX7000_IGNORE_LCELL_BUFFERS AUTO +set_global_assignment -name IGNORE_SOFT_BUFFERS On +set_global_assignment -name MAX7000_IGNORE_SOFT_BUFFERS Off +set_global_assignment -name LIMIT_AHDL_INTEGERS_TO_32_BITS Off +set_global_assignment -name AUTO_GLOBAL_CLOCK_MAX On +set_global_assignment -name AUTO_GLOBAL_OE_MAX On +set_global_assignment -name MAX_AUTO_GLOBAL_REGISTER_CONTROLS On +set_global_assignment -name AUTO_IMPLEMENT_IN_ROM Off +set_global_assignment -name APEX20K_TECHNOLOGY_MAPPER Lut +set_global_assignment -name OPTIMIZATION_TECHNIQUE Balanced +set_global_assignment -name STRATIXII_OPTIMIZATION_TECHNIQUE Balanced +set_global_assignment -name CYCLONE_OPTIMIZATION_TECHNIQUE Balanced +set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE Balanced +set_global_assignment -name STRATIX_OPTIMIZATION_TECHNIQUE Balanced +set_global_assignment -name MAXII_OPTIMIZATION_TECHNIQUE Balanced +set_global_assignment -name MAX7000_OPTIMIZATION_TECHNIQUE Speed +set_global_assignment -name APEX20K_OPTIMIZATION_TECHNIQUE Balanced +set_global_assignment -name MERCURY_OPTIMIZATION_TECHNIQUE Area +set_global_assignment -name FLEX6K_OPTIMIZATION_TECHNIQUE Area +set_global_assignment -name FLEX10K_OPTIMIZATION_TECHNIQUE Area +set_global_assignment -name ALLOW_XOR_GATE_USAGE On +set_global_assignment -name AUTO_LCELL_INSERTION On +set_global_assignment -name CARRY_CHAIN_LENGTH 48 +set_global_assignment -name FLEX6K_CARRY_CHAIN_LENGTH 32 +set_global_assignment -name FLEX10K_CARRY_CHAIN_LENGTH 32 +set_global_assignment -name MERCURY_CARRY_CHAIN_LENGTH 48 +set_global_assignment -name STRATIX_CARRY_CHAIN_LENGTH 70 +set_global_assignment -name STRATIXII_CARRY_CHAIN_LENGTH 70 +set_global_assignment -name CASCADE_CHAIN_LENGTH 2 +set_global_assignment -name PARALLEL_EXPANDER_CHAIN_LENGTH 16 +set_global_assignment -name MAX7000_PARALLEL_EXPANDER_CHAIN_LENGTH 4 +set_global_assignment -name AUTO_CARRY_CHAINS On +set_global_assignment -name AUTO_CASCADE_CHAINS On +set_global_assignment -name AUTO_PARALLEL_EXPANDERS On +set_global_assignment -name AUTO_OPEN_DRAIN_PINS On +set_global_assignment -name ADV_NETLIST_OPT_SYNTH_WYSIWYG_REMAP Off +set_global_assignment -name AUTO_ROM_RECOGNITION On +set_global_assignment -name AUTO_RAM_RECOGNITION On +set_global_assignment -name AUTO_DSP_RECOGNITION On +set_global_assignment -name AUTO_SHIFT_REGISTER_RECOGNITION Auto +set_global_assignment -name ALLOW_SHIFT_REGISTER_MERGING_ACROSS_HIERARCHIES Auto +set_global_assignment -name AUTO_CLOCK_ENABLE_RECOGNITION On +set_global_assignment -name STRICT_RAM_RECOGNITION Off +set_global_assignment -name ALLOW_SYNCH_CTRL_USAGE On +set_global_assignment -name FORCE_SYNCH_CLEAR Off +set_global_assignment -name AUTO_RAM_BLOCK_BALANCING On +set_global_assignment -name AUTO_RAM_TO_LCELL_CONVERSION Off +set_global_assignment -name AUTO_RESOURCE_SHARING Off +set_global_assignment -name ALLOW_ANY_SHIFT_REGISTER_SIZE_FOR_RECOGNITION Off +set_global_assignment -name MAX7000_FANIN_PER_CELL 100 +set_global_assignment -name USE_LOGICLOCK_CONSTRAINTS_IN_BALANCING On +set_global_assignment -name MAX_RAM_BLOCKS_M512 "-1 (Unlimited)" +set_global_assignment -name MAX_RAM_BLOCKS_M4K "-1 (Unlimited)" +set_global_assignment -name MAX_RAM_BLOCKS_MRAM "-1 (Unlimited)" +set_global_assignment -name IGNORE_TRANSLATE_OFF_AND_SYNTHESIS_OFF Off +set_global_assignment -name STRATIXGX_BYPASS_REMAPPING_OF_FORCE_SIGNAL_DETECT_SIGNAL_THRESHOLD_SELECT Off +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Arria II GZ" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Arria V" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Cyclone 10 LP" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "MAX 10" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Cyclone IV GX" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Stratix IV" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Cyclone IV E" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Arria 10" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Stratix V" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Arria V GZ" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Cyclone V" +set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Arria II GX" +set_global_assignment -name REPORT_PARAMETER_SETTINGS On +set_global_assignment -name REPORT_SOURCE_ASSIGNMENTS On +set_global_assignment -name REPORT_CONNECTIVITY_CHECKS On +set_global_assignment -name IGNORE_MAX_FANOUT_ASSIGNMENTS Off +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Arria V" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "Cyclone 10 LP" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "MAX 10" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "Cyclone IV E" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Stratix IV" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Arria 10" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "MAX V" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Stratix V" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "MAX II" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Arria V GZ" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Arria II GX" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Arria II GZ" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "Cyclone IV GX" +set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Cyclone V" +set_global_assignment -name OPTIMIZE_POWER_DURING_SYNTHESIS "Normal compilation" +set_global_assignment -name HDL_MESSAGE_LEVEL Level2 +set_global_assignment -name USE_HIGH_SPEED_ADDER Auto +set_global_assignment -name NUMBER_OF_PROTECTED_REGISTERS_REPORTED 100 +set_global_assignment -name NUMBER_OF_REMOVED_REGISTERS_REPORTED 5000 +set_global_assignment -name NUMBER_OF_SYNTHESIS_MIGRATION_ROWS 5000 +set_global_assignment -name SYNTHESIS_S10_MIGRATION_CHECKS Off +set_global_assignment -name NUMBER_OF_SWEPT_NODES_REPORTED 5000 +set_global_assignment -name NUMBER_OF_INVERTED_REGISTERS_REPORTED 100 +set_global_assignment -name SYNTH_CLOCK_MUX_PROTECTION On +set_global_assignment -name SYNTH_GATED_CLOCK_CONVERSION Off +set_global_assignment -name BLOCK_DESIGN_NAMING Auto +set_global_assignment -name SYNTH_PROTECT_SDC_CONSTRAINT Off +set_global_assignment -name SYNTHESIS_EFFORT Auto +set_global_assignment -name SHIFT_REGISTER_RECOGNITION_ACLR_SIGNAL On +set_global_assignment -name PRE_MAPPING_RESYNTHESIS Off +set_global_assignment -name SYNTH_MESSAGE_LEVEL Medium +set_global_assignment -name DISABLE_REGISTER_MERGING_ACROSS_HIERARCHIES Auto +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Arria II GZ" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Arria V" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Cyclone 10 LP" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "MAX 10" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Cyclone IV GX" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Stratix IV" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Cyclone IV E" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Arria 10" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Stratix V" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Arria V GZ" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Cyclone V" +set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Arria II GX" +set_global_assignment -name MAX_LABS "-1 (Unlimited)" +set_global_assignment -name RBCGEN_CRITICAL_WARNING_TO_ERROR On +set_global_assignment -name MAX_NUMBER_OF_REGISTERS_FROM_UNINFERRED_RAMS "-1 (Unlimited)" +set_global_assignment -name AUTO_PARALLEL_SYNTHESIS On +set_global_assignment -name PRPOF_ID Off +set_global_assignment -name DISABLE_DSP_NEGATE_INFERENCING Off +set_global_assignment -name REPORT_PARAMETER_SETTINGS_PRO On +set_global_assignment -name REPORT_SOURCE_ASSIGNMENTS_PRO On +set_global_assignment -name ENABLE_STATE_MACHINE_INFERENCE Off +set_global_assignment -name FLEX10K_ENABLE_LOCK_OUTPUT Off +set_global_assignment -name AUTO_MERGE_PLLS On +set_global_assignment -name IGNORE_MODE_FOR_MERGE Off +set_global_assignment -name TXPMA_SLEW_RATE Low +set_global_assignment -name ADCE_ENABLED Auto +set_global_assignment -name ROUTER_TIMING_OPTIMIZATION_LEVEL Normal +set_global_assignment -name ROUTER_CLOCKING_TOPOLOGY_ANALYSIS Off +set_global_assignment -name PLACEMENT_EFFORT_MULTIPLIER 1.0 +set_global_assignment -name ROUTER_EFFORT_MULTIPLIER 1.0 +set_global_assignment -name FIT_ATTEMPTS_TO_SKIP 0.0 +set_global_assignment -name PHYSICAL_SYNTHESIS Off +set_global_assignment -name ECO_ALLOW_ROUTING_CHANGES Off +set_global_assignment -name DEVICE AUTO +set_global_assignment -name BASE_PIN_OUT_FILE_ON_SAMEFRAME_DEVICE Off +set_global_assignment -name ENABLE_JTAG_BST_SUPPORT Off +set_global_assignment -name MAX7000_ENABLE_JTAG_BST_SUPPORT On +set_global_assignment -name ENABLE_NCEO_OUTPUT Off +set_global_assignment -name RESERVE_NCEO_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "Use as programming pin" +set_global_assignment -name STRATIXIII_UPDATE_MODE Standard +set_global_assignment -name STRATIX_UPDATE_MODE Standard +set_global_assignment -name INTERNAL_FLASH_UPDATE_MODE "Single Image" +set_global_assignment -name CVP_MODE Off +set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "Passive Serial" -family "Arria V" +set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "Passive Serial" -family "Arria 10" +set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "Passive Serial" -family "Stratix V" +set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "Passive Serial" -family "Arria V GZ" +set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "Passive Serial" -family "Cyclone V" +set_global_assignment -name VID_OPERATION_MODE "PMBus Slave" +set_global_assignment -name USE_CONF_DONE AUTO +set_global_assignment -name USE_PWRMGT_SCL AUTO +set_global_assignment -name USE_PWRMGT_SDA AUTO +set_global_assignment -name USE_PWRMGT_ALERT AUTO +set_global_assignment -name USE_INIT_DONE AUTO +set_global_assignment -name USE_CVP_CONFDONE AUTO +set_global_assignment -name USE_SEU_ERROR AUTO +set_global_assignment -name RESERVE_AVST_CLK_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_AVST_VALID_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_AVST_DATA15_THROUGH_DATA0_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_AVST_DATA31_THROUGH_DATA16_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name STRATIXIII_CONFIGURATION_SCHEME "Passive Serial" +set_global_assignment -name MAX10FPGA_CONFIGURATION_SCHEME "Internal Configuration" +set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "Active Serial" +set_global_assignment -name STRATIXII_CONFIGURATION_SCHEME "Passive Serial" +set_global_assignment -name CYCLONEII_CONFIGURATION_SCHEME "Active Serial" +set_global_assignment -name APEX20K_CONFIGURATION_SCHEME "Passive Serial" +set_global_assignment -name STRATIX_CONFIGURATION_SCHEME "Passive Serial" +set_global_assignment -name CYCLONE_CONFIGURATION_SCHEME "Active Serial" +set_global_assignment -name MERCURY_CONFIGURATION_SCHEME "Passive Serial" +set_global_assignment -name FLEX6K_CONFIGURATION_SCHEME "Passive Serial" +set_global_assignment -name FLEX10K_CONFIGURATION_SCHEME "Passive Serial" +set_global_assignment -name APEXII_CONFIGURATION_SCHEME "Passive Serial" +set_global_assignment -name USER_START_UP_CLOCK Off +set_global_assignment -name ENABLE_UNUSED_RX_CLOCK_WORKAROUND Off +set_global_assignment -name PRESERVE_UNUSED_XCVR_CHANNEL Off +set_global_assignment -name IGNORE_HSSI_COLUMN_POWER_WHEN_PRESERVING_UNUSED_XCVR_CHANNELS On +set_global_assignment -name AUTO_RESERVE_CLKUSR_FOR_CALIBRATION On +set_global_assignment -name DEVICE_INITIALIZATION_CLOCK INIT_INTOSC +set_global_assignment -name ENABLE_VREFA_PIN Off +set_global_assignment -name ENABLE_VREFB_PIN Off +set_global_assignment -name ALWAYS_ENABLE_INPUT_BUFFERS Off +set_global_assignment -name ENABLE_ASMI_FOR_FLASH_LOADER Off +set_global_assignment -name ENABLE_DEVICE_WIDE_RESET Off +set_global_assignment -name ENABLE_DEVICE_WIDE_OE Off +set_global_assignment -name RESERVE_ALL_UNUSED_PINS "As output driving ground" +set_global_assignment -name ENABLE_INIT_DONE_OUTPUT Off +set_global_assignment -name INIT_DONE_OPEN_DRAIN On +set_global_assignment -name RESERVE_NWS_NRS_NCS_CS_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_RDYNBUSY_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_DATA31_THROUGH_DATA16_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_DATA15_THROUGH_DATA8_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_DATA7_THROUGH_DATA1_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "As input tri-stated" +set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "As input tri-stated" +set_global_assignment -name RESERVE_DATA7_THROUGH_DATA2_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_DATA7_THROUGH_DATA5_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "As input tri-stated" +set_global_assignment -name RESERVE_OTHER_AP_PINS_AFTER_CONFIGURATION "Use as regular IO" +set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "Use as programming pin" +set_global_assignment -name ENABLE_CONFIGURATION_PINS On +set_global_assignment -name ENABLE_JTAG_PIN_SHARING Off +set_global_assignment -name ENABLE_NCE_PIN Off +set_global_assignment -name ENABLE_BOOT_SEL_PIN On +set_global_assignment -name CRC_ERROR_CHECKING Off +set_global_assignment -name INTERNAL_SCRUBBING Off +set_global_assignment -name PR_ERROR_OPEN_DRAIN On +set_global_assignment -name PR_READY_OPEN_DRAIN On +set_global_assignment -name ENABLE_CVP_CONFDONE Off +set_global_assignment -name CVP_CONFDONE_OPEN_DRAIN On +set_global_assignment -name ENABLE_NCONFIG_FROM_CORE On +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Arria II GZ" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Arria V" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Cyclone 10 LP" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "MAX 10" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Cyclone IV GX" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Stratix IV" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Cyclone IV E" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Arria 10" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "IO Paths and Minimum TPD Paths" -family "MAX V" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Stratix V" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "IO Paths and Minimum TPD Paths" -family "MAX II" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Arria V GZ" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Cyclone V" +set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Arria II GX" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Arria V" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Cyclone 10 LP" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "MAX 10" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Cyclone IV E" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Stratix IV" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Arria 10" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING Off -family "MAX V" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Stratix V" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Arria V GZ" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING Off -family "MAX II" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Arria II GX" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Arria II GZ" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Cyclone IV GX" +set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Cyclone V" +set_global_assignment -name BLOCK_RAM_TO_MLAB_CELL_CONVERSION On +set_global_assignment -name BLOCK_RAM_AND_MLAB_EQUIVALENT_POWER_UP_CONDITIONS Auto +set_global_assignment -name BLOCK_RAM_AND_MLAB_EQUIVALENT_PAUSED_READ_CAPABILITIES Care +set_global_assignment -name PROGRAMMABLE_POWER_TECHNOLOGY_SETTING Automatic -family "Stratix IV" +set_global_assignment -name PROGRAMMABLE_POWER_TECHNOLOGY_SETTING Automatic -family "Arria 10" +set_global_assignment -name PROGRAMMABLE_POWER_TECHNOLOGY_SETTING Automatic -family "Stratix V" +set_global_assignment -name PROGRAMMABLE_POWER_TECHNOLOGY_SETTING Automatic -family "Arria V GZ" +set_global_assignment -name PROGRAMMABLE_POWER_MAXIMUM_HIGH_SPEED_FRACTION_OF_USED_LAB_TILES 1.0 +set_global_assignment -name GUARANTEE_MIN_DELAY_CORNER_IO_ZERO_HOLD_TIME On +set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING "Normal compilation" +set_global_assignment -name OPTIMIZE_SSN Off +set_global_assignment -name OPTIMIZE_TIMING "Normal compilation" +set_global_assignment -name ECO_OPTIMIZE_TIMING Off +set_global_assignment -name ECO_REGENERATE_REPORT Off +set_global_assignment -name OPTIMIZE_IOC_REGISTER_PLACEMENT_FOR_TIMING Normal +set_global_assignment -name FIT_ONLY_ONE_ATTEMPT Off +set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION Automatically +set_global_assignment -name FITTER_AGGRESSIVE_ROUTABILITY_OPTIMIZATION Automatically +set_global_assignment -name SEED 1 +set_global_assignment -name PERIPHERY_TO_CORE_PLACEMENT_AND_ROUTING_OPTIMIZATION OFF +set_global_assignment -name RESERVE_ROUTING_OUTPUT_FLEXIBILITY Off +set_global_assignment -name SLOW_SLEW_RATE Off +set_global_assignment -name PCI_IO Off +set_global_assignment -name TURBO_BIT On +set_global_assignment -name WEAK_PULL_UP_RESISTOR Off +set_global_assignment -name ENABLE_BUS_HOLD_CIRCUITRY Off +set_global_assignment -name AUTO_GLOBAL_MEMORY_CONTROLS Off +set_global_assignment -name MIGRATION_CONSTRAIN_CORE_RESOURCES On +set_global_assignment -name QII_AUTO_PACKED_REGISTERS Auto +set_global_assignment -name AUTO_PACKED_REGISTERS_MAX Auto +set_global_assignment -name NORMAL_LCELL_INSERT On +set_global_assignment -name CARRY_OUT_PINS_LCELL_INSERT On +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Arria V" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Cyclone 10 LP" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "MAX 10" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Stratix IV" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Cyclone IV E" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Arria 10" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "MAX V" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Stratix V" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "MAX II" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Arria V GZ" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Arria II GX" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Arria II GZ" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Cyclone IV GX" +set_global_assignment -name AUTO_DELAY_CHAINS On -family "Cyclone V" +set_global_assignment -name AUTO_DELAY_CHAINS_FOR_HIGH_FANOUT_INPUT_PINS OFF +set_global_assignment -name XSTL_INPUT_ALLOW_SE_BUFFER Off +set_global_assignment -name TREAT_BIDIR_AS_OUTPUT Off +set_global_assignment -name AUTO_TURBO_BIT ON +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC_FOR_AREA Off +set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC Off +set_global_assignment -name PHYSICAL_SYNTHESIS_LOG_FILE Off +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION Off +set_global_assignment -name PHYSICAL_SYNTHESIS_MAP_LOGIC_TO_MEMORY_FOR_AREA Off +set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING Off +set_global_assignment -name PHYSICAL_SYNTHESIS_ASYNCHRONOUS_SIGNAL_PIPELINING Off +set_global_assignment -name IO_PLACEMENT_OPTIMIZATION On +set_global_assignment -name ALLOW_LVTTL_LVCMOS_INPUT_LEVELS_TO_OVERDRIVE_INPUT_BUFFER Off +set_global_assignment -name OVERRIDE_DEFAULT_ELECTROMIGRATION_PARAMETERS Off +set_global_assignment -name FITTER_EFFORT "Auto Fit" +set_global_assignment -name FITTER_AUTO_EFFORT_DESIRED_SLACK_MARGIN 0ns +set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT Normal +set_global_assignment -name ROUTER_LCELL_INSERTION_AND_LOGIC_DUPLICATION Auto +set_global_assignment -name ROUTER_REGISTER_DUPLICATION Auto +set_global_assignment -name STRATIXGX_ALLOW_CLOCK_FANOUT_WITH_ANALOG_RESET Off +set_global_assignment -name AUTO_GLOBAL_CLOCK On +set_global_assignment -name AUTO_GLOBAL_OE On +set_global_assignment -name AUTO_GLOBAL_REGISTER_CONTROLS On +set_global_assignment -name FITTER_EARLY_TIMING_ESTIMATE_MODE Realistic +set_global_assignment -name STRATIXGX_ALLOW_GIGE_UNDER_FULL_DATARATE_RANGE Off +set_global_assignment -name STRATIXGX_ALLOW_RX_CORECLK_FROM_NON_RX_CLKOUT_SOURCE_IN_DOUBLE_DATA_WIDTH_MODE Off +set_global_assignment -name STRATIXGX_ALLOW_GIGE_IN_DOUBLE_DATA_WIDTH_MODE Off +set_global_assignment -name STRATIXGX_ALLOW_PARALLEL_LOOPBACK_IN_DOUBLE_DATA_WIDTH_MODE Off +set_global_assignment -name STRATIXGX_ALLOW_XAUI_IN_SINGLE_DATA_WIDTH_MODE Off +set_global_assignment -name STRATIXGX_ALLOW_XAUI_WITH_CORECLK_SELECTED_AT_RATE_MATCHER Off +set_global_assignment -name STRATIXGX_ALLOW_XAUI_WITH_RX_CORECLK_FROM_NON_TXPLL_SOURCE Off +set_global_assignment -name STRATIXGX_ALLOW_GIGE_WITH_CORECLK_SELECTED_AT_RATE_MATCHER Off +set_global_assignment -name STRATIXGX_ALLOW_GIGE_WITHOUT_8B10B Off +set_global_assignment -name STRATIXGX_ALLOW_GIGE_WITH_RX_CORECLK_FROM_NON_TXPLL_SOURCE Off +set_global_assignment -name STRATIXGX_ALLOW_POST8B10B_LOOPBACK Off +set_global_assignment -name STRATIXGX_ALLOW_REVERSE_PARALLEL_LOOPBACK Off +set_global_assignment -name STRATIXGX_ALLOW_USE_OF_GXB_COUPLED_IOS Off +set_global_assignment -name GENERATE_GXB_RECONFIG_MIF Off +set_global_assignment -name GENERATE_GXB_RECONFIG_MIF_WITH_PLL Off +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "As input tri-stated with weak pull-up" +set_global_assignment -name ENABLE_HOLD_BACK_OFF On +set_global_assignment -name CONFIGURATION_VCCIO_LEVEL Auto +set_global_assignment -name FORCE_CONFIGURATION_VCCIO Off +set_global_assignment -name SYNCHRONIZER_IDENTIFICATION Auto +set_global_assignment -name ENABLE_BENEFICIAL_SKEW_OPTIMIZATION On +set_global_assignment -name OPTIMIZE_FOR_METASTABILITY On +set_global_assignment -name CRC_ERROR_OPEN_DRAIN On -family "Arria V" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN Off -family "Cyclone 10 LP" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN Off -family "MAX 10" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN Off -family "Cyclone IV E" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN On -family "Arria 10" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN On -family "Stratix V" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN On -family "Arria V GZ" +set_global_assignment -name CRC_ERROR_OPEN_DRAIN On -family "Cyclone V" +set_global_assignment -name MAX_GLOBAL_CLOCKS_ALLOWED "-1 (Unlimited)" +set_global_assignment -name MAX_REGIONAL_CLOCKS_ALLOWED "-1 (Unlimited)" +set_global_assignment -name MAX_PERIPHERY_CLOCKS_ALLOWED "-1 (Unlimited)" +set_global_assignment -name MAX_CLOCKS_ALLOWED "-1 (Unlimited)" +set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_100MHz -family "Arria 10" +set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_100MHz -family "Arria V" +set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_100MHz -family "Stratix V" +set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_40MHz -family "Cyclone IV GX" +set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_100MHz -family "Arria V GZ" +set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_100MHz -family "Cyclone V" +set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_40MHz -family "Arria II GX" +set_global_assignment -name M144K_BLOCK_READ_CLOCK_DUTY_CYCLE_DEPENDENCY Off +set_global_assignment -name STRATIXIII_MRAM_COMPATIBILITY On +set_global_assignment -name FORCE_FITTER_TO_AVOID_PERIPHERY_PLACEMENT_WARNINGS Off +set_global_assignment -name AUTO_C3_M9K_BIT_SKIP Off +set_global_assignment -name PR_DONE_OPEN_DRAIN On +set_global_assignment -name NCEO_OPEN_DRAIN On +set_global_assignment -name ENABLE_CRC_ERROR_PIN Off +set_global_assignment -name ENABLE_PR_PINS Off +set_global_assignment -name RESERVE_PR_PINS Off +set_global_assignment -name CONVERT_PR_WARNINGS_TO_ERRORS Off +set_global_assignment -name PR_PINS_OPEN_DRAIN Off +set_global_assignment -name CLAMPING_DIODE Off +set_global_assignment -name TRI_STATE_SPI_PINS Off +set_global_assignment -name UNUSED_TSD_PINS_GND Off +set_global_assignment -name IMPLEMENT_MLAB_IN_16_BIT_DEEP_MODE Off +set_global_assignment -name FORM_DDR_CLUSTERING_CLIQUE Off +set_global_assignment -name ALM_REGISTER_PACKING_EFFORT Medium +set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION On -family "Arria V" +set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION Off -family "Stratix IV" +set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION On -family "Arria 10" +set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION On -family "Stratix V" +set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION On -family "Arria V GZ" +set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION On -family "Cyclone V" +set_global_assignment -name RELATIVE_NEUTRON_FLUX 1.0 +set_global_assignment -name SEU_FIT_REPORT Off +set_global_assignment -name HYPER_RETIMER Off -family "Arria 10" +set_global_assignment -name HYPER_RETIMER_FAST_FORWARD_ADD_PIPELINING_MAX "-1" +set_global_assignment -name HYPER_RETIMER_FAST_FORWARD_ASYNCH_CLEAR Auto +set_global_assignment -name HYPER_RETIMER_FAST_FORWARD_USER_PRESERVE_RESTRICTION Auto +set_global_assignment -name HYPER_RETIMER_FAST_FORWARD_DSP_BLOCKS On +set_global_assignment -name HYPER_RETIMER_FAST_FORWARD_RAM_BLOCKS On +set_global_assignment -name EDA_SIMULATION_TOOL "" +set_global_assignment -name EDA_TIMING_ANALYSIS_TOOL "" +set_global_assignment -name EDA_BOARD_DESIGN_TIMING_TOOL "" +set_global_assignment -name EDA_BOARD_DESIGN_SYMBOL_TOOL "" +set_global_assignment -name EDA_BOARD_DESIGN_SIGNAL_INTEGRITY_TOOL "" +set_global_assignment -name EDA_BOARD_DESIGN_BOUNDARY_SCAN_TOOL "" +set_global_assignment -name EDA_BOARD_DESIGN_TOOL "" +set_global_assignment -name EDA_FORMAL_VERIFICATION_TOOL "" +set_global_assignment -name EDA_RESYNTHESIS_TOOL "" +set_global_assignment -name ON_CHIP_BITSTREAM_DECOMPRESSION On +set_global_assignment -name COMPRESSION_MODE Off +set_global_assignment -name CLOCK_SOURCE Internal +set_global_assignment -name CONFIGURATION_CLOCK_FREQUENCY "10 MHz" +set_global_assignment -name CONFIGURATION_CLOCK_DIVISOR 1 +set_global_assignment -name ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE On +set_global_assignment -name FLEX6K_ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE Off +set_global_assignment -name FLEX10K_ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE On +set_global_assignment -name MAX7000S_JTAG_USER_CODE FFFF +set_global_assignment -name STRATIX_JTAG_USER_CODE FFFFFFFF +set_global_assignment -name APEX20K_JTAG_USER_CODE FFFFFFFF +set_global_assignment -name MERCURY_JTAG_USER_CODE FFFFFFFF +set_global_assignment -name FLEX10K_JTAG_USER_CODE 7F +set_global_assignment -name MAX7000_JTAG_USER_CODE FFFFFFFF +set_global_assignment -name MAX7000_USE_CHECKSUM_AS_USERCODE Off +set_global_assignment -name USE_CHECKSUM_AS_USERCODE On +set_global_assignment -name SECURITY_BIT Off +set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Cyclone 10 LP" +set_global_assignment -name USE_CONFIGURATION_DEVICE On -family "MAX 10" +set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Cyclone IV E" +set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Stratix IV" +set_global_assignment -name USE_CONFIGURATION_DEVICE On -family "MAX V" +set_global_assignment -name USE_CONFIGURATION_DEVICE On -family "MAX II" +set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Arria II GX" +set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Arria II GZ" +set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Cyclone IV GX" +set_global_assignment -name CYCLONEIII_CONFIGURATION_DEVICE Auto +set_global_assignment -name STRATIXII_CONFIGURATION_DEVICE Auto +set_global_assignment -name PWRMGT_SLAVE_DEVICE_TYPE "PV3102 or EM1130" +set_global_assignment -name PWRMGT_SLAVE_DEVICE0_ADDRESS 0000000 +set_global_assignment -name PWRMGT_SLAVE_DEVICE1_ADDRESS 0000000 +set_global_assignment -name PWRMGT_SLAVE_DEVICE2_ADDRESS 0000000 +set_global_assignment -name PWRMGT_SLAVE_DEVICE3_ADDRESS 0000000 +set_global_assignment -name PWRMGT_SLAVE_DEVICE4_ADDRESS 0000000 +set_global_assignment -name PWRMGT_SLAVE_DEVICE5_ADDRESS 0000000 +set_global_assignment -name PWRMGT_SLAVE_DEVICE6_ADDRESS 0000000 +set_global_assignment -name PWRMGT_SLAVE_DEVICE7_ADDRESS 0000000 +set_global_assignment -name PWRMGT_VOLTAGE_OUTPUT_FORMAT "Auto discovery" +set_global_assignment -name PWRMGT_DIRECT_FORMAT_COEFFICIENT_M 0 +set_global_assignment -name PWRMGT_DIRECT_FORMAT_COEFFICIENT_B 0 +set_global_assignment -name PWRMGT_DIRECT_FORMAT_COEFFICIENT_R 0 +set_global_assignment -name APEX20K_CONFIGURATION_DEVICE Auto +set_global_assignment -name MERCURY_CONFIGURATION_DEVICE Auto +set_global_assignment -name FLEX6K_CONFIGURATION_DEVICE Auto +set_global_assignment -name FLEX10K_CONFIGURATION_DEVICE Auto +set_global_assignment -name CYCLONE_CONFIGURATION_DEVICE Auto +set_global_assignment -name STRATIX_CONFIGURATION_DEVICE Auto +set_global_assignment -name APEX20K_CONFIG_DEVICE_JTAG_USER_CODE FFFFFFFF +set_global_assignment -name STRATIX_CONFIG_DEVICE_JTAG_USER_CODE FFFFFFFF +set_global_assignment -name MERCURY_CONFIG_DEVICE_JTAG_USER_CODE FFFFFFFF +set_global_assignment -name FLEX10K_CONFIG_DEVICE_JTAG_USER_CODE FFFFFFFF +set_global_assignment -name EPROM_USE_CHECKSUM_AS_USERCODE Off +set_global_assignment -name AUTO_INCREMENT_CONFIG_DEVICE_JTAG_USER_CODE On +set_global_assignment -name DISABLE_NCS_AND_OE_PULLUPS_ON_CONFIG_DEVICE Off +set_global_assignment -name GENERATE_TTF_FILE Off +set_global_assignment -name GENERATE_RBF_FILE Off +set_global_assignment -name GENERATE_HEX_FILE Off +set_global_assignment -name HEXOUT_FILE_START_ADDRESS 0 +set_global_assignment -name HEXOUT_FILE_COUNT_DIRECTION Up +set_global_assignment -name RESERVE_ALL_UNUSED_PINS_NO_OUTPUT_GND "As output driving an unspecified signal" +set_global_assignment -name RELEASE_CLEARS_BEFORE_TRI_STATES Off +set_global_assignment -name AUTO_RESTART_CONFIGURATION On +set_global_assignment -name HARDCOPYII_POWER_ON_EXTRA_DELAY Off +set_global_assignment -name STRATIXII_MRAM_COMPATIBILITY Off +set_global_assignment -name CYCLONEII_M4K_COMPATIBILITY On +set_global_assignment -name ENABLE_OCT_DONE Off -family "Arria V" +set_global_assignment -name ENABLE_OCT_DONE Off -family "Cyclone 10 LP" +set_global_assignment -name ENABLE_OCT_DONE On -family "MAX 10" +set_global_assignment -name ENABLE_OCT_DONE Off -family "Cyclone IV E" +set_global_assignment -name ENABLE_OCT_DONE Off -family "Arria 10" +set_global_assignment -name ENABLE_OCT_DONE Off -family "Stratix V" +set_global_assignment -name ENABLE_OCT_DONE Off -family "Arria V GZ" +set_global_assignment -name ENABLE_OCT_DONE Off -family "Arria II GX" +set_global_assignment -name ENABLE_OCT_DONE Off -family "Cyclone IV GX" +set_global_assignment -name ENABLE_OCT_DONE Off -family "Cyclone V" +set_global_assignment -name USE_CHECKERED_PATTERN_AS_UNINITIALIZED_RAM_CONTENT OFF +set_global_assignment -name ARRIAIIGX_RX_CDR_LOCKUP_FIX_OVERRIDE Off +set_global_assignment -name ENABLE_AUTONOMOUS_PCIE_HIP Off +set_global_assignment -name ENABLE_ADV_SEU_DETECTION Off +set_global_assignment -name POR_SCHEME "Instant ON" +set_global_assignment -name EN_USER_IO_WEAK_PULLUP On +set_global_assignment -name EN_SPI_IO_WEAK_PULLUP On +set_global_assignment -name POF_VERIFY_PROTECT Off +set_global_assignment -name ENABLE_SPI_MODE_CHECK Off +set_global_assignment -name FORCE_SSMCLK_TO_ISMCLK On +set_global_assignment -name FALLBACK_TO_EXTERNAL_FLASH Off +set_global_assignment -name EXTERNAL_FLASH_FALLBACK_ADDRESS 0 +set_global_assignment -name GENERATE_PMSF_FILES On +set_global_assignment -name START_TIME 0ns +set_global_assignment -name SIMULATION_MODE TIMING +set_global_assignment -name AUTO_USE_SIMULATION_PDB_NETLIST Off +set_global_assignment -name ADD_DEFAULT_PINS_TO_SIMULATION_OUTPUT_WAVEFORMS On +set_global_assignment -name SETUP_HOLD_DETECTION Off +set_global_assignment -name SETUP_HOLD_DETECTION_INPUT_REGISTERS_BIDIR_PINS_DISABLED Off +set_global_assignment -name CHECK_OUTPUTS Off +set_global_assignment -name SIMULATION_COVERAGE On +set_global_assignment -name SIMULATION_COMPLETE_COVERAGE_REPORT_PANEL On +set_global_assignment -name SIMULATION_MISSING_1_VALUE_COVERAGE_REPORT_PANEL On +set_global_assignment -name SIMULATION_MISSING_0_VALUE_COVERAGE_REPORT_PANEL On +set_global_assignment -name GLITCH_DETECTION Off +set_global_assignment -name GLITCH_INTERVAL 1ns +set_global_assignment -name SIMULATOR_GENERATE_SIGNAL_ACTIVITY_FILE Off +set_global_assignment -name SIMULATION_WITH_GLITCH_FILTERING_WHEN_GENERATING_SAF On +set_global_assignment -name SIMULATION_BUS_CHANNEL_GROUPING Off +set_global_assignment -name SIMULATION_VDB_RESULT_FLUSH On +set_global_assignment -name VECTOR_COMPARE_TRIGGER_MODE INPUT_EDGE +set_global_assignment -name SIMULATION_NETLIST_VIEWER Off +set_global_assignment -name SIMULATION_INTERCONNECT_DELAY_MODEL_TYPE TRANSPORT +set_global_assignment -name SIMULATION_CELL_DELAY_MODEL_TYPE TRANSPORT +set_global_assignment -name SIMULATOR_GENERATE_POWERPLAY_VCD_FILE Off +set_global_assignment -name SIMULATOR_PVT_TIMING_MODEL_TYPE AUTO +set_global_assignment -name SIMULATION_WITH_AUTO_GLITCH_FILTERING AUTO +set_global_assignment -name DRC_TOP_FANOUT 50 +set_global_assignment -name DRC_FANOUT_EXCEEDING 30 +set_global_assignment -name DRC_GATED_CLOCK_FEED 30 +set_global_assignment -name HARDCOPY_FLOW_AUTOMATION MIGRATION_ONLY +set_global_assignment -name ENABLE_DRC_SETTINGS Off +set_global_assignment -name CLK_RULE_CLKNET_CLKSPINES_THRESHOLD 25 +set_global_assignment -name DRC_DETAIL_MESSAGE_LIMIT 10 +set_global_assignment -name DRC_VIOLATION_MESSAGE_LIMIT 30 +set_global_assignment -name DRC_DEADLOCK_STATE_LIMIT 2 +set_global_assignment -name MERGE_HEX_FILE Off +set_global_assignment -name GENERATE_SVF_FILE Off +set_global_assignment -name GENERATE_ISC_FILE Off +set_global_assignment -name GENERATE_JAM_FILE Off +set_global_assignment -name GENERATE_JBC_FILE Off +set_global_assignment -name GENERATE_JBC_FILE_COMPRESSED On +set_global_assignment -name GENERATE_CONFIG_SVF_FILE Off +set_global_assignment -name GENERATE_CONFIG_ISC_FILE Off +set_global_assignment -name GENERATE_CONFIG_JAM_FILE Off +set_global_assignment -name GENERATE_CONFIG_JBC_FILE Off +set_global_assignment -name GENERATE_CONFIG_JBC_FILE_COMPRESSED On +set_global_assignment -name GENERATE_CONFIG_HEXOUT_FILE Off +set_global_assignment -name ISP_CLAMP_STATE_DEFAULT "Tri-state" +set_global_assignment -name HPS_EARLY_IO_RELEASE Off +set_global_assignment -name SIGNALPROBE_ALLOW_OVERUSE Off +set_global_assignment -name SIGNALPROBE_DURING_NORMAL_COMPILATION Off +set_global_assignment -name POWER_DEFAULT_TOGGLE_RATE 12.5% +set_global_assignment -name POWER_DEFAULT_INPUT_IO_TOGGLE_RATE 12.5% +set_global_assignment -name POWER_USE_PVA On +set_global_assignment -name POWER_USE_INPUT_FILE "No File" +set_global_assignment -name POWER_USE_INPUT_FILES Off +set_global_assignment -name POWER_VCD_FILTER_GLITCHES On +set_global_assignment -name POWER_REPORT_SIGNAL_ACTIVITY Off +set_global_assignment -name POWER_REPORT_POWER_DISSIPATION Off +set_global_assignment -name POWER_USE_DEVICE_CHARACTERISTICS TYPICAL +set_global_assignment -name POWER_AUTO_COMPUTE_TJ On +set_global_assignment -name POWER_TJ_VALUE 25 +set_global_assignment -name POWER_USE_TA_VALUE 25 +set_global_assignment -name POWER_USE_CUSTOM_COOLING_SOLUTION Off +set_global_assignment -name POWER_BOARD_TEMPERATURE 25 +set_global_assignment -name POWER_HPS_ENABLE Off +set_global_assignment -name POWER_HPS_PROC_FREQ 0.0 +set_global_assignment -name ENABLE_SMART_VOLTAGE_ID Off +set_global_assignment -name IGNORE_PARTITIONS Off +set_global_assignment -name AUTO_EXPORT_INCREMENTAL_COMPILATION Off +set_global_assignment -name RAPID_RECOMPILE_ASSIGNMENT_CHECKING On +set_global_assignment -name OUTPUT_IO_TIMING_ENDPOINT "Near End" +set_global_assignment -name RTLV_REMOVE_FANOUT_FREE_REGISTERS On +set_global_assignment -name RTLV_SIMPLIFIED_LOGIC On +set_global_assignment -name RTLV_GROUP_RELATED_NODES On +set_global_assignment -name RTLV_GROUP_COMB_LOGIC_IN_CLOUD Off +set_global_assignment -name RTLV_GROUP_COMB_LOGIC_IN_CLOUD_TMV Off +set_global_assignment -name RTLV_GROUP_RELATED_NODES_TMV On +set_global_assignment -name EQC_CONSTANT_DFF_DETECTION On +set_global_assignment -name EQC_DUPLICATE_DFF_DETECTION On +set_global_assignment -name EQC_BBOX_MERGE On +set_global_assignment -name EQC_LVDS_MERGE On +set_global_assignment -name EQC_RAM_UNMERGING On +set_global_assignment -name EQC_DFF_SS_EMULATION On +set_global_assignment -name EQC_RAM_REGISTER_UNPACK On +set_global_assignment -name EQC_MAC_REGISTER_UNPACK On +set_global_assignment -name EQC_SET_PARTITION_BB_TO_VCC_GND On +set_global_assignment -name EQC_STRUCTURE_MATCHING On +set_global_assignment -name EQC_AUTO_BREAK_CONE On +set_global_assignment -name EQC_POWER_UP_COMPARE Off +set_global_assignment -name EQC_AUTO_COMP_LOOP_CUT On +set_global_assignment -name EQC_AUTO_INVERSION On +set_global_assignment -name EQC_AUTO_TERMINATE On +set_global_assignment -name EQC_SUB_CONE_REPORT Off +set_global_assignment -name EQC_RENAMING_RULES On +set_global_assignment -name EQC_PARAMETER_CHECK On +set_global_assignment -name EQC_AUTO_PORTSWAP On +set_global_assignment -name EQC_DETECT_DONT_CARES On +set_global_assignment -name EQC_SHOW_ALL_MAPPED_POINTS Off +set_global_assignment -name EDA_INPUT_GND_NAME GND -section_id ? +set_global_assignment -name EDA_INPUT_VCC_NAME VCC -section_id ? +set_global_assignment -name EDA_INPUT_DATA_FORMAT NONE -section_id ? +set_global_assignment -name EDA_SHOW_LMF_MAPPING_MESSAGES Off -section_id ? +set_global_assignment -name EDA_RUN_TOOL_AUTOMATICALLY Off -section_id ? +set_global_assignment -name RESYNTHESIS_RETIMING FULL -section_id ? +set_global_assignment -name RESYNTHESIS_OPTIMIZATION_EFFORT Normal -section_id ? +set_global_assignment -name RESYNTHESIS_PHYSICAL_SYNTHESIS Normal -section_id ? +set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS On -section_id ? +set_global_assignment -name VCCPD_VOLTAGE 3.3V -section_id ? +set_global_assignment -name EDA_USER_COMPILED_SIMULATION_LIBRARY_DIRECTORY "" -section_id ? +set_global_assignment -name EDA_LAUNCH_CMD_LINE_TOOL Off -section_id ? +set_global_assignment -name EDA_ENABLE_IPUTF_MODE On -section_id ? +set_global_assignment -name EDA_NATIVELINK_PORTABLE_FILE_PATHS Off -section_id ? +set_global_assignment -name EDA_NATIVELINK_GENERATE_SCRIPT_ONLY Off -section_id ? +set_global_assignment -name EDA_WAIT_FOR_GUI_TOOL_COMPLETION Off -section_id ? +set_global_assignment -name EDA_TRUNCATE_LONG_HIERARCHY_PATHS Off -section_id ? +set_global_assignment -name EDA_FLATTEN_BUSES Off -section_id ? +set_global_assignment -name EDA_MAP_ILLEGAL_CHARACTERS Off -section_id ? +set_global_assignment -name EDA_GENERATE_TIMING_CLOSURE_DATA Off -section_id ? +set_global_assignment -name EDA_GENERATE_POWER_INPUT_FILE Off -section_id ? +set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS NOT_USED -section_id ? +set_global_assignment -name EDA_RTL_SIM_MODE NOT_USED -section_id ? +set_global_assignment -name EDA_MAINTAIN_DESIGN_HIERARCHY OFF -section_id ? +set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST On -section_id ? +set_global_assignment -name EDA_WRITE_DEVICE_CONTROL_PORTS Off -section_id ? +set_global_assignment -name EDA_SIMULATION_VCD_OUTPUT_TCL_FILE Off -section_id ? +set_global_assignment -name EDA_SIMULATION_VCD_OUTPUT_SIGNALS_TO_TCL_FILE "All Except Combinational Logic Element Outputs" -section_id ? +set_global_assignment -name EDA_ENABLE_GLITCH_FILTERING Off -section_id ? +set_global_assignment -name EDA_WRITE_NODES_FOR_POWER_ESTIMATION OFF -section_id ? +set_global_assignment -name EDA_SETUP_HOLD_DETECTION_INPUT_REGISTERS_BIDIR_PINS_DISABLED Off -section_id ? +set_global_assignment -name EDA_WRITER_DONT_WRITE_TOP_ENTITY Off -section_id ? +set_global_assignment -name EDA_VHDL_ARCH_NAME structure -section_id ? +set_global_assignment -name EDA_IBIS_MODEL_SELECTOR Off -section_id ? +set_global_assignment -name EDA_IBIS_EXTENDED_MODEL_SELECTOR Off -section_id ? +set_global_assignment -name EDA_IBIS_MUTUAL_COUPLING Off -section_id ? +set_global_assignment -name EDA_FORMAL_VERIFICATION_ALLOW_RETIMING Off -section_id ? +set_global_assignment -name EDA_BOARD_BOUNDARY_SCAN_OPERATION PRE_CONFIG -section_id ? +set_global_assignment -name EDA_GENERATE_RTL_SIMULATION_COMMAND_SCRIPT Off -section_id ? +set_global_assignment -name EDA_GENERATE_GATE_LEVEL_SIMULATION_COMMAND_SCRIPT Off -section_id ? +set_global_assignment -name EDA_IBIS_SPECIFICATION_VERSION 4p2 -section_id ? +set_global_assignment -name SIM_VECTOR_COMPARED_CLOCK_OFFSET 0ns -section_id ? +set_global_assignment -name SIM_VECTOR_COMPARED_CLOCK_DUTY_CYCLE 50 -section_id ? +set_global_assignment -name APEX20K_CLIQUE_TYPE LAB -section_id ? -entity ? +set_global_assignment -name MAX7K_CLIQUE_TYPE LAB -section_id ? -entity ? +set_global_assignment -name MERCURY_CLIQUE_TYPE LAB -section_id ? -entity ? +set_global_assignment -name FLEX6K_CLIQUE_TYPE LAB -section_id ? -entity ? +set_global_assignment -name FLEX10K_CLIQUE_TYPE LAB -section_id ? -entity ? +set_global_assignment -name PARTITION_PRESERVE_HIGH_SPEED_TILES On -section_id ? -entity ? +set_global_assignment -name PARTITION_IGNORE_SOURCE_FILE_CHANGES Off -section_id ? -entity ? +set_global_assignment -name PARTITION_ALWAYS_USE_QXP_NETLIST Off -section_id ? -entity ? +set_global_assignment -name PARTITION_IMPORT_ASSIGNMENTS On -section_id ? -entity ? +set_global_assignment -name PARTITION_IMPORT_EXISTING_ASSIGNMENTS REPLACE_CONFLICTING -section_id ? -entity ? +set_global_assignment -name PARTITION_IMPORT_EXISTING_LOGICLOCK_REGIONS UPDATE_CONFLICTING -section_id ? -entity ? +set_global_assignment -name PARTITION_IMPORT_PROMOTE_ASSIGNMENTS On -section_id ? -entity ? +set_global_assignment -name ALLOW_MULTIPLE_PERSONAS Off -section_id ? -entity ? +set_global_assignment -name PARTITION_ASD_REGION_ID 1 -section_id ? -entity ? +set_global_assignment -name CROSS_BOUNDARY_OPTIMIZATIONS Off -section_id ? -entity ? +set_global_assignment -name PROPAGATE_CONSTANTS_ON_INPUTS On -section_id ? -entity ? +set_global_assignment -name PROPAGATE_INVERSIONS_ON_INPUTS On -section_id ? -entity ? +set_global_assignment -name REMOVE_LOGIC_ON_UNCONNECTED_OUTPUTS On -section_id ? -entity ? +set_global_assignment -name MERGE_EQUIVALENT_INPUTS On -section_id ? -entity ? +set_global_assignment -name MERGE_EQUIVALENT_BIDIRS On -section_id ? -entity ? +set_global_assignment -name ABSORB_PATHS_FROM_OUTPUTS_TO_INPUTS On -section_id ? -entity ? +set_global_assignment -name PARTITION_ENABLE_STRICT_PRESERVATION Off -section_id ? -entity ? diff --git a/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_derate.sdc b/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_derate.sdc new file mode 100644 index 00000000..e3b239f5 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_derate.sdc @@ -0,0 +1,2 @@ +set_timing_derate -late 2.0 +set_timing_derate -early 2.0 diff --git a/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_download.svf b/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_download.svf new file mode 100644 index 00000000..069583a1 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_download.svf @@ -0,0 +1,5437 @@ +ENDDR IDLE; +ENDIR IDLE; +STATE IDLE; +RUNTEST 1 TCK; +SIR 10 TDI (3f8); +RUNTEST 100 TCK; +SIR 10 TDI (3f9); +RUNTEST 100 TCK; +SIR 10 TDI (3f8); +RUNTEST 100 TCK; +SIR 10 TDI (6); +RUNTEST 100 TCK; +SDR 32 TDI (00000000) TDO (00057620) MASK (ffffffff); +SIR 10 TDI (3fc); +RUNTEST 100 TCK; +SDR 8 TDI (f8); +SIR 10 TDI (3fe); +RUNTEST 100 TCK; +RUNTEST 0.5 SEC; +SIR 10 TDI (3fc); +RUNTEST 100 TCK; +SDR 8 TDI (f8); +SIR 10 TDI (3fa); +RUNTEST 100 TCK; +SDR 64 TDI (90e0000000010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (086a400020010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffff000010010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0400004530010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (04f0200008010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (b385942c28010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (c2ca165018010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (650b20f138010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (85942c8104010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (883c40b224010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1ee0f70714010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (707b83dc34010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3dc1ee0f0c010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (20f707b82c010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (7b81640b1c010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (c1ee0f703c010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (f707b83d02010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (83dc1ee022010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (b285902c12010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (42ca164032010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (dc1ee0590a010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (85907b832a010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ca1650b21a010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0b2859423a010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (942ca16506010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1650b28526010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (285942ca16010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (2ca1650b36010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (40b205940e010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (5902c8162e010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (a3e51f201e010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (b28f947c3e010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (c2ce167001010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (df0b385921010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0f707b8311010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ca1641ee31010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0b28594209010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000a16529010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004519010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (04ffdb0039010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff05010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e3d010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff03010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000b010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002b010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e3b010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff07010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000f010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e3f010040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff00810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000020810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e38810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (011fffff04810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0440210a24810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1000842514810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (4041210a34810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (08a010500c810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (289220102c810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (620428041c810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e3c810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff02810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0060000012810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0118080032810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (010508000a810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (020040c42a810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (040000001a810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e3a810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff06810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0050000016810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0090840436810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (024210100e810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e3e810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (011fffff01810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000221810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000842011810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0108420831810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0421082009810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (018c60cc29810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e39810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000005810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0200000015810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (006000002d810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000a3d810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1800000013810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0240000033810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000b810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002b810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000001b810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000013b810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (d800000017810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0012000037810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000f810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (808000001f810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000013f810040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000020410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (c000000010410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000001230410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0400000018410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000004410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e800000034410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000030c410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002c410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0099000012410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8264000032410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (090000030a410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002a410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1080000036410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000040e410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000021410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (00a9000011410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0400000031410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0090008009410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000029410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000480005410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (4800000035410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000020020d410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000013d410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0009000013410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (c000000033410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (090481010b410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002b410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000001b410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0012000007410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3104000037410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (004000020f410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f410040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000100c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000020c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0402000030c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0010000208c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004038c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000004c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e000000034c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (180000030cc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002cc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (018000001cc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003cc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e000000032c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000030ac10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002ac10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ac10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ac10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000440016c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (6000100036c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000008080ec10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001000002ec10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ec10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ec10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000101c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000021c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0001000031c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0004414009c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0001000029c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004039c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000005c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (4000000035c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (008820020dc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002dc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (800000001dc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000213dc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (c024000033c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000001010bc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002bc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001bc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003bc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (2804000037c10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000020fc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (004000002fc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001fc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003fc10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000100210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000020210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0002000030210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000208210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0020000028210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000001038210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000010004210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3000000024210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000800114210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000100034210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000c210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000100002c210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000083c210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004002210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0700000022210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1808000812210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (6001000032210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000a210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000400002a210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3000000026210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (da00004016210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (6812000436210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000800230e210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000101210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (7800000021210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (c000002811210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000002031210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0082808309210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000a000029210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000439210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000005210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0c80000035210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3397a0060d210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0001200013210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0402800033210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100120000b210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (090480002b210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (2200000037210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (800000800f210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f210040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004008a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0990120028a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004004a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e08000000ca10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000032ca10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ca10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080000003ca10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (842400000aa10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000032aa10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001aa10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (008000003aa10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000ea10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000080b2ea10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ea10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (018000003ea10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0024000009a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000014329a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000005a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0080000035a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (220000000da10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000802da10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001da10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003da10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0400000013a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1880000033a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (400000000ba10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080040082ba10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ba10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ba10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0100000017a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0400000037a10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000000fa10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000042fa10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001fa10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003fa10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000020610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0100000010610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0400000030610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (9000000008610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000008228610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000004610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000080024610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080000000c610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002c610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000001202610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000800022610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (624000000a610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000480002a610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (701200000e610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000800132e610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000009610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0080008329610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000005610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004025610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3000000015610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000001003610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000040023610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3700000013610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000933610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (124000000b610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000480002b610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3000000017610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000a40137610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (880020000f610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000020002f610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000100001f610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f610040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0800000010e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000800a830e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000100008e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000010028e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0004000018e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000204e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0200000034e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080000000ce10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000002ce10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ce10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ce10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000003002e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1890000032e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000000ae10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (020000002ae10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ae10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ae10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (d800000036e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (840000000ee10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (180000002ee10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (600000001ee10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ee10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (c000000031e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0100002409e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0004610029e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1000000039e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000105e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000de10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002de10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001de10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (018000003de10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (602400000be10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (090000002be10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001be10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003be10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037e10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (680110000fe10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000132fe10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001fe10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003fe10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0002808328110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000c04110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (a80000000c110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000012c110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (800000003c110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000002902110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000240032110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (200000000a110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000021022a110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000100036110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (500000000e110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000012e110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000003e110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000040031110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000009110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000129110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000105110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0004000035110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001800002d110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (006000001d110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000203110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000800033110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (600000000b110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002b110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000040037110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (780000000f110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0008000b2f110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f110040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000200030910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0080008328910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000804910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000c910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002c910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (008000001c910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (018000003c910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0014000022910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000000a910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002a910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (002000001a910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (882200000e910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (120000002e910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000009910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000220029910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004005910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0200000035910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000040002d910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1800000033910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (600000000b910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000200002b910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000800017910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (d800000037910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (680000080f910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000c00b2f910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f910040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000200010510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (c000000030510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000002008510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000008328510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000004510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001200000c510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002c510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000a510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002a510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000100036510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000100000e510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000040031510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000200009510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000029510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004005510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0010000035510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000400001d510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000400003d510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000500023510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0080000033510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000b510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002b510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000200001b510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (002000003b510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0020000037510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (040000000f510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f510040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0100000030d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0080000008d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004004d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0018000034d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (090250000cd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000c0002cd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001cd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000003cd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000102d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0081000032d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (120800000ad10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002ad10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ad10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ad10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (910000000ed10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002ed10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ed10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ed10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0400000009d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000120029d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004005d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000dd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (040020032dd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001dd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003dd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000a000023d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (500000000bd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080001032bd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001bd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (088000003bd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037d10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (200000000fd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000100a2fd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001fd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003fd10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0012000120310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8000000008310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000028228310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004004310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0008000034310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (010000000c310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000032c310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0001000032310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (520000000a310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000021032a310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (201200000e310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000080a2e310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (006000001e310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8000000009310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000018229310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004005310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000010000d310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000b2d310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (700080000b310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000802b310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (010000000f310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000002072f310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f310040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8400000008b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000028328b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004004b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000002424b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (2000000034b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080000000cb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100400002cb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001cb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003cb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e800000032b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (600004640ab10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (040080002ab10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ab10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ab10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (d000000036b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (701212020eb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000232eb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001eb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000003eb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000101b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000021b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000100a009b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000008329b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004005b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (4008000035b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0c4002020db10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002db10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001db10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000400003db10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1801000033b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000900bb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002bb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001bb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (004000003bb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (9800000037b10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (900818000fb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000040002fb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001fb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003fb10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000a000020710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (c000000030710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0004806108710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0001220028710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004004710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0080000034710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (200000000c710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080040002c710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0400000012710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0080000032710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (400000000a710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080000002a710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0100000016710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000000e710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000021710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0100000011710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1000000009710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000129710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000005710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (010000000d710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (008400002d710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (020000000b710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001080002b710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000010027710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (002000000f710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f710040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000a820f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0004000008f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0001400028f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004004f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000cf10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002cf10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000400001cf10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (048000003cf10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000af10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002af10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000200001af10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003af10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000ef10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000200002ef10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ef10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ef10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000021f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000009f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000400029f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004005f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000df10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002df10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (008000001df10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003df10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000bf10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002bf10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (004000001bf10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003bf10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037f10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000840000ff10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000800002ff10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ff10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ff10040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0002100008090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0020000028090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004004090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (010000000c090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (010000002c090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (040000000a090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080000002a090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (004000000e090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000021090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0400000009090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000029090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004005090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000b090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002b090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000f090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f090040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004004890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000c890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002c890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000002890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000a890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002a890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000e890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (008000001e890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000021890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000009890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000029890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0040000019890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004005890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000002025890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (2000000035890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000002000d890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000003890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (f800000033890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000a80b890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002b890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000007890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (9000000037890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (048000020f890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f890040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000000490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000420490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000004a008490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000004490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000224490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3000000014490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (9000000034490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000010810c490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002c490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000001202490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3700000012490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (6000000932490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000080500a490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002a490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000006490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (3000000016490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (9800800136490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000002020e490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (020000002e490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000001490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000421490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0800000011490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8004011831490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000a009490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1000000029490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000005490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000100000d490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (008000003d490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007f03490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000010000b490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000180002b490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e07490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000090000f490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f490040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e00c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0084280438c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007f04c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000cc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002cc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001cc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003cc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e02c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000ac90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002ac90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ac90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ac90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e06c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000040016c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000100000ec90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002ec90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ec90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ec90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e01c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000020011c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000100009c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0004400029c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e05c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000200025c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0001000035c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000dc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000032dc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001dc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003dc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e03c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000100023c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000800033c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (700000000bc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000472bc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001bc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003bc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e07c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037c90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000fc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0800d0032fc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001fc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003fc90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e00290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8000000008290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0800018828290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e04290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000100034290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000c290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002c290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e02290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000080032290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000a290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002a290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e06290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000e290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e01290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000009290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000029290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e05290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e03290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000b290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002b290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e07290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000f290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f290040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e00a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e04a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (010000000ca90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002ca90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ca90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ca90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e02a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (020000000aa90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002aa90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001aa90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003aa90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e06a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000800036a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000ea90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002ea90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ea90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ea90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e01a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0004000031a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0280000009a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000029a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e05a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000da90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000800002da90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001da90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003da90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e03a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000a0000ba90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (002000002ba90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ba90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ba90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e07a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0001000037a90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000010000fa90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002fa90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001fa90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003fa90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e00690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000800030690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000400008690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e04690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (9000000034690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000100c690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002c690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e02690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (7800000032690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000008600a690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002a690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e06690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8001000036690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000004000e690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e01690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8000800031690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000006809690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0002800029690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e05690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080000002d690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e03690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (400000000b690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (080000002b690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e07690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (100000000f690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f690040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e00e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000020e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1000000008e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e04e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (9000000034e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000820080ce90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002ce90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ce90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ce90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e02e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (6000000032e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000214600ae90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002ae90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ae90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ae90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e06e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (9840000036e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (002204000ee90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002ee90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001ee90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003ee90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e01e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8080000031e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000006809e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000029e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e05e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000de90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002de90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001de90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003de90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e03e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000060000be90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0c0000002be90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001be90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003be90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e07e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037e90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000fe90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002fe90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001fe90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003fe90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e00190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e04190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000034190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000c190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000040002c190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e02190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000a190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000100002a190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e06190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000e190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e01190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000009190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000029190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e05190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e03190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000b190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002b190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e07190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000f190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f190040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e00990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000120990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e04990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0040000034990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000c990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000080002c990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e02990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0080000032990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000a990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000080002a990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e06990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000036990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000010000e990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e01990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0014800009990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0050000029990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e05990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000d990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002d990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e03990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000b990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002b990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e07990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000f990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002f990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f990040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e00590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000020590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000028590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e04590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000024590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000014590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (2000000034590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (040000000c590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (180000002c590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001c590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003c590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e02590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000022590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e800000032590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (008008a10a590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002a590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001a590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003a590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e06590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000026590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000016590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (d000000036590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000004000e590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000002e590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001e590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003e590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e01590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000121590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000011590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000031590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000006809590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000029590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000019590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000039590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e05590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000025590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (9000000035590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000091010d590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000032d590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001d590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003d590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e03590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000023590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (6000000033590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (700000900b590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000004b2b590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001b590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003b590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e07590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000027590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (9800000037590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000004010f590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000032f590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000001f590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000003f590040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e00d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000020d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8000000030d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (8000006008d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (00000a8828d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000018d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000038d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007e04d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff24d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0040010a14d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1100042834d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000200200cd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e00000002cd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff1cd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff3cd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007f02d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff22d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000012d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000032d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0180c6000ad90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e66318302ad90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff1ad90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff3ad90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007f06d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff26d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0001800016d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0004000036d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000008000ed90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e00208002ed90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff1ed90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff3ed90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007f01d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (011fffff21d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0440010a11d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (1101042831d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (4243422009d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e561104829d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff19d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff39d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007f05d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff25d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000015d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000035d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000dd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e00000002dd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff1dd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff3dd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007f03d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff23d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000013d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000033d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000bd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e00000002bd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff1bd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff3bd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007f07d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff27d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000017d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000037d90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (000000000fd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e00000002fd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff1fd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff3fd90040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007f00390040); +RUNTEST 0.002 SEC; +SDR 64 TDI (001fffff20390040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000010390040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000030390040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000000008390040); +RUNTEST 0.002 SEC; +SDR 64 TDI (e000000028390040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff18390040); +RUNTEST 0.002 SEC; +SDR 64 TDI (ffffffff38390040); +RUNTEST 0.002 SEC; +SDR 64 TDI (0000007f04390040); +RUNTEST 0.002 SEC; +SDR 64 TDI (403f005424390040); +RUNTEST 0.002 SEC; +SDR 64 TDI (f1f0000014390040); +RUNTEST 0.002 SEC; +SIR 10 TDI (3fd); +RUNTEST 100 TCK; +SDR 64 TDI (00000000000100c0) TDO (90e0000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000200100c0) TDO (086a400000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000100100c0) TDO (ffff000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000300100c0) TDO (0400004500000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000080100c0) TDO (04f0200000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000280100c0) TDO (b385942c00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000180100c0) TDO (c2ca165000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000380100c0) TDO (650b20f100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000040100c0) TDO (85942c8100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000240100c0) TDO (883c40b200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000140100c0) TDO (1ee0f70700000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000340100c0) TDO (707b83dc00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c0100c0) TDO (3dc1ee0f00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c0100c0) TDO (20f707b800000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c0100c0) TDO (7b81640b00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c0100c0) TDO (c1ee0f7000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000020100c0) TDO (f707b83d00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000220100c0) TDO (83dc1ee000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000120100c0) TDO (b285902c00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000320100c0) TDO (42ca164000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a0100c0) TDO (dc1ee05900000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a0100c0) TDO (85907b8300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a0100c0) TDO (ca1650b200000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a0100c0) TDO (0b28594200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000060100c0) TDO (942ca16500000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000260100c0) TDO (1650b28500000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000160100c0) TDO (285942ca00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000360100c0) TDO (2ca1650b00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e0100c0) TDO (40b2059400000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e0100c0) TDO (5902c81600000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e0100c0) TDO (a3e51f2000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e0100c0) TDO (b28f947c00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000010100c0) TDO (c2ce167000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000210100c0) TDO (df0b385900000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000110100c0) TDO (0f707b8300000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000310100c0) TDO (ca1641ee00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000090100c0) TDO (0b28594200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000290100c0) TDO (0000a16500000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000190100c0) TDO (0000004500000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000390100c0) TDO (04ffdb0000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000050100c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000250100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000150100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000350100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d0100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d0100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d0100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d0100c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000030100c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000230100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000130100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000330100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b0100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b0100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b0100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b0100c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000070100c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000270100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000170100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000370100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f0100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f0100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f0100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f0100c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000008100c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000208100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000108100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000308100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000088100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000288100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000188100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000388100c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000048100c0) TDO (011fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000248100c0) TDO (0440210a00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000148100c0) TDO (1000842500000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000348100c0) TDO (4041210a00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c8100c0) TDO (08a0105000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c8100c0) TDO (2892201000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c8100c0) TDO (6204280400000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c8100c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000028100c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000228100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000128100c0) TDO (0060000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000328100c0) TDO (0118080000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a8100c0) TDO (0105080000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a8100c0) TDO (020040c400000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a8100c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a8100c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000068100c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000268100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000168100c0) TDO (0050000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000368100c0) TDO (0090840400000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e8100c0) TDO (0242101000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e8100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e8100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e8100c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000018100c0) TDO (011fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000218100c0) TDO (0000000200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000118100c0) TDO (0000842000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000318100c0) TDO (0108420800000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000098100c0) TDO (0421082000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000298100c0) TDO (018c60cc00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000198100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000398100c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000058100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000258100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000158100c0) TDO (0200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000358100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d8100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d8100c0) TDO (0060000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d8100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d8100c0) TDO (0000000a00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000038100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000238100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000138100c0) TDO (1800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000338100c0) TDO (0240000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b8100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b8100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b8100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b8100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000078100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000278100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000178100c0) TDO (d800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000378100c0) TDO (0012000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f8100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f8100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f8100c0) TDO (8080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f8100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000004100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000204100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000104100c0) TDO (c000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000304100c0) TDO (0000001200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000084100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000284100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000184100c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000384100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000044100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000244100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000144100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000344100c0) TDO (e800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c4100c0) TDO (0000000300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000024100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000224100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000124100c0) TDO (0099000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000324100c0) TDO (8264000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a4100c0) TDO (0900000300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000064100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000264100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000164100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000364100c0) TDO (1080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e4100c0) TDO (0000000400000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000014100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000214100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000114100c0) TDO (00a9000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000314100c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000094100c0) TDO (0090008000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000294100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000194100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000394100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000054100c0) TDO (0000480000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000254100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000154100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000354100c0) TDO (4800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d4100c0) TDO (0000200200000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d4100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000034100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000234100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000134100c0) TDO (0009000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000334100c0) TDO (c000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b4100c0) TDO (0904810100000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b4100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000074100c0) TDO (0012000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000274100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000174100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000374100c0) TDO (3104000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f4100c0) TDO (0040000200000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f4100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000000c100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000020c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000010c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000030c100c0) TDO (0402000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000008c100c0) TDO (0010000200000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000028c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000018c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000038c100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000004c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000024c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000014c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000034c100c0) TDO (e000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000cc100c0) TDO (1800000300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002cc100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001cc100c0) TDO (0180000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003cc100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000002c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000022c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000012c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000032c100c0) TDO (e000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ac100c0) TDO (0000000300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ac100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ac100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ac100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000006c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000026c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000016c100c0) TDO (0000440000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000036c100c0) TDO (6000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ec100c0) TDO (0000080800000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ec100c0) TDO (0010000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ec100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ec100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000001c100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000021c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000011c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000031c100c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000009c100c0) TDO (0004414000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000029c100c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000019c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000039c100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000005c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000025c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000015c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000035c100c0) TDO (4000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000dc100c0) TDO (0088200200000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002dc100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001dc100c0) TDO (8000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003dc100c0) TDO (0000002100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000003c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000023c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000013c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000033c100c0) TDO (c024000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000bc100c0) TDO (0000010100000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002bc100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001bc100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003bc100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000007c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000027c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000017c100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000037c100c0) TDO (2804000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000fc100c0) TDO (0000000200000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002fc100c0) TDO (0040000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001fc100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003fc100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000002100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000202100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000102100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000302100c0) TDO (0002000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000082100c0) TDO (0000000200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000282100c0) TDO (0020000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000182100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000382100c0) TDO (0000001000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000042100c0) TDO (0000010000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000242100c0) TDO (3000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000142100c0) TDO (0000800100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000342100c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c2100c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c2100c0) TDO (0000000800000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000022100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000222100c0) TDO (0700000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000122100c0) TDO (1808000800000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000322100c0) TDO (6001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a2100c0) TDO (0004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000062100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000262100c0) TDO (3000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000162100c0) TDO (da00004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000362100c0) TDO (6812000400000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e2100c0) TDO (0008002300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000012100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000212100c0) TDO (7800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000112100c0) TDO (c000002800000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000312100c0) TDO (0000002000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000092100c0) TDO (0082808300000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000292100c0) TDO (000a000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000192100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000392100c0) TDO (0000000400000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000052100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000252100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000152100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000352100c0) TDO (0c80000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d2100c0) TDO (3397a00600000040) MASK (ffffffff00000000); +SDR 64 TDI (000000002d2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000032100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000232100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000132100c0) TDO (0001200000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000332100c0) TDO (0402800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b2100c0) TDO (1001200000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b2100c0) TDO (0904800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000072100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000272100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000172100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000372100c0) TDO (2200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f2100c0) TDO (8000008000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f2100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000000a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000020a100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000010a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000030a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000008a100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000028a100c0) TDO (0990120000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000018a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000038a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000004a100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000024a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000014a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000034a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ca100c0) TDO (e080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ca100c0) TDO (0000000300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ca100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ca100c0) TDO (0800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000002a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000022a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000012a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000032a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000aa100c0) TDO (8424000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002aa100c0) TDO (0000000300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001aa100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003aa100c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000006a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000026a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000016a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000036a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ea100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ea100c0) TDO (0000080b00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ea100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ea100c0) TDO (0180000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000001a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000021a100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000011a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000031a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000009a100c0) TDO (0024000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000029a100c0) TDO (0000014300000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000019a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000039a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000005a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000025a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000015a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000035a100c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000da100c0) TDO (2200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002da100c0) TDO (0000008000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001da100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003da100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000003a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000023a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000013a100c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000033a100c0) TDO (1880000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ba100c0) TDO (4000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ba100c0) TDO (0800400800000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ba100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ba100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000007a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000027a100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000017a100c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000037a100c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000fa100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002fa100c0) TDO (0000000400000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001fa100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003fa100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000006100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000206100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000106100c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000306100c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000086100c0) TDO (9000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000286100c0) TDO (0000008200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000186100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000386100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000046100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000246100c0) TDO (0000080000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000146100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000346100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c6100c0) TDO (0800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000026100c0) TDO (0000001200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000226100c0) TDO (0000800000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000126100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000326100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a6100c0) TDO (6240000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a6100c0) TDO (0004800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000066100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000266100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000166100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000366100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e6100c0) TDO (7012000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e6100c0) TDO (0008001300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000016100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000216100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000116100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000316100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000096100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000296100c0) TDO (0080008300000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000196100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000396100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000056100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000256100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000156100c0) TDO (3000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000356100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000036100c0) TDO (0000001000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000236100c0) TDO (0000040000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000136100c0) TDO (3700000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000336100c0) TDO (0000000900000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b6100c0) TDO (1240000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b6100c0) TDO (0004800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000076100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000276100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000176100c0) TDO (3000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000376100c0) TDO (0000a40100000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f6100c0) TDO (8800200000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f6100c0) TDO (0000200000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f6100c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f6100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000000e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000020e100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000010e100c0) TDO (0800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000030e100c0) TDO (000800a800000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000008e100c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000028e100c0) TDO (0000010000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000018e100c0) TDO (0004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000038e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000004e100c0) TDO (0000000200000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000024e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000014e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000034e100c0) TDO (0200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ce100c0) TDO (0800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ce100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ce100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ce100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000002e100c0) TDO (0000003000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000022e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000012e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000032e100c0) TDO (1890000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ae100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ae100c0) TDO (0200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ae100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ae100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000006e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000026e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000016e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000036e100c0) TDO (d800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ee100c0) TDO (8400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ee100c0) TDO (1800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ee100c0) TDO (6000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ee100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000001e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000021e100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000011e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000031e100c0) TDO (c000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000009e100c0) TDO (0100002400000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000029e100c0) TDO (0004610000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000019e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000039e100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000005e100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000025e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000015e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000035e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000de100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002de100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001de100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003de100c0) TDO (0180000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000003e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000023e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000013e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000033e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000be100c0) TDO (6024000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002be100c0) TDO (0900000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001be100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003be100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000007e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000027e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000017e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000037e100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000fe100c0) TDO (6801100000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002fe100c0) TDO (0000001300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001fe100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003fe100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000001100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000201100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000101100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000301100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000081100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000281100c0) TDO (0002808300000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000181100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000381100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000041100c0) TDO (0000000c00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000241100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000141100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000341100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c1100c0) TDO (a800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c1100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c1100c0) TDO (8000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000021100c0) TDO (0000002900000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000221100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000121100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000321100c0) TDO (0000240000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a1100c0) TDO (2000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a1100c0) TDO (0000210200000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000061100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000261100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000161100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000361100c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e1100c0) TDO (5000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e1100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e1100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000011100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000211100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000111100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000311100c0) TDO (0000040000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000091100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000291100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000191100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000391100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000051100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000251100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000151100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000351100c0) TDO (0004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d1100c0) TDO (0018000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d1100c0) TDO (0060000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000031100c0) TDO (0000000200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000231100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000131100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000331100c0) TDO (0000800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b1100c0) TDO (6000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000071100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000271100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000171100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000371100c0) TDO (0000040000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f1100c0) TDO (7800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f1100c0) TDO (0008000b00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f1100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000009100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000209100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000109100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000309100c0) TDO (0000200000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000089100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000289100c0) TDO (0080008300000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000189100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000389100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000049100c0) TDO (0000000800000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000249100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000149100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000349100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c9100c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c9100c0) TDO (0180000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000029100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000229100c0) TDO (0014000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000129100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000329100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a9100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a9100c0) TDO (0020000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000069100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000269100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000169100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000369100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e9100c0) TDO (8822000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e9100c0) TDO (1200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000019100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000219100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000119100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000319100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000099100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000299100c0) TDO (0000220000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000199100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000399100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000059100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000259100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000159100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000359100c0) TDO (0200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d9100c0) TDO (0000400000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000039100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000239100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000139100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000339100c0) TDO (1800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b9100c0) TDO (6000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b9100c0) TDO (0002000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000079100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000279100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000179100c0) TDO (0000800000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000379100c0) TDO (d800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f9100c0) TDO (6800000800000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f9100c0) TDO (0000c00b00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f9100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000005100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000205100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000105100c0) TDO (0000200000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000305100c0) TDO (c000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000085100c0) TDO (0000002000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000285100c0) TDO (0000008300000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000185100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000385100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000045100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000245100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000145100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000345100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c5100c0) TDO (0012000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000025100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000225100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000125100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000325100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000065100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000265100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000165100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000365100c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e5100c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000015100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000215100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000115100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000315100c0) TDO (0000040000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000095100c0) TDO (0000200000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000295100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000195100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000395100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000055100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000255100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000155100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000355100c0) TDO (0010000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d5100c0) TDO (0004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d5100c0) TDO (0004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000035100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000235100c0) TDO (0000500000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000135100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000335100c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b5100c0) TDO (0002000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b5100c0) TDO (0020000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000075100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000275100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000175100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000375100c0) TDO (0020000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f5100c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f5100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000000d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000020d100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000010d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000030d100c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000008d100c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000028d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000018d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000038d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000004d100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000024d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000014d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000034d100c0) TDO (0018000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000cd100c0) TDO (0902500000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002cd100c0) TDO (0000c00000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001cd100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003cd100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000002d100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000022d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000012d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000032d100c0) TDO (0081000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ad100c0) TDO (1208000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ad100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ad100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ad100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000006d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000026d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000016d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000036d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ed100c0) TDO (9100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ed100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ed100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ed100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000001d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000021d100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000011d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000031d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000009d100c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000029d100c0) TDO (0000120000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000019d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000039d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000005d100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000025d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000015d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000035d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000dd100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002dd100c0) TDO (0400200300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001dd100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003dd100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000003d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000023d100c0) TDO (000a000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000013d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000033d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000bd100c0) TDO (5000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002bd100c0) TDO (0800010300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001bd100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003bd100c0) TDO (0880000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000007d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000027d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000017d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000037d100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000fd100c0) TDO (2000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002fd100c0) TDO (0000100a00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001fd100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003fd100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000003100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000203100c0) TDO (0012000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000103100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000303100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000083100c0) TDO (8000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000283100c0) TDO (0000028200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000183100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000383100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000043100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000243100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000143100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000343100c0) TDO (0008000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c3100c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c3100c0) TDO (0000000300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000023100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000223100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000123100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000323100c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a3100c0) TDO (5200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a3100c0) TDO (0000210300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000063100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000263100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000163100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000363100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e3100c0) TDO (2012000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e3100c0) TDO (0000080a00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e3100c0) TDO (0060000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000013100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000213100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000113100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000313100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000093100c0) TDO (8000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000293100c0) TDO (0000018200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000193100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000393100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000053100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000253100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000153100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000353100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d3100c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d3100c0) TDO (0000000b00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000033100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000233100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000133100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000333100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b3100c0) TDO (7000800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b3100c0) TDO (0000008000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000073100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000273100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000173100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000373100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f3100c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f3100c0) TDO (0000020700000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f3100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000000b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000020b100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000010b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000030b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000008b100c0) TDO (8400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000028b100c0) TDO (0000028300000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000018b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000038b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000004b100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000024b100c0) TDO (0000002400000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000014b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000034b100c0) TDO (2000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000cb100c0) TDO (0800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002cb100c0) TDO (1004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001cb100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003cb100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000002b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000022b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000012b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000032b100c0) TDO (e800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ab100c0) TDO (6000046400000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ab100c0) TDO (0400800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ab100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ab100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000006b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000026b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000016b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000036b100c0) TDO (d000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000eb100c0) TDO (7012120200000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002eb100c0) TDO (0000002300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001eb100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003eb100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000001b100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000021b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000011b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000031b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000009b100c0) TDO (000100a000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000029b100c0) TDO (0000008300000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000019b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000039b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000005b100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000025b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000015b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000035b100c0) TDO (4008000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000db100c0) TDO (0c40020200000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002db100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001db100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003db100c0) TDO (0004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000003b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000023b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000013b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000033b100c0) TDO (1801000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000bb100c0) TDO (1000009000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002bb100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001bb100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003bb100c0) TDO (0040000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000007b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000027b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000017b100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000037b100c0) TDO (9800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000fb100c0) TDO (9008180000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002fb100c0) TDO (0000400000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001fb100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003fb100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000007100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000207100c0) TDO (000a000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000107100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000307100c0) TDO (c000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000087100c0) TDO (0004806100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000287100c0) TDO (0001220000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000187100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000387100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000047100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000247100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000147100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000347100c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c7100c0) TDO (2000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c7100c0) TDO (0800400000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000027100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000227100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000127100c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000327100c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a7100c0) TDO (4000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a7100c0) TDO (0800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000067100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000267100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000167100c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000367100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e7100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000017100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000217100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000117100c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000317100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000097100c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000297100c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000197100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000397100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000057100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000257100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000157100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000357100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d7100c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d7100c0) TDO (0084000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000037100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000237100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000137100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000337100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b7100c0) TDO (0200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b7100c0) TDO (0010800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000077100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000277100c0) TDO (0000010000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000177100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000377100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f7100c0) TDO (0020000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f7100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000000f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000020f100c0) TDO (000000a800000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000010f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000030f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000008f100c0) TDO (0004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000028f100c0) TDO (0001400000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000018f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000038f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000004f100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000024f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000014f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000034f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000cf100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002cf100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001cf100c0) TDO (0004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003cf100c0) TDO (0480000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000002f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000022f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000012f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000032f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000af100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002af100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001af100c0) TDO (0002000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003af100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000006f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000026f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000016f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000036f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ef100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ef100c0) TDO (0002000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ef100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ef100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000001f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000021f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000011f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000031f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000009f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000029f100c0) TDO (0000400000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000019f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000039f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000005f100c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000025f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000015f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000035f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000df100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002df100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001df100c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003df100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000003f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000023f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000013f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000033f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000bf100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002bf100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001bf100c0) TDO (0040000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003bf100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000007f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000027f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000017f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000037f100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ff100c0) TDO (0008400000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ff100c0) TDO (0008000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ff100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ff100c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000000900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000200900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000100900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000300900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000080900c0) TDO (0002100000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000280900c0) TDO (0020000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000180900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000380900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000040900c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000240900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000140900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000340900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c0900c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c0900c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000020900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000220900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000120900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000320900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a0900c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a0900c0) TDO (0800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000060900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000260900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000160900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000360900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e0900c0) TDO (0040000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000010900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000210900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000110900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000310900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000090900c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000290900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000190900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000390900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000050900c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000250900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000150900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000350900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000030900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000230900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000130900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000330900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000070900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000270900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000170900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000370900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f0900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000008900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000208900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000108900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000308900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000088900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000288900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000188900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000388900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000048900c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000248900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000148900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000348900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000028900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000228900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000128900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000328900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000068900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000268900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000168900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000368900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e8900c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000018900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000218900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000118900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000318900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000098900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000298900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000198900c0) TDO (0040000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000398900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000058900c0) TDO (0000004000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000258900c0) TDO (0000002000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000158900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000358900c0) TDO (2000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d8900c0) TDO (0000020000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000038900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000238900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000138900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000338900c0) TDO (f800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b8900c0) TDO (000000a800000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000078900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000278900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000178900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000378900c0) TDO (9000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f8900c0) TDO (0480000200000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f8900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000004900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000204900c0) TDO (0000000400000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000104900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000304900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000084900c0) TDO (000004a000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000284900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000184900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000384900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000044900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000244900c0) TDO (0000000200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000144900c0) TDO (3000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000344900c0) TDO (9000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c4900c0) TDO (0000108100000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000024900c0) TDO (0000001200000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000224900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000124900c0) TDO (3700000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000324900c0) TDO (6000000900000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a4900c0) TDO (0000805000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000064900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000264900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000164900c0) TDO (3000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000364900c0) TDO (9800800100000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e4900c0) TDO (0000020200000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e4900c0) TDO (0200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000014900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000214900c0) TDO (0000000400000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000114900c0) TDO (0800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000314900c0) TDO (8004011800000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000094900c0) TDO (000000a000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000294900c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000194900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000394900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000054900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000254900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000154900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000354900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d4900c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d4900c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000034900c0) TDO (0000007f00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000234900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000134900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000334900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b4900c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b4900c0) TDO (0001800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000074900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000274900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000174900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000374900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f4900c0) TDO (0000900000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f4900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000000c900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000020c900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000010c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000030c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000008c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000028c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000018c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000038c900c0) TDO (0084280400000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000004c900c0) TDO (0000007f00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000024c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000014c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000034c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000cc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002cc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001cc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003cc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000002c900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000022c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000012c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000032c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ac900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ac900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ac900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ac900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000006c900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000026c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000016c900c0) TDO (0000040000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000036c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ec900c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ec900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ec900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ec900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000001c900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000021c900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000011c900c0) TDO (0000020000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000031c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000009c900c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000029c900c0) TDO (0004400000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000019c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000039c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000005c900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000025c900c0) TDO (0000200000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000015c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000035c900c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000dc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002dc900c0) TDO (0000000300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001dc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003dc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000003c900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000023c900c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000013c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000033c900c0) TDO (0000800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000bc900c0) TDO (7000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002bc900c0) TDO (0000004700000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001bc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003bc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000007c900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000027c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000017c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000037c900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000fc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002fc900c0) TDO (0800d00300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001fc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003fc900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000002900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000202900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000102900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000302900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000082900c0) TDO (8000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000282900c0) TDO (0800018800000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000182900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000382900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000042900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000242900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000142900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000342900c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000022900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000222900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000122900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000322900c0) TDO (0000080000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000062900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000262900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000162900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000362900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000012900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000212900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000112900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000312900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000092900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000292900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000192900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000392900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000052900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000252900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000152900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000352900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000032900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000232900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000132900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000332900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000072900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000272900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000172900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000372900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f2900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000000a900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000020a900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000010a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000030a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000008a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000028a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000018a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000038a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000004a900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000024a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000014a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000034a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ca900c0) TDO (0100000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ca900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ca900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ca900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000002a900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000022a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000012a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000032a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000aa900c0) TDO (0200000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002aa900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001aa900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003aa900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000006a900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000026a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000016a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000036a900c0) TDO (0000800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ea900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ea900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ea900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ea900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000001a900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000021a900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000011a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000031a900c0) TDO (0004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000009a900c0) TDO (0280000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000029a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000019a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000039a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000005a900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000025a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000015a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000035a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000da900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002da900c0) TDO (0008000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001da900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003da900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000003a900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000023a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000013a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000033a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ba900c0) TDO (0000a00000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ba900c0) TDO (0020000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ba900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ba900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000007a900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000027a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000017a900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000037a900c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000fa900c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002fa900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001fa900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003fa900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000006900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000206900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000106900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000306900c0) TDO (0000800000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000086900c0) TDO (0000400000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000286900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000186900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000386900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000046900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000246900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000146900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000346900c0) TDO (9000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c6900c0) TDO (0000001000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000026900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000226900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000126900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000326900c0) TDO (7800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a6900c0) TDO (0000086000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000066900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000266900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000166900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000366900c0) TDO (8001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e6900c0) TDO (0000040000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000016900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000216900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000116900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000316900c0) TDO (8000800000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000096900c0) TDO (0000006800000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000296900c0) TDO (0002800000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000196900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000396900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000056900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000256900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000156900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000356900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d6900c0) TDO (0800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000036900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000236900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000136900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000336900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b6900c0) TDO (4000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b6900c0) TDO (0800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000076900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000276900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000176900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000376900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f6900c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f6900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000000e900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000020e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000010e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000030e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000008e900c0) TDO (1000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000028e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000018e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000038e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000004e900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000024e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000014e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000034e900c0) TDO (9000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ce900c0) TDO (0008200800000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ce900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ce900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ce900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000002e900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000022e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000012e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000032e900c0) TDO (6000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ae900c0) TDO (0002146000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ae900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ae900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ae900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000006e900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000026e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000016e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000036e900c0) TDO (9840000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ee900c0) TDO (0022040000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ee900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ee900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ee900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000001e900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000021e900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000011e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000031e900c0) TDO (8080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000009e900c0) TDO (0000006800000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000029e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000019e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000039e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000005e900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000025e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000015e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000035e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000de900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002de900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001de900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003de900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000003e900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000023e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000013e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000033e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000be900c0) TDO (0000600000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002be900c0) TDO (0c00000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001be900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003be900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000007e900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000027e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000017e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000037e900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000fe900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002fe900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001fe900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003fe900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000001900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000201900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000101900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000301900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000081900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000281900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000181900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000381900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000041900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000241900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000141900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000341900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c1900c0) TDO (0000400000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000021900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000221900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000121900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000321900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a1900c0) TDO (0001000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000061900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000261900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000161900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000361900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000011900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000211900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000111900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000311900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000091900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000291900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000191900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000391900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000051900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000251900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000151900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000351900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000031900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000231900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000131900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000331900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000071900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000271900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000171900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000371900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f1900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000009900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000209900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000109900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000309900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000089900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000289900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000189900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000389900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000049900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000249900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000149900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000349900c0) TDO (0040000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c9900c0) TDO (0000800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000029900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000229900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000129900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000329900c0) TDO (0080000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a9900c0) TDO (0000800000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000069900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000269900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000169900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000369900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e9900c0) TDO (0000100000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000019900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000219900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000119900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000319900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000099900c0) TDO (0014800000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000299900c0) TDO (0050000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000199900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000399900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000059900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000259900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000159900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000359900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000039900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000239900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000139900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000339900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000079900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000279900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000179900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000379900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f9900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000005900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000205900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000105900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000305900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000085900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000285900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000185900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000385900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000045900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000245900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000145900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000345900c0) TDO (2000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000c5900c0) TDO (0400000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002c5900c0) TDO (1800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001c5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003c5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000025900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000225900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000125900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000325900c0) TDO (e800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000a5900c0) TDO (008008a100000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002a5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001a5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003a5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000065900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000265900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000165900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000365900c0) TDO (d000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000e5900c0) TDO (0000040000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002e5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001e5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003e5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000015900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000215900c0) TDO (0000000100000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000115900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000315900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000095900c0) TDO (0000006800000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000295900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000195900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000395900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000055900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000255900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000155900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000355900c0) TDO (9000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000d5900c0) TDO (0000910100000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002d5900c0) TDO (0000000300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001d5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003d5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000035900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000235900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000135900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000335900c0) TDO (6000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000b5900c0) TDO (7000009000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002b5900c0) TDO (0000004b00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001b5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003b5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000075900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000275900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000175900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000375900c0) TDO (9800000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000f5900c0) TDO (0000040100000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002f5900c0) TDO (0000000300000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001f5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003f5900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000000d900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000020d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000010d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000030d900c0) TDO (8000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000008d900c0) TDO (8000006000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000028d900c0) TDO (00000a8800000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000018d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000038d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000004d900c0) TDO (0000007e00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000024d900c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000014d900c0) TDO (0040010a00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000034d900c0) TDO (1100042800000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000cd900c0) TDO (0002002000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002cd900c0) TDO (e000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001cd900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003cd900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000002d900c0) TDO (0000007f00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000022d900c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000012d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000032d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ad900c0) TDO (0180c60000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ad900c0) TDO (e663183000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ad900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ad900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000006d900c0) TDO (0000007f00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000026d900c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000016d900c0) TDO (0001800000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000036d900c0) TDO (0004000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000ed900c0) TDO (0000080000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002ed900c0) TDO (e002080000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001ed900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003ed900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000001d900c0) TDO (0000007f00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000021d900c0) TDO (011fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000011d900c0) TDO (0440010a00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000031d900c0) TDO (1101042800000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000009d900c0) TDO (4243422000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000029d900c0) TDO (e561104800000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000019d900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000039d900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000005d900c0) TDO (0000007f00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000025d900c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000015d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000035d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000dd900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002dd900c0) TDO (e000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001dd900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003dd900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000003d900c0) TDO (0000007f00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000023d900c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000013d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000033d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000bd900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002bd900c0) TDO (e000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001bd900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003bd900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000007d900c0) TDO (0000007f00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000027d900c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000017d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (0000000037d900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000000fd900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000002fd900c0) TDO (e000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (000000001fd900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (000000003fd900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000003900c0) TDO (0000007f00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000203900c0) TDO (001fffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000103900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000303900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000083900c0) TDO (0000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000283900c0) TDO (e000000000000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000183900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000383900c0) TDO (ffffffff00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000043900c0) TDO (0000007f00000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000243900c0) TDO (403f005400000000) MASK (ffffffff00000000); +SDR 64 TDI (00000000143900c0) TDO (f1f0000000000000) MASK (ffffffff00000000); +SIR 10 TDI (3f7); +RUNTEST 100 TCK; diff --git a/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_routed.v b/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_routed.v new file mode 100644 index 00000000..0e6ee1d6 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_routed.v @@ -0,0 +1,2342 @@ +`timescale 1 ps/ 1 ps + +module top( + MCU_D, + MCU_DIR, + MCU_IO_STBX, + MCU_LCD_WRX, + MCU_ADDR, + MCU_LCD_TE, + MCU_P2_8, + MCU_LCD_RDX, + TP_U, + TP_D, + TP_L, + TP_R, + SW_SEL, + SW_ROT_A, + SW_ROT_B, + SW_U, + SW_D, + SW_L, + SW_R, + LCD_RESETX, + LCD_RS, + LCD_WRX, + LCD_RDX, + LCD_DB, + LCD_TE, + LCD_BACKLIGHT, + SYSOFF, + AUDIO_RESETX, + REF_EN, + GPS_RESETX, + GPS_TX_READY, + GPS_TIMEPULSE, + DEVICE_RESET, + DEVICE_RESET_V); +output [7:0] MCU_D; +input MCU_DIR; +input MCU_IO_STBX; +input MCU_LCD_WRX; +input MCU_ADDR; +output MCU_LCD_TE; +input MCU_P2_8; +input MCU_LCD_RDX; +output TP_U; +output TP_D; +output TP_L; +output TP_R; +input SW_SEL; +input SW_ROT_A; +input SW_ROT_B; +input SW_U; +input SW_D; +input SW_L; +input SW_R; +output LCD_RESETX; +output LCD_RS; +output LCD_WRX; +output LCD_RDX; +output [15:0] LCD_DB; +input LCD_TE; +output LCD_BACKLIGHT; +output SYSOFF; +output AUDIO_RESETX; +output REF_EN; +output GPS_RESETX; +input GPS_TX_READY; +input GPS_TIMEPULSE; +input DEVICE_RESET; +input DEVICE_RESET_V; + +//wire gnd; +//wire vcc; +wire AsyncReset_X1_Y15_GND; +wire AsyncReset_X1_Y19_GND; +wire AsyncReset_X1_Y20_GND; +wire AsyncReset_X1_Y21_GND; +wire AsyncReset_X1_Y24_GND; +wire AsyncReset_X1_Y26_GND; +wire \DEVICE_RESET_V~input_o ; +wire \DEVICE_RESET~input_o ; +wire \GPS_TIMEPULSE~input_o ; +wire \GPS_TX_READY~input_o ; +wire \LCD_DB[0]~input_o ; +wire \LCD_DB[10]~input_o ; +wire \LCD_DB[11]~input_o ; +wire \LCD_DB[12]~input_o ; +wire \LCD_DB[13]~input_o ; +wire \LCD_DB[14]~input_o ; +wire \LCD_DB[15]~input_o ; +wire \LCD_DB[1]~input_o ; +wire \LCD_DB[2]~input_o ; +wire \LCD_DB[3]~input_o ; +wire \LCD_DB[4]~input_o ; +wire \LCD_DB[5]~input_o ; +wire \LCD_DB[6]~input_o ; +wire \LCD_DB[7]~input_o ; +wire \LCD_DB[8]~input_o ; +wire \LCD_DB[9]~input_o ; +wire \LCD_TE~input_o ; +wire \MCU_ADDR~input_o ; +wire \MCU_DIR~input_o ; +wire \MCU_D[0]~input_o ; +wire \MCU_D[1]~input_o ; +wire \MCU_D[2]~input_o ; +wire \MCU_D[3]~input_o ; +wire \MCU_D[4]~input_o ; +wire \MCU_D[5]~input_o ; +wire \MCU_D[6]~input_o ; +wire \MCU_D[7]~input_o ; +wire \MCU_IO_STBX~input_o ; +wire \MCU_IO_STBX~inputclkctrl_outclk ; +wire \MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ; +wire \MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ; +wire \MCU_LCD_RDX~input_o ; +wire \MCU_LCD_RDX~inputclkctrl_outclk ; +wire \MCU_LCD_RDX~inputclkctrl_outclk_X1_Y19_SIG_VCC ; +wire \MCU_LCD_RDX~inputclkctrl_outclk_X1_Y21_SIG_VCC ; +wire \MCU_LCD_RDX~inputclkctrl_outclk_X1_Y24_SIG_VCC ; +wire \MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC ; +wire \MCU_LCD_WRX~input_o ; +wire \MCU_LCD_WRX~inputclkctrl_outclk ; +wire \MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ; +wire \MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC ; +wire \MCU_P2_8~input_o ; +wire \SW_D~input_o ; +wire \SW_L~input_o ; +wire \SW_ROT_A~input_o ; +wire \SW_ROT_B~input_o ; +wire \SW_R~input_o ; +wire \SW_SEL~input_o ; +wire \SW_U~input_o ; +wire SyncLoad_X1_Y15_VCC; +wire SyncLoad_X1_Y19_VCC; +wire SyncLoad_X1_Y20_VCC; +wire SyncLoad_X1_Y21_VCC; +wire SyncLoad_X1_Y24_VCC; +wire SyncLoad_X1_Y26_VCC; +wire SyncReset_X1_Y15_GND; +wire SyncReset_X1_Y19_GND; +wire SyncReset_X1_Y20_GND; +wire SyncReset_X1_Y21_GND; +wire SyncReset_X1_Y24_GND; +wire SyncReset_X1_Y26_GND; +wire \audio_reset_q~0_combout ; +wire \audio_reset_q~q ; +tri1 devclrn; +tri1 devoe; +tri1 devpor; +wire \lcd_backlight_q~feeder_combout ; +wire \lcd_backlight_q~q ; +wire [7:0] lcd_data_in_q; +//wire lcd_data_in_q[0]; +//wire lcd_data_in_q[1]; +//wire lcd_data_in_q[2]; +//wire lcd_data_in_q[3]; +//wire lcd_data_in_q[4]; +//wire lcd_data_in_q[5]; +//wire lcd_data_in_q[6]; +//wire lcd_data_in_q[7]; +wire [7:0] lcd_data_out_q; +//wire lcd_data_out_q[0]; +wire \lcd_data_out_q[0]~feeder_combout ; +//wire lcd_data_out_q[1]; +wire \lcd_data_out_q[1]~feeder_combout ; +//wire lcd_data_out_q[2]; +wire \lcd_data_out_q[2]~feeder_combout ; +//wire lcd_data_out_q[3]; +//wire lcd_data_out_q[4]; +wire \lcd_data_out_q[4]~feeder_combout ; +//wire lcd_data_out_q[5]; +//wire lcd_data_out_q[6]; +//wire lcd_data_out_q[7]; +wire \lcd_data_out_q[7]~feeder_combout ; +wire \lcd_reset_q~0_combout ; +wire \lcd_reset_q~1_combout ; +wire \lcd_reset_q~q ; +wire \mcu_data_out[0]~0_combout ; +wire \mcu_data_out[0]~1_combout ; +wire \mcu_data_out[1]~2_combout ; +wire \mcu_data_out[1]~3_combout ; +wire \mcu_data_out[2]~4_combout ; +wire \mcu_data_out[2]~5_combout ; +wire \mcu_data_out[3]~6_combout ; +wire \mcu_data_out[3]~7_combout ; +wire \mcu_data_out[4]~8_combout ; +wire \mcu_data_out[4]~9_combout ; +wire \mcu_data_out[5]~10_combout ; +wire \mcu_data_out[5]~11_combout ; +wire \mcu_data_out[6]~12_combout ; +wire \mcu_data_out[6]~13_combout ; +wire \mcu_data_out[7]~14_combout ; +wire \mcu_data_out[7]~15_combout ; +wire \ref_en_q~feeder_combout ; +wire \ref_en_q~q ; +wire \sysoff_q~feeder_combout ; +wire \sysoff_q~q ; +wire [7:0] tp_q; +//wire tp_q[0]; +//wire tp_q[1]; +//wire tp_q[2]; +wire \tp_q[2]~feeder_combout ; +//wire tp_q[3]; +wire \tp_q[3]~0_combout ; +//wire tp_q[4]; +wire \tp_q[4]~feeder_combout ; +//wire tp_q[5]; +//wire tp_q[6]; +wire \tp_q[6]~feeder_combout ; +//wire tp_q[7]; +wire \tp_q[7]~feeder_combout ; +wire unknown; +wire \~ALTERA_ASDO_DATA1~~ibuf_o ; +wire \~ALTERA_ASDO_DATA1~~padout ; +wire \~ALTERA_DATA0~~ibuf_o ; +wire \~ALTERA_DATA0~~padout ; +wire \~ALTERA_FLASH_nCE_nCSO~~ibuf_o ; +wire \~ALTERA_FLASH_nCE_nCSO~~padout ; + +wire vcc; +wire gnd; +assign vcc = 1'b1; +assign gnd = 1'b0; + +alta_io \AUDIO_RESETX~output ( + .datain(\audio_reset_q~q ), + .oe(vcc), + .padio(AUDIO_RESETX), + .combout()); +defparam \AUDIO_RESETX~output .coord_x = 7; +defparam \AUDIO_RESETX~output .coord_y = 2; +defparam \AUDIO_RESETX~output .coord_z = 4; +defparam \AUDIO_RESETX~output .PRG_DELAYB = 1'b1; +defparam \AUDIO_RESETX~output .RX_SEL = 1'b0; +defparam \AUDIO_RESETX~output .PDCNTL = 2'b01; +defparam \AUDIO_RESETX~output .NDCNTL = 2'b01; +defparam \AUDIO_RESETX~output .PRG_SLR = 1'b1; +defparam \AUDIO_RESETX~output .CFG_KEEP = 2'b00; +defparam \AUDIO_RESETX~output .PU = 4'b0000; + +alta_io \DEVICE_RESET_V~input ( + .datain(gnd), + .oe(gnd), + .padio(DEVICE_RESET_V), + .combout(\DEVICE_RESET_V~input_o )); +defparam \DEVICE_RESET_V~input .coord_x = 4; +defparam \DEVICE_RESET_V~input .coord_y = 0; +defparam \DEVICE_RESET_V~input .coord_z = 5; +defparam \DEVICE_RESET_V~input .PRG_DELAYB = 1'b1; +defparam \DEVICE_RESET_V~input .RX_SEL = 1'b0; +defparam \DEVICE_RESET_V~input .PDCNTL = 2'b11; +defparam \DEVICE_RESET_V~input .NDCNTL = 2'b11; +defparam \DEVICE_RESET_V~input .PRG_SLR = 1'b0; +defparam \DEVICE_RESET_V~input .CFG_KEEP = 2'b00; +defparam \DEVICE_RESET_V~input .PU = 4'b0000; + +alta_io \DEVICE_RESET~input ( + .datain(gnd), + .oe(gnd), + .padio(DEVICE_RESET), + .combout(\DEVICE_RESET~input_o )); +defparam \DEVICE_RESET~input .coord_x = 6; +defparam \DEVICE_RESET~input .coord_y = 0; +defparam \DEVICE_RESET~input .coord_z = 0; +defparam \DEVICE_RESET~input .PRG_DELAYB = 1'b1; +defparam \DEVICE_RESET~input .RX_SEL = 1'b0; +defparam \DEVICE_RESET~input .PDCNTL = 2'b11; +defparam \DEVICE_RESET~input .NDCNTL = 2'b11; +defparam \DEVICE_RESET~input .PRG_SLR = 1'b0; +defparam \DEVICE_RESET~input .CFG_KEEP = 2'b00; +defparam \DEVICE_RESET~input .PU = 4'b0000; + +alta_io \GPS_RESETX~output ( + .datain(vcc), + .oe(vcc), + .padio(GPS_RESETX), + .combout()); +defparam \GPS_RESETX~output .coord_x = 7; +defparam \GPS_RESETX~output .coord_y = 3; +defparam \GPS_RESETX~output .coord_z = 0; +defparam \GPS_RESETX~output .PRG_DELAYB = 1'b1; +defparam \GPS_RESETX~output .RX_SEL = 1'b0; +defparam \GPS_RESETX~output .PDCNTL = 2'b01; +defparam \GPS_RESETX~output .NDCNTL = 2'b01; +defparam \GPS_RESETX~output .PRG_SLR = 1'b1; +defparam \GPS_RESETX~output .CFG_KEEP = 2'b00; +defparam \GPS_RESETX~output .PU = 4'b0000; + +alta_io \GPS_TIMEPULSE~input ( + .datain(gnd), + .oe(gnd), + .padio(GPS_TIMEPULSE), + .combout(\GPS_TIMEPULSE~input_o )); +defparam \GPS_TIMEPULSE~input .coord_x = 6; +defparam \GPS_TIMEPULSE~input .coord_y = 4; +defparam \GPS_TIMEPULSE~input .coord_z = 5; +defparam \GPS_TIMEPULSE~input .PRG_DELAYB = 1'b1; +defparam \GPS_TIMEPULSE~input .RX_SEL = 1'b0; +defparam \GPS_TIMEPULSE~input .PDCNTL = 2'b01; +defparam \GPS_TIMEPULSE~input .NDCNTL = 2'b01; +defparam \GPS_TIMEPULSE~input .PRG_SLR = 1'b1; +defparam \GPS_TIMEPULSE~input .CFG_KEEP = 2'b00; +defparam \GPS_TIMEPULSE~input .PU = 4'b1000; + +alta_io \GPS_TX_READY~input ( + .datain(gnd), + .oe(gnd), + .padio(GPS_TX_READY), + .combout(\GPS_TX_READY~input_o )); +defparam \GPS_TX_READY~input .coord_x = 6; +defparam \GPS_TX_READY~input .coord_y = 4; +defparam \GPS_TX_READY~input .coord_z = 4; +defparam \GPS_TX_READY~input .PRG_DELAYB = 1'b1; +defparam \GPS_TX_READY~input .RX_SEL = 1'b0; +defparam \GPS_TX_READY~input .PDCNTL = 2'b01; +defparam \GPS_TX_READY~input .NDCNTL = 2'b01; +defparam \GPS_TX_READY~input .PRG_SLR = 1'b1; +defparam \GPS_TX_READY~input .CFG_KEEP = 2'b00; +defparam \GPS_TX_READY~input .PU = 4'b1000; + +alta_io \LCD_BACKLIGHT~output ( + .datain(\lcd_backlight_q~q ), + .oe(vcc), + .padio(LCD_BACKLIGHT), + .combout()); +defparam \LCD_BACKLIGHT~output .coord_x = 5; +defparam \LCD_BACKLIGHT~output .coord_y = 4; +defparam \LCD_BACKLIGHT~output .coord_z = 4; +defparam \LCD_BACKLIGHT~output .PRG_DELAYB = 1'b1; +defparam \LCD_BACKLIGHT~output .RX_SEL = 1'b0; +defparam \LCD_BACKLIGHT~output .PDCNTL = 2'b01; +defparam \LCD_BACKLIGHT~output .NDCNTL = 2'b01; +defparam \LCD_BACKLIGHT~output .PRG_SLR = 1'b1; +defparam \LCD_BACKLIGHT~output .CFG_KEEP = 2'b00; +defparam \LCD_BACKLIGHT~output .PU = 4'b0000; + +alta_io \LCD_DB[0]~output ( + .datain(\MCU_D[0]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[0]), + .combout(\LCD_DB[0]~input_o )); +defparam \LCD_DB[0]~output .coord_x = 2; +defparam \LCD_DB[0]~output .coord_y = 4; +defparam \LCD_DB[0]~output .coord_z = 1; +defparam \LCD_DB[0]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[0]~output .RX_SEL = 1'b0; +defparam \LCD_DB[0]~output .PDCNTL = 2'b01; +defparam \LCD_DB[0]~output .NDCNTL = 2'b01; +defparam \LCD_DB[0]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[0]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[0]~output .PU = 4'b1000; + +alta_io \LCD_DB[10]~output ( + .datain(lcd_data_out_q[2]), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[10]), + .combout(\LCD_DB[10]~input_o )); +defparam \LCD_DB[10]~output .coord_x = 4; +defparam \LCD_DB[10]~output .coord_y = 4; +defparam \LCD_DB[10]~output .coord_z = 0; +defparam \LCD_DB[10]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[10]~output .RX_SEL = 1'b0; +defparam \LCD_DB[10]~output .PDCNTL = 2'b01; +defparam \LCD_DB[10]~output .NDCNTL = 2'b01; +defparam \LCD_DB[10]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[10]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[10]~output .PU = 4'b1000; + +alta_io \LCD_DB[11]~output ( + .datain(lcd_data_out_q[3]), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[11]), + .combout(\LCD_DB[11]~input_o )); +defparam \LCD_DB[11]~output .coord_x = 4; +defparam \LCD_DB[11]~output .coord_y = 4; +defparam \LCD_DB[11]~output .coord_z = 1; +defparam \LCD_DB[11]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[11]~output .RX_SEL = 1'b0; +defparam \LCD_DB[11]~output .PDCNTL = 2'b01; +defparam \LCD_DB[11]~output .NDCNTL = 2'b01; +defparam \LCD_DB[11]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[11]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[11]~output .PU = 4'b1000; + +alta_io \LCD_DB[12]~output ( + .datain(lcd_data_out_q[4]), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[12]), + .combout(\LCD_DB[12]~input_o )); +defparam \LCD_DB[12]~output .coord_x = 4; +defparam \LCD_DB[12]~output .coord_y = 4; +defparam \LCD_DB[12]~output .coord_z = 2; +defparam \LCD_DB[12]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[12]~output .RX_SEL = 1'b0; +defparam \LCD_DB[12]~output .PDCNTL = 2'b01; +defparam \LCD_DB[12]~output .NDCNTL = 2'b01; +defparam \LCD_DB[12]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[12]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[12]~output .PU = 4'b1000; + +alta_io \LCD_DB[13]~output ( + .datain(lcd_data_out_q[5]), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[13]), + .combout(\LCD_DB[13]~input_o )); +defparam \LCD_DB[13]~output .coord_x = 4; +defparam \LCD_DB[13]~output .coord_y = 4; +defparam \LCD_DB[13]~output .coord_z = 3; +defparam \LCD_DB[13]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[13]~output .RX_SEL = 1'b0; +defparam \LCD_DB[13]~output .PDCNTL = 2'b01; +defparam \LCD_DB[13]~output .NDCNTL = 2'b01; +defparam \LCD_DB[13]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[13]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[13]~output .PU = 4'b1000; + +alta_io \LCD_DB[14]~output ( + .datain(lcd_data_out_q[6]), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[14]), + .combout(\LCD_DB[14]~input_o )); +defparam \LCD_DB[14]~output .coord_x = 4; +defparam \LCD_DB[14]~output .coord_y = 4; +defparam \LCD_DB[14]~output .coord_z = 4; +defparam \LCD_DB[14]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[14]~output .RX_SEL = 1'b0; +defparam \LCD_DB[14]~output .PDCNTL = 2'b01; +defparam \LCD_DB[14]~output .NDCNTL = 2'b01; +defparam \LCD_DB[14]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[14]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[14]~output .PU = 4'b1000; + +alta_io \LCD_DB[15]~output ( + .datain(lcd_data_out_q[7]), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[15]), + .combout(\LCD_DB[15]~input_o )); +defparam \LCD_DB[15]~output .coord_x = 5; +defparam \LCD_DB[15]~output .coord_y = 4; +defparam \LCD_DB[15]~output .coord_z = 0; +defparam \LCD_DB[15]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[15]~output .RX_SEL = 1'b0; +defparam \LCD_DB[15]~output .PDCNTL = 2'b01; +defparam \LCD_DB[15]~output .NDCNTL = 2'b01; +defparam \LCD_DB[15]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[15]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[15]~output .PU = 4'b1000; + +alta_io \LCD_DB[1]~output ( + .datain(\MCU_D[1]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[1]), + .combout(\LCD_DB[1]~input_o )); +defparam \LCD_DB[1]~output .coord_x = 2; +defparam \LCD_DB[1]~output .coord_y = 4; +defparam \LCD_DB[1]~output .coord_z = 2; +defparam \LCD_DB[1]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[1]~output .RX_SEL = 1'b0; +defparam \LCD_DB[1]~output .PDCNTL = 2'b01; +defparam \LCD_DB[1]~output .NDCNTL = 2'b01; +defparam \LCD_DB[1]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[1]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[1]~output .PU = 4'b1000; + +alta_io \LCD_DB[2]~output ( + .datain(\MCU_D[2]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[2]), + .combout(\LCD_DB[2]~input_o )); +defparam \LCD_DB[2]~output .coord_x = 2; +defparam \LCD_DB[2]~output .coord_y = 4; +defparam \LCD_DB[2]~output .coord_z = 3; +defparam \LCD_DB[2]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[2]~output .RX_SEL = 1'b0; +defparam \LCD_DB[2]~output .PDCNTL = 2'b01; +defparam \LCD_DB[2]~output .NDCNTL = 2'b01; +defparam \LCD_DB[2]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[2]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[2]~output .PU = 4'b1000; + +alta_io \LCD_DB[3]~output ( + .datain(\MCU_D[3]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[3]), + .combout(\LCD_DB[3]~input_o )); +defparam \LCD_DB[3]~output .coord_x = 2; +defparam \LCD_DB[3]~output .coord_y = 4; +defparam \LCD_DB[3]~output .coord_z = 4; +defparam \LCD_DB[3]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[3]~output .RX_SEL = 1'b0; +defparam \LCD_DB[3]~output .PDCNTL = 2'b01; +defparam \LCD_DB[3]~output .NDCNTL = 2'b01; +defparam \LCD_DB[3]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[3]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[3]~output .PU = 4'b1000; + +alta_io \LCD_DB[4]~output ( + .datain(\MCU_D[4]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[4]), + .combout(\LCD_DB[4]~input_o )); +defparam \LCD_DB[4]~output .coord_x = 2; +defparam \LCD_DB[4]~output .coord_y = 4; +defparam \LCD_DB[4]~output .coord_z = 5; +defparam \LCD_DB[4]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[4]~output .RX_SEL = 1'b0; +defparam \LCD_DB[4]~output .PDCNTL = 2'b01; +defparam \LCD_DB[4]~output .NDCNTL = 2'b01; +defparam \LCD_DB[4]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[4]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[4]~output .PU = 4'b1000; + +alta_io \LCD_DB[5]~output ( + .datain(\MCU_D[5]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[5]), + .combout(\LCD_DB[5]~input_o )); +defparam \LCD_DB[5]~output .coord_x = 3; +defparam \LCD_DB[5]~output .coord_y = 4; +defparam \LCD_DB[5]~output .coord_z = 0; +defparam \LCD_DB[5]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[5]~output .RX_SEL = 1'b0; +defparam \LCD_DB[5]~output .PDCNTL = 2'b01; +defparam \LCD_DB[5]~output .NDCNTL = 2'b01; +defparam \LCD_DB[5]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[5]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[5]~output .PU = 4'b1000; + +alta_io \LCD_DB[6]~output ( + .datain(\MCU_D[6]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[6]), + .combout(\LCD_DB[6]~input_o )); +defparam \LCD_DB[6]~output .coord_x = 3; +defparam \LCD_DB[6]~output .coord_y = 4; +defparam \LCD_DB[6]~output .coord_z = 1; +defparam \LCD_DB[6]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[6]~output .RX_SEL = 1'b0; +defparam \LCD_DB[6]~output .PDCNTL = 2'b01; +defparam \LCD_DB[6]~output .NDCNTL = 2'b01; +defparam \LCD_DB[6]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[6]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[6]~output .PU = 4'b1000; + +alta_io \LCD_DB[7]~output ( + .datain(\MCU_D[7]~input_o ), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[7]), + .combout(\LCD_DB[7]~input_o )); +defparam \LCD_DB[7]~output .coord_x = 3; +defparam \LCD_DB[7]~output .coord_y = 4; +defparam \LCD_DB[7]~output .coord_z = 2; +defparam \LCD_DB[7]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[7]~output .RX_SEL = 1'b0; +defparam \LCD_DB[7]~output .PDCNTL = 2'b01; +defparam \LCD_DB[7]~output .NDCNTL = 2'b01; +defparam \LCD_DB[7]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[7]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[7]~output .PU = 4'b1000; + +alta_io \LCD_DB[8]~output ( + .datain(lcd_data_out_q[0]), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[8]), + .combout(\LCD_DB[8]~input_o )); +defparam \LCD_DB[8]~output .coord_x = 3; +defparam \LCD_DB[8]~output .coord_y = 4; +defparam \LCD_DB[8]~output .coord_z = 3; +defparam \LCD_DB[8]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[8]~output .RX_SEL = 1'b0; +defparam \LCD_DB[8]~output .PDCNTL = 2'b01; +defparam \LCD_DB[8]~output .NDCNTL = 2'b01; +defparam \LCD_DB[8]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[8]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[8]~output .PU = 4'b1000; + +alta_io \LCD_DB[9]~output ( + .datain(lcd_data_out_q[1]), + .oe(\MCU_LCD_RDX~input_o ), + .padio(LCD_DB[9]), + .combout(\LCD_DB[9]~input_o )); +defparam \LCD_DB[9]~output .coord_x = 3; +defparam \LCD_DB[9]~output .coord_y = 4; +defparam \LCD_DB[9]~output .coord_z = 4; +defparam \LCD_DB[9]~output .PRG_DELAYB = 1'b1; +defparam \LCD_DB[9]~output .RX_SEL = 1'b0; +defparam \LCD_DB[9]~output .PDCNTL = 2'b01; +defparam \LCD_DB[9]~output .NDCNTL = 2'b01; +defparam \LCD_DB[9]~output .PRG_SLR = 1'b1; +defparam \LCD_DB[9]~output .CFG_KEEP = 2'b00; +defparam \LCD_DB[9]~output .PU = 4'b1000; + +alta_io \LCD_RDX~output ( + .datain(\MCU_LCD_RDX~input_o ), + .oe(vcc), + .padio(LCD_RDX), + .combout()); +defparam \LCD_RDX~output .coord_x = 1; +defparam \LCD_RDX~output .coord_y = 4; +defparam \LCD_RDX~output .coord_z = 1; +defparam \LCD_RDX~output .PRG_DELAYB = 1'b1; +defparam \LCD_RDX~output .RX_SEL = 1'b0; +defparam \LCD_RDX~output .PDCNTL = 2'b01; +defparam \LCD_RDX~output .NDCNTL = 2'b01; +defparam \LCD_RDX~output .PRG_SLR = 1'b1; +defparam \LCD_RDX~output .CFG_KEEP = 2'b00; +defparam \LCD_RDX~output .PU = 4'b0000; + +alta_io \LCD_RESETX~output ( + .datain(\lcd_reset_q~q ), + .oe(vcc), + .padio(LCD_RESETX), + .combout()); +defparam \LCD_RESETX~output .coord_x = 2; +defparam \LCD_RESETX~output .coord_y = 4; +defparam \LCD_RESETX~output .coord_z = 0; +defparam \LCD_RESETX~output .PRG_DELAYB = 1'b1; +defparam \LCD_RESETX~output .RX_SEL = 1'b0; +defparam \LCD_RESETX~output .PDCNTL = 2'b01; +defparam \LCD_RESETX~output .NDCNTL = 2'b01; +defparam \LCD_RESETX~output .PRG_SLR = 1'b1; +defparam \LCD_RESETX~output .CFG_KEEP = 2'b00; +defparam \LCD_RESETX~output .PU = 4'b0000; + +alta_io \LCD_RS~output ( + .datain(\MCU_ADDR~input_o ), + .oe(vcc), + .padio(LCD_RS), + .combout()); +defparam \LCD_RS~output .coord_x = 0; +defparam \LCD_RS~output .coord_y = 3; +defparam \LCD_RS~output .coord_z = 0; +defparam \LCD_RS~output .PRG_DELAYB = 1'b1; +defparam \LCD_RS~output .RX_SEL = 1'b0; +defparam \LCD_RS~output .PDCNTL = 2'b01; +defparam \LCD_RS~output .NDCNTL = 2'b01; +defparam \LCD_RS~output .PRG_SLR = 1'b1; +defparam \LCD_RS~output .CFG_KEEP = 2'b00; +defparam \LCD_RS~output .PU = 4'b0000; + +alta_io \LCD_TE~input ( + .datain(gnd), + .oe(gnd), + .padio(LCD_TE), + .combout(\LCD_TE~input_o )); +defparam \LCD_TE~input .coord_x = 0; +defparam \LCD_TE~input .coord_y = 3; +defparam \LCD_TE~input .coord_z = 1; +defparam \LCD_TE~input .PRG_DELAYB = 1'b1; +defparam \LCD_TE~input .RX_SEL = 1'b0; +defparam \LCD_TE~input .PDCNTL = 2'b01; +defparam \LCD_TE~input .NDCNTL = 2'b01; +defparam \LCD_TE~input .PRG_SLR = 1'b1; +defparam \LCD_TE~input .CFG_KEEP = 2'b00; +defparam \LCD_TE~input .PU = 4'b0000; + +alta_io \LCD_WRX~output ( + .datain(\MCU_LCD_WRX~input_o ), + .oe(vcc), + .padio(LCD_WRX), + .combout()); +defparam \LCD_WRX~output .coord_x = 1; +defparam \LCD_WRX~output .coord_y = 4; +defparam \LCD_WRX~output .coord_z = 0; +defparam \LCD_WRX~output .PRG_DELAYB = 1'b1; +defparam \LCD_WRX~output .RX_SEL = 1'b0; +defparam \LCD_WRX~output .PDCNTL = 2'b01; +defparam \LCD_WRX~output .NDCNTL = 2'b01; +defparam \LCD_WRX~output .PRG_SLR = 1'b1; +defparam \LCD_WRX~output .CFG_KEEP = 2'b00; +defparam \LCD_WRX~output .PU = 4'b0000; + +alta_io \MCU_ADDR~input ( + .datain(gnd), + .oe(gnd), + .padio(MCU_ADDR), + .combout(\MCU_ADDR~input_o )); +defparam \MCU_ADDR~input .coord_x = 5; +defparam \MCU_ADDR~input .coord_y = 0; +defparam \MCU_ADDR~input .coord_z = 3; +defparam \MCU_ADDR~input .PRG_DELAYB = 1'b1; +defparam \MCU_ADDR~input .RX_SEL = 1'b0; +defparam \MCU_ADDR~input .PDCNTL = 2'b01; +defparam \MCU_ADDR~input .NDCNTL = 2'b01; +defparam \MCU_ADDR~input .PRG_SLR = 1'b1; +defparam \MCU_ADDR~input .CFG_KEEP = 2'b00; +defparam \MCU_ADDR~input .PU = 4'b1000; + +alta_io \MCU_DIR~input ( + .datain(gnd), + .oe(gnd), + .padio(MCU_DIR), + .combout(\MCU_DIR~input_o )); +defparam \MCU_DIR~input .coord_x = 7; +defparam \MCU_DIR~input .coord_y = 3; +defparam \MCU_DIR~input .coord_z = 1; +defparam \MCU_DIR~input .PRG_DELAYB = 1'b1; +defparam \MCU_DIR~input .RX_SEL = 1'b0; +defparam \MCU_DIR~input .PDCNTL = 2'b01; +defparam \MCU_DIR~input .NDCNTL = 2'b01; +defparam \MCU_DIR~input .PRG_SLR = 1'b1; +defparam \MCU_DIR~input .CFG_KEEP = 2'b00; +defparam \MCU_DIR~input .PU = 4'b1000; + +alta_io \MCU_D[0]~output ( + .datain(\mcu_data_out[0]~1_combout ), + .oe(\MCU_DIR~input_o ), + .padio(MCU_D[0]), + .combout(\MCU_D[0]~input_o )); +defparam \MCU_D[0]~output .coord_x = 4; +defparam \MCU_D[0]~output .coord_y = 0; +defparam \MCU_D[0]~output .coord_z = 2; +defparam \MCU_D[0]~output .PRG_DELAYB = 1'b1; +defparam \MCU_D[0]~output .RX_SEL = 1'b0; +defparam \MCU_D[0]~output .PDCNTL = 2'b01; +defparam \MCU_D[0]~output .NDCNTL = 2'b01; +defparam \MCU_D[0]~output .PRG_SLR = 1'b1; +defparam \MCU_D[0]~output .CFG_KEEP = 2'b00; +defparam \MCU_D[0]~output .PU = 4'b1000; + +alta_io \MCU_D[1]~output ( + .datain(\mcu_data_out[1]~3_combout ), + .oe(\MCU_DIR~input_o ), + .padio(MCU_D[1]), + .combout(\MCU_D[1]~input_o )); +defparam \MCU_D[1]~output .coord_x = 4; +defparam \MCU_D[1]~output .coord_y = 0; +defparam \MCU_D[1]~output .coord_z = 3; +defparam \MCU_D[1]~output .PRG_DELAYB = 1'b1; +defparam \MCU_D[1]~output .RX_SEL = 1'b0; +defparam \MCU_D[1]~output .PDCNTL = 2'b01; +defparam \MCU_D[1]~output .NDCNTL = 2'b01; +defparam \MCU_D[1]~output .PRG_SLR = 1'b1; +defparam \MCU_D[1]~output .CFG_KEEP = 2'b00; +defparam \MCU_D[1]~output .PU = 4'b1000; + +alta_io \MCU_D[2]~output ( + .datain(\mcu_data_out[2]~5_combout ), + .oe(\MCU_DIR~input_o ), + .padio(MCU_D[2]), + .combout(\MCU_D[2]~input_o )); +defparam \MCU_D[2]~output .coord_x = 4; +defparam \MCU_D[2]~output .coord_y = 0; +defparam \MCU_D[2]~output .coord_z = 0; +defparam \MCU_D[2]~output .PRG_DELAYB = 1'b1; +defparam \MCU_D[2]~output .RX_SEL = 1'b0; +defparam \MCU_D[2]~output .PDCNTL = 2'b01; +defparam \MCU_D[2]~output .NDCNTL = 2'b01; +defparam \MCU_D[2]~output .PRG_SLR = 1'b1; +defparam \MCU_D[2]~output .CFG_KEEP = 2'b00; +defparam \MCU_D[2]~output .PU = 4'b1000; + +alta_io \MCU_D[3]~output ( + .datain(\mcu_data_out[3]~7_combout ), + .oe(\MCU_DIR~input_o ), + .padio(MCU_D[3]), + .combout(\MCU_D[3]~input_o )); +defparam \MCU_D[3]~output .coord_x = 3; +defparam \MCU_D[3]~output .coord_y = 0; +defparam \MCU_D[3]~output .coord_z = 4; +defparam \MCU_D[3]~output .PRG_DELAYB = 1'b1; +defparam \MCU_D[3]~output .RX_SEL = 1'b0; +defparam \MCU_D[3]~output .PDCNTL = 2'b01; +defparam \MCU_D[3]~output .NDCNTL = 2'b01; +defparam \MCU_D[3]~output .PRG_SLR = 1'b1; +defparam \MCU_D[3]~output .CFG_KEEP = 2'b00; +defparam \MCU_D[3]~output .PU = 4'b1000; + +alta_io \MCU_D[4]~output ( + .datain(\mcu_data_out[4]~9_combout ), + .oe(\MCU_DIR~input_o ), + .padio(MCU_D[4]), + .combout(\MCU_D[4]~input_o )); +defparam \MCU_D[4]~output .coord_x = 3; +defparam \MCU_D[4]~output .coord_y = 0; +defparam \MCU_D[4]~output .coord_z = 2; +defparam \MCU_D[4]~output .PRG_DELAYB = 1'b1; +defparam \MCU_D[4]~output .RX_SEL = 1'b0; +defparam \MCU_D[4]~output .PDCNTL = 2'b01; +defparam \MCU_D[4]~output .NDCNTL = 2'b01; +defparam \MCU_D[4]~output .PRG_SLR = 1'b1; +defparam \MCU_D[4]~output .CFG_KEEP = 2'b00; +defparam \MCU_D[4]~output .PU = 4'b1000; + +alta_io \MCU_D[5]~output ( + .datain(\mcu_data_out[5]~11_combout ), + .oe(\MCU_DIR~input_o ), + .padio(MCU_D[5]), + .combout(\MCU_D[5]~input_o )); +defparam \MCU_D[5]~output .coord_x = 3; +defparam \MCU_D[5]~output .coord_y = 0; +defparam \MCU_D[5]~output .coord_z = 3; +defparam \MCU_D[5]~output .PRG_DELAYB = 1'b1; +defparam \MCU_D[5]~output .RX_SEL = 1'b0; +defparam \MCU_D[5]~output .PDCNTL = 2'b01; +defparam \MCU_D[5]~output .NDCNTL = 2'b01; +defparam \MCU_D[5]~output .PRG_SLR = 1'b1; +defparam \MCU_D[5]~output .CFG_KEEP = 2'b00; +defparam \MCU_D[5]~output .PU = 4'b1000; + +alta_io \MCU_D[6]~output ( + .datain(\mcu_data_out[6]~13_combout ), + .oe(\MCU_DIR~input_o ), + .padio(MCU_D[6]), + .combout(\MCU_D[6]~input_o )); +defparam \MCU_D[6]~output .coord_x = 3; +defparam \MCU_D[6]~output .coord_y = 0; +defparam \MCU_D[6]~output .coord_z = 1; +defparam \MCU_D[6]~output .PRG_DELAYB = 1'b1; +defparam \MCU_D[6]~output .RX_SEL = 1'b0; +defparam \MCU_D[6]~output .PDCNTL = 2'b01; +defparam \MCU_D[6]~output .NDCNTL = 2'b01; +defparam \MCU_D[6]~output .PRG_SLR = 1'b1; +defparam \MCU_D[6]~output .CFG_KEEP = 2'b00; +defparam \MCU_D[6]~output .PU = 4'b1000; + +alta_io \MCU_D[7]~output ( + .datain(\mcu_data_out[7]~15_combout ), + .oe(\MCU_DIR~input_o ), + .padio(MCU_D[7]), + .combout(\MCU_D[7]~input_o )); +defparam \MCU_D[7]~output .coord_x = 3; +defparam \MCU_D[7]~output .coord_y = 0; +defparam \MCU_D[7]~output .coord_z = 0; +defparam \MCU_D[7]~output .PRG_DELAYB = 1'b1; +defparam \MCU_D[7]~output .RX_SEL = 1'b0; +defparam \MCU_D[7]~output .PDCNTL = 2'b01; +defparam \MCU_D[7]~output .NDCNTL = 2'b01; +defparam \MCU_D[7]~output .PRG_SLR = 1'b1; +defparam \MCU_D[7]~output .CFG_KEEP = 2'b00; +defparam \MCU_D[7]~output .PU = 4'b1000; + +alta_io \MCU_IO_STBX~input ( + .datain(gnd), + .oe(gnd), + .padio(MCU_IO_STBX), + .combout(\MCU_IO_STBX~input_o )); +defparam \MCU_IO_STBX~input .coord_x = 5; +defparam \MCU_IO_STBX~input .coord_y = 0; +defparam \MCU_IO_STBX~input .coord_z = 2; +defparam \MCU_IO_STBX~input .PRG_DELAYB = 1'b1; +defparam \MCU_IO_STBX~input .RX_SEL = 1'b0; +defparam \MCU_IO_STBX~input .PDCNTL = 2'b01; +defparam \MCU_IO_STBX~input .NDCNTL = 2'b01; +defparam \MCU_IO_STBX~input .PRG_SLR = 1'b1; +defparam \MCU_IO_STBX~input .CFG_KEEP = 2'b00; +defparam \MCU_IO_STBX~input .PU = 4'b1000; + +alta_io_gclk \MCU_IO_STBX~inputclkctrl ( + .inclk(\MCU_IO_STBX~input_o ), + .outclk(\MCU_IO_STBX~inputclkctrl_outclk )); +defparam \MCU_IO_STBX~inputclkctrl .coord_x = 0; +defparam \MCU_IO_STBX~inputclkctrl .coord_y = 2; +defparam \MCU_IO_STBX~inputclkctrl .coord_z = 1; + +alta_io \MCU_LCD_RDX~input ( + .datain(gnd), + .oe(gnd), + .padio(MCU_LCD_RDX), + .combout(\MCU_LCD_RDX~input_o )); +defparam \MCU_LCD_RDX~input .coord_x = 5; +defparam \MCU_LCD_RDX~input .coord_y = 0; +defparam \MCU_LCD_RDX~input .coord_z = 0; +defparam \MCU_LCD_RDX~input .PRG_DELAYB = 1'b1; +defparam \MCU_LCD_RDX~input .RX_SEL = 1'b0; +defparam \MCU_LCD_RDX~input .PDCNTL = 2'b01; +defparam \MCU_LCD_RDX~input .NDCNTL = 2'b01; +defparam \MCU_LCD_RDX~input .PRG_SLR = 1'b1; +defparam \MCU_LCD_RDX~input .CFG_KEEP = 2'b00; +defparam \MCU_LCD_RDX~input .PU = 4'b1000; + +alta_io_gclk \MCU_LCD_RDX~inputclkctrl ( + .inclk(\MCU_LCD_RDX~input_o ), + .outclk(\MCU_LCD_RDX~inputclkctrl_outclk )); +defparam \MCU_LCD_RDX~inputclkctrl .coord_x = 7; +defparam \MCU_LCD_RDX~inputclkctrl .coord_y = 2; +defparam \MCU_LCD_RDX~inputclkctrl .coord_z = 0; + +alta_io \MCU_LCD_TE~output ( + .datain(\LCD_TE~input_o ), + .oe(vcc), + .padio(MCU_LCD_TE), + .combout()); +defparam \MCU_LCD_TE~output .coord_x = 5; +defparam \MCU_LCD_TE~output .coord_y = 0; +defparam \MCU_LCD_TE~output .coord_z = 1; +defparam \MCU_LCD_TE~output .PRG_DELAYB = 1'b1; +defparam \MCU_LCD_TE~output .RX_SEL = 1'b0; +defparam \MCU_LCD_TE~output .PDCNTL = 2'b01; +defparam \MCU_LCD_TE~output .NDCNTL = 2'b01; +defparam \MCU_LCD_TE~output .PRG_SLR = 1'b1; +defparam \MCU_LCD_TE~output .CFG_KEEP = 2'b00; +defparam \MCU_LCD_TE~output .PU = 4'b0000; + +alta_io \MCU_LCD_WRX~input ( + .datain(gnd), + .oe(gnd), + .padio(MCU_LCD_WRX), + .combout(\MCU_LCD_WRX~input_o )); +defparam \MCU_LCD_WRX~input .coord_x = 7; +defparam \MCU_LCD_WRX~input .coord_y = 3; +defparam \MCU_LCD_WRX~input .coord_z = 2; +defparam \MCU_LCD_WRX~input .PRG_DELAYB = 1'b1; +defparam \MCU_LCD_WRX~input .RX_SEL = 1'b0; +defparam \MCU_LCD_WRX~input .PDCNTL = 2'b01; +defparam \MCU_LCD_WRX~input .NDCNTL = 2'b01; +defparam \MCU_LCD_WRX~input .PRG_SLR = 1'b1; +defparam \MCU_LCD_WRX~input .CFG_KEEP = 2'b00; +defparam \MCU_LCD_WRX~input .PU = 4'b0000; + +alta_io_gclk \MCU_LCD_WRX~inputclkctrl ( + .inclk(\MCU_LCD_WRX~input_o ), + .outclk(\MCU_LCD_WRX~inputclkctrl_outclk )); +defparam \MCU_LCD_WRX~inputclkctrl .coord_x = 7; +defparam \MCU_LCD_WRX~inputclkctrl .coord_y = 2; +defparam \MCU_LCD_WRX~inputclkctrl .coord_z = 1; + +alta_io \MCU_P2_8~input ( + .datain(gnd), + .oe(gnd), + .padio(MCU_P2_8), + .combout(\MCU_P2_8~input_o )); +defparam \MCU_P2_8~input .coord_x = 5; +defparam \MCU_P2_8~input .coord_y = 0; +defparam \MCU_P2_8~input .coord_z = 4; +defparam \MCU_P2_8~input .PRG_DELAYB = 1'b1; +defparam \MCU_P2_8~input .RX_SEL = 1'b0; +defparam \MCU_P2_8~input .PDCNTL = 2'b01; +defparam \MCU_P2_8~input .NDCNTL = 2'b01; +defparam \MCU_P2_8~input .PRG_SLR = 1'b1; +defparam \MCU_P2_8~input .CFG_KEEP = 2'b00; +defparam \MCU_P2_8~input .PU = 4'b0000; + +alta_io \REF_EN~output ( + .datain(\ref_en_q~q ), + .oe(vcc), + .padio(REF_EN), + .combout()); +defparam \REF_EN~output .coord_x = 7; +defparam \REF_EN~output .coord_y = 2; +defparam \REF_EN~output .coord_z = 3; +defparam \REF_EN~output .PRG_DELAYB = 1'b1; +defparam \REF_EN~output .RX_SEL = 1'b0; +defparam \REF_EN~output .PDCNTL = 2'b01; +defparam \REF_EN~output .NDCNTL = 2'b01; +defparam \REF_EN~output .PRG_SLR = 1'b1; +defparam \REF_EN~output .CFG_KEEP = 2'b00; +defparam \REF_EN~output .PU = 4'b0000; + +alta_io \SW_D~input ( + .datain(gnd), + .oe(gnd), + .padio(SW_D), + .combout(\SW_D~input_o )); +defparam \SW_D~input .coord_x = 0; +defparam \SW_D~input .coord_y = 2; +defparam \SW_D~input .coord_z = 1; +defparam \SW_D~input .PRG_DELAYB = 1'b1; +defparam \SW_D~input .RX_SEL = 1'b1; +defparam \SW_D~input .PDCNTL = 2'b01; +defparam \SW_D~input .NDCNTL = 2'b01; +defparam \SW_D~input .PRG_SLR = 1'b1; +defparam \SW_D~input .CFG_KEEP = 2'b00; +defparam \SW_D~input .PU = 4'b1000; + +alta_io \SW_L~input ( + .datain(gnd), + .oe(gnd), + .padio(SW_L), + .combout(\SW_L~input_o )); +defparam \SW_L~input .coord_x = 4; +defparam \SW_L~input .coord_y = 0; +defparam \SW_L~input .coord_z = 4; +defparam \SW_L~input .PRG_DELAYB = 1'b1; +defparam \SW_L~input .RX_SEL = 1'b1; +defparam \SW_L~input .PDCNTL = 2'b01; +defparam \SW_L~input .NDCNTL = 2'b01; +defparam \SW_L~input .PRG_SLR = 1'b1; +defparam \SW_L~input .CFG_KEEP = 2'b00; +defparam \SW_L~input .PU = 4'b1000; + +alta_io \SW_ROT_A~input ( + .datain(gnd), + .oe(gnd), + .padio(SW_ROT_A), + .combout(\SW_ROT_A~input_o )); +defparam \SW_ROT_A~input .coord_x = 0; +defparam \SW_ROT_A~input .coord_y = 2; +defparam \SW_ROT_A~input .coord_z = 2; +defparam \SW_ROT_A~input .PRG_DELAYB = 1'b1; +defparam \SW_ROT_A~input .RX_SEL = 1'b1; +defparam \SW_ROT_A~input .PDCNTL = 2'b01; +defparam \SW_ROT_A~input .NDCNTL = 2'b01; +defparam \SW_ROT_A~input .PRG_SLR = 1'b1; +defparam \SW_ROT_A~input .CFG_KEEP = 2'b00; +defparam \SW_ROT_A~input .PU = 4'b1000; + +alta_io \SW_ROT_B~input ( + .datain(gnd), + .oe(gnd), + .padio(SW_ROT_B), + .combout(\SW_ROT_B~input_o )); +defparam \SW_ROT_B~input .coord_x = 0; +defparam \SW_ROT_B~input .coord_y = 2; +defparam \SW_ROT_B~input .coord_z = 3; +defparam \SW_ROT_B~input .PRG_DELAYB = 1'b1; +defparam \SW_ROT_B~input .RX_SEL = 1'b1; +defparam \SW_ROT_B~input .PDCNTL = 2'b01; +defparam \SW_ROT_B~input .NDCNTL = 2'b01; +defparam \SW_ROT_B~input .PRG_SLR = 1'b1; +defparam \SW_ROT_B~input .CFG_KEEP = 2'b00; +defparam \SW_ROT_B~input .PU = 4'b1000; + +alta_io \SW_R~input ( + .datain(gnd), + .oe(gnd), + .padio(SW_R), + .combout(\SW_R~input_o )); +defparam \SW_R~input .coord_x = 0; +defparam \SW_R~input .coord_y = 2; +defparam \SW_R~input .coord_z = 0; +defparam \SW_R~input .PRG_DELAYB = 1'b1; +defparam \SW_R~input .RX_SEL = 1'b1; +defparam \SW_R~input .PDCNTL = 2'b01; +defparam \SW_R~input .NDCNTL = 2'b01; +defparam \SW_R~input .PRG_SLR = 1'b1; +defparam \SW_R~input .CFG_KEEP = 2'b00; +defparam \SW_R~input .PU = 4'b1000; + +alta_io \SW_SEL~input ( + .datain(gnd), + .oe(gnd), + .padio(SW_SEL), + .combout(\SW_SEL~input_o )); +defparam \SW_SEL~input .coord_x = 0; +defparam \SW_SEL~input .coord_y = 2; +defparam \SW_SEL~input .coord_z = 4; +defparam \SW_SEL~input .PRG_DELAYB = 1'b1; +defparam \SW_SEL~input .RX_SEL = 1'b1; +defparam \SW_SEL~input .PDCNTL = 2'b01; +defparam \SW_SEL~input .NDCNTL = 2'b01; +defparam \SW_SEL~input .PRG_SLR = 1'b1; +defparam \SW_SEL~input .CFG_KEEP = 2'b00; +defparam \SW_SEL~input .PU = 4'b1000; + +alta_io \SW_U~input ( + .datain(gnd), + .oe(gnd), + .padio(SW_U), + .combout(\SW_U~input_o )); +defparam \SW_U~input .coord_x = 4; +defparam \SW_U~input .coord_y = 0; +defparam \SW_U~input .coord_z = 1; +defparam \SW_U~input .PRG_DELAYB = 1'b1; +defparam \SW_U~input .RX_SEL = 1'b1; +defparam \SW_U~input .PDCNTL = 2'b01; +defparam \SW_U~input .NDCNTL = 2'b01; +defparam \SW_U~input .PRG_SLR = 1'b1; +defparam \SW_U~input .CFG_KEEP = 2'b00; +defparam \SW_U~input .PU = 4'b1000; + +alta_io \SYSOFF~output ( + .datain(\sysoff_q~q ), + .oe(vcc), + .padio(SYSOFF), + .combout()); +defparam \SYSOFF~output .coord_x = 6; +defparam \SYSOFF~output .coord_y = 0; +defparam \SYSOFF~output .coord_z = 1; +defparam \SYSOFF~output .PRG_DELAYB = 1'b1; +defparam \SYSOFF~output .RX_SEL = 1'b0; +defparam \SYSOFF~output .PDCNTL = 2'b11; +defparam \SYSOFF~output .NDCNTL = 2'b11; +defparam \SYSOFF~output .PRG_SLR = 1'b0; +defparam \SYSOFF~output .CFG_KEEP = 2'b00; +defparam \SYSOFF~output .PU = 4'b0000; + +alta_io \TP_D~output ( + .datain(tp_q[2]), + .oe(tp_q[6]), + .padio(TP_D), + .combout()); +defparam \TP_D~output .coord_x = 0; +defparam \TP_D~output .coord_y = 3; +defparam \TP_D~output .coord_z = 4; +defparam \TP_D~output .PRG_DELAYB = 1'b1; +defparam \TP_D~output .RX_SEL = 1'b0; +defparam \TP_D~output .PDCNTL = 2'b11; +defparam \TP_D~output .NDCNTL = 2'b11; +defparam \TP_D~output .PRG_SLR = 1'b1; +defparam \TP_D~output .CFG_KEEP = 2'b00; +defparam \TP_D~output .PU = 4'b1000; + +alta_io \TP_L~output ( + .datain(tp_q[1]), + .oe(tp_q[5]), + .padio(TP_L), + .combout()); +defparam \TP_L~output .coord_x = 0; +defparam \TP_L~output .coord_y = 3; +defparam \TP_L~output .coord_z = 5; +defparam \TP_L~output .PRG_DELAYB = 1'b1; +defparam \TP_L~output .RX_SEL = 1'b0; +defparam \TP_L~output .PDCNTL = 2'b11; +defparam \TP_L~output .NDCNTL = 2'b11; +defparam \TP_L~output .PRG_SLR = 1'b1; +defparam \TP_L~output .CFG_KEEP = 2'b00; +defparam \TP_L~output .PU = 4'b1000; + +alta_io \TP_R~output ( + .datain(tp_q[0]), + .oe(tp_q[4]), + .padio(TP_R), + .combout()); +defparam \TP_R~output .coord_x = 0; +defparam \TP_R~output .coord_y = 3; +defparam \TP_R~output .coord_z = 2; +defparam \TP_R~output .PRG_DELAYB = 1'b1; +defparam \TP_R~output .RX_SEL = 1'b0; +defparam \TP_R~output .PDCNTL = 2'b11; +defparam \TP_R~output .NDCNTL = 2'b11; +defparam \TP_R~output .PRG_SLR = 1'b1; +defparam \TP_R~output .CFG_KEEP = 2'b00; +defparam \TP_R~output .PU = 4'b1000; + +alta_io \TP_U~output ( + .datain(tp_q[3]), + .oe(tp_q[7]), + .padio(TP_U), + .combout()); +defparam \TP_U~output .coord_x = 0; +defparam \TP_U~output .coord_y = 3; +defparam \TP_U~output .coord_z = 6; +defparam \TP_U~output .PRG_DELAYB = 1'b1; +defparam \TP_U~output .RX_SEL = 1'b0; +defparam \TP_U~output .PDCNTL = 2'b11; +defparam \TP_U~output .NDCNTL = 2'b11; +defparam \TP_U~output .PRG_SLR = 1'b1; +defparam \TP_U~output .CFG_KEEP = 2'b00; +defparam \TP_U~output .PU = 4'b1000; + +alta_asyncctrl asyncreset_ctrl_X1_Y15_N0( + .Din(), + .Dout(AsyncReset_X1_Y15_GND)); +defparam asyncreset_ctrl_X1_Y15_N0.coord_x = 3; +defparam asyncreset_ctrl_X1_Y15_N0.coord_y = 3; +defparam asyncreset_ctrl_X1_Y15_N0.coord_z = 0; +defparam asyncreset_ctrl_X1_Y15_N0.AsyncCtrlMux = 2'b00; + +alta_asyncctrl asyncreset_ctrl_X1_Y19_N0( + .Din(), + .Dout(AsyncReset_X1_Y19_GND)); +defparam asyncreset_ctrl_X1_Y19_N0.coord_x = 3; +defparam asyncreset_ctrl_X1_Y19_N0.coord_y = 1; +defparam asyncreset_ctrl_X1_Y19_N0.coord_z = 0; +defparam asyncreset_ctrl_X1_Y19_N0.AsyncCtrlMux = 2'b00; + +alta_asyncctrl asyncreset_ctrl_X1_Y20_N0( + .Din(), + .Dout(AsyncReset_X1_Y20_GND)); +defparam asyncreset_ctrl_X1_Y20_N0.coord_x = 4; +defparam asyncreset_ctrl_X1_Y20_N0.coord_y = 3; +defparam asyncreset_ctrl_X1_Y20_N0.coord_z = 0; +defparam asyncreset_ctrl_X1_Y20_N0.AsyncCtrlMux = 2'b00; + +alta_asyncctrl asyncreset_ctrl_X1_Y21_N0( + .Din(), + .Dout(AsyncReset_X1_Y21_GND)); +defparam asyncreset_ctrl_X1_Y21_N0.coord_x = 5; +defparam asyncreset_ctrl_X1_Y21_N0.coord_y = 3; +defparam asyncreset_ctrl_X1_Y21_N0.coord_z = 0; +defparam asyncreset_ctrl_X1_Y21_N0.AsyncCtrlMux = 2'b00; + +alta_asyncctrl asyncreset_ctrl_X1_Y24_N0( + .Din(), + .Dout(AsyncReset_X1_Y24_GND)); +defparam asyncreset_ctrl_X1_Y24_N0.coord_x = 5; +defparam asyncreset_ctrl_X1_Y24_N0.coord_y = 2; +defparam asyncreset_ctrl_X1_Y24_N0.coord_z = 0; +defparam asyncreset_ctrl_X1_Y24_N0.AsyncCtrlMux = 2'b00; + +alta_asyncctrl asyncreset_ctrl_X1_Y26_N0( + .Din(), + .Dout(AsyncReset_X1_Y26_GND)); +defparam asyncreset_ctrl_X1_Y26_N0.coord_x = 3; +defparam asyncreset_ctrl_X1_Y26_N0.coord_y = 2; +defparam asyncreset_ctrl_X1_Y26_N0.coord_z = 0; +defparam asyncreset_ctrl_X1_Y26_N0.AsyncCtrlMux = 2'b00; + +alta_slice audio_reset_q( + .A(\MCU_D[1]~input_o ), + .B(vcc), + .C(vcc), + .D(vcc), + .Cin(), + .Qin(\audio_reset_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\audio_reset_q~0_combout ), + .Cout(), + .Q(\audio_reset_q~q )); +defparam audio_reset_q.coord_x = 3; +defparam audio_reset_q.coord_y = 3; +defparam audio_reset_q.coord_z = 12; +defparam audio_reset_q.mask = 16'h5555; +defparam audio_reset_q.modeMux = 1'b0; +defparam audio_reset_q.FeedbackMux = 1'b0; +defparam audio_reset_q.ShiftMux = 1'b0; +defparam audio_reset_q.BypassEn = 1'b0; +defparam audio_reset_q.CarryEnb = 1'b1; + +alta_clkenctrl clken_ctrl_X1_Y15_N0( + .ClkIn(\MCU_IO_STBX~inputclkctrl_outclk ), + .ClkEn(\tp_q[3]~0_combout ), + .ClkOut(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG )); +defparam clken_ctrl_X1_Y15_N0.coord_x = 3; +defparam clken_ctrl_X1_Y15_N0.coord_y = 3; +defparam clken_ctrl_X1_Y15_N0.coord_z = 0; +defparam clken_ctrl_X1_Y15_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y15_N0.ClkEnMux = 2'b10; + +alta_clkenctrl clken_ctrl_X1_Y15_N1( + .ClkIn(\MCU_IO_STBX~inputclkctrl_outclk ), + .ClkEn(\lcd_reset_q~0_combout ), + .ClkOut(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG )); +defparam clken_ctrl_X1_Y15_N1.coord_x = 3; +defparam clken_ctrl_X1_Y15_N1.coord_y = 3; +defparam clken_ctrl_X1_Y15_N1.coord_z = 1; +defparam clken_ctrl_X1_Y15_N1.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y15_N1.ClkEnMux = 2'b10; + +alta_clkenctrl clken_ctrl_X1_Y19_N0( + .ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), + .ClkEn(), + .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y19_SIG_VCC )); +defparam clken_ctrl_X1_Y19_N0.coord_x = 3; +defparam clken_ctrl_X1_Y19_N0.coord_y = 1; +defparam clken_ctrl_X1_Y19_N0.coord_z = 0; +defparam clken_ctrl_X1_Y19_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y19_N0.ClkEnMux = 2'b01; + +alta_clkenctrl clken_ctrl_X1_Y20_N0( + .ClkIn(\MCU_LCD_WRX~inputclkctrl_outclk ), + .ClkEn(), + .ClkOut(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC )); +defparam clken_ctrl_X1_Y20_N0.coord_x = 4; +defparam clken_ctrl_X1_Y20_N0.coord_y = 3; +defparam clken_ctrl_X1_Y20_N0.coord_z = 0; +defparam clken_ctrl_X1_Y20_N0.ClkMux = 2'b11; +defparam clken_ctrl_X1_Y20_N0.ClkEnMux = 2'b01; + +alta_clkenctrl clken_ctrl_X1_Y21_N0( + .ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), + .ClkEn(), + .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y21_SIG_VCC )); +defparam clken_ctrl_X1_Y21_N0.coord_x = 5; +defparam clken_ctrl_X1_Y21_N0.coord_y = 3; +defparam clken_ctrl_X1_Y21_N0.coord_z = 0; +defparam clken_ctrl_X1_Y21_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y21_N0.ClkEnMux = 2'b01; + +alta_clkenctrl clken_ctrl_X1_Y24_N0( + .ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), + .ClkEn(), + .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y24_SIG_VCC )); +defparam clken_ctrl_X1_Y24_N0.coord_x = 5; +defparam clken_ctrl_X1_Y24_N0.coord_y = 2; +defparam clken_ctrl_X1_Y24_N0.coord_z = 0; +defparam clken_ctrl_X1_Y24_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y24_N0.ClkEnMux = 2'b01; + +alta_clkenctrl clken_ctrl_X1_Y26_N0( + .ClkIn(\MCU_LCD_RDX~inputclkctrl_outclk ), + .ClkEn(), + .ClkOut(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC )); +defparam clken_ctrl_X1_Y26_N0.coord_x = 3; +defparam clken_ctrl_X1_Y26_N0.coord_y = 2; +defparam clken_ctrl_X1_Y26_N0.coord_z = 0; +defparam clken_ctrl_X1_Y26_N0.ClkMux = 2'b10; +defparam clken_ctrl_X1_Y26_N0.ClkEnMux = 2'b01; + +alta_clkenctrl clken_ctrl_X1_Y26_N1( + .ClkIn(\MCU_LCD_WRX~inputclkctrl_outclk ), + .ClkEn(), + .ClkOut(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC )); +defparam clken_ctrl_X1_Y26_N1.coord_x = 3; +defparam clken_ctrl_X1_Y26_N1.coord_y = 2; +defparam clken_ctrl_X1_Y26_N1.coord_z = 1; +defparam clken_ctrl_X1_Y26_N1.ClkMux = 2'b11; +defparam clken_ctrl_X1_Y26_N1.ClkEnMux = 2'b01; + +alta_slice lcd_backlight_q( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[7]~input_o ), + .Cin(), + .Qin(\lcd_backlight_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_backlight_q~feeder_combout ), + .Cout(), + .Q(\lcd_backlight_q~q )); +defparam lcd_backlight_q.coord_x = 3; +defparam lcd_backlight_q.coord_y = 3; +defparam lcd_backlight_q.coord_z = 8; +defparam lcd_backlight_q.mask = 16'hFF00; +defparam lcd_backlight_q.modeMux = 1'b0; +defparam lcd_backlight_q.FeedbackMux = 1'b0; +defparam lcd_backlight_q.ShiftMux = 1'b0; +defparam lcd_backlight_q.BypassEn = 1'b0; +defparam lcd_backlight_q.CarryEnb = 1'b1; + +alta_slice \lcd_data_in_q[0] ( + .A(vcc), + .B(\LCD_DB[8]~input_o ), + .C(\LCD_DB[0]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[0]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y19_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y19_GND), + .SyncReset(SyncReset_X1_Y19_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y19_VCC), + .LutOut(\mcu_data_out[0]~0_combout ), + .Cout(), + .Q(lcd_data_in_q[0])); +defparam \lcd_data_in_q[0] .coord_x = 3; +defparam \lcd_data_in_q[0] .coord_y = 1; +defparam \lcd_data_in_q[0] .coord_z = 15; +defparam \lcd_data_in_q[0] .mask = 16'hF0CC; +defparam \lcd_data_in_q[0] .modeMux = 1'b0; +defparam \lcd_data_in_q[0] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[0] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[0] .BypassEn = 1'b1; +defparam \lcd_data_in_q[0] .CarryEnb = 1'b1; + +alta_slice \lcd_data_in_q[1] ( + .A(vcc), + .B(\MCU_LCD_RDX~input_o ), + .C(\LCD_DB[1]~input_o ), + .D(\LCD_DB[9]~input_o ), + .Cin(), + .Qin(lcd_data_in_q[1]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y21_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y21_GND), + .SyncReset(SyncReset_X1_Y21_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y21_VCC), + .LutOut(\mcu_data_out[1]~2_combout ), + .Cout(), + .Q(lcd_data_in_q[1])); +defparam \lcd_data_in_q[1] .coord_x = 5; +defparam \lcd_data_in_q[1] .coord_y = 3; +defparam \lcd_data_in_q[1] .coord_z = 5; +defparam \lcd_data_in_q[1] .mask = 16'hF3C0; +defparam \lcd_data_in_q[1] .modeMux = 1'b0; +defparam \lcd_data_in_q[1] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[1] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[1] .BypassEn = 1'b1; +defparam \lcd_data_in_q[1] .CarryEnb = 1'b1; + +alta_slice \lcd_data_in_q[2] ( + .A(vcc), + .B(\LCD_DB[10]~input_o ), + .C(\LCD_DB[2]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[2]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y24_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y24_GND), + .SyncReset(SyncReset_X1_Y24_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y24_VCC), + .LutOut(\mcu_data_out[2]~4_combout ), + .Cout(), + .Q(lcd_data_in_q[2])); +defparam \lcd_data_in_q[2] .coord_x = 5; +defparam \lcd_data_in_q[2] .coord_y = 2; +defparam \lcd_data_in_q[2] .coord_z = 15; +defparam \lcd_data_in_q[2] .mask = 16'hF0CC; +defparam \lcd_data_in_q[2] .modeMux = 1'b0; +defparam \lcd_data_in_q[2] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[2] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[2] .BypassEn = 1'b1; +defparam \lcd_data_in_q[2] .CarryEnb = 1'b1; + +alta_slice \lcd_data_in_q[3] ( + .A(\LCD_DB[11]~input_o ), + .B(vcc), + .C(\LCD_DB[3]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[3]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(\mcu_data_out[3]~6_combout ), + .Cout(), + .Q(lcd_data_in_q[3])); +defparam \lcd_data_in_q[3] .coord_x = 3; +defparam \lcd_data_in_q[3] .coord_y = 2; +defparam \lcd_data_in_q[3] .coord_z = 3; +defparam \lcd_data_in_q[3] .mask = 16'hF0AA; +defparam \lcd_data_in_q[3] .modeMux = 1'b0; +defparam \lcd_data_in_q[3] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[3] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[3] .BypassEn = 1'b1; +defparam \lcd_data_in_q[3] .CarryEnb = 1'b1; + +alta_slice \lcd_data_in_q[4] ( + .A(vcc), + .B(\MCU_LCD_RDX~input_o ), + .C(\LCD_DB[4]~input_o ), + .D(\LCD_DB[12]~input_o ), + .Cin(), + .Qin(lcd_data_in_q[4]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(\mcu_data_out[4]~8_combout ), + .Cout(), + .Q(lcd_data_in_q[4])); +defparam \lcd_data_in_q[4] .coord_x = 3; +defparam \lcd_data_in_q[4] .coord_y = 2; +defparam \lcd_data_in_q[4] .coord_z = 5; +defparam \lcd_data_in_q[4] .mask = 16'hF3C0; +defparam \lcd_data_in_q[4] .modeMux = 1'b0; +defparam \lcd_data_in_q[4] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[4] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[4] .BypassEn = 1'b1; +defparam \lcd_data_in_q[4] .CarryEnb = 1'b1; + +alta_slice \lcd_data_in_q[5] ( + .A(\LCD_DB[13]~input_o ), + .B(vcc), + .C(\LCD_DB[5]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[5]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y26_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(\mcu_data_out[5]~10_combout ), + .Cout(), + .Q(lcd_data_in_q[5])); +defparam \lcd_data_in_q[5] .coord_x = 3; +defparam \lcd_data_in_q[5] .coord_y = 2; +defparam \lcd_data_in_q[5] .coord_z = 4; +defparam \lcd_data_in_q[5] .mask = 16'hF0AA; +defparam \lcd_data_in_q[5] .modeMux = 1'b0; +defparam \lcd_data_in_q[5] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[5] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[5] .BypassEn = 1'b1; +defparam \lcd_data_in_q[5] .CarryEnb = 1'b1; + +alta_slice \lcd_data_in_q[6] ( + .A(vcc), + .B(\LCD_DB[14]~input_o ), + .C(\LCD_DB[6]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[6]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y19_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y19_GND), + .SyncReset(SyncReset_X1_Y19_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y19_VCC), + .LutOut(\mcu_data_out[6]~12_combout ), + .Cout(), + .Q(lcd_data_in_q[6])); +defparam \lcd_data_in_q[6] .coord_x = 3; +defparam \lcd_data_in_q[6] .coord_y = 1; +defparam \lcd_data_in_q[6] .coord_z = 2; +defparam \lcd_data_in_q[6] .mask = 16'hF0CC; +defparam \lcd_data_in_q[6] .modeMux = 1'b0; +defparam \lcd_data_in_q[6] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[6] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[6] .BypassEn = 1'b1; +defparam \lcd_data_in_q[6] .CarryEnb = 1'b1; + +alta_slice \lcd_data_in_q[7] ( + .A(vcc), + .B(\LCD_DB[15]~input_o ), + .C(\LCD_DB[7]~input_o ), + .D(\MCU_LCD_RDX~input_o ), + .Cin(), + .Qin(lcd_data_in_q[7]), + .Clk(\MCU_LCD_RDX~inputclkctrl_outclk_X1_Y21_SIG_VCC ), + .AsyncReset(AsyncReset_X1_Y21_GND), + .SyncReset(SyncReset_X1_Y21_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y21_VCC), + .LutOut(\mcu_data_out[7]~14_combout ), + .Cout(), + .Q(lcd_data_in_q[7])); +defparam \lcd_data_in_q[7] .coord_x = 5; +defparam \lcd_data_in_q[7] .coord_y = 3; +defparam \lcd_data_in_q[7] .coord_z = 9; +defparam \lcd_data_in_q[7] .mask = 16'hF0CC; +defparam \lcd_data_in_q[7] .modeMux = 1'b0; +defparam \lcd_data_in_q[7] .FeedbackMux = 1'b1; +defparam \lcd_data_in_q[7] .ShiftMux = 1'b0; +defparam \lcd_data_in_q[7] .BypassEn = 1'b1; +defparam \lcd_data_in_q[7] .CarryEnb = 1'b1; + +alta_slice \lcd_data_out_q[0] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[0]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[0]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[0]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[0])); +defparam \lcd_data_out_q[0] .coord_x = 4; +defparam \lcd_data_out_q[0] .coord_y = 3; +defparam \lcd_data_out_q[0] .coord_z = 15; +defparam \lcd_data_out_q[0] .mask = 16'hFF00; +defparam \lcd_data_out_q[0] .modeMux = 1'b0; +defparam \lcd_data_out_q[0] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[0] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[0] .BypassEn = 1'b0; +defparam \lcd_data_out_q[0] .CarryEnb = 1'b1; + +alta_slice \lcd_data_out_q[1] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[1]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[1]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[1]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[1])); +defparam \lcd_data_out_q[1] .coord_x = 4; +defparam \lcd_data_out_q[1] .coord_y = 3; +defparam \lcd_data_out_q[1] .coord_z = 0; +defparam \lcd_data_out_q[1] .mask = 16'hFF00; +defparam \lcd_data_out_q[1] .modeMux = 1'b0; +defparam \lcd_data_out_q[1] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[1] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[1] .BypassEn = 1'b0; +defparam \lcd_data_out_q[1] .CarryEnb = 1'b1; + +alta_slice \lcd_data_out_q[2] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[2]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[2]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[2]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[2])); +defparam \lcd_data_out_q[2] .coord_x = 4; +defparam \lcd_data_out_q[2] .coord_y = 3; +defparam \lcd_data_out_q[2] .coord_z = 5; +defparam \lcd_data_out_q[2] .mask = 16'hFF00; +defparam \lcd_data_out_q[2] .modeMux = 1'b0; +defparam \lcd_data_out_q[2] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[2] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[2] .BypassEn = 1'b0; +defparam \lcd_data_out_q[2] .CarryEnb = 1'b1; + +alta_slice \lcd_data_out_q[3] ( + .A(), + .B(), + .C(\MCU_D[3]~input_o ), + .D(), + .Cin(), + .Qin(lcd_data_out_q[3]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(), + .Cout(), + .Q(lcd_data_out_q[3])); +defparam \lcd_data_out_q[3] .coord_x = 3; +defparam \lcd_data_out_q[3] .coord_y = 2; +defparam \lcd_data_out_q[3] .coord_z = 7; +defparam \lcd_data_out_q[3] .mask = 16'hFFFF; +defparam \lcd_data_out_q[3] .modeMux = 1'b1; +defparam \lcd_data_out_q[3] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[3] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[3] .BypassEn = 1'b1; +defparam \lcd_data_out_q[3] .CarryEnb = 1'b1; + +alta_slice \lcd_data_out_q[4] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[4]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[4]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[4]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[4])); +defparam \lcd_data_out_q[4] .coord_x = 3; +defparam \lcd_data_out_q[4] .coord_y = 2; +defparam \lcd_data_out_q[4] .coord_z = 6; +defparam \lcd_data_out_q[4] .mask = 16'hFF00; +defparam \lcd_data_out_q[4] .modeMux = 1'b0; +defparam \lcd_data_out_q[4] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[4] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[4] .BypassEn = 1'b0; +defparam \lcd_data_out_q[4] .CarryEnb = 1'b1; + +alta_slice \lcd_data_out_q[5] ( + .A(), + .B(), + .C(\MCU_D[5]~input_o ), + .D(), + .Cin(), + .Qin(lcd_data_out_q[5]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y26_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y26_GND), + .SyncReset(SyncReset_X1_Y26_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y26_VCC), + .LutOut(), + .Cout(), + .Q(lcd_data_out_q[5])); +defparam \lcd_data_out_q[5] .coord_x = 3; +defparam \lcd_data_out_q[5] .coord_y = 2; +defparam \lcd_data_out_q[5] .coord_z = 2; +defparam \lcd_data_out_q[5] .mask = 16'hFFFF; +defparam \lcd_data_out_q[5] .modeMux = 1'b1; +defparam \lcd_data_out_q[5] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[5] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[5] .BypassEn = 1'b1; +defparam \lcd_data_out_q[5] .CarryEnb = 1'b1; + +alta_slice \lcd_data_out_q[6] ( + .A(), + .B(), + .C(\MCU_D[6]~input_o ), + .D(), + .Cin(), + .Qin(lcd_data_out_q[6]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(SyncReset_X1_Y20_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y20_VCC), + .LutOut(), + .Cout(), + .Q(lcd_data_out_q[6])); +defparam \lcd_data_out_q[6] .coord_x = 4; +defparam \lcd_data_out_q[6] .coord_y = 3; +defparam \lcd_data_out_q[6] .coord_z = 6; +defparam \lcd_data_out_q[6] .mask = 16'hFFFF; +defparam \lcd_data_out_q[6] .modeMux = 1'b1; +defparam \lcd_data_out_q[6] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[6] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[6] .BypassEn = 1'b1; +defparam \lcd_data_out_q[6] .CarryEnb = 1'b1; + +alta_slice \lcd_data_out_q[7] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[7]~input_o ), + .Cin(), + .Qin(lcd_data_out_q[7]), + .Clk(\MCU_LCD_WRX~inputclkctrl_outclk_X1_Y20_INV_VCC ), + .AsyncReset(AsyncReset_X1_Y20_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_data_out_q[7]~feeder_combout ), + .Cout(), + .Q(lcd_data_out_q[7])); +defparam \lcd_data_out_q[7] .coord_x = 4; +defparam \lcd_data_out_q[7] .coord_y = 3; +defparam \lcd_data_out_q[7] .coord_z = 10; +defparam \lcd_data_out_q[7] .mask = 16'hFF00; +defparam \lcd_data_out_q[7] .modeMux = 1'b0; +defparam \lcd_data_out_q[7] .FeedbackMux = 1'b0; +defparam \lcd_data_out_q[7] .ShiftMux = 1'b0; +defparam \lcd_data_out_q[7] .BypassEn = 1'b0; +defparam \lcd_data_out_q[7] .CarryEnb = 1'b1; + +alta_slice lcd_reset_q( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[0]~input_o ), + .Cin(), + .Qin(\lcd_reset_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_reset_q~1_combout ), + .Cout(), + .Q(\lcd_reset_q~q )); +defparam lcd_reset_q.coord_x = 3; +defparam lcd_reset_q.coord_y = 3; +defparam lcd_reset_q.coord_z = 1; +defparam lcd_reset_q.mask = 16'h00FF; +defparam lcd_reset_q.modeMux = 1'b0; +defparam lcd_reset_q.FeedbackMux = 1'b0; +defparam lcd_reset_q.ShiftMux = 1'b0; +defparam lcd_reset_q.BypassEn = 1'b0; +defparam lcd_reset_q.CarryEnb = 1'b1; + +alta_slice \lcd_reset_q~0 ( + .A(vcc), + .B(vcc), + .C(\MCU_ADDR~input_o ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\lcd_reset_q~0_combout ), + .Cout(), + .Q()); +defparam \lcd_reset_q~0 .coord_x = 3; +defparam \lcd_reset_q~0 .coord_y = 3; +defparam \lcd_reset_q~0 .coord_z = 7; +defparam \lcd_reset_q~0 .mask = 16'h00F0; +defparam \lcd_reset_q~0 .modeMux = 1'b0; +defparam \lcd_reset_q~0 .FeedbackMux = 1'b0; +defparam \lcd_reset_q~0 .ShiftMux = 1'b0; +defparam \lcd_reset_q~0 .BypassEn = 1'b0; +defparam \lcd_reset_q~0 .CarryEnb = 1'b1; + +alta_slice \mcu_data_out[0]~1 ( + .A(\mcu_data_out[0]~0_combout ), + .B(\SW_R~input_o ), + .C(\MCU_DIR~input_o ), + .D(\MCU_IO_STBX~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[0]~1_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[0]~1 .coord_x = 4; +defparam \mcu_data_out[0]~1 .coord_y = 1; +defparam \mcu_data_out[0]~1 .coord_z = 15; +defparam \mcu_data_out[0]~1 .mask = 16'hAA3A; +defparam \mcu_data_out[0]~1 .modeMux = 1'b0; +defparam \mcu_data_out[0]~1 .FeedbackMux = 1'b0; +defparam \mcu_data_out[0]~1 .ShiftMux = 1'b0; +defparam \mcu_data_out[0]~1 .BypassEn = 1'b0; +defparam \mcu_data_out[0]~1 .CarryEnb = 1'b1; + +alta_slice \mcu_data_out[1]~3 ( + .A(\SW_L~input_o ), + .B(\mcu_data_out[1]~2_combout ), + .C(\MCU_DIR~input_o ), + .D(\MCU_IO_STBX~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[1]~3_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[1]~3 .coord_x = 4; +defparam \mcu_data_out[1]~3 .coord_y = 1; +defparam \mcu_data_out[1]~3 .coord_z = 14; +defparam \mcu_data_out[1]~3 .mask = 16'hCC5C; +defparam \mcu_data_out[1]~3 .modeMux = 1'b0; +defparam \mcu_data_out[1]~3 .FeedbackMux = 1'b0; +defparam \mcu_data_out[1]~3 .ShiftMux = 1'b0; +defparam \mcu_data_out[1]~3 .BypassEn = 1'b0; +defparam \mcu_data_out[1]~3 .CarryEnb = 1'b1; + +alta_slice \mcu_data_out[2]~5 ( + .A(\MCU_DIR~input_o ), + .B(\SW_D~input_o ), + .C(\MCU_IO_STBX~input_o ), + .D(\mcu_data_out[2]~4_combout ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[2]~5_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[2]~5 .coord_x = 4; +defparam \mcu_data_out[2]~5 .coord_y = 2; +defparam \mcu_data_out[2]~5 .coord_z = 7; +defparam \mcu_data_out[2]~5 .mask = 16'hF702; +defparam \mcu_data_out[2]~5 .modeMux = 1'b0; +defparam \mcu_data_out[2]~5 .FeedbackMux = 1'b0; +defparam \mcu_data_out[2]~5 .ShiftMux = 1'b0; +defparam \mcu_data_out[2]~5 .BypassEn = 1'b0; +defparam \mcu_data_out[2]~5 .CarryEnb = 1'b1; + +alta_slice \mcu_data_out[3]~7 ( + .A(\SW_U~input_o ), + .B(\mcu_data_out[3]~6_combout ), + .C(\MCU_DIR~input_o ), + .D(\MCU_IO_STBX~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[3]~7_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[3]~7 .coord_x = 4; +defparam \mcu_data_out[3]~7 .coord_y = 2; +defparam \mcu_data_out[3]~7 .coord_z = 6; +defparam \mcu_data_out[3]~7 .mask = 16'hCC5C; +defparam \mcu_data_out[3]~7 .modeMux = 1'b0; +defparam \mcu_data_out[3]~7 .FeedbackMux = 1'b0; +defparam \mcu_data_out[3]~7 .ShiftMux = 1'b0; +defparam \mcu_data_out[3]~7 .BypassEn = 1'b0; +defparam \mcu_data_out[3]~7 .CarryEnb = 1'b1; + +alta_slice \mcu_data_out[4]~9 ( + .A(\MCU_DIR~input_o ), + .B(\mcu_data_out[4]~8_combout ), + .C(\SW_SEL~input_o ), + .D(\MCU_IO_STBX~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[4]~9_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[4]~9 .coord_x = 4; +defparam \mcu_data_out[4]~9 .coord_y = 2; +defparam \mcu_data_out[4]~9 .coord_z = 14; +defparam \mcu_data_out[4]~9 .mask = 16'hCC4E; +defparam \mcu_data_out[4]~9 .modeMux = 1'b0; +defparam \mcu_data_out[4]~9 .FeedbackMux = 1'b0; +defparam \mcu_data_out[4]~9 .ShiftMux = 1'b0; +defparam \mcu_data_out[4]~9 .BypassEn = 1'b0; +defparam \mcu_data_out[4]~9 .CarryEnb = 1'b1; + +alta_slice \mcu_data_out[5]~11 ( + .A(\mcu_data_out[5]~10_combout ), + .B(\SW_ROT_A~input_o ), + .C(\MCU_DIR~input_o ), + .D(\MCU_IO_STBX~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[5]~11_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[5]~11 .coord_x = 4; +defparam \mcu_data_out[5]~11 .coord_y = 2; +defparam \mcu_data_out[5]~11 .coord_z = 15; +defparam \mcu_data_out[5]~11 .mask = 16'hAA3A; +defparam \mcu_data_out[5]~11 .modeMux = 1'b0; +defparam \mcu_data_out[5]~11 .FeedbackMux = 1'b0; +defparam \mcu_data_out[5]~11 .ShiftMux = 1'b0; +defparam \mcu_data_out[5]~11 .BypassEn = 1'b0; +defparam \mcu_data_out[5]~11 .CarryEnb = 1'b1; + +alta_slice \mcu_data_out[6]~13 ( + .A(\mcu_data_out[6]~12_combout ), + .B(\SW_ROT_B~input_o ), + .C(\MCU_DIR~input_o ), + .D(\MCU_IO_STBX~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[6]~13_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[6]~13 .coord_x = 4; +defparam \mcu_data_out[6]~13 .coord_y = 1; +defparam \mcu_data_out[6]~13 .coord_z = 8; +defparam \mcu_data_out[6]~13 .mask = 16'hAA3A; +defparam \mcu_data_out[6]~13 .modeMux = 1'b0; +defparam \mcu_data_out[6]~13 .FeedbackMux = 1'b0; +defparam \mcu_data_out[6]~13 .ShiftMux = 1'b0; +defparam \mcu_data_out[6]~13 .BypassEn = 1'b0; +defparam \mcu_data_out[6]~13 .CarryEnb = 1'b1; + +alta_slice \mcu_data_out[7]~15 ( + .A(\mcu_data_out[7]~14_combout ), + .B(\LCD_TE~input_o ), + .C(\MCU_DIR~input_o ), + .D(\MCU_IO_STBX~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\mcu_data_out[7]~15_combout ), + .Cout(), + .Q()); +defparam \mcu_data_out[7]~15 .coord_x = 4; +defparam \mcu_data_out[7]~15 .coord_y = 1; +defparam \mcu_data_out[7]~15 .coord_z = 7; +defparam \mcu_data_out[7]~15 .mask = 16'hAACA; +defparam \mcu_data_out[7]~15 .modeMux = 1'b0; +defparam \mcu_data_out[7]~15 .FeedbackMux = 1'b0; +defparam \mcu_data_out[7]~15 .ShiftMux = 1'b0; +defparam \mcu_data_out[7]~15 .BypassEn = 1'b0; +defparam \mcu_data_out[7]~15 .CarryEnb = 1'b1; + +alta_slice ref_en_q( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[6]~input_o ), + .Cin(), + .Qin(\ref_en_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\ref_en_q~feeder_combout ), + .Cout(), + .Q(\ref_en_q~q )); +defparam ref_en_q.coord_x = 3; +defparam ref_en_q.coord_y = 3; +defparam ref_en_q.coord_z = 13; +defparam ref_en_q.mask = 16'hFF00; +defparam ref_en_q.modeMux = 1'b0; +defparam ref_en_q.FeedbackMux = 1'b0; +defparam ref_en_q.ShiftMux = 1'b0; +defparam ref_en_q.BypassEn = 1'b0; +defparam ref_en_q.CarryEnb = 1'b1; + +alta_syncctrl syncload_ctrl_X1_Y15( + .Din(), + .Dout(SyncLoad_X1_Y15_VCC)); +defparam syncload_ctrl_X1_Y15.coord_x = 3; +defparam syncload_ctrl_X1_Y15.coord_y = 3; +defparam syncload_ctrl_X1_Y15.coord_z = 1; +defparam syncload_ctrl_X1_Y15.SyncCtrlMux = 2'b01; + +alta_syncctrl syncload_ctrl_X1_Y19( + .Din(), + .Dout(SyncLoad_X1_Y19_VCC)); +defparam syncload_ctrl_X1_Y19.coord_x = 3; +defparam syncload_ctrl_X1_Y19.coord_y = 1; +defparam syncload_ctrl_X1_Y19.coord_z = 1; +defparam syncload_ctrl_X1_Y19.SyncCtrlMux = 2'b01; + +alta_syncctrl syncload_ctrl_X1_Y20( + .Din(), + .Dout(SyncLoad_X1_Y20_VCC)); +defparam syncload_ctrl_X1_Y20.coord_x = 4; +defparam syncload_ctrl_X1_Y20.coord_y = 3; +defparam syncload_ctrl_X1_Y20.coord_z = 1; +defparam syncload_ctrl_X1_Y20.SyncCtrlMux = 2'b01; + +alta_syncctrl syncload_ctrl_X1_Y21( + .Din(), + .Dout(SyncLoad_X1_Y21_VCC)); +defparam syncload_ctrl_X1_Y21.coord_x = 5; +defparam syncload_ctrl_X1_Y21.coord_y = 3; +defparam syncload_ctrl_X1_Y21.coord_z = 1; +defparam syncload_ctrl_X1_Y21.SyncCtrlMux = 2'b01; + +alta_syncctrl syncload_ctrl_X1_Y24( + .Din(), + .Dout(SyncLoad_X1_Y24_VCC)); +defparam syncload_ctrl_X1_Y24.coord_x = 5; +defparam syncload_ctrl_X1_Y24.coord_y = 2; +defparam syncload_ctrl_X1_Y24.coord_z = 1; +defparam syncload_ctrl_X1_Y24.SyncCtrlMux = 2'b01; + +alta_syncctrl syncload_ctrl_X1_Y26( + .Din(), + .Dout(SyncLoad_X1_Y26_VCC)); +defparam syncload_ctrl_X1_Y26.coord_x = 3; +defparam syncload_ctrl_X1_Y26.coord_y = 2; +defparam syncload_ctrl_X1_Y26.coord_z = 1; +defparam syncload_ctrl_X1_Y26.SyncCtrlMux = 2'b01; + +alta_syncctrl syncreset_ctrl_X1_Y15( + .Din(), + .Dout(SyncReset_X1_Y15_GND)); +defparam syncreset_ctrl_X1_Y15.coord_x = 3; +defparam syncreset_ctrl_X1_Y15.coord_y = 3; +defparam syncreset_ctrl_X1_Y15.coord_z = 0; +defparam syncreset_ctrl_X1_Y15.SyncCtrlMux = 2'b00; + +alta_syncctrl syncreset_ctrl_X1_Y19( + .Din(), + .Dout(SyncReset_X1_Y19_GND)); +defparam syncreset_ctrl_X1_Y19.coord_x = 3; +defparam syncreset_ctrl_X1_Y19.coord_y = 1; +defparam syncreset_ctrl_X1_Y19.coord_z = 0; +defparam syncreset_ctrl_X1_Y19.SyncCtrlMux = 2'b00; + +alta_syncctrl syncreset_ctrl_X1_Y20( + .Din(), + .Dout(SyncReset_X1_Y20_GND)); +defparam syncreset_ctrl_X1_Y20.coord_x = 4; +defparam syncreset_ctrl_X1_Y20.coord_y = 3; +defparam syncreset_ctrl_X1_Y20.coord_z = 0; +defparam syncreset_ctrl_X1_Y20.SyncCtrlMux = 2'b00; + +alta_syncctrl syncreset_ctrl_X1_Y21( + .Din(), + .Dout(SyncReset_X1_Y21_GND)); +defparam syncreset_ctrl_X1_Y21.coord_x = 5; +defparam syncreset_ctrl_X1_Y21.coord_y = 3; +defparam syncreset_ctrl_X1_Y21.coord_z = 0; +defparam syncreset_ctrl_X1_Y21.SyncCtrlMux = 2'b00; + +alta_syncctrl syncreset_ctrl_X1_Y24( + .Din(), + .Dout(SyncReset_X1_Y24_GND)); +defparam syncreset_ctrl_X1_Y24.coord_x = 5; +defparam syncreset_ctrl_X1_Y24.coord_y = 2; +defparam syncreset_ctrl_X1_Y24.coord_z = 0; +defparam syncreset_ctrl_X1_Y24.SyncCtrlMux = 2'b00; + +alta_syncctrl syncreset_ctrl_X1_Y26( + .Din(), + .Dout(SyncReset_X1_Y26_GND)); +defparam syncreset_ctrl_X1_Y26.coord_x = 3; +defparam syncreset_ctrl_X1_Y26.coord_y = 2; +defparam syncreset_ctrl_X1_Y26.coord_z = 0; +defparam syncreset_ctrl_X1_Y26.SyncCtrlMux = 2'b00; + +alta_slice sysoff_q( + .A(\MCU_D[2]~input_o ), + .B(vcc), + .C(vcc), + .D(vcc), + .Cin(), + .Qin(\sysoff_q~q ), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__lcd_reset_q~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\sysoff_q~feeder_combout ), + .Cout(), + .Q(\sysoff_q~q )); +defparam sysoff_q.coord_x = 3; +defparam sysoff_q.coord_y = 3; +defparam sysoff_q.coord_z = 2; +defparam sysoff_q.mask = 16'hAAAA; +defparam sysoff_q.modeMux = 1'b0; +defparam sysoff_q.FeedbackMux = 1'b0; +defparam sysoff_q.ShiftMux = 1'b0; +defparam sysoff_q.BypassEn = 1'b0; +defparam sysoff_q.CarryEnb = 1'b1; + +alta_slice \tp_q[0] ( + .A(), + .B(), + .C(\MCU_D[0]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[0]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[0])); +defparam \tp_q[0] .coord_x = 3; +defparam \tp_q[0] .coord_y = 3; +defparam \tp_q[0] .coord_z = 9; +defparam \tp_q[0] .mask = 16'hFFFF; +defparam \tp_q[0] .modeMux = 1'b1; +defparam \tp_q[0] .FeedbackMux = 1'b0; +defparam \tp_q[0] .ShiftMux = 1'b0; +defparam \tp_q[0] .BypassEn = 1'b1; +defparam \tp_q[0] .CarryEnb = 1'b1; + +alta_slice \tp_q[1] ( + .A(), + .B(), + .C(\MCU_D[1]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[1]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[1])); +defparam \tp_q[1] .coord_x = 3; +defparam \tp_q[1] .coord_y = 3; +defparam \tp_q[1] .coord_z = 10; +defparam \tp_q[1] .mask = 16'hFFFF; +defparam \tp_q[1] .modeMux = 1'b1; +defparam \tp_q[1] .FeedbackMux = 1'b0; +defparam \tp_q[1] .ShiftMux = 1'b0; +defparam \tp_q[1] .BypassEn = 1'b1; +defparam \tp_q[1] .CarryEnb = 1'b1; + +alta_slice \tp_q[2] ( + .A(\MCU_D[2]~input_o ), + .B(vcc), + .C(vcc), + .D(vcc), + .Cin(), + .Qin(tp_q[2]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[2]~feeder_combout ), + .Cout(), + .Q(tp_q[2])); +defparam \tp_q[2] .coord_x = 3; +defparam \tp_q[2] .coord_y = 3; +defparam \tp_q[2] .coord_z = 4; +defparam \tp_q[2] .mask = 16'hAAAA; +defparam \tp_q[2] .modeMux = 1'b0; +defparam \tp_q[2] .FeedbackMux = 1'b0; +defparam \tp_q[2] .ShiftMux = 1'b0; +defparam \tp_q[2] .BypassEn = 1'b0; +defparam \tp_q[2] .CarryEnb = 1'b1; + +alta_slice \tp_q[3] ( + .A(), + .B(), + .C(\MCU_D[3]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[3]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[3])); +defparam \tp_q[3] .coord_x = 3; +defparam \tp_q[3] .coord_y = 3; +defparam \tp_q[3] .coord_z = 14; +defparam \tp_q[3] .mask = 16'hFFFF; +defparam \tp_q[3] .modeMux = 1'b1; +defparam \tp_q[3] .FeedbackMux = 1'b0; +defparam \tp_q[3] .ShiftMux = 1'b0; +defparam \tp_q[3] .BypassEn = 1'b1; +defparam \tp_q[3] .CarryEnb = 1'b1; + +alta_slice \tp_q[3]~0 ( + .A(vcc), + .B(vcc), + .C(\MCU_ADDR~input_o ), + .D(\MCU_DIR~input_o ), + .Cin(), + .Qin(), + .Clk(), + .AsyncReset(), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[3]~0_combout ), + .Cout(), + .Q()); +defparam \tp_q[3]~0 .coord_x = 3; +defparam \tp_q[3]~0 .coord_y = 3; +defparam \tp_q[3]~0 .coord_z = 3; +defparam \tp_q[3]~0 .mask = 16'h000F; +defparam \tp_q[3]~0 .modeMux = 1'b0; +defparam \tp_q[3]~0 .FeedbackMux = 1'b0; +defparam \tp_q[3]~0 .ShiftMux = 1'b0; +defparam \tp_q[3]~0 .BypassEn = 1'b0; +defparam \tp_q[3]~0 .CarryEnb = 1'b1; + +alta_slice \tp_q[4] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[4]~input_o ), + .Cin(), + .Qin(tp_q[4]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[4]~feeder_combout ), + .Cout(), + .Q(tp_q[4])); +defparam \tp_q[4] .coord_x = 3; +defparam \tp_q[4] .coord_y = 3; +defparam \tp_q[4] .coord_z = 5; +defparam \tp_q[4] .mask = 16'hFF00; +defparam \tp_q[4] .modeMux = 1'b0; +defparam \tp_q[4] .FeedbackMux = 1'b0; +defparam \tp_q[4] .ShiftMux = 1'b0; +defparam \tp_q[4] .BypassEn = 1'b0; +defparam \tp_q[4] .CarryEnb = 1'b1; + +alta_slice \tp_q[5] ( + .A(), + .B(), + .C(\MCU_D[5]~input_o ), + .D(), + .Cin(), + .Qin(tp_q[5]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(SyncReset_X1_Y15_GND), + .ShiftData(), + .SyncLoad(SyncLoad_X1_Y15_VCC), + .LutOut(), + .Cout(), + .Q(tp_q[5])); +defparam \tp_q[5] .coord_x = 3; +defparam \tp_q[5] .coord_y = 3; +defparam \tp_q[5] .coord_z = 6; +defparam \tp_q[5] .mask = 16'hFFFF; +defparam \tp_q[5] .modeMux = 1'b1; +defparam \tp_q[5] .FeedbackMux = 1'b0; +defparam \tp_q[5] .ShiftMux = 1'b0; +defparam \tp_q[5] .BypassEn = 1'b1; +defparam \tp_q[5] .CarryEnb = 1'b1; + +alta_slice \tp_q[6] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[6]~input_o ), + .Cin(), + .Qin(tp_q[6]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[6]~feeder_combout ), + .Cout(), + .Q(tp_q[6])); +defparam \tp_q[6] .coord_x = 3; +defparam \tp_q[6] .coord_y = 3; +defparam \tp_q[6] .coord_z = 15; +defparam \tp_q[6] .mask = 16'hFF00; +defparam \tp_q[6] .modeMux = 1'b0; +defparam \tp_q[6] .FeedbackMux = 1'b0; +defparam \tp_q[6] .ShiftMux = 1'b0; +defparam \tp_q[6] .BypassEn = 1'b0; +defparam \tp_q[6] .CarryEnb = 1'b1; + +alta_slice \tp_q[7] ( + .A(vcc), + .B(vcc), + .C(vcc), + .D(\MCU_D[7]~input_o ), + .Cin(), + .Qin(tp_q[7]), + .Clk(\MCU_IO_STBX~inputclkctrl_outclk__tp_q[3]~0_combout_X1_Y15_SIG_SIG ), + .AsyncReset(AsyncReset_X1_Y15_GND), + .SyncReset(), + .ShiftData(), + .SyncLoad(), + .LutOut(\tp_q[7]~feeder_combout ), + .Cout(), + .Q(tp_q[7])); +defparam \tp_q[7] .coord_x = 3; +defparam \tp_q[7] .coord_y = 3; +defparam \tp_q[7] .coord_z = 11; +defparam \tp_q[7] .mask = 16'hFF00; +defparam \tp_q[7] .modeMux = 1'b0; +defparam \tp_q[7] .FeedbackMux = 1'b0; +defparam \tp_q[7] .ShiftMux = 1'b0; +defparam \tp_q[7] .BypassEn = 1'b0; +defparam \tp_q[7] .CarryEnb = 1'b1; + +endmodule diff --git a/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_sram.prg b/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_sram.prg new file mode 100644 index 00000000..6f2e9295 --- /dev/null +++ b/hardware/portapack_h4m/CPLD/Supra/portapack_h4m_cpld_sram.prg @@ -0,0 +1,58 @@ +set sh_continue_on_error false +usb_connect +if { ! [jtag_device_id] } { + exit +} +runtest -tck 1 +sir 10 -tdi 3e3 +runtest -tck 5000 +sir 10 -tdi 3f8 +runtest -tck 100 +sir 10 -tdi 3f9 +runtest -tck 100 +sir 10 -tdi 3f8 +runtest -tck 100 +sir 10 -tdi 6 +runtest -tck 100 +sdr 32 -tdi 00000000 -tdo 00025610 -mask ffffffff +sir 10 -tdi 3fc +runtest -tck 100 +sdr 8 -tdi 00 +sir 10 -tdi 3fa +runtest -tck 100 +sdr 57568 \ + -tdi f1f00000403f00540000007fffffffffffffffffe0000000000000000000000000000000001fffff0000007fffffffffffffffffe0000000000000000000000000000000001fffff0000007fffffffffffffffffe0000000000000000000000000000000001fffff0000007fffffffffffffffffe0000000000000000000000000000000001fffff0000007fffffffffffffffffe561104842434220110104280440010a011fffff0000007fffffffffffffffffe0020800000008000004000000018000001fffff0000007fffffffffffffffffe66318300180c6000000000000000000001fffff0000007fffffffffffffffffe000000000020020110004280040010a001fffff0000007e000000000000000000000a88800000608000000000000000000000000000007e000000000000000000000003000004019800000000000000000000000000007e00000000000000000000004b700000906000000000000000000000000000007e000000000000000000000003000091019000000000000000000000000000007e000000000000000000000000000000680000000000000000000000010000007e00000000000000000000000000000400d000000000000000000000000000007e000000000000000000000000008008a1e800000000000000000000000000007e000000000000000018000000040000002000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000500000001480000000000000000000000000010000007e000000000000000000000000000010000000000000000000000000000000007e000000000000000000008000000000000080000000000000000000000000007e000000000000000000008000000000000040000000000000000000000000007e000000000000000000000000000000000000000000000000000000010000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000010000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000010000000000000000000000000000000000000000007e000000000000000000004000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000010000007e000000000000000000000000000000000000000000000000000000000000007e00000000000000000c000000000060000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000688080000000000000000000010000007e000000000000000000000000002204009840000000000000000000000000007e000000000000000000000000000214606000000000000000000000000000007e000000000000000000000000000820089000000000000000000000000000007e000000000000000000000000100000000000000000000000000000000000007e000000000000000000000000100000000000000000000000000000000000007e000000000000000008000000400000000000000000000000000000000000007e000000000000000008000000000000000000000000000000000000000000007e000000000000000000028000000000688000800000000000000000010000007e000000000000000000000000000004008001000000000000000000000000007e000000000000000000000000000008607800000000000000000000000000007e000000000000000000000000000000109000000000000000000000000000007e000000000000000000000000000040000000800000000000000000010000007e000000000000000000000000000010000001000000000000000000000000007e0000000000000000002000000000a0000000000000000000000000000000007e000000000000000000080000000000000000000000000000000000000000007e000000000000000000000000028000000004000000000000000000010000007e000000000000000000000000000000000000800000000000000000000000007e000000000000000000000000020000000000000000000000000000000000007e000000000000000000000000010000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000010000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000010000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000080000000000000000000000007e000000000000000000000000000000000000100000000000000000000000007e000000000000000008000188800000000000000000000000000000010000007e00000000000000000800d003000000000000000000000000000000000000007e000000000000000000000047700000000000800000000000000010000000007e000000000000000000000003000000000001000000000000000020000000007e000000000000000000044000000010000000000000000200000000010000007e000000000000000000000000000100000000000000000400000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007f008428040000000000000000000000000000000000000000000000010000007e000000000000000000000000000090000000000000000000000000000000007e000000000000000000018000000010000000000000000000000000000000007f0080000000000000000000000001000000000000000000000000000000000000000000000000000010000000000000a080040118080000000000000400000000000000000000000002000000000002029800800130000000000000000000000000000000000000000000000000008050600000093700000000000000000000120000000000000000000000000000108190000000300000000000000200000000000000000000000000000000000004a0000000000000000000000004000000000000000000000000000000000480000290000000000000000000000000000000000000000000000000000000000000a8f8000000000000000000000000000000000000000000000000000000000002002000000000000000000000200000004000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000080000000400000000000000000000000000000000000000000000000000000001000000010000000000000000000000000000000000004000000000000000000020000000021000000000000000000000000001000000000000000000000000000800000008400000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000400000000000000000000040000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000480000000040000000000000000000000000000000000000000000000000040000000000000000000014000000400000000000000000000000000a800000000000000000000000000000000002000000000000000000000000001000000000000000000000000000010800002000000000000000000000000000000000000000000000000000000008400000100000000000000000000000000000000000000000000000000000000000001100000000000000001000000000000000000000000000000000000000000000010000000000000000100000000000000000000000000000000000000080000004000000000800000040000000000000000000000000000000000000008004000200000000080000000000000000000000000004000000000000000000001220000048061c000000000000000000a000000000000000000000000000000004000900818009800000000000000000000000000000000400000000000000000000010000090180100000000000000000000000000000004000000000000000000000c40020240080000000000000000000000000040000000000000000000000083000100a00000000000000000000000000000000110000000000000000000002370121202d000000000000000000000000000000000000000000000000400800060000464e8000000000000000000000000000000000000000000000010040000080000002000000000000000000000240000004000000000000000000000028384000000000000000000000000000001000000000000000000000000000002070100000000000000000000000000000000000000000000000000000000000080700080000000000000000000000000000000000000000000000000000000000b0000100000000000000000000000000000000040000000000000000000000182800000000000000000000000000000010000000000000000006000000000080a201200000000000000000000000000000000000000000000000000000000210352000000000100000000000000000000000000000000000000000000000000030100000000080000000000000000000000000040000000000000000000000282800000000000000000000000001200010000000000000000000000000000100a2000000000000000000000000000000000000000088000000000000008000103500000000000000000000000000a000000000000000000000000000004002003000000000000000000000000000000000000004000000000000000000000120004000000000000000000000000000001000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000120800000081000000000000000000000000000110000000000000000000c00009025000001800000000000000000000000000400000000000000000000000000080000001000000000000000000000100000000000000000000000000000000040000000020000000000000000000000000000000200000000200000000000000000000008000000000000000005000000000000004000000040000000000000000000000100000000000000000000000000040000000000000000000000000000020000000040000000000000000010000000000000000000000000000000000010000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000008300000020c000000000002000000000010000000000000000000000000000c00b68000008d8000000000080000000000000000000000000000000000000020000600000001800000000000000000000000000000000000000000000000000400000000000020000000000000000000000000000400000000000000000000022000000000000000000000000000000000100000000000000000000000012000000882200000000000000000000000000000000000000000000002000000000000010000000000000000000000000140000000000000180000000800000000000000000000000000000000000000000000000000008000000000000000000800083000000000000200000000000000000010000000000000000000000000008000b780000000000040000000000000000000000000000000000000000000000000060000000000080000000000000000000000000020000000000600000001800000000000000040000000000000000000000000001000000000000000000000001000000000000040000000000000000010000000010000000000000000000000150000000000010000000000000000000000000000000000000000000000021022000000000002400000000000000000000000029800000000000000000000001a80000000000000000000000000000000000000c000000000000000000028083000000000000000000000000000000010000000000000000000000000000001368011000000000000000000000000000000000000000000000000000090000006024000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000110000000000000000004610001000024c000000000000000000000010000000000000000600000001800000084000000d80000000000000000000000000000000000000000000000020000001000000018900000000000000000000000000030000000000000000010000000080000000200000000000000000000000000000200000000000400000000010000001000000800a8080000000000000100000000000000000001000000002000880020000000a4013000000000000000000000000000000000000000000480001240000000000009370000000000040000000010000000000000000000000000000000000000000030000000000000400000000000000000000000000080008300000000000000000000000000000001000000000000000000000000000800137012000000000000000000000000000000000000000000000000000000048000624000000000000000000000000080000000001200000000000000000000000008000000000000000000000000000800000000000000000000000000000000829000000004000000010000000000000000000000000000000000000000000004100000000400000001000000000000000000000000000000000000000800400840000000188000000400000000000000000000000000000000000000000000802200000000800000000000000000000000000000000000000000000000000143002400000000000000000000000000010000000001800000000000000000080b00000000000000000000000000000000000000000080000000000000000000038424000000000000000000000000000000000000080000000000000000000003e0800000000000000000000000000000000000400000000000000000099012000000004000000000000000000000000100000000000000000000000000000000800000802200000000000000000000000000000000000000000000000904800010012000040280000001200000000000000000000000000000000000000000000c8000000000000000000000000000000000000400000000000a00000082808300000020c000002878000000000000010000000000000000000000000008002368120004da0000403000000000000000000000000000000000040000000000006001000018080008070000000000004000000008000000000001000000000000000010000000800130000000000001000000001000000000002000000000000200020000000000000000000000000001000000000000000000400000000000022804000000000000000000000000000000000000000000000000000000000101c024000000000000000000000000000000000021800000000000000000882002400000000000000000000000000000000000004000000000000100000004414000010000000000000000000000000001000000000000000000100000000008086000100000004400000000000000000000000000000000000000000000000003e000000000000000000000000000000000000000018000000000000018000003e00000000000000000000000000000000000004000000000000000000010000204020000000000000000000000000001000000000000000000000000004000023104000000000000000000000012000000000000100000000000000009048101c00000000009000000000000000000000000000100000000000000000000200248000000000000000000000000004800000000000000000000000000009000800400000000a9000000000000000000000000000000000000000000000000000410800000000000000000000000000000000000000000000000000000090000038264000000990000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000004000000000000000000000000000012c000000000000000000000000000000180800000000000000000000000120000d8000000000000000000000000000001100000000000000000000000024000001800000000000000000000000000000a000000000060000000000000000000000200000000000000000000000000007e00000000018c60cc04210820010842080000842000000002011fffff0000007e000000000000000002421010009084040050000000000000001fffff0000007e04000000020040c401050800011808000060000000000000001fffff0000007e620428042892201008a010504041210a100084250440210a011fffff0000007e000000000000000000000000000000000000000000000000001fffff0000007e000000000000000000000000000000000000000000000000001fffff0000007e000000000000000000000000000000000000000000000000001fffff0000007e000000000000000000000000000000000000000000000000001fffff04ffdb00000000450000a1650b285942ca1641ee0f707b83df0b3859c2ce1670b28f947ca3e51f205902c81640b205942ca1650b285942ca1650b285942ca1650b285942ca1650b285907b83dc1ee05942ca1640b285902c83dc1ee0f707b83dc1ee0f707b81640b20f707b83dc1ee0f707b83dc1ee0f707883c40b285942c81650b20f1c2ca1650b385942c04f0200004000045 \ + -tdo 0 \ + -mask 0 +sir 10 -tdi 3e5 +runtest -tck 100 +sir 10 -tdi 3fc +runtest -tck 100 +sdr 8 -tdi 00 +sir 10 -tdi 3fa +runtest -tck 100 +sdr 64 \ + -tdi 04f0200004000005 \ + -tdo 0 \ + -mask 0 +sir 10 -tdi 3fd +runtest -tck 100 +sdr 1044 \ + -tdi 0 \ + -tdo 142CA1650B285942C83DC1EE0F707BE1670B3859C2CE1651F28F947CA3E40B205902C81640B285942CA1650B285942CA1650B285942CA1650B285942CA1650B20F707B83DC0B285942C81650B205907B83DC1EE0F707B83DC1EE0F702C81641EE0F707B83DC1EE0F707B83DC1EE0F107881650B285902CA1641E385942CA1670B2858 \ + -mask 1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE +sir 10 -tdi 3fa +runtest -tck 100 +sdr 64 \ + -tdi 0402130000000005 \ + -tdo 0 \ + -mask 0 +sir 10 -tdi 3fd +runtest -tck 100 +sdr 51268 \ + -tdi 0 \ + -tdo 07FFFFFFFFFFFFFFFFFE0000000000000000000000000000000001FFFFF3FFFFFFFFFFFFFFFFFF0000000000000000000000000000000000FFFFF9FFFFFFFFFFFFFFFFFF80000000000000000000000000000000007FFFFCFFFFFFFFFFFFFFFFFFC0000000000000000000000000000000003FFFFE7FFFFFFFFFFFFFFFFFE561104842434220110104280440010A011FFFFF3FFFFFFFFFFFFFFFFFF001040000000400000200000000C000000FFFFF9FFFFFFFFFFFFFFFFFF998C60C0060318000000000000000000007FFFFCFFFFFFFFFFFFFFFFFFC0000000000400402200085000800214003FFFFE7E000000000000000000000A88800000608000000000000000000000003F00000000000000000000000180000200CC00000000000000000000001F800000000000000000000012DC0000241800000000000000000000000FC000000000000000000000006000122032000000000000000000000007E000000000000000000000000000000680000000000000000000000013F000000000000000000000000000002006800000000000000000000001F800000000000000000000000002002287A00000000000000000000000FC000000000000000030000000080000004000000000000000000000007E000000000000000000000000000000000000000000000000000000003F000000000000000000000000000000000000000000000000000000001F800000000000000000000000000000000000000000000000000000000FC000000000000000000000000000000000000000000000000000000007E000000000000000000500000001480000000000000000000000000013F000000000000000000000000000008000000000000000000000000001F800000000000000000002000000000000020000000000000000000000FC000000000000000000010000000000000080000000000000000000007E000000000000000000000000000000000000000000000000000000013F000000000000000000000000000000000000000000000000000000001F800000000000000000000000000000000000000000000000000000000FC000000000000000000000000000000000000000000000000000000007E000000000000000000000000000000000000000000000000000000013F000000000000000000000000000000000000000000000000000000001F800000000000000000004000000000000000000000000000000000000FC000000000000000000008000000000000000000000000000000000007E000000000000000000000000000000000000000000000000000000013F000000000000000000000000000000000000000000000000000000001F800000000000000003000000000018000000000000000000000000000FC000000000000000000000000000000000000000000000000000000007E000000000000000000000000000000688080000000000000000000013F000000000000000000000000001102004C20000000000000000000001F800000000000000000000000000085181800000000000000000000000FC000000000000000000000000001040112000000000000000000000007E000000000000000000000000100000000000000000000000000000003F000000000000000000000000080000000000000000000000000000001F800000000000000002000000100000000000000000000000000000000FC000000000000000010000000000000000000000000000000000000007E000000000000000000028000000000688000800000000000000000013F000000000000000000000000000002004000800000000000000000001F800000000000000000000000000002181E00000000000000000000000FC000000000000000000000000000000212000000000000000000000007E000000000000000000000000000040000000800000000000000000013F000000000000000000000000000008000000800000000000000000001F800000000000000000080000000028000000000000000000000000000FC000000000000000000100000000000000000000000000000000000007E000000000000000000000000028000000004000000000000000000013F000000000000000000000000000000000000400000000000000000001F800000000000000000000000008000000000000000000000000000000FC000000000000000000000000020000000000000000000000000000007E000000000000000000000000000000000000000000000000000000013F000000000000000000000000000000000000000000000000000000001F800000000000000000000000000000000000000000000000000000000FC000000000000000000000000000000000000000000000000000000007E000000000000000000000000000000000000000000000000000000013F000000000000000000000000000000000000000000000000000000001F800000000000000000000000000000000000020000000000000000000FC000000000000000000000000000000000000200000000000000000007E000000000000000008000188800000000000000000000000000000013F000000000000000004006801800000000000000000000000000000001F800000000000000000000011DC0000000000200000000000000004000FC000000000000000000000006000000000002000000000000000040007E000000000000000000044000000010000000000000000200000000013F000000000000000000000000000080000000000000000200000000001F800000000000000000000000000000000000000000000000000000000FC000000000000000000000000000000000000000000000000000000007F008428040000000000000000000000000000000000000000000000013F000000000000000000000000000048000000000000000000000000001F800000000000000000006000000004000000000000000000000000000FE0100000000000000000000000002000000000000000000000000000000000000000000000010000000000000A080040118080000000000000400000000000000000001000000000001014C00400098000000000000000000000000000000000000000000002014180000024DC00000000000000240000000000000000000000000000210320000000600000000000000400000000000000000000000000000004A00000000000000000000000040000000000000000000000000002400001480000000000000000000000000000000000000000000000000000002A3E000000000000000000000000000000000000000000000000000000400400000000000000000000040400000000000400000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000040000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000020000000100000000000000000000000000000000000000000000000000200000002000000000000000000000000000000400000000000000000002000000002100000000000000000000000000100000000000000000000040000000420000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000004000000000000000000000400000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000900000000080000000000000000000000000000000000000000000040000000000000000000014000000400000000000000000000000000A80000000000000000000000000000100000000000000000000000000080000000000000000000000420000080000000000000000000000000000000000000000000000000108000002000000000000000000000000000000000000000000000000000000011000000000000000010000000000000000000000000000000000000000080000000000000000800000000000000000000000000000000200000010000000002000000100000000000000000000000000000000010008000400000000100000000000000000000004000000000000000000001220000048061C000000000000000000A00000000000000000000000000200048040C004C000000000000000000000000001000000000000000000000040000240600400000000000000000000000008000000000000000000001880040480100000000000000000000040000000000000000000000083000100A000000000000000000000000000880000000000000000000011B809090168000000000000000000000000000000000000000001002000180001193A00000000000000000000000000000000000000000200800001000000040000000000000000000004840000000000000000000000283840000000000000000000000000000010000000000000000000000010380800000000000000000000000000000000000000000000000000000201C002000000000000000000000000000000000000000000000000000016000020000000000000000000000000004000000000000000000000018280000000000000000000000000000001000000000000300000000004051009000000000000000000000000000000000000000000000000000840D4800000000040000000000000000000000000000000000000000000006020000000010000000000000000000004000000000000000000000028280000000000000000000000000120001000000000000000000000008051000000000000000000000000000000000022000000000000002000040D4000000000000000000000000028000000000000000000000008004006000000000000000000000000000000004000000000000000000000120004000000000000000000000000000001000000000000000000000000004880000000000000000000000000000000000000000000000000000000048200000020400000000000000000000022000000000000000000180001204A00000300000000000000000000040000000000000000000000000008000000100000000000000000000010000000000000000000000000002000000001000000000000000000000000008000000008000000000000000000000200000000000000000140000000080000000800000000000000000000002000000000000000000000400000000000000000000000000000200000000400000000000000000100000000000000000000000000000080000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000008300000020C0000000000020000000000100000000000000000000006005B40000046C000000000040000000000000000000000000000000008000180000000600000000000000000000000000000000000000000000080000000000004000000000000000000000040000000000000000000002200000000000000000000000000000000010000000000000000000900000044110000000000000000000000000000000000000000080000000000000400000000000000000000000005000000003000000010000000000000000000000000000000000000000000000080000000000000000008000830000000000002000000000000000000100000000000000000000040005BC00000000000200000000000000000000000000000000000000000000180000000000200000000000000000000040000000000C000000030000000000000000800000000000000000000010000000000000000000000010000000000000400000000000000000100080000000000000000000000A80000000000080000000000000000000000000000000000000000084088000000000009000000000000000000053000000000000000000000003500000000000000000000000000000000C0000000000000000000280830000000000000000000000000000000100000000000000000000000009B40088000000000000000000000000000000000000000000000240000018090000000000000000000000000000000030000000000000000000000000000000000000000000000000000000110000000000000000004610001000024C000000000000000000000010000000000300000000C000000420000006C00000000000000000000000000000000000000000080000004000000062400000000000000000000060000000000000000020000000100000000400000000000000000000000200000000000400000000010000001000000800A8080000000000000100000000000000800000001000440010000000520098000000000000000000000000000000000001200004900000000000024DC000000000010002000000000000000000000000000000000000000006000000000000080000000000000000000008000830000000000000000000000000000000100000000000000000000040009B80900000000000000000000000000000000000000000000000001200018900000000000000000000000002000024000000000000000000000000100000000000000000000000000010000000000000000000000000008290000000040000000100000000000000000000000000000000000000020800000002000000008000000000000000000000000000000002001002100000000620000001000000000000000000000000000000000000001004400000001000000000000000000000000000000000000000000000143002400000000000000000000000000010000C0000000000000000004058000000000000000000000000000000000002000000000000000000000E1090000000000000000000000000000000100000000000000000000007C10000000000000000000000000000004000000000000000000990120000000040000000000000000000000001000000000000000000000000004000004011000000000000000000000000000000000000000002412000040048000100A0000000480000000000000000000000000000000000000190000000000000000000000000000000400000000000A00000082808300000020C0000028780000000000000100000000000000000000040011B40900026D000020180000000000000000000000000001000000000000180040000602000201C000000000001001000000000000200000000000000002000000100026000000000000200100000000000200000000000020002000000000000000000000000000100000000000020000000000001140200000000000000000000000000000000000000000000000000004070090000000000000000000000000000043000000000000000001104004800000000000000000000000000000004000000000000100000004414000010000000000000000000000000001000000000000080000000004043000080000002200000000000000000000000000000000000000000000F8000000000000000000000000000000000030000000000000030000007C000000000000000000000000000000040000000000000000000100002040200000000000000000000000000010000000000000000000020000118820000000000000000000000090000000400000000000000024120407000000000024000000000000000000000200000000000000000000400490000000000000000000000000009000000000000000000000009000800400000000A900000000000000000000000000000000000000000000020840000000000000000000000000000000000000000000000002400000E0990000002640000000000000000000000000000000000000000000007D00000000000000000000000000000000004000000000000000000000000000012C0000000000000000000000000C04000000000000000000000000900006C000000000000000000000000440000000000000000000000009000000600000000000000000000000140000000000C0000000000000000000000400000000000000000000007E00000000018C60CC04210820010842080000842000000002011FFFFF3F000000000000000001210808004842020028000000000000000FFFFF9F8100000000801031004142000046020000180000000000000007FFFFCFCC408500851244020114020A0808242142001084A08804214023FFFFE7E000000000000000000000000000000000000000000000000001FFFFF3F000000000000000000000000000000000000000000000000000FFFFF9F8000000000000000000000000000000000000000000000000007FFFFCFC000000000000000000000000000000000000000000000000003FFFFE0 \ + -mask 00000000000000000000184200C0061080300184200C00610803000000000000000000000000000C2100600308401800C210060030840180000000000000000000000000061080300184200C0061080300184200C00000000000000000000000000308401800C2100600308401800C2100600000000000000000000000001FFFFEFFC7FFFFBFF1FFFFEFFC7FFFFBFF00000000000000000000000007FBDE3FC1FEF78FF07FBDE3FC1FEF78FF00000000000000000000000003FDEF1FE0FF7BC7F83FDEF1FE0FF7BC7F80000000000000000000000003FFFFDFF8FFFFF7FE3FFFFDFF8FFFFF7FE0000000000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00000000000000000008007FFFFA001FFFFE8007FFFFA001FFFFE003C000000000000000000004003FFFFD000FFFFF4003FFFFD000FFFFF0000000000000000000000002001FFFFE8007FFFFA001FFFFE8007FFFF8000000000000000000000001000FFFFF4003FFFFD000FFFFF4003FFFFC007800000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0000000000000000001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF0000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE00184200C0061080001FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF000C210060030840000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE000061080300184000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000308401800C2000003FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE01FFFFEFFC7FFFFBF01FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF007FBDE3FC1FEF79F80FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0003FDEF1FE0FF7800007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0003FFFFDFF8FFFE0000BFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE1FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFC00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC1FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFC00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE008007FFFFA001FFFFE8007FFFFA001FFFFE8007FFFFA001FFFFE003C0004003FFFFD000FFFFF4003FFFFD000FFFFF4003FFFFD000FFFFF00000002001FFFFE8007FFFFA001FFFFE8007FFFFA001FFFFE8007FFFF80000001000FFFFF4003FFFFD000FFFFF4003FFFFD000FFFFF4003FFFFC007807FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE008007FFFFA001FFFFE8007FFFFA001FFFFE8007FFFFA001FFFFE003C0004003FFFFD000FFFFF4003FFFFD000FFFFF4003FFFFD000FFFFF00000002001FFFFE8007FFFFA001FFFFE8007FFFFA001FFFFE8007FFFF80000001000FFFFF4003FFFFD000FFFFF4003FFFFD000FFFFF4003FFFFC007807FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE7FFFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFFFF97FFFFFFE5FFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE0007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE01FFFFEFFC7FFFFBFF1FFFFEFFC7FFFFBFF1FFFFEFFC7FFFFBFF000000007FBDE3FC1FEF78FF07FBDE3FC1FEF78FF07FBDE3FC1FEF78FF000000003FDEF1FE0FF7BC7F83FDEF1FE0FF7BC7F83FDEF1FE0FF7BC7F800000003FFFFDFF8FFFFF7FE3FFFFDFF8FFFFF7FE3FFFFDFF8FFFFF7FE00000000184200C0061080300184200C0061080300184200C006108030000000000C2100600308401800C2100600308401800C2100600308401800000000061080300184200C0061080300184200C0061080300184200C000000000308401800C2100600308401800C2100600308401800C2100600000000 +sir 10 -tdi 3f9 +runtest -tck 100 +usb_close diff --git a/hardware/portapack_h4m/CPLD_Schematic.pdf b/hardware/portapack_h4m/CPLD_Schematic.pdf new file mode 100644 index 00000000..10e98f45 Binary files /dev/null and b/hardware/portapack_h4m/CPLD_Schematic.pdf differ diff --git a/hardware/portapack_h4m/LCD_TF_Schematic.pdf b/hardware/portapack_h4m/LCD_TF_Schematic.pdf new file mode 100644 index 00000000..424ddebe Binary files /dev/null and b/hardware/portapack_h4m/LCD_TF_Schematic.pdf differ diff --git a/hardware/portapack_h4m/Power_Switch_Schematic.pdf b/hardware/portapack_h4m/Power_Switch_Schematic.pdf new file mode 100644 index 00000000..8b8d2104 Binary files /dev/null and b/hardware/portapack_h4m/Power_Switch_Schematic.pdf differ diff --git a/hardware/portapack_h4m/To_HackRF_Connector_Schematic.pdf b/hardware/portapack_h4m/To_HackRF_Connector_Schematic.pdf new file mode 100644 index 00000000..e5009bc3 Binary files /dev/null and b/hardware/portapack_h4m/To_HackRF_Connector_Schematic.pdf differ diff --git a/hardware/portapack_h4m/readme_h4m b/hardware/portapack_h4m/readme_h4m new file mode 100644 index 00000000..be3150a2 --- /dev/null +++ b/hardware/portapack_h4m/readme_h4m @@ -0,0 +1 @@ +Here are the schematic files of H4M. If you have any questions about them, please feel free to contact me. My email address is opensourcesdrlab@gmail.com diff --git a/sdcard/CVSFILES/Aisle_Eight_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Eight_ENGLISH.C16 new file mode 100644 index 00000000..2800bb5a Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Eight_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Eight_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Eight_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..07493376 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Eight_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Eighteen_Customer_Service_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Eighteen_Customer_Service_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..3248483c Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Eighteen_Customer_Service_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Eighteen_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Eighteen_ENGLISH.C16 new file mode 100644 index 00000000..be1ec5f0 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Eighteen_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Eleven_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Eleven_ENGLISH.C16 new file mode 100644 index 00000000..b3ea2966 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Eleven_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Eleven_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Eleven_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..3de0b85f Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Eleven_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Fifteen_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Fifteen_ENGLISH.C16 new file mode 100644 index 00000000..4b6c3262 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Fifteen_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Five_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Five_ENGLISH.C16 new file mode 100644 index 00000000..97d7bf1a Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Five_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Five_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Five_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..926de6f1 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Five_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Four_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Four_ENGLISH.C16 new file mode 100644 index 00000000..eda93e84 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Four_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Fourteen_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Fourteen_ENGLISH.C16 new file mode 100644 index 00000000..5cf713cb Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Fourteen_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Nine_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Nine_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..c89bb747 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Nine_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Nineteen_Customer_Service_needed_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Nineteen_Customer_Service_needed_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..4d34cf0d Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Nineteen_Customer_Service_needed_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Nineteen_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Nineteen_ENGLISH.C16 new file mode 100644 index 00000000..afa8ba15 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Nineteen_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_One_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_One_ENGLISH.C16 new file mode 100644 index 00000000..0dd3a02f Binary files /dev/null and b/sdcard/CVSFILES/Aisle_One_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_One_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_One_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..ad72722e Binary files /dev/null and b/sdcard/CVSFILES/Aisle_One_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Seven_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Seven_ENGLISH.C16 new file mode 100644 index 00000000..94cd8945 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Seven_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Seven_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Seven_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..a52cbef6 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Seven_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Seventeen_Customer_Service_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Seventeen_Customer_Service_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..a0ad40f0 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Seventeen_Customer_Service_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Seventeen_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Seventeen_ENGLISH.C16 new file mode 100644 index 00000000..a4ff7b76 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Seventeen_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Six_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Six_ENGLISH.C16 new file mode 100644 index 00000000..b43efc18 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Six_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Six_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Six_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..23473221 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Six_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Sixteen_Customer_Service_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Sixteen_Customer_Service_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..f1fffd7d Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Sixteen_Customer_Service_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Sixteen_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Sixteen_ENGLISH.C16 new file mode 100644 index 00000000..b0fb294d Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Sixteen_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Ten_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Ten_ENGLISH.C16 new file mode 100644 index 00000000..51844c0d Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Ten_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Ten_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Ten_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..d6d6c256 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Ten_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Thirteen_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Thirteen_ENGLISH.C16 new file mode 100644 index 00000000..b84ef851 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Thirteen_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Thirteen_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Thirteen_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..4afd1eb3 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Thirteen_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Three_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Three_ENGLISH.C16 new file mode 100644 index 00000000..209b9f3c Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Three_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Three_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Three_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..7d09bc8f Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Three_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Twelve_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Twelve_ENGLISH.C16 new file mode 100644 index 00000000..5955ba4a Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Twelve_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Twelve_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Twelve_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..d0ec4676 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Twelve_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Twenty_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Twenty_ENGLISH.C16 new file mode 100644 index 00000000..bd3b79e0 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Twenty_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Twenty_Medical_Alert_to_the_Minute_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Twenty_Medical_Alert_to_the_Minute_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..72d47a24 Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Twenty_Medical_Alert_to_the_Minute_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Two_ENGLISH.C16 b/sdcard/CVSFILES/Aisle_Two_ENGLISH.C16 new file mode 100644 index 00000000..2fec4b1b Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Two_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Aisle_Two_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Aisle_Two_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..7527738a Binary files /dev/null and b/sdcard/CVSFILES/Aisle_Two_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Allergy_Department_ENGLISH.C16 b/sdcard/CVSFILES/Allergy_Department_ENGLISH.C16 new file mode 100644 index 00000000..27178c3f Binary files /dev/null and b/sdcard/CVSFILES/Allergy_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Baby_Formula_ENGLISH.C16 b/sdcard/CVSFILES/Baby_Formula_ENGLISH.C16 new file mode 100644 index 00000000..953fd242 Binary files /dev/null and b/sdcard/CVSFILES/Baby_Formula_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Baby_Formula_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Baby_Formula_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..6ebb80e6 Binary files /dev/null and b/sdcard/CVSFILES/Baby_Formula_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Batteries_ENGLISH.C16 b/sdcard/CVSFILES/Batteries_ENGLISH.C16 new file mode 100644 index 00000000..0dd762bf Binary files /dev/null and b/sdcard/CVSFILES/Batteries_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Batteries_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Batteries_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..b03f46cb Binary files /dev/null and b/sdcard/CVSFILES/Batteries_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Body_Wash_ENGLISH.C16 b/sdcard/CVSFILES/Body_Wash_ENGLISH.C16 new file mode 100644 index 00000000..10daa9f6 Binary files /dev/null and b/sdcard/CVSFILES/Body_Wash_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Body_Wash_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Body_Wash_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..79e14641 Binary files /dev/null and b/sdcard/CVSFILES/Body_Wash_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Cashier_to_the_Front_of_the_Store_ENGLISH.C16 b/sdcard/CVSFILES/Cashier_to_the_Front_of_the_Store_ENGLISH.C16 new file mode 100644 index 00000000..eb011fac Binary files /dev/null and b/sdcard/CVSFILES/Cashier_to_the_Front_of_the_Store_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Clinic_1_Medical_Alert_to_the_ENGLISH.C16 b/sdcard/CVSFILES/Clinic_1_Medical_Alert_to_the_ENGLISH.C16 new file mode 100644 index 00000000..3a8ad2c8 Binary files /dev/null and b/sdcard/CVSFILES/Clinic_1_Medical_Alert_to_the_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Cosmetics_Department_ENGLISH.C16 b/sdcard/CVSFILES/Cosmetics_Department_ENGLISH.C16 new file mode 100644 index 00000000..b1cf8270 Binary files /dev/null and b/sdcard/CVSFILES/Cosmetics_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Cosmetics_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Cosmetics_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..f8949ff0 Binary files /dev/null and b/sdcard/CVSFILES/Cosmetics_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Cough_Cold_ENGLISH.C16 b/sdcard/CVSFILES/Cough_Cold_ENGLISH.C16 new file mode 100644 index 00000000..fb671494 Binary files /dev/null and b/sdcard/CVSFILES/Cough_Cold_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Cough_Cold_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Cough_Cold_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..5e9fde7a Binary files /dev/null and b/sdcard/CVSFILES/Cough_Cold_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Customer_Service_Scan_All_Aisles_ENGLISH.C16 b/sdcard/CVSFILES/Customer_Service_Scan_All_Aisles_ENGLISH.C16 new file mode 100644 index 00000000..474d2b9f Binary files /dev/null and b/sdcard/CVSFILES/Customer_Service_Scan_All_Aisles_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Dental_Care_ENGLISH.C16 b/sdcard/CVSFILES/Dental_Care_ENGLISH.C16 new file mode 100644 index 00000000..dbe2ca18 Binary files /dev/null and b/sdcard/CVSFILES/Dental_Care_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Dental_Care_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Dental_Care_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..36d3e0f1 Binary files /dev/null and b/sdcard/CVSFILES/Dental_Care_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Deodorants_ENGLISH.C16 b/sdcard/CVSFILES/Deodorants_ENGLISH.C16 new file mode 100644 index 00000000..21f9e898 Binary files /dev/null and b/sdcard/CVSFILES/Deodorants_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Deodorants_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Deodorants_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..834cb82d Binary files /dev/null and b/sdcard/CVSFILES/Deodorants_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Diet_and_Nutrition_Department_ENGLISH.C16 b/sdcard/CVSFILES/Diet_and_Nutrition_Department_ENGLISH.C16 new file mode 100644 index 00000000..090aa310 Binary files /dev/null and b/sdcard/CVSFILES/Diet_and_Nutrition_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Diet_and_Nutrition_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Diet_and_Nutrition_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..6a41e757 Binary files /dev/null and b/sdcard/CVSFILES/Diet_and_Nutrition_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Ding_1_ENGLISH.C16 b/sdcard/CVSFILES/Ding_1_ENGLISH.C16 new file mode 100644 index 00000000..6ccad97c Binary files /dev/null and b/sdcard/CVSFILES/Ding_1_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Electric_Razors_ENGLISH.C16 b/sdcard/CVSFILES/Electric_Razors_ENGLISH.C16 new file mode 100644 index 00000000..2b94ac47 Binary files /dev/null and b/sdcard/CVSFILES/Electric_Razors_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Electric_Razors_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Electric_Razors_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..91793949 Binary files /dev/null and b/sdcard/CVSFILES/Electric_Razors_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Electronics_ENGLISH.C16 b/sdcard/CVSFILES/Electronics_ENGLISH.C16 new file mode 100644 index 00000000..59054565 Binary files /dev/null and b/sdcard/CVSFILES/Electronics_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Electronics_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Electronics_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..2f5d7672 Binary files /dev/null and b/sdcard/CVSFILES/Electronics_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Eye_Care_Department_ENGLISH.C16 b/sdcard/CVSFILES/Eye_Care_Department_ENGLISH.C16 new file mode 100644 index 00000000..931c8b33 Binary files /dev/null and b/sdcard/CVSFILES/Eye_Care_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Eye_Care_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Eye_Care_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..1c3f2ced Binary files /dev/null and b/sdcard/CVSFILES/Eye_Care_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Family_Planning_ENGLISH.C16 b/sdcard/CVSFILES/Family_Planning_ENGLISH.C16 new file mode 100644 index 00000000..13ed947c Binary files /dev/null and b/sdcard/CVSFILES/Family_Planning_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Family_Planning_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Family_Planning_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..37653a0c Binary files /dev/null and b/sdcard/CVSFILES/Family_Planning_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Film_Department_ENGLISH.C16 b/sdcard/CVSFILES/Film_Department_ENGLISH.C16 new file mode 100644 index 00000000..a6b374e5 Binary files /dev/null and b/sdcard/CVSFILES/Film_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Film_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Film_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..2e9e9db1 Binary files /dev/null and b/sdcard/CVSFILES/Film_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/First_Aid_Department_ENGLISH.C16 b/sdcard/CVSFILES/First_Aid_Department_ENGLISH.C16 new file mode 100644 index 00000000..c4226c3c Binary files /dev/null and b/sdcard/CVSFILES/First_Aid_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/First_Aid_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/First_Aid_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..cda7c667 Binary files /dev/null and b/sdcard/CVSFILES/First_Aid_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Foot_Care_Department_ENGLISH.C16 b/sdcard/CVSFILES/Foot_Care_Department_ENGLISH.C16 new file mode 100644 index 00000000..891b32f9 Binary files /dev/null and b/sdcard/CVSFILES/Foot_Care_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Foot_Care_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Foot_Care_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..19bc3ebe Binary files /dev/null and b/sdcard/CVSFILES/Foot_Care_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Hair-Care_Department_ENGLISH.C16 b/sdcard/CVSFILES/Hair-Care_Department_ENGLISH.C16 new file mode 100644 index 00000000..122f099c Binary files /dev/null and b/sdcard/CVSFILES/Hair-Care_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Hair-Care_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Hair-Care_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..dac98bbe Binary files /dev/null and b/sdcard/CVSFILES/Hair-Care_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Health_Department_OTC_Health_ENGLISH.C16 b/sdcard/CVSFILES/Health_Department_OTC_Health_ENGLISH.C16 new file mode 100644 index 00000000..ae4538c7 Binary files /dev/null and b/sdcard/CVSFILES/Health_Department_OTC_Health_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Home_Diagnostics_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Home_Diagnostics_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..aec73b0f Binary files /dev/null and b/sdcard/CVSFILES/Home_Diagnostics_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Liquor_Department_ENGLISH.C16 b/sdcard/CVSFILES/Liquor_Department_ENGLISH.C16 new file mode 100644 index 00000000..ab5c81ea Binary files /dev/null and b/sdcard/CVSFILES/Liquor_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Liquor_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Liquor_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..72bdba3b Binary files /dev/null and b/sdcard/CVSFILES/Liquor_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Manager_to_the_Front_of_the_Store_ENGLISH.C16 b/sdcard/CVSFILES/Manager_to_the_Front_of_the_Store_ENGLISH.C16 new file mode 100644 index 00000000..7ffd91d7 Binary files /dev/null and b/sdcard/CVSFILES/Manager_to_the_Front_of_the_Store_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Manager_to_the_Front_of_the_Store_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Manager_to_the_Front_of_the_Store_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..98003799 Binary files /dev/null and b/sdcard/CVSFILES/Manager_to_the_Front_of_the_Store_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Minute_Clinic_2_OTC_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Minute_Clinic_2_OTC_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..d674b177 Binary files /dev/null and b/sdcard/CVSFILES/Minute_Clinic_2_OTC_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Pain_Reliever_Department_ENGLISH.C16 b/sdcard/CVSFILES/Pain_Reliever_Department_ENGLISH.C16 new file mode 100644 index 00000000..0424cc42 Binary files /dev/null and b/sdcard/CVSFILES/Pain_Reliever_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Pain_Reliever_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Pain_Reliever_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..c6a02467 Binary files /dev/null and b/sdcard/CVSFILES/Pain_Reliever_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Pre-Recorded_Video_Department_ENGLISH.C16 b/sdcard/CVSFILES/Pre-Recorded_Video_Department_ENGLISH.C16 new file mode 100644 index 00000000..148ecf37 Binary files /dev/null and b/sdcard/CVSFILES/Pre-Recorded_Video_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Pre-Recorded_Video_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Pre-Recorded_Video_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..09effbaa Binary files /dev/null and b/sdcard/CVSFILES/Pre-Recorded_Video_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Recordable_Media_Department_ENGLISH.C16 b/sdcard/CVSFILES/Recordable_Media_Department_ENGLISH.C16 new file mode 100644 index 00000000..61616e38 Binary files /dev/null and b/sdcard/CVSFILES/Recordable_Media_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Recordable_Media_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Recordable_Media_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..d1a50a7b Binary files /dev/null and b/sdcard/CVSFILES/Recordable_Media_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Security_to_the_Front_of_the_Store_ENGLISH.C16 b/sdcard/CVSFILES/Security_to_the_Front_of_the_Store_ENGLISH.C16 new file mode 100644 index 00000000..174f8eb7 Binary files /dev/null and b/sdcard/CVSFILES/Security_to_the_Front_of_the_Store_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Security_to_the_Front_of_the_Store_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Security_to_the_Front_of_the_Store_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..133b1fc9 Binary files /dev/null and b/sdcard/CVSFILES/Security_to_the_Front_of_the_Store_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Security_to_the_Minute_Clinic_Customer_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Security_to_the_Minute_Clinic_Customer_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..eef8d2b2 Binary files /dev/null and b/sdcard/CVSFILES/Security_to_the_Minute_Clinic_Customer_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Shaving_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Shaving_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..8d9d0d3f Binary files /dev/null and b/sdcard/CVSFILES/Shaving_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Skin_Care_Department_ENGLISH.C16 b/sdcard/CVSFILES/Skin_Care_Department_ENGLISH.C16 new file mode 100644 index 00000000..9a52ecac Binary files /dev/null and b/sdcard/CVSFILES/Skin_Care_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Skin_Care_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Skin_Care_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..47c82c40 Binary files /dev/null and b/sdcard/CVSFILES/Skin_Care_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Small_Appliances_ENGLISH.C16 b/sdcard/CVSFILES/Small_Appliances_ENGLISH.C16 new file mode 100644 index 00000000..9cf6d091 Binary files /dev/null and b/sdcard/CVSFILES/Small_Appliances_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Small_Appliances_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Small_Appliances_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..4ede3bb4 Binary files /dev/null and b/sdcard/CVSFILES/Small_Appliances_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Special_Ding_ENGLISH.C16 b/sdcard/CVSFILES/Special_Ding_ENGLISH.C16 new file mode 100644 index 00000000..f0681f36 Binary files /dev/null and b/sdcard/CVSFILES/Special_Ding_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Stationery_ENGLISH.C16 b/sdcard/CVSFILES/Stationery_ENGLISH.C16 new file mode 100644 index 00000000..157ff86a Binary files /dev/null and b/sdcard/CVSFILES/Stationery_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Stationery_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Stationery_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..8ed61496 Binary files /dev/null and b/sdcard/CVSFILES/Stationery_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Stomach_Remedies_ENGLISH.C16 b/sdcard/CVSFILES/Stomach_Remedies_ENGLISH.C16 new file mode 100644 index 00000000..4212f613 Binary files /dev/null and b/sdcard/CVSFILES/Stomach_Remedies_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Telecommunications_Department_ENGLISH.C16 b/sdcard/CVSFILES/Telecommunications_Department_ENGLISH.C16 new file mode 100644 index 00000000..757ad4e7 Binary files /dev/null and b/sdcard/CVSFILES/Telecommunications_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Telecommunications_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Telecommunications_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..724b9121 Binary files /dev/null and b/sdcard/CVSFILES/Telecommunications_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Vitamin_Department_ENGLISH.C16 b/sdcard/CVSFILES/Vitamin_Department_ENGLISH.C16 new file mode 100644 index 00000000..9db8452a Binary files /dev/null and b/sdcard/CVSFILES/Vitamin_Department_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/Vitamin_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Vitamin_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..55cc5ba3 Binary files /dev/null and b/sdcard/CVSFILES/Vitamin_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/Womens_Health_Department_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/Womens_Health_Department_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..1c1283f0 Binary files /dev/null and b/sdcard/CVSFILES/Womens_Health_Department_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/the_Beauty_Counter_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/the_Beauty_Counter_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..70a2dbf5 Binary files /dev/null and b/sdcard/CVSFILES/the_Beauty_Counter_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/the_Fragrance_Case_ENGLISH.C16 b/sdcard/CVSFILES/the_Fragrance_Case_ENGLISH.C16 new file mode 100644 index 00000000..26d989d4 Binary files /dev/null and b/sdcard/CVSFILES/the_Fragrance_Case_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/the_Fragrance_Case_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/the_Fragrance_Case_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..77b1004c Binary files /dev/null and b/sdcard/CVSFILES/the_Fragrance_Case_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/the_Pharmacy_ENGLISH.C16 b/sdcard/CVSFILES/the_Pharmacy_ENGLISH.C16 new file mode 100644 index 00000000..b6edd4fe Binary files /dev/null and b/sdcard/CVSFILES/the_Pharmacy_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/the_Pharmacy_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/the_Pharmacy_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..21ec178e Binary files /dev/null and b/sdcard/CVSFILES/the_Pharmacy_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/CVSFILES/the_Photo_Lab_ENGLISH.C16 b/sdcard/CVSFILES/the_Photo_Lab_ENGLISH.C16 new file mode 100644 index 00000000..24018aed Binary files /dev/null and b/sdcard/CVSFILES/the_Photo_Lab_ENGLISH.C16 differ diff --git a/sdcard/CVSFILES/the_Photo_Lab_ENGLISH_SPANISH.C16 b/sdcard/CVSFILES/the_Photo_Lab_ENGLISH_SPANISH.C16 new file mode 100644 index 00000000..ab96bbce Binary files /dev/null and b/sdcard/CVSFILES/the_Photo_Lab_ENGLISH_SPANISH.C16 differ diff --git a/sdcard/FREQMAN/BE_AIRBAND.TXT b/sdcard/FREQMAN/BE_AIRBAND.TXT index 03c27586..63e1be8e 100644 --- a/sdcard/FREQMAN/BE_AIRBAND.TXT +++ b/sdcard/FREQMAN/BE_AIRBAND.TXT @@ -1,13 +1,13 @@ f=132475000,m=AM,bw=DSB 6k,d=ATIS - Civil f=130550000,m=AM,bw=DSB 6k,d=AbelagUnicom - Civil -f=118250000,m=AM,bw=DSB 6k,d=Approach- Civil +f=118250000,m=AM,bw=DSB 6k,d=Approach - Civil f=120100000,m=AM,bw=DSB 6k,d=Approach - Civil f=122500000,m=AM,bw=DSB 6k,d=Approach Military Crossing f=121950000,m=AM,bw=DSB 6k,d=Clearance Delivery - Civil f=126625000,m=AM,bw=DSB 6k,d=Departure - Civil f=127575000,m=AM,bw=DSB 6k,d=Final 25L - Civil f=129725000,m=AM,bw=DSB 6k,d=Final 25R - Civil -f=118050000,m=AM,bw=DSB 6k,d=Ground - Civik +f=118050000,m=AM,bw=DSB 6k,d=Ground - Civil f=121700000,m=AM,bw=DSB 6k,d=Ground - Civil f=121875000,m=AM,bw=DSB 6k,d=Ground - Civil f=118600000,m=AM,bw=DSB 6k,d=Tower VHF - Civil diff --git a/sdcard/OOKFILES/OOK_EXAMPLE.OOK b/sdcard/OOKFILES/OOK_EXAMPLE.OOK new file mode 100644 index 00000000..a667d1b4 --- /dev/null +++ b/sdcard/OOKFILES/OOK_EXAMPLE.OOK @@ -0,0 +1 @@ +27000000 1M 1076 4 100 01110111011101110101010101010101010101110111011101110101 diff --git a/sdcard/SPLASH/mayhem-default.bmp b/sdcard/SPLASH/mayhem-default.bmp index 31cb4e95..84e66d8d 100644 Binary files a/sdcard/SPLASH/mayhem-default.bmp and b/sdcard/SPLASH/mayhem-default.bmp differ diff --git a/sdcard/SPLASH/mayhem-mt.bmp b/sdcard/SPLASH/mayhem-mt.bmp index 9c95a23e..4977e9cc 100644 Binary files a/sdcard/SPLASH/mayhem-mt.bmp and b/sdcard/SPLASH/mayhem-mt.bmp differ diff --git a/sdcard/WAV/shopping_cart_lock.wav b/sdcard/WAV/shopping_cart_lock.wav new file mode 100644 index 00000000..2b3c5b73 Binary files /dev/null and b/sdcard/WAV/shopping_cart_lock.wav differ diff --git a/sdcard/WAV/shopping_cart_unlock.wav b/sdcard/WAV/shopping_cart_unlock.wav new file mode 100644 index 00000000..66cf4eab Binary files /dev/null and b/sdcard/WAV/shopping_cart_unlock.wav differ