OpenCores
URL https://opencores.org/ocsvn/openarty/openarty/trunk

Subversion Repositories openarty

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /openarty/trunk
    from Rev 33 to Rev 34
    Reverse comparison

Rev 33 → Rev 34

/bench/cpp/Makefile
37,18 → 37,23
##
 
CXX := g++
FLAGS := -Wall -Og -g
OBJDIR := obj-pc
RTLD := ../../rtl
VERILATOR_ROOT ?= $(shell bash -c 'verilator -V|grep VERILATOR_ROOT | head -1 | sed -e " s/^.*=\s*//"')
VROOT := $(VERILATOR_ROOT)
GFXFLAGS:= `pkg-config gtkmm-3.0 --cflags`
GFXLIBS := `pkg-config gtkmm-3.0 --cflags --libs`
FLAGS := -Wall -Og -g
INCS := -I$(RTLD)/obj_dir/ -I$(RTLD) -I$(VROOT)/include
SOURCES := eqspiflashsim.cpp eqspiflash_tb.cpp enetctrlsim.cpp \
SOURCES := fastmaster_tb.cpp eqspiflashsim.cpp eqspiflash_tb.cpp \
oledsim.cpp enetctrlsim.cpp \
memsim.cpp sdspisim.cpp uartsim.cpp ddrsdramsim.cpp
HEADERS := ddrsdramsim.h enetctrlsim.h eqspiflashsim.h memsim.h \
oledsim.h pipecmdr.h port.h sdspisim.h testb.h uartsim.h
VOBJDR := $(RTLD)/obj_dir
VLIB := $(VROOT)/include/verilated.cpp
SIMSRCS := enetctrlsim.cpp eqspiflashsim.cpp \
memsim.cpp sdspisim.cpp uartsim.cpp
memsim.cpp sdspisim.cpp uartsim.cpp oledsim.cpp
SIMOBJ := $(subst .cpp,.o,$(SIMSRCS))
SIMOBJS:= $(addprefix $(OBJDIR)/,$(SIMOBJ))
all: $(OBJDIR)/ busmaster_tb eqspiflash_tb enetctrl_tb
57,8 → 62,26
@bash -c "if [ ! -e $(OBJDIR) ]; then mkdir -p $(OBJDIR); fi"
 
$(OBJDIR)/%.o: %.cpp
$(CXX) $(FLAGS) -c $^ -o $@
$(CXX) $(FLAGS) -c $< -o $@
 
.PHONY: oledsim.o
oledsim.o: $(OBJDIR)/oledsim.o
$(OBJDIR)/oledsim.o: oledsim.cpp
$(CXX) $(FLAGS) $(GFXFLAGS) -c $< -o $@
 
# While busmaster_tb.o isnt really dependent upon fastmaster_tb.o, this
# makes certain that all of the dependencies of fastmaster_tb are captured
# in busmaster. Hence, if fastmaster_tb is remade/rebuilt because one of
# its dependencies change, so too is busmaster_tb.
#
$(OBJDIR)/busmaster_tb.o: fastmaster_tb.cpp
$(CXX) $(FLAGS) $(GFXFLAGS) $(INCS) -c $< -o $@
 
$(OBJDIR)/fastmaster_tb.o: fastmaster_tb.cpp
$(CXX) -DFASTCLK $(FLAGS) $(GFXFLAGS) $(INCS) -c $< -o $@
 
 
 
eqspiflash_tb: eqspiflash_tb.cpp $(OBJDIR)/eqspiflashsim.o $(VOBJDR)/Veqspiflash__ALL.a
$(CXX) $(FLAGS) $(INCS) $^ $(VOBJDR)/Veqspiflash__ALL.a $(VLIB) -o $@
 
65,15 → 88,37
enetctrl_tb: enetctrl_tb.cpp $(OBJDIR)/enetctrlsim.o $(VOBJDR)/Venetctrl__ALL.a
$(CXX) $(FLAGS) $(INCS) $^ $(VOBJDR)/Venetctrl__ALL.a $(VLIB) -o $@
 
fastmaster_tb:fastmaster_tb.cpp $(SIMOBJS) $(VOBJDR)/Vfastmaster__ALL.a
$(CXX) -DFASTCLK $(FLAGS) $(INCS) $^ $(VOBJDR)/Vfastmaster__ALL.a $(VLIB) -o $@
busmaster_tb:fastmaster_tb.cpp $(SIMOBJS) $(VOBJDR)/Vbusmaster__ALL.a
$(CXX) $(FLAGS) $(INCS) $^ $(VOBJDR)/Vbusmaster__ALL.a $(VLIB) -o $@
fastmaster_tb: $(OBJDIR)/fastmaster_tb.o $(SIMOBJS) $(VOBJDR)/Vfastmaster__ALL.a
$(CXX) $(GFXLIBS) $^ $(VOBJDR)/Vfastmaster__ALL.a $(VLIB) -o $@
busmaster_tb: $(OBJDIR)/busmaster_tb.o $(SIMOBJS) $(VOBJDR)/Vbusmaster__ALL.a
$(CXX) $(GFXLIBS) $(INCS) $^ $(VOBJDR)/Vbusmaster__ALL.a $(VLIB) $(GFXLIBS) -o $@
 
define build-depends
@echo "Building dependency file(s)"
@$(CXX) $(GFXFLAGS) $(INCS) -MM $(SOURCES) > $(OBJDIR)/xdepends.txt
@sed -e 's/^.*.o: /$(OBJDIR)\/&/' < $(OBJDIR)/xdepends.txt \
| sed -e 's/fastmaster_tb.o/busmaster_tb.o/g' \
> $(OBJDIR)/depends.txt
@rm $(OBJDIR)/xdepends.txt
endef
 
tags: $(SOURCES) $(HEADERS)
@echo "Generating tags"
@ctags $(SOURCES) $(HEADERS)
 
.PHONY: clean
clean:
rm -rf $(OBJDIR)/
rm -f ./eqspiflash_tb
rm -f ./enetctrl_tb
rm -f ./fastmaster_tb
rm -f ./busmaster_tb
 
.PHONY: depends
depends:
$(build-depends)
 
$(OBJDIR)/depends.txt: $(OBJDIR)/ $(SOURCES) $(HEADERS)
$(build-depends)
 
-include $(OBJDIR)/depends.txt
/bench/cpp/fastmaster_tb.cpp
63,6 → 63,9
#include "uartsim.h"
#include "enetctrlsim.h"
#include "memsim.h"
// #ifdef OLEDSIM
#include "oledsim.h"
// #endif
 
#include "port.h"
 
77,11 → 80,16
ENETCTRLSIM *m_mid;
UARTSIM m_uart;
MEMSIM m_ram;
#ifdef OLEDSIM_H
OLEDWIN m_oled;
#endif
 
unsigned m_last_led, m_last_pic, m_last_tx_state, m_net_ticks;
time_t m_start_time;
bool m_last_writeout, m_cpu_started;
int m_last_bus_owner, m_busy;
unsigned long m_gps_err, m_gps_step, m_gps_newstep;
unsigned m_gps_stepc;
 
TESTBENCH(void) : PIPECMDR(FPGAPORT),
m_uart(FPGAPORT+1), m_ram(1<<26)
89,6 → 97,9
m_start_time = time(NULL);
m_mid = new ENETCTRLSIM;
m_cpu_started =false;
#ifdef OLEDSIM_H
Glib::signal_idle().connect(sigc::mem_fun((*this),&TESTBENCH::on_tick));
#endif
}
 
void setsdcard(const char *fn) {
97,6 → 108,11
printf("LOADING SDCARD FROM: \'%s\'\n", fn);
}
 
bool on_tick(void) {
tick();
return true; // Keep going 'til the kingdom comes
}
 
void tick(void) {
if ((m_tickcount & ((1<<28)-1))==0) {
double ticks_per_second = m_tickcount;
109,6 → 125,12
}
 
// Set up the bus before any clock tick
#ifdef OLEDSIM_H
m_oled(m_core->o_oled_pmoden, m_core->o_oled_reset_n,
m_core->o_oled_vccen, m_core->o_oled_cs_n,
m_core->o_oled_sck, m_core->o_oled_dcn,
m_core->o_oled_mosi);
#endif
m_core->i_qspi_dat = m_flash(m_core->o_qspi_cs_n,
m_core->o_qspi_sck, m_core->o_qspi_dat);
 
159,6 → 181,8
#ifdef DEBUGGING_OUTPUT
bool writeout = false;
 
/*
// Ethernet triggers
if (m_core->o_net_tx_en)
writeout = true;
if (m_core->v__DOT__netctrl__DOT__n_rx_busy)
167,12 → 191,66
writeout = true;
if (m_core->v__DOT__netctrl__DOT__w_rxwr)
writeout = true;
*/
 
/*
// GPS Clock triggers
if (m_core->v__DOT__ppsck__DOT__tick)
writeout = true;
if (m_core->v__DOT__gps_step != m_gps_step) {
writeout = true;
// printf("STEP");
} if (m_core->v__DOT__gps_err != m_gps_err) {
writeout = true;
// printf("ERR");
} if (m_core->v__DOT__ppsck__DOT__step_correction != m_gps_stepc) {
writeout = true;
// printf("DSTP");
} if (m_core->v__DOT__ppsck__DOT__getnewstep__DOT__genblk2__DOT__genblk1__DOT__r_out != m_gps_newstep)
writeout = true;
*/
m_gps_step = m_core->v__DOT__gps_step;
m_gps_err = m_core->v__DOT__gps_err;
m_gps_stepc= m_core->v__DOT__ppsck__DOT__step_correction;
m_gps_newstep=m_core->v__DOT__ppsck__DOT__getnewstep__DOT__genblk2__DOT__genblk1__DOT__r_out;
 
if (m_core->o_oled_cs_n == 0)
writeout = true;
if (m_core->o_oled_sck == 0)
writeout = true;
if (m_core->v__DOT__rgbctrl__DOT__dev_wr)
writeout = true;
if (m_core->v__DOT__rgbctrl__DOT__r_busy)
writeout = true;
if (m_core->v__DOT__rgbctrl__DOT__dev_busy)
writeout = true;
 
 
/*
if (m_core->v__DOT__ppsck__DOT__err_tick)
writeout = true;
if (m_core->v__DOT__ppsck__DOT__sub_tick)
writeout = true;
if (m_core->v__DOT__ppsck__DOT__shift_tick)
writeout = true;
if (m_core->v__DOT__ppsck__DOT__fltr_tick)
writeout = true;
if (m_core->v__DOT__ppsck__DOT__config_tick)
writeout = true;
if (m_core->v__DOT__ppsck__DOT__mpy_sync)
writeout = true;
if (m_core->v__DOT__ppsck__DOT__mpy_sync_two)
writeout = true;
if (m_core->v__DOT__ppsck__DOT__delay_step_clk)
writeout = true;
*/
 
// if (m_core->v__DOT__wbu_cyc)
// writeout = true;
// if (m_core->v__DOT__dwb_cyc)
// writeout = true;
 
// Write out if the CPU is active at all
if (m_core->v__DOT__zippy__DOT__genblk11__DOT__thecpu__DOT__master_ce)
writeout = true;
if (m_core->v__DOT__zippy__DOT__genblk11__DOT__thecpu__DOT__dbgv)
396,6 → 474,8
}
*/
 
/*
// Network debugging
printf("ETH[TX:%s%s%x%s]",
(m_core->i_net_tx_clk)?"CK":" ",
(m_core->o_net_tx_en)?" ":"(",
463,6 → 543,8
(m_core->v__DOT__netctrl__DOT__rxmaci__DOT__r_p)&0x0ff,
m_core->v__DOT__netctrl__DOT__w_rxmacd,
(m_core->v__DOT__netctrl__DOT__w_rxmac)?"!":" ");
*/
 
/*
// Flash debugging support
printf("%s/%s %s %s[%s%s%s%s%s] %s@%08x[%08x/%08x] -- SPI %s%s[%x/%x](%d,%d)",
532,6 → 614,68
*/
 
 
/*
// Debugging the GPS tracking circuit
printf("COUNT %016lx STEP %016lx+%08x->%016lx ERR %016lx %s",
m_core->v__DOT__gps_now,
m_core->v__DOT__gps_step,
m_core->v__DOT__ppsck__DOT__step_correction,
m_core->v__DOT__ppsck__DOT__getnewstep__DOT__genblk2__DOT__genblk1__DOT__r_out,
m_core->v__DOT__gps_err,
(m_core->v__DOT__ppsck__DOT__tick)?"TICK":" ");
*/
 
 
// Debug the OLED
 
{ const char *pwr; int pwrk;
if (m_core->o_oled_pmoden) {
if (!m_core->o_oled_reset_n)
pwr = "RST";
else if (m_core->o_oled_vccen)
pwr = "ON ";
else
pwr = "VIO";
} else if (m_core->o_oled_vccen) {
pwr = "ERR";
} else
pwr = "OFF";
pwrk = (m_core->o_oled_reset_n)?4:0;
pwrk|= (m_core->o_oled_vccen)?2:0;
pwrk|= (m_core->o_oled_pmoden);
// First the top-level ports
printf(" OLED[%s/%d,%s%s%s-%d]",
pwr, pwrk,
(!m_core->o_oled_cs_n)?"CS":" ",
(m_core->o_oled_sck)?"CK":" ",
(m_core->o_oled_dcn)?"/D":"/C",
(m_core->o_oled_mosi));
}
// Now the low-level internals
printf("LL[");
switch(m_core->v__DOT__rgbctrl__DOT__lwlvl__DOT__state){
case 0: printf("I,"); break;
case 1: printf("S,"); break;
case 2: printf("B,"); break;
case 3: printf("R,"); break;
case 4: printf("!,"); break;
case 5: printf(".,"); break;
default: printf("U%d",
m_core->v__DOT__rgbctrl__DOT__lwlvl__DOT__state);
}
printf("%2d,%s%2d,%08x]",
m_core->v__DOT__rgbctrl__DOT__lwlvl__DOT__spi_len,
(m_core->v__DOT__rgbctrl__DOT__lwlvl__DOT__pre_last_counter)?"P":" ",
 
m_core->v__DOT__rgbctrl__DOT__lwlvl__DOT__counter,
m_core->v__DOT__rgbctrl__DOT__lwlvl__DOT__r_word);
printf("[%s%s%s/%2d/%d]",
(m_core->v__DOT__rgbctrl__DOT__dev_wr)?"W":" ",
(m_core->v__DOT__rgbctrl__DOT__r_busy)?"BSY":" ",
(m_core->v__DOT__rgbctrl__DOT__dev_busy)?"D-BSY":" ",
m_core->v__DOT__rgbctrl__DOT__r_len,
m_core->v__DOT__rgbctrl__DOT__dev_len);
 
printf("\n"); fflush(stdout);
} m_last_writeout = writeout;
#endif
547,6 → 691,9
}
 
int main(int argc, char **argv) {
#ifdef OLEDSIM_H
Gtk::Main main_instance(argc, argv);
#endif
Verilated::commandArgs(argc, argv);
tb = new TESTBENCH;
 
558,8 → 705,12
else
tb->setsdcard("/dev/zero");
 
#ifdef OLEDSIM_H
Gtk::Main::run(tb->m_oled);
#else
while(1)
tb->tick();
#endif
 
exit(0);
}
/bench/cpp/oledsim.cpp
0,0 → 1,531
////////////////////////////////////////////////////////////////////////////////
//
// Filename: oledsim.cpp
//
// Project: OpenArty, an entirely open SoC based upon the Arty platform
//
// Purpose: The goal of this module is very specifically to simulate the
// PModOLEDrgb using a GTKMM controlled window. I'm doing this on
// an Linux computer with X-Windows, although one GTKMM selling point is
// that it should work in Windows as well. I won't vouch for that, as I
// haven't tested under windows.
//
// Either way, this controller only implements *some* of the OLED commands.
// There were just too many commands for me to be able to write them in the
// short order that I needed to get a test up and running. Therefore, this
// simulator will validate all commands and assure you they are valid
// commands, but it will only respond to some. For specifics, see the
// do_command() section below.
//
// You may notice a lot of assert() calls within this code. This is half
// the purpose of the code: to verify that interactions, when the take
// place, are valid. The sad problem and effect of this is simply that
// when bugs are present, the error/warning messages are not that complete.
// If you find yourself dealing with such an error, please feel free to
// explain the assert better before asserting, and then send your
// contributions back to me so that others can benefit from your work.
// (Don't you love the GPL?)
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (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 MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
//
#include "oledsim.h"
 
const int OLEDSIM::OLED_HEIGHT = 64, OLEDSIM::OLED_WIDTH = 96;
 
const int MICROSECOND = 81,
tMINRESET = 3 * MICROSECOND, // 3 uS
tCYCLE = 13, // 150 * NANOSECOND, clock cycle time
tAS = 4, // 40 * NANOSECOND, address setup time
tAH = 4, // 40 * NANOSECOND, address hold time
tCSS = 7, // 75 * NANOSECOND, chip select setup
tCSH = 5, // 60 * NANOSECOND, chip select hold
tCLKL = 7, // 75 * NANOSECOND, time the clock must be low
tCLKH = 7; // 75 * NANOSECOND, time the clock must be high
 
void OLEDSIM::on_realize() {
Gtk::DrawingArea::on_realize();
 
// We'll be doing all of our drawing on an off-screen bit map. Here,
// let's allocate that pixel map ...
m_pix = Cairo::ImageSurface::create(Cairo::FORMAT_RGB24,
OLED_WIDTH, OLED_HEIGHT);
 
// and a graphics context to be used when drawing to it.
m_gc = Cairo::Context::create(m_pix);
 
// We'll start the pixel map filled with all black, as this is what
// my device looks like when I'm not doing anything with it.
m_gc->set_source_rgb(0.0,0.0,0.0); // Black
m_gc->rectangle(0, 0, OLED_WIDTH, OLED_HEIGHT);
m_gc->fill();
}
 
void OLEDSIM::get_preferred_width_vfunc(int &min, int &nw) const {
// GTKMM wants to know how big we want our window to be.
// Let's request a window twice as big as we need, but insist that
// it never be smaller than one pixel output per one pixel input.
//
min = OLED_WIDTH;
nw = OLED_WIDTH * 2;
}
 
void OLEDSIM::get_preferred_height_vfunc(int &min, int &nw) const {
//
// Same thing as above, but this time for height, not width.
//
min = OLED_HEIGHT;
nw = OLED_HEIGHT * 2;
}
 
void OLEDSIM::get_preferred_width_for_height_vfunc(int h, int &min, int &nw) const {
min = OLED_WIDTH;
int k = (h+(OLED_HEIGHT/2))/OLED_HEIGHT;
if (k <= 0)
k = 1;
nw = OLED_WIDTH * k;
}
 
void OLEDSIM::get_preferred_height_for_width_vfunc(int w, int &min, int &nw) const {
min = OLED_HEIGHT;
int k = (w+(OLED_WIDTH/2))/OLED_WIDTH;
if (k <= 0)
k = 1;
nw = OLED_HEIGHT * k;
}
 
/*
* This is our simulation function. This is the function that gets called at
* every tick of our controller within Verilator. At each tick (and not twice
* per tick), the outputs are gathered and sent our way. Here, we just decode
* the power and reset outputs, and send everything else to handle_io().
*/
void OLEDSIM::operator()(const int iopwr, const int rstn, const int dpwr,
const int csn, const int sck, const int dcn, const int mosi) {
if (!iopwr) {
if (m_state != OLED_OFF) {
m_state = OLED_OFF;
clear_to(0.0);
queue_draw_area(0,0,get_width(), get_height());
}
assert(!dpwr);
} else if (!rstn) {
if (m_state != OLED_RESET) {
m_state = OLED_RESET;
m_locked = true;
clear_to(0.1);
m_reset_clocks = 0;
queue_draw_area(0,0,get_width(), get_height());
} if (m_reset_clocks < tMINRESET)
m_reset_clocks++;
assert(csn);
assert(sck);
} else if (dpwr) {
if (m_state != OLED_POWERED) {
m_state = OLED_POWERED;
queue_draw_area(0,0,get_width(), get_height());
if (!csn) {
printf("OLED-ERR: CSN=%d, SCK=%d, DCN=%d, MOSI=%d, from %d,%d,%d\n",
csn, sck, dcn, mosi,
m_last_csn, m_last_sck, m_last_dcn);
}
assert(csn); // Can't power up with SPI active.
}
 
handle_io(csn, sck, dcn, mosi);
} else {
if (m_state != OLED_VIO) {
m_state = OLED_VIO;
queue_draw_area(0,0,OLED_WIDTH, OLED_HEIGHT);
}
handle_io(csn, sck, dcn, mosi);
}
}
 
/* handle_io()
*
* We only enter this function if the I/O is powered up and the device is out
* of reset. The device may (or may not) be on. Our purpose here is to decode
* the SPI commands into a byte sequence, kept in m_data with a length given by
* m_idx. Once a command has completed, we call do_command() to actually
* process the values received, the arguments, etc. and do something with them.
*
*/
void OLEDSIM::handle_io(const int csn, const int sck, const int dcn, const int mosi) {
if ((csn != m_last_csn)||(sck != m_last_sck)||(dcn != m_last_dcn))
printf("OLED: HANDLE-IO(%d,%d,%d,%d) @[%d]%d\n",
csn, sck, dcn, mosi, m_idx, m_bitpos);
if (csn) {
// CSN is high when the chip isn't selected.
if (!m_last_csn) {
// If the chip was just selected, it then means that our
// command just completed. Let's process it here.
printf("OLED: Ending a command\n");
assert(m_idx > 0);
assert((m_bitpos&7)==0);
do_command(m_last_dcn, m_idx, m_data);
 
m_bitpos = 0;
m_idx = 0;
for(int i=0; i<8; i++)
m_data[i] = 0;
assert(m_last_sck);
} if (!sck)
printf("OLED: CSN = %d, SCK = %d, DCN = %d, MOSI = %d, from %d, %d, %d\n",
csn, sck, dcn, mosi,
m_last_csn, m_last_sck, m_last_dcn);
assert(sck);
m_bitpos = 0;
m_idx = 0;
} else {
if (m_last_csn) {
assert((sck)&&(m_last_sck));
assert(m_last_sck);
printf("OLED: Starting a command\n");
}
 
/*
if (m_last_dcn != dcn) {
m_address_counts = 0;
} m_address_counts++;
*/
 
if ((sck)&&(!m_last_sck)) {
m_bitpos++;
m_data[m_idx] = (m_data[m_idx]<<1)|mosi;
printf("OLED: Accepted bit: m_data[%d] = %02x\n",
m_idx, m_data[m_idx]);
if (m_bitpos >= 8) {
m_idx++;
m_bitpos &= 7;
}
assert(m_idx < 3+4+4);
// assert(m_address_count > tCSS);
} else if ((!sck)&&(m_last_sck)) {
}
}
 
m_last_csn = csn;
m_last_sck = sck;
m_last_dcn = dcn;
}
 
void OLEDSIM::do_command(const int dcn, const int len, char *data) {
assert(len > 0);
assert(len <= 11);
 
printf("OLED: RECEIVED CMD(%02x) ", data[0]&0x0ff);
if (len > 1) {
printf(" - ");
for(int i=1; i<len-1; i++)
printf("%02x:", data[i]&0x0ff);
printf("%02x", data[len-1]&0x0ff);
printf("\n");
}
if (dcn) {
// Do something with the pixmap
double dr, dg, db;
 
if (m_format == OLED_65kCLR) {
int r, g, b;
assert(len == 2);
r = (data[0]>>3)&0x01f;
g = ((data[0]<<3)&0x038)|((data[1]>>5)&0x07);
b = ((data[1] )&0x01f);
 
dr = r / 31.0;
dg = g / 63.0;
db = b / 31.0;
} else {
printf("OLED: UNSUPPORTED COLOR FORMAT!\n");
dr = dg = db = 0.0;
} set_gddram(m_col, m_row, dr, dg, db);
if (!m_vaddr_inc) {
m_col++;
if (m_col > m_col_end) {
m_col = m_col_start;
m_row++;
if (m_row > m_row_end)
m_row = m_row_start;
}
} else {
m_row++;
if (m_row > m_row_end) {
m_row = m_row_start;
m_col++;
if (m_col > m_col_end)
m_col = m_col_start;
}
}
} else if (m_locked) {
if ((len == 2)&&((data[0]&0x0ff) == 0x0fd)&&(data[1] == 0x12)) {
m_locked = false;
printf("OLED: COMMANDS UNLOCKED\n");
} else {
printf("OLED: COMMAND IGNORED, IC LOCKED\n");
}
} else {
// Command word
switch((data[0])&0x0ff) {
case 0x15: // Setup column start and end address
assert(len == 3);
assert((data[1]&0x0ff) <= 95);
assert((data[2]&0x0ff) <= 95);
m_col_start = data[1]&0x0ff;
m_col_end = data[2]&0x0ff;
assert(m_col_end >= m_col_start);
m_col = m_col_start;
break;
case 0x75: // Setup row start and end address
assert(len == 3);
assert((data[1]&0x0ff) <= 63);
assert((data[2]&0x0ff) <= 63);
assert(m_row_end >= m_row_start);
m_row_start = data[1]&0x0ff;
m_row_end = data[2]&0x0ff;
break;
case 0x81: // Set constrast for all color "A" segment
assert(len == 2);
break;
case 0x82: // Set constrast for all color "B" segment
assert(len == 2);
break;
case 0x83: // Set constrast for all color "C" segment
assert(len == 2);
break;
case 0x87: // Set master current attenuation factor
assert(len == 2);
break;
case 0x8a: // Set second pre-charge speed, color A
assert(len == 2);
break;
case 0x8b: // Set second pre-charge speed, color B
assert(len == 2);
break;
case 0x8c: // Set second pre-charge speed, color C
assert(len == 2);
break;
case 0xa0: // Set driver remap and color depth
assert(len == 2);
m_vaddr_inc = (data[1]&1)?true:false;
// m_fliplr = (data[1]&2)?true:false;
if ((data[1] & 0x0c0)==0)
m_format = OLED_256CLR;
else if ((data[1] & 0x0c0)==0x40)
m_format = OLED_65kCLR;
// else if ((data[1] & 0x0c0)==0x80)
// m_format = OLED_65kCLRTWO;
break;
case 0xa1: // Set display start line register by row
assert(len == 2);
break;
case 0xa2: // Set vertical offset by com
assert(len == 2);
break;
case 0xa4: // Set display mode
case 0xa5: // Fallthrough
case 0xa6: // Fallthrough
case 0xa7: // Fallthrough
assert(len == 1);
break;
case 0xa8: // Set multiplex ratio
assert(len == 2);
break;
case 0xab: // Dim Mode setting
assert(len == 6);
break;
case 0xad:
assert(len == 2);
assert((data[1]&0x0fe)==0x08e);
break;
case 0xac:
case 0xae:
case 0xaf:
assert(len == 1);
break;
case 0xb0: // Power save mode
assert((len == 2)&&((data[1] == 0x1a)||(data[1] == 0x0b)));
break;
case 0xb1: // Phase 1 and 2 period adjustment
assert(len == 2);
break;
case 0xb3: // Displaky clock divider/oscillator frequency
assert(len == 2);
break;
case 0xb8: // Set gray scale table
assert(0 && "Gray scale table not implemented");
break;
case 0xb9: // Enable Linear Gray Scale table
assert(len == 1);
break;
case 0xbb: // Set pre-charge level
assert(len == 2);
break;
case 0xbc: // NOP
case 0xbd: // NOP
assert(len == 1);
case 0xbe: // Set V_COMH
assert(len == 2);
break;
case 0xe3: // NOP
assert(len == 1);
break;
case 0xfd: // Set command lock
assert(len == 2);
if (data[1] == 0x16) {
m_locked = true;
printf("OLED: COMMANDS NOW LOCKED\n");
}
break;
case 0x21: // Draw Line
assert(len == 8);
break;
case 0x22: // Draw Rectangle
assert(len == 11);
break;
case 0x23: // Copy
assert(len == 7);
break;
case 0x24: // Dim Window
assert(len == 5);
break;
case 0x25: // Clear Window
assert(len == 5);
break;
case 0x26: // Fill Enable/Disable
assert(len == 2);
// if (data[0]&1)
// m_drect_fills = 1;
assert((data[1] & 0x10)==0);
break;
case 0x27: // Continuous horizontal and vertical scrolling setup
assert(len == 6);
break;
case 0x2e: // Deactivate scrolling
assert(len == 1);
// m_scrolling = false;
break;
case 0x2f: // Activate scrolling
assert(len == 1);
// m_scrolling = true;
break;
default:
printf("OLED: UNKNOWN COMMAND, data[0] = %02x\n", data[0] & 0x0ff);
assert(0);
break;
}
}
}
 
/*
* set_gddram()
*
* Set graphics display DRAM.
*
* Here is the heart of drawing on the device, or at least pixel level drawing.
* The device allows other types of drawing, such as filling rectangles and
* such. Here, we just handle the setting of pixels.
*
* You'll note that updates to the drawing area are only queued if the device
* is in powered mode.
*
* At some point, I may wish to implement scrolling. If/when that happens,
* the GDDRAM will not be affected, but the area that needs to be redrawn will
* be. Hence this routine will need to be adjusted at that time.
*/
void OLEDSIM::set_gddram(const int col, const int row,
const double dr, const double dg, const double db) {
// Set our color to that given by the rgb (double) parameters.
m_gc->set_source_rgb(dr, dg, db);
 
printf("OLED: Setting pixel[%2d,%2d]\n", col, row);
int drow; // dcol;
drow = row + m_display_start_row;
if (drow >= OLED_HEIGHT)
drow -= OLED_HEIGHT;
m_gc->rectangle(col, row, 1, 1);
m_gc->fill();
 
if (m_state == OLED_POWERED) {
// Need to adjust the invalidated area if scrolling is taking
// place.
double kw, kh;
kw = get_width()/(double)OLED_WIDTH;
kh = get_height()/(double)OLED_HEIGHT;
queue_draw_area(col*kw, row*kh, (int)(kw+0.5), (int)(kh+0.5));
}
}
 
/*
* clear_to()
*
* Clears the simulated device to a known grayscale value. Examples are
* 0.0 for black, or 0.1 for a gray that is nearly black. Note that this
* call does *not* invalidate our window. Perhaps it should, but for now that
* is the responsibility of whatever function calls this function.
*/
void OLEDSIM::clear_to(double v) {
// How do we apply this to our pixmap?
m_gc->set_source_rgb(v, v, v);
m_gc->rectangle(0, 0, OLED_WIDTH, OLED_HEIGHT);
m_gc->fill();
}
 
bool OLEDSIM::on_draw(CONTEXT &gc) {
gc->save();
if (m_state == OLED_POWERED) {
// Scrolling will be implemented here
gc->set_source(m_pix, 0, 0);
gc->scale(get_width()/(double)OLED_WIDTH,
get_height()/(double)OLED_HEIGHT);
gc->paint();
} else {
if ((m_state == OLED_VIO)||(m_state == OLED_RESET))
gc->set_source_rgb(0.1,0.1,0.1); // DARK gray
else
gc->set_source_rgb(0.0,0.0,0.0); // Black
// gc->rectangle(0, 0, OLED_WIDTH, OLED_HEIGHT);
gc->rectangle(0, 0, get_width(), get_height());
gc->fill();
} gc->restore();
 
return true;
}
 
OLEDWIN::OLEDWIN(void) {
m_sim = new OLEDSIM();
m_sim->set_size_request(OLEDSIM::OLED_WIDTH, OLEDSIM::OLED_HEIGHT);
set_border_width(0);
add(*m_sim);
show_all();
Gtk::Window::set_title(Glib::ustring("OLED Simulator"));
}
 
/bench/cpp/oledsim.h
0,0 → 1,128
////////////////////////////////////////////////////////////////////////////////
//
// Filename: oledsim.h
//
// Project: OpenArty, an entirely open SoC based upon the Arty platform
//
// Purpose: To simulate the interaction between the OLED board and my
// logic. This simulator tries to read from the SPI generated
// by the logic, verify that the SPI interaction is valid, and then
// draws the OLED memory to the screen so you can see how the OLED
// would work ... even without having an OLED connected.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (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 MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
//
#ifndef OLEDSIM_H
#define OLEDSIM_H
 
#include <gtkmm.h>
#include <assert.h>
 
#define OLED_OFF 1
#define OLED_RESET 2
#define OLED_VIO 3
#define OLED_POWERED 4
#define OLED_65kCLR 0
#define OLED_256CLR 1
 
class OLEDSIM : public Gtk::DrawingArea {
public:
typedef Cairo::RefPtr<Cairo::Context> CAIROGC;
typedef const Cairo::RefPtr<Cairo::Context> CONTEXT;
typedef Cairo::RefPtr<Cairo::ImageSurface> CAIROIMG;
 
private:
CAIROIMG m_pix;
CAIROGC m_gc;
 
int m_state, m_reset_clocks; // , m_address_counts;
 
int m_last_csn, m_last_sck, m_last_dcn;
 
int m_idx, m_bitpos;
char m_data[16];
 
bool m_vaddr_inc, m_locked;
int m_format;
int m_col_start, m_col_end, m_col;
int m_row_start, m_row_end, m_row, m_display_start_row;
 
 
void do_command(const int dcn, const int len, char *data);
void handle_io(const int, const int, const int, const int);
void clear_to(const double v);
void set_gddram(const int, const int, const double, const double, const double);
public:
static const int OLED_HEIGHT, OLED_WIDTH;
 
OLEDSIM(void) : Gtk::DrawingArea() {
 
set_has_window(true);
Widget::set_can_focus(false);
set_size_request(OLED_WIDTH, OLED_HEIGHT);
 
m_state = OLED_OFF;
m_locked = true;
m_last_csn = 1;
m_last_sck = 1;
m_last_dcn = 1;
m_format = OLED_65kCLR;
m_display_start_row = 0;
m_vaddr_inc = false;
m_col = 0; m_row = 0;
m_col_start = 0; m_row_start = 0;
m_col_end = 95; m_row_end = 63;
}
 
void get_preferred_width_vfunc(int &min, int &nw) const;
void get_preferred_height_vfunc(int &min, int &nw) const;
void get_preferred_height_for_width_vfunc(int w, int &min, int &nw) const;
void get_preferred_width_for_height_vfunc(int h, int &min, int &nw) const;
 
virtual void on_realize();
virtual bool on_draw(CONTEXT &gc);
void operator()(const int iopwr, const int rstn, const int dpwr,
const int csn, const int sck, const int dcn, const int mosi);
};
 
class OLEDWIN : public Gtk::Window {
private:
OLEDSIM *m_sim;
 
public:
OLEDWIN(void);
~OLEDWIN(void) { delete m_sim; }
void operator()(int iopwr, int rstn, int dpwr,
int sck, int csn, int dcn, int mosi) {
(*m_sim)(iopwr, rstn, dpwr, sck, csn, dcn, mosi);
}
};
 
#endif
/bench/cpp/sdspisim.cpp
378,9 → 378,10
} m_block_buf[0] = 0x0fe;
m_blklen = 512; // (1<<m_csd[5]);
if (m_dev)
fread(&m_block_buf[1], m_blklen, 1, m_dev);
m_blklen = fread(&m_block_buf[1], m_blklen, 1, m_dev);
else
memset(&m_block_buf[1], 0, m_blklen);
m_blklen = (m_blklen != 512) ? 512 : m_blklen;
add_block_crc(m_blklen, m_block_buf);
 
m_blkdly = 60;
/bench/cpp/sdspisim.h
42,6 → 42,8
#ifndef SDSPISIM_H
#define SDSPISIM_H
 
#include <stdio.h>
 
typedef enum eRESET_STATES {
SDSPI_POWERUP_RESET,
SDSPI_CMD0_IDLE,
/rtl/bigadd.v
36,31 → 36,55
//
//
module bigadd(i_clk, i_sync, i_a, i_b, o_r, o_sync);
parameter NCLOCKS = 1;
input i_clk, i_sync;
input [63:0] i_a, i_b;
output reg [63:0] o_r;
output reg o_sync;
output wire [63:0] o_r;
output wire o_sync;
 
reg r_sync, r_pps;
reg [31:0] r_hi_a, r_hi_b, r_low;
generate
if (NCLOCKS == 0)
begin
assign o_sync= i_sync;
assign o_r = i_a + i_b;
end else if (NCLOCKS == 1)
begin
reg r_sync;
reg [63:0] r_out;
always @(posedge i_clk)
r_sync <= i_sync;
always @(posedge i_clk)
r_out <= i_a+i_b;
 
initial r_sync = 1'b0;
always @(posedge i_clk)
r_sync <= i_sync;
assign o_sync = r_sync;
assign o_r = r_out;
end else // if (NCLOCKS == 2)
begin
reg r_sync, r_pps;
reg [31:0] r_hi, r_low;
 
always @(posedge i_clk)
{ r_pps, r_low } <= i_a[31:0] + i_b[31:0];
always @(posedge i_clk)
r_hi_a <= i_a[63:32];
always @(posedge i_clk)
r_hi_b <= i_b[63:32];
reg f_sync;
reg [63:0] f_r;
 
initial o_sync = 1'b0;
always @(posedge i_clk)
o_sync <= r_sync;
always @(posedge i_clk)
o_r[31:0] <= r_low;
always @(posedge i_clk)
o_r[63:32] <= r_hi_a + r_hi_b + { 31'h00, r_pps };
initial r_sync = 1'b0;
always @(posedge i_clk)
r_sync <= i_sync;
 
always @(posedge i_clk)
{ r_pps, r_low } <= i_a[31:0] + i_b[31:0];
always @(posedge i_clk)
r_hi <= i_a[63:32] + i_b[63:32];
 
initial f_sync = 1'b0;
always @(posedge i_clk)
f_sync <= r_sync;
always @(posedge i_clk)
f_r[31:0] <= r_low;
always @(posedge i_clk)
f_r[63:32] <= r_hi + { 31'h00, r_pps };
 
assign o_sync = f_sync;
assign o_r = f_r;
end endgenerate
 
endmodule
/rtl/bigsmpy.v
4,8 → 4,16
//
// Project: OpenArty, an entirely open SoC based upon the Arty platform
//
// Purpose:
// Purpose: To multiply two 32-bit numbers into a 64-bit number. We try
// to use the hardware multiply to do this, but just what kind of
// hardware multiply is actually available ... can be used to determine
// how many clocks to take.
//
// If you look at the algorithm below, it's actually a series of a couple
// of independent algorithms dependent upon the parameter NCLOCKS. If your
// timing through here becomes a problem, set NCLOCKS to a higher number
// and see if that doesn't help things.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
36,7 → 44,7
//
//
module bigsmpy(i_clk, i_sync, i_sgn, i_a, i_b, o_r, o_sync);
parameter CLOCKS = 1;
parameter NCLOCKS = 1;
input i_clk, i_sync, i_sgn;
input [31:0] i_a, i_b;
output reg [63:0] o_r;
43,7 → 51,7
output reg o_sync;
 
generate
if (CLOCKS == 1)
if (NCLOCKS == 1)
begin
wire signed [31:0] w_sa, w_sb;
wire [31:0] w_ua, w_ub;
62,15 → 70,18
o_r <= w_ua * w_ub;
end
 
end else if (CLOCKS == 2)
end else if (NCLOCKS == 2)
begin
reg r_sync;
reg signed [31:0] r_sa, r_sb;
wire [31:0] w_ua, w_ub;
 
initial r_sync = 1'b0;
always @(posedge i_clk)
begin
r_sa = i_a;
r_sb = i_b;
r_sync <=i_sync;
r_sa <= i_a;
r_sb <= i_b;
end
 
assign w_ua = r_sa;
78,7 → 89,7
 
always @(posedge i_clk)
begin
o_sync <= i_sync;
o_sync <= r_sync;
if (i_sgn)
o_r <= r_sa * r_sb;
else
86,7 → 97,7
end
 
end else if (CLOCKS == 5)
end else if (NCLOCKS == 5)
begin
//
// A pipeline, shift register, to track our
/rtl/bigsub.v
4,8 → 4,15
//
// Project: OpenArty, an entirely open SoC based upon the Arty platform
//
// Purpose:
// Purpose: To subtract two 64-bit numbers, while maintaining
// synchronization to whatever purpose these numbers had
// originally. For this reason, there is an i_sync input and an o_sync
// output. If i_sync is true with a particular set of data, o_sync will
// then be true when that data is placed on the output.
//
// If we needed to slow this down even more, I suppose we could register
// the inputs before we used them ...
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
36,31 → 43,60
//
//
module bigsub(i_clk, i_sync, i_a, i_b, o_r, o_sync);
parameter NCLOCKS = 1;
input i_clk, i_sync;
input [63:0] i_a, i_b;
output reg [63:0] o_r;
output reg o_sync;
output wire [63:0] o_r;
output wire o_sync;
 
reg r_sync, r_pps;
reg [31:0] r_hi_a, r_hi_b, r_low;
generate
if (NCLOCKS == 0)
begin
assign o_sync= i_sync;
assign o_r = i_a - i_b;
end else if (NCLOCKS == 1)
begin
reg r_sync;
reg [63:0] r_out;
always @(posedge i_clk)
r_sync <= i_sync;
always @(posedge i_clk)
r_out <= i_a - i_b;
 
initial r_sync = 1'b0;
always @(posedge i_clk)
r_sync <= i_sync;
assign o_sync = r_sync;
assign o_r = r_out;
end else // if (NCLOCKS == 2)
begin
reg r_sync, r_pps;
reg [31:0] r_hi, r_low;
 
always @(posedge i_clk)
{ r_pps, r_low } <= i_a[31:0] + ({1'b1,~i_b[31:0]}) + 1'b1;
always @(posedge i_clk)
r_hi_a <= i_a[63:32];
always @(posedge i_clk)
r_hi_b <= ~i_b[63:32];
reg [63:0] f_r;
reg f_sync;
 
initial o_sync = 1'b0;
always @(posedge i_clk)
o_sync <= r_sync;
always @(posedge i_clk)
o_r[31:0] <= r_low;
always @(posedge i_clk)
o_r[63:32] <= r_hi_a + r_hi_b + { 31'h00, r_pps };
wire [63:0] i_b_n;
assign i_b_n = ~i_b;
 
initial r_sync = 1'b0;
always @(posedge i_clk)
r_sync <= i_sync;
 
always @(posedge i_clk)
{ r_pps, r_low } <= i_a[31:0] + i_b_n[31:0] + 1'b1;
always @(posedge i_clk)
r_hi <= i_a[63:32] + i_b_n[63:32];
 
initial f_sync = 1'b0;
always @(posedge i_clk)
f_sync <= r_sync;
always @(posedge i_clk)
f_r[31:0] <= r_low;
always @(posedge i_clk)
f_r[63:32] <= r_hi + { 31'h00, r_pps };
 
assign o_sync = f_sync;
assign o_r = f_r;
 
end endgenerate
 
endmodule
 
/rtl/builddate.v
38,4 → 38,4
////////////////////////////////////////////////////////////////////////////////
//
//
`define DATESTAMP 32'h20161018
`define DATESTAMP 32'h20161024
/rtl/busmaster.v
50,6 → 50,9
`define FLASH_ACCESS
`define SDRAM_ACCESS
`define GPS_CLOCK
`ifdef VERILATOR
`define GPSTB
`endif
// UART_ACCESS and GPS_UART have both been placed within fastio
// `define UART_ACCESS
// `define GPS_UART
656,8 → 659,8
wire [3:0] w_led;
wire rtc_ppd;
fastio #(
.AUXUART_SETUP(30'hd705), // 115200 Baud, 8N1, from 81.25M
.GPSUART_SETUP(30'hd8464), // 9600 Baud, 8N1
.AUXUART_SETUP(30'd705), // 115200 Baud, 8N1, from 81.25M
.GPSUART_SETUP(30'd8464), // 9600 Baud, 8N1
.EXTRACLOCK(0)
) runio(i_clk, i_sw, i_btn,
w_led, o_clr_led0, o_clr_led1, o_clr_led2, o_clr_led3,
665,7 → 668,7
wb_cyc, (io_sel)&&(wb_stb), wb_we, wb_addr[4:0],
wb_data, io_ack, io_stall, io_data,
rtc_ppd,
bus_err_addr, master_ints, w_interrupt,
bus_err_addr, gps_now[63:32], gps_step[47:16], master_ints, w_interrupt,
board_ints);
assign { gpio_int, auxrx_int, auxtx_int, gpsrx_int, sw_int, btn_int } = board_ints;
 
/rtl/enetctrl.v
49,7 → 49,8
o_wb_ack, o_wb_stall, o_wb_data,
o_mdclk, o_mdio, i_mdio, o_mdwe,
o_debug);
parameter CLKBITS=3; // = 3 for 200MHz source clock, 2 for 100 MHz
parameter CLKBITS=3, // = 3 for 200MHz source clock, 2 for 100 MHz
PHYADDR = 5'h01;
input i_clk, i_rst;
input i_wb_cyc, i_wb_stb, i_wb_we;
input [4:0] i_wb_addr;
63,9 → 64,7
//
output wire [31:0] o_debug;
//
parameter PHYADDR = 5'h01;
 
 
reg read_pending, write_pending;
reg [4:0] r_addr;
reg [15:0] read_reg, write_reg, r_data;
/rtl/fastio.v
43,15 → 43,18
o_clr_led0, o_clr_led1, o_clr_led2, o_clr_led3,
// Board level PMod I/O
i_aux_rx, o_aux_tx, o_aux_cts, i_gps_rx, o_gps_tx,
// i_gpio, o_gpio,
`ifdef USE_GPIO
i_gpio, o_gpio,
`endif
// Wishbone control
i_wb_cyc, i_wb_stb, i_wb_we, i_wb_addr,
i_wb_data, o_wb_ack, o_wb_stall, o_wb_data,
// Cross-board I/O
i_rtc_ppd, i_buserr, i_other_ints, o_bus_int, o_board_ints);
i_rtc_ppd, i_buserr, i_gps_now, i_gps_step, i_other_ints, o_bus_int, o_board_ints);
parameter AUXUART_SETUP = 30'd1736, // 115200 baud from 200MHz clk
GPSUART_SETUP = 30'd20833, // 9600 baud from 200MHz clk
EXTRACLOCK = 1; // Do we need an extra clock to process?
EXTRACLOCK = 1, // Do we need an extra clock to process?
NGPI=0, NGPO=0; // Number of GPIO in and out wires
input i_clk;
// Board level I/O
input [3:0] i_sw;
71,9 → 74,11
input i_gps_rx;
output wire o_gps_tx;
//
`ifdef USE_GPIO
// GPIO
// input [(NGPI-1):0] i_gpio;
// output reg [(NGPO-1):0] o_gpio;
input [(NGPI-1):0] i_gpio;
output reg [(NGPO-1):0] o_gpio;
`endif
//
// Wishbone inputs
input i_wb_cyc, i_wb_stb, i_wb_we;
87,6 → 92,8
input i_rtc_ppd;
// Address of the last bus error
input [31:0] i_buserr;
// The current time, as produced by the GPS tracking processor
input [31:0] i_gps_now, i_gps_step;
//
// Interrupts -- both the output bus interrupt, as well as those
// internally generated interrupts which may be used elsewhere
151,7 → 158,10
reg [31:0] pwr_counter;
initial pwr_counter = 32'h00;
always @(posedge i_clk)
pwr_counter <= pwr_counter+32'h001;
if (pwr_counter[31])
pwr_counter[30:0] <= pwr_counter[30:0] + 31'h001;
else
pwr_counter[31:0] <= pwr_counter[31:0] + 31'h001;
 
//
// BTNSW
207,7 → 217,15
// when any of the inputs changes. (Sorry, which input isn't (yet)
// selectable.)
//
wire [31:0] gpio_data;
`ifdef USE_GPIO
wbgpio #(NIN, NOUT)
gpioi(i_clk, w_wb_cyc, (w_wb_stb)&&(w_wb_addr == 5'hd), 1'b1,
w_wb_data, gpio_data, i_gpio, o_gpio, gpio_int);
`else
assign gpio_data = 32'h00;
assign gpio_int = 1'b0;
`endif
 
//
// AUX (UART) SETUP
416,7 → 434,7
end
always @(posedge i_clk)
if(((i_wb_stb)&&(~i_wb_we)&&(i_wb_addr == 5'h10))||(gpsrx_stb))
r_gpsrx_data[8] <= gpsrx_stb;
r_gpsrx_data[8] <= !gpsrx_stb;
assign gpsrx_data = { 20'h00, r_gpsrx_data };
assign gpsrx_int = r_gpsrx_data[8];
 
459,11 → 477,13
5'h0a: o_wb_data <= w_clr_led2;
5'h0b: o_wb_data <= w_clr_led3;
5'h0c: o_wb_data <= date_data;
// 5'h0d: o_wb_data <= gpio_data;
5'h0d: o_wb_data <= gpio_data;
5'h0e: o_wb_data <= auxrx_data;
5'h0f: o_wb_data <= auxtx_data;
5'h10: o_wb_data <= gpsrx_data;
5'h11: o_wb_data <= gpstx_data;
5'h12: o_wb_data <= i_gps_now;
5'h13: o_wb_data <= i_gps_step;
// 5'hf: UART_SETUP
// 4'h6: GPIO
// ?? : GPS-UARTRX
/rtl/gpsclock.v
98,6 → 98,10
//
//
////////////////////////////////////////////////////////////////////////////////
//
//
// `define DEBUG
//
module gpsclock(i_clk, i_rst, i_pps, o_pps, o_led,
i_wb_cyc_stb, i_wb_we, i_wb_addr, i_wb_data,
o_wb_ack, o_wb_stall, o_wb_data,
149,7 → 153,8
// our data is valid during those handful.
//
// Timing
reg err_tick, mpy_aux, mpy_sync_two, delay_step_clk;
reg err_tick, shift_tick, config_tick, mpy_aux, mpy_sync_two,
delay_step_clk, step_carry_tick;
wire sub_tick, fltr_tick;
 
//
162,7 → 167,10
// an earlier clock.
//
// Tracking
reg [(RW-1):0] count_correction, pre_count_correction;
reg config_filter_errors;
reg [(RW-1):0] pre_count_correction, r_count_correction,
r_filtered_err;
wire [(RW-1):0] count_correction;
reg [(HRW-1):0] step_correction;
reg [(HRW-1):0] delayed_step_correction, delayed_step;
reg signed [(HRW-1):0] mpy_input;
178,8 → 186,12
//
//
//
// DEFAULT_STEP = 64'h0000_0034_dc73_67da, // 2^64 / 100 MHz
// 28'h34d_c736 << 8, and hence we have 32'h834d_c736
// DEFAULT_STEP = 64'h0000_0034_dc73_67da, // 2^64 / 81.25 MHz
// = 28'hd371cd9 << (20-10), and hence we have 32'had37_1cd9
// Other useful values:
// 32'had6bf94d // 80MHz
// 32'haabcc771 // 100MHz
// 32'hbd669d0e // 160.5MHz
initial r_def_step = DEFAULT_STEP;
always @(posedge i_clk)
pre_step <= { 16'h00,
191,6 → 203,8
reg wb_write;
reg [1:0] r_wb_addr;
reg [31:0] r_wb_data;
reg [7:0] lost_ticks;
initial lost_ticks = 0;
always @(posedge i_clk)
wb_write <= (i_wb_cyc_stb)&&(i_wb_we);
always @(posedge i_clk)
200,13 → 214,20
assign wb_data = r_wb_data;
assign wb_addr = r_wb_addr;
 
initial config_filter_errors = 1'b1;
initial r_alpha = 6'h2;
initial r_beta = 32'h14bda12f;
initial r_gamma = 32'h1f533ae8;
initial new_config = 1'b0;
always @(posedge i_clk)
if (wb_write)
begin
new_config = 1'b1;
new_config <= 1'b1;
case(wb_addr)
2'b00: r_alpha <= wb_data[5:0];
2'b00: begin
r_alpha <= wb_data[5:0];
config_filter_errors <= (wb_data[5:0] != 6'h0);
end
2'b01: r_beta <= wb_data;
2'b10: r_gamma <= wb_data;
2'b11: r_def_step <= wb_data;
214,10 → 235,10
// r_defstep <= i_wb_data;
endcase
end else
new_config = 1'b0;
new_config <= 1'b0;
always @(posedge i_clk)
case (i_wb_addr)
2'b00: o_wb_data <= { 26'h00, r_alpha };
2'b00: o_wb_data <= { lost_ticks, 18'h00, r_alpha };
2'b01: o_wb_data <= r_beta;
2'b10: o_wb_data <= r_gamma;
2'b11: o_wb_data <= r_def_step;
241,7 → 262,7
//
//
always @(posedge i_clk)
begin
begin // This will delay our resulting time by a known 2 clock ticks
pps_d <= i_pps;
ck_pps <= pps_d;
lst_pps <= ck_pps;
248,25 → 269,41
end
 
// Provide a touch of debounce protection ... equal to about
// one quarter of a second.
reg [(RW-3):0] tick_enable_counter;
wire [(RW-1):0] w_tick_enable_sum;
wire w_tick_enable, w_tick_enable_unused;
bigadd enabler(i_clk, 1'b0, o_step, { 2'b0, tick_enable_counter },
w_tick_enable_sum, w_tick_enable_unused);
// one quarter of a second. This is a coarse predictor, however,
// since it uses only the top 32-bits of the step.
//
// Here's the idea: on any tick, we start a 32-bit counter, stepping
// unevenly by o_step[61:30] at each tick. Once the counter crosses
// zero, we stop counting and we enable the clock tick. Since the
// counter should overflow 4x per second (assuming our clock rate is
// less than 16GHz), we should be good to go. Oh, and we also round
// our step up by one ... to guarantee that we always end earlier than
// designed, rather than ever later.
//
wire w_tick_enable;
reg [31:0] tick_enable_counter;
reg tick_enable_carry;
initial tick_enable_carry = 0;
initial tick_enable_counter = 0;
always @(posedge i_clk)
begin
if (tick)
tick_enable_counter <= 0;
else if (|w_tick_enable_sum[(RW-1):(RW-2)])
tick_enable_counter <= {(RW-2){1'b1}};
if ((ck_pps)&&(~lst_pps))
{ tick_enable_carry, tick_enable_counter } <= 0;
else if (tick_enable_carry)
tick_enable_counter <= 32'hffff_ffff;
else
tick_enable_counter <= w_tick_enable_sum[(RW-3):0];
{tick_enable_carry, tick_enable_counter}
<= o_step[(RW-3):(RW-34)]
+ tick_enable_counter + 1'b1;
end
assign w_tick_enable = tick_enable_counter[(RW-3)];
assign w_tick_enable = tick_enable_carry;
 
assign tick= (ck_pps)&&(~lst_pps)&&(w_tick_enable);
always @(posedge i_clk)
if (wb_write)
lost_ticks <= 8'h00;
else if ((ck_pps)&&(~lst_pps)&&(!w_tick_enable))
lost_ticks <= lost_ticks+1'b1;
assign o_dbg[0] = tick;
assign o_dbg[1] = w_tick_enable;
 
277,17 → 314,53
// of the second if we are in tracking mode. The 'o_pps' signal is
// generated from the carry/overflow of the o_count addition.
//
// The output of this loop, both o_pps and o_count, is the current
// subsecond time as determined by this clock.
//
//
reg cnt_carry;
reg [31:0] p_count;
initial o_count = 0;
initial o_pps = 1'b0;
always @(posedge i_clk)
`ifndef USE_THE_OLD_CODE
begin
// Very simple: we add the count correction, which is given by
// a pre-determined sum of the step and any error, to our
// "count" at every clock tick. If this ever overflows, the
// overflow or carry is our PPS signal. Unlike the last time
// we built this logic, here we acknowledge that the count
// correction can never be negative. As a result, we have no
// o_pps suppression.
{ cnt_carry, p_count } <= p_count[31:0] + r_count_correction[31:0];
{ o_pps, o_count[63:32] } <= o_count[63:32]
+ r_count_correction[63:32]
+ { 31'h00, cnt_carry };
if (r_count_correction[(RW-1)])
o_pps <= 1'b0;
// Delay the bottom bits of o_count by one clock, so that they
// now match up with the top bits.
o_count[31:0] <= p_count;
end
`else
if ((o_tracking)&&(tick))
begin
{ cnt_carry, p_count } <= p_count[31:0] + count_correction[31:0];
// Save the carry to be applied at the next clock, so
// that we never have to do more than a 32-bit add.
// (well, okay, a 33-bit add ...)
//
// The count_correction value here is really our step,
// plus a value determined from our filter loop.
{ cnt_carry, p_count }
<= p_count[31:0] + count_correction[31:0];
//
// On the second clock, we add the high order bits
// together, and possibly get a carry. We use this
// carry as our o_pps output.
if (~count_correction[(RW-1)])
begin
// Here, we need to correct by jumping forward.
//
// Note that we don't create an o_pps just
// because the gps_pps states that there should
// be one. Instead, we hold to the normal
294,14 → 367,19
// means of business. At the tick, however,
// we add both the step and the correction to
// the current count.
{ o_pps, o_count[63:32] } <= o_count[63:32] +count_correction[63:32]+ { 31'h00, cnt_carry };
{ o_pps, o_count[63:32] } <= o_count[63:32]
+ count_correction[63:32]
+ { 31'h00, cnt_carry };
end else begin
// If the count correction is negative, it means
// we need to go backwards. In this case,
// there shouldn't be any o_pps, least we get
// two of them.
// two of them. So ... we skip an output PPS,
// knowing the correct PPS is coming next.
o_pps <= 1'b0;
o_count[63:32] <= o_count[63:32] + count_correction[63:32];
o_count[63:32] <= o_count[63:32]
+ count_correction[63:32]
+ { 31'h00, cnt_carry };
end
end else begin
// The difference between count_correction and
310,15 → 388,44
// correction. Likewise, even if we are, we only
// want to use it on the ticks.
{ cnt_carry, p_count } <= p_count + o_step[31:0];
{ o_pps, o_count[63:32] } <= o_count[63:32] + o_step[63:32];
{ o_pps, o_count[63:32] } <= o_count[63:32]
+ o_step[63:32]
+ { 31'h00, cnt_carry};
end
 
// Here we delay the bottom bits of o_count by one clock, so that they
// now match up with the top bits.
always @(posedge i_clk)
o_count[31:0] <= p_count;
`endif
 
 
 
//
// The step
//
// The counter above is only as good as the step size given to it.
// Here, we work with that step size, and apply a correction based
// upon the last tick. The idea in the step correction is that we
// wish to add this step correction to our step amount. We have one
// clock tick (i.e. one second) from when we make our error measurement
// until we must apply the correction.
//
// The correction, calculated far below, will be placed into the value
//
// step_correction
//
// We just need to figure out what the new step will be here, given
// that correction.
//
reg [(HRW):0] step_correction_plus_carry;
always @(posedge i_clk)
step_correction_plus_carry = step_correction + { 31'h00, delayed_carry };
if (step_carry_tick)
step_correction_plus_carry
<= { step_correction[(HRW-1)],step_correction }
+ { 32'h00, delayed_carry };
 
 
wire w_step_correct_unused;
wire [(RW-1):0] new_step;
bigadd getnewstep(i_clk, 1'b0, o_step,
328,17 → 435,23
 
reg delayed_carry;
initial delayed_carry = 0;
initial o_step = 64'h002af31dc461;
 
wire [31:0] initial_default_step = DEFAULT_STEP;
// initial o_step = 64'h002af31dc461; // 100MHz
initial o_step = { 16'h00, (({ initial_default_step[27:0], 20'h00 })
>> initial_default_step[31:28])};
always @(posedge i_clk)
if ((i_rst)||(dly_config))
o_step <= pre_step;
`ifndef DEBUG
else if ((o_tracking) && (tick))
o_step <= new_step;
o_step <= new_step;
`endif
 
initial delayed_step = 0;
always @(posedge i_clk)
if ((i_rst)||(dly_config))
delayed_step <= 0;
{ delayed_carry, delayed_step } <= 0;
else if (delay_step_clk)
{ delayed_carry, delayed_step } <= delayed_step
+ delayed_step_correction;
360,15 → 473,44
// and is near zero, the o_err is then the negation of this when the
// tick does show up.
//
 
// Note that our measured error, o_err, will be valid one tick *after*
// the top of the second tick (tick).
//
// ONE_SECOND in this equation is set to 2^64, or zero during
// implementation. This makes the 64-bit subtract ... doable.
initial o_err = 0;
always @(posedge i_clk)
if (tick)
o_err <= ONE_SECOND - o_count;
 
// Because o_err is delayed one clock from the tick, we create a strobe
// capturing when the error is valid.
initial err_tick = 1'b0;
always @(posedge i_clk)
err_tick <= tick;
 
//
// We are now going to filter this error, via:
//
// filtered_err <= o_err>>r_alpha + (1-1>>r_alpha)*filtered_err
//
// This implements a very simple recursive averager.
//
// You may not recognize it below, though, since we have simplified the
// equation into:
//
// filtered_err <= filtered_err + (o_err - filtered_err)>>r_alpha
//
 
// On some architectures, adding and subtracting 64'bit number cannot
// be done in a single clock tick. On these architectures, we may
// take a couple clocks. Here, the "bigsub" module captures what it
// takes to subtract 64-bit numbers.
//
// Either way, here we subtract our error from our filtered_err. This
// is the first step of the recursive average--figuring out what value
// we are going to apply to the recursive average.
bigsub suberri(i_clk, err_tick, o_err,
filtered_err, filter_sub_count, sub_tick);
 
378,67 → 520,148
// Why is because Verilator decides that these values are unsigned,
// and so despite being told that they are signed values, verilator
// doesn't sign extend them upon shifting. Put together,
// { shift_hi[low-bits], shift_lo[low-bits] } make up a full RW
// { shift_hi[low-bits], shift_lo[low-bits] } make up a full RW (i.e.64)
// bit correction factor.
reg signed [(RW-1):0] shift_hi, shift_lo;
always @(posedge i_clk)
begin
shift_hi <= { {(HRW){filter_sub_count[(RW-1)]}},
shift_tick<= sub_tick;
 
// Because we do our add (below) on *every* clock tick, we must
// make certain that the value we add to it is only non-zero
// on one clock tick. Hence, we wait for sub_tick to be true,
// set the value, and otherwise keep it clear.
if (sub_tick)
begin
shift_hi <= { {(HRW){filter_sub_count[(RW-1)]}},
filter_sub_count[(RW-1):HRW] }>>r_alpha;
shift_lo <= filter_sub_count[(RW-1):0]>>r_alpha;
shift_lo <= filter_sub_count[(RW-1):0]>>r_alpha;
end else begin
shift_hi <= 0;
shift_lo <= 0;
end
end
 
bigadd adderr(i_clk, sub_tick, filtered_err,
// You may notice, it's now been several clocks since the top of the
// second. Still, filtered_err hasn't changed. It only changes once
// a second based upon the results of these computations. Here we take
// another clock (or two) to figure out the next step in our algorithm.
bigadd adderr(i_clk, shift_tick, r_filtered_err,
{ shift_hi[(HRW-1):0], shift_lo[(HRW-1):0] },
filtered_err, fltr_tick);
/*
 
always @(posedge i_clk)
if ((o_tracking)&&(sub_tick))
filtered_err<= filtered_err
+ { shift_hi[(HRW-1):0], shift_lo[(HRW-1):0] };
*/
if (fltr_tick)
r_filtered_err <= filtered_err;
else if ((dly_config)||(!o_tracking))
r_filtered_err <= 0;
 
reg [(RW-1):0] r_mpy_err;
always @(posedge i_clk)
if (fltr_tick)
if (err_tick)
r_mpy_err <= (config_filter_errors) ? r_filtered_err : o_err;
always @(posedge i_clk)
config_tick <= err_tick;
 
// Okay, so we've gone from our original tick to the err_tick, the
// sub_tick, the shift_tick, and now the fltr_tick.
//
// We want to multiply our filtered error by one of two constants.
// Here, we set up those constants. We use the fltr_tick as a strobe,
// but also to select one particular constant. When the multiply comes
// back, and the strobe is true, we'll know that the constant going
// in with the strobe on (r_beta) corresponds to the product coming out,
// and that the second product we need will be on the next clock.
always @(posedge i_clk)
if (err_tick)
mpy_input <= r_beta;
else
mpy_input <= r_gamma;
always @(posedge i_clk)
mpy_aux <= fltr_tick;
mpy_aux <= err_tick;
 
//
// The multiply
//
// Remember, we take our filtered error and multiply it by a constant
// to determine our step correction and another constant to determine
// our count correction? We'll ... here's that multiply.
//
wire mpy_sync;
wire [(RW-1):0] mpy_out;
initial mpy_sync_two = 1'b0;
// Sign extend all inputs to RW bits
wire signed [(RW-1):0] w_mpy_input, w_mpy_err;
assign w_mpy_input = { {(RW-DW){mpy_input[(DW-1)]}}, mpy_input[(DW-1):0]};
assign w_mpy_err = { {(RW-NPW){filtered_err[(RW-1)]}}, filtered_err[(RW-1):(RW-NPW)]};
bigsmpy mpyi(i_clk, mpy_aux, 1'b1, w_mpy_input[31:0], w_mpy_err[31:0],
mpy_out, mpy_sync);
assign w_mpy_input = { {(RW-DW){mpy_input[(DW-1)]}},
mpy_input[(DW-1):0]};
assign w_mpy_err = { {(RW-NPW){r_mpy_err[(RW-1)]}},
r_mpy_err[(RW-1):(RW-NPW)]};
//
// Here's our big multiply.
//
bigsmpy #(.NCLOCKS(1))
mpyi(i_clk, mpy_aux, 1'b1, w_mpy_input[31:0], w_mpy_err[31:0],
w_mpy_out, mpy_sync);
 
// We use this to grab the second product from the multiply. This
// second product is true the clock after mpy_sync is high, so we
// just do a simple delay to get this strobe logic.
always @(posedge i_clk)
mpy_sync_two <= mpy_sync;
assign w_mpy_out = mpy_out;
 
 
// The post-multiply
//
// Remember, the mpy_sync line coming out of the multiply will be true
// when the product of the error and i_beta comes out.
//
initial pre_count_correction = 0;
initial step_correction = 0;
initial delayed_step_correction = 0;
always @(posedge i_clk)
if (mpy_sync)
if (mpy_sync) // i_beta product
pre_count_correction <= w_mpy_out;
else if (mpy_sync_two) begin
always @(posedge i_clk)
if (mpy_sync_two) begin // i_gamma product
step_correction <= w_mpy_out[(RW-1):HRW];
delayed_step_correction <= w_mpy_out[(HRW-1):0];
end
 
`ifdef DEBUG
assign count_correction = o_step;
`else
// The correction for the number of counts in our counter is given
// by pre_count_correction. When we add this to the counter, we'll
// need to add the step to it as well. To help timing out with 64-bit
// math, let's do that step+correction math here, so that we can later
// do
// counts = counts + count_correction
// instead of
// counts = counts + step + pre_count_correction
// saves us one addition--especially since we have the clock to do this.
wire count_correction_strobe;
bigadd ccounts(i_clk, mpy_sync_two, o_step, pre_count_correction,
count_correction, count_correction_strobe);
 
// Our original plan was to apply this correction at the top of the
// second. The problem is that our loop filter math depends upon this
// correction being applied before the top of the second error gets
// measured. Hence, we'll apply it at some time mid-second, not
// long after the error is measured (w/in 16 clocks or so), and never
// notice the difference until the top of the next second where it
// now appears to have properly taken place.
always @(posedge i_clk)
count_correction <= pre_count_correction + o_step;
if (count_correction_strobe)
r_count_correction <= count_correction;
else
r_count_correction <= o_step;
`endif
 
initial delay_step_clk = 1'b0;
always @(posedge i_clk)
delay_step_clk <= mpy_sync_two;
initial step_carry_tick = 1'b0;
always @(posedge i_clk)
step_carry_tick <= delay_step_clk;
 
//
//
496,7 → 719,9
count_valid_ticks <= 3'h0;
initial o_tracking = 1'b0;
always @(posedge i_clk)
if ((tick)&&(&count_valid_ticks))
if (dly_config) // Break the tracking loop on a config change
o_tracking <= 1'b0;
else if ((tick)&&(&count_valid_ticks))
o_tracking <= 1'b1;
else if ((tick)||(count_valid_ticks == 0))
o_tracking <= 1'b0;
/rtl/gpsclock_tb.v
66,6 → 66,8
//
//
//
initial r_jump = 0;
initial r_maxcount = 32'd81200000;
always @(posedge i_clk)
if ((i_wb_cyc_stb)&&(i_wb_we))
begin
/rtl/lloled.v
4,8 → 4,27
//
// Project: OpenArty, an entirely open SoC based upon the Arty platform
//
// Purpose:
// Purpose: This is a low-level SPI output (not input) controller
// designed to command interactions between an upper level
// controller and a PModOLEDrgb. As a result, this is a one-bit
// (traditional, not quad) SPI controller, it has no MISO input bits,
// and it also controls a DCN bits (output data at active high, vs
// output control at active low).
//
// This particular implementation was taken from a low-level QSPI
// controller. For those who wish to compare, the low-level QSPI
// controller is very similar to the low-level EQSPI controller that is
// also a part of the OpenArty project.
//
// Interfacing with the controller works as follows: If the controller
// is idle, set the values you wish to send and strobe the i_wr bit.
// Once the last bit has been committed to the interface, but before it
// closes the connection by setting CS_N high, it will check the i_wr bit
// again. If that bit is high, the busy bit will be dropped for one
// cycle, new data will be accepted, and the controller will continue
// with the new(er) data as though it was still part of the last
// transmission (without lowering cs_n).
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
39,6 → 58,7
`define OLED_READY 3'h3
`define OLED_STOP 3'h4
`define OLED_STOP_B 3'h5
`define OLED_STOP_C 3'h6
 
// Modes
`define OLED_MOD_SPI 2'b00
157,8 → 177,8
o_mosi <= r_word[31];
end else if (~last_counter)
begin
o_busy <= (pre_last_counter)&&(o_sck)
&&((state != `OLED_READY)||(~i_wr));
o_busy <= (!pre_last_counter)||(!o_sck)
||(state != `OLED_READY)||(~i_wr);
end else if (~o_sck)
begin
o_sck <= 1'b1;
205,12 → 225,22
o_sck <= 1'b1; // Stop the clock
o_busy <= 1'b1; // Still busy till port is clear
state <= `OLED_STOP_B;
end else // if (state == `OLED_STOP_B)
end else if (state == `OLED_STOP_B)
begin
o_cs_n <= 1'b1; // Deselect CS
o_sck <= 1'b1;
// Do I need this????
// spi_len <= 3; // Minimum CS high time before next cmd
state <= `OLED_STOP_C;
o_mosi <= 1'b1;
o_busy <= 1'b1;
end else // if (state == `OLED_STOP_C)
begin
// Keep us in idle for at least a full clock period.
o_cs_n <= 1'b1; // Deselect CS
o_sck <= 1'b1;
// Do I need this????
// spi_len <= 3; // Minimum CS high time before next cmd
state <= `OLED_IDLE;
o_mosi <= 1'b1;
o_busy <= 1'b1;
/rtl/wboled.v
4,8 → 4,113
//
// Project: OpenArty, an entirely open SoC based upon the Arty platform
//
// Purpose:
// Purpose: To provide a *very* simplified controller for a PMod OLEDrgb.
// This controller implements four registers (described below),
// although it might feel like only two in practice. As with all of our
// other wishbone work, all transactions are 32-bits--even though, as an
// example, the data word for the device is only ever 16-bits long.
//
// The device control, outlined below, is also colored by two facts:
// 1. There is no means to read from the device. Sure, the chip on the
// PMod has a full read/write bus, but it hasn't been entirely
// wired to the PMod pins. This was probably done so that the
// interface could handle the paucity of pins available, but for
// whatever reason, there's no way to read from the device.
// 2. The device is controlled by a SPI port, but with an extra wire that
// determines whether or not you are writing to the control or the
// data port on the device. Hence the four wire SPI protocol has
// lost the MISO wire and gained a Data / Control (N) (or dcn)
// wire.
// 3. As implemented, the device also has two power control wires and a
// reset wire. The reset wire is negative logic. Without setting
// the PMOD-Enable wire high, the board has no power. The
// VCCEN pin is not to be set high without PMOD-Enable high.
// Finally, setting reset low (with PMod-Enable high), places the
// device into a reset condition.
//
// The design of the controller, as with the design of other controllers
// we have built, is focused around the design principles:
// 1. Use the bottom 23 bits of a word for the command, if possible.
// Such commands can be loaded into registers with simple LDI
// instructions. Even better, restrict any status results from the
// device to 18 bits, so that instructions that use immediates
// such as TEST #,Rx, can use these immediates.
// 2. Protect against inadvertant changes to the power port. For this,
// we insist that a minimum of two bits be high to change the
// power port bits, and that just reading from the port and
// writing back with a changed power bit is not sufficient to
// change the power.
// 3. Permit atomic changes to the individual power control bits,
// by outlining which exact bits change upon any write, and
// permitting only the bits specified to change.
// 4. Don't stall the bus. So, if a command comes in and the
// device is busy, we'll ignore the command. It is up to the
// user to make certain the device isn't fed faster than it is
// able. (Perhaps the user wishes to add a FIFO?)
// 5. Finally, build this so that either a FIFO or DMA could control it.
//
// Registers:
// 0. Control -- There are several types of control commands to/from
// the device, all separated and determined by how many bytes are
// to be sent to the device for the said command. Commands written
// to the control port of the device are initiated by writes
// to this register.
//
// - Writes of all { 24'h00, data[7:0] } send the single byte
// data[7:0] to the device.
// - Writes of { 16'h01, data[15:0] } send two bytes,
// data[15:0], to the device.
// - Writes of { 4'h2, 4'hx, data[23:0] } send three bytes,
// data[23:0], to the device.
// - Writes of { 4'h3, 4'hx, data[23:0] } send four bytes,
// data[23:0], then r_a[31:24] to the device.
// - Writes of { 4'h3, 4'hx, data[23:0] } send five bytes,
// data[23:0], then r_a[31:16] to the device.
// - Writes of { 4'h3, 4'hx, data[23:0] } send six bytes,
// data[23:0], then r_a[31:8] to the device.
// - Writes of { 4'h3, 4'hx, data[23:0] } send seven bytes,
// data[23:0], then r_a[31:0] to the device.
// - Writes of { 4'h3, 4'hx, data[23:0] } send eight bytes,
// data[23:0], r_a[31:16], then r_b[31:24] to the device.
// - Writes of { 4'h3, 4'hx, data[23:0] } send nine bytes,
// data[23:0], r_a[31:16], then r_b[31:16] to the device.
// - Writes of { 4'h3, 4'hx, data[23:0] } send ten bytes,
// data[23:0], r_a[31:16], then r_b[31:8] to the device.
// - Writes of { 4'h3, 4'hx, data[23:0] } send eleven bytes,
// data[23:0], r_a[31:16], then r_b[31:0] to the device.
//
// 1. A This register is used, just like the B register below, for
// setting up commands that send multiple bytes to the device.
// Be aware that the high order bits/bytes will be sent first.
// This is one of the few registers that may be read with meaning.
// Once the word is written, however, the register is cleared.
//
// 2. B This is the same as the A register, save on writes the A
// register will be written first before any bits from the B
// register. As with the A register, this value is cleared upon
// any write--regardless of whether its value is used in the
// write.
//
// 3. Data --- This is both the data and the power control register.
//
// To write data to the graphics data RAM within the device,
// simply write a 16'bit word: { 16'h00, data[15:0] } to this
// port.
//
// To change the three power bits, {reset, vccen, pmoden},
// you must also set a 1'b1 in the corresponding bit position from
// bit 16-18. Hence a:
//
// 32'h010001 sets the pmod enable bit, whereas 32'h010000 clears
// it.
// 32'h020002 sets the vcc bit, whereas 32'h010000 clears it.
//
// Multiple of the power bits can be changed at once. Each
// respective bit is only changed if it's change enable bit is
// also high.
//
//
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
39,7 → 144,8
o_ack, o_stall, o_data,
o_sck, o_cs_n, o_mosi, o_dbit,
o_pwr, o_int);
parameter CBITS=4; // 2^4*2@6.25ns -> 200ns/clock > 150ns min
parameter CBITS=8, // 2^4*2@6.25ns -> 200ns/clock > 150ns min
EXTRA_BUS_CLOCK = 0;
input i_clk, i_cyc, i_stb, i_we;
input [1:0] i_addr;
input [31:0] i_data;
58,42 → 164,60
lwlvl(i_clk, dev_wr, dev_dbit, dev_word, dev_len, dev_busy,
o_sck, o_cs_n, o_mosi, o_dbit);
 
`define EXTRA_WB_DELAY
`ifdef EXTRA_WB_DELAY
reg r_wb_stb, r_wb_we;
reg [31:0] r_wb_data;
reg [1:0] r_wb_addr;
always @(posedge i_clk)
r_wb_stb <= i_stb;
always @(posedge i_clk)
r_wb_we <= i_we;
always @(posedge i_clk)
r_wb_data <= i_data;
always @(posedge i_clk)
r_wb_addr <= i_addr;
`else
wire r_wb_stb, r_wb_we;
wire r_wb_data;
wire [1:0] r_wb_addr;
wire wb_stb, wb_we;
wire [31:0] wb_data;
wire [1:0] wb_addr;
 
assign r_wb_stb = i_stb;
assign r_wb_we = i_we;
assign r_wb_data = i_data;
assign r_wb_addr = i_addr;
`endif
// I've thought about bumping this from a clock at <= 100MHz up to a
// clock near 200MHz. Doing so requires an extra clock to come off
// the bus--the bus fanout is just too wide otherwise. However,
// if you don't need to ... why take the extra clock cycle? Hence
// this little snippet of code allows the rest of the controller
// to work at 200MHz or 100MHz as need be.
generate
if (EXTRA_BUS_CLOCK != 0)
begin
reg r_wb_stb, r_wb_we;
reg [31:0] r_wb_data;
reg [1:0] r_wb_addr;
always @(posedge i_clk)
r_wb_stb <= i_stb;
always @(posedge i_clk)
r_wb_we <= i_we;
always @(posedge i_clk)
r_wb_data <= i_data;
always @(posedge i_clk)
r_wb_addr <= i_addr;
 
assign wb_stb = r_wb_stb;
assign wb_we = r_wb_we;
assign wb_data = r_wb_data;
assign wb_addr = r_wb_addr;
end else begin
assign wb_stb = i_stb;
assign wb_we = i_we;
assign wb_data = i_data;
assign wb_addr = i_addr;
end endgenerate
 
 
 
reg r_busy;
reg [3:0] r_len;
 
 
//
// Handle registers A & B. These are set either upon a write, or
// cleared (set to zero) upon any command to the control register.
//
reg [31:0] r_a, r_b;
always @(posedge i_clk)
if ((r_wb_stb)&&(r_wb_we))
if ((wb_stb)&&(wb_we))
begin
if (r_wb_addr[1:0]==2'b01)
r_a <= r_wb_data;
if (r_wb_addr[1:0]==2'b10)
r_b <= r_wb_data;
if (wb_addr[1:0]==2'b01)
r_a <= wb_data;
if (wb_addr[1:0]==2'b10)
r_b <= wb_data;
end else if (r_cstb)
begin
r_a <= 32'h00;
100,45 → 224,78
r_b <= 32'h00;
end
 
//
// Handle reads from our device. These really aren't all that
// interesting, but ... we can do them anyway. We attempt to provide
// some sort of useful value here. For example, upon reading r_a or
// r_b, you can read the current value(s) of those register(s).
always @(posedge i_clk)
begin
case (r_wb_addr)
2'b00: o_data <= { 13'h00, o_pwr, 8'h00, r_len, 3'h0, r_busy };
case (wb_addr)
2'b00: o_data <= { 13'h00, o_pwr, 8'h00, r_len, 1'b0, o_dbit, !o_cs_n, r_busy };
2'b01: o_data <= r_a;
2'b10: o_data <= r_b;
2'b11: o_data <= { 13'h00, o_pwr, 8'h00, r_len, 3'h0, r_busy };
2'b11: o_data <= { 16'h00, 13'h0, o_pwr };
endcase
end
 
initial o_ack = 1'b0;
always @(posedge i_clk)
o_ack <= r_wb_stb;
o_ack <= wb_stb;
assign o_stall = 1'b0;
 
reg r_cstb, r_dstb, r_pstb;
reg [23:0] r_data;
reg r_cstb, r_dstb, r_pstb, r_pre_busy;
reg [18:0] r_data;
initial r_cstb = 1'b0;
initial r_dstb = 1'b0;
initial r_pstb = 1'b0;
initial r_pre_busy = 1'b0; // Used to clear the interrupt a touch earlier
 
// The control strobe. This will be true if we need to command a
// control interaction.
always @(posedge i_clk)
r_cstb <= (r_wb_stb)&&(r_wb_addr[1:0]==2'b00);
r_cstb <= (wb_stb)&&(wb_we)&&(wb_addr[1:0]==2'b00);
 
// The data strobe, true if we need to command a data interaction.
always @(posedge i_clk)
r_dstb <= (r_wb_stb)&&(r_wb_addr[1:0]==2'b11)&&(r_wb_data[22:20]==3'h0);
r_dstb <= (wb_stb)&&(wb_we)&&(wb_addr[1:0]==2'b11)&&(wb_data[18:16]==3'h0);
 
// The power strobe. True if we are about to adjust the power and/or
// reset bits.
always @(posedge i_clk) // Power strobe, change power settings
r_pstb <= (wb_stb)&&(wb_we)&&(wb_addr[1:0]==2'b11)&&(wb_data[18:16]!=3'h0);
 
// Pre-busy: true if either r_cstb or r_dstb is true, and true on the
// same clock they are true. This is to support our interrupt, by
// clearing the interrupt one clock earlier--lest the DMA decide to send
// two words our way instead of one.
always @(posedge i_clk)
r_pstb <= (r_wb_stb)&&(r_wb_addr[1:0]==2'b11)&&(r_wb_data[22:20]!=3'h0);
r_pre_busy <= (wb_stb)&&(wb_we)&&
((wb_addr[1:0]==2'b11)||(wb_addr[1:0]==2'b00));
 
// But ... to use these strobe values, we are now one more clock
// removed from the bus. We need something that matches this, so let's
// delay our bus data one more clock 'til the time when we actually use
// it.
always @(posedge i_clk)
r_data <= r_wb_data[23:0];
r_data <= wb_data[18:0];
 
initial o_pwr = 3'h0;
always @(posedge i_clk)
if (r_pstb)
o_pwr <= ((o_pwr)&(~r_data[22:20]))
|((r_wb_data[18:16])&(r_data[22:20]));
o_pwr <= ((o_pwr)&(~r_data[18:16]))
|((r_data[2:0])&(r_data[18:16]));
 
// Sadly, because our commands can have a whole slew of different
// lengths, and because these lengths can be ... difficult to
// decipher from the command (especially the first two lengths),
// this quick case statement is needed to decode the amount of bytes
// that will be sent.
reg [3:0] b_len;
always @(posedge i_clk)
casez(r_wb_data[31:28])
4'b000?: b_len <= (r_wb_data[16])? 4'h1:4'h2;
casez(wb_data[31:28])
4'b0000: b_len <= (wb_data[16])? 4'h2:4'h1;
4'b0001: b_len <= 4'h2;
4'b0010: b_len <= 4'h3;
4'b0011: b_len <= 4'h4;
4'b0100: b_len <= 4'h5;
151,38 → 308,84
default: b_len <= 4'h0;
endcase
 
reg [87:0] r_sreg;
//
// On the next clock, we're going to set our data register to
// whatever's in register A, and B, and ... something of the data
// written to the control register. Because this must all be
// written on the most-significant bits of a word, we pause a moment
// here to move the control word that was writen to our bus up
// by an amount given by the length of our message. That way, you
// can write to the bottom bits of the register, and yet still end
// up in the top several bits of the following register.
//
reg [23:0] c_data;
always @(posedge i_clk)
if (wb_data[31:29] != 3'h0)
c_data <= wb_data[23:0];
else if (wb_data[16])
c_data <= { wb_data[15:0], 8'h00 };
else
c_data <= { wb_data[7:0], 16'h00 };
 
//
// Finally, after massaging the incoming data off our bus, we finally
// get to controlling the lower level controller and sending the
// data to the device itself.
//
// The basic idea is this: we use r_busy to know if we are in the
// middle of an operation, or whether or not we will be responsive to
// the bus. r_sreg holds the data we wish to send, and r_len the
// number of bytes within r_sreg that remain to be sent. The controller
// will accept up to 32-bits at a time, so once we issue a command
// (dev_wr & !dev_busy), we transition to either the next command.
// Once all the data has been sent, and the device is now idle, we
// clear r_busy and therefore become responsive to the bus again.
//
//
reg [87:0] r_sreg; // Composed of 24-bits, 32-bits, and 32-bits
initial r_busy = 1'b0;
initial dev_wr = 1'b1;
always @(posedge i_clk)
if ((~r_busy)&&(r_cstb))
begin
dev_wr <= 1'b0;
dev_dbit <= 1'b0;
r_sreg <= { r_data[23:0], r_a, r_b };
r_len <= b_len;
r_busy <= (b_len != 4'h0);
if (b_len == 4'h1)
r_sreg[87:72] <= { r_data[7:0], r_data[7:0] };
else if (b_len == 4'h2)
r_sreg[87:72] <= r_data[15:0];
else
r_sreg[87:72] <= r_data[23:8];
end else if ((~dev_busy)&&(r_dstb))
begin
dev_wr <= 1'b0;
dev_dbit <= 1'b1;
r_sreg <= { r_data[15:0], 72'h00 };
r_len <= 4'h2;
r_busy <= 1'b1;
end else if ((r_busy)&&(~dev_busy))
begin
dev_word <= r_sreg[87:56];
r_sreg <= { r_sreg[55:0], 32'h00 };
dev_len <= (r_len > 4'h4)? 2'b11:(r_len[1:0]+2'b11);
r_len <= (r_len > 4'h4) ? (r_len-4'h4):0;
end else if (r_busy)
r_busy <= (r_len != 4'h0);
dev_wr <= 1'b0;
if ((~r_busy)&&(r_cstb))
begin
dev_dbit <= 1'b0;
r_sreg <= { c_data[23:0], r_a, r_b };
r_len <= b_len;
r_busy <= (b_len != 4'h0);
end else if ((~r_busy)&&(r_dstb))
begin
dev_dbit <= 1'b1;
r_sreg <= { r_data[15:0], 72'h00 };
r_len <= 4'h2;
r_busy <= 1'b1;
end else if ((r_busy)&&(!dev_busy))
begin
// Issue the command to write up to 32-bits at a time
dev_wr <= (r_len != 4'h0);
dev_word <= r_sreg[87:56];
r_sreg <= { r_sreg[55:0], 32'h00 };
dev_len <= (r_len > 4'h4)? 2'b11:(r_len[1:0]+2'b11);
if (dev_wr)
r_len <= (r_len > 4'h4) ? (r_len-4'h4):0;
r_busy <= (dev_wr)||(r_len != 4'h0)&&(!dev_wr);
end else if (r_busy) // & dev_busy
begin
dev_wr <= (r_len != 4'h0);
dev_len <= (r_len > 4'h4)? 2'b11:(r_len[1:0]+2'b11);
end
end
 
assign o_int = (~r_busy);
//
// Here, we pick a self-clearing interrupt input. This will set the
// interrupt any time we are idle, and will automatically clear itself
// any time we become busy. This should be sufficient to allow the
// DMA controller to send things to the card.
//
// Of course ... if you are not running in any sort of interrupt mode,
// you *could* just ignore this line and poll the busy bit instead.
//
assign o_int = (~r_busy)&&(!r_pre_busy);
 
endmodule
/sw/board/Makefile
31,14 → 31,52
##
##
.PHONY: all
all: exstartup
all: exstartup oledtest gpsdump
OBJDIR := obj-zip
CC := zip-gcc
OBJDUMP := zip-objdump
SOURCES := exstartup.c bootloader.c gpsdump.c oledtest.c
HEADERS := artyboard.h zipsys.h
#
# For source analysis, the following macros are defined:
 
#
 
%.o: $(OBJDIR)/%.o
$(OBJDIR)/%.o: %.c
$(CC) -c -fno-builtin $< -o $@
%.txt: %
$(OBJDUMP) -S -D $^ > $@
 
exstartup: exstartup.c artyboard.h zipsys.h arty.ld
zip-gcc -O3 -T arty.ld -fno-builtin -Wl,-Map=exstartup.map exstartup.c -o exstartup
$(CC) -O3 -T arty.ld -fno-builtin -Wl,-Map=exstartup.map exstartup.c -o exstartup
gpsdump: $(OBJDIR)/gpsdump.o $(OBJDIR)/bootloader.o arty.ld
$(CC) -O3 -T arty.ld -fno-builtin -Wl,-Map=gpsdump.map $(OBJDIR)/gpsdump.o $(OBJDIR)/bootloader.o -o $@
oledtest: $(OBJDIR)/oledtest.o $(OBJDIR)/bootloader.o $(OBJDIR)/splash.o $(OBJDIR)/mug.o arty.ld
$(CC) -O3 -T arty.ld -fno-builtin -Wl,-Map=gpsdump.map $(OBJDIR)/oledtest.o $(OBJDIR)/bootloader.o $(OBJDIR)/splash.o $(OBJDIR)/mug.o -o $@
 
exstartup.txt: exstartup
zip-objdump -S -D exstartup > exstartup.txt
$(OBJDUMP) -S -D $^ > $@
 
clean:
rm -f exstartup exstartup.map exstartup.txt
rm -rf $(OBJDIR)/
 
define build-depends
@echo "Building dependency file(s)"
@$(CC) $(CFLAGS) -MM $(SOURCES) > $(OBJDIR)/xdepends.txt
@sed -e 's/^.*.o: /$(OBJDIR)\/&/' < $(OBJDIR)/xdepends.txt > $(OBJDIR)/depends.txt
@rm $(OBJDIR)/xdepends.txt
endef
 
tags: $(SOURCES) $(HEADERS)
@echo "Generating tags"
@ctags $(SOURCES) $(HEADERS)
 
$(OBJDIR)/depends.txt: $(OBJDIR)/
$(build-depends)
 
$(OBJDIR)/:
@bash -c "if [ ! -e $(OBJDIR) ]; then mkdir -p $(OBJDIR)/; fi"
 
-include $(OBJDIR)/depends.txt
/sw/board/artyboard.h
41,7 → 41,6
#ifndef ARTYBOARD_H
#define ARTYBOARD_H
 
 
// BUS Interrupts
#define BUS_BUTTON 0x0001
#define BUS_SWITCH 0x0002
92,6 → 91,7
#define ENET_NOHWCRC 0x008000
#define ENET_NOHWMAC 0x010000
#define ENET_RESET 0x020000
#define ENET_NOHWIPCHK 0x040000
#define ENET_TXCMD(LEN) ((LEN)|ENET_TXBIT)
#define ENET_TXCLR 0x038000
#define ENET_TXCANCEL 0x000000
162,7 → 162,8
#define BKRAM (void *)0x0008000
#define FLASH (void *)0x0400000
#define SDRAM (void *)0x4000000
#define CLOCKFREQHZ 80000000
#define CLOCKFREQHZ 81250000
#define CLOCKFREQ_HZ CLOCKFREQHZ
#define RAMWORDS 0x800000
 
#endif
/sw/board/bootloader.c
0,0 → 1,191
////////////////////////////////////////////////////////////////////////////////
//
// Filename: bootloader.c
//
// Project: OpenArty, an entirely open SoC based upon the Arty platform
//
// Purpose: To start a program from flash, loading its various components
// into on-chip block RAM, or off-chip DDR3 SDRAM, as indicated
// by the symbols/pointers within the program itself. As you will notice
// by the names of the symbols, it is assumed that a kernel will be placed
// into block RAM.
//
// This particular implementation depends upon the following symbols
// being defined:
//
// void entry(void)
// The location where your program will start from, once fully
// loaded.
//
// _top_of_stack:
// A pointer to a location in memory which we can use for a stack.
// The bootloader doesn't use much of this memory, although it does
// use it. It then resets the stack to this location and calls
// your program.
//
// _top_of_heap:
// While not used by this program, this is assumed to be defined
// by the linker as the lowest memory address in a space that can
// be used by a malloc/free restore capability.
//
// _flash:
// The address of the beginning of physical FLASH device. This is
// not the first usable address on that device, as that is often
// reserved for the first two FPGA configurations.
//
// _blkram:
// The first address of the block RAM memory within the FPGA.
//
// _sdram:
// The address of the beginning of physical SDRAM.
//
// _kernel_image_start:
// The address of that location within FLASH where the sections
// needing to be moved begin at.
//
// _kernel_image_end:
// The last address within block RAM that needs to be filled in.
//
// _sdram_image_start:
// This address is more confusing. This is equal to one past the
// last used block RAM address, or the last used flash address if
// no block RAM is used. It is used for determining whether or not
// block RAM was used at all.
//
// _sdram_image_end:
// This is one past the last address in SDRAM that needs to be
// set with valid data.
//
// _bss_image_end:
// This is the last address of memory that must be cleared upon
// startup, for which the program is assuming that it is zero.
// While it may not be necessary to clear the BSS memory, since
// BSS memory is always zero on power up, this bootloader does so
// anyway--since we might be starting from a reset instead of power
// up.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (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 MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
//
#include "artyboard.h"
#include "zipsys.h"
 
asm("\t.section\t.start\n"
"\t.global\t_start\n"
"_start:\n"
"\tLDI\t_top_of_stack,SP\n"
"\tMOV\t_after_bootloader(PC),R0\n"
"\tBRA\tbootloader\n"
"_after_bootloader:\n"
"\tLDI\t_top_of_stack,SP\n"
"\tOR\t0x4000,CC\n" // Clear the data cache
"\tMOV\t_kernel_exit(PC),R0\n"
"\tBRA\tentry\n"
"_kernel_exit:\n"
"\tHALT\n"
"\tBRA\t_kernel_exit\n"
"\t.section\t.text");
 
extern int _sdram_image_end, _sdram_image_start, _sdram,
_blkram, _flash, _bss_image_end,
_kernel_image_start, _kernel_image_end;
 
extern void bootloader(void) __attribute__ ((section (".boot")));
 
// #define USE_DMA
void bootloader(void) {
int zero = 0;
 
#ifdef USE_DMA
zip->dma.ctrl= DMACLEAR;
zip->dma.rd = _kernel_image_start;
if (_kernel_image_end != _sdram_image_start) {
zip->dma.len = _kernel_image_end - _blkram;
zip->dma.wr = _blkram;
zip->dma.ctrl= DMACCOPY;
 
zip->pic = SYSINT_DMAC;
while((zip->pic & SYSINT_DMAC)==0)
;
}
 
zip->dma.len = &_sdram_image_end - _sdram;
zip->dma.wr = _sdram;
zip->dma.ctrl= DMACCOPY;
 
zip->pic = SYSINT_DMAC;
while((zip->pic & SYSINT_DMAC)==0)
;
 
if (_bss_image_end != _sdram_image_end) {
zip->dma.len = _bss_image_end - _sdram_image_end;
zip->dma.rd = &zero;
// zip->dma.wr // Keeps the same value
zip->dma.ctrl = DMACCOPY;
 
zip->pic = SYSINT_DMAC;
while((zip->pic & SYSINT_DMAC)==0)
;
}
#else
int *rdp = &_kernel_image_start, *wrp = &_blkram;
 
//
// Load any part of the image into block RAM, but *only* if there's a
// block RAM section in the image. Based upon our LD script, the
// block RAM should be filled from _blkram to _kernel_image_end.
// It starts at _kernel_image_start --- our last valid address within
// the flash address region.
//
if (&_kernel_image_end != &_sdram_image_start) {
for(int i=0; i< &_kernel_image_end - &_blkram; i++)
*wrp++ = *rdp++;
}
 
//
// Now, we move on to the SDRAM image. We'll here load into SDRAM
// memory up to the end of the SDRAM image, _sdram_image_end.
// As with the last pointer, this one is also created for us by the
// linker.
//
wrp = &_sdram;
for(int i=0; i< &_sdram_image_end - &_sdram; i++)
*wrp++ = *rdp++;
 
//
// Finally, we load BSS. This is the segment that only needs to be
// cleared to zero. It is available for global variables, but some
// initialization is expected within it. We start writing where
// the valid SDRAM context, i.e. the non-zero contents, end.
//
for(int i=0; i<&_bss_image_end - &_sdram_image_end; i++)
*wrp++ = 0;
#endif
}
 
/sw/board/gpsdump.c
0,0 → 1,47
////////////////////////////////////////////////////////////////////////////////
//
// Filename: gpsdump.c
//
// Project: OpenArty, an entirely open SoC based upon the Arty platform
//
// Purpose: To dump the GPS UART to the auxiliary UART.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2015-2016, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (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 MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
//
#include "artyboard.h"
 
void entry(void) {
while(1) {
int ch;
ch = sys->io_gps_rx;
if ((ch&-256)==0)
sys->io_uart_tx = ch;
}
}
/sw/board/mug.c
0,0 → 1,815
////////////////////////////////////////////////////////////////////////////////
//
// Filename: mug.c
//
// Project: OpenArty, an entirely open SoC based upon the Arty platform
//
// Purpose: To encode and capture the image mug in a fashion that
// may be referenced from a C file and encoded directly into
// memory.
//
// WARNING! THIS FILE IS COMPUTER GENERATED. DO NOT TRY TO EDIT IT
//
// If you need to change this file, please adjust the image, or
// genoimage.cpp and rebuild this file instead.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2016, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (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 MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
//
int mug[6144] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdedd,
0x8c54, 0x5acd, 0x39e9, 0x2966, 0x2105, 0x18e4, 0x10a3, 0x10a2,
0x1082, 0x1082, 0x1082, 0x1082, 0x0862, 0x0862, 0x1062, 0x1062,
0x1062, 0x1082, 0x1062, 0x39c6, 0x9cf3, 0xb5d6, 0xb5b5, 0xadb5,
0xb5b5, 0xadb5, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad75, 0xad95, 0xad75, 0xad95,
0xad95, 0xad95, 0xad95, 0xad75, 0xad75, 0xad75, 0xad74, 0xad74,
0xad75, 0xad75, 0xad75, 0xad74, 0xad75, 0xad75, 0xad74, 0xad75,
0xad74, 0xad75, 0xad75, 0xad95, 0xad95, 0xad95, 0xad95, 0xb5b5,
0xb5d6, 0xb5f6, 0xbe17, 0xc638, 0xce78, 0xd6b9, 0xdf3b, 0xefbd,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf79f, 0xa537,
0x632e, 0x39e9, 0x2966, 0x2104, 0x18c4, 0x10a3, 0x1082, 0x1082,
0x1082, 0x1082, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x1062, 0x1082, 0x1082, 0x73ae, 0xad75, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad75, 0xad95, 0xad95, 0xad95,
0xad75, 0xad95, 0xad95, 0xad75, 0xad75, 0xad75, 0xad75, 0xad74,
0xad74, 0xad75, 0xad75, 0xad74, 0xad75, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad75, 0xad74, 0xad75, 0xad95, 0xad95,
0xad95, 0xb5b5, 0xb5d6, 0xbdf6, 0xbe17, 0xc658, 0xce99, 0xdefa,
0xef7c, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xce5c, 0x7bd1,
0x4a6b, 0x2967, 0x2105, 0x18c4, 0x10a3, 0x1082, 0x1082, 0x1082,
0x1082, 0x1082, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x1082, 0x0861, 0x39c7, 0x9cf3, 0xb5b6, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad75, 0xad75, 0xad75, 0xad75, 0xad75,
0xad75, 0xad75, 0xad74, 0xad75, 0xad75, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xa574, 0xad74, 0xa574, 0xad74, 0xad74, 0xad75,
0xad95, 0xad95, 0xb5b5, 0xb5b6, 0xb5d6, 0xbdf6, 0xbe37, 0xce78,
0xd6da, 0xe75c, 0xf7de, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xef5e, 0x9495, 0x528c,
0x39a8, 0x2125, 0x18c4, 0x10a3, 0x1082, 0x1082, 0x1082, 0x1082,
0x1082, 0x1082, 0x1062, 0x0862, 0x0862, 0x0862, 0x0861, 0x0862,
0x0862, 0x0862, 0x0862, 0x0882, 0x10a2, 0x8430, 0xb595, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad75, 0xad75, 0xad75, 0xad75,
0xad75, 0xad75, 0xad75, 0xad75, 0xad75, 0xad75, 0xad74, 0xad74,
0xad74, 0xad74, 0xa574, 0xad74, 0xa574, 0xa574, 0xad74, 0xad74,
0xad74, 0xad75, 0xad95, 0xad95, 0xadb5, 0xb5b6, 0xb5f6, 0xbe17,
0xc658, 0xd6b9, 0xe75b, 0xf7de, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xb599, 0x630e, 0x39e9,
0x2946, 0x2104, 0x18c3, 0x1082, 0x1082, 0x0862, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x1062, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x1082, 0x0861, 0x5aca, 0xa554, 0xb595,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad75, 0xad75, 0xad75,
0xad75, 0xad75, 0xad75, 0xad75, 0xad74, 0xad75, 0xad74, 0xad74,
0xad74, 0xad74, 0xa574, 0xad74, 0xa574, 0xa574, 0xa554, 0xa574,
0xa574, 0xad74, 0xad74, 0xad75, 0xad95, 0xad95, 0xb5b5, 0xb5d6,
0xbdf7, 0xc638, 0xceb9, 0xe73b, 0xf7de, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xe71e, 0x7bf2, 0x4a4a, 0x2966,
0x2104, 0x18c3, 0x10a3, 0x1082, 0x0862, 0x0862, 0x1082, 0x1082,
0x1082, 0x1082, 0x0862, 0x0862, 0x0862, 0x1082, 0x1082, 0x1082,
0x1082, 0x1082, 0x0862, 0x0862, 0x0862, 0x2104, 0x94d2, 0xb5b5,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad75, 0xad75,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad75, 0xad75, 0xad75,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xa574, 0xa574, 0xa574,
0xa574, 0xa574, 0xa574, 0xad74, 0xad74, 0xad75, 0xad95, 0xb5b5,
0xb5d6, 0xbdf6, 0xc637, 0xce99, 0xdf3b, 0xf7de, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xad38, 0x5acd, 0x31a7, 0x2125,
0x18c4, 0x10a3, 0x1082, 0x1082, 0x0862, 0x1082, 0x0862, 0x1062,
0x1062, 0x0862, 0x0862, 0x0862, 0x1082, 0x1082, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x0861, 0x73ae, 0xad75,
0xad95, 0xb595, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xadb5, 0xad95,
0x94d2, 0x8c50, 0x9491, 0x9cb1, 0xa4d2, 0xa554, 0xad95, 0xad75,
0xad74, 0xad74, 0xad74, 0xad74, 0xad75, 0xad75, 0xad75, 0xad75,
0xad74, 0xa554, 0xa554, 0xa574, 0xad74, 0xad74, 0xad74, 0xad95,
0xad95, 0xb5b6, 0xbdf6, 0xc637, 0xce99, 0xdf3b, 0xf7de, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xe73e, 0x7bd2, 0x4209, 0x2946, 0x18e4,
0x10a3, 0x10a2, 0x1082, 0x1082, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x1062, 0x1062, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x0862, 0x4228, 0xa534,
0xb5b6, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xb5b6, 0xad75, 0x8c70, 0x6b2b,
0x6aca, 0x7aca, 0x82eb, 0x8b0b, 0x8b4b, 0x838c, 0x8bee, 0xa533,
0xad95, 0xad74, 0xad74, 0xa533, 0x9d12, 0x94b1, 0x8c70, 0x8c90,
0x94d2, 0xad74, 0xad95, 0xad75, 0xad74, 0xad74, 0xad74, 0xad74,
0xad75, 0xad95, 0xb5b5, 0xb5d6, 0xbe37, 0xce99, 0xe75b, 0xffde,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xb5b9, 0x5aad, 0x3187, 0x2104, 0x18c3,
0x10a2, 0x1082, 0x1082, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x1062, 0x1062, 0x1062, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x10a2, 0x10a2, 0x18e3, 0x9cf3,
0xadb6, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xb5b5, 0x9d13, 0x7bee, 0x6aeb, 0x6248, 0x59e6,
0x61c6, 0x69c7, 0x69c7, 0x6a07, 0x7248, 0x7289, 0x6a68, 0x732b,
0x73ad, 0x630b, 0x5aca, 0x5289, 0x4a68, 0x4207, 0x39c6, 0x39c6,
0x41e7, 0x5289, 0x738c, 0x8450, 0x9cf2, 0xa554, 0xad95, 0xad95,
0xad74, 0xad75, 0xad95, 0xb5b5, 0xb5d6, 0xc637, 0xce99, 0xe75c,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xf77f, 0x8433, 0x4209, 0x2925, 0x18c3, 0x10a3,
0x1082, 0x1082, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082, 0x0862, 0x1082,
0x1082, 0x1082, 0x1082, 0x10a2, 0x10a2, 0x10a2, 0x1082, 0x6b6d,
0xad75, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xb5b6, 0xa554, 0x73ad, 0x5a68, 0x5a07, 0x61e7, 0x61c7, 0x69c7,
0x69e7, 0x61c6, 0x61a6, 0x61e7, 0x6a07, 0x6a28, 0x61e7, 0x4985,
0x3985, 0x3144, 0x2924, 0x2924, 0x2103, 0x20e3, 0x20e3, 0x18c2,
0x18c2, 0x20e3, 0x2924, 0x3185, 0x39c6, 0x4a27, 0x6b4b, 0x8c70,
0xa533, 0xad95, 0xad75, 0xad95, 0xb5b5, 0xb5f6, 0xc637, 0xd6b9,
0xef9d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xd67c, 0x630e, 0x3187, 0x20e4, 0x10a3, 0x1082,
0x1082, 0x0862, 0x0862, 0x0862, 0x0861, 0x0861, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x10a2, 0x10a2, 0x1082, 0x2945,
0xa534, 0xadb6, 0xad95, 0xad95, 0xb595, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xadb5, 0xad75,
0x842f, 0x5289, 0x51e7, 0x59e6, 0x6a07, 0x69e7, 0x7228, 0x7a69,
0x7a89, 0x7248, 0x6a07, 0x6a07, 0x6207, 0x59e7, 0x4965, 0x3103,
0x2924, 0x2903, 0x2903, 0x2903, 0x2103, 0x2103, 0x2103, 0x20e3,
0x20e3, 0x20e3, 0x20e3, 0x20c3, 0x18c2, 0x18c2, 0x2923, 0x31a5,
0x5288, 0x844f, 0xad74, 0xad95, 0xad95, 0xb5b5, 0xb5f6, 0xc638,
0xd6fa, 0xf7be, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xa516, 0x4a4a, 0x2125, 0x18c3, 0x10a2, 0x1082,
0x1062, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x10a2, 0x1082,
0x632c, 0xad95, 0xad96, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xad75, 0x738d,
0x3965, 0x49a5, 0x6207, 0x6227, 0x59c6, 0x51a6, 0x59c6, 0x6208,
0x6a48, 0x6a28, 0x59c6, 0x49a5, 0x4165, 0x3965, 0x3124, 0x2903,
0x2923, 0x2903, 0x20e3, 0x2924, 0x20c2, 0x20e3, 0x2103, 0x2103,
0x2903, 0x20e3, 0x20e3, 0x20e3, 0x20e3, 0x20e3, 0x2103, 0x2103,
0x2924, 0x39a5, 0x62ea, 0x94b1, 0xad74, 0xad95, 0xb5b5, 0xbdf6,
0xc678, 0xdf3b, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xf79f, 0x7bf1, 0x31a7, 0x2104, 0x10a3, 0x1082, 0x1062,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x10a2, 0x10a2,
0x18e3, 0x8430, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95, 0xb5b6,
0xb595, 0xb5b6, 0xad95, 0xad75, 0xa554, 0x9cf2, 0x7bce, 0x39c6,
0x2904, 0x4185, 0x4185, 0x3965, 0x3144, 0x3124, 0x3944, 0x4165,
0x4165, 0x4165, 0x3965, 0x4185, 0x4185, 0x4185, 0x4185, 0x3965,
0x3985, 0x3985, 0x39a6, 0x3144, 0x2924, 0x2903, 0x20e3, 0x20e3,
0x2903, 0x2924, 0x2904, 0x2103, 0x20e3, 0x2103, 0x20e3, 0x20c3,
0x20e3, 0x2103, 0x2944, 0x41e6, 0x736c, 0xa533, 0xad95, 0xb5b6,
0xbe17, 0xce99, 0xef7c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xdedc, 0x5aed, 0x2946, 0x18c3, 0x10a2, 0x1082, 0x0862,
0x0862, 0x0861, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x10a2,
0x10a2, 0x2124, 0x8c71, 0xb5b6, 0xb5b5, 0xb5b6, 0xa554, 0x9cf3,
0x7bee, 0x738d, 0x630b, 0x5289, 0x4a48, 0x4a28, 0x41e7, 0x3985,
0x3165, 0x3965, 0x3165, 0x3144, 0x3144, 0x3145, 0x4185, 0x4185,
0x49a5, 0x49a6, 0x49c6, 0x51c6, 0x51c6, 0x51e6, 0x51c6, 0x51e6,
0x51e6, 0x41a5, 0x41c6, 0x4185, 0x49a6, 0x4985, 0x3944, 0x3124,
0x3124, 0x3944, 0x3965, 0x3965, 0x3144, 0x3144, 0x2103, 0x18a2,
0x1082, 0x18a2, 0x20c2, 0x20e3, 0x2924, 0x5268, 0x94b1, 0xad95,
0xb5d6, 0xbe37, 0xd6da, 0xf7de, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xb598, 0x422a, 0x2104, 0x10a3, 0x1082, 0x1082, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082,
0x1082, 0x10a2, 0x2945, 0x7bce, 0x9d13, 0x7bce, 0x5268, 0x4227,
0x3185, 0x3165, 0x3165, 0x3144, 0x3144, 0x3165, 0x3985, 0x39a6,
0x3985, 0x3145, 0x3124, 0x3965, 0x3985, 0x41a5, 0x49c6, 0x51e6,
0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51e6,
0x49c6, 0x39a5, 0x49a6, 0x51c6, 0x51c6, 0x51c6, 0x51a6, 0x51a5,
0x4985, 0x4985, 0x4985, 0x4985, 0x4985, 0x4165, 0x3945, 0x3124,
0x20e3, 0x10a2, 0x18a2, 0x18a2, 0x18a2, 0x20c2, 0x39a5, 0x8c70,
0xad95, 0xb5d6, 0xc658, 0xe75b, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0x9474, 0x3188, 0x18c4, 0x10a2, 0x1082, 0x0862, 0x0862,
0x0862, 0x0861, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0861,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082,
0x1082, 0x1082, 0x10a2, 0x18e3, 0x2945, 0x3165, 0x2944, 0x2944,
0x2924, 0x2944, 0x3145, 0x3144, 0x3144, 0x3144, 0x3165, 0x3985,
0x3985, 0x3965, 0x3965, 0x4185, 0x49c6, 0x51c6, 0x51e6, 0x59e6,
0x51e6, 0x51e6, 0x51e6, 0x51e6, 0x51c6, 0x59c6, 0x59e6, 0x6207,
0x51c6, 0x20e3, 0x49a6, 0x51a6, 0x59c6, 0x59e6, 0x59c6, 0x59c6,
0x59a6, 0x59a6, 0x51a6, 0x5185, 0x5185, 0x4985, 0x4985, 0x4165,
0x3965, 0x2904, 0x18a2, 0x1082, 0x1082, 0x18a2, 0x18a2, 0x39c5,
0x94d1, 0xb5b5, 0xbdf6, 0xd6b9, 0xf7be, 0xffff, 0xffff, 0xffff,
0xf7bf, 0x738f, 0x2945, 0x10a3, 0x1082, 0x0862, 0x0862, 0x0861,
0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x10a2, 0x2104, 0x3186,
0x3a08, 0x4a8a, 0x5aeb, 0x4a69, 0x39a6, 0x2904, 0x2103, 0x2904,
0x2904, 0x2904, 0x2924, 0x2924, 0x2924, 0x3144, 0x3965, 0x4186,
0x49a6, 0x49a6, 0x49a6, 0x51c6, 0x59e6, 0x59e6, 0x59e6, 0x59e6,
0x59e6, 0x61e6, 0x61e6, 0x59c6, 0x59c6, 0x59c6, 0x51c6, 0x51e6,
0x49c6, 0x3985, 0x49a6, 0x51c6, 0x51a6, 0x51a6, 0x59c6, 0x59c6,
0x59c6, 0x59a6, 0x59a6, 0x59a5, 0x5185, 0x5185, 0x5185, 0x5185,
0x4985, 0x4165, 0x2904, 0x18a2, 0x1082, 0x1082, 0x1082, 0x18a2,
0x5288, 0x9cf2, 0xb5b5, 0xc637, 0xdf3b, 0xffff, 0xffff, 0xffff,
0xe73d, 0x5acc, 0x2104, 0x10a2, 0x0862, 0x0862, 0x0861, 0x0861,
0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0861, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x2124, 0x4229, 0x5aec, 0x5b0c, 0x632c,
0x73ae, 0x73ce, 0x52aa, 0x3165, 0x2103, 0x2924, 0x2924, 0x20e3,
0x2103, 0x2904, 0x3124, 0x3144, 0x3965, 0x41a6, 0x49a6, 0x51c6,
0x5a07, 0x5a07, 0x5a07, 0x5a07, 0x6227, 0x6207, 0x5a06, 0x6206,
0x6207, 0x61e7, 0x6207, 0x61e6, 0x5185, 0x4185, 0x51c6, 0x51c6,
0x49a6, 0x49a6, 0x51e6, 0x49a5, 0x51c6, 0x59c6, 0x59c6, 0x59a6,
0x61c6, 0x61c6, 0x61c6, 0x59a6, 0x59a6, 0x59a5, 0x5985, 0x51a6,
0x51a6, 0x5186, 0x4165, 0x20e3, 0x1082, 0x1081, 0x1081, 0x1082,
0x18c2, 0x62ea, 0xa554, 0xbdf6, 0xceb9, 0xf7de, 0xffff, 0xffff,
0xce7a, 0x422a, 0x18c3, 0x1082, 0x0862, 0x0861, 0x0861, 0x0861,
0x0861, 0x0861, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082,
0x2124, 0x4229, 0x5b0c, 0x634d, 0x634d, 0x632c, 0x73af, 0x8c71,
0x8c92, 0x630c, 0x3165, 0x2104, 0x20e3, 0x20e3, 0x2945, 0x2924,
0x3145, 0x3144, 0x3145, 0x3945, 0x3965, 0x4186, 0x51e7, 0x5a07,
0x59e7, 0x6207, 0x6247, 0x6247, 0x6227, 0x6207, 0x6207, 0x6207,
0x6a27, 0x6a27, 0x6a27, 0x61e6, 0x49a6, 0x4986, 0x4165, 0x3944,
0x3945, 0x4165, 0x4965, 0x4986, 0x51c6, 0x61e6, 0x61e6, 0x61c6,
0x61c6, 0x61e6, 0x61c6, 0x61c6, 0x61c6, 0x61c6, 0x59a6, 0x59a5,
0x59a6, 0x51a6, 0x49a6, 0x3944, 0x20c2, 0x1082, 0x1082, 0x18a2,
0x18a2, 0x20e3, 0x8c4f, 0xad95, 0xc637, 0xe75c, 0xffff, 0xffff,
0xb598, 0x39c8, 0x10a3, 0x1082, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x18c3, 0x2125, 0x31c7, 0x4a8a, 0x6b8e,
0x7c10, 0x73cf, 0x6b6e, 0x632c, 0x6b8e, 0x8c92, 0x9d14, 0x9d14,
0x6b4d, 0x2965, 0x2104, 0x20e3, 0x2924, 0x20e3, 0x20e3, 0x2924,
0x2904, 0x3145, 0x3124, 0x3965, 0x3985, 0x49c6, 0x51c6, 0x5207,
0x51e6, 0x5a06, 0x5a06, 0x5a06, 0x6206, 0x6207, 0x6a27, 0x6a27,
0x7248, 0x7228, 0x7228, 0x59c7, 0x51c6, 0x5185, 0x4985, 0x3944,
0x3944, 0x4165, 0x4985, 0x49a6, 0x49a6, 0x59c6, 0x61e6, 0x61c6,
0x61c6, 0x61c6, 0x61c6, 0x61c6, 0x61c6, 0x61c6, 0x61c6, 0x59a6,
0x59a5, 0x59a5, 0x51a6, 0x4985, 0x2903, 0x18a2, 0x1061, 0x1082,
0x18a2, 0x18a2, 0x39e6, 0x94d2, 0xb5d6, 0xd6b9, 0xffff, 0xffff,
0xa515, 0x3186, 0x10a2, 0x1062, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x1082, 0x1062, 0x1082, 0x1082, 0x1082, 0x10a3, 0x2945,
0x4229, 0x632d, 0x8431, 0x8c72, 0x7c30, 0x7c10, 0x7c10, 0x7c30,
0x73ef, 0x6b8e, 0x6b6d, 0x8430, 0x9cf3, 0xa554, 0x9d34, 0x7bef,
0x39c7, 0x20e3, 0x2103, 0x2924, 0x2904, 0x2904, 0x2924, 0x20e3,
0x2903, 0x2904, 0x3124, 0x2904, 0x3124, 0x3985, 0x41a5, 0x4185,
0x4164, 0x4164, 0x4985, 0x51c6, 0x59e6, 0x6a27, 0x7248, 0x7248,
0x7268, 0x7a48, 0x7248, 0x6a89, 0x61e7, 0x51a6, 0x51a5, 0x4165,
0x3124, 0x4165, 0x51a6, 0x51c6, 0x49c6, 0x6207, 0x6a07, 0x69e6,
0x61e6, 0x61c6, 0x61c6, 0x61c6, 0x61c6, 0x61c6, 0x61c6, 0x61c6,
0x59a6, 0x59a5, 0x59a6, 0x51a6, 0x3965, 0x20e3, 0x1082, 0x1082,
0x1082, 0x1082, 0x18a2, 0x73cd, 0xad95, 0xc658, 0xf7bd, 0xffff,
0x9493, 0x2946, 0x10a2, 0x1082, 0x0862, 0x0862, 0x1082, 0x1082,
0x1082, 0x10a3, 0x18c3, 0x3186, 0x528a, 0x73cf, 0x94d3, 0xa555,
0xa535, 0x9d14, 0x8451, 0x73ef, 0x73cf, 0x7bef, 0x7c30, 0x7c10,
0x73ae, 0x73ae, 0x8c91, 0x9d14, 0xa555, 0xa575, 0x94b2, 0x528a,
0x3165, 0x2104, 0x2104, 0x2104, 0x2104, 0x2904, 0x2904, 0x2924,
0x2924, 0x20e3, 0x3124, 0x3144, 0x3965, 0x3945, 0x3985, 0x3144,
0x3944, 0x3945, 0x4185, 0x49a5, 0x51c6, 0x6a27, 0x7268, 0x7a89,
0x7a89, 0x7a89, 0x7a48, 0x6a8a, 0x6a28, 0x59a6, 0x51a6, 0x51a6,
0x3945, 0x4165, 0x51a6, 0x6207, 0x5a69, 0x6207, 0x6a27, 0x6a07,
0x6a07, 0x61e6, 0x61c6, 0x61a6, 0x69e7, 0x69e7, 0x69e6, 0x69c6,
0x61c6, 0x61a6, 0x59a5, 0x5986, 0x4985, 0x3124, 0x18a2, 0x1061,
0x1082, 0x10a2, 0x1081, 0x632b, 0xad74, 0xbdf6, 0xe73b, 0xffff,
0x8432, 0x2125, 0x10a2, 0x1082, 0x1082, 0x10a3, 0x18e3, 0x3186,
0x528b, 0x7bf0, 0x94d3, 0x94f3, 0x9cf3, 0xa555, 0x9d54, 0x9d34,
0x94d3, 0x8430, 0x73ef, 0x7bef, 0x7c10, 0x8430, 0x8430, 0x7c10,
0x7bef, 0x8c92, 0x9d13, 0xa534, 0xad75, 0xa534, 0x738e, 0x39a6,
0x2104, 0x20e3, 0x2924, 0x2924, 0x2924, 0x2104, 0x2904, 0x2924,
0x2924, 0x2924, 0x2924, 0x3145, 0x3965, 0x3965, 0x3944, 0x3965,
0x3144, 0x3144, 0x3124, 0x3944, 0x49a5, 0x61e6, 0x7268, 0x7aa9,
0x82ca, 0x8289, 0x7a48, 0x834d, 0x7269, 0x61e7, 0x51a6, 0x51c6,
0x3104, 0x3124, 0x59c7, 0x6a68, 0x6b2c, 0x59e7, 0x7248, 0x7227,
0x6a07, 0x61e6, 0x61c6, 0x61a6, 0x69e6, 0x7207, 0x69e7, 0x69c6,
0x69c6, 0x61a6, 0x59a5, 0x59a6, 0x5186, 0x3945, 0x20c3, 0x1882,
0x1082, 0x1082, 0x1081, 0x5268, 0x9d13, 0xb5b5, 0xd6b9, 0xffff,
0x8432, 0x3187, 0x2145, 0x39e8, 0x52ab, 0x6baf, 0x94d3, 0xa575,
0xad96, 0xa555, 0x9d14, 0x94f3, 0x9d34, 0xa575, 0x9cf3, 0x8c70,
0x7c0f, 0x8430, 0x7c30, 0x8430, 0x8430, 0x8430, 0x8430, 0x8430,
0x8cb2, 0x9d13, 0x9d13, 0xa555, 0xad96, 0x94b2, 0x4208, 0x2945,
0x2104, 0x20e3, 0x20e3, 0x2924, 0x2924, 0x20e3, 0x20e3, 0x2104,
0x2945, 0x3166, 0x2925, 0x20e3, 0x2924, 0x3145, 0x4185, 0x3965,
0x2924, 0x3124, 0x3124, 0x3124, 0x4185, 0x6227, 0x7268, 0x7a89,
0x82cb, 0x82aa, 0x7a48, 0x8b6d, 0x7289, 0x6a07, 0x59c6, 0x59c7,
0x3965, 0x2903, 0x51a6, 0x6228, 0x49e7, 0x51c6, 0x7a89, 0x7248,
0x7228, 0x6a07, 0x61c6, 0x61c6, 0x69e6, 0x7227, 0x7207, 0x6a07,
0x69c6, 0x61a6, 0x61a6, 0x59a6, 0x51a6, 0x4185, 0x28e3, 0x1082,
0x1061, 0x1082, 0x10a2, 0x20e3, 0x842f, 0xad95, 0xc658, 0xffde,
0xdf1c, 0xc659, 0xa576, 0x9d34, 0x9d55, 0xad96, 0xadb6, 0xad96,
0x9d14, 0x9d14, 0x9d34, 0x9d14, 0xa555, 0xa534, 0x94b2, 0x94b1,
0x8c92, 0x8430, 0x8450, 0x8c71, 0x8c92, 0x94d2, 0x94d2, 0x94d3,
0x9d14, 0x9d13, 0x9d34, 0xad95, 0xad95, 0x6b6d, 0x3186, 0x2945,
0x2104, 0x2104, 0x2104, 0x2924, 0x2945, 0x2925, 0x2124, 0x3186,
0x3186, 0x31a6, 0x39c7, 0x3165, 0x3965, 0x3965, 0x4165, 0x4185,
0x4185, 0x3944, 0x3144, 0x3144, 0x3944, 0x6207, 0x7268, 0x7a68,
0x82aa, 0x82aa, 0x7a48, 0x8b4c, 0x7289, 0x6a28, 0x61e7, 0x51a6,
0x4986, 0x3985, 0x49a6, 0x59e7, 0x4185, 0x49a6, 0x7aa9, 0x7a89,
0x7268, 0x6a07, 0x69c6, 0x69c6, 0x69e7, 0x7228, 0x7228, 0x7207,
0x69c6, 0x61c6, 0x61a6, 0x61a6, 0x59a6, 0x49a6, 0x3104, 0x18a2,
0x1062, 0x1061, 0x1082, 0x1082, 0x6b4c, 0xa554, 0xbdf6, 0xef9d,
0xffff, 0xef9e, 0xbe59, 0xadd7, 0xadb6, 0xad96, 0xad96, 0x9d54,
0x9d14, 0x9d34, 0xa555, 0xad75, 0xa555, 0x9cf4, 0x9cf4, 0x94d3,
0x94d3, 0x94d3, 0x94d3, 0x94d3, 0x9cf3, 0x9d14, 0xa555, 0xad75,
0xa534, 0x9cf3, 0xa555, 0xadb6, 0x9d14, 0x5269, 0x2924, 0x2104,
0x2104, 0x2104, 0x2924, 0x31a6, 0x31a7, 0x39c7, 0x3186, 0x3186,
0x39c7, 0x3166, 0x3165, 0x49c6, 0x5a07, 0x6227, 0x6207, 0x6a48,
0x61e7, 0x4165, 0x3965, 0x3144, 0x3944, 0x6207, 0x7a68, 0x7aa9,
0x82a9, 0x82aa, 0x7a89, 0x7aa9, 0x6248, 0x7268, 0x69e7, 0x59a6,
0x4945, 0x3945, 0x51a6, 0x51c6, 0x3945, 0x51a6, 0x82eb, 0x7aaa,
0x7a68, 0x7227, 0x69e6, 0x69e6, 0x7207, 0x7248, 0x7248, 0x7227,
0x69e7, 0x61c6, 0x61a6, 0x61a6, 0x59a6, 0x51a6, 0x3124, 0x18a2,
0x1061, 0x1882, 0x1082, 0x1081, 0x5288, 0xa533, 0xb5b5, 0xe75c,
0xffff, 0xef7d, 0xbe18, 0xa595, 0xa555, 0x9d54, 0x9d54, 0x9d34,
0x9d34, 0x9d55, 0xa575, 0xa575, 0x9cf4, 0x94f3, 0x94f3, 0x94f4,
0xa555, 0x9cf4, 0xad76, 0x9cf3, 0x94b2, 0xa534, 0xa575, 0xa534,
0x9d13, 0x9cf3, 0xad75, 0xb5d6, 0x8410, 0x39a6, 0x2904, 0x20e3,
0x2924, 0x2924, 0x2945, 0x31a6, 0x31a7, 0x4208, 0x4228, 0x39c7,
0x3165, 0x3144, 0x3945, 0x51e6, 0x6227, 0x6a27, 0x6207, 0x6a27,
0x59a6, 0x3945, 0x3944, 0x3103, 0x3924, 0x59c6, 0x7228, 0x7a68,
0x7a89, 0x7268, 0x7268, 0x6a07, 0x51c6, 0x6a28, 0x6a27, 0x59c6,
0x5186, 0x4965, 0x51c6, 0x51c6, 0x4165, 0x6228, 0x8b0b, 0x82aa,
0x7a68, 0x7207, 0x69e7, 0x6a07, 0x7207, 0x7228, 0x7248, 0x7228,
0x6a07, 0x69c6, 0x61a6, 0x61a6, 0x59a6, 0x51c6, 0x3965, 0x20c2,
0x1882, 0x1082, 0x1082, 0x10a2, 0x39a5, 0x9d13, 0xad95, 0xdf1b,
0xffff, 0xd71b, 0xa596, 0x9d34, 0x9514, 0x9513, 0x9d14, 0x9d54,
0xa575, 0xa555, 0x9d34, 0x94f3, 0x9d14, 0x94d3, 0x8cb2, 0xa575,
0x9d35, 0x9d14, 0xadb6, 0xa555, 0x9cf4, 0x94b2, 0x94b2, 0x9d14,
0x9d14, 0x9cf3, 0xad75, 0xad95, 0x630c, 0x3145, 0x2924, 0x2104,
0x18c3, 0x18c3, 0x2965, 0x39e7, 0x4a29, 0x4a49, 0x4208, 0x3186,
0x3144, 0x3965, 0x4165, 0x49a5, 0x6207, 0x6227, 0x6207, 0x5986,
0x4986, 0x49e7, 0x3944, 0x3103, 0x3103, 0x5185, 0x69e7, 0x61e7,
0x61c6, 0x59a6, 0x5185, 0x59a6, 0x5185, 0x51a6, 0x59e6, 0x59c6,
0x51c6, 0x51a6, 0x51a6, 0x49a6, 0x49a6, 0x7289, 0x830b, 0x82a9,
0x7a48, 0x6a07, 0x69e7, 0x6a07, 0x7207, 0x7228, 0x7248, 0x7228,
0x6a07, 0x69c6, 0x61a6, 0x61a6, 0x59a6, 0x51a6, 0x3965, 0x20c2,
0x1882, 0x1081, 0x1082, 0x1082, 0x3165, 0x9cf2, 0xad74, 0xd6da,
0xffff, 0xce99, 0x9d34, 0x94f3, 0x94f3, 0x9d34, 0xa575, 0xad96,
0xa555, 0x9514, 0x9514, 0x94f4, 0x8c92, 0x8c92, 0xa555, 0xa576,
0x9d14, 0x9d34, 0xadb6, 0xa576, 0x9d14, 0x73ae, 0x4208, 0x634d,
0x9cf3, 0x9d14, 0xad75, 0x94b2, 0x5249, 0x3145, 0x2945, 0x2104,
0x18c3, 0x18c3, 0x3186, 0x39e7, 0x4a28, 0x5289, 0x4a28, 0x3165,
0x2904, 0x3104, 0x4165, 0x51c6, 0x51e6, 0x6207, 0x61e7, 0x5966,
0x49a6, 0x5227, 0x3965, 0x3103, 0x30e3, 0x3924, 0x5186, 0x59a6,
0x61e7, 0x61e6, 0x5185, 0x5185, 0x51a6, 0x4965, 0x4165, 0x41a6,
0x3985, 0x4185, 0x4986, 0x49a6, 0x6a48, 0x82ca, 0x82eb, 0x82a9,
0x7a69, 0x7207, 0x69e7, 0x6a07, 0x7227, 0x7228, 0x7228, 0x7227,
0x6a07, 0x69e6, 0x61c6, 0x61a6, 0x59a6, 0x51c6, 0x4165, 0x20c2,
0x1061, 0x1061, 0x1082, 0x1082, 0x39a6, 0x9cf2, 0xad74, 0xce99,
0xdf3d, 0x8cd3, 0x6b8e, 0x7c0f, 0x8c91, 0x94d2, 0x8c92, 0x8431,
0x7c51, 0x8452, 0x7c31, 0x7c10, 0x7bf0, 0x94b3, 0xa555, 0xa575,
0xa555, 0xa555, 0xad96, 0x9d34, 0x6b6d, 0x2944, 0x10a2, 0x1905,
0x632d, 0x9cf3, 0xad55, 0x7b6d, 0x49c7, 0x3165, 0x2945, 0x2104,
0x2104, 0x2965, 0x39c7, 0x4208, 0x4207, 0x41e7, 0x41c7, 0x3965,
0x2924, 0x2903, 0x3104, 0x3944, 0x4185, 0x6207, 0x69e7, 0x5986,
0x49a6, 0x5207, 0x4165, 0x3124, 0x3103, 0x30e3, 0x4145, 0x51a6,
0x61e7, 0x6a07, 0x61c6, 0x59a6, 0x59a6, 0x5986, 0x5185, 0x4985,
0x4165, 0x4986, 0x3944, 0x6a48, 0x7aaa, 0x82eb, 0x8aeb, 0x8289,
0x7a69, 0x7207, 0x6a07, 0x7207, 0x7227, 0x7227, 0x7227, 0x7227,
0x6a07, 0x69e6, 0x61c6, 0x61a6, 0x59a6, 0x59c6, 0x4165, 0x20c2,
0x1061, 0x1061, 0x1082, 0x1082, 0x39c6, 0x9cf2, 0xa574, 0xce99,
0x7cf8, 0x320a, 0x2147, 0x3a08, 0x4229, 0x31c8, 0x31c8, 0x31c8,
0x31e9, 0x31e9, 0x4209, 0x4a6b, 0x4a8c, 0x52ed, 0x632d, 0x73cf,
0x7c31, 0x8451, 0x7c30, 0x5b0b, 0x2125, 0x1082, 0x18a3, 0x1083,
0x2125, 0x7bcf, 0x8c50, 0x6aaa, 0x41a6, 0x3165, 0x2924, 0x2104,
0x2104, 0x3186, 0x4228, 0x4a28, 0x39c6, 0x3986, 0x3965, 0x3965,
0x3945, 0x3124, 0x3103, 0x3103, 0x4165, 0x59e7, 0x71e8, 0x61a7,
0x59e7, 0x5247, 0x3124, 0x28e3, 0x20a2, 0x28c3, 0x4145, 0x51a6,
0x59e7, 0x6a07, 0x7207, 0x69c6, 0x69c7, 0x69c7, 0x61c6, 0x69c6,
0x7207, 0x7207, 0x59e6, 0x7289, 0x82ca, 0x82eb, 0x82ca, 0x7a89,
0x7a68, 0x7228, 0x6a07, 0x7227, 0x7227, 0x7228, 0x7228, 0x7227,
0x6a07, 0x69e6, 0x61c6, 0x61a6, 0x59a5, 0x59a6, 0x4165, 0x20c2,
0x1061, 0x1061, 0x10a2, 0x1082, 0x41e7, 0x9d13, 0xa554, 0xce99,
0x9558, 0x320a, 0x1927, 0x1948, 0x2148, 0x39e8, 0x2167, 0x1947,
0x2126, 0x1906, 0x2967, 0x2988, 0x2189, 0x2168, 0x1906, 0x10c4,
0x18e5, 0x31a8, 0x2125, 0x10a3, 0x10a3, 0x10a3, 0x18c3, 0x10c3,
0x18c4, 0x6b4d, 0x7b4c, 0x6228, 0x3986, 0x2945, 0x2924, 0x18c3,
0x18e3, 0x2965, 0x39c7, 0x39e7, 0x39a6, 0x3165, 0x3144, 0x3145,
0x3965, 0x3124, 0x3124, 0x3124, 0x3945, 0x59e7, 0x7a29, 0x69e8,
0x6aa9, 0x62a9, 0x3104, 0x2904, 0x28e3, 0x3924, 0x4985, 0x51a6,
0x6a07, 0x7a89, 0x7a48, 0x71e7, 0x71e7, 0x69c7, 0x69e7, 0x69e7,
0x7227, 0x7227, 0x6207, 0x6a48, 0x7a89, 0x82ca, 0x82ca, 0x7aa9,
0x7a89, 0x7228, 0x6a07, 0x7227, 0x7227, 0x7228, 0x7228, 0x7227,
0x6a07, 0x61c6, 0x61a6, 0x59a5, 0x5985, 0x51a5, 0x3944, 0x1882,
0x1061, 0x1082, 0x1082, 0x1081, 0x4228, 0xa533, 0xad74, 0xce99,
0x9557, 0x3a09, 0x2145, 0x1105, 0x3186, 0x5246, 0x3186, 0x2167,
0x1905, 0x18e5, 0x10e6, 0x1926, 0x2966, 0x10c4, 0x10a4, 0x1083,
0x10c4, 0x1906, 0x18e4, 0x2125, 0x1906, 0x1906, 0x2125, 0x1905,
0x18c4, 0x6b4d, 0x7b0c, 0x59e7, 0x4186, 0x2924, 0x20e3, 0x18a2,
0x18c3, 0x2104, 0x2965, 0x39a6, 0x3186, 0x3145, 0x3965, 0x3965,
0x3945, 0x3124, 0x3145, 0x3124, 0x3944, 0x59e7, 0x7a6a, 0x7229,
0x72eb, 0x730b, 0x4165, 0x3945, 0x3124, 0x49a6, 0x51c7, 0x59e7,
0x7269, 0x8b0b, 0x8289, 0x7207, 0x69e7, 0x69c6, 0x61c6, 0x61a6,
0x59c6, 0x59c6, 0x4165, 0x51c6, 0x6a48, 0x7269, 0x830b, 0x82eb,
0x7a89, 0x7228, 0x7207, 0x6a07, 0x6a07, 0x7227, 0x7227, 0x7207,
0x6a07, 0x61c6, 0x61a6, 0x5985, 0x5185, 0x5185, 0x3124, 0x1882,
0x1061, 0x1082, 0x1082, 0x1082, 0x630b, 0xa533, 0xad74, 0xd6da,
0x6c98, 0x1969, 0x2125, 0x10e5, 0x2966, 0x2147, 0x2967, 0x2146,
0x18e4, 0x18c4, 0x10c4, 0x2104, 0x3164, 0x10a4, 0x10c4, 0x18e4,
0x1905, 0x1906, 0x2146, 0x18e5, 0x10e5, 0x2146, 0x2967, 0x2147,
0x2106, 0x630c, 0x72cb, 0x59e7, 0x49a6, 0x3145, 0x2104, 0x18c3,
0x18c3, 0x2104, 0x2945, 0x3165, 0x3145, 0x3965, 0x4186, 0x3965,
0x3124, 0x3124, 0x3124, 0x2903, 0x3945, 0x59e7, 0x7a6a, 0x6a08,
0x72aa, 0x6aea, 0x5186, 0x4145, 0x3124, 0x4185, 0x49a6, 0x51c6,
0x6a28, 0x7a89, 0x7228, 0x69e7, 0x61c6, 0x59a6, 0x5165, 0x4965,
0x3965, 0x3965, 0x3944, 0x4185, 0x59e7, 0x5a07, 0x7aca, 0x8b0b,
0x82aa, 0x7a68, 0x7227, 0x69e6, 0x69e7, 0x7207, 0x7207, 0x69e7,
0x69e6, 0x61a6, 0x61a6, 0x5985, 0x5185, 0x4965, 0x28e3, 0x1061,
0x1061, 0x1082, 0x1081, 0x2124, 0x8c50, 0xa554, 0xad95, 0xdf1b,
0x6c15, 0x1949, 0x10c5, 0x10c4, 0x08c5, 0x10e5, 0x10c5, 0x10c5,
0x0883, 0x10c3, 0x10c4, 0x10e6, 0x10c6, 0x10c6, 0x10c5, 0x1905,
0x31a8, 0x4a6b, 0x73cf, 0x5aec, 0x3186, 0x20e3, 0x1906, 0x2966,
0x3187, 0x6b6e, 0x7b0c, 0x6208, 0x41a6, 0x3145, 0x2904, 0x20e3,
0x18c3, 0x20e4, 0x2124, 0x2945, 0x3186, 0x3986, 0x41a6, 0x3124,
0x2904, 0x3945, 0x3124, 0x28e3, 0x3124, 0x59e7, 0x7a49, 0x6a08,
0x6a89, 0x6aca, 0x4145, 0x3104, 0x28e3, 0x28e3, 0x3944, 0x4985,
0x51a6, 0x61e7, 0x69e7, 0x59a6, 0x5185, 0x4965, 0x4124, 0x4985,
0x4185, 0x4986, 0x49a6, 0x49a6, 0x49a6, 0x51a6, 0x6228, 0x82eb,
0x7a89, 0x7a68, 0x7227, 0x69c6, 0x69c6, 0x69e6, 0x69e7, 0x69e7,
0x69c6, 0x61a5, 0x59a5, 0x5185, 0x4985, 0x3944, 0x20a2, 0x1061,
0x1061, 0x1082, 0x1082, 0x4a48, 0x9d12, 0xa554, 0xb5b5, 0xe75c,
0x94f6, 0x31c9, 0x1905, 0x10a4, 0x18e4, 0x3164, 0x2923, 0x1905,
0x10a4, 0x10a4, 0x10a4, 0x10c5, 0x2125, 0x2988, 0x4a8b, 0x6b6e,
0x7c10, 0x94b3, 0xad96, 0xa534, 0x7bef, 0x39e7, 0x10a3, 0x2925,
0x4209, 0x6baf, 0x83ef, 0x6a69, 0x4186, 0x2924, 0x20e3, 0x18c3,
0x20e3, 0x20e4, 0x2924, 0x3165, 0x3165, 0x3986, 0x3965, 0x3145,
0x3944, 0x3945, 0x28e3, 0x28e3, 0x3124, 0x51a6, 0x7208, 0x69c7,
0x5a07, 0x6288, 0x4165, 0x3124, 0x28e3, 0x20c2, 0x30e3, 0x4965,
0x51a6, 0x59c6, 0x59c6, 0x4965, 0x4965, 0x4145, 0x4985, 0x59e7,
0x59c6, 0x5186, 0x4985, 0x59c6, 0x51c6, 0x4986, 0x4986, 0x7289,
0x7aa9, 0x7248, 0x6a07, 0x61c6, 0x61c6, 0x69c6, 0x69c6, 0x69c6,
0x61a6, 0x5985, 0x5185, 0x5165, 0x4965, 0x3104, 0x1882, 0x1061,
0x1061, 0x1082, 0x18a2, 0x73ad, 0xa554, 0xad74, 0xbdf6, 0xef9d,
0x9dda, 0x3a2b, 0x2125, 0x10c4, 0x2104, 0x3145, 0x2945, 0x2125,
0x18c3, 0x10c4, 0x39e8, 0x52aa, 0x73ae, 0x8430, 0x9d34, 0xb5d6,
0xb5d6, 0xadb6, 0xad95, 0xa555, 0x9d34, 0x7c10, 0x2986, 0x0883,
0x3a0a, 0x8431, 0x9cf3, 0x730c, 0x3986, 0x3145, 0x2945, 0x2104,
0x2104, 0x2965, 0x31a6, 0x3165, 0x3145, 0x3985, 0x3986, 0x3945,
0x3945, 0x3945, 0x2903, 0x28e3, 0x3124, 0x51a6, 0x69e7, 0x6186,
0x51a6, 0x5a48, 0x49a5, 0x3924, 0x28e3, 0x20a2, 0x28e3, 0x4945,
0x5186, 0x51a6, 0x5185, 0x5185, 0x59a6, 0x4985, 0x6a48, 0x6207,
0x51a6, 0x4145, 0x4165, 0x51a6, 0x5a07, 0x5207, 0x4165, 0x6227,
0x7a89, 0x7248, 0x6a07, 0x61c6, 0x61a6, 0x61a6, 0x69c6, 0x61c6,
0x59a5, 0x5185, 0x5165, 0x4965, 0x4145, 0x28e3, 0x1061, 0x0841,
0x1062, 0x1082, 0x31a6, 0x94b1, 0xa554, 0xad95, 0xc657, 0xffde,
0x857b, 0x2a2e, 0x1906, 0x10c4, 0x10c4, 0x10c4, 0x10a4, 0x10a3,
0x31a7, 0x634d, 0x8c92, 0x9d13, 0xa575, 0xad95, 0xa575, 0xa575,
0xa575, 0xa555, 0xa555, 0xa554, 0xa534, 0xa534, 0x6b6d, 0x424a,
0x73ef, 0x9d13, 0xa534, 0x8c30, 0x4a28, 0x3165, 0x3165, 0x2924,
0x2104, 0x3186, 0x39e7, 0x41e7, 0x39a6, 0x39a6, 0x3986, 0x3145,
0x3945, 0x3124, 0x3104, 0x3103, 0x3964, 0x59c6, 0x61e7, 0x5986,
0x4966, 0x49c6, 0x3965, 0x30e3, 0x20c2, 0x20a2, 0x3903, 0x5186,
0x59c6, 0x59c6, 0x6207, 0x7228, 0x61e7, 0x5a07, 0x7269, 0x6a48,
0x51a6, 0x4965, 0x3965, 0x4165, 0x6207, 0x5a48, 0x4986, 0x5a07,
0x7248, 0x7227, 0x6a07, 0x61c6, 0x61a6, 0x61a5, 0x61a6, 0x59a5,
0x5985, 0x5185, 0x4965, 0x4965, 0x3124, 0x18a2, 0x1061, 0x1061,
0x1082, 0x18a2, 0x6b6c, 0xa533, 0xad74, 0xb5d5, 0xd6b9, 0xffff,
0xadb9, 0x426c, 0x1905, 0x10a3, 0x10a3, 0x10a3, 0x2986, 0x5aec,
0x8431, 0x9d34, 0xa575, 0x9d34, 0x9d14, 0x9d14, 0x9d34, 0x9d34,
0x9d34, 0x9d14, 0x9d13, 0x94f3, 0x94d3, 0x9cf3, 0x94b2, 0x94b2,
0x9d14, 0xa534, 0x9d14, 0xa554, 0x738e, 0x39a6, 0x3165, 0x2924,
0x20e3, 0x2945, 0x41e7, 0x4228, 0x4207, 0x4207, 0x39c6, 0x3145,
0x3965, 0x3104, 0x3124, 0x3944, 0x49a5, 0x51c6, 0x59c6, 0x5165,
0x4945, 0x4165, 0x3965, 0x28e3, 0x20c2, 0x28e3, 0x4144, 0x61a6,
0x7227, 0x7a69, 0x82aa, 0x7a69, 0x61e7, 0x6228, 0x6a48, 0x6a28,
0x51c6, 0x49c6, 0x2924, 0x4165, 0x6207, 0x51e7, 0x51c6, 0x6207,
0x7228, 0x6a07, 0x61e6, 0x61c6, 0x61a6, 0x59a5, 0x59a5, 0x59a5,
0x5185, 0x5185, 0x4965, 0x4145, 0x28e3, 0x18a2, 0x1081, 0x18a2,
0x1082, 0x3185, 0x8c91, 0xa554, 0xad95, 0xbe16, 0xe75b, 0xffff,
0xc67c, 0x424b, 0x10c4, 0x1083, 0x3a09, 0x6b8e, 0x8c72, 0x9d34,
0xa555, 0x9d34, 0x9d14, 0x9d14, 0x9d14, 0x94d3, 0x9513, 0x9d34,
0x9d14, 0x9d13, 0x94d2, 0x8c92, 0x8c91, 0x8c92, 0x94b2, 0x9cf3,
0x9cf3, 0x9d13, 0x9d13, 0xa554, 0x9cf3, 0x5269, 0x3186, 0x2944,
0x2924, 0x2124, 0x3186, 0x4228, 0x4a69, 0x4a49, 0x39c6, 0x3165,
0x3144, 0x2904, 0x2903, 0x3944, 0x51c6, 0x59e6, 0x61e7, 0x59c6,
0x59a6, 0x4965, 0x3124, 0x3144, 0x2903, 0x28e3, 0x5185, 0x6a07,
0x7248, 0x82aa, 0x82aa, 0x7a89, 0x6207, 0x6228, 0x6a27, 0x61e7,
0x51a6, 0x49a6, 0x20c2, 0x3945, 0x59e7, 0x51a6, 0x51c6, 0x6207,
0x6a07, 0x69e7, 0x61c6, 0x59a6, 0x61a6, 0x59a5, 0x59a5, 0x5185,
0x4985, 0x4965, 0x4145, 0x2903, 0x18c2, 0x18a2, 0x1082, 0x1082,
0x2103, 0x6b6d, 0xa533, 0xad74, 0xb5b5, 0xc657, 0xf7bd, 0xffff,
0xd73f, 0x5330, 0x634e, 0x8451, 0x94f4, 0xa596, 0xa596, 0xad96,
0xa595, 0x9d55, 0x9d14, 0x9513, 0x9d34, 0x9d14, 0x9513, 0x9d34,
0x9d13, 0x9cf3, 0x94d2, 0x8c92, 0x8c71, 0x8c71, 0x8c92, 0x94d3,
0x9cf3, 0x9d13, 0x9cf3, 0x9d14, 0xa534, 0x73ae, 0x41e7, 0x3166,
0x2945, 0x20e3, 0x2104, 0x3186, 0x39c7, 0x4a28, 0x39c7, 0x3186,
0x2904, 0x20c3, 0x20e3, 0x3124, 0x4985, 0x59c6, 0x6227, 0x6207,
0x6207, 0x59c6, 0x3944, 0x3144, 0x2903, 0x3103, 0x51c6, 0x7248,
0x7268, 0x82aa, 0x82aa, 0x8289, 0x7228, 0x5a07, 0x61e7, 0x59a6,
0x5185, 0x4165, 0x3144, 0x4144, 0x51a6, 0x51a6, 0x51a6, 0x59c6,
0x61e7, 0x61c6, 0x59c6, 0x59a5, 0x59a5, 0x5985, 0x5185, 0x4965,
0x4965, 0x4165, 0x2903, 0x18c2, 0x18c2, 0x18c2, 0x1082, 0x1061,
0x4207, 0x94b2, 0xad74, 0xad95, 0xb5f6, 0xd6d9, 0xffff, 0xffff,
0xf7df, 0xdefc, 0xe75d, 0xcedb, 0xb5f7, 0xa595, 0xa555, 0xa575,
0xa596, 0xa575, 0x9d34, 0x9513, 0x9d34, 0xa555, 0x9d34, 0x9cf3,
0x9cf2, 0x9cf3, 0x9d13, 0x9cf3, 0x8c92, 0x8451, 0x8451, 0x8c92,
0x94d2, 0x9cf3, 0x9d13, 0x9d34, 0x9d14, 0x94b2, 0x5269, 0x3165,
0x2945, 0x2124, 0x20e3, 0x2104, 0x2124, 0x3186, 0x3186, 0x2945,
0x2104, 0x18c3, 0x18c3, 0x20e3, 0x3124, 0x3964, 0x4185, 0x4185,
0x4185, 0x4185, 0x3964, 0x2903, 0x28e3, 0x3103, 0x49a6, 0x6a27,
0x7268, 0x8289, 0x82aa, 0x7a69, 0x7a48, 0x51c6, 0x61e6, 0x5185,
0x4965, 0x4145, 0x3124, 0x4144, 0x4985, 0x51a6, 0x51a6, 0x59c6,
0x59c6, 0x59c6, 0x59a6, 0x59a5, 0x59a5, 0x5185, 0x4985, 0x4965,
0x4165, 0x3124, 0x20c3, 0x18c2, 0x18c2, 0x18a2, 0x1081, 0x20e3,
0x73ae, 0xa554, 0xad74, 0xb5b5, 0xc637, 0xef7c, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xef9e, 0xbe38, 0xa575, 0x9d34, 0x9d34,
0x9d55, 0xa555, 0x9d34, 0x9d13, 0x9d14, 0x9d34, 0x9d13, 0x94b1,
0x8c70, 0x8c91, 0x9d14, 0x9d34, 0x9cf3, 0x8c92, 0x8430, 0x8430,
0x8c71, 0x94b2, 0x94d3, 0x9d13, 0x9d13, 0x9cf3, 0x7c10, 0x3186,
0x2945, 0x2924, 0x20e3, 0x18e3, 0x18e3, 0x2124, 0x3165, 0x2925,
0x2104, 0x20e3, 0x2104, 0x20e3, 0x20e3, 0x2903, 0x3124, 0x3144,
0x3144, 0x3144, 0x3124, 0x2903, 0x28e3, 0x3924, 0x51c6, 0x6a07,
0x7248, 0x7a69, 0x7a69, 0x7a48, 0x7a48, 0x51a6, 0x61c6, 0x59a6,
0x4965, 0x3944, 0x3124, 0x3944, 0x4165, 0x4986, 0x49a5, 0x51c6,
0x51c6, 0x51a6, 0x59a6, 0x59a6, 0x51a5, 0x4985, 0x4965, 0x3965,
0x2924, 0x20c3, 0x18a2, 0x18a2, 0x18c2, 0x18a2, 0x18a2, 0x630b,
0x9d13, 0xad74, 0xb595, 0xbdf6, 0xd6b9, 0xf7de, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xd71c, 0xb5f7, 0xa575, 0x9d34,
0x9d34, 0x9d34, 0x9d13, 0x94f3, 0x9d13, 0x9d13, 0x94d3, 0x94b2,
0x94b1, 0x94d2, 0x9d14, 0x9d13, 0x9d13, 0x9cf3, 0x8c92, 0x7c10,
0x7c10, 0x8451, 0x9492, 0x94d3, 0x9cf3, 0x9cf3, 0x94b2, 0x632c,
0x2945, 0x2924, 0x2104, 0x20e3, 0x18e3, 0x18c3, 0x2924, 0x2104,
0x20e3, 0x18c3, 0x18c3, 0x18c3, 0x18c3, 0x20c3, 0x28e3, 0x3144,
0x3945, 0x3124, 0x2904, 0x3124, 0x3124, 0x4185, 0x59e6, 0x6a06,
0x7227, 0x7228, 0x7248, 0x7228, 0x7208, 0x51a6, 0x51c7, 0x5185,
0x4165, 0x3924, 0x3924, 0x3944, 0x4165, 0x49a6, 0x49c6, 0x51c6,
0x51a6, 0x51a6, 0x51a5, 0x51a5, 0x4985, 0x4165, 0x3944, 0x2924,
0x20e3, 0x18a2, 0x10a2, 0x18a2, 0x18a2, 0x2944, 0x630b, 0x9cd2,
0xad74, 0xad94, 0xb5d5, 0xc637, 0xe75b, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xefbe, 0xceba, 0xadd7, 0xa575,
0x9d34, 0x9d13, 0x94f3, 0x94f3, 0x9d13, 0x9d13, 0x94b2, 0x8cb2,
0x94d2, 0x94f3, 0x9d13, 0x9d13, 0x9d14, 0x9d13, 0x94d3, 0x8c71,
0x7c10, 0x7c10, 0x8450, 0x8c71, 0x94b2, 0x94d3, 0x94b2, 0x8451,
0x5acb, 0x2924, 0x2124, 0x18e3, 0x18c3, 0x18c2, 0x18c3, 0x2103,
0x18c3, 0x20c3, 0x20e3, 0x2904, 0x20e3, 0x2903, 0x2924, 0x3124,
0x3944, 0x3944, 0x3944, 0x3964, 0x4165, 0x51a5, 0x59e6, 0x61e6,
0x6a07, 0x6a07, 0x6a07, 0x69e7, 0x61c6, 0x61c6, 0x51c6, 0x49a6,
0x4985, 0x4165, 0x4165, 0x4185, 0x51e7, 0x49c6, 0x51a6, 0x49a5,
0x51a6, 0x51a5, 0x4985, 0x4165, 0x3944, 0x2904, 0x2103, 0x20e3,
0x20e3, 0x18c2, 0x18a2, 0x20e3, 0x31a6, 0x73ae, 0xa513, 0xad54,
0xad74, 0xb5b5, 0xbe16, 0xd6b9, 0xf7de, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xd71c, 0xb617, 0xa575,
0x9d34, 0x94f3, 0x94d3, 0x94d3, 0x94f3, 0x94f3, 0x94d3, 0x94d2,
0x94d2, 0x94b2, 0x94b2, 0x94b2, 0x94d3, 0x94f3, 0x94f3, 0x94d2,
0x8451, 0x7bef, 0x7c10, 0x7c10, 0x8410, 0x8451, 0x8c71, 0x8c71,
0x7c0f, 0x5269, 0x2945, 0x18e3, 0x18c3, 0x18c3, 0x18a2, 0x20e3,
0x18a2, 0x18c3, 0x20e3, 0x20e3, 0x20c3, 0x2904, 0x3144, 0x3944,
0x3944, 0x4165, 0x4185, 0x4165, 0x49a5, 0x51c6, 0x51c6, 0x51c6,
0x59c6, 0x59c6, 0x59c6, 0x59c6, 0x59c6, 0x59c6, 0x59c6, 0x49a6,
0x49a6, 0x49c6, 0x49c6, 0x41a6, 0x41a6, 0x49c6, 0x49a5, 0x49a5,
0x49a6, 0x4185, 0x3124, 0x2903, 0x20e3, 0x20e3, 0x20e3, 0x20e3,
0x20c2, 0x20e3, 0x39c6, 0x738d, 0x8c91, 0xa513, 0xad74, 0xad74,
0xad95, 0xbdf6, 0xc678, 0xe75b, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xd6db, 0xadb6, 0x9cf3,
0x8cb2, 0x8451, 0x8450, 0x8430, 0x7c10, 0x7c10, 0x7c10, 0x7c30,
0x7c10, 0x7c10, 0x7c30, 0x8431, 0x8451, 0x8491, 0x8c92, 0x8c92,
0x8c92, 0x7c10, 0x73cf, 0x7bef, 0x7bef, 0x7bef, 0x7c10, 0x7bef,
0x7bef, 0x73ae, 0x6b4d, 0x4208, 0x2104, 0x18c3, 0x18c2, 0x18c3,
0x18a2, 0x18c2, 0x18c3, 0x20c3, 0x2924, 0x3165, 0x3965, 0x3965,
0x3965, 0x4185, 0x4185, 0x49a5, 0x51c6, 0x51c6, 0x51c6, 0x51c6,
0x51c6, 0x51c6, 0x51c6, 0x51c6, 0x51c6, 0x51c6, 0x51c6, 0x51a6,
0x51e6, 0x5a07, 0x5207, 0x3144, 0x3965, 0x4185, 0x4185, 0x4185,
0x3124, 0x2903, 0x2903, 0x2903, 0x2924, 0x3165, 0x3985, 0x39c6,
0x5aaa, 0x840f, 0x9cd2, 0xa533, 0xa554, 0xad54, 0xad74, 0xad95,
0xb5d6, 0xc637, 0xd6fa, 0xf7de, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xd6fb, 0xadb6, 0x94f3,
0x8c92, 0x8471, 0x7c51, 0x7c31, 0x7c31, 0x7c31, 0x8451, 0x8451,
0x8472, 0x8cb2, 0x8cd3, 0x94f3, 0x9514, 0x9d14, 0x9514, 0x94d3,
0x8451, 0x7bef, 0x6b8e, 0x634d, 0x632d, 0x630c, 0x5b0c, 0x630c,
0x5acb, 0x4228, 0x3165, 0x528a, 0x5289, 0x2924, 0x20e3, 0x2103,
0x20e3, 0x20e3, 0x20e3, 0x20e3, 0x2924, 0x3124, 0x3145, 0x3965,
0x3985, 0x4185, 0x4165, 0x4165, 0x4185, 0x49a6, 0x49a5, 0x51c6,
0x51c6, 0x51c6, 0x49c6, 0x49a6, 0x49c6, 0x49c6, 0x49c6, 0x49c6,
0x49c6, 0x49e6, 0x49e6, 0x3985, 0x3985, 0x3985, 0x2924, 0x2903,
0x2924, 0x3144, 0x4a28, 0x6b6d, 0x8c71, 0x94b2, 0x9cd2, 0x9cf3,
0xa513, 0xa554, 0xa554, 0xad54, 0xad54, 0xad74, 0xad95, 0xb5b5,
0xbe17, 0xce98, 0xef9c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xefdf, 0xcedb,
0xb618, 0xadb6, 0x9d55, 0x9d34, 0x9514, 0x94f3, 0x8c92, 0x8471,
0x7c30, 0x73cf, 0x6bae, 0x6b6d, 0x632c, 0x5aeb, 0x52aa, 0x52aa,
0x52aa, 0x4229, 0x31c7, 0x31a6, 0x2945, 0x18e3, 0x18c3, 0x18c3,
0x18c3, 0x1082, 0x4a69, 0x9cf3, 0x9cd2, 0x8430, 0x632c, 0x4a69,
0x39a6, 0x2924, 0x20e3, 0x2103, 0x2924, 0x2924, 0x2904, 0x2924,
0x3144, 0x3124, 0x3165, 0x3965, 0x3965, 0x3964, 0x3964, 0x4185,
0x4185, 0x4185, 0x41a6, 0x41a6, 0x41a6, 0x49c6, 0x41a6, 0x4185,
0x3985, 0x3965, 0x3965, 0x3965, 0x3985, 0x4a08, 0x5269, 0x5289,
0x632c, 0x840f, 0xa513, 0xa554, 0xa554, 0xa554, 0xa554, 0xa554,
0xa554, 0xa554, 0xa554, 0xad54, 0xad74, 0xad95, 0xb5b5, 0xbdf6,
0xce78, 0xe73b, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffde, 0xf7be, 0xd69a, 0xb596, 0x9cd3, 0x8451, 0x6b8e,
0x52cb, 0x4228, 0x31c6, 0x2945, 0x18e4, 0x10a3, 0x10a3, 0x10a3,
0x10a2, 0x10a2, 0x10a2, 0x10a2, 0x1082, 0x10a2, 0x10a2, 0x10a2,
0x10a2, 0x10a2, 0x10a2, 0x10a2, 0x10a2, 0x1082, 0x1082, 0x1082,
0x2104, 0x738e, 0xa534, 0xad74, 0xad74, 0xad54, 0xa554, 0x9d13,
0x9491, 0x73ae, 0x4a48, 0x4207, 0x39c6, 0x39a6, 0x3985, 0x3165,
0x3165, 0x3145, 0x3124, 0x3144, 0x3144, 0x3124, 0x3144, 0x3144,
0x3144, 0x3145, 0x3965, 0x3965, 0x4165, 0x4165, 0x4165, 0x4965,
0x5186, 0x59c7, 0x61e7, 0x59e7, 0x840f, 0xa534, 0xa534, 0xa534,
0xa554, 0xa554, 0xad54, 0xad54, 0xa554, 0xa554, 0xa554, 0xa554,
0xa554, 0xa554, 0xad54, 0xad74, 0xad95, 0xb5b5, 0xbdf6, 0xc657,
0xdefa, 0xf7be, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xa536, 0x52ab, 0x3186, 0x2104, 0x18c3,
0x10a3, 0x1082, 0x1082, 0x1082, 0x1082, 0x0862, 0x0862, 0x0862,
0x0862, 0x0862, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082,
0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x1062, 0x4228,
0x9cd3, 0xa554, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xa554, 0xa534, 0x9cd2, 0x94b2, 0x94b1, 0x8450, 0x840f, 0x7bce,
0x6b4c, 0x62eb, 0x5acb, 0x5aeb, 0x630b, 0x632c, 0x5aca, 0x4a08,
0x49c6, 0x59c6, 0x61c7, 0x59c6, 0x59a6, 0x59a6, 0x69c7, 0x7208,
0x7a49, 0x7a69, 0x7aeb, 0x9cb2, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xa554, 0xad54, 0xad54, 0xad54, 0xa554, 0xa554, 0xa554,
0xa554, 0xad54, 0xad74, 0xad95, 0xb5b5, 0xb5d6, 0xc637, 0xd6b9,
0xef9d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xce7b, 0x6b4f, 0x39c8, 0x2125, 0x18e4,
0x18a3, 0x10a2, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x1082, 0x1082,
0x0862, 0x0862, 0x1062, 0x1082, 0x1082, 0x1082, 0x2965, 0x94d2,
0xad74, 0xad54, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad54, 0xa554, 0xad54, 0xa554, 0xad54,
0xad54, 0xad54, 0xa554, 0xa554, 0xa554, 0xa554, 0xad54, 0xa554,
0xa513, 0x9cf3, 0x94b2, 0x8c30, 0x7b8d, 0x732c, 0x832c, 0x8b6d,
0x8bae, 0x9c92, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xa554, 0xa554, 0xad54, 0xa554, 0xa554, 0xad54, 0xad54,
0xad74, 0xad74, 0xad95, 0xb5b5, 0xbdd6, 0xc637, 0xce99, 0xe75c,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xf7bf, 0x9494, 0x4a6b, 0x3187, 0x2105,
0x18c3, 0x10a3, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x1062, 0x1082, 0x1082, 0x1082, 0x1082, 0x7bce, 0xa554,
0xad54, 0xa554, 0xad54, 0xad74, 0xad74, 0xad54, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xad74, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xa554, 0xa554, 0xa554, 0xad54, 0xad54, 0xad54, 0xad74,
0xad74, 0xad95, 0xb5b5, 0xbdd6, 0xc637, 0xce99, 0xe73b, 0xfffe,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xc63b, 0x6b4f, 0x4209, 0x2946,
0x20e4, 0x18c3, 0x10a3, 0x10a2, 0x1082, 0x1082, 0x1082, 0x0862,
0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x1062, 0x1062, 0x1082, 0x1082, 0x0861, 0x4208, 0x9cf2, 0xa574,
0xa554, 0xa554, 0xad54, 0xad54, 0xad74, 0xad54, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad54,
0xad74, 0xad74, 0xad74, 0xad74, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xa554, 0xa554,
0xa554, 0xa554, 0xad54, 0xad54, 0xad54, 0xad74, 0xad74, 0xad75,
0xb595, 0xb5b5, 0xbdf6, 0xc637, 0xce99, 0xe73b, 0xf7de, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xef7f, 0x9494, 0x528b, 0x31a7,
0x2125, 0x18e4, 0x18c3, 0x10a3, 0x1082, 0x1082, 0x1082, 0x0862,
0x1062, 0x0862, 0x0862, 0x0862, 0x0861, 0x0861, 0x0862, 0x0862,
0x0862, 0x1062, 0x1082, 0x1082, 0x0861, 0x6b8d, 0xa534, 0xa554,
0xa554, 0xa554, 0xa554, 0xad54, 0xad54, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad54,
0xad74, 0xad74, 0xad54, 0xad54, 0xad54, 0xad54, 0xad74, 0xad54,
0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xa554,
0xa554, 0xad54, 0xad74, 0xad54, 0xad74, 0xad74, 0xad95, 0xb595,
0xb5d6, 0xbdf6, 0xc637, 0xce99, 0xe73b, 0xf7de, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xce5b, 0x7390, 0x422a,
0x2986, 0x2105, 0x18c4, 0x10a3, 0x10a2, 0x1082, 0x1082, 0x1082,
0x1082, 0x1082, 0x0862, 0x0861, 0x0861, 0x0861, 0x0862, 0x0862,
0x0862, 0x1062, 0x1082, 0x1082, 0x2104, 0x8c91, 0xad74, 0xa554,
0xa554, 0xa554, 0xa554, 0xad54, 0xa554, 0xad54, 0xad54, 0xad54,
0xa554, 0xad74, 0xad54, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad54, 0xad74,
0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xad54, 0xa554, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xad74, 0xad74, 0xad74, 0xad75, 0xad95, 0xb5b5, 0xb5d6,
0xbdf7, 0xc658, 0xd6b9, 0xe73b, 0xf7de, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf7bf, 0xa517, 0x630d,
0x41e9, 0x2966, 0x2104, 0x18c3, 0x18a3, 0x10a2, 0x1082, 0x1082,
0x1082, 0x0862, 0x0862, 0x0862, 0x0861, 0x0862, 0x0862, 0x0862,
0x1062, 0x1062, 0x1082, 0x0861, 0x528a, 0x9cf3, 0xa554, 0xa554,
0xa554, 0xa554, 0xa554, 0xa554, 0xad54, 0xa554, 0xad54, 0xad54,
0xad54, 0xad54, 0xa554, 0xad54, 0xad54, 0xad74, 0xad54, 0xad54,
0xad74, 0xad54, 0xad74, 0xad54, 0xad54, 0xad74, 0xad54, 0xad54,
0xad54, 0xad54, 0xad54, 0xa554, 0xad54, 0xa554, 0xad54, 0xa554,
0xad54, 0xa554, 0xa554, 0xa554, 0xad54, 0xad54, 0xad54, 0xad54,
0xad74, 0xad74, 0xad75, 0xad95, 0xb595, 0xb5b5, 0xbdd6, 0xbe17,
0xc658, 0xd6b9, 0xe73b, 0xf7de, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xdedd, 0x8433,
0x528c, 0x39c8, 0x2946, 0x2104, 0x18c4, 0x18a3, 0x10a3, 0x1082,
0x1082, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x0862, 0x1082, 0x1082, 0x1082, 0x73ce, 0xa554, 0xa554, 0xa554,
0xa554, 0xa554, 0xa554, 0xa554, 0xa554, 0xa554, 0xad54, 0xad54,
0xad54, 0xa554, 0xa554, 0xad54, 0xad54, 0xad54, 0xad54, 0xa554,
0xa554, 0xa554, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xad54, 0xad54, 0xa554, 0xa554, 0xa554, 0xa554, 0xa554,
0xa554, 0xa554, 0xad54, 0xad54, 0xad54, 0xad54, 0xad74, 0xad74,
0xad75, 0xad95, 0xad95, 0xb5b5, 0xb5d6, 0xbdf6, 0xc637, 0xce78,
0xd6da, 0xe75c, 0xffde, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xbdda,
0x73b0, 0x4a6b, 0x39c8, 0x2945, 0x2104, 0x18c4, 0x18c3, 0x1082,
0x1082, 0x1082, 0x1082, 0x0862, 0x0862, 0x0862, 0x0862, 0x0862,
0x1062, 0x1082, 0x1082, 0x2965, 0x8c91, 0xad74, 0xa554, 0xa554,
0xa554, 0xa554, 0xa554, 0xa554, 0xa554, 0xa554, 0xa554, 0xa554,
0xa554, 0xa554, 0xad54, 0xad54, 0xad54, 0xad54, 0xa554, 0xa554,
0xad54, 0xad54, 0xa554, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xad54, 0xa554, 0xa554, 0xa554, 0xad54, 0xad54, 0xad54,
0xad54, 0xad54, 0xad54, 0xad74, 0xad74, 0xad74, 0xad75, 0xad95,
0xad95, 0xb5b5, 0xb5d6, 0xbdd6, 0xbe17, 0xc658, 0xce99, 0xdefa,
0xef7c, 0xfffe, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xf79f,
0xa557, 0x6b4f, 0x4a4a, 0x31a7, 0x2945, 0x2104, 0x18c3, 0x10a3,
0x10a2, 0x1082, 0x1082, 0x1082, 0x1082, 0x1062, 0x1062, 0x1062,
0x1082, 0x1082, 0x0862, 0x5b0b, 0xa533, 0xad74, 0xa574, 0xa554,
0xa554, 0xa554, 0xa554, 0xa554, 0xa554, 0xa554, 0xa554, 0xad54,
0xa554, 0xa554, 0xa554, 0xad54, 0xa554, 0xa554, 0xa554, 0xad54,
0xa554, 0xa554, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xa554, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xad74, 0xad74, 0xad74, 0xad75, 0xad95, 0xad95, 0xb595,
0xb5b6, 0xbdd6, 0xbdf7, 0xc637, 0xce78, 0xd6b9, 0xe73b, 0xf79d,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xdefd, 0x94b5, 0x632e, 0x4229, 0x31a7, 0x2125, 0x2104, 0x18c4,
0x18a3, 0x10a3, 0x10a2, 0x1082, 0x1082, 0x1082, 0x1082, 0x1082,
0x1082, 0x1082, 0x18e3, 0x8450, 0xb5b5, 0xad95, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad54, 0xad74, 0xad74, 0xad54, 0xad54,
0xa554, 0xad54, 0xad54, 0xad54, 0xad54, 0xa554, 0xad54, 0xad54,
0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54, 0xad54,
0xad54, 0xad54, 0xad74, 0xad74, 0xad54, 0xad74, 0xad74, 0xad74,
0xad74, 0xad75, 0xad95, 0xad95, 0xb595, 0xb5b5, 0xb5b6, 0xb5d6,
0xbdf6, 0xc617, 0xc658, 0xce99, 0xdefa, 0xe75c, 0xf7de, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xd6bd, 0x8c74, 0x630d, 0x4209, 0x3187, 0x2945, 0x2104,
0x18e4, 0x18c3, 0x18a3, 0x10a3, 0x1082, 0x1082, 0x10a2, 0x10a2,
0x10a2, 0x1082, 0x4a49, 0xa533, 0xb5d6, 0xb5b5, 0xad95, 0xad95,
0xad95, 0xad75, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xad74, 0xa554, 0xad54, 0xad54, 0xad74, 0xa554, 0xa554, 0xad54,
0xad54, 0xad54, 0xad54, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad75, 0xad75,
0xad95, 0xad95, 0xb595, 0xb5b5, 0xb5b6, 0xbdd6, 0xbdf6, 0xc617,
0xc658, 0xce99, 0xd6da, 0xe73b, 0xef9d, 0xfffe, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xc63b, 0x8413, 0x52ac, 0x4209, 0x3187, 0x2966,
0x2125, 0x20e4, 0x18c4, 0x18c3, 0x18a3, 0x10a3, 0x10a3, 0x10a3,
0x10a3, 0x10a2, 0x7bef, 0xbe17, 0xbe16, 0xb5f6, 0xb5d6, 0xb5b5,
0xb5b5, 0xad95, 0xad95, 0xad95, 0xad95, 0xad75, 0xad74, 0xad75,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74,
0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad74, 0xad75, 0xad75,
0xad75, 0xad75, 0xad75, 0xad95, 0xad95, 0xad95, 0xad95, 0xb5b5,
0xb5b5, 0xb5b6, 0xb5d6, 0xbdf6, 0xbdf7, 0xc637, 0xc658, 0xce98,
0xd6d9, 0xdf1b, 0xef7c, 0xf7de, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xef7f, 0xb5b9, 0x7c12, 0x5aed, 0x422a, 0x31a7,
0x2966, 0x2125, 0x2104, 0x18e4, 0x18e4, 0x18c3, 0x18c3, 0x18c3,
0x10a2, 0x31a6, 0xad74, 0xd6d9, 0xc678, 0xc637, 0xbe17, 0xbe16,
0xb5f6, 0xb5d6, 0xb5d6, 0xb5b5, 0xb5b5, 0xb5b5, 0xad95, 0xad95,
0xad95, 0xad95, 0xad95, 0xad95, 0xad75, 0xad95, 0xad95, 0xad75,
0xad75, 0xad75, 0xad75, 0xad95, 0xad95, 0xad95, 0xad95, 0xad95,
0xad95, 0xad95, 0xb595, 0xb5b5, 0xb5b5, 0xb5b6, 0xb5d6, 0xb5d6,
0xbdf6, 0xbdf7, 0xc617, 0xc637, 0xce58, 0xce99, 0xd6da, 0xdf1b,
0xef7c, 0xf7be, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
};
 
/sw/board/oledtest.c
0,0 → 1,289
#include "artyboard.h"
#include "zipsys.h"
 
void idle_task(void) {
while(1)
zip_idle();
}
 
extern int splash[], mug[];
 
#define OLED_PMODEN 0x0010001
#define OLED_PMODEN_OFF 0x0010000
#define OLED_IOPWR OLED_PMODEN
#define OLED_VCCEN 0x0020002
#define OLED_VCC_DISABLE 0x0020000
#define OLED_RESET 0x0040000
#define OLED_RESET_CLR 0x0040004
#define OLED_PWRRESET (OLED_PMODEN|OLED_RESET) // 5
#define OLED_FULLPOWER (OLED_PMODEN|OLED_VCCEN|OLED_RESET_CLR) // 3->7
#define OLED_POWER_DOWN (OLED_PMODEN_OFF|OLED_VCC_DISABLE)
#define OLED_BUSY 1
#define OLED_DISPLAYON 0x0af
 
 
#define MICROSECOND (CLOCKFREQ_HZ/1000000)
 
#define OLED_DISPLAY_OFF
 
const int init_sequence[] = {
// Unlock commands
0x01fd12,
// Display off
0x0ae,
// Set remap and data format
0x01a072,
// Set the start line
0x01a100,
// Set the display offset
0x01a200,
// Normal display mode
0x0000a4,
// Set multiplex ratio
0x01a83f,
// Set master configuration:
// Use External VCC
0x01ad8e,
// Disable power save mode
0x01b00b,
// Set phase length
0x01b131,
// Set clock divide
0x01b3f0,
// Set Second Pre-change Speed For ColorA
0x018a64,
// 5l) Set Set Second Pre-charge Speed of Color B
0x018b78,
// 5m) Set Second Pre-charge Speed of Color C
0x018c64,
// 5n) Set Pre-Charge Voltage
0x01bb3a,
// 50) Set VCOMH Deselect Level
0x01be3e,
// 5p) Set Master Current
0x018706,
// 5q) Set Contrast for Color A
0x018191,
// 5r) Set Contrast for Color B
0x018250,
// 5s) Set Contrast for Color C
0x01837D,
// disable scrolling
0x02e };
 
void timer_delay(int counts) {
// Clear the PIC. We want to exit from here on timer counts alone
zip->pic = CLEARPIC;
 
if (counts > 10) {
// Set our timer to count down the given number of counts
zip->tma = counts;
zip->pic = EINT(SYSINT_TMA);
zip_rtu();
zip->pic = CLEARPIC;
} // else anything less has likely already passed
}
 
void oled_clear(void);
 
void oled_init(void) {
int i;
 
for(i=0; i<sizeof(init_sequence); i++) {
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
sys->io_oled.o_ctrl = init_sequence[i];
}
 
// 5u) Clear Screen
oled_clear();
 
zip->tma = (CLOCKFREQ_HZ/200);
zip->pic = EINT(SYSINT_TMA);
zip_rtu();
zip->pic = CLEARPIC;
 
 
// Turn on VCC and wait 100ms
sys->io_oled.o_data = OLED_VCCEN;
// Wait 100 ms
timer_delay(CLOCKFREQ_HZ/10);
 
// Send Display On command
sys->io_oled.o_ctrl = 0xaf;
}
 
void oled_clear(void) {
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
sys->io_oled.o_a = 0x5f3f0000;
sys->io_oled.o_ctrl = 0x40250000;
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
}
 
void oled_fill(int c, int r, int w, int h, int pix) {
int ctrl; // We'll send this value out the control/command port
 
if (c > 95) c = 95;
if (c < 0) c = 0;
if (r > 63) r = 63;
if (r < 0) r = 0;
if (w < 0) w = 0;
if (h < 0) h = 0;
if (c+w > 95) w = 95-c;
if (r+h > 63) h = 63-r;
 
// Enable a rectangle to fill
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
sys->io_oled.o_ctrl = 0x12601;
 
// Now, let's build the actual copy command
ctrl = 0xa0220000 | ((c&0x07f)<<8) | (r&0x03f);
sys->io_oled.o_a = (((c+w)&0x07f)<<24) | (((r+h)&0x03f)<<16);
sys->io_oled.o_a|= ((pix >> 11) & 0x01f)<< 9;
sys->io_oled.o_a|= ((pix >> 5) & 0x03f) ;
sys->io_oled.o_b = ((pix >> 11) & 0x01f)<<17;
sys->io_oled.o_b|= ((pix >> 5) & 0x03f)<< 8;
sys->io_oled.o_b|= ((pix ) & 0x01f)<< 1;
 
// Make certain we had finished with the port (should've ...)
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
 
// and send our new command
sys->io_oled.o_ctrl = ctrl;
 
// To be nice to whatever routine follows, we'll wait 'til the port
// is clear again.
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
}
 
void entry(void) {
unsigned user_regs[16];
for(int i=0; i<15; i++)
user_regs[i] = 0;
user_regs[15] = (unsigned int)idle_task;
zip_restore_context(user_regs);
 
// Clear the PIC. We'll come back and use it later.
zip->pic = CLEARPIC;
 
if (0) { // Wait till we've had power for at least a quarter second
int pwrcount = sys->io_pwrcount;
do {
pwrcount = sys->io_pwrcount;
} while((pwrcount>0)&&(pwrcount < CLOCKFREQ_HZ/4));
} else {
int pwrcount = sys->io_pwrcount;
if ((pwrcount > 0)&&(pwrcount < CLOCKFREQ_HZ/4)) {
pwrcount = CLOCKFREQ_HZ/4 - pwrcount;
timer_delay(pwrcount);
}
}
 
// If the OLED is already powered, such as might be the case if
// we rebooted but the board was still hot, shut it down
if (sys->io_oled.o_data & 0x07) {
sys->io_oled.o_data = OLED_VCC_DISABLE;
// Wait 100 ms
timer_delay(CLOCKFREQ_HZ/10);
// Shutdown the entire devices power
sys->io_oled.o_data = OLED_POWER_DOWN;
// Wait 100 ms
timer_delay(CLOCKFREQ_HZ/10);
 
// Now let's try to restart it
}
 
// 1. Power up the OLED by applying power to VCC
// This means we need to apply power to both the VCCEN line as well
// as the PMODEN line. We'll also set the reset line low, so the
// device starts in a reset condition.
sys->io_oled.o_data = OLED_PMODEN|OLED_RESET_CLR;
timer_delay(4*MICROSECOND);
sys->io_oled.o_data = OLED_RESET;
timer_delay(4*MICROSECOND);
 
// 2. Send the Display OFF command
// This isn't necessary, since we already pulled RESET low.
//
// sys->io_oled.o_ctrl = OLED_DISPLAY_OFF;
//
 
// However, we must hold the reset line low for at least 3us, as per
// the spec. We may also need to wait another 2us after that. Let's
// hold reset low for 4us here.
timer_delay(4*MICROSECOND);
 
// Clear the reset condition.
sys->io_oled.o_data = OLED_RESET_CLR;
// Wait another 4us.
timer_delay(4*MICROSECOND);
 
// 3. Initialize the display to the default settings
// This just took place during the reset cycle we just completed.
//
oled_init();
 
// 4. Clear screen
// sys->io_oled.o_ctrl = OLED_CLEAR_SCREEN;
 
// Wait for the command to complete
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
 
// 5. Apply power to VCCEN
sys->io_oled.o_data = OLED_FULLPOWER;
// 6. Delay 100ms
timer_delay(CLOCKFREQ_HZ/10);
 
while(1) {
// 7. Send Display On command
// sys->io_oled.o_ctrl = OLED_CLEAR_SCREEN; // ?? What command is this?
sys->io_ledctrl = 0x0ff;
 
sys->io_oled.o_ctrl = OLED_DISPLAYON;
 
oled_clear();
 
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
sys->io_oled.o_ctrl = 0x2015005f;
 
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
sys->io_oled.o_ctrl = 0x2075003f;
 
sys->io_ledctrl = 0x0fe;
// Now ... finally ... we can send our image.
for(int i=0; i<6144; i++) {
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
sys->io_oled.o_data = splash[i];
}
sys->io_ledctrl = 0x0fc;
timer_delay(CLOCKFREQ_HZ*5);
timer_delay(CLOCKFREQ_HZ*5);
timer_delay(CLOCKFREQ_HZ*5);
timer_delay(CLOCKFREQ_HZ*5);
timer_delay(CLOCKFREQ_HZ*5);
 
 
for(int i=0; i<6144; i++) {
while(sys->io_oled.o_ctrl & OLED_BUSY)
;
sys->io_oled.o_data = mug[i];
}
 
sys->io_ledctrl = 0x0f0;
timer_delay(CLOCKFREQ_HZ*5);
}
 
zip_halt();
}
 
/sw/board/splash.c
0,0 → 1,815
////////////////////////////////////////////////////////////////////////////////
//
// Filename: splash.c
//
// Project: OpenArty, an entirely open SoC based upon the Arty platform
//
// Purpose: To encode and capture the image splash in a fashion that
// may be referenced from a C file and encoded directly into
// memory.
//
// WARNING! THIS FILE IS COMPUTER GENERATED. DO NOT TRY TO EDIT IT
//
// If you need to change this file, please adjust the image, or
// genoimage.cpp and rebuild this file instead.
//
// Creator: Dan Gisselquist, Ph.D.
// Gisselquist Technology, LLC
//
////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2016, Gisselquist Technology, LLC
//
// This program is free software (firmware): you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation, either version 3 of the License, or (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 MERCHANTIBILITY 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. (It's in the $(ROOT)/doc directory, run make with no
// target there if the PDF file isn't present.) If not, see
// <http://www.gnu.org/licenses/> for a copy.
//
// License: GPL, v3, as defined and found on www.gnu.org,
// http://www.gnu.org/licenses/gpl.html
//
//
////////////////////////////////////////////////////////////////////////////////
//
//
int splash[6144] = {
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xce79, 0x4228, 0x4228,
0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228,
0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x73ae, 0xffff, 0xffff,
0xffff, 0xffff, 0xce79, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228,
0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228,
0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228,
0x4228, 0x4228, 0xce79, 0xffff, 0xffff, 0xffff, 0xffff, 0x73ae,
0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228,
0x4228, 0x4228, 0x4228, 0x4228, 0xce79, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xce79, 0x1082, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4228, 0xffff, 0xffff,
0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0x4228,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xce79, 0x1082, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4228, 0xffff, 0xffff,
0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0x4228,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xce79, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4228, 0xffff, 0xffff,
0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0x4228,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xce79, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x4228, 0xffff, 0xffff,
0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0x4228,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xce79, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x3186, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae,
0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x9cd3, 0xffff, 0xffff,
0xffff, 0xffff, 0xdefb, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae,
0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae,
0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x632c, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0x9cd3,
0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae,
0x73ae, 0x73ae, 0x73ae, 0x73ae, 0xdefb, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xce79,
0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186,
0xef7d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xce79, 0x1082,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xef7d,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xce79, 0x1082, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xef7d, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xce79, 0x1082, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xef7d, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x1082, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x3186, 0xef7d, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x3186, 0xef7d, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x3186, 0xef7d, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xdefb, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7,
0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7, 0xbdd7,
0x8c51, 0x8c51, 0x8c51, 0x8c51, 0x8c51, 0xdefb, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x73ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x73ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x73ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x73ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x73ae, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x8c51, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xce79,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x9cd3, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xce79, 0x1082,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x9cd3, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xce79, 0x1082, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x8c51, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x632c, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xce79, 0x1082, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xad75, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x632c, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xce79, 0x1082, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x632c, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xce79, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x632c,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x9cd3,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xce79, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0x632c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x9cd3, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xce79, 0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0x632c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228,
0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228, 0x4228,
0x1082, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0x632c, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xef7d,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x632c, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xef7d, 0xffff,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x632c, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x3186, 0xef7d, 0xffff, 0xffff,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x632c, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x3186, 0xef7d, 0xffff, 0xffff, 0xffff,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xbdd7, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0xbdd7, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x8c51, 0x73ae,
0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae,
0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae,
0x73ae, 0x73ae, 0x73ae, 0xef7d, 0xffff, 0xffff, 0xffff, 0xffff,
0x73ae, 0x73ae, 0x73ae, 0x73ae, 0x73ae, 0xdefb, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xdefb, 0x73ae, 0x73ae, 0x73ae,
0x73ae, 0x73ae, 0xdefb, 0xffff, 0xbddd, 0x2117, 0x4239, 0xef7f,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x1097, 0x0016, 0x0016, 0x633a,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xad5c, 0x0016, 0x0016, 0x0016, 0x0016,
0xef7f, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x633a, 0x0016, 0x0016, 0x0016, 0x0016,
0xad5c, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0x633a, 0x0016, 0x2117, 0xce7e, 0xffff,
0xffff, 0xffff, 0xffff, 0x2117, 0x0016, 0x2117, 0x0016, 0x0016,
0x73ba, 0xffff, 0xffff, 0xffff, 0xffff, 0x9cdc, 0x0016, 0x0016,
0x9cdc, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0x73ba, 0x0016, 0x0016, 0x0016, 0x4239, 0xffff,
0xffff, 0xffff, 0xef7f, 0x0016, 0x0016, 0x73ba, 0x2117, 0x0016,
0x4239, 0xffff, 0xffff, 0xffff, 0xdefe, 0x0016, 0x0016, 0x0016,
0x0016, 0xce7e, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xdefe, 0x1097, 0x0016, 0x0016, 0x0016, 0x0016, 0xce7e,
0xffff, 0xffff, 0xad5c, 0x0016, 0x0016, 0xad5c, 0x52b9, 0x0016,
0x0016, 0xffff, 0xffff, 0xffff, 0x73ba, 0x0016, 0x0016, 0x0016,
0x0016, 0x4239, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0x633a, 0x0016, 0x0016, 0x73ba, 0x0016, 0x0016, 0x73ba,
0xffff, 0xffff, 0x73ba, 0x0016, 0x0016, 0xdefe, 0x8c5b, 0x0016,
0x0016, 0xce7e, 0xffff, 0xffff, 0x2117, 0x0016, 0x2117, 0x633a,
0x0016, 0x0016, 0xbddd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0016, 0x0016, 0x0016, 0x0016,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x633a, 0xdefe,
0xdefe, 0x0016, 0x0016, 0x2117, 0xffff, 0x2117, 0x0016, 0x3198,
0xffff, 0xffff, 0x4239, 0x0016, 0x1097, 0xffff, 0xbddd, 0x0016,
0x0016, 0x9cdc, 0xffff, 0xdefe, 0x0016, 0x0016, 0x73ba, 0xdefe,
0x0016, 0x0016, 0x4239, 0xffff, 0xad5c, 0x3198, 0x0016, 0x4239,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x0016, 0x0016, 0x0016, 0x0016,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0x0016,
0x2117, 0x0016, 0x0016, 0xad5c, 0xffff, 0x73ba, 0x0016, 0x0016,
0xdefe, 0xffff, 0x1097, 0x0016, 0x4239, 0xffff, 0xffff, 0x0016,
0x0016, 0x73ba, 0xffff, 0x8c5b, 0x0016, 0x0016, 0xbddd, 0xffff,
0x633a, 0x0016, 0x0016, 0x2117, 0x0016, 0x0016, 0x0016, 0x4239,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0x73ba, 0x73ba, 0x73ba, 0x73ba,
0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba,
0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba,
0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba,
0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba,
0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x73ba, 0x4239, 0x0016, 0x0016,
0x0016, 0x0016, 0x633a, 0xffff, 0xffff, 0xad5c, 0x0016, 0x0016,
0x9cdc, 0xdefe, 0x0016, 0x0016, 0x73ba, 0xffff, 0xffff, 0x3198,
0x0016, 0x4239, 0xffff, 0x52b9, 0x0016, 0x1097, 0xffff, 0xffff,
0xef7f, 0x1097, 0x0016, 0x0016, 0x0016, 0x0016, 0x633a, 0x9cdc,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xad5c, 0x4239,
0x4239, 0x73ba, 0xffff, 0xffff, 0xffff, 0xef7f, 0x0016, 0x0016,
0x633a, 0xad5c, 0x0016, 0x0016, 0xad5c, 0xffff, 0xffff, 0x633a,
0x0016, 0x0016, 0xffff, 0x1097, 0x0016, 0x52b9, 0xffff, 0xffff,
0xffff, 0xce7e, 0x52b9, 0x4239, 0x633a, 0xdefe, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x4239, 0x0016,
0x1097, 0x73ba, 0x0016, 0x0016, 0xef7f, 0xffff, 0xffff, 0x8c5b,
0x0016, 0x0016, 0x73ba, 0x0016, 0x0016, 0x8c5b, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x8c5b, 0x0016,
0x0016, 0x1097, 0x0016, 0x2117, 0xffff, 0xffff, 0xffff, 0xce7e,
0x0016, 0x0016, 0x0016, 0x0016, 0x0016, 0xdefe, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xce7e, 0x0016,
0x0016, 0x0016, 0x0016, 0x73ba, 0xffff, 0xffff, 0xffff, 0xffff,
0x2117, 0x0016, 0x0016, 0x0016, 0x2117, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0x3198,
0x0016, 0x0016, 0x0016, 0xce7e, 0xffff, 0xffff, 0xffff, 0xffff,
0x73ba, 0x0016, 0x0016, 0x0016, 0x73ba, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xbddd,
0x0016, 0x0016, 0x633a, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xef7f, 0x1097, 0x0016, 0x3198, 0xef7f, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xdefe, 0xbddd, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xef7f, 0xbddd, 0xef7f, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
};
 
/sw/board/zipsys.h
122,6 → 122,7
 
#define EINT(A) (0x80000000|(A<<16))
#define DINT(A) (0x80000000|(A<<16))
#define CLEARPIC 0x7fff7fff
 
static ZIPSYS *const zip = (ZIPSYS *)(ZIPSYS_ADDR);
 
/sw/host/Makefile
39,7 → 39,7
.PHONY: all
PROGRAMS := wbregs netuart wbsettime dumpflash wbprogram netsetup manping zipload zipstate zipdbg
SCOPES := eqspiscope etxscope erxscope cpuscope
all: $(PROGRAMS) $(SCOPES)
all: $(PROGRAMS) $(SCOPES) gps
CXX := g++
OBJDIR := obj-pc
BUSOBJS := $(OBJDIR)/ttybus.o $(OBJDIR)/llcomms.o $(OBJDIR)/regdefs.o
58,6 → 58,10
$(OBJDIR)/%.o: %.cpp
$(CXX) -g -c $< -o $@
 
.PHONY: gps
gps: $(BUSOBJS) $(OBJDIR)/scopecls.o
@bash -c "if [[ -e gps/Makefile ]]; then cd gps; make --no-print-directory; fi"
 
$(OBJDIR)/hsnetuart.o: netuart.cpp
$(CXX) -g -c -DHIGH_SPEED $< -o $@
 
73,6 → 77,9
$(CXX) -g $^ -o $@
hsnetuart: $(OBJDIR)/hsnetuart.o
$(CXX) -g $^ -o $@
#
# Some simple programs that just depend upon the ability to talk to the FPGA,
# and little more.
wbsettime: $(OBJDIR)/wbsettime.o $(BUSOBJS)
$(CXX) -g $^ -o $@
mtest: $(OBJDIR)/mtest.o $(BUSOBJS)
87,10 → 94,10
$(CXX) -g $^ -o $@
dumpflash: $(OBJDIR)/dumpflash.o $(BUSOBJS)
$(CXX) -g $^ -o $@
eqspiscope: $(OBJDIR)/eqspiscope.o $(OBJDIR)/scopecls.o $(BUSOBJS)
$(CXX) -g $^ -o $@
sdramscope: $(OBJDIR)/sdramscope.o $(OBJDIR)/scopecls.o $(BUSOBJS)
$(CXX) -g $^ -o $@
 
#
# Programs that depend upon not just the bus objects, but the flash driver
# as well.
wbprogram: $(OBJDIR)/wbprogram.o $(OBJDIR)/flashdrvr.o $(BUSOBJS)
$(CXX) -g $^ -o $@
zipload: $(OBJDIR)/zipload.o $(OBJDIR)/flashdrvr.o $(BUSOBJS)
98,6 → 105,12
 
 
## SCOPES
# These depend upon the scopecls.o, the bus objects, as well as their
# main file(s).
eqspiscope: $(OBJDIR)/eqspiscope.o $(OBJDIR)/scopecls.o $(BUSOBJS)
$(CXX) -g $^ -o $@
sdramscope: $(OBJDIR)/sdramscope.o $(OBJDIR)/scopecls.o $(BUSOBJS)
$(CXX) -g $^ -o $@
cfgscope: $(OBJDIR)/cfgscope.o $(OBJDIR)/scopecls.o $(BUSOBJS)
$(CXX) -g $^ -o $@
cpuscope: $(OBJDIR)/cpuscope.o $(OBJDIR)/scopecls.o $(BUSOBJS)
111,6 → 124,11
wbuscope: $(OBJDIR)/wbuscope.o $(OBJDIR)/scopecls.o $(BUSOBJS)
$(CXX) -g $^ -o $@
 
#
# The ZipDebugger is a bit more difficult to build, as it wants to be able
# to disassemble opcodes given to it. Hence, it depends upon the zparser.cpp,
# zopcodes.cpp, and twoc.cpp files from the ZipCPU build directory.
#
DBGRAW := zparser.cpp zopcodes.cpp twoc.cpp
DBGSRCS := $(addprefix $(ZIPD)/,$(DBGRAW))
DBGOBJS := $(addprefix $(OBJDIR)/,$(subst .cpp,.o,$(DBGRAW)))
/sw/host/cpuscope.cpp
67,7 → 67,7
class CPUSCOPE : public SCOPE {
public:
CPUSCOPE(FPGA *fpga, unsigned addr, bool vecread)
: SCOPE(fpga, addr, false, false) {};
: SCOPE(fpga, addr, false, vecread) {};
~CPUSCOPE(void) {}
virtual void decode(DEVBUS::BUSW val) const {
if (val & 0x80000000)

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.