Subversion Repositories Projects

Compare Revisions

Ignore whitespace Rev 740 → Rev 741

/C-OSD/trunk/C-OSD AGRESSiVA mod/C-OSD.aps
0,0 → 1,0
<AVRStudio><MANAGEMENT><ProjectName>C-OSD</ProjectName><Created>24-Mar-2009 01:26:47</Created><LastEdit>22-Feb-2010 22:48:32</LastEdit><ICON>241</ICON><ProjectType>0</ProjectType><Created>24-Mar-2009 01:26:47</Created><Version>4</Version><Build>4, 16, 0, 626</Build><ProjectTypeName>AVR GCC</ProjectTypeName></MANAGEMENT><CODE_CREATION><ObjectFile>default\C-OSD.elf</ObjectFile><EntryFile></EntryFile><SaveFolder>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\</SaveFolder></CODE_CREATION><DEBUG_TARGET><CURRENT_TARGET>AVR Simulator</CURRENT_TARGET><CURRENT_PART>ATmega162.xml</CURRENT_PART><BREAKPOINTS></BREAKPOINTS><IO_EXPAND><HIDE>false</HIDE></IO_EXPAND><REGISTERNAMES><Register>R00</Register><Register>R01</Register><Register>R02</Register><Register>R03</Register><Register>R04</Register><Register>R05</Register><Register>R06</Register><Register>R07</Register><Register>R08</Register><Register>R09</Register><Register>R10</Register><Register>R11</Register><Register>R12</Register><Register>R13</Register><Register>R14</Register><Register>R15</Register><Register>R16</Register><Register>R17</Register><Register>R18</Register><Register>R19</Register><Register>R20</Register><Register>R21</Register><Register>R22</Register><Register>R23</Register><Register>R24</Register><Register>R25</Register><Register>R26</Register><Register>R27</Register><Register>R28</Register><Register>R29</Register><Register>R30</Register><Register>R31</Register></REGISTERNAMES><COM>Auto</COM><COMType>0</COMType><WATCHNUM>0</WATCHNUM><WATCHNAMES><Pane0></Pane0><Pane1></Pane1><Pane2></Pane2><Pane3></Pane3></WATCHNAMES><BreakOnTrcaeFull>0</BreakOnTrcaeFull></DEBUG_TARGET><Debugger><modules><module></module></modules><Triggers></Triggers></Debugger><AVRGCCPLUGIN><FILES><SOURCEFILE>main.c</SOURCEFILE><SOURCEFILE>max7456_software_spi.c</SOURCEFILE><SOURCEFILE>usart1.c</SOURCEFILE><SOURCEFILE>characters.c</SOURCEFILE><SOURCEFILE>osd_helpers.c</SOURCEFILE><SOURCEFILE>osd_ncmode_default.c</SOURCEFILE><SOURCEFILE>osd_fcmode_default.c</SOURCEFILE><SOURCEFILE>config.c</SOURCEFILE><SOURCEFILE>spi.c</SOURCEFILE><SOURCEFILE>buttons.c</SOURCEFILE><SOURCEFILE>ppm.c</SOURCEFILE><SOURCEFILE>osd_ncmode_minimal.c</SOURCEFILE><SOURCEFILE>osd_fcmode_jopl.c</SOURCEFILE><HEADERFILE>mk-data-structs.h</HEADERFILE><HEADERFILE>max7456_software_spi.h</HEADERFILE><HEADERFILE>usart1.h</HEADERFILE><HEADERFILE>main.h</HEADERFILE><HEADERFILE>osd_helpers.h</HEADERFILE><HEADERFILE>config.h</HEADERFILE><HEADERFILE>spi.h</HEADERFILE><HEADERFILE>buttons.h</HEADERFILE><HEADERFILE>ppm.h</HEADERFILE><HEADERFILE>osd_ncmode_default.h</HEADERFILE><HEADERFILE>osd_ncmode_minimal.h</HEADERFILE><HEADERFILE>osd_fcmode_default.h</HEADERFILE><HEADERFILE>characters.h</HEADERFILE><HEADERFILE>osd_fcmode_jopl.h</HEADERFILE><OTHERFILE>default\C-OSD.lss</OTHERFILE><OTHERFILE>default\C-OSD.map</OTHERFILE><OTHERFILE>default\Makefile</OTHERFILE></FILES><CONFIGS><CONFIG><NAME>default</NAME><USESEXTERNALMAKEFILE>YES</USESEXTERNALMAKEFILE><EXTERNALMAKEFILE>default\Makefile</EXTERNALMAKEFILE><PART>atmega162</PART><HEX>1</HEX><LIST>1</LIST><MAP>1</MAP><OUTPUTFILENAME>C-OSD.elf</OUTPUTFILENAME><OUTPUTDIR>default\</OUTPUTDIR><ISDIRTY>1</ISDIRTY><OPTIONS/><INCDIRS/><LIBDIRS/><LIBS/><LINKOBJECTS/><OPTIONSFORALL>-Wall -gdwarf-2 -std=gnu99 -DF_CPU=16000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums</OPTIONSFORALL><LINKEROPTIONS></LINKEROPTIONS><SEGMENTS/></CONFIG></CONFIGS><LASTCONFIG>default</LASTCONFIG><USES_WINAVR>1</USES_WINAVR><GCC_LOC>C:\WinAVR-20100110\bin\avr-gcc.exe</GCC_LOC><MAKE_LOC>C:\WinAVR-20100110\utils\bin\make.exe</MAKE_LOC></AVRGCCPLUGIN><ProjectFiles><Files><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\mk-data-structs.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\max7456_software_spi.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\usart1.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\main.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_helpers.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\config.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\spi.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\buttons.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\ppm.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_ncmode_default.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_ncmode_minimal.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_fcmode_default.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\characters.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_fcmode_jopl.h</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\main.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\max7456_software_spi.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\usart1.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\characters.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_helpers.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_ncmode_default.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_fcmode_default.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\config.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\spi.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\buttons.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\ppm.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_ncmode_minimal.c</Name><Name>C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_fcmode_jopl.c</Name></Files></ProjectFiles><IOView><usergroups/><sort sorted="0" column="0" ordername="1" orderaddress="1" ordergroup="1"/></IOView><Files><File00000><FileId>00000</FileId><FileName>main.c</FileName><Status>257</Status></File00000><File00001><FileId>00001</FileId><FileName>mk-data-structs.h</FileName><Status>1</Status></File00001><File00002><FileId>00002</FileId><FileName>max7456_software_spi.h</FileName><Status>1</Status></File00002><File00003><FileId>00003</FileId><FileName>max7456_software_spi.c</FileName><Status>1</Status></File00003><File00004><FileId>00004</FileId><FileName>usart1.c</FileName><Status>1</Status></File00004><File00005><FileId>00005</FileId><FileName>usart1.h</FileName><Status>1</Status></File00005><File00006><FileId>00006</FileId><FileName>characters.c</FileName><Status>1</Status></File00006><File00007><FileId>00007</FileId><FileName>main.h</FileName><Status>1</Status></File00007><File00008><FileId>00008</FileId><FileName>osd_helpers.c</FileName><Status>1</Status></File00008><File00009><FileId>00009</FileId><FileName>osd_helpers.h</FileName><Status>1</Status></File00009><File00010><FileId>00010</FileId><FileName>osd_ncmode_default.c</FileName><Status>1</Status></File00010><File00011><FileId>00011</FileId><FileName>osd_fcmode_default.c</FileName><Status>1</Status></File00011><File00012><FileId>00012</FileId><FileName>config.c</FileName><Status>1</Status></File00012><File00013><FileId>00013</FileId><FileName>config.h</FileName><Status>1</Status></File00013><File00014><FileId>00014</FileId><FileName>spi.c</FileName><Status>1</Status></File00014><File00015><FileId>00015</FileId><FileName>spi.h</FileName><Status>1</Status></File00015><File00016><FileId>00016</FileId><FileName>buttons.c</FileName><Status>1</Status></File00016><File00017><FileId>00017</FileId><FileName>buttons.h</FileName><Status>1</Status></File00017><File00018><FileId>00018</FileId><FileName>ppm.c</FileName><Status>1</Status></File00018><File00019><FileId>00019</FileId><FileName>ppm.h</FileName><Status>1</Status></File00019><File00020><FileId>00020</FileId><FileName>osd_ncmode_minimal.c</FileName><Status>1</Status></File00020><File00021><FileId>00021</FileId><FileName>osd_ncmode_default.h</FileName><Status>1</Status></File00021><File00022><FileId>00022</FileId><FileName>osd_ncmode_minimal.h</FileName><Status>1</Status></File00022><File00023><FileId>00023</FileId><FileName>osd_fcmode_default.h</FileName><Status>1</Status></File00023><File00024><FileId>00024</FileId><FileName>characters.h</FileName><Status>1</Status></File00024><File00025><FileId>00025</FileId><FileName>osd_fcmode_jopl.c</FileName><Status>1</Status></File00025><File00026><FileId>00026</FileId><FileName>default\Makefile</FileName><Status>1</Status></File00026></Files><Events><Bookmarks></Bookmarks></Events><Trace><Filters></Filters></Trace></AVRStudio>
/C-OSD/trunk/C-OSD AGRESSiVA mod/CHANGE.LOG
0,0 → 1,239
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
20100218-2330
*hopefully fixed the laggy osd data problem
-send_data_mk has been striked out to save space
@nc-mode should be small enough for bootloader again ( Program: 14986 bytes (91.5% Full) )
 
20100216-1430
*some menu stuff
*stats in nc_default do not disturb the bigvario anymore
*reduced code size from 16088 bytes (98.2% Full) 15436 bytes (94.2% Full)
 
20100214-1700
+mah wasted per flight (still counts up after landing, but space gets tight)
*init phase from 2000ms to 3000ms
*init only takes place after first "valid" UBat is received (<4V should case the Mega to reset anyways)
 
20100212-2310
*adapted MK-datastructs to NC 0.18c
*added choice for current display measured by FC
 
20091109-1100
+fc-only mode by Josef "jopl" Plasil (MK3Mag on FC and no NC)
*usart1 routine to filter out unwanted datasets (also big thanks to jopl)
 
20091102-2205
+nc/fc software version display in bootup
*changed checkbytes because of previously removed EEPROM data
 
20091030-2222
*synced NaviStruct to NC Code v0.17e
(since nothing of the new stuff is used right now, older NC version will still work)
 
20090714-2100
*fixed the flags (hopefully) for C-Strom and stuff
 
20090706-2000
*hopefully fixed the new 10th number showing functions
+support for GPS height instead of Baro
 
20090703-0005
*write-number-functions changed, using itoa now, saves space, should be faster
*inline added for basic max7456-spi_send because saves procedure call (^= time)
 
20090627-1415
*ALL characters now in Progmem, from now on there will be only ONE char-file!
 
20090612-2100
*spi transfer now struct driven (needs C-Strom 20090612-2100 now!!!)
*lesser spi update rate (caused problems on some strom-slaves)
*voltage gets transfered via spi as well
*menu to switch display of 2nd voltage measured by C-Strom on and off
 
20090604-1350
*bugfix for stats
 
20090604-1330
*possible to choose between different osd-layouts (via menu)
 
20090604-0700
+(shaddi)osd_ncmode_minimal for less symbols during FPV
 
20090601-2233
*(woggle) changed timer init an interupt to be more precise
*(woggle) remove all warning during compile
*(woggle) simplify draw_big_variometer
*(woggle) put compass rose to PROGMEM
*(woggle) put directions array to PROGMEM
 
20090525-2305
+HUD on/off via RC (connect to PPM, according to manual) testing stuff
 
20090523-1150
+pal/ntsc changable in menu (applied immedeately!)
 
20090519-2245
*mah corrected
+config gets saved now (menu item!)
*source moved a bit
 
20090519-0115
+mah currently wasted
*some small changes
 
20090517-2345
*modded the real alpha stuff i have been talking about below
 
20090516-2345
+some really testing stuff 'bout current measurement, more to come
 
20090513-2350
*cellnumber autoconfig modified, offset set to 1,5V
*copy paste nick/roll error fixed
*clean after build in dist.sh
+a little shellscript to auto-build the files (testing)
*osd-layouts in seperate files so including own layouts should get easier
+build date is displayed during init to know which version you are runing
 
20090513-1040
*some code movement
+artificial horizon for FC-ONLY mode
 
20090512-2100
+some FCONLY basics (set FCONLY to 1 in main.h to use it)
 
20090511-2345
*battery voltages now calculated according to CELL_VOLT_MIN CELL_VOLT_MAX and CELL_NUM
*CELL_NUM -1 causes a rough auto detection of cell number
-UBAT_WRN and UBAT_MAX are now deprecated
 
20090427-2315
+write_gps_pos(...) (needs to be tested)
+gps position is shown in stats screen for testing purpose
 
20090427-2131
*stats are only collected while engines running (shaddi)
 
20090427-2102
*fixed maximum distance in stats (shaddi)
 
20090427-2050
*clear() now faster
*fixed calculation of max speed in stats (shaddi)
*littel typo in artificial horizon (thx joko)
*stats are only shown AFTER flight (more specific, after motors had been on at least once)
+indication icon for serial link (requires new character 198)
+indication icon for manual controll (stick > stick threshold)
(Character set 192 needs to be reflashed since new icon is in it)
 
20090420-0205
*reset-bug fixed
*moved code a bit
 
20090419-2145
*reset-bug workaround in usart1.c: usart1_DisableTXD and usart1_EnableTXD
 
20090419-1900
*fixed bug in heading-fine conv for bearing to home
 
20090419-1245
*compass characters bigger
*battery position
+voltage-symbol to battery-voltage
(Character Set 208 needs to be reflashed since compass chars are in it)
 
20090418-2015
*fixed bug in Character Set 128 (reflash it if you already flashed it!)
+another set of vario chars
*changed vario to use new characters
*moved vario/home-bearing positions
*big vario now enabled via menu or BIGVARIO
(Character Set 112 needs to be flashed)
 
20090418-1235
+big vario for testing purpose
(Character Set 192 needs to be flashed)
 
20090418-0100
*variometer uses more steps (9 instead of 5)
*home-arrow is now home-clock using more steps (22,5° resolution)
+visual battery-gauge according to difference between UBAT_WRN and UBAT_MAX
 
20090417-1115
*changed calculation of km/h (thx wowie)
*added JochenK_(joko)'s characters
(Character-Sets 128, 136, 144, 152, 160, 168, 176 and 184 need to be flashed!)
 
20090408-1245 (shaddi)
*fixed distance towards home
 
20090408-0035
*rewrote number->display functions
*fixed height bug (uint vs int)
 
20090407-2100
+added request of OSD data, disrequest of debug data and uptime reset to menu
-removed the uptime-reset binding from S2
+pgm space for some strings to save _normal_ data space
*some code movement
 
20090406-0130
*MK-Datastruct updated to work with NaviCtrl 0.15c firmware
*changed flags from NO* to invers versions
*enhanced the menu a bit
-artificial horizon at bootup, the menu is cooler imho
 
20090405-0207
+NOOSD as requested
*height now corrected (thx lephisto) and displayed as .x up to 10m
 
20090402-0106
+ disabling the txd pin while not using it so it won't interfere with KopterTool usage (thx joko)
+ if no data has been received for over 2sec we re-request it
* tried source organisation a bit
 
20090401-1741 (shaddi)
+ More precise Veriometer. Uses more more characters to show the speed of the movement
(Character-Set 232 needs to be flashed!)
 
20090331-1549
+ simple config menu during runtime, press S1 to jump in, S2 to cyle and S1 to accept choice
- S1 no longer requests the NC data
 
20090331-1305
+ added more statistics
* corrected S1/S2 mapping (d'oh)
+ started simple mode controll, press S2 during bootup toggles artificial horizon
 
20090329-1452
* fixed bearing to home
+ added flight stats (shown while engines off)
+ sat icon should indicate PH/CH/Free now
+ you need to flash characters 224-231 if you were using previous versions
 
20090327-2140
* fixed km/h (was cm/s)
* fixed height m (was dm)
* modified incoming data speed to 100ms (was 200ms)
 
20090326-2031
+ first binary release
/C-OSD/trunk/C-OSD AGRESSiVA mod/LICENSE.TXT
0,0 → 1,340
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
 
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
 
Preamble
 
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
 
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
 
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
 
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
 
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
 
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
 
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
 
The precise terms and conditions for copying, distribution and
modification follow.
 
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
 
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
 
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
 
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
 
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
 
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
 
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
 
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
 
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
 
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
 
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
 
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
 
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
 
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
 
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
 
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
 
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
 
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
 
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
 
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
 
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
 
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
 
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
 
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
 
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
 
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
 
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
 
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
 
NO WARRANTY
 
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
 
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
 
END OF TERMS AND CONDITIONS
 
How to Apply These Terms to Your New Programs
 
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
 
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
 
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 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
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 
 
Also add information on how to contact you by electronic and paper mail.
 
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
 
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
 
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
 
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
 
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
 
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
 
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
/C-OSD/trunk/C-OSD AGRESSiVA mod/README.TXT
0,0 → 1,61
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
Look at
http://www.mylifesucks.de/oss/c-osd/
to see what this is all about.
 
Simple way:
- Flash C-OSD-characters-(pal|ntsc).hex
- the 3rd LED (green one) should blink now
- wait till all chars appear on screen and ALL 4 LEDs are on
- Flash C-OSD-*-(pal|ntsc).hex acording to your needs
 
If you already have flashed a specific character file (or more) and you just want to
update the software itself, you do not need to flash the character files again.
 
Instructions:
Connect the "To FC" port from EPi-OSD to the Debug port of the NaviCtrl.
You will need NaviCtrl 0.18c soft to fully enjoy the software.
 
S1 enters a menu where you can cycle through using S2 and toggle/accept choice with S1
 
You can connect a spare RC-Channel to the PPM connector and enable/disable the HUD remotely with it, hopefully.
 
Known Problems:
When using the EPi-OSD, NaviCtrl and another Pc-Connection (direct or via wireless connections like bluetooth, WI232, WiFi and such) on the same wire there might be data collisions causing laggy screen updates, and in some hypothetical cases that are not scientifically proven, harm to the Atmega and other attached Hardware. So it is not recommended to use the stuff like that, altough some people are and not experiencing any problems at all.
Software may fry your cat when flashing the micro-oven with it, or even when using the software near a micro-oven.
 
How To Flash the software (the MK-user way):
Requirements:
- Windows PC with a real SerialPort
- PonyProg (http://www.LancOS.com)
- SerCon
HowTo:
- Connect the ISP1 from SerCon to the ISP connector of the EPi-OSD board using a
normal 1:1 cable
- Set the Jumper on the SerCon
- SetUp PonyProg
Setup -> Interfac Setup
and select the correct Serial Port and "SI Prog API"
- Select Chip manufacturer "AVR micro" and Chip "ATMega162"
- If this is the first time using you board check the fuses (only BOD1LEVEL and EESAVE are checked)
- Open the .hex file and Writa All (Ctrl+W)
- Hopefully done :)
/C-OSD/trunk/C-OSD AGRESSiVA mod/buttons.c
0,0 → 1,42
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include <avr/io.h>
#include <util/delay.h>
#include "main.h"
 
/* ##########################################################################
* debounce buttons
* ##########################################################################*/
int s1_pressed() {
if (S1_PRESSED) {
_delay_ms(25);
if (S1_PRESSED) return 1;
}
return 0;
}
 
int s2_pressed() {
if (S2_PRESSED) {
_delay_ms(25);
if (S2_PRESSED) return 1;
}
return 0;
}
/C-OSD/trunk/C-OSD AGRESSiVA mod/buttons.h
0,0 → 1,25
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
/* ##########################################################################
* debounce buttons
* ##########################################################################*/
int s1_pressed();
int s2_pressed();
/C-OSD/trunk/C-OSD AGRESSiVA mod/c-osd.aws
0,0 → 1,0
<AVRWorkspace><IOSettings><CurrentRegisters/></IOSettings><part name="ATMEGA162"/><Files><File00000 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\main.c" Position="393 137 1391 603" LineCol="4 47" State="Maximized"/><File00001 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\mk-data-structs.h" Position="418 162 1433 623" LineCol="41 0" State="Maximized"/><File00002 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\max7456_software_spi.h" Position="443 187 1458 648" LineCol="0 0" State="Maximized"/><File00003 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\max7456_software_spi.c" Position="468 212 1483 673" LineCol="162 0" State="Maximized"/><File00004 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\usart1.c" Position="493 237 1508 698" LineCol="42 0" State="Maximized"/><File00005 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\usart1.h" Position="518 262 1533 723" LineCol="0 0" State="Maximized"/><File00006 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\characters.c" Position="385 107 1620 810" LineCol="5925 0" State="Maximized"/><File00007 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\main.h" Position="568 312 1583 773" LineCol="20 0" State="Maximized"/><File00008 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_helpers.c" Position="593 337 1608 798" LineCol="229 0" State="Maximized"/><File00009 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_helpers.h" Position="393 137 1408 598" LineCol="69 0" State="Maximized"/><File00010 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_ncmode_default.c" Position="418 162 1433 623" LineCol="0 0" State="Maximized"/><File00011 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_fcmode_default.c" Position="443 187 1458 648" LineCol="104 0" State="Maximized"/><File00012 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\config.c" Position="468 212 1483 673" LineCol="90 55" State="Maximized"/><File00013 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\config.h" Position="493 237 1508 698" LineCol="0 0" State="Maximized"/><File00014 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\spi.c" Position="518 262 1533 723" LineCol="0 0" State="Maximized"/><File00015 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\spi.h" Position="543 287 1558 748" LineCol="0 0" State="Maximized"/><File00016 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\buttons.c" Position="568 312 1583 773" LineCol="0 0" State="Maximized"/><File00017 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\buttons.h" Position="593 337 1608 798" LineCol="0 0" State="Maximized"/><File00018 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\ppm.c" Position="393 137 1408 598" LineCol="0 0" State="Maximized"/><File00019 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\ppm.h" Position="418 162 1433 623" LineCol="0 0" State="Maximized"/><File00020 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_ncmode_minimal.c" Position="443 187 1458 648" LineCol="0 0" State="Maximized"/><File00021 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_ncmode_default.h" Position="468 212 1483 673" LineCol="0 0" State="Maximized"/><File00022 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_ncmode_minimal.h" Position="493 237 1508 698" LineCol="0 0" State="Maximized"/><File00023 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_fcmode_default.h" Position="518 262 1533 723" LineCol="7 0" State="Maximized"/><File00024 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\characters.h" Position="543 287 1558 748" LineCol="24 0" State="Maximized"/><File00025 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\osd_fcmode_jopl.c" Position="568 312 1583 773" LineCol="26 0" State="Maximized"/><File00026 Name="C:\Users\eduardo\Desktop\C-OSD 18_02_2010\default\Makefile" Position="593 337 1608 798" LineCol="79 0" State="Maximized"/></Files></AVRWorkspace>
/C-OSD/trunk/C-OSD AGRESSiVA mod/c-osd.mcm
0,0 → 1,16385
MAX7456
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101000
01010101
01010010
10101000
01010101
01010010
10101000
01010101
01010000
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010100
00101000
00010101
01010010
10101010
10000101
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
10000000
10101000
00101010
00010101
00101000
01000000
01010101
00101000
01010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000101
01010101
00101010
00010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
01000001
01010101
00101000
01010101
01000000
10101000
01010101
00101010
10100001
01010101
00101010
10100001
01010101
01000000
10101000
01000001
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010101
01010101
01010010
10000101
01010101
01001010
10000101
01010101
00101010
10000101
01010100
10101010
10000101
01010010
10100010
10000101
01001010
10000010
10000101
00101010
00010010
10000101
00101000
00000010
10000001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00000010
10000001
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010100
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
00101000
00000000
00000001
00101000
00000000
00010101
00101010
10101010
10000101
00101010
10101010
10100001
01000000
00000000
10101000
01010101
01010101
00101000
01010101
01010101
00101000
01000001
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
01000001
00101000
00000000
00010101
00101010
10101010
10000101
00101010
10101010
10100001
00101000
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00000000
00101000
01010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000101
01010101
00101010
00010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00000000
00101000
01001010
10101010
10101000
01010010
10101010
10101000
01010100
00000000
00101000
01000001
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01001010
10000010
10100001
00101010
00010100
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
00000000
00101000
00101010
10101010
10101000
00101010
10101010
10101000
00101000
00000000
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00010101
00101010
10101010
10000101
00101010
10101010
10100001
00101000
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
00000000
10101000
00101010
10101010
10100001
00101010
10101010
10100001
00101000
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
00000000
10101000
00101010
10101010
10100001
00101010
10101010
10000101
01000000
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
01000001
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01000001
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000001
01010101
00101010
10101000
01010101
00101010
10101010
00010101
00101000
00001010
10000101
00101000
01010010
10100001
00101000
01010100
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010100
10101000
00101000
01010010
10100001
00101000
00001010
10000101
00101010
10101010
00010101
00101010
10101000
01010101
01000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
00101000
00000000
00000001
00101000
01010101
01010101
00101000
01010101
01010101
00101000
00000000
00010101
00101010
10101010
10000101
00101010
10101010
10000101
00101000
00000000
00010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
00101000
00000000
00000001
00101000
01010101
01010101
00101000
01010101
01010101
00101000
00000000
00010101
00101010
10101010
10000101
00101010
10101010
10000101
00101000
00000000
00010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000010
10100001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
01000001
00101000
01000000
00000001
00101000
00101010
10101000
00101000
00101010
10101000
00101000
01000000
00101000
00101000
01010101
00101000
00101010
00000000
00101000
01001010
10101010
10101000
01010010
10101010
10101000
01010100
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
00000000
00101000
00101010
10101010
10101000
00101010
10101010
10101000
00101000
00000000
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01010010
10101010
10000101
01010100
00101000
00010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010100
00101000
00010101
01010010
10101010
10000101
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000001
01010101
00101010
10101000
01010101
00101010
10101000
01010101
01000010
10000001
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010010
10000101
01000001
01010010
10000101
00101000
01010010
10000101
00101010
00001010
10000101
01001010
10101010
00010101
01010010
10101000
01010101
01010100
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010100
10101000
00101000
01010010
10100001
00101000
01001010
10000101
00101000
00101010
00010101
00101000
10101000
01010101
00101010
10100001
01010101
00101010
10100001
01010101
00101000
10101000
01010101
00101000
00101010
00010101
00101000
01001010
10000101
00101000
01010010
10100001
00101000
01010100
10101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101010
00010100
10101000
00101010
10000010
10101000
00101010
10101010
10101000
00101000
10101010
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
01000001
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101010
00010101
00101000
00101010
10000101
00101000
00101010
10000101
00101000
00101000
10100001
00101000
00101000
10100001
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
01001010
00101000
00101000
01001010
00101000
00101000
01010010
10101000
00101000
01010010
10101000
00101000
01010100
10101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00010101
00101010
10101010
10000101
00101010
10101010
10100001
00101000
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
00000000
10101000
00101010
10101010
10100001
00101010
10101010
10000101
00101000
00000000
00010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01000001
00101000
00101000
00101000
00101000
00101000
00101010
00101000
00101000
01001010
10101000
00101010
00000010
10100001
01001010
10101010
10101000
01010010
10101000
00101000
01010100
00000001
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00010101
00101010
10101010
10000101
00101010
10101010
10100001
00101000
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
00000000
10101000
00101010
10101010
10100001
00101010
10101010
10000101
00101000
10101000
00010101
00101000
00101010
00010101
00101000
01001010
10000101
00101000
01010010
10100001
00101000
01010100
10101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00000101
01010010
10101010
10100001
01001010
10101010
10101000
00101010
00000000
00101000
00101000
01010101
01000001
00101000
01010101
01010101
00101010
00000000
00010101
01001010
10101010
10000101
01010010
10101010
10100001
01010100
00000000
10101000
01010101
01010101
00101000
01000001
01010101
00101000
00101000
00000000
10101000
00101010
10101010
10100001
01001010
10101010
10000101
01010000
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00101000
00000001
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00010100
10101000
01001010
10000010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01000001
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101010
10101010
10101000
01001010
10101010
10100001
01010010
10000010
10000101
01010100
00010100
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00010100
10101000
01001010
10000010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010100
10101010
00010101
01010010
10101010
10000101
01001010
10000010
10100001
00101010
00010100
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00010100
10101000
01001010
10000010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00000000
00101000
01010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000101
01010101
00101010
00010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000101
01010101
00101010
00010101
01010101
00101000
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01010010
10101010
10100001
01010100
00000000
10101000
01010100
00000000
00101000
01010010
10101010
00101000
01001010
10101010
10101000
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10101000
01010010
10101010
00101000
01010100
00000000
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01000000
01010101
00101000
00101010
00010101
00101000
10101010
10000101
00101010
10100010
10100001
00101010
10000100
10101000
00101010
00010101
00101000
00101010
00010101
00101000
00101010
00010101
00101000
00101010
10000100
10101000
00101010
10100010
10100001
00101000
10101010
10000101
00101000
00101010
00010101
01000001
01000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
01000001
00101000
01010101
01000001
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
00000001
00101000
01010100
10101000
00101000
01010010
10101010
00101000
01001010
10001010
10101000
00101010
00010010
10101000
00101000
01010100
10101000
00101000
01010100
10101000
00101000
01010100
10101000
00101010
00010010
10101000
01001010
10001010
10101000
01010010
10101010
00101000
01010100
10101000
00101000
01010101
00000001
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
00000000
00101000
00101010
10101010
10101000
00101010
10101010
10100001
00101000
00000000
00000101
00101000
01010101
00000001
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
00000101
01010101
01001010
10100001
01010101
00101010
10100001
01010101
00101000
00000101
01010000
00101000
00000101
01001010
10101010
10100001
01001010
10101010
10100001
01010000
00101000
00000101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10101000
01010010
10101010
00101000
01010100
00000000
00101000
01010000
01010101
00101000
01001010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01000000
01010101
00101000
00101010
00010101
00101000
10101010
10000101
00101010
10100010
10100001
00101010
10000100
10101000
00101010
00010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010100
00000001
01010101
01010010
10101000
01010101
01010010
10101000
01010101
01010100
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101010
00010101
01010101
01001010
10000101
01010101
01010010
10000101
01010101
01010100
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010101
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010100
00010101
01010101
01000000
00010101
01010101
00101010
10000101
01010101
00101010
10000101
01010101
01000010
10000101
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010010
10000101
01010100
00001010
10000101
01010010
10101010
00010101
01010010
10101000
01010101
01010100
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01000001
00101000
01010101
00101000
00101000
01010100
10101000
00101000
01010010
10100001
00101000
01001010
10000101
00101000
00101010
00010101
00101000
10101000
01010101
00101010
10101010
00010101
00101010
10001010
10000101
00101010
00010010
10100001
00101000
01010100
10101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
00000000
00010101
00101000
10101010
10000101
00101010
10101010
10100001
00101010
00101000
10101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
01000001
01000001
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
00000000
00010101
00101000
10101010
10000101
00101010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
00000000
00010101
00101000
10101010
10000101
00101010
10101010
10100001
00101010
10000000
10101000
00101010
00010101
00101000
00101010
00010101
00101000
00101010
00010101
00101000
00101010
10000000
10101000
00101010
10101010
10100001
00101000
10101010
10000101
00101000
00000000
00010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
01000001
01010010
10101010
00101000
01001010
10101010
10101000
00101010
00000010
10101000
00101000
01010100
10101000
00101000
01010100
10101000
00101000
01010100
10101000
00101010
00000010
10101000
01001010
10101010
10101000
01010010
10101000
10101000
01010100
00000001
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01000000
00010101
00101000
00101010
10000101
00101000
10101010
10100001
00101010
10100000
10101000
00101010
10000101
00101000
00101010
00010101
01000001
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101010
00000001
00101000
01001010
10101000
00000001
01010000
10101010
10000101
01000001
00001010
10100001
00101000
01010000
10101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010100
00101000
00010101
01010010
10101010
10000101
01010010
10101010
10000101
01010100
00101000
00010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101010
00010101
01010101
01001010
10000101
01010101
01010010
10000101
01010101
01010100
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00000000
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101010
00010100
10101000
01001010
10000010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01000001
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101000
00101010
00101000
10101000
01001010
10101010
10100001
01010010
10000010
10000101
01010100
00010100
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101010
00010100
10101000
01001010
10000010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01001010
10000010
10100001
00101010
00010100
10101000
00101000
01010101
00101000
01000001
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01000001
00101000
01010101
00101000
00101000
01010101
00101000
00101000
01010100
10101000
00101000
01010100
10101000
00101000
01010010
10101000
00101010
00001010
10101000
01001010
10101010
00101000
01010010
10101000
00101000
01010100
00000001
00101000
01010100
00000000
10101000
01010010
10101010
10100001
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00000000
10101000
01010101
01010010
10100001
01010101
01001010
10000101
01010101
00101010
00010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000101
01010101
01010100
10100001
01010101
01010010
10000101
01010101
01001010
00010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01001010
00010101
01010101
01010010
10000101
01010101
01010100
10100001
01010101
01010101
00000101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010101
01010101
01010010
10000101
01010101
01010100
10100001
01010101
01010101
00101000
01010101
01010101
01001010
00010101
01010101
01001010
00010101
01010101
01001010
00010101
01010101
01001010
00010101
01010101
01001010
00010101
01010101
01001010
00010101
01010101
01001010
00010101
01010101
00101000
01010101
01010100
10100001
01010101
01010010
10000101
01010101
01010100
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010101
01010101
01010010
10000101
01010101
01010010
10000101
01010101
01010100
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
00000000
10101000
00101000
01010101
00101000
01000001
01010101
00101000
01010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000101
01010101
00101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010100
10100001
01010101
01010010
10000101
01010101
01010100
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010100
10100001
01010101
01010010
10000101
01010101
01010100
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010001
01010101
01010101
01001000
01010101
01010101
00101010
00010101
01010101
01001010
00010101
01010101
01010010
00010101
01010101
01010010
00010101
01010101
01001000
01010101
01010101
01010001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000101
01010101
00101010
00010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000101
01010101
00101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
01010101
00010101
01010010
00010100
10000101
01001010
10000010
10100001
01010010
10000100
10100001
01010100
10000101
00100001
01010100
10000101
00100001
01010010
00010100
10000101
01010100
01010101
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000101
01010100
10101010
10100001
01010100
10101010
10100001
01010101
00000000
00000101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000101
01010101
01010100
10100001
01010101
01010010
10100001
01010101
01001010
10000101
01010101
00101010
00010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000101
01010101
01001010
10000101
01010101
01010010
10100001
01010101
01010100
10101000
01010101
01010101
00101010
00010101
01010101
01001010
10000101
01010101
01010010
10100001
01010101
01010100
10100001
01010101
01010101
00000101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
01010101
01010101
01001010
00010101
01010101
01001010
10000101
01010101
01010010
10100001
01010101
01010100
10101000
01010101
01010101
00101010
00010101
01010101
01001010
10000101
01010101
01010010
10100001
01010101
01010010
10100001
01010101
01001010
10000101
01010101
00101010
00010101
01010100
10101000
01010101
01010010
10100001
01010101
01001010
10000101
01010101
01001010
00010101
01010101
01010000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
01010101
01010100
10101010
00010101
01010010
00000000
10000101
01001000
00000100
00100001
00100000
10100010
00001000
00100010
00001010
00001000
00100010
00000010
00001000
00100010
00001010
00001000
00100000
10100010
00100001
00100001
00000100
10000101
01001000
01010101
00000101
01010010
00000000
00100001
01010100
10101010
10000101
01010101
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101010
10101010
10101010
01010101
01010101
01010110
01010101
01011001
01010110
01010101
01011001
01011001
01010101
01011001
01100101
01010101
01011010
10010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010110
10010101
01010101
01101010
01010101
01010110
10010110
01010101
01101001
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01101010
10101010
10101010
01100101
01010101
01010110
01100101
01010101
01010110
01100101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011010
10101010
10101001
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01101010
10101010
10101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01101010
10101010
10101010
01010101
01011010
01010101
01010101
01100110
01010101
01010101
01100110
01010101
01010101
10010110
01010101
01010101
10010110
01010101
01010110
01010110
01010101
01011001
01010110
01010101
01100101
01010110
01010101
01010101
01010110
01010101
01010101
01011010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01101010
10101010
10101010
01010101
01011001
01010110
01010101
01011001
01010110
01010101
01100101
01010110
01010101
01100101
01010110
01010101
01100101
01010110
01010101
10010101
01010110
01010101
10010101
01010110
01010110
01010101
01010110
01010110
01010101
01010110
01011001
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01011010
10101010
10100101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01011001
01010101
01101010
10101010
10101010
01010101
01011001
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10101010
10101010
01010101
10010101
01010110
01010110
01010101
01010110
01011001
01010101
01010110
01100101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01101010
01010101
01011010
10010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011010
10101010
10101010
01011001
01010110
01010101
01100101
01010110
01010101
01100101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010110
10010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011010
10101010
10101001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01011010
10101010
10101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
01010101
01100101
01010110
01010101
01100101
01101010
10101010
10101010
01010110
01010101
01100101
01010110
01010101
01100101
01010110
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01011010
01010101
01010101
10100101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101010
10010101
01010101
01010101
01100101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
01101010
10010101
01010110
01010101
01100101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010110
10010101
01101010
10101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101010
10101010
10101001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01011010
01010101
01010101
01100101
10010101
01010101
10010101
01100101
01010110
01010101
01011001
01101001
01010101
01010110
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01101010
10101010
01101010
10010101
01010110
01010110
01010101
01011001
01010110
01010101
01100101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010101
10010101
01010101
01010101
01101010
10101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
01100101
01010101
01010110
01011001
01010101
01010110
01011001
01010101
01010110
01010110
01010101
01010110
01010101
10010101
01010110
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01101001
01010101
01011010
10010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01101010
10101010
01010101
10010101
01010110
01010101
10010101
01010110
01010110
01010101
01010110
01101001
01100101
01011001
01010101
01011010
01011001
01010101
01010101
10100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01011010
01010101
01010101
10100101
01010101
01101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01100101
01010101
01010110
10010101
01010101
01101001
01010101
01010110
10010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01101010
10101010
10101010
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01011010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01100101
10010101
01011001
01100101
10010101
01011001
01011001
01100101
01011001
01011001
01100101
01011001
01011001
01100101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
10100101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
10101010
10100101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101010
10101010
10101010
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01011010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
10010101
01010101
01010110
01101001
01010101
01010110
01010110
01010101
01010110
01010101
10010101
01010110
01010101
01100101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01101010
10101010
10101010
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01011010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
10101010
10100101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101010
10101010
10101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
10101010
10101001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
10010101
01100101
01010101
01100101
01100101
01010101
01011001
10010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01011001
10010101
01010101
10100101
01100101
01011010
01010101
01011001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010101
01010110
01010101
01010101
01010101
01010101
01011010
10101010
10101001
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01011010
01010101
01010101
01101001
10100101
01010110
10011001
01011001
01101001
01011001
01010110
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01011010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01100101
10010101
01010101
01100101
10010101
01010101
01100101
01100101
01010101
10010101
01100101
01010101
10010101
01100101
01010101
10010101
01100101
01010110
01010101
01011001
01010110
01010101
01011001
01010110
01010101
01011001
01011001
01010101
01010110
01011001
01010101
01010110
01011001
01010101
01010110
01100101
01010101
01010110
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
10101001
01101010
10101010
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01011001
01010101
01010110
01010110
10101010
10101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101010
10101010
10101001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01101001
01010101
01010110
10010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10010101
01010101
01010101
10100101
01010101
01010110
01100101
01010101
01010110
01011001
01010101
01011001
01010110
01010101
01011001
01010110
01010101
01100101
01010101
10010101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01011001
01010101
01010101
01010110
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01101010
10101010
10101010
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010110
01011001
01100101
01010110
01011001
01100101
01011001
01011001
01011001
01011001
01011001
01011001
01011001
01011001
01011001
01100101
01011001
01010110
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101010
10101010
10101010
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
01011001
01010110
01010101
01100101
01010101
10010101
10010101
01010101
01101010
01010101
01010101
01011001
01010101
01010101
01010110
01010101
01010101
01010101
10010101
01010101
01010101
01100101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011010
10100101
01010101
01010101
01011010
01010101
01010101
01010101
10100101
01010101
01010101
01010101
01011010
10100101
01010101
01010101
01011010
01010101
01010101
01010101
10100101
01010101
01010101
01010101
01010101
01010101
01010101
01011010
10100101
01010101
01010101
01011010
01010101
01010101
01010101
10100101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01010101
10010110
01010101
01010110
01010101
10010101
01010110
01010101
10010101
01011001
01010101
01100101
01011001
01011010
10100101
01101010
10100101
01011001
01010101
01010101
01010110
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
10010101
01100101
01010101
01101001
01100101
01010101
01010110
10010101
01010101
01010101
10010101
01010101
01010110
01100101
01010101
01010110
01011001
01010101
01011001
01010110
01010101
01100101
01010101
01010110
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011010
10101010
10101001
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01101010
10101010
10101010
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01011010
10101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
10101010
10101000
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
10101010
10101000
00000000
00000000
00000000
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
10101010
10101000
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
10101010
10101000
00000000
00000000
00000000
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
10101010
10101000
00000000
00000000
00000000
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
10101010
10101000
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
01010101
01010100
00000000
00010101
01010000
00000000
00000101
01000000
00000000
00000001
00000000
00000000
00000000
00000000
00000000
00000000
01010101
00000000
01010101
01010100
00000000
00010101
01010000
00000000
00000101
01000000
00000000
00000001
00000000
00000000
00000000
00000000
00000000
00000000
01010101
00000000
01010101
01010100
00000000
00010101
01010000
00000000
00000101
01000000
00000000
00000001
00000000
00000000
00000000
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
00000000
00000000
00000000
01000000
00000000
00000001
01010000
00000000
00000101
01010100
00000000
00010101
01010101
00000000
01010101
00000000
00000000
00000000
00000000
00000000
00000000
01000000
00000000
00000001
01010000
00000000
00000101
01010100
00000000
00010101
01010101
00000000
01010101
00000000
00000000
00000000
00000000
00000000
00000000
01000000
00000000
00000001
01010000
00000000
00000101
01010100
00000000
00010101
01010101
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
00101010
10101010
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
00000000
00000000
00000000
00101010
10101010
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
00000000
00000000
00000000
00101010
10101010
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
00101010
10101010
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
00000000
00000000
00000000
00101010
10101010
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
00101010
10101010
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101010
10101010
10101001
01100101
01010101
01011001
01100101
01010101
01011001
01100101
01010101
01011001
01100101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01011010
01010101
01010110
10100101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01100101
01010101
01010101
01011010
01010101
01010110
01010101
10100101
01010110
01010101
01011001
01010110
01010101
01010101
01010110
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01101001
01010101
01011010
10010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
10010110
01010101
01010101
01100101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
10101001
01101010
10101010
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01011001
01010101
01010110
01010110
10101010
10101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010101
10010110
01010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01101010
10101010
10101001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01101001
01010101
01010110
10010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010101
10010110
01010101
01010101
01101001
01010101
01011001
01010101
01010101
01011001
01010101
01101010
10101010
10101001
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010110
01011001
01100101
01010110
01011001
01100101
01011001
01011001
01011001
01011001
01011001
01011001
01011001
01011001
01011001
01100101
01011001
01010110
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
10010110
01010101
01010101
01100101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
10101001
01101010
10101010
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
01011001
01010101
01010110
01010110
10101010
10101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
10010110
01010101
01010101
01100101
01010101
01011001
01010101
01010101
01011001
01010101
01101010
10101010
10101001
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010110
01011001
01100101
01010110
01011001
01100101
01011001
01011001
01011001
01011001
01011001
01011001
01011001
01011001
01011001
01100101
01011001
01010110
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
10010110
01010101
01010101
01100101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10101010
10101010
01010101
10010101
01010110
01010110
01010101
01010110
01011001
01010101
01010110
01100101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01101010
01010101
01011010
10010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000101
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100000
00010101
01010101
00100010
00010101
01010101
00101000
00000000
01010101
00100010
00101000
01010101
00000100
00100010
00010101
01010101
00101000
01010101
01010101
00100000
00010101
01010101
00100000
10000101
01010101
00000000
10000000
01010101
01010100
10101000
01010101
01010100
10001000
01010101
01010100
10001000
01010101
01010100
00010000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011010
01010101
10010101
01100000
10010110
00100101
10001010
00101000
10001001
10001010
00100010
00100101
01100000
10001000
10010101
01011010
00100010
10010101
01011000
10001000
00100101
01100010
00100010
10001001
10001000
10100010
10001001
01100010
01011000
00100101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00100010
00100010
00000000
10010101
01010100
10101000
00010101
01010101
00101000
10010101
01010100
10001000
00010101
01010010
00010010
10010101
01001000
01010100
00010101
00100001
01010110
10000100
10000101
01010100
00100010
00010101
01010110
00101000
01010101
01010100
00101010
00010101
01010110
00000000
10001000
10001000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01100101
01010101
01010101
10001001
01010101
01010110
00100010
01010101
01011000
10101000
10010101
01100010
10101010
00100101
01011000
10101000
10010101
01010110
00100010
01010101
01010101
10001001
01010101
01010101
01100101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
01010101
00101010
10101010
00010101
00100000
10000010
00010101
00100000
10000010
00010101
00100001
00010010
00010101
01000100
00000100
01010101
01000010
10100000
01010101
01001000
00001000
01010101
01001010
10101000
01010101
01001000
00001000
01010101
01001000
01001000
01010101
01010001
01010001
01010101
01001000
01010101
01010101
01001000
00000000
01010101
01001010
10101000
01010101
01001000
00001000
01010101
01001000
01001000
01010101
01010001
01010001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
00001000
00101000
00101000
00101000
10101010
00000000
10101010
10101010
10000010
10101010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10101010
10101010
10101010
00000000
00000000
00000000
00001010
10000010
10000000
00000000
10000010
00100000
00000010
10000010
00100000
00000000
10000010
00100000
00001010
10000010
10000000
00000000
00000000
00000000
00001010
10001000
00000000
00001000
00000000
00000000
00001010
00001000
10001000
00001000
00001000
00100000
00001000
00001000
10001000
00000000
00000000
00000000
10101010
10101010
10101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
01010101
01010101
01001010
00010101
01010101
00100000
10000101
01010101
00100000
10000101
01010101
00101010
10000101
01010101
00100000
10000101
01010101
00100000
10000101
01010101
01000101
00010101
01010101
01010100
10000101
01010101
01010100
10000101
01010101
01010100
10000101
01010101
01010100
10000001
00000001
01010100
10101000
10101000
01010101
00000001
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
01000101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000101
01000101
01010101
00100001
00100001
01010101
00100001
00100001
01010101
00100001
00100001
01010101
00100001
00100001
01010101
01001000
10000101
01010101
01010010
00000000
01010101
01010100
10101010
00010101
01010100
10000000
01010101
01010100
10101000
01010101
01010100
10000001
00010101
01010100
10000000
10000101
01010100
10101010
10000101
01010101
00000000
10000101
01010101
01010100
10000101
01010101
01010100
10000000
01010101
01010100
10101010
01010101
01010101
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00010101
01010101
00101010
00000101
01010101
00100000
10000101
01010101
00100000
10000101
01010101
00100000
10000101
01010101
00101010
00000000
01010101
01000000
10101010
00010101
01010100
10000000
01010101
01010100
10101010
00010101
01010100
00000010
00010101
01010100
10101010
00000001
01010101
00001010
10101000
01010101
01010000
10000001
01010101
01010100
10000101
01010101
01010100
10000101
01010101
01010100
10000101
01010101
01010101
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
01010101
00101010
10101010
00010101
00100000
10000010
00010101
00100000
10000010
00010101
00100000
10000010
00010101
00100001
00010010
00010101
01000101
01010100
01010101
01000000
00000000
01010101
00101010
10101010
00010101
00101010
10101010
00010101
01000000
00000000
01010101
01010000
00000001
01010101
01001010
10101000
01010101
01001000
00000000
01010101
01001010
10101000
01010101
01000000
00001000
01010101
01001010
10101000
01010101
01010000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011010
10010101
01010101
01100000
00100101
01010101
10000010
00001001
01010101
10001001
10001001
01010101
10000010
00001001
01010101
01100000
00100101
01010101
01011010
10010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
01010101
00101010
10101010
00010101
00100000
10000010
00010101
00100000
10000010
00010101
00100000
10000010
00010101
00100001
00010010
00010101
01000101
01010100
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
01011000
10010101
01010101
01100010
00100101
01010101
10001010
10001010
10101001
00000010
00000000
00001001
10100010
00101000
10001001
01100010
00101000
10001010
01100010
00101000
10000000
01100010
00101000
10101000
01100010
00101000
10001000
01100010
00101000
10001000
01100010
00101000
10001000
10100010
00101000
00000000
00000010
00000010
10101010
10001010
10001001
01010101
01100010
00100101
01010101
01011000
10010101
01010101
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
01010101
01010101
01011000
10010101
01010101
01011000
10010101
01010101
10101000
10010101
01010110
00000000
10010101
01011000
10101000
10010101
01011000
10011000
10010101
01011000
10101000
10010101
01010110
00000000
10010101
01010101
10101010
01010101
01100101
01010101
01011001
10001001
01010101
01100010
10001001
00010100
01100010
10001000
10000010
00100010
10000010
10101010
10000010
10001000
10000010
00100010
10001001
00010100
01100010
01100101
01010101
01011001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10010101
01010101
01010101
01100101
01010101
01010101
10010101
01010101
01010110
01010101
01010101
01101001
01010101
01010110
10010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01010110
10010101
01010101
01010101
01101001
01010101
01010101
01010110
10010101
01010101
01010101
01100101
01010101
01010101
01011001
01010101
01010101
01011001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00000000
00100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01000000
10101010
00000001
01001010
10000010
10100001
01001010
10000010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01001010
10101010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000101
01000101
01010101
00100001
00100001
01010101
00100001
00100001
01010101
00100001
00100001
01010101
00100001
00100001
01010101
00001000
10000001
01010101
01000010
00000101
01010101
01010000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
00010101
01010101
01001010
10000101
01010101
00100000
00100001
01010101
00100000
00100001
01010101
00101010
10100001
01010101
00100000
00100001
01010101
00100001
00100001
01010101
01000101
01000101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10000010
10001001
10001010
10000010
10100010
00101010
10000010
10101000
00101010
10000010
10101000
10101010
10000010
10101010
10101010
10000010
10101010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
00001001
10001010
10101000
00100010
00101010
10100000
10101000
00101010
10100000
10101000
10101010
10000010
10101010
10101010
10000010
10101010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
00000010
00101010
10101000
00001000
00101010
10100000
00101000
10101010
10000000
10101010
10101010
10000010
10101010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10000000
00101010
10101000
00001000
10101010
10000000
00101010
10101010
10000010
10101010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10101000
00101010
10101010
10101000
10101010
10000000
00000010
10101010
10000000
00000010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10101000
00101010
10101010
10101000
10101010
10000010
10101010
10101010
10000000
00101010
00101010
10101000
00001000
00101010
10101010
10000000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10101000
00101010
10101010
10101000
10101010
10000010
10101010
10101010
10000000
10101010
00101010
10100000
00101000
00101010
10101000
00001000
10001010
10101010
00000010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10101000
00101010
10101010
10101000
10101010
10000010
10101010
10101010
10000010
10101010
00101010
10100000
10101000
00101010
10100000
10101000
10001010
10101000
00100010
01100010
10101010
00001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10101000
00101010
10101010
10101000
10101010
10000010
10101010
10101010
10000010
10101010
00101010
10000010
10101000
00101010
10000010
10101000
10001010
10000010
10100010
01100010
10000010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10101000
00101010
10101010
10101000
10101010
10000010
10101010
10101010
10000010
10101010
00101010
00001010
10101000
00101010
00001010
10101000
10001000
00101010
10100010
01100000
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10101000
00101010
10101010
10101000
10101010
10000010
10101010
10101010
00000010
10101010
00101000
00001010
10101000
00100000
00101010
10101000
10000000
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10101000
00101010
10101010
10101000
10101010
10000010
10101010
10101000
00000010
10101010
00100000
00101010
10101000
00000010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10101000
00101010
10101010
10101000
10000000
00000010
10101010
10000000
00000010
10101010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00000010
10101010
10101000
00100000
00101010
10101000
10101000
00000010
10101010
10101010
10000010
10101010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10000000
10101010
10100010
00100000
00101010
10101000
00101000
00001010
10101000
10101010
00000010
10101010
10101010
10000010
10101010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100000
10101010
10001001
10001000
00101010
10100010
00101010
00001010
10101000
00101010
00001010
10101000
10101010
10000010
10101010
10101010
10000010
10101010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01011000
01010101
01010101
01011000
01010101
01010101
01010110
01010101
01010101
01010110
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01101001
01010101
01010110
10000010
10010101
01011000
00101000
00100101
01100010
10101010
10001001
10001010
10101010
10100010
00101010
10101010
10101000
00101010
10101010
10101000
10101010
10000010
10101010
10101010
10000010
10101010
00101010
10101010
10101000
00101010
10101010
10101000
10001010
10101010
10100010
01100010
10101010
10001001
01011000
00101000
00100101
01010110
10000010
10010101
01010101
01101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01010101
00100101
01010101
01010101
00100101
01010101
01010101
10010101
01010101
01010101
10010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10101010
01010101
01010101
10000010
01010101
01010101
10000010
01010101
01010101
10000010
01010101
10101010
10000010
10101010
10000000
00000000
00000010
10001010
10101010
10100010
10001000
00101000
00100010
10001000
00101000
00100010
10001010
10101010
10100010
10001010
10101010
10100010
10000000
00000000
00000010
10101010
10101010
10101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011001
01010101
01010101
01100101
01010101
01010101
00010101
01010101
01000001
00010101
01010101
00000000
00010101
01010100
00000000
00010101
01010000
00000000
00000101
01000000
00000000
00000001
00001010
10101010
10100000
01001010
10100000
00100001
01001010
10100001
00100001
01001010
10100000
00100001
01001010
10101010
10100001
01001010
10101010
10100001
01001000
00001010
10100001
01001000
01001010
10100001
01001000
01001010
10100001
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000001
01010101
00101010
10100001
01010101
00100010
00100001
01010101
00100010
00100001
01010101
00000000
00000001
01010101
01010101
01001000
01010101
01010101
00100010
00010101
01010100
10000000
10000101
01010100
10101010
10000101
01010100
10000000
10000101
01010100
10000100
10000101
01010101
00000100
00000101
01010101
01010100
10000101
01010101
01010100
10000000
01010101
01010100
10101000
01010101
01010100
10001000
01010101
01010100
10001000
01010101
01010100
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011010
10010101
01010101
01100000
00100101
01101001
01100010
00001001
10001001
01100010
10000010
00100101
01100000
10100000
10010101
01011000
00101000
00100101
01010110
00001010
00001001
01010101
10000010
10000010
01010101
10000000
10100010
01010101
10001000
00000010
01010101
10001000
10101001
01010101
10001000
10010101
01010101
10001000
10010101
01010110
00001000
00100101
01011000
10101010
10001001
01100010
10101010
10100010
01100000
00000000
00000010
01011010
10101010
10101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01010000
00101000
00000101
01010101
00101000
01010101
01010101
00101000
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01010000
00101000
00000101
01010101
00101000
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101010
00010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
00101000
01010101
01010000
00101000
00000101
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
00101000
01010101
01010101
00101000
01010101
01010000
00101000
00000101
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00000001
01001010
10101010
10100001
01001000
00101000
00100001
01001000
10001000
10100001
01001000
00101000
10100001
01001000
10101000
10100001
01001000
10101000
00100001
01001010
10101010
10100001
00000000
00101000
00000000
00101010
10101010
10101000
00100000
00000000
00001000
00100010
00100010
00101000
00101000
10001000
10001000
00100010
00100010
00101000
00101000
00000000
00101000
00101010
10101010
10101000
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01011010
10101010
10101001
01011001
01010101
01011001
01011001
01010101
01011001
01011001
01010101
01011001
01011001
01010101
01011001
01011001
01010101
01011001
01011010
10101010
10101001
01011001
01010101
01011001
01011001
01010101
01011001
01011001
01010101
01011001
01011001
01010101
01011001
01011001
01010101
01011001
01011010
10101010
10101001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
01010101
01010101
01001010
00010101
01010101
00101010
10000101
01010101
00101010
10100001
01010101
01001010
10101000
01010101
01010010
10101000
01010101
01010100
10101010
01010101
01010101
00001001
01010101
01010101
01010010
01010101
01010101
00011010
01010101
01010001
10010110
01010101
00011000
10000101
01010100
10001000
00101000
01010100
10000010
00000101
01010101
00100000
10100001
01010101
01001000
00010101
01010101
01010010
10000101
01010101
01010100
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000101
01010101
01010101
00100001
01010101
01010101
10101000
01010101
01010101
10100001
01010101
01010101
10011000
00010101
01010101
00101010
10000101
01010101
01001010
10100001
01010101
01001010
10101000
01010101
01010010
10101010
00010101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
10101010
10000101
01010010
00000000
00100001
01001000
00101010
00001000
01100000
10000000
10000010
01100010
00001000
00100010
01100010
00101010
00100010
01100010
00001000
00100010
01100000
10001000
10000010
01001000
00001000
00001000
01010010
00001000
00100001
01010100
01001000
01000101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
00101010
00010101
01010100
10101010
10000101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000001
01010101
01010101
00100001
01010101
01010101
00100000
00010101
01010101
00100010
00010101
01010101
00101000
00010101
01010101
00100010
00010101
01010101
00000000
00000000
00010101
01010010
10101010
00010101
01010010
00100010
00010101
01010010
00100010
00010101
01010000
00000000
00000101
01010101
01010100
10000101
01010101
01010100
10000000
01010101
01010100
10101000
01010101
01010100
10001000
01010101
01010100
10001000
01010101
01010100
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00010101
00100010
10001010
00010101
00101000
10100010
00010101
00100000
10000010
00010101
00100000
10000010
00010101
00000000
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
00000000
00101000
00000000
00101010
10101010
10101000
00001010
10101010
10100000
01000010
10101010
10000001
01010000
10101010
00000101
01010100
00101000
00010101
01010101
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
00101010
10101010
10101000
00101010
10101010
10101000
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
01010101
01010100
00101000
00010101
01010000
10101010
00000101
01000010
10101010
10000001
00001010
10101010
10100000
00101010
10101010
10101000
00000000
00101000
00000000
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000001
01010101
01010010
10101000
01010101
01001000
00000010
00010101
01001000
01010010
00010101
01001000
01010010
00010101
01001000
00000010
00010101
01010010
10101000
01010101
01010100
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00010100
01010001
01010010
10000010
00001000
01001000
00100010
10001000
01001000
00100010
00101000
01001000
00100010
00101000
01010010
10000010
00001000
01010100
00010100
01010001
01010101
01000000
01010101
01010101
00101010
00010101
01010100
10001000
10000101
01010010
00001000
00100001
01001000
01001000
00001000
01001000
01001010
10001000
01001000
01010000
00001000
01010010
00010101
00100001
01010100
10000000
10000101
01010101
00101010
00010101
01010101
01000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
01000101
00010001
00101010
00100000
10001000
00100000
00100000
10001000
00101000
00100001
00100001
00100001
00100000
00100001
00100001
00101010
00100001
01000101
01000000
01000101
01010101
01000000
01010101
01010101
00101010
00010101
01010100
10001000
10000101
01010010
00001000
00100001
01001000
01001000
00001000
01001000
01001010
10001000
01001000
01010000
00001000
01010010
00010101
00100001
01010100
10000000
10000101
01010101
00101010
00010101
01010101
01000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
01010101
00000101
01001010
00010100
10100001
01001010
10000100
10100001
01001010
10000000
10100001
01001010
10100000
10100001
00001010
00101000
10100000
10001010
00101000
10100010
00001010
00001010
10100000
01001010
00000010
10100001
01001010
00010010
10100001
01001010
00010100
10100001
01010000
01010101
00000101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01010010
10000000
10000101
01010010
10000101
01010101
00000010
10101010
00000000
10101000
10101010
10001010
00000000
00000010
10000000
01010010
00000010
10000101
01010010
10101010
10000101
01010000
10101010
00000101
01010101
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
00000000
00010101
01010010
10101010
10000101
01010010
10101010
10000101
01010010
10000000
00010101
01010010
10000101
01010101
00000010
10101000
00000000
10100010
10101000
10101010
00000010
10000000
00000000
01010010
10000000
01010101
01010010
10101010
10000101
01010010
10101010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
01010101
00000101
01001010
00010100
10100001
01001010
00010100
10100001
01001010
00010100
10100001
01001010
00000000
10100001
00001010
00101000
10100000
10100010
00101000
10001010
00000010
00101000
10000000
01010010
10000010
10000101
01010010
10000010
10000101
01010010
10000010
10000101
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000101
01010101
01010101
00100001
01010101
00000001
00100001
00000000
10101000
00100000
10101010
00000001
00100001
00000000
01010101
00100001
01010101
01010101
01000101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010100
10000101
01000000
00000000
10100001
00101010
10101010
10101000
00101010
10101010
10101000
01000000
00000000
10100001
01010101
01010100
10000101
01010101
01010101
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000001
01010101
00101010
10101000
01010101
01001010
10101000
01010101
01010010
10101000
01010101
01001010
10101000
01010101
00101010
00101000
01010100
10101000
01001000
01010010
10100001
01010001
01001010
10000101
01010101
01010010
00010101
01010101
01010100
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01010100
00101000
00010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000001
01010101
00101010
10101000
01010101
00101010
10100001
01010101
00101010
10000101
01010101
00101010
10100001
01010101
00101000
10101000
01010101
00100001
00101010
00010101
01000101
01001010
10000101
01010101
01010010
10100001
01010101
01010100
10000101
01010101
01010101
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
01010101
01010101
01010010
00010101
01010101
01001010
00000000
00000001
00101010
10101010
10101000
00101010
10101010
10101000
01001010
00000000
00000001
01010010
00010101
01010101
01010100
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010100
10000101
01010101
01010010
10100001
01000101
01001010
10000101
00100001
00101010
00010101
00101000
10101000
01010101
00101010
10100001
01010101
00101010
10000101
01010101
00101010
10100001
01010101
00101010
10101000
01010101
01000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010101
00101000
01010101
01010100
00101000
00010101
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
01010101
01010101
01010010
00010101
01010101
01001010
10000101
01010101
01010010
10100001
01010001
01010100
10101000
01001000
01010101
00101010
00101000
01010101
01001010
10101000
01010101
01010010
10101000
01010101
01001010
10101000
01010101
00101010
10101000
01010101
01000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00010100
00000000
10101010
00010100
10101010
10101010
10000010
10101010
00000000
10101010
00000000
01010100
00000000
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
01010101
00000000
00101010
00010100
10101000
01001010
10000010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000101
00010001
01010100
10100000
10001000
01010100
10001000
10001000
01010100
10100000
10101000
01010100
10000100
10001000
01000100
10000100
10001000
00100001
00010101
00010001
10101000
01010101
01010101
10100001
01010101
01010101
10011000
00010101
01010101
00101010
10000101
01010101
01001010
10100001
01010101
01001010
10101000
01010101
01010010
10101010
00010101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10000001
01010101
01010100
10000101
01010101
01010100
10000001
01000101
01010101
00101000
00100001
01010101
00000001
10101000
01010100
10001000
10100001
01010100
10001000
10011000
00010100
10101000
00101010
10000100
10001000
01001010
10100000
10001000
01001010
10101000
00010001
01010010
10101010
00010101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
00101010
10101010
10101000
00101010
10101010
10101000
00001010
10101010
10100000
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
00101010
10101010
10101000
00101010
10101010
10101000
00000000
00101000
00000000
01010101
00101000
01010101
01000000
00101000
00000001
00101010
10101010
10101000
01001010
10101010
10100001
01010010
10101010
10000101
01010100
10101010
00010101
01010101
00101000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
00001010
10101010
10100000
00101010
10101010
10101000
00101010
10101010
10101000
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00101000
01010101
01010100
10101010
00010101
01010010
10101010
10000101
01001010
10101010
10100001
00101010
10101010
10101000
01000000
00101000
00000001
01010101
00101000
01010101
00000000
00101000
00000000
00101010
10101010
10101000
00101010
10101010
10101000
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00000000
00101010
10101010
10101010
00100000
00000000
00001000
00100010
00010100
10001000
00100010
00010010
10001000
00100010
00001010
10001000
00100010
00101010
10001000
00100010
10101010
10001000
00100010
10101010
10001000
00100010
00101010
10001000
00100010
00001010
10001000
00100010
00010010
10001000
00100010
00010100
10001000
00100000
00000000
00001000
00101010
10101010
10101010
01000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
01010101
01010101
01001010
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001000
01010101
01010101
01001010
01010101
01010101
01010000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
10101010
10101010
10000101
10101010
10101010
10000101
10101010
10101010
10000101
10101010
10101010
10000101
10101010
10101010
10000101
10101010
10101010
10000101
10101010
10101010
10000101
10101010
10101010
10000101
10101010
10101010
10000101
10101010
10101010
10000101
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
10101010
10100001
01010101
10101010
10100001
01010101
10101010
10100001
01010101
10101010
10100001
01010101
10101010
10100001
01010101
10101010
10100001
01010101
10101010
10100001
01010101
10101010
10100001
01010101
10101010
10100001
01010101
10101010
10100001
01010101
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
10101000
01010101
01010101
10101000
01010101
01010101
10101000
01010101
01010101
10101000
01010101
01010101
10101000
01010101
01010101
10101000
01010101
01010101
10101000
01010101
01010101
10101000
01010101
01010101
10101000
01010101
01010101
10101000
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000000
10101010
10101010
10101010
00000000
00000000
00000000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000101
01010101
01010101
10100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
00100001
01010101
01010101
10100001
01010101
01010101
00000101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000000
00000000
00000001
10101010
10101010
10101000
00100000
00000000
00001000
00100010
00010100
10001000
00100010
10000100
10001000
00100010
10100000
10001000
00100010
10101000
10001000
00100010
10101010
10001000
00100010
10101010
10001000
00100010
10101000
10001000
00100010
10100000
10001000
00100010
10000100
10001000
00100010
00010100
10001000
00100000
00000000
00001000
10101010
10101010
10101000
00000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010100
01010101
01010101
01010010
01010101
01010000
01010010
01010101
01001010
00010000
01010101
01001010
00001010
01010101
01010000
00101010
01010101
01010100
10100000
01010101
00000010
10000101
01010100
10100010
10000101
01010100
10100010
10000101
01010101
00000010
10000101
01010101
01010100
10100000
01010101
01010000
00101010
01010101
01001010
00001010
01010101
01001010
00010000
01010101
01010000
01010010
01010101
01010101
01010010
01010101
01010101
01010000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00010101
01010101
01010101
10000101
01010101
01010101
10000101
00000101
01010101
00000100
10100001
01010101
10100000
10100001
01010101
10101000
00000101
01010101
00001010
00010101
01010101
01010010
10000000
01010101
01010010
10001010
00010101
01010010
10001010
00010101
01010010
10000000
01010101
00001010
00010101
01010101
10101000
00000101
01010101
10100000
10100001
01010101
00000100
10100001
01010101
10000101
00000101
01010101
10000101
01010101
01010101
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
01010101
01010101
00001010
01010101
01010100
10101010
01010101
01010010
10100000
01010101
01001010
00000100
01010101
01001010
00010100
01010101
00101000
01010100
01010101
00101000
01010100
01010101
00101000
01010100
01010101
00101000
01010100
01010101
01001010
00010100
01010101
01001010
00000100
01010101
01010010
10100000
01010101
01010100
10101010
01010101
01010101
00001010
01010101
01010101
01010000
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
00000101
01010101
01010101
10100000
01010101
01010101
10101010
00010101
01010101
10101010
10000101
01010101
10101010
10100001
01010101
10101010
10100001
01010101
10101010
10101000
01010101
10101010
10101000
01010101
10101010
10101000
01010101
10101010
10101000
01010101
10101010
10100001
01010101
10101010
10100001
01010101
10101010
10000101
01010101
10101010
00010101
01010101
10100000
01010101
01010101
00000101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000001
01010101
01010101
00101000
01010101
01010100
10101000
01010101
01010010
10001000
01000000
00001010
00001000
00101010
10101000
01001000
00100000
10100001
01001000
00100000
10100001
01001000
00100000
10100001
01001000
00100000
10100001
01001000
00100000
10100001
01001000
00101010
10101000
01001000
01000000
00001010
00001000
01010101
01010010
10001000
01010101
01010100
10101000
01010101
01010101
00101000
01010101
01010101
01000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010001
01010101
01010101
01101000
01010101
01010101
01011010
00010101
01010100
00010010
00010101
01010010
10000010
00010101
01000100
10000010
10000101
00100000
10100000
10000101
00101000
00100000
10000101
01001000
00100000
10000101
00101000
00100000
10000101
00100000
10100000
10000101
01000100
10000010
10000101
01010010
10000010
00010101
01010100
00010010
00010101
01010101
01011010
00010101
01010101
01101000
01010101
01010101
01010001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
00000000
00000001
00101010
10101010
10101000
01001000
00000000
00100001
01001000
01010101
00100001
01001000
01010101
00100001
01001000
01010101
00100001
01010010
00010100
10000101
01010100
10000010
00010101
01010101
00101000
01010101
01010101
00101000
01010101
01010100
10000010
00010101
01010010
00010100
10000101
01001000
01010101
00100001
01001000
01010101
00100001
01001000
01010101
00100001
01001000
00000000
00100001
00101010
10101010
10101000
01000000
00000000
00000001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
01010101
01010101
01010010
00010101
01010101
01010010
10000101
01010101
01010010
10100001
01010101
01010010
10101000
01010101
01010010
10101010
00010101
01010010
10101010
10000101
01010010
10101010
10100001
01010010
10101010
10101000
01010010
10101010
00000000
01010010
10101010
00000101
01010010
00001010
10000101
01010000
00001010
10000001
01010101
01010010
10100001
01010101
01010010
10100001
01010101
01010000
10000001
01010101
01010101
00010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010000
01010001
01010001
01001010
00001000
01001000
00100000
10001010
00101000
00100000
10001000
10001000
00100000
10001000
10001000
00101010
10001000
00001000
00100000
10001000
01001000
00100000
10001000
01001000
00100000
10001000
01001000
00100000
10001000
01001000
01000101
00010001
01010001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01000000
01010001
01010001
00101010
00001000
01001000
00100000
10001010
00101000
00100000
10001000
10001000
00100000
10001000
10001000
00101010
00001000
00001000
00100000
01001000
01001000
00100001
01001000
01001000
00100001
01001000
01001000
00100001
01001000
01001000
01000101
01010001
01010001
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
10101010
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
01010101
/C-OSD/trunk/C-OSD AGRESSiVA mod/characters.c
0,0 → 1,5975
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "main.h"
#include "max7456_software_spi.h"
 
 
#if (ALLCHARSDEBUG|(WRITECHARS != -1))
 
/**
* easy char creation:
* http://www.mylifesucks.de/tools/max7456/
*/
// chars 0 - 255 with 54 byte per char
// orginal filename: c-osd.mcm
// Sun, 28 Jun 2009 13:41:07 +0200
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr0[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 -----##-----
// 3 ----# #----
// 4 ---# #----
// 5 --# #----
// 6 --# #----
// 7 --### #----
// 8 ----# #----
// 9 ----# #----
// 10 ----# #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 ---## ##---
// 15 --# #--
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr1[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xa8,0x55,0x52,0xa8,0x55,0x52,0xa8,0x55,0x50,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x54,0x28,0x15,0x52,0xaa,0x85,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # ### #
// 6 # #---# #
// 7 -###----# #
// 8 -------# #
// 9 ------# #-
// 10 -----# #--
// 11 ----# #---
// 12 ---# #----
// 13 --# #-----
// 14 -# ######-
// 15 # #
// 16 # #
// 17 -##########-
// 000000000011
// 012345678901
const char chr2[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x80,0xa8,0x2a,0x15,0x28,0x40,0x55,0x28,0x55,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x2a,0x15,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x80,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x01};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # #### #
// 6 # #----# #
// 7 -##-----# #
// 8 -----### #
// 9 ----# #-
// 10 ----# #-
// 11 -----### #
// 12 -##-----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr3[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x41,0x55,0x28,0x55,0x40,0xa8,0x55,0x2a,0xa1,0x55,0x2a,0xa1,0x55,0x40,0xa8,0x41,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -------##---
// 3 ------# #--
// 4 -----# #--
// 5 ----# #--
// 6 ---# #--
// 7 --# # #--
// 8 -# ## #--
// 9 # #-# #--
// 10 # #### ##-
// 11 # #
// 12 # #
// 13 -###### ##-
// 14 ------# #--
// 15 ------# #--
// 16 ------# #--
// 17 -------##---
// 000000000011
// 012345678901
const char chr4[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x15,0x55,0x52,0x85,0x55,0x4a,0x85,0x55,0x2a,0x85,0x54,0xaa,0x85,0x52,0xa2,0x85,0x4a,0x82,0x85,0x2a,0x12,0x85,0x28,0x02,0x81,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x02,0x81,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x54,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -##########-
// 3 # #
// 4 # #
// 5 # ########-
// 6 # ######---
// 7 # #--
// 8 # #-
// 9 -####### #
// 10 --------# #
// 11 --------# #
// 12 -##-----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr5[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x28,0x00,0x01,0x28,0x00,0x15,0x2a,0xaa,0x85,0x2a,0xaa,0xa1,0x40,0x00,0xa8,0x55,0x55,0x28,0x55,0x55,0x28,0x41,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # #### #
// 6 # #----# #
// 7 # #-----##-
// 8 # ######---
// 9 # #--
// 10 # #-
// 11 # ##### #
// 12 # #----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr6[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x41,0x28,0x00,0x15,0x2a,0xaa,0x85,0x2a,0xaa,0xa1,0x28,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -##########-
// 3 # #
// 4 # #
// 5 -######## #
// 6 -------# #
// 7 ------# #-
// 8 -----# #--
// 9 ----# #---
// 10 ----# #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 ----# #----
// 15 ----# #----
// 16 ----# #----
// 17 -----##-----
// 000000000011
// 012345678901
const char chr7[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x28,0x55,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x2a,0x15,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # #### #
// 6 # #----# #
// 7 # #----# #
// 8 # #### #
// 9 -# #-
// 10 -# #-
// 11 # #### #
// 12 # #----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr8[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # #### #
// 6 # #----# #
// 7 # #----# #
// 8 # ##### #
// 9 -# #
// 10 --# #
// 11 ---###### #
// 12 -##-----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr9[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0x28,0x4a,0xaa,0xa8,0x52,0xaa,0xa8,0x54,0x00,0x28,0x41,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # #### #
// 6 # #----# #
// 7 # #----# #
// 8 # #----# #
// 9 # #----# #
// 10 # #----# #
// 11 # #----# #
// 12 # #----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr10[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -----##-----
// 3 ----# #----
// 4 ---# #---
// 5 --# #--
// 6 -# ## #-
// 7 # #--# #
// 8 # #----# #
// 9 # #----# #
// 10 # ###### #
// 11 # #
// 12 # #
// 13 # ###### #
// 14 # #----# #
// 15 # #----# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr11[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x4a,0x82,0xa1,0x2a,0x14,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x00,0x28,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x28,0x00,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 -########---
// 3 # #--
// 4 # #-
// 5 # ##### #
// 6 # #----# #
// 7 # #----# #
// 8 # ##### #
// 9 # #-
// 10 # #-
// 11 # ##### #
// 12 # #----# #
// 13 # #----# #
// 14 # ##### #
// 15 # #-
// 16 # #--
// 17 -########---
// 000000000011
// 012345678901
const char chr12[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x15,0x2a,0xaa,0x85,0x2a,0xaa,0xa1,0x28,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x00,0xa8,0x2a,0xaa,0xa1,0x2a,0xaa,0xa1,0x28,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x00,0xa8,0x2a,0xaa,0xa1,0x2a,0xaa,0x85,0x40,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # #### #
// 6 # #----# #
// 7 # #-----##-
// 8 # #--------
// 9 # #--------
// 10 # #--------
// 11 # #--------
// 12 # #-----##-
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr13[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x41,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x41,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -######-----
// 3 # #----
// 4 # #---
// 5 # ### #--
// 6 # #--# #-
// 7 # #---# #
// 8 # #----# #
// 9 # #----# #
// 10 # #----# #
// 11 # #----# #
// 12 # #---# #
// 13 # #--# #-
// 14 # ### #--
// 15 # #---
// 16 # #----
// 17 -######-----
// 000000000011
// 012345678901
const char chr14[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x01,0x55,0x2a,0xa8,0x55,0x2a,0xaa,0x15,0x28,0x0a,0x85,0x28,0x52,0xa1,0x28,0x54,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x54,0xa8,0x28,0x52,0xa1,0x28,0x0a,0x85,0x2a,0xaa,0x15,0x2a,0xa8,0x55,0x40,0x01,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 -##########-
// 3 # #
// 4 # #
// 5 # ########-
// 6 # #--------
// 7 # #--------
// 8 # ######---
// 9 # #--
// 10 # #--
// 11 # ######---
// 12 # #--------
// 13 # #--------
// 14 # ########-
// 15 # #
// 16 # #
// 17 -##########-
// 000000000011
// 012345678901
const char chr15[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x28,0x00,0x01,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x00,0x15,0x2a,0xaa,0x85,0x2a,0xaa,0x85,0x28,0x00,0x15,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x01};
 
 
// 0 ------------
// 1 ------------
// 2 -##########-
// 3 # #
// 4 # #
// 5 # ########-
// 6 # #--------
// 7 # #--------
// 8 # ######---
// 9 # #--
// 10 # #--
// 11 # ######---
// 12 # #--------
// 13 # #--------
// 14 # #--------
// 15 # #--------
// 16 # #--------
// 17 -##---------
// 000000000011
// 012345678901
const char chr16[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x28,0x00,0x01,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x00,0x15,0x2a,0xaa,0x85,0x2a,0xaa,0x85,0x28,0x00,0x15,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # ### #-
// 6 # #----# #
// 7 # #----# #
// 8 # #-----##-
// 9 # #-######-
// 10 # ## #
// 11 # ## #
// 12 # #-#### #
// 13 # #----# #
// 14 # ##### #
// 15 -# #
// 16 --# #
// 17 ---########-
// 000000000011
// 012345678901
const char chr17[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x02,0xa1,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x41,0x28,0x40,0x01,0x28,0x2a,0xa8,0x28,0x2a,0xa8,0x28,0x40,0x28,0x28,0x55,0x28,0x2a,0x00,0x28,0x4a,0xaa,0xa8,0x52,0xaa,0xa8,0x54,0x00,0x01};
 
 
// 0 ------------
// 1 ------------
// 2 -##------##-
// 3 # #----# #
// 4 # #----# #
// 5 # #----# #
// 6 # #----# #
// 7 # #----# #
// 8 # ###### #
// 9 # #
// 10 # #
// 11 # ###### #
// 12 # #----# #
// 13 # #----# #
// 14 # #----# #
// 15 # #----# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr18[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x00,0x28,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x28,0x00,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 --# #--
// 5 ---## ##---
// 6 ----# #----
// 7 ----# #----
// 8 ----# #----
// 9 ----# #----
// 10 ----# #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 ---## ##---
// 15 --# #--
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr19[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x52,0xaa,0x85,0x54,0x28,0x15,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x54,0x28,0x15,0x52,0xaa,0x85,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -----######-
// 3 ----# #
// 4 ----# #
// 5 -----## ##-
// 6 ------# #--
// 7 ------# #--
// 8 ------# #--
// 9 ------# #--
// 10 ------# #--
// 11 ------# #--
// 12 -##---# #--
// 13 # #--# #--
// 14 # ## #--
// 15 -# #---
// 16 --# #----
// 17 ---####-----
// 000000000011
// 012345678901
const char chr20[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x01,0x55,0x2a,0xa8,0x55,0x2a,0xa8,0x55,0x42,0x81,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x41,0x52,0x85,0x28,0x52,0x85,0x2a,0x0a,0x85,0x4a,0xaa,0x15,0x52,0xa8,0x55,0x54,0x01,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 -##------##-
// 3 # #----# #
// 4 # #---# #
// 5 # #--# #-
// 6 # #-# #--
// 7 # ## #---
// 8 # # #----
// 9 # #-----
// 10 # #-----
// 11 # # #----
// 12 # ## #---
// 13 # #-# #--
// 14 # #--# #-
// 15 # #---# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr21[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x54,0xa8,0x28,0x52,0xa1,0x28,0x4a,0x85,0x28,0x2a,0x15,0x28,0xa8,0x55,0x2a,0xa1,0x55,0x2a,0xa1,0x55,0x28,0xa8,0x55,0x28,0x2a,0x15,0x28,0x4a,0x85,0x28,0x52,0xa1,0x28,0x54,0xa8,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 -##---------
// 3 # #--------
// 4 # #--------
// 5 # #--------
// 6 # #--------
// 7 # #--------
// 8 # #--------
// 9 # #--------
// 10 # #--------
// 11 # #--------
// 12 # #--------
// 13 # #--------
// 14 # ########-
// 15 # #
// 16 # #
// 17 -##########-
// 000000000011
// 012345678901
const char chr22[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x01};
 
 
// 0 ------------
// 1 ------------
// 2 -##------##-
// 3 # #----# #
// 4 # #--# #
// 5 # ## #
// 6 # #
// 7 # # # #
// 8 # ## ## #
// 9 # ## ## #
// 10 # #-##-# #
// 11 # #----# #
// 12 # #----# #
// 13 # #----# #
// 14 # #----# #
// 15 # #----# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr23[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x2a,0x14,0xa8,0x2a,0x82,0xa8,0x2a,0xaa,0xa8,0x28,0xaa,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x41,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 -##------##-
// 3 # #----# #
// 4 # #---# #
// 5 # #--# #
// 6 # #--# #
// 7 # # #-# #
// 8 # # #-# #
// 9 # ## ## #
// 10 # ## ## #
// 11 # #-# # #
// 12 # #-# # #
// 13 # #--# #
// 14 # #--# #
// 15 # #---# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr24[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x2a,0x15,0x28,0x2a,0x85,0x28,0x2a,0x85,0x28,0x28,0xa1,0x28,0x28,0xa1,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x4a,0x28,0x28,0x4a,0x28,0x28,0x52,0xa8,0x28,0x52,0xa8,0x28,0x54,0xa8,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # #### #
// 6 # #----# #
// 7 # #----# #
// 8 # #----# #
// 9 # #----# #
// 10 # #----# #
// 11 # #----# #
// 12 # #----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr25[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -########---
// 3 # #--
// 4 # #-
// 5 # ##### #
// 6 # #----# #
// 7 # #----# #
// 8 # ##### #
// 9 # #-
// 10 # #--
// 11 # ######---
// 12 # #--------
// 13 # #--------
// 14 # #--------
// 15 # #--------
// 16 # #--------
// 17 -##---------
// 000000000011
// 012345678901
const char chr26[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x15,0x2a,0xaa,0x85,0x2a,0xaa,0xa1,0x28,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x00,0xa8,0x2a,0xaa,0xa1,0x2a,0xaa,0x85,0x28,0x00,0x15,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # #### #
// 6 # #----# #
// 7 # #----# #
// 8 # #----# #
// 9 # #----# #
// 10 # #-##-# #
// 11 # ## ## #
// 12 # ## # #
// 13 # #-# #
// 14 # ### #-
// 15 -# #
// 16 --# ## #
// 17 ---####--##-
// 000000000011
// 012345678901
const char chr27[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x41,0x28,0x28,0x28,0x28,0x28,0x2a,0x28,0x28,0x4a,0xa8,0x2a,0x02,0xa1,0x4a,0xaa,0xa8,0x52,0xa8,0x28,0x54,0x01,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 -########---
// 3 # #--
// 4 # #-
// 5 # ##### #
// 6 # #----# #
// 7 # #----# #
// 8 # ##### #
// 9 # #-
// 10 # #--
// 11 # # ##---
// 12 # ## #---
// 13 # #-# #--
// 14 # #--# #-
// 15 # #---# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr28[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x15,0x2a,0xaa,0x85,0x2a,0xaa,0xa1,0x28,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x00,0xa8,0x2a,0xaa,0xa1,0x2a,0xaa,0x85,0x28,0xa8,0x15,0x28,0x2a,0x15,0x28,0x4a,0x85,0x28,0x52,0xa1,0x28,0x54,0xa8,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 ---#######--
// 3 --# #-
// 4 -# #
// 5 # ##### #
// 6 # #-----##-
// 7 # #--------
// 8 # #####---
// 9 -# #--
// 10 --# #-
// 11 ---##### #
// 12 --------# #
// 13 -##-----# #
// 14 # ##### #
// 15 # #-
// 16 -# #--
// 17 --#######---
// 000000000011
// 012345678901
const char chr29[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x05,0x52,0xaa,0xa1,0x4a,0xaa,0xa8,0x2a,0x00,0x28,0x28,0x55,0x41,0x28,0x55,0x55,0x2a,0x00,0x15,0x4a,0xaa,0x85,0x52,0xaa,0xa1,0x54,0x00,0xa8,0x55,0x55,0x28,0x41,0x55,0x28,0x28,0x00,0xa8,0x2a,0xaa,0xa1,0x4a,0xaa,0x85,0x50,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -##########-
// 3 # #
// 4 # #
// 5 -#### ####-
// 6 ----# #----
// 7 ----# #----
// 8 ----# #----
// 9 ----# #----
// 10 ----# #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 ----# #----
// 15 ----# #----
// 16 ----# #----
// 17 -----##-----
// 000000000011
// 012345678901
const char chr30[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x28,0x01,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 -##------##-
// 3 # #----# #
// 4 # #----# #
// 5 # #----# #
// 6 # #----# #
// 7 # #----# #
// 8 # #----# #
// 9 # #----# #
// 10 # #----# #
// 11 # #----# #
// 12 # #----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr31[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -##------##-
// 3 # #----# #
// 4 # #----# #
// 5 # #----# #
// 6 # #----# #
// 7 # #----# #
// 8 # #----# #
// 9 # #----# #
// 10 # #----# #
// 11 # #----# #
// 12 # #--# #
// 13 -# ## #-
// 14 --# #--
// 15 ---# #---
// 16 ----# #----
// 17 -----##-----
// 000000000011
// 012345678901
const char chr32[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x14,0xa8,0x4a,0x82,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 -##------##-
// 3 # #----# #
// 4 # #----# #
// 5 # #----# #
// 6 # #----# #
// 7 # #----# #
// 8 # #-##-# #
// 9 # ## ## #
// 10 # ## ## #
// 11 # ## ## #
// 12 # ## ## #
// 13 # ## ## #
// 14 # #
// 15 -# #-
// 16 --# ## #--
// 17 ---##--##---
// 000000000011
// 012345678901
const char chr33[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x41,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x2a,0xaa,0xa8,0x4a,0xaa,0xa1,0x52,0x82,0x85,0x54,0x14,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -##------##-
// 3 # #----# #
// 4 # #----# #
// 5 # #----# #
// 6 # #--# #
// 7 -# ## #-
// 8 --# #--
// 9 ---# #---
// 10 ---# #---
// 11 --# #--
// 12 -# ## #-
// 13 # #--# #
// 14 # #----# #
// 15 # #----# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr34[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x14,0xa8,0x4a,0x82,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x54,0xaa,0x15,0x52,0xaa,0x85,0x4a,0x82,0xa1,0x2a,0x14,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 -##------##-
// 3 # #----# #
// 4 # #----# #
// 5 # #----# #
// 6 # #----# #
// 7 # #----# #
// 8 # #--# #
// 9 -# ## #-
// 10 --# #--
// 11 ---# #---
// 12 ----# #----
// 13 ----# #----
// 14 ----# #----
// 15 ----# #----
// 16 ----# #----
// 17 -----##-----
// 000000000011
// 012345678901
const char chr35[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x14,0xa8,0x4a,0x82,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 -##########-
// 3 # #
// 4 # #
// 5 -######## #
// 6 -------# #
// 7 ------# #-
// 8 -----# #--
// 9 ----# #---
// 10 ---# #----
// 11 --# #-----
// 12 -# #------
// 13 # #-------
// 14 # ########-
// 15 # #
// 16 # #
// 17 -##########-
// 000000000011
// 012345678901
const char chr36[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x28,0x55,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x2a,0x15,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x2a,0x15,0x55,0x28,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x01};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ---######---
// 5 --# #--
// 6 --# #-
// 7 ---##### #
// 8 ---###### #
// 9 --# # #
// 10 -# #
// 11 # #### #
// 12 # #----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #
// 16 --# # #
// 17 ---#####-##-
// 000000000011
// 012345678901
const char chr37[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x52,0xaa,0xa1,0x54,0x00,0xa8,0x54,0x00,0x28,0x52,0xaa,0x28,0x4a,0xaa,0xa8,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa8,0x52,0xaa,0x28,0x54,0x00,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 -##---------
// 3 # #--------
// 4 # #--------
// 5 # #-###----
// 6 # ## #---
// 7 # # #--
// 8 # # #-
// 9 # #-# #
// 10 # #---# #
// 11 # #---# #
// 12 # #---# #
// 13 # #-# #
// 14 # # #-
// 15 # # #--
// 16 # ## #---
// 17 -##--###----
// 000000000011
// 012345678901
const char chr38[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x40,0x55,0x28,0x2a,0x15,0x28,0xaa,0x85,0x2a,0xa2,0xa1,0x2a,0x84,0xa8,0x2a,0x15,0x28,0x2a,0x15,0x28,0x2a,0x15,0x28,0x2a,0x84,0xa8,0x2a,0xa2,0xa1,0x28,0xaa,0x85,0x28,0x2a,0x15,0x41,0x40,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ---######---
// 6 --# #--
// 7 -# #-
// 8 # #### #
// 9 # #----# #
// 10 # #----# #
// 11 # #-----##-
// 12 # #-----##-
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr39[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x41,0x28,0x55,0x41,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ---------##-
// 3 --------# #
// 4 --------# #
// 5 ----###-# #
// 6 ---# ## #
// 7 --# # #
// 8 -# # #
// 9 # #-# #
// 10 # #---# #
// 11 # #---# #
// 12 # #---# #
// 13 # #-# #
// 14 -# # #
// 15 --# # #
// 16 ---# ## #
// 17 ----###--##-
// 000000000011
// 012345678901
const char chr40[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x01,0x28,0x54,0xa8,0x28,0x52,0xaa,0x28,0x4a,0x8a,0xa8,0x2a,0x12,0xa8,0x28,0x54,0xa8,0x28,0x54,0xa8,0x28,0x54,0xa8,0x2a,0x12,0xa8,0x4a,0x8a,0xa8,0x52,0xaa,0x28,0x54,0xa8,0x28,0x55,0x01,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ---######---
// 6 --# #--
// 7 -# #-
// 8 # #### #
// 9 # ###### #
// 10 # #
// 11 # #-
// 12 # #######--
// 13 # #----###-
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr41[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x00,0x28,0x2a,0xaa,0xa8,0x2a,0xaa,0xa1,0x28,0x00,0x05,0x28,0x55,0x01,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ------####--
// 3 -----# #-
// 4 ----# #-
// 5 ----# ###--
// 6 --### ###--
// 7 -# #-
// 8 -# #-
// 9 --### ###--
// 10 ----# #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 ----# #----
// 15 ----# #----
// 16 ----# #----
// 17 -----##-----
// 000000000011
// 012345678901
const char chr42[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x50,0x05,0x55,0x4a,0xa1,0x55,0x2a,0xa1,0x55,0x28,0x05,0x50,0x28,0x05,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x50,0x28,0x05,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ---######---
// 5 --# #--
// 6 -# #-
// 7 # #### #
// 8 # #----# #
// 9 # #### #
// 10 -# #
// 11 --# # #
// 12 ---###### #
// 13 --##----# #
// 14 -# #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr43[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa8,0x52,0xaa,0x28,0x54,0x00,0x28,0x50,0x55,0x28,0x4a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -##---------
// 3 # #--------
// 4 # #--------
// 5 # #-###----
// 6 # ## #---
// 7 # # #--
// 8 # # #-
// 9 # #-# #
// 10 # #---# #
// 11 # #----# #
// 12 # #----# #
// 13 # #----# #
// 14 # #----# #
// 15 # #----# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr44[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x40,0x55,0x28,0x2a,0x15,0x28,0xaa,0x85,0x2a,0xa2,0xa1,0x2a,0x84,0xa8,0x2a,0x15,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 -----##-----
// 4 ----# #----
// 5 ----# #----
// 6 -----##-----
// 7 ---####-----
// 8 --# #----
// 9 --# #----
// 10 ---## #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 ----# #---
// 15 -----# #--
// 16 ------# #--
// 17 -------##---
// 000000000011
// 012345678901
const char chr45[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55,0x54,0x01,0x55,0x52,0xa8,0x55,0x52,0xa8,0x55,0x54,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x2a,0x15,0x55,0x4a,0x85,0x55,0x52,0x85,0x55,0x54,0x15};
 
 
// 0 ------------
// 1 -------##---
// 2 ------# #--
// 3 ------# #--
// 4 -------##---
// 5 -----####---
// 6 ----# #--
// 7 ----# #--
// 8 -----## #--
// 9 ------# #--
// 10 ------# #--
// 11 ------# #--
// 12 ------# #--
// 13 ------# #--
// 14 ---### #--
// 15 --# #---
// 16 --# #----
// 17 ---####-----
// 000000000011
// 012345678901
const char chr46[] PROGMEM = {0x55,0x55,0x55,0x55,0x54,0x15,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x54,0x15,0x55,0x40,0x15,0x55,0x2a,0x85,0x55,0x2a,0x85,0x55,0x42,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x54,0x0a,0x85,0x52,0xaa,0x15,0x52,0xa8,0x55,0x54,0x01,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 -##---------
// 3 # #--------
// 4 # #--------
// 5 # #-----##-
// 6 # #----# #
// 7 # #---# #
// 8 # #--# #-
// 9 # #-# #--
// 10 # ## #---
// 11 # # #----
// 12 # #---
// 13 # # #--
// 14 # #-# #-
// 15 # #---# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr47[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x41,0x28,0x55,0x28,0x28,0x54,0xa8,0x28,0x52,0xa1,0x28,0x4a,0x85,0x28,0x2a,0x15,0x28,0xa8,0x55,0x2a,0xaa,0x15,0x2a,0x8a,0x85,0x2a,0x12,0xa1,0x28,0x54,0xa8,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 -----##-----
// 3 ----# #----
// 4 ----# #----
// 5 ----# #----
// 6 ----# #----
// 7 ----# #----
// 8 ----# #----
// 9 ----# #----
// 10 ----# #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 ----# #----
// 15 ----# #----
// 16 ----# #----
// 17 -----##-----
// 000000000011
// 012345678901
const char chr48[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -##-#####---
// 6 # # #--
// 7 # #-
// 8 # # # #
// 9 # ## ## #
// 10 # ## ## #
// 11 # ## ## #
// 12 # ## ## #
// 13 # ## ## #
// 14 # ## ## #
// 15 # ## ## #
// 16 # ## ## #
// 17 -##--##--##-
// 000000000011
// 012345678901
const char chr49[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x00,0x15,0x28,0xaa,0x85,0x2a,0xaa,0xa1,0x2a,0x28,0xa8,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x41,0x41,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -##-#####---
// 6 # # #--
// 7 # #-
// 8 # #### #
// 9 # #----# #
// 10 # #----# #
// 11 # #----# #
// 12 # #----# #
// 13 # #----# #
// 14 # #----# #
// 15 # #----# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr50[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x00,0x15,0x28,0xaa,0x85,0x2a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ---######---
// 6 --# #--
// 7 -# #-
// 8 # #### #
// 9 # #----# #
// 10 # #----# #
// 11 # #----# #
// 12 # #----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr51[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 -##-#####---
// 5 # # #--
// 6 # #-
// 7 # ### #
// 8 # #---# #
// 9 # #---# #
// 10 # #---# #
// 11 # ### #
// 12 # #-
// 13 # # #--
// 14 # ######---
// 15 # #--------
// 16 # #--------
// 17 -##---------
// 000000000011
// 012345678901
const char chr52[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x00,0x15,0x28,0xaa,0x85,0x2a,0xaa,0xa1,0x2a,0x80,0xa8,0x2a,0x15,0x28,0x2a,0x15,0x28,0x2a,0x15,0x28,0x2a,0x80,0xa8,0x2a,0xaa,0xa1,0x28,0xaa,0x85,0x28,0x00,0x15,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ---#####-##-
// 5 --# # #
// 6 -# #
// 7 # ### #
// 8 # #---# #
// 9 # #---# #
// 10 # #---# #
// 11 # ### #
// 12 -# #
// 13 --# # #
// 14 ---####-# #
// 15 --------# #
// 16 --------# #
// 17 ---------##-
// 000000000011
// 012345678901
const char chr53[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x41,0x52,0xaa,0x28,0x4a,0xaa,0xa8,0x2a,0x02,0xa8,0x28,0x54,0xa8,0x28,0x54,0xa8,0x28,0x54,0xa8,0x2a,0x02,0xa8,0x4a,0xaa,0xa8,0x52,0xa8,0xa8,0x54,0x01,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -##--####---
// 6 # ## #--
// 7 # # #-
// 8 # ## #
// 9 # #--# #
// 10 # #----##-
// 11 # #--------
// 12 # #--------
// 13 # #--------
// 14 # #--------
// 15 # #--------
// 16 # #--------
// 17 -##---------
// 000000000011
// 012345678901
const char chr54[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x40,0x15,0x28,0x2a,0x85,0x28,0xaa,0xa1,0x2a,0xa0,0xa8,0x2a,0x85,0x28,0x2a,0x15,0x41,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ---######---
// 6 --# #--
// 7 -# #-
// 8 # #### #
// 9 # ###-# #
// 10 -# ####-
// 11 --## #--
// 12 -##-## #-
// 13 # #--## #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr55[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x2a,0x01,0x28,0x4a,0xa8,0x01,0x50,0xaa,0x85,0x41,0x0a,0xa1,0x28,0x50,0xa8,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 -----##-----
// 3 ----# #----
// 4 ----# #----
// 5 ---## ##---
// 6 --# #--
// 7 --# #--
// 8 ---## ##---
// 9 ----# #----
// 10 ----# #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 ----# #---
// 15 -----# #--
// 16 ------# #--
// 17 -------##---
// 000000000011
// 012345678901
const char chr56[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x54,0x28,0x15,0x52,0xaa,0x85,0x52,0xaa,0x85,0x54,0x28,0x15,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x2a,0x15,0x55,0x4a,0x85,0x55,0x52,0x85,0x55,0x54,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -##------##-
// 6 # #----# #
// 7 # #----# #
// 8 # #----# #
// 9 # #----# #
// 10 # #----# #
// 11 # #----# #
// 12 # #----# #
// 13 # #----# #
// 14 # #### #
// 15 -# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr57[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x00,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -##------##-
// 6 # #----# #
// 7 # #----# #
// 8 # #----# #
// 9 # #----# #
// 10 # #----# #
// 11 # #----# #
// 12 # #--# #
// 13 -# ## #-
// 14 --# #--
// 15 ---# #---
// 16 ----# #----
// 17 -----##-----
// 000000000011
// 012345678901
const char chr58[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x2a,0x14,0xa8,0x4a,0x82,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -##------##-
// 6 # #----# #
// 7 # #----# #
// 8 # #----# #
// 9 # #-##-# #
// 10 # ## ## #
// 11 # ## ## #
// 12 # ## ## #
// 13 # ## ## #
// 14 # # # #
// 15 -# #-
// 16 --# ## #--
// 17 ---##--##---
// 000000000011
// 012345678901
const char chr59[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x41,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x2a,0x28,0xa8,0x4a,0xaa,0xa1,0x52,0x82,0x85,0x54,0x14,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -##------##-
// 6 # #----# #
// 7 # #--# #
// 8 -# ## #-
// 9 --# #--
// 10 ---# #---
// 11 ----# #----
// 12 ---# #---
// 13 --# #--
// 14 -# ## #-
// 15 # #--# #
// 16 # #----# #
// 17 -##------##-
// 000000000011
// 012345678901
const char chr60[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x2a,0x14,0xa8,0x4a,0x82,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x4a,0x82,0xa1,0x2a,0x14,0xa8,0x28,0x55,0x28,0x41,0x55,0x41};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 -##------##-
// 5 # #----# #
// 6 # #----# #
// 7 # #---# #
// 8 # #---# #
// 9 # #--# #
// 10 # ## #
// 11 -# # #
// 12 --# ## #
// 13 ---####-# #
// 14 ---##### #
// 15 --# #-
// 16 --# #--
// 17 ---######---
// 000000000011
// 012345678901
const char chr61[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x41,0x28,0x55,0x28,0x28,0x55,0x28,0x28,0x54,0xa8,0x28,0x54,0xa8,0x28,0x52,0xa8,0x2a,0x0a,0xa8,0x4a,0xaa,0x28,0x52,0xa8,0x28,0x54,0x01,0x28,0x54,0x00,0xa8,0x52,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -##########-
// 6 # #
// 7 # #
// 8 -####### #
// 9 ------# #-
// 10 -----# #--
// 11 ----# #---
// 12 ---# #----
// 13 --# #-----
// 14 -# ######-
// 15 # #
// 16 # #
// 17 -##########-
// 000000000011
// 012345678901
const char chr62[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x2a,0x15,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x80,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x01};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 --------##--
// 4 -------# #-
// 5 ------# #--
// 6 -----# #---
// 7 ----# #----
// 8 ----# #----
// 9 ----# #----
// 10 ----# #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 -----# #---
// 15 ------# #--
// 16 -------# #-
// 17 --------##--
// 000000000011
// 012345678901
const char chr63[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x05,0x55,0x54,0xa1,0x55,0x52,0x85,0x55,0x4a,0x15,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x4a,0x15,0x55,0x52,0x85,0x55,0x54,0xa1,0x55,0x55,0x05};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ---##-------
// 4 --# #------
// 5 ---# #-----
// 6 ----# #----
// 7 -----# #---
// 8 -----# #---
// 9 -----# #---
// 10 -----# #---
// 11 -----# #---
// 12 -----# #---
// 13 -----# #---
// 14 ----# #----
// 15 ---# #-----
// 16 --# #------
// 17 ---##-------
// 000000000011
// 012345678901
const char chr64[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x15,0x55,0x52,0x85,0x55,0x54,0xa1,0x55,0x55,0x28,0x55,0x55,0x4a,0x15,0x55,0x4a,0x15,0x55,0x4a,0x15,0x55,0x4a,0x15,0x55,0x4a,0x15,0x55,0x4a,0x15,0x55,0x4a,0x15,0x55,0x28,0x55,0x54,0xa1,0x55,0x52,0x85,0x55,0x54,0x15,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 -------##---
// 15 ------# #--
// 16 ------# #--
// 17 -------##---
// 000000000011
// 012345678901
const char chr65[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x15,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x54,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ---######---
// 3 --# #--
// 4 -# #-
// 5 # #### #
// 6 # #----# #
// 7 -##-----# #
// 8 -------# #
// 9 ------# #-
// 10 -----# #--
// 11 ----# #---
// 12 ----# #----
// 13 -----##-----
// 14 -----##-----
// 15 ----# #----
// 16 ----# #----
// 17 -----##-----
// 000000000011
// 012345678901
const char chr66[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0x00,0xa8,0x28,0x55,0x28,0x41,0x55,0x28,0x55,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x2a,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 -----##-----
// 5 ----# #----
// 6 ----# #----
// 7 -----##-----
// 8 ------------
// 9 ------------
// 10 -----##-----
// 11 ----# #----
// 12 ----# #----
// 13 ---# #-----
// 14 --# #------
// 15 ---##-------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr67[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x54,0xa1,0x55,0x52,0x85,0x55,0x54,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 -----##-----
// 5 ----# #----
// 6 ----# #----
// 7 -----##-----
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 -----##-----
// 13 ----# #----
// 14 ----# #----
// 15 -----##-----
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr68[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 -----##-----
// 13 ----# #----
// 14 ----# #----
// 15 ---# #-----
// 16 --# #------
// 17 ---##-------
// 000000000011
// 012345678901
const char chr69[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x54,0xa1,0x55,0x52,0x85,0x55,0x54,0x15,0x55};
 
 
// 0 ------------
// 1 ------#-----
// 2 -----# #----
// 3 ----# #---
// 4 -----# #---
// 5 ------# #---
// 6 ------# #---
// 7 -----# #----
// 8 ------#-----
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr70[] PROGMEM = {0x55,0x55,0x55,0x55,0x51,0x55,0x55,0x48,0x55,0x55,0x2a,0x15,0x55,0x4a,0x15,0x55,0x52,0x15,0x55,0x52,0x15,0x55,0x48,0x55,0x55,0x51,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ---------##-
// 5 --------# #
// 6 -------# #
// 7 ------# #-
// 8 -----# #--
// 9 ----# #---
// 10 ---# #----
// 11 --# #-----
// 12 -# #------
// 13 # #-------
// 14 # #--------
// 15 -##---------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr71[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x2a,0x15,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x2a,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ---#----#---
// 2 --# #--# #--
// 3 -# ## #-
// 4 --# #-# #-
// 5 ---# #--# #-
// 6 ---# #--# #-
// 7 --# #--# #--
// 8 ---#----#---
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr72[] PROGMEM = {0x55,0x55,0x55,0x54,0x55,0x15,0x52,0x14,0x85,0x4a,0x82,0xa1,0x52,0x84,0xa1,0x54,0x85,0x21,0x54,0x85,0x21,0x52,0x14,0x85,0x54,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ----######--
// 8 ---# #-
// 9 ---# #-
// 10 ----######--
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr73[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x05,0x54,0xaa,0xa1,0x54,0xaa,0xa1,0x55,0x00,0x05,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 --------##--
// 3 -------# #-
// 4 ------# #-
// 5 -----# #--
// 6 ----# #---
// 7 ---# #----
// 8 --# #-----
// 9 -# #------
// 10 -# #------
// 11 --# #-----
// 12 ---# #----
// 13 ----# #---
// 14 -----# #--
// 15 ------# #-
// 16 -------# #-
// 17 --------##--
// 000000000011
// 012345678901
const char chr74[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x05,0x55,0x54,0xa1,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x2a,0x15,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x4a,0x85,0x55,0x52,0xa1,0x55,0x54,0xa8,0x55,0x55,0x2a,0x15,0x55,0x4a,0x85,0x55,0x52,0xa1,0x55,0x54,0xa1,0x55,0x55,0x05};
 
 
// 0 ------------
// 1 ------------
// 2 --##--------
// 3 -# #-------
// 4 -# #------
// 5 --# #-----
// 6 ---# #----
// 7 ----# #---
// 8 -----# #--
// 9 ------# #-
// 10 ------# #-
// 11 -----# #--
// 12 ----# #---
// 13 ---# #----
// 14 --# #-----
// 15 -# #------
// 16 -# #-------
// 17 --##--------
// 000000000011
// 012345678901
const char chr75[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x50,0x55,0x55,0x4a,0x15,0x55,0x4a,0x85,0x55,0x52,0xa1,0x55,0x54,0xa8,0x55,0x55,0x2a,0x15,0x55,0x4a,0x85,0x55,0x52,0xa1,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x2a,0x15,0x54,0xa8,0x55,0x52,0xa1,0x55,0x4a,0x85,0x55,0x4a,0x15,0x55,0x50,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ----####----
// 5 ---# #---
// 6 --# #### #--
// 7 -# ###-## #-
// 8 # ## # ## #
// 9 # # ## ## #
// 10 # # ### ## #
// 11 # # ## ## #
// 12 # ## # # #-
// 13 # #-##-# #--
// 14 -# #----##--
// 15 --# ##### #-
// 16 ---# #--
// 17 ----#####---
// 000000000011
// 012345678901
const char chr76[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x55,0x54,0xaa,0x15,0x52,0x00,0x85,0x48,0x04,0x21,0x20,0xa2,0x08,0x22,0x0a,0x08,0x22,0x02,0x08,0x22,0x0a,0x08,0x20,0xa2,0x21,0x21,0x04,0x85,0x48,0x55,0x05,0x52,0x00,0x21,0x54,0xaa,0x85,0x55,0x00,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 -
// 5 -----------
// 6 ------ ----
// 7 ------ --- -
// 8 ------ -- --
// 9 ------ ---
// 10 ------ -----
// 11 ----- ------
// 12 ----- ------
// 13 ---- -------
// 14 ---- -------
// 15 --- --------
// 16 -- ---------
// 17 ------------
// 000000000011
// 012345678901
const char chr77[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xaa,0xaa,0x55,0x55,0x56,0x55,0x59,0x56,0x55,0x59,0x59,0x55,0x59,0x65,0x55,0x5a,0x95,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 -----------
// 4 -----------
// 5 ---------- -
// 6 --------- --
// 7 ------- ---
// 8 ----- ----
// 9 --- -- ----
// 10 - ---- ----
// 11 ------- ----
// 12 ------- ----
// 13 ------- ----
// 14 ------- ----
// 15 ------- ----
// 16 ------- ----
// 17 ------------
// 000000000011
// 012345678901
const char chr78[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x56,0x95,0x55,0x6a,0x55,0x56,0x96,0x55,0x69,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------ -----
// 4 ------ -----
// 5 -
// 6 - ---------
// 7 - ---------
// 8 - ---------
// 9 -----------
// 10 ---------- -
// 11 ---------- -
// 12 --------- --
// 13 --------- --
// 14 -------- ---
// 15 ------- ----
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr79[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x6a,0xaa,0xaa,0x65,0x55,0x56,0x65,0x55,0x56,0x65,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -- -
// 6 ------ -----
// 7 ------ -----
// 8 ------ -----
// 9 ------ -----
// 10 ------ -----
// 11 ------ -----
// 12 ------ -----
// 13 ------ -----
// 14 ------ -----
// 15 ------ -----
// 16 -
// 17 ------------
// 000000000011
// 012345678901
const char chr80[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5a,0xaa,0xa9,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x6a,0xaa,0xaa,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------- ----
// 4 ------- ----
// 5 ------- ----
// 6 -
// 7 ------ ----
// 8 ----- - ----
// 9 ----- - ----
// 10 ---- -- ----
// 11 ---- -- ----
// 12 --- --- ----
// 13 -- ---- ----
// 14 - ----- ----
// 15 ------- ----
// 16 ------ ----
// 17 ------------
// 000000000011
// 012345678901
const char chr81[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x6a,0xaa,0xaa,0x55,0x5a,0x55,0x55,0x66,0x55,0x55,0x66,0x55,0x55,0x96,0x55,0x55,0x96,0x55,0x56,0x56,0x55,0x59,0x56,0x55,0x65,0x56,0x55,0x55,0x56,0x55,0x55,0x5a,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------ -----
// 4 ------ -----
// 5 ------ -----
// 6 -
// 7 ------ ----
// 8 ------ ----
// 9 ----- -----
// 10 ----- -----
// 11 ----- -----
// 12 ---- ------
// 13 ---- ------
// 14 --- -------
// 15 --- -------
// 16 -- ------ -
// 17 ------------
// 000000000011
// 012345678901
const char chr82[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x6a,0xaa,0xaa,0x55,0x59,0x56,0x55,0x59,0x56,0x55,0x65,0x56,0x55,0x65,0x56,0x55,0x65,0x56,0x55,0x95,0x56,0x55,0x95,0x56,0x56,0x55,0x56,0x56,0x55,0x56,0x59,0x55,0x69,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ---- -------
// 4 ---- -------
// 5 -- --
// 6 ----- ------
// 7 ----- ------
// 8 ----- ------
// 9 ------ -----
// 10 -
// 11 ------ -----
// 12 ------- ----
// 13 ------- ----
// 14 ------- ----
// 15 -------- ---
// 16 -------- ---
// 17 ------------
// 000000000011
// 012345678901
const char chr83[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x5a,0xaa,0xa5,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x59,0x55,0x6a,0xaa,0xaa,0x55,0x59,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ----- ------
// 4 ----- ------
// 5 ----
// 6 ---- ------
// 7 --- -------
// 8 -- --------
// 9 - -------- -
// 10 ---------- -
// 11 ---------- -
// 12 --------- --
// 13 --------- --
// 14 -------- ---
// 15 ----- ----
// 16 -- -------
// 17 ------------
// 000000000011
// 012345678901
const char chr84[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0xaa,0xaa,0x55,0x95,0x56,0x56,0x55,0x56,0x59,0x55,0x56,0x65,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x6a,0x55,0x5a,0x95,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 -- ---------
// 4 -- ---------
// 5 --
// 6 -- ---- ----
// 7 - ----- ----
// 8 - ----- ----
// 9 ------- ----
// 10 ------- ----
// 11 ------- ----
// 12 ------- ----
// 13 ------ -----
// 14 ------ -----
// 15 ----- ------
// 16 --- -------
// 17 ------------
// 000000000011
// 012345678901
const char chr85[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x5a,0xaa,0xaa,0x59,0x56,0x55,0x65,0x56,0x55,0x65,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x56,0x95,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -- -
// 6 ---------- -
// 7 ---------- -
// 8 ---------- -
// 9 ---------- -
// 10 ---------- -
// 11 ---------- -
// 12 ---------- -
// 13 ---------- -
// 14 ---------- -
// 15 ---------- -
// 16 -- -
// 17 ------------
// 000000000011
// 012345678901
const char chr86[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5a,0xaa,0xa9,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x5a,0xaa,0xa9,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 --- ----- --
// 4 --- ----- --
// 5 -
// 6 --- ----- --
// 7 --- ----- --
// 8 --- ----- --
// 9 --------- --
// 10 --------- --
// 11 --------- --
// 12 --------- --
// 13 -------- ---
// 14 -------- ---
// 15 ------ ----
// 16 ---- ------
// 17 ------------
// 000000000011
// 012345678901
const char chr87[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x55,0x65,0x56,0x55,0x65,0x6a,0xaa,0xaa,0x56,0x55,0x65,0x56,0x55,0x65,0x56,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x5a,0x55,0x55,0xa5,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 - -------
// 5 ----- ------
// 6 ------------
// 7 -----------
// 8 - ------
// 9 ----- -----
// 10 -----------
// 11 -----------
// 12 ---------- -
// 13 ---------- -
// 14 --------- --
// 15 ------- ---
// 16 - -----
// 17 ------------
// 000000000011
// 012345678901
const char chr88[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0x95,0x55,0x55,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x6a,0x95,0x56,0x55,0x65,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x56,0x95,0x6a,0xa9,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 - -
// 6 ---------- -
// 7 --------- --
// 8 --------- --
// 9 -------- ---
// 10 -------- ---
// 11 ------- ----
// 12 ------ ----
// 13 ----- -- ---
// 14 ---- ---- --
// 15 --- ------ -
// 16 - --------
// 17 ------------
// 000000000011
// 012345678901
const char chr89[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xaa,0xa9,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x5a,0x55,0x55,0x65,0x95,0x55,0x95,0x65,0x56,0x55,0x59,0x69,0x55,0x56,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 --- --------
// 4 --- --------
// 5 --- --------
// 6 --- --------
// 7 --- -
// 8 - ------
// 9 --- ------ -
// 10 --- ----- --
// 11 --- --------
// 12 --- --------
// 13 --- --------
// 14 --- --------
// 15 ---- -------
// 16 ----- -
// 17 ------------
// 000000000011
// 012345678901
const char chr90[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x6a,0xaa,0x6a,0x95,0x56,0x56,0x55,0x59,0x56,0x55,0x65,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x55,0x95,0x55,0x55,0x6a,0xa9,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 -----------
// 5 - ---------
// 6 -- --------
// 7 -- --------
// 8 --- -------
// 9 ---- ------
// 10 ---------- -
// 11 ---------- -
// 12 --------- --
// 13 -------- ---
// 14 ------- ----
// 15 ----- -----
// 16 -- -------
// 17 ------------
// 000000000011
// 012345678901
const char chr91[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x65,0x55,0x56,0x59,0x55,0x56,0x59,0x55,0x56,0x56,0x55,0x56,0x55,0x95,0x56,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x69,0x55,0x5a,0x95,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ----- ------
// 4 ----- ------
// 5 -----
// 6 ---- ------
// 7 ---- ------
// 8 --- -------
// 9 - -- ---- -
// 10 ------ -- -
// 11 -------- --
// 12 --------- --
// 13 -------- ---
// 14 ------ ----
// 15 ---- ------
// 16 - --------
// 17 ------------
// 000000000011
// 012345678901
const char chr92[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x6a,0xaa,0x55,0x95,0x56,0x55,0x95,0x56,0x56,0x55,0x56,0x69,0x65,0x59,0x55,0x5a,0x59,0x55,0x55,0xa5,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x5a,0x55,0x55,0xa5,0x55,0x6a,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 --------- --
// 4 ------- ---
// 5 ----- -----
// 6 --- -- ----
// 7 ------- ----
// 8 ------- ----
// 9 -
// 10 ------- ----
// 11 ------- ----
// 12 ------ -----
// 13 ------ -----
// 14 ----- ------
// 15 ---- -------
// 16 -- --------
// 17 ------------
// 000000000011
// 012345678901
const char chr93[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x55,0x56,0x95,0x55,0x69,0x55,0x56,0x96,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x6a,0xaa,0xaa,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x5a,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 - -- ----- -
// 5 - -- ----- -
// 6 -- -- ---- -
// 7 -- -- ---- -
// 8 -- -- ---- -
// 9 ---------- -
// 10 --------- --
// 11 --------- --
// 12 -------- ---
// 13 -------- ---
// 14 ------- ----
// 15 ------ -----
// 16 ---- ------
// 17 ------------
// 000000000011
// 012345678901
const char chr94[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x95,0x59,0x65,0x95,0x59,0x59,0x65,0x59,0x59,0x65,0x59,0x59,0x65,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0xa5,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 --- --
// 5 ------------
// 6 ------------
// 7 ------------
// 8 -
// 9 ------ -----
// 10 ------ -----
// 11 ------ -----
// 12 ------ -----
// 13 ----- ------
// 14 ----- ------
// 15 ---- -------
// 16 -- --------
// 17 ------------
// 000000000011
// 012345678901
const char chr95[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0xaa,0xa5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xaa,0xaa,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x5a,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 --- --------
// 4 --- --------
// 5 --- --------
// 6 --- --------
// 7 --- --------
// 8 --- -------
// 9 --- - -----
// 10 --- --- ----
// 11 --- ---- ---
// 12 --- ----- --
// 13 --- --------
// 14 --- --------
// 15 --- --------
// 16 --- --------
// 17 ------------
// 000000000011
// 012345678901
const char chr96[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x95,0x55,0x56,0x69,0x55,0x56,0x56,0x55,0x56,0x55,0x95,0x56,0x55,0x65,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------- ----
// 4 ------- ----
// 5 ------- ----
// 6 -
// 7 ------- ----
// 8 ------- ----
// 9 ------- ----
// 10 ------- ----
// 11 ------- ----
// 12 ------ -----
// 13 ------ -----
// 14 ----- ------
// 15 ---- -------
// 16 -- --------
// 17 ------------
// 000000000011
// 012345678901
const char chr97[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x6a,0xaa,0xaa,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x5a,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 --- --
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 -
// 17 ------------
// 000000000011
// 012345678901
const char chr98[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0xaa,0xa5,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xaa,0xaa,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 --- -
// 6 ---------- -
// 7 ---------- -
// 8 ---------- -
// 9 ---- ---- --
// 10 ----- --- --
// 11 ------ - ---
// 12 ------- ----
// 13 ------- ----
// 14 ------ - ---
// 15 ---- --- --
// 16 -- ------ -
// 17 ------------
// 000000000011
// 012345678901
const char chr99[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0xaa,0xa9,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x95,0x65,0x55,0x65,0x65,0x55,0x59,0x95,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x59,0x95,0x55,0xa5,0x65,0x5a,0x55,0x59,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ----- -----
// 4 ------- ----
// 5 ------------
// 6 -- -
// 7 --------- --
// 8 -------- ---
// 9 ------- ----
// 10 ------ ----
// 11 ----- - --
// 12 --- - --- -
// 13 - --- ----
// 14 ------ -----
// 15 ------ -----
// 16 ------ -----
// 17 ------------
// 000000000011
// 012345678901
const char chr100[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x69,0x55,0x55,0x56,0x55,0x55,0x55,0x55,0x5a,0xaa,0xa9,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x5a,0x55,0x55,0x69,0xa5,0x56,0x99,0x59,0x69,0x59,0x56,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ---------- -
// 5 ---------- -
// 6 ---------- -
// 7 ---------- -
// 8 --------- --
// 9 --------- --
// 10 -------- ---
// 11 -------- ---
// 12 ------- ----
// 13 ------ -----
// 14 ----- ------
// 15 ---- -------
// 16 -- --------
// 17 ------------
// 000000000011
// 012345678901
const char chr101[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x5a,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ----- -- ---
// 5 ----- -- ---
// 6 ----- --- --
// 7 ---- ---- --
// 8 ---- ---- --
// 9 ---- ---- --
// 10 --- ------ -
// 11 --- ------ -
// 12 --- ------ -
// 13 -- --------
// 14 -- --------
// 15 -- --------
// 16 - ---------
// 17 ------------
// 000000000011
// 012345678901
const char chr102[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x95,0x55,0x65,0x95,0x55,0x65,0x65,0x55,0x95,0x65,0x55,0x95,0x65,0x55,0x95,0x65,0x56,0x55,0x59,0x56,0x55,0x59,0x56,0x55,0x59,0x59,0x55,0x56,0x59,0x55,0x56,0x59,0x55,0x56,0x65,0x55,0x56,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 - ----------
// 4 - ----------
// 5 - ----------
// 6 - ----------
// 7 - ------ -
// 8 - ----
// 9 - ----------
// 10 - ----------
// 11 - ----------
// 12 - ----------
// 13 - ----------
// 14 - ----------
// 15 -- --------
// 16 --- -
// 17 ------------
// 000000000011
// 012345678901
const char chr103[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0xa9,0x6a,0xaa,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x59,0x55,0x56,0x56,0xaa,0xa9,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 - -
// 6 ---------- -
// 7 ---------- -
// 8 ---------- -
// 9 ---------- -
// 10 --------- --
// 11 --------- --
// 12 -------- ---
// 13 -------- ---
// 14 ------- ----
// 15 ----- -----
// 16 --- -------
// 17 ------------
// 000000000011
// 012345678901
const char chr104[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xaa,0xa9,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x69,0x55,0x56,0x95,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ---- -------
// 6 ---- ------
// 7 --- - ------
// 8 --- -- -----
// 9 -- ---- ----
// 10 -- ---- ----
// 11 - ------ ---
// 12 --------- --
// 13 --------- --
// 14 ---------- -
// 15 -----------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr105[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x95,0x55,0x55,0xa5,0x55,0x56,0x65,0x55,0x56,0x59,0x55,0x59,0x56,0x55,0x59,0x56,0x55,0x65,0x55,0x95,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x59,0x55,0x55,0x56,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------ -----
// 3 ------ -----
// 4 -
// 5 ------ -----
// 6 ------ -----
// 7 ------ -----
// 8 ------ -----
// 9 --- -- -- --
// 10 --- -- -- --
// 11 -- --- --- -
// 12 -- --- --- -
// 13 -- --- --- -
// 14 - ---- ----
// 15 ------ -----
// 16 ------ -----
// 17 ------------
// 000000000011
// 012345678901
const char chr106[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x6a,0xaa,0xaa,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x56,0x59,0x65,0x56,0x59,0x65,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x65,0x59,0x56,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -
// 6 -----------
// 7 -----------
// 8 ---------- -
// 9 ---------- -
// 10 --- ----- --
// 11 ---- --- ---
// 12 ----- ----
// 13 ------ -----
// 14 ------- ----
// 15 -------- ---
// 16 --------- --
// 17 ------------
// 000000000011
// 012345678901
const char chr107[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xaa,0xaa,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0x59,0x56,0x55,0x65,0x55,0x95,0x95,0x55,0x6a,0x55,0x55,0x59,0x55,0x55,0x56,0x55,0x55,0x55,0x95,0x55,0x55,0x65,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -- ------
// 6 ------ ----
// 7 -------- --
// 8 ------------
// 9 -- ------
// 10 ------ ----
// 11 -------- --
// 12 ------------
// 13 ------------
// 14 -- ------
// 15 ------ ----
// 16 -------- --
// 17 ------------
// 000000000011
// 012345678901
const char chr108[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5a,0xa5,0x55,0x55,0x5a,0x55,0x55,0x55,0xa5,0x55,0x55,0x55,0x5a,0xa5,0x55,0x55,0x5a,0x55,0x55,0x55,0xa5,0x55,0x55,0x55,0x55,0x55,0x55,0x5a,0xa5,0x55,0x55,0x5a,0x55,0x55,0x55,0xa5,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------ -----
// 5 ------ -----
// 6 ----- ------
// 7 ----- ------
// 8 ---- -------
// 9 ---- -------
// 10 ---- -- ----
// 11 --- ---- ---
// 12 --- ---- ---
// 13 -- ------ --
// 14 -- --- --
// 15 - ---- -
// 16 -----------
// 17 ------------
// 000000000011
// 012345678901
const char chr109[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x55,0x96,0x55,0x56,0x55,0x95,0x56,0x55,0x95,0x59,0x55,0x65,0x59,0x5a,0xa5,0x6a,0xa5,0x59,0x55,0x55,0x56,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ---------- -
// 4 ---------- -
// 5 ---------- -
// 6 --------- --
// 7 ---- ---- --
// 8 ----- -- --
// 9 ------- ---
// 10 -------- ---
// 11 ------- - --
// 12 ------- -- -
// 13 ------ ----
// 14 ----- ------
// 15 --- -------
// 16 - ---------
// 17 ------------
// 000000000011
// 012345678901
const char chr110[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x95,0x65,0x55,0x69,0x65,0x55,0x56,0x95,0x55,0x55,0x95,0x55,0x56,0x65,0x55,0x56,0x59,0x55,0x59,0x56,0x55,0x65,0x55,0x56,0x95,0x55,0x69,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 -- -
// 5 ----- ------
// 6 ----- ------
// 7 ----- ------
// 8 ----- ------
// 9 -
// 10 ----- ------
// 11 ----- ------
// 12 ----- ------
// 13 ----- ------
// 14 ----- ------
// 15 ----- ------
// 16 ------ -
// 17 ------------
// 000000000011
// 012345678901
const char chr111[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5a,0xaa,0xa9,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x6a,0xaa,0xaa,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x5a,0xa9,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 -----##-----
// 12 ----# #----
// 13 ---# #---
// 14 --# #--
// 15 -# #-
// 16 # #
// 17 ############
// 000000000011
// 012345678901
const char chr112[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0xaa,0xa8,0x00,0x00,0x00};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -----##-----
// 6 ----# #----
// 7 ---# #---
// 8 --# #--
// 9 -# #-
// 10 # #
// 11 ############
// 12 ----# #----
// 13 ---# #---
// 14 --# #--
// 15 -# #-
// 16 # #
// 17 ############
// 000000000011
// 012345678901
const char chr113[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0xaa,0xa8,0x00,0x00,0x00,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0xaa,0xa8,0x00,0x00,0x00};
 
 
// 0 ----# #----
// 1 ---# #---
// 2 --# #--
// 3 -# #-
// 4 # #
// 5 ############
// 6 ----# #----
// 7 ---# #---
// 8 --# #--
// 9 -# #-
// 10 # #
// 11 ############
// 12 ----# #----
// 13 ---# #---
// 14 --# #--
// 15 -# #-
// 16 # #
// 17 ############
// 000000000011
// 012345678901
const char chr114[] PROGMEM = {0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0xaa,0xa8,0x00,0x00,0x00,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0xaa,0xa8,0x00,0x00,0x00,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0xaa,0xa8,0x00,0x00,0x00};
 
 
// 0 ----####----
// 1 ---######---
// 2 --########--
// 3 -##########-
// 4 ############
// 5 ############
// 6 ----####----
// 7 ---######---
// 8 --########--
// 9 -##########-
// 10 ############
// 11 ############
// 12 ----####----
// 13 ---######---
// 14 --########--
// 15 -##########-
// 16 ############
// 17 ############
// 000000000011
// 012345678901
const char chr115[] PROGMEM = {0x55,0x00,0x55,0x54,0x00,0x15,0x50,0x00,0x05,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x55,0x54,0x00,0x15,0x50,0x00,0x05,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0x00,0x55,0x54,0x00,0x15,0x50,0x00,0x05,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00};
 
 
// 0 ############
// 1 ############
// 2 -##########-
// 3 --########--
// 4 ---######---
// 5 ----####----
// 6 ############
// 7 ############
// 8 -##########-
// 9 --########--
// 10 ---######---
// 11 ----####----
// 12 ############
// 13 ############
// 14 -##########-
// 15 --########--
// 16 ---######---
// 17 ----####----
// 000000000011
// 012345678901
const char chr116[] PROGMEM = {0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x50,0x00,0x05,0x54,0x00,0x15,0x55,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x50,0x00,0x05,0x54,0x00,0x15,0x55,0x00,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x01,0x50,0x00,0x05,0x54,0x00,0x15,0x55,0x00,0x55};
 
 
// 0 ############
// 1 # #
// 2 -# #-
// 3 --# #--
// 4 ---# #---
// 5 ----# #----
// 6 ############
// 7 # #
// 8 -# #-
// 9 --# #--
// 10 ---# #---
// 11 ----# #----
// 12 ############
// 13 # #
// 14 -# #-
// 15 --# #--
// 16 ---# #---
// 17 ----# #----
// 000000000011
// 012345678901
const char chr117[] PROGMEM = {0x00,0x00,0x00,0x2a,0xaa,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x00,0x00,0x00,0x2a,0xaa,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x00,0x00,0x00,0x2a,0xaa,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55};
 
 
// 0 ############
// 1 # #
// 2 -# #-
// 3 --# #--
// 4 ---# #---
// 5 ----# #----
// 6 ############
// 7 # #
// 8 -# #-
// 9 --# #--
// 10 ---# #---
// 11 ----# #----
// 12 -----##-----
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr118[] PROGMEM = {0x00,0x00,0x00,0x2a,0xaa,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x00,0x00,0x00,0x2a,0xaa,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ############
// 1 # #
// 2 -# #-
// 3 --# #--
// 4 ---# #---
// 5 ----# #----
// 6 -----##-----
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr119[] PROGMEM = {0x00,0x00,0x00,0x2a,0xaa,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 - -
// 6 - -------- -
// 7 - -------- -
// 8 - -------- -
// 9 - -------- -
// 10 ---------- -
// 11 ---------- -
// 12 --------- --
// 13 --------- --
// 14 -------- ---
// 15 ------ ----
// 16 --- ------
// 17 ------------
// 000000000011
// 012345678901
const char chr120[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xaa,0xa9,0x65,0x55,0x59,0x65,0x55,0x59,0x65,0x55,0x59,0x65,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x5a,0x55,0x56,0xa5,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 - ----------
// 6 -- -------
// 7 ---- -----
// 8 ------ ----
// 9 -----------
// 10 ---------- -
// 11 ---------- -
// 12 --------- --
// 13 -------- ---
// 14 ------- ----
// 15 ----- -----
// 16 -- -------
// 17 ------------
// 000000000011
// 012345678901
const char chr121[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x55,0x55,0x5a,0x55,0x56,0x55,0xa5,0x56,0x55,0x59,0x56,0x55,0x55,0x56,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x69,0x55,0x5a,0x95,0x55,0x55,0x55,0x55};
 
 
// 0 ---------- -
// 1 -------- --
// 2 --------- --
// 3 - ----------
// 4 - ----------
// 5 - ----------
// 6 - ----------
// 7 - ------ -
// 8 - ----
// 9 - ----------
// 10 - ----------
// 11 - ----------
// 12 - ----------
// 13 - ----------
// 14 - ----------
// 15 -- --------
// 16 --- -
// 17 ------------
// 000000000011
// 012345678901
const char chr122[] PROGMEM = {0x55,0x55,0x59,0x55,0x55,0x96,0x55,0x55,0x65,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0xa9,0x6a,0xaa,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x59,0x55,0x56,0x56,0xaa,0xa9,0x55,0x55,0x55};
 
 
// 0 --------- -
// 1 -------- --
// 2 --------- -
// 3 ------------
// 4 ------------
// 5 - -
// 6 ---------- -
// 7 ---------- -
// 8 ---------- -
// 9 ---------- -
// 10 --------- --
// 11 --------- --
// 12 -------- ---
// 13 -------- ---
// 14 ------- ----
// 15 ----- -----
// 16 --- -------
// 17 ------------
// 000000000011
// 012345678901
const char chr123[] PROGMEM = {0x55,0x55,0x69,0x55,0x55,0x96,0x55,0x55,0x69,0x55,0x55,0x55,0x55,0x55,0x55,0x6a,0xaa,0xa9,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x69,0x55,0x56,0x95,0x55,0x55,0x55,0x55};
 
 
// 0 --------- -
// 1 -------- --
// 2 --------- -
// 3 ------ -----
// 4 ------ -----
// 5 - -
// 6 ------ -----
// 7 ------ -----
// 8 ------ -----
// 9 --- -- -- --
// 10 --- -- -- --
// 11 -- --- --- -
// 12 -- --- --- -
// 13 -- --- --- -
// 14 - ---- ----
// 15 ------ -----
// 16 ------ -----
// 17 ------------
// 000000000011
// 012345678901
const char chr124[] PROGMEM = {0x55,0x55,0x69,0x55,0x55,0x96,0x55,0x55,0x69,0x55,0x59,0x55,0x55,0x59,0x55,0x6a,0xaa,0xa9,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x56,0x59,0x65,0x56,0x59,0x65,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x65,0x59,0x56,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x55,0x55};
 
 
// 0 ---------- -
// 1 -------- --
// 2 --------- --
// 3 - ----------
// 4 - ----------
// 5 - ----------
// 6 - ----------
// 7 - ------ -
// 8 - ----
// 9 - ----------
// 10 - ----------
// 11 - ----------
// 12 - ----------
// 13 - ----------
// 14 - ----------
// 15 -- --------
// 16 --- -
// 17 ------------
// 000000000011
// 012345678901
const char chr125[] PROGMEM = {0x55,0x55,0x59,0x55,0x55,0x96,0x55,0x55,0x65,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0xa9,0x6a,0xaa,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x59,0x55,0x56,0x56,0xaa,0xa9,0x55,0x55,0x55};
 
 
// 0 ---------- -
// 1 -------- --
// 2 --------- --
// 3 ------ -----
// 4 ------ -----
// 5 - -
// 6 ------ -----
// 7 ------ -----
// 8 ------ -----
// 9 --- -- -- --
// 10 --- -- -- --
// 11 -- --- --- -
// 12 -- --- --- -
// 13 -- --- --- -
// 14 - ---- ----
// 15 ------ -----
// 16 ------ -----
// 17 ------------
// 000000000011
// 012345678901
const char chr126[] PROGMEM = {0x55,0x55,0x59,0x55,0x55,0x96,0x55,0x55,0x65,0x55,0x59,0x55,0x55,0x59,0x55,0x6a,0xaa,0xa9,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x56,0x59,0x65,0x56,0x59,0x65,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x59,0x65,0x59,0x56,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x55,0x55};
 
 
// 0 ---------- -
// 1 -------- --
// 2 --------- --
// 3 ----- ------
// 4 ----- ------
// 5 ----
// 6 ---- ------
// 7 --- -------
// 8 -- --------
// 9 - -------- -
// 10 ---------- -
// 11 ---------- -
// 12 --------- --
// 13 --------- --
// 14 -------- ---
// 15 ----- ----
// 16 -- -------
// 17 ------------
// 000000000011
// 012345678901
const char chr127[] PROGMEM = {0x55,0x55,0x59,0x55,0x55,0x96,0x55,0x55,0x65,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0xaa,0xaa,0x55,0x95,0x56,0x56,0x55,0x56,0x59,0x55,0x56,0x65,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x6a,0x55,0x5a,0x95,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 -#----------
// 2 # #---------
// 3 # #---------
// 4 # ###-------
// 5 # # #-------
// 6 # #####----
// 7 # # # #----
// 8 ##-## # #---
// 9 ----# #----
// 10 ----# ###---
// 11 ----# ## #--
// 12 ----#### ###
// 13 -------# #
// 14 -------# # #
// 15 -------# # #
// 16 -------##-##
// 17 ------------
// 000000000011
// 012345678901
const char chr128[] PROGMEM = {0x55,0x55,0x55,0x45,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x20,0x15,0x55,0x22,0x15,0x55,0x28,0x00,0x55,0x22,0x28,0x55,0x04,0x22,0x15,0x55,0x28,0x55,0x55,0x20,0x15,0x55,0x20,0x85,0x55,0x00,0x80,0x55,0x54,0xa8,0x55,0x54,0x88,0x55,0x54,0x88,0x55,0x54,0x10,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 -- ---- ---
// 9 - ## -- # --
// 10 # # # # -
// 11 # # # # --
// 12 - ## # # ---
// 13 -- # # ---
// 14 -- # # ## --
// 15 - # # # # -
// 16 # # # # -
// 17 - # -- ## --
// 000000000011
// 012345678901
const char chr129[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5a,0x55,0x95,0x60,0x96,0x25,0x8a,0x28,0x89,0x8a,0x22,0x25,0x60,0x88,0x95,0x5a,0x22,0x95,0x58,0x88,0x25,0x62,0x22,0x89,0x88,0xa2,0x89,0x62,0x58,0x25};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 # # # # ####
// 7 ------# #
// 8 #-------# #
// 9 ------# # #
// 10 #-----# #-#
// 11 ----# #---#
// 12 #---# #----
// 13 #-# #-----#
// 14 # # #------
// 15 # #-------#
// 16 # #------
// 17 #### # # # #
// 000000000011
// 012345678901
const char chr130[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x22,0x22,0x00,0x95,0x54,0xa8,0x15,0x55,0x28,0x95,0x54,0x88,0x15,0x52,0x12,0x95,0x48,0x54,0x15,0x21,0x56,0x84,0x85,0x54,0x22,0x15,0x56,0x28,0x55,0x54,0x2a,0x15,0x56,0x00,0x88,0x88};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ----- ------
// 6 ---- # -----
// 7 --- # # ----
// 8 -- # # ---
// 9 - # # --
// 10 -- # # ---
// 11 --- # # ----
// 12 ---- # -----
// 13 ----- ------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr131[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x55,0x55,0x89,0x55,0x56,0x22,0x55,0x58,0xa8,0x95,0x62,0xaa,0x25,0x58,0xa8,0x95,0x56,0x22,0x55,0x55,0x89,0x55,0x55,0x65,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 -#######----
// 1 # #---
// 2 # ## ## #---
// 3 # ## ## #---
// 4 # #-#-# #---
// 5 -#-###-#----
// 6 -## ##----
// 7 -# ### #----
// 8 -# #----
// 9 -# ### #----
// 10 -# #-# #----
// 11 --#---#-----
// 12 -# #--------
// 13 -# #####----
// 14 -# #----
// 15 -# ### #----
// 16 -# #-# #----
// 17 --#---#-----
// 000000000011
// 012345678901
const char chr132[] PROGMEM = {0x40,0x00,0x55,0x2a,0xaa,0x15,0x20,0x82,0x15,0x20,0x82,0x15,0x21,0x12,0x15,0x44,0x04,0x55,0x42,0xa0,0x55,0x48,0x08,0x55,0x4a,0xa8,0x55,0x48,0x08,0x55,0x48,0x48,0x55,0x51,0x51,0x55,0x48,0x55,0x55,0x48,0x00,0x55,0x4a,0xa8,0x55,0x48,0x08,0x55,0x48,0x48,0x55,0x51,0x51,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # ## #
// 7 # ## ## #
// 8 ####
// 9 ##
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr133[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0x08,0x28,0x28,0x28,0xaa,0x00,0xaa,0xaa,0x82,0xaa,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1
// 2 ############
// 3 ## ## ###
// 4 #### ## # ##
// 5 ### ## # ##
// 6 #### ## # ##
// 7 ## ## ###
// 8 ############
// 9 ## # #####
// 10 ## #########
// 11 ## ## # # #
// 12 ## ### ## ##
// 13 ## ### # # #
// 14 ############
// 15
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr134[] PROGMEM = {0x55,0x55,0x55,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x0a,0x82,0x80,0x00,0x82,0x20,0x02,0x82,0x20,0x00,0x82,0x20,0x0a,0x82,0x80,0x00,0x00,0x00,0x0a,0x88,0x00,0x08,0x00,0x00,0x0a,0x08,0x88,0x08,0x08,0x20,0x08,0x08,0x88,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 --##--------
// 1 -# #-------
// 2 # ## #------
// 3 # ## #------
// 4 # #------
// 5 # ## #------
// 6 # ## #------
// 7 -#--#-------
// 8 ---# #------
// 9 ---# #------
// 10 ---# #------
// 11 ---# ##-###-
// 12 ---# # #
// 13 ----###-# #-
// 14 --------# #-
// 15 --------# #-
// 16 --------# #-
// 17 ---------#--
// 000000000011
// 012345678901
const char chr135[] PROGMEM = {0x50,0x55,0x55,0x4a,0x15,0x55,0x20,0x85,0x55,0x20,0x85,0x55,0x2a,0x85,0x55,0x20,0x85,0x55,0x20,0x85,0x55,0x45,0x15,0x55,0x54,0x85,0x55,0x54,0x85,0x55,0x54,0x85,0x55,0x54,0x81,0x01,0x54,0xa8,0xa8,0x55,0x01,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x45};
 
 
// 0 -#---#------
// 1 # #-# #-----
// 2 # #-# #-----
// 3 # #-# #-----
// 4 # #-# #-----
// 5 -# # #------
// 6 --# ####----
// 7 ---# #---
// 8 ---# ###----
// 9 ---# #----
// 10 ---# ##-#---
// 11 ---# ### #--
// 12 ---# #--
// 13 ----#### #--
// 14 -------# #--
// 15 -------# ###
// 16 -------#
// 17 --------####
// 000000000011
// 012345678901
const char chr136[] PROGMEM = {0x45,0x45,0x55,0x21,0x21,0x55,0x21,0x21,0x55,0x21,0x21,0x55,0x21,0x21,0x55,0x48,0x85,0x55,0x52,0x00,0x55,0x54,0xaa,0x15,0x54,0x80,0x55,0x54,0xa8,0x55,0x54,0x81,0x15,0x54,0x80,0x85,0x54,0xaa,0x85,0x55,0x00,0x85,0x55,0x54,0x85,0x55,0x54,0x80,0x55,0x54,0xaa,0x55,0x55,0x00};
 
 
// 0 ------------
// 1 -####-------
// 2 # ##------
// 3 # ## #------
// 4 # ## #------
// 5 # ## #------
// 6 # ####----
// 7 -### #---
// 8 ---# ###----
// 9 ---# #---
// 10 ---#### #---
// 11 ---# ###-
// 12 ----## #
// 13 ------## ##-
// 14 -------# #--
// 15 -------# #--
// 16 -------# #--
// 17 --------#---
// 000000000011
// 012345678901
const char chr137[] PROGMEM = {0x55,0x55,0x55,0x40,0x15,0x55,0x2a,0x05,0x55,0x20,0x85,0x55,0x20,0x85,0x55,0x20,0x85,0x55,0x2a,0x00,0x55,0x40,0xaa,0x15,0x54,0x80,0x55,0x54,0xaa,0x15,0x54,0x02,0x15,0x54,0xaa,0x01,0x55,0x0a,0xa8,0x55,0x50,0x81,0x55,0x54,0x85,0x55,0x54,0x85,0x55,0x54,0x85,0x55,0x55,0x15};
 
 
// 0 -#######----
// 1 # #---
// 2 # ## ## #---
// 3 # ## ## #---
// 4 # ## ## #---
// 5 # #-#-# #---
// 6 -#-----#----
// 7 -#######----
// 8 # #---
// 9 # #---
// 10 -#######----
// 11 --#####-----
// 12 -# #----
// 13 -# #####----
// 14 -# #----
// 15 -##### #----
// 16 -# #----
// 17 --#####-----
// 000000000011
// 012345678901
const char chr138[] PROGMEM = {0x40,0x00,0x55,0x2a,0xaa,0x15,0x20,0x82,0x15,0x20,0x82,0x15,0x20,0x82,0x15,0x21,0x12,0x15,0x45,0x54,0x55,0x40,0x00,0x55,0x2a,0xaa,0x15,0x2a,0xaa,0x15,0x40,0x00,0x55,0x50,0x01,0x55,0x4a,0xa8,0x55,0x48,0x00,0x55,0x4a,0xa8,0x55,0x40,0x08,0x55,0x4a,0xa8,0x55,0x50,0x01,0x55};
 
 
// 0 -- -------
// 1 - ### ------
// 2 ## ## -----
// 3 # - # -----
// 4 ## ## -----
// 5 - ### ------
// 6 -- -------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr139[] PROGMEM = {0x5a,0x95,0x55,0x60,0x25,0x55,0x82,0x09,0x55,0x89,0x89,0x55,0x82,0x09,0x55,0x60,0x25,0x55,0x5a,0x95,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 -#######----
// 12 # #---
// 13 # ## ## #---
// 14 # ## ## #---
// 15 # ## ## #---
// 16 # #-#-# #---
// 17 -#-----#----
// 000000000011
// 012345678901
const char chr140[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x55,0x2a,0xaa,0x15,0x20,0x82,0x15,0x20,0x82,0x15,0x20,0x82,0x15,0x21,0x12,0x15,0x45,0x54,0x55};
 
 
// 0 ############
// 1 -- # -------
// 2 - # # ------
// 3 # # -
// 4 ### ###### -
// 5 # # # # -
// 6 - # # # #
// 7 - # # # ###
// 8 - # # # #
// 9 - # # # # #
// 10 - # # # # #
// 11 - # # # # #
// 12 # # #####
// 13 ### ###
// 14 # # -----
// 15 - # # ------
// 16 -- # -------
// 17 ############
// 000000000011
// 012345678901
const char chr141[] PROGMEM = {0x00,0x00,0x00,0x58,0x95,0x55,0x62,0x25,0x55,0x8a,0x8a,0xa9,0x02,0x00,0x09,0xa2,0x28,0x89,0x62,0x28,0x8a,0x62,0x28,0x80,0x62,0x28,0xa8,0x62,0x28,0x88,0x62,0x28,0x88,0x62,0x28,0x88,0xa2,0x28,0x00,0x02,0x02,0xaa,0x8a,0x89,0x55,0x62,0x25,0x55,0x58,0x95,0x55,0x00,0x00,0x00};
 
 
// 0 ------- ----
// 1 ------ # ---
// 2 ------ # ---
// 3 ---- # ---
// 4 --- #### ---
// 5 -- # # ---
// 6 -- # - # ---
// 7 -- # # ---
// 8 --- #### ---
// 9 ---- ----
// 10 - -------- -
// 11 # ------ #
// 12 # -#--#- #
// 13 # # ## # #
// 14 ## ##
// 15 # # ## # #
// 16 # -#--#- #
// 17 - -------- -
// 000000000011
// 012345678901
const char chr142[] PROGMEM = {0x55,0x56,0x55,0x55,0x58,0x95,0x55,0x58,0x95,0x55,0xa8,0x95,0x56,0x00,0x95,0x58,0xa8,0x95,0x58,0x98,0x95,0x58,0xa8,0x95,0x56,0x00,0x95,0x55,0xaa,0x55,0x65,0x55,0x59,0x89,0x55,0x62,0x89,0x14,0x62,0x88,0x82,0x22,0x82,0xaa,0x82,0x88,0x82,0x22,0x89,0x14,0x62,0x65,0x55,0x59};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 -------- ---
// 4 --------- --
// 5 -------- ---
// 6 ------- ----
// 7 ----- -----
// 8 --- -------
// 9 -- ---------
// 10 -- ---------
// 11 --- -------
// 12 ----- -----
// 13 ------- ---
// 14 --------- --
// 15 ---------- -
// 16 ---------- -
// 17 ------------
// 000000000011
// 012345678901
const char chr143[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x95,0x55,0x55,0x65,0x55,0x55,0x95,0x55,0x56,0x55,0x55,0x69,0x55,0x56,0x95,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x56,0x95,0x55,0x55,0x69,0x55,0x55,0x56,0x95,0x55,0x55,0x65,0x55,0x55,0x59,0x55,0x55,0x59,0x55,0x55,0x55};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ## #-
// 4 -# #-
// 5 -# #-
// 6 -# #-
// 7 -# #-
// 8 -# #-
// 9 -# #-
// 10 -# #-
// 11 -# #-
// 12 -# #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr144[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x4a,0x82,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# #-
// 5 -# #-
// 6 -# #-
// 7 -# #-
// 8 -# #-
// 9 -# #-
// 10 -# #-
// 11 -# #-
// 12 -# #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr145[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# #-
// 6 -# #-
// 7 -# #-
// 8 -# #-
// 9 -# #-
// 10 -# #-
// 11 -# #-
// 12 -# #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr146[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# #-
// 7 -# #-
// 8 -# #-
// 9 -# #-
// 10 -# #-
// 11 -# #-
// 12 -# #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr147[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# ###### #-
// 7 -# #-
// 8 -# #-
// 9 -# #-
// 10 -# #-
// 11 -# #-
// 12 -# #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr148[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# ###### #-
// 7 -# ###### #-
// 8 -# #-
// 9 -# #-
// 10 -# #-
// 11 -# #-
// 12 -# #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr149[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# ###### #-
// 7 -# ###### #-
// 8 -# ###### #-
// 9 -# #-
// 10 -# #-
// 11 -# #-
// 12 -# #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr150[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# ###### #-
// 7 -# ###### #-
// 8 -# ###### #-
// 9 -# ###### #-
// 10 -# #-
// 11 -# #-
// 12 -# #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr151[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# ###### #-
// 7 -# ###### #-
// 8 -# ###### #-
// 9 -# ###### #-
// 10 -# ###### #-
// 11 -# #-
// 12 -# #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr152[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# ###### #-
// 7 -# ###### #-
// 8 -# ###### #-
// 9 -# ###### #-
// 10 -# ###### #-
// 11 -# ###### #-
// 12 -# #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr153[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# ###### #-
// 7 -# ###### #-
// 8 -# ###### #-
// 9 -# ###### #-
// 10 -# ###### #-
// 11 -# ###### #-
// 12 -# ###### #-
// 13 -# #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr154[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# ###### #-
// 7 -# ###### #-
// 8 -# ###### #-
// 9 -# ###### #-
// 10 -# ###### #-
// 11 -# ###### #-
// 12 -# ###### #-
// 13 -# ###### #-
// 14 -# #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr155[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# ###### #-
// 7 -# ###### #-
// 8 -# ###### #-
// 9 -# ###### #-
// 10 -# ###### #-
// 11 -# ###### #-
// 12 -# ###### #-
// 13 -# ###### #-
// 14 -# ###### #-
// 15 -# #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr156[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ---######---
// 1 -### ###-
// 2 -# ## #-
// 3 -# ###### #-
// 4 -# ###### #-
// 5 -# ###### #-
// 6 -# ###### #-
// 7 -# ###### #-
// 8 -# ###### #-
// 9 -# ###### #-
// 10 -# ###### #-
// 11 -# ###### #-
// 12 -# ###### #-
// 13 -# ###### #-
// 14 -# ###### #-
// 15 -# ###### #-
// 16 -# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr157[] PROGMEM = {0x54,0x00,0x15,0x40,0xaa,0x01,0x4a,0x82,0xa1,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x48,0x00,0x21,0x4a,0xaa,0xa1,0x40,0x00,0x01};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 -#---#------
// 11 # #-# #-----
// 12 # #-# #-----
// 13 # #-# #-----
// 14 # #-# #-----
// 15 ## # ##-----
// 16 -## ##------
// 17 --###-------
// 000000000011
// 012345678901
const char chr158[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x45,0x45,0x55,0x21,0x21,0x55,0x21,0x21,0x55,0x21,0x21,0x55,0x21,0x21,0x55,0x08,0x81,0x55,0x42,0x05,0x55,0x50,0x15,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 --###-------
// 11 -# #------
// 12 # ### #-----
// 13 # ### #-----
// 14 # #-----
// 15 # ### #-----
// 16 # #-# #-----
// 17 -#---#------
// 000000000011
// 012345678901
const char chr159[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x50,0x15,0x55,0x4a,0x85,0x55,0x20,0x21,0x55,0x20,0x21,0x55,0x2a,0xa1,0x55,0x20,0x21,0x55,0x21,0x21,0x55,0x45,0x45,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # ## # -
// 5 # ## #
// 6 # ## #
// 7 # ## #
// 8 ##
// 9 ##
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr160[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0x82,0x89,0x8a,0x82,0xa2,0x2a,0x82,0xa8,0x2a,0x82,0xa8,0xaa,0x82,0xaa,0xaa,0x82,0xaa,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # ## -
// 5 # ## #
// 6 # ## #
// 7 # ## #
// 8 ##
// 9 ##
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr161[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x09,0x8a,0xa8,0x22,0x2a,0xa0,0xa8,0x2a,0xa0,0xa8,0xaa,0x82,0xaa,0xaa,0x82,0xaa,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # ###
// 6 # ### #
// 7 # ### #
// 8 ###
// 9 ##
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr162[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0x02,0x2a,0xa8,0x08,0x2a,0xa0,0x28,0xaa,0x80,0xaa,0xaa,0x82,0xaa,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # ###
// 7 # ### #
// 8 ####
// 9 ##
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr163[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0x80,0x2a,0xa8,0x08,0xaa,0x80,0x2a,0xaa,0x82,0xaa,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # #
// 7 # #
// 8 ######
// 9 ######
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr164[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0xaa,0x80,0x02,0xaa,0x80,0x02,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # #
// 7 # #
// 8 ##
// 9 ####
// 10 # ### #
// 11 # ###
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr165[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0xaa,0x82,0xaa,0xaa,0x80,0x2a,0x2a,0xa8,0x08,0x2a,0xaa,0x80,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # #
// 7 # #
// 8 ##
// 9 ###
// 10 # ### #
// 11 # ### #
// 12 # ###
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr166[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0xaa,0x82,0xaa,0xaa,0x80,0xaa,0x2a,0xa0,0x28,0x2a,0xa8,0x08,0x8a,0xaa,0x02,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # #
// 7 # #
// 8 ##
// 9 ##
// 10 # ## #
// 11 # ## #
// 12 # ## #
// 13 - # ## -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr167[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0xaa,0x82,0xaa,0xaa,0x82,0xaa,0x2a,0xa0,0xa8,0x2a,0xa0,0xa8,0x8a,0xa8,0x22,0x62,0xaa,0x09,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # #
// 7 # #
// 8 ##
// 9 ##
// 10 # ## #
// 11 # ## #
// 12 # ## #
// 13 - # ## # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr168[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0xaa,0x82,0xaa,0xaa,0x82,0xaa,0x2a,0x82,0xa8,0x2a,0x82,0xa8,0x8a,0x82,0xa2,0x62,0x82,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # #
// 7 # #
// 8 ##
// 9 ##
// 10 # ## #
// 11 # ## #
// 12 # ## #
// 13 - ## # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr169[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0xaa,0x82,0xaa,0xaa,0x82,0xaa,0x2a,0x0a,0xa8,0x2a,0x0a,0xa8,0x88,0x2a,0xa2,0x60,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # #
// 7 # #
// 8 ##
// 9 ###
// 10 # ### #
// 11 # ### #
// 12 ### #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr170[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0xaa,0x82,0xaa,0xaa,0x02,0xaa,0x28,0x0a,0xa8,0x20,0x2a,0xa8,0x80,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # #
// 7 # #
// 8 ##
// 9 ####
// 10 # ### #
// 11 ### #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr171[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0xaa,0x82,0xaa,0xa8,0x02,0xaa,0x20,0x2a,0xa8,0x02,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # #
// 7 # #
// 8 ######
// 9 ######
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr172[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x80,0x02,0xaa,0x80,0x02,0xaa,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 ### #
// 7 # ### #
// 8 ####
// 9 ##
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr173[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x02,0xaa,0xa8,0x20,0x2a,0xa8,0xa8,0x02,0xaa,0xaa,0x82,0xaa,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 ### #
// 6 # ### #
// 7 # ### #
// 8 ###
// 9 ##
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr174[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x80,0xaa,0xa2,0x20,0x2a,0xa8,0x28,0x0a,0xa8,0xaa,0x02,0xaa,0xaa,0x82,0xaa,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - ## # -
// 5 # ## #
// 6 # ## #
// 7 # ## #
// 8 ##
// 9 ##
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr175[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x60,0xaa,0x89,0x88,0x2a,0xa2,0x2a,0x0a,0xa8,0x2a,0x0a,0xa8,0xaa,0x82,0xaa,0xaa,0x82,0xaa,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 -----------
// 7 -----------
// 8 ---------- #
// 9 ---------- #
// 10 -----------
// 11 -----------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr176[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x58,0x55,0x55,0x58,0x55,0x55,0x56,0x55,0x55,0x56,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----- -----
// 2 --- ## ---
// 3 -- ## ## --
// 4 - # # -
// 5 # #
// 6 # #
// 7 # #
// 8 ##
// 9 ##
// 10 # #
// 11 # #
// 12 # #
// 13 - # # -
// 14 -- ## ## --
// 15 --- ## ---
// 16 ----- -----
// 17 ------------
// 000000000011
// 012345678901
const char chr177[] PROGMEM = {0x55,0x55,0x55,0x55,0x69,0x55,0x56,0x82,0x95,0x58,0x28,0x25,0x62,0xaa,0x89,0x8a,0xaa,0xa2,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0xaa,0x82,0xaa,0xaa,0x82,0xaa,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x8a,0xaa,0xa2,0x62,0xaa,0x89,0x58,0x28,0x25,0x56,0x82,0x95,0x55,0x69,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 -----------
// 7 -----------
// 8 # ----------
// 9 # ----------
// 10 -----------
// 11 -----------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr178[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x55,0x25,0x55,0x55,0x25,0x55,0x55,0x95,0x55,0x55,0x95,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ---- ----
// 5 ---- ## ----
// 6 ---- ## ----
// 7 ---- ## ----
// 8 ##
// 9 ##########
// 10 # #
// 11 # ## ## #
// 12 # ## ## #
// 13 # #
// 14 # #
// 15 ##########
// 16
// 17 ------------
// 000000000011
// 012345678901
const char chr179[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xaa,0x55,0x55,0x82,0x55,0x55,0x82,0x55,0x55,0x82,0x55,0xaa,0x82,0xaa,0x80,0x00,0x02,0x8a,0xaa,0xa2,0x88,0x28,0x22,0x88,0x28,0x22,0x8a,0xaa,0xa2,0x8a,0xaa,0xa2,0x80,0x00,0x02,0xaa,0xaa,0xaa,0x55,0x55,0x55};
 
 
// 0 ---------- -
// 1 --------- --
// 2 --------#---
// 3 -----##-#---
// 4 ----#####---
// 5 ---######---
// 6 --########--
// 7 -##########-
// 8 ## ##
// 9 -# ### #-
// 10 -# #-# #-
// 11 -# ### #-
// 12 -# #-
// 13 -# #-
// 14 -# ### #-
// 15 -# #-# #-
// 16 -# #-# #-
// 17 -##########-
// 000000000011
// 012345678901
const char chr180[] PROGMEM = {0x55,0x55,0x59,0x55,0x55,0x65,0x55,0x55,0x15,0x55,0x41,0x15,0x55,0x00,0x15,0x54,0x00,0x15,0x50,0x00,0x05,0x40,0x00,0x01,0x0a,0xaa,0xa0,0x4a,0xa0,0x21,0x4a,0xa1,0x21,0x4a,0xa0,0x21,0x4a,0xaa,0xa1,0x4a,0xaa,0xa1,0x48,0x0a,0xa1,0x48,0x4a,0xa1,0x48,0x4a,0xa1,0x40,0x00,0x01};
 
 
// 0 #######-----
// 1 # #-----
// 2 # # # #-----
// 3 # # # #-----
// 4 #######-----
// 5 -----# #----
// 6 ----# # #---
// 7 ---# ### #--
// 8 ---# #--
// 9 ---# ### #--
// 10 ---# #-# #--
// 11 ----##-###--
// 12 -------# #--
// 13 -------# ###
// 14 -------# #
// 15 -------# # #
// 16 -------# # #
// 17 -------#####
// 000000000011
// 012345678901
const char chr181[] PROGMEM = {0x00,0x01,0x55,0x2a,0xa1,0x55,0x22,0x21,0x55,0x22,0x21,0x55,0x00,0x01,0x55,0x55,0x48,0x55,0x55,0x22,0x15,0x54,0x80,0x85,0x54,0xaa,0x85,0x54,0x80,0x85,0x54,0x84,0x85,0x55,0x04,0x05,0x55,0x54,0x85,0x55,0x54,0x80,0x55,0x54,0xa8,0x55,0x54,0x88,0x55,0x54,0x88,0x55,0x54,0x00};
 
 
// 0 -- -------
// 1 - ### --- -
// 2 - # ## - # -
// 3 - # ## # --
// 4 - ## ## ---
// 5 -- ## ## --
// 6 --- ## ## -
// 7 ---- ## ##
// 8 ---- ### #
// 9 ---- # ####
// 10 ---- # # -
// 11 ---- # # ---
// 12 ---- # # ---
// 13 --- ## ## --
// 14 -- # # -
// 15 - # #
// 16 - #########
// 17 -- -
// 000000000011
// 012345678901
const char chr182[] PROGMEM = {0x5a,0x95,0x55,0x60,0x25,0x69,0x62,0x09,0x89,0x62,0x82,0x25,0x60,0xa0,0x95,0x58,0x28,0x25,0x56,0x0a,0x09,0x55,0x82,0x82,0x55,0x80,0xa2,0x55,0x88,0x02,0x55,0x88,0xa9,0x55,0x88,0x95,0x55,0x88,0x95,0x56,0x08,0x25,0x58,0xaa,0x89,0x62,0xaa,0xa2,0x60,0x00,0x02,0x5a,0xaa,0xa9};
 
 
// 0 -----##-----
// 1 ----# #----
// 2 ---# #---
// 3 --# #--
// 4 --### ###--
// 5 ----# #----
// 6 ----# #----
// 7 ############
// 8
// 9
// 10 ############
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr183[] PROGMEM = {0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x50,0x28,0x05,0x55,0x28,0x55,0x55,0x28,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 -----##-----
// 2 ----# #----
// 3 ---# #---
// 4 --# #--
// 5 --### ###--
// 6 ----# #----
// 7 ############
// 8
// 9
// 10 ############
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr184[] PROGMEM = {0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x50,0x28,0x05,0x55,0x28,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 -----##-----
// 4 ----# #----
// 5 ---# #---
// 6 --# #--
// 7 ############
// 8
// 9
// 10 ############
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr185[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 -----##-----
// 5 ----# #----
// 6 ---# #---
// 7 ############
// 8
// 9
// 10 ############
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr186[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xaa,0x15,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ############
// 8
// 9
// 10 ############
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr187[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ############
// 8
// 9
// 10 ############
// 11 ---# #---
// 12 ----# #----
// 13 -----##-----
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr188[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ############
// 8
// 9
// 10 ############
// 11 --# #--
// 12 ---# #---
// 13 ----# #----
// 14 -----##-----
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr189[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ############
// 8
// 9
// 10 ############
// 11 ----# #----
// 12 --### ###--
// 13 --# #--
// 14 ---# #---
// 15 ----# #----
// 16 -----##-----
// 17 ------------
// 000000000011
// 012345678901
const char chr190[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x28,0x55,0x50,0x28,0x05,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ############
// 8
// 9
// 10 ############
// 11 ----# #----
// 12 ----# #----
// 13 --### ###--
// 14 --# #--
// 15 ---# #---
// 16 ----# #----
// 17 -----##-----
// 000000000011
// 012345678901
const char chr191[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x28,0x55,0x55,0x28,0x55,0x50,0x28,0x05,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55};
 
 
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10
// 11
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr192[] PROGMEM = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0
// 1
// 2
// 3
// 4
// 5
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr193[] PROGMEM = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ############
// 8
// 9
// 10
// 11
// 12
// 13
// 14
// 15
// 16
// 17
// 000000000011
// 012345678901
const char chr194[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
 
 
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10 ############
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr195[] PROGMEM = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12
// 13
// 14
// 15
// 16
// 17
// 000000000011
// 012345678901
const char chr196[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6
// 7
// 8
// 9
// 10
// 11
// 12
// 13
// 14
// 15
// 16
// 17
// 000000000011
// 012345678901
const char chr197[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
 
 
// 0 ------------
// 1 -##########-
// 2 -# #-
// 3 -# ## ## #-
// 4 -# # # # #-
// 5 -# ## # #-
// 6 -# # # #-
// 7 -# # ## #-
// 8 -# #-
// 9 ##### #####
// 10 # #
// 11 # ######## #
// 12 # # # # # #
// 13 # # # # # #
// 14 # # # # # #
// 15 # ###### #
// 16 # #
// 17 ############
// 000000000011
// 012345678901
const char chr198[] PROGMEM = {0x55,0x55,0x55,0x40,0x00,0x01,0x4a,0xaa,0xa1,0x48,0x28,0x21,0x48,0x88,0xa1,0x48,0x28,0xa1,0x48,0xa8,0xa1,0x48,0xa8,0x21,0x4a,0xaa,0xa1,0x00,0x28,0x00,0x2a,0xaa,0xa8,0x20,0x00,0x08,0x22,0x22,0x28,0x28,0x88,0x88,0x22,0x22,0x28,0x28,0x00,0x28,0x2a,0xaa,0xa8,0x00,0x00,0x00};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 -- -
// 5 -- ------- -
// 6 -- ------- -
// 7 -- ------- -
// 8 -- ------- -
// 9 -- ------- -
// 10 -- -
// 11 -- ------- -
// 12 -- ------- -
// 13 -- ------- -
// 14 -- ------- -
// 15 -- ------- -
// 16 -- -
// 17 ------------
// 000000000011
// 012345678901
const char chr199[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5a,0xaa,0xa9,0x59,0x55,0x59,0x59,0x55,0x59,0x59,0x55,0x59,0x59,0x55,0x59,0x59,0x55,0x59,0x5a,0xaa,0xa9,0x59,0x55,0x59,0x59,0x55,0x59,0x59,0x55,0x59,0x59,0x55,0x59,0x59,0x55,0x59,0x5a,0xaa,0xa9,0x55,0x55,0x55};
 
 
// 0 ------##----
// 1 -----# #---
// 2 ----# #--
// 3 ----# #-
// 4 -----# #
// 5 ------# #
// 6 -------#
// 7 --------## -
// 8 ----------#
// 9 --------#-
// 10 ------#- --
// 11 ----#- # #--
// 12 ---# # ## #
// 13 ---# ## ##--
// 14 ----# ## #-
// 15 -----# ##---
// 16 ------# #--
// 17 -------##---
// 000000000011
// 012345678901
const char chr200[] PROGMEM = {0x55,0x50,0x55,0x55,0x4a,0x15,0x55,0x2a,0x85,0x55,0x2a,0xa1,0x55,0x4a,0xa8,0x55,0x52,0xa8,0x55,0x54,0xaa,0x55,0x55,0x09,0x55,0x55,0x52,0x55,0x55,0x1a,0x55,0x51,0x96,0x55,0x18,0x85,0x54,0x88,0x28,0x54,0x82,0x05,0x55,0x20,0xa1,0x55,0x48,0x15,0x55,0x52,0x85,0x55,0x54,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 -#----------
// 6 # #---------
// 7 #--------
// 8 #---------
// 9 - ##-------
// 10 # #------
// 11 -# #-----
// 12 -# #----
// 13 --# #---
// 14 ---# #---
// 15 ----# #----
// 16 -----##-----
// 17 ------------
// 000000000011
// 012345678901
const char chr201[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x45,0x55,0x55,0x21,0x55,0x55,0xa8,0x55,0x55,0xa1,0x55,0x55,0x98,0x15,0x55,0x2a,0x85,0x55,0x4a,0xa1,0x55,0x4a,0xa8,0x55,0x52,0xaa,0x15,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55};
 
 
// 0 ---# #--
// 1 --# ##### #-
// 2 -# ## ## #
// 3 - ## ### ##
// 4 - # ## ## #
// 5 - # # # #
// 6 - # ## ## #
// 7 - ## # # ##
// 8 -# ### ### #
// 9 --# ## ## #-
// 10 ---#-# #-#--
// 11 -----# #----
// 12 -----# #----
// 13 -----# #----
// 14 -----# #----
// 15 -----# #----
// 16 ----# #---
// 17 ---# #--
// 000000000011
// 012345678901
const char chr202[] PROGMEM = {0x54,0xaa,0x85,0x52,0x00,0x21,0x48,0x2a,0x08,0x60,0x80,0x82,0x62,0x08,0x22,0x62,0x2a,0x22,0x62,0x08,0x22,0x60,0x88,0x82,0x48,0x08,0x08,0x52,0x08,0x21,0x54,0x48,0x45,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x2a,0x15,0x54,0xaa,0x85};
 
 
// 0 ------------
// 1 ###---------
// 2 # #---------
// 3 # ###-------
// 4 # # #-------
// 5 # ##-------
// 6 # # #-------
// 7 #########---
// 8 --# #---
// 9 --# # # #---
// 10 --# # # #---
// 11 --########--
// 12 -------# #--
// 13 -------# ###
// 14 -------# #
// 15 -------# # #
// 16 -------# # #
// 17 -------#####
// 000000000011
// 012345678901
const char chr203[] PROGMEM = {0x55,0x55,0x55,0x01,0x55,0x55,0x21,0x55,0x55,0x20,0x15,0x55,0x22,0x15,0x55,0x28,0x15,0x55,0x22,0x15,0x55,0x00,0x00,0x15,0x52,0xaa,0x15,0x52,0x22,0x15,0x52,0x22,0x15,0x50,0x00,0x05,0x55,0x54,0x85,0x55,0x54,0x80,0x55,0x54,0xa8,0x55,0x54,0x88,0x55,0x54,0x88,0x55,0x54,0x00};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 #########---
// 13 # # # #---
// 14 # # # #---
// 15 # ## ## #---
// 16 # ## ## #---
// 17 #########---
// 000000000011
// 012345678901
const char chr204[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x15,0x22,0x8a,0x15,0x28,0xa2,0x15,0x20,0x82,0x15,0x20,0x82,0x15,0x00,0x00,0x15};
 
 
// 0 ----####----
// 1 ----# #----
// 2 ----# #----
// 3 ----# #----
// 4 ----# #----
// 5 ----# #----
// 6 ----# #----
// 7 ----# #----
// 8 ----# #----
// 9 ----# #----
// 10 ----# #----
// 11 ##### #####
// 12 # #
// 13 ## ##
// 14 -## ##-
// 15 --## ##--
// 16 ---## ##---
// 17 ----####----
// 000000000011
// 012345678901
const char chr205[] PROGMEM = {0x55,0x00,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x00,0x28,0x00,0x2a,0xaa,0xa8,0x0a,0xaa,0xa0,0x42,0xaa,0x81,0x50,0xaa,0x05,0x54,0x28,0x15,0x55,0x00,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ############
// 8 # #
// 9 # #
// 10 ############
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr206[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ----####----
// 1 ---## ##---
// 2 --## ##--
// 3 -## ##-
// 4 ## ##
// 5 # #
// 6 ##### #####
// 7 ----# #----
// 8 ----# #----
// 9 ----# #----
// 10 ----# #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 ----# #----
// 15 ----# #----
// 16 ----# #----
// 17 ----####----
// 000000000011
// 012345678901
const char chr207[] PROGMEM = {0x55,0x00,0x55,0x54,0x28,0x15,0x50,0xaa,0x05,0x42,0xaa,0x81,0x0a,0xaa,0xa0,0x2a,0xaa,0xa8,0x00,0x28,0x00,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x00,0x55};
 
 
// 0 ------------
// 1 ---####-----
// 2 --# #----
// 3 -# #### #---
// 4 -# #--# #---
// 5 -# #--# #---
// 6 -# #### #---
// 7 --# #----
// 8 ---####-----
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr208[] PROGMEM = {0x55,0x55,0x55,0x54,0x01,0x55,0x52,0xa8,0x55,0x48,0x02,0x15,0x48,0x52,0x15,0x48,0x52,0x15,0x48,0x02,0x15,0x52,0xa8,0x55,0x54,0x01,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ---##--#--#-
// 1 --# ## ## #
// 2 -# ## # # #
// 3 -# ## # # #
// 4 -# ## # # #
// 5 --# ## ## #
// 6 ---##--#--#-
// 7 -----###----
// 8 ----# #---
// 9 ---# # # #--
// 10 --# ## ## #-
// 11 -# #-# ### #
// 12 -# #-# # #
// 13 -# #--#### #
// 14 --# #---# #-
// 15 ---# ### #--
// 16 ----# #---
// 17 -----###----
// 000000000011
// 012345678901
const char chr209[] PROGMEM = {0x54,0x14,0x51,0x52,0x82,0x08,0x48,0x22,0x88,0x48,0x22,0x28,0x48,0x22,0x28,0x52,0x82,0x08,0x54,0x14,0x51,0x55,0x40,0x55,0x55,0x2a,0x15,0x54,0x88,0x85,0x52,0x08,0x21,0x48,0x48,0x08,0x48,0x4a,0x88,0x48,0x50,0x08,0x52,0x15,0x21,0x54,0x80,0x85,0x55,0x2a,0x15,0x55,0x40,0x55};
 
 
// 0 -###-#--#-#-
// 1 # # ## # #
// 2 # ### ## # #
// 3 # ## #-# #-
// 4 # #-# ### #-
// 5 # #-# # #-
// 6 -#---###-#--
// 7 -----###----
// 8 ----# #---
// 9 ---# # # #--
// 10 --# ## ## #-
// 11 -# #-# ### #
// 12 -# #-# # #
// 13 -# #--#### #
// 14 --# #---# #-
// 15 ---# ### #--
// 16 ----# #---
// 17 -----###----
// 000000000011
// 012345678901
const char chr210[] PROGMEM = {0x40,0x45,0x11,0x2a,0x20,0x88,0x20,0x20,0x88,0x28,0x21,0x21,0x21,0x20,0x21,0x21,0x2a,0x21,0x45,0x40,0x45,0x55,0x40,0x55,0x55,0x2a,0x15,0x54,0x88,0x85,0x52,0x08,0x21,0x48,0x48,0x08,0x48,0x4a,0x88,0x48,0x50,0x08,0x52,0x15,0x21,0x54,0x80,0x85,0x55,0x2a,0x15,0x55,0x40,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 --##----##--
// 4 -# #--# #-
// 5 -# #-# #-
// 6 -# ### #-
// 7 -# ## #-
// 8 ## # # ##
// 9 # # # #
// 10 ## ## ##
// 11 -# ### #-
// 12 -# #-# #-
// 13 -# #--# #-
// 14 --##----##--
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr211[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x50,0x55,0x05,0x4a,0x14,0xa1,0x4a,0x84,0xa1,0x4a,0x80,0xa1,0x4a,0xa0,0xa1,0x0a,0x28,0xa0,0x8a,0x28,0xa2,0x0a,0x0a,0xa0,0x4a,0x02,0xa1,0x4a,0x12,0xa1,0x4a,0x14,0xa1,0x50,0x55,0x05,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ----####----
// 4 ---# #---
// 5 --# #--
// 6 --# ### #--
// 7 --# #------
// 8 ### ####
// 9 # #
// 10 ####### ###
// 11 --# ### #--
// 12 --# #--
// 13 --## ##--
// 14 ----#####---
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr212[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x52,0x80,0x85,0x52,0x85,0x55,0x02,0xaa,0x00,0xa8,0xaa,0x8a,0x00,0x02,0x80,0x52,0x02,0x85,0x52,0xaa,0x85,0x50,0xaa,0x05,0x55,0x00,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ---##-------
// 4 --# #------
// 5 --# #------
// 6 --# #------
// 7 --# #------
// 8 ### #######
// 9 # #
// 10 ### #######
// 11 --# ####---
// 12 --# #--
// 13 --# #--
// 14 ---######---
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr213[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x15,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x52,0x85,0x55,0x02,0x80,0x00,0xa2,0x8a,0xaa,0x02,0x80,0x00,0x52,0x80,0x15,0x52,0xaa,0x85,0x52,0xaa,0x85,0x54,0x00,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ---######---
// 4 --# #--
// 5 -# #-
// 6 -# ## #-
// 7 -# #--# #-
// 8 ## #--# ##
// 9 #--#
// 10 ## #--# ##
// 11 -# ## #-
// 12 -# #-
// 13 --# #--
// 14 ---######---
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr214[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x00,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x4a,0x82,0xa1,0x4a,0x14,0xa1,0x0a,0x14,0xa0,0xaa,0x14,0xaa,0x0a,0x14,0xa0,0x4a,0x82,0xa1,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0x00,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 -----#------
// 7 ----# #-----
// 8 ###-# #-####
// 9 ## ##
// 10 ###-# #-####
// 11 ----# #-----
// 12 -----#------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr215[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x45,0x55,0x55,0x21,0x55,0x01,0x21,0x00,0xa8,0x20,0xaa,0x01,0x21,0x00,0x55,0x21,0x55,0x55,0x45,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ############
// 9
// 10 ############
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr216[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 --------#---
// 6 -------# #--
// 7 -####### #-
// 8 # #
// 9 # #
// 10 -####### #-
// 11 -------# #--
// 12 --------#---
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr217[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x55,0x54,0x85,0x40,0x00,0xa1,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0xa1,0x55,0x54,0x85,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 -----######-
// 4 ----# #
// 5 -----# #
// 6 ------# #
// 7 -----# #
// 8 ----# # #
// 9 ---# #-# #
// 10 --# #---#-
// 11 -# #------
// 12 --# #-------
// 13 ---#--------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr218[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x01,0x55,0x2a,0xa8,0x55,0x4a,0xa8,0x55,0x52,0xa8,0x55,0x4a,0xa8,0x55,0x2a,0x28,0x54,0xa8,0x48,0x52,0xa1,0x51,0x4a,0x85,0x55,0x52,0x15,0x55,0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 -----##-----
// 4 ----# #----
// 5 ---# #---
// 6 --# #--
// 7 ---## ##---
// 8 ----# #----
// 9 ----# #----
// 10 ----# #----
// 11 ----# #----
// 12 ----# #----
// 13 ----# #----
// 14 -----##-----
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr219[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x54,0x28,0x15,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 -######-----
// 4 # #----
// 5 # #-----
// 6 # #------
// 7 # #-----
// 8 # # #----
// 9 # #-# #---
// 10 -#---# #--
// 11 ------# #-
// 12 -------# #--
// 13 --------#---
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr220[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x01,0x55,0x2a,0xa8,0x55,0x2a,0xa1,0x55,0x2a,0x85,0x55,0x2a,0xa1,0x55,0x28,0xa8,0x55,0x21,0x2a,0x15,0x45,0x4a,0x85,0x55,0x52,0xa1,0x55,0x54,0x85,0x55,0x55,0x15,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ---#--------
// 6 --# #-------
// 7 -# #######-
// 8 # #
// 9 # #
// 10 -# #######-
// 11 --# #-------
// 12 ---#--------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr221[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x55,0x55,0x52,0x15,0x55,0x4a,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x4a,0x00,0x01,0x52,0x15,0x55,0x54,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 --------#---
// 5 -------# #--
// 6 ------# #-
// 7 -#---# #--
// 8 # #-# #---
// 9 # # #----
// 10 # #-----
// 11 # #------
// 12 # #-----
// 13 # #----
// 14 -######-----
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr222[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x15,0x55,0x54,0x85,0x55,0x52,0xa1,0x45,0x4a,0x85,0x21,0x2a,0x15,0x28,0xa8,0x55,0x2a,0xa1,0x55,0x2a,0x85,0x55,0x2a,0xa1,0x55,0x2a,0xa8,0x55,0x40,0x01,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 -----##-----
// 4 ----# #----
// 5 ----# #----
// 6 ----# #----
// 7 ----# #----
// 8 ----# #----
// 9 ----# #----
// 10 ---## ##---
// 11 --# #--
// 12 ---# #---
// 13 ----# #----
// 14 -----##-----
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr223[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x55,0x28,0x55,0x54,0x28,0x15,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ---#--------
// 5 --# #-------
// 6 -# #------
// 7 --# #---#-
// 8 ---# #-# #
// 9 ----# # #
// 10 -----# #
// 11 ------# #
// 12 -----# #
// 13 ----# #
// 14 -----######-
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr224[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x54,0x55,0x55,0x52,0x15,0x55,0x4a,0x85,0x55,0x52,0xa1,0x51,0x54,0xa8,0x48,0x55,0x2a,0x28,0x55,0x4a,0xa8,0x55,0x52,0xa8,0x55,0x4a,0xa8,0x55,0x2a,0xa8,0x55,0x40,0x01,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 -##########-
// 2 # #
// 3 # #
// 4 -##########-
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr225[] PROGMEM = {0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x01,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 -##########-
// 5 # #
// 6 # #
// 7 -##########-
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr226[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x01,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 -##########-
// 8 # #
// 9 # #
// 10 -##########-
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr227[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x01,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 -##########-
// 11 # #
// 12 # #
// 13 -##########-
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr228[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x01,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 -##########-
// 14 # #
// 15 # #
// 16 -##########-
// 17 ------------
// 000000000011
// 012345678901
const char chr229[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x00,0x01,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x40,0x00,0x01,0x55,0x55,0x55};
 
 
// 0 ----##--#-#-
// 1 ---# ## # #
// 2 ---# # # # #
// 3 ---# ## #
// 4 ---# #-# # #
// 5 -#-# #-# # #
// 6 # #-#---#-#-
// 7 #--------
// 8 #---------
// 9 - ##-------
// 10 # #------
// 11 -# #-----
// 12 -# #----
// 13 --# #---
// 14 ---# #---
// 15 ----# #----
// 16 -----##-----
// 17 ------------
// 000000000011
// 012345678901
const char chr230[] PROGMEM = {0x55,0x05,0x11,0x54,0xa0,0x88,0x54,0x88,0x88,0x54,0xa0,0xa8,0x54,0x84,0x88,0x44,0x84,0x88,0x21,0x15,0x11,0xa8,0x55,0x55,0xa1,0x55,0x55,0x98,0x15,0x55,0x2a,0x85,0x55,0x4a,0xa1,0x55,0x4a,0xa8,0x55,0x52,0xaa,0x15,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55};
 
 
// 0 ---------##-
// 1 --------# #
// 2 -------# ##-
// 3 -------# #--
// 4 -------# ##-
// 5 -#------# #
// 6 # #-----###-
// 7 #---# # #
// 8 #----# # #
// 9 - ##--# #
// 10 # #-# # #
// 11 -# ## # #
// 12 -# ##-#-
// 13 --# #---
// 14 ---# #---
// 15 ----# #----
// 16 -----##-----
// 17 ------------
// 000000000011
// 012345678901
const char chr231[] PROGMEM = {0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0x81,0x55,0x54,0x85,0x55,0x54,0x81,0x45,0x55,0x28,0x21,0x55,0x01,0xa8,0x54,0x88,0xa1,0x54,0x88,0x98,0x14,0xa8,0x2a,0x84,0x88,0x4a,0xa0,0x88,0x4a,0xa8,0x11,0x52,0xaa,0x15,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ############
// 8 # #
// 9 # #
// 10 ## ##
// 11 --# #--
// 12 ---# #---
// 13 ----# #----
// 14 -----##-----
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr232[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x0a,0xaa,0xa0,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ############
// 8 # #
// 9 # #
// 10 ##### #####
// 11 ----# #----
// 12 -#### ####-
// 13 # #
// 14 -# #-
// 15 --# #--
// 16 ---# #---
// 17 ----# #----
// 000000000011
// 012345678901
const char chr233[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x00,0x28,0x00,0x55,0x28,0x55,0x40,0x28,0x01,0x2a,0xaa,0xa8,0x4a,0xaa,0xa1,0x52,0xaa,0x85,0x54,0xaa,0x15,0x55,0x28,0x55};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 -----##-----
// 4 ----# #----
// 5 ---# #---
// 6 --# #--
// 7 ## ##
// 8 # #
// 9 # #
// 10 ############
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr234[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x0a,0xaa,0xa0,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ----# #----
// 1 ---# #---
// 2 --# #--
// 3 -# #-
// 4 # #
// 5 -#### ####-
// 6 ----# #----
// 7 ##### #####
// 8 # #
// 9 # #
// 10 ############
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ------------
// 15 ------------
// 16 ------------
// 17 ------------
// 000000000011
// 012345678901
const char chr235[] PROGMEM = {0x55,0x28,0x55,0x54,0xaa,0x15,0x52,0xaa,0x85,0x4a,0xaa,0xa1,0x2a,0xaa,0xa8,0x40,0x28,0x01,0x55,0x28,0x55,0x00,0x28,0x00,0x2a,0xaa,0xa8,0x2a,0xaa,0xa8,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 -###########
// 2 #
// 3 # ######## #
// 4 # # #--# # #
// 5 # # #-# # #
// 6 # # ## # #
// 7 # # # # #
// 8 # # # #
// 9 # # # #
// 10 # # # # #
// 11 # # ## # #
// 12 # # #-# # #
// 13 # # #--# # #
// 14 # ######## #
// 15 #
// 16 -###########
// 17 ------------
// 000000000011
// 012345678901
const char chr236[] PROGMEM = {0x55,0x55,0x55,0x40,0x00,0x00,0x2a,0xaa,0xaa,0x20,0x00,0x08,0x22,0x14,0x88,0x22,0x12,0x88,0x22,0x0a,0x88,0x22,0x2a,0x88,0x22,0xaa,0x88,0x22,0xaa,0x88,0x22,0x2a,0x88,0x22,0x0a,0x88,0x22,0x12,0x88,0x22,0x14,0x88,0x20,0x00,0x08,0x2a,0xaa,0xaa,0x40,0x00,0x00,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ----------##
// 2 ---------#
// 3 ---------# #
// 4 ---------# #
// 5 ---------# #
// 6 ---------# #
// 7 ---------# #
// 8 ---------# #
// 9 ---------# #
// 10 ---------# #
// 11 ---------# #
// 12 ---------# #
// 13 ---------# #
// 14 ---------# #
// 15 ---------#
// 16 ----------##
// 17 ------------
// 000000000011
// 012345678901
const char chr237[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x50,0x55,0x55,0x4a,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x48,0x55,0x55,0x4a,0x55,0x55,0x50,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ############
// 2
// 3 ############
// 4
// 5
// 6
// 7
// 8
// 9
// 10
// 11
// 12
// 13
// 14 ############
// 15
// 16 ############
// 17 ------------
// 000000000011
// 012345678901
const char chr238[] PROGMEM = {0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ############
// 2
// 3 ############
// 4 #--
// 5 #--
// 6 #--
// 7 #--
// 8 #--
// 9 #--
// 10 #--
// 11 #--
// 12 #--
// 13 #--
// 14 ############
// 15
// 16 ############
// 17 ------------
// 000000000011
// 012345678901
const char chr239[] PROGMEM = {0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0xaa,0xaa,0x85,0xaa,0xaa,0x85,0xaa,0xaa,0x85,0xaa,0xaa,0x85,0xaa,0xaa,0x85,0xaa,0xaa,0x85,0xaa,0xaa,0x85,0xaa,0xaa,0x85,0xaa,0xaa,0x85,0xaa,0xaa,0x85,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ############
// 2
// 3 ############
// 4 #-----
// 5 #-----
// 6 #-----
// 7 #-----
// 8 #-----
// 9 #-----
// 10 #-----
// 11 #-----
// 12 #-----
// 13 #-----
// 14 ############
// 15
// 16 ############
// 17 ------------
// 000000000011
// 012345678901
const char chr240[] PROGMEM = {0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ############
// 2
// 3 ############
// 4 #--------
// 5 #--------
// 6 #--------
// 7 #--------
// 8 #--------
// 9 #--------
// 10 #--------
// 11 #--------
// 12 #--------
// 13 #--------
// 14 ############
// 15
// 16 ############
// 17 ------------
// 000000000011
// 012345678901
const char chr241[] PROGMEM = {0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0xa8,0x55,0x55,0xa8,0x55,0x55,0xa8,0x55,0x55,0xa8,0x55,0x55,0xa8,0x55,0x55,0xa8,0x55,0x55,0xa8,0x55,0x55,0xa8,0x55,0x55,0xa8,0x55,0x55,0xa8,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ############
// 2
// 3 ############
// 4 ------------
// 5 ------------
// 6 ------------
// 7 ------------
// 8 ------------
// 9 ------------
// 10 ------------
// 11 ------------
// 12 ------------
// 13 ------------
// 14 ############
// 15
// 16 ############
// 17 ------------
// 000000000011
// 012345678901
const char chr242[] PROGMEM = {0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x00,0x00,0x00,0xaa,0xaa,0xaa,0x00,0x00,0x00,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ##----------
// 2 #---------
// 3 # #---------
// 4 # #---------
// 5 # #---------
// 6 # #---------
// 7 # #---------
// 8 # #---------
// 9 # #---------
// 10 # #---------
// 11 # #---------
// 12 # #---------
// 13 # #---------
// 14 # #---------
// 15 #---------
// 16 ##----------
// 17 ------------
// 000000000011
// 012345678901
const char chr243[] PROGMEM = {0x55,0x55,0x55,0x05,0x55,0x55,0xa1,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0x21,0x55,0x55,0xa1,0x55,0x55,0x05,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ###########-
// 2 #
// 3 # ######## #
// 4 # # #--# # #
// 5 # # #-# # #
// 6 # # ## # #
// 7 # # # # #
// 8 # # # #
// 9 # # # #
// 10 # # # # #
// 11 # # ## # #
// 12 # # #-# # #
// 13 # # #--# # #
// 14 # ######## #
// 15 #
// 16 ###########-
// 17 ------------
// 000000000011
// 012345678901
const char chr244[] PROGMEM = {0x55,0x55,0x55,0x00,0x00,0x01,0xaa,0xaa,0xa8,0x20,0x00,0x08,0x22,0x14,0x88,0x22,0x84,0x88,0x22,0xa0,0x88,0x22,0xa8,0x88,0x22,0xaa,0x88,0x22,0xaa,0x88,0x22,0xa8,0x88,0x22,0xa0,0x88,0x22,0x84,0x88,0x22,0x14,0x88,0x20,0x00,0x08,0xaa,0xaa,0xa8,0x00,0x00,0x01,0x55,0x55,0x55};
 
 
// 0 -----------#
// 1 ----------#
// 2 ------##--#
// 3 -----# #-##
// 4 -----# ##
// 5 ------###
// 6 -------# ##
// 7 ----### #--
// 8 ---# # #--
// 9 ---# # #--
// 10 ----### #--
// 11 -------# ##
// 12 ------###
// 13 -----# ##
// 14 -----# #-##
// 15 ------##--#
// 16 ----------#
// 17 ----------##
// 000000000011
// 012345678901
const char chr245[] PROGMEM = {0x55,0x55,0x54,0x55,0x55,0x52,0x55,0x50,0x52,0x55,0x4a,0x10,0x55,0x4a,0x0a,0x55,0x50,0x2a,0x55,0x54,0xa0,0x55,0x02,0x85,0x54,0xa2,0x85,0x54,0xa2,0x85,0x55,0x02,0x85,0x55,0x54,0xa0,0x55,0x50,0x2a,0x55,0x4a,0x0a,0x55,0x4a,0x10,0x55,0x50,0x52,0x55,0x55,0x52,0x55,0x55,0x50};
 
 
// 0 #-----------
// 1 #----------
// 2 #--##------
// 3 ##-# #-----
// 4 ## #-----
// 5 ###------
// 6 ## #-------
// 7 --# ###----
// 8 --# # #---
// 9 --# # #---
// 10 --# ###----
// 11 ## #-------
// 12 ###------
// 13 ## #-----
// 14 ##-# #-----
// 15 #--##------
// 16 #----------
// 17 #-----------
// 000000000011
// 012345678901
const char chr246[] PROGMEM = {0x15,0x55,0x55,0x85,0x55,0x55,0x85,0x05,0x55,0x04,0xa1,0x55,0xa0,0xa1,0x55,0xa8,0x05,0x55,0x0a,0x15,0x55,0x52,0x80,0x55,0x52,0x8a,0x15,0x52,0x8a,0x15,0x52,0x80,0x55,0x0a,0x15,0x55,0xa8,0x05,0x55,0xa0,0xa1,0x55,0x04,0xa1,0x55,0x85,0x05,0x55,0x85,0x55,0x55,0x15,0x55,0x55};
 
 
// 0 ------------
// 1 ----------##
// 2 --------##
// 3 -------#
// 4 ------# ##
// 5 -----# ##-#
// 6 -----# #--#
// 7 ----# #---#
// 8 ----# #---#
// 9 ----# #---#
// 10 ----# #---#
// 11 -----# #--#
// 12 -----# ##-#
// 13 ------# ##
// 14 -------#
// 15 --------##
// 16 ----------##
// 17 ------------
// 000000000011
// 012345678901
const char chr247[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x50,0x55,0x55,0x0a,0x55,0x54,0xaa,0x55,0x52,0xa0,0x55,0x4a,0x04,0x55,0x4a,0x14,0x55,0x28,0x54,0x55,0x28,0x54,0x55,0x28,0x54,0x55,0x28,0x54,0x55,0x4a,0x14,0x55,0x4a,0x04,0x55,0x52,0xa0,0x55,0x54,0xaa,0x55,0x55,0x0a,0x55,0x55,0x50,0x55,0x55,0x55};
 
 
// 0 ------------
// 1 ##----------
// 2 ##--------
// 3 #-------
// 4 #------
// 5 #-----
// 6 #-----
// 7 #----
// 8 #----
// 9 #----
// 10 #----
// 11 #-----
// 12 #-----
// 13 #------
// 14 #-------
// 15 ##--------
// 16 ##----------
// 17 ------------
// 000000000011
// 012345678901
const char chr248[] PROGMEM = {0x55,0x55,0x55,0x05,0x55,0x55,0xa0,0x55,0x55,0xaa,0x15,0x55,0xaa,0x85,0x55,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0xaa,0xa8,0x55,0xaa,0xa8,0x55,0xaa,0xa8,0x55,0xaa,0xa8,0x55,0xaa,0xa1,0x55,0xaa,0xa1,0x55,0xaa,0x85,0x55,0xaa,0x15,0x55,0xa0,0x55,0x55,0x05,0x55,0x55,0x55,0x55,0x55};
 
 
// 0 ---------##-
// 1 --------# #
// 2 -------# #
// 3 ------# # #
// 4 -##### ## #
// 5 # #-# #
// 6 # ## #--# #
// 7 # ## #--# #
// 8 # ## #--# #
// 9 # ## #--# #
// 10 # ## #--# #
// 11 # #-# #
// 12 -##### ## #
// 13 ------# # #
// 14 -------# #
// 15 --------# #
// 16 ---------##-
// 17 ------------
// 000000000011
// 012345678901
const char chr249[] PROGMEM = {0x55,0x55,0x41,0x55,0x55,0x28,0x55,0x54,0xa8,0x55,0x52,0x88,0x40,0x0a,0x08,0x2a,0xa8,0x48,0x20,0xa1,0x48,0x20,0xa1,0x48,0x20,0xa1,0x48,0x20,0xa1,0x48,0x20,0xa1,0x48,0x2a,0xa8,0x48,0x40,0x0a,0x08,0x55,0x52,0x88,0x55,0x54,0xa8,0x55,0x55,0x28,0x55,0x55,0x41,0x55,0x55,0x55};
 
 
// 0 ------#-----
// 1 ----- #----
// 2 ------ #---
// 3 ---##-# #---
// 4 --# ## #---
// 5 -#-# ## #--
// 6 # ## ## #--
// 7 # ## ## #--
// 8 -# ## ## #--
// 9 # ## ## #--
// 10 # ## ## #--
// 11 -#-# ## #--
// 12 --# ## #---
// 13 ---##-# #---
// 14 ------ #---
// 15 ----- #----
// 16 ------#-----
// 17 ------------
// 000000000011
// 012345678901
const char chr250[] PROGMEM = {0x55,0x51,0x55,0x55,0x68,0x55,0x55,0x5a,0x15,0x54,0x12,0x15,0x52,0x82,0x15,0x44,0x82,0x85,0x20,0xa0,0x85,0x28,0x20,0x85,0x48,0x20,0x85,0x28,0x20,0x85,0x20,0xa0,0x85,0x44,0x82,0x85,0x52,0x82,0x15,0x54,0x12,0x15,0x55,0x5a,0x15,0x55,0x68,0x55,0x55,0x51,0x55,0x55,0x55,0x55};
 
 
// 0 -##########-
// 1 # #
// 2 -# ###### #-
// 3 -# #----# #-
// 4 -# #----# #-
// 5 -# #----# #-
// 6 --# #--# #--
// 7 ---# ## #---
// 8 ----# #----
// 9 ----# #----
// 10 ---# ## #---
// 11 --# #--# #--
// 12 -# #----# #-
// 13 -# #----# #-
// 14 -# #----# #-
// 15 -# ###### #-
// 16 # #
// 17 -##########-
// 000000000011
// 012345678901
const char chr251[] PROGMEM = {0x40,0x00,0x01,0x2a,0xaa,0xa8,0x48,0x00,0x21,0x48,0x55,0x21,0x48,0x55,0x21,0x48,0x55,0x21,0x52,0x14,0x85,0x54,0x82,0x15,0x55,0x28,0x55,0x55,0x28,0x55,0x54,0x82,0x15,0x52,0x14,0x85,0x48,0x55,0x21,0x48,0x55,0x21,0x48,0x55,0x21,0x48,0x00,0x21,0x2a,0xaa,0xa8,0x40,0x00,0x01};
 
 
// 0 ------------
// 1 --##--------
// 2 --# #-------
// 3 --# #------
// 4 --# #-----
// 5 --# #----
// 6 --# #---
// 7 --# #--
// 8 --# #-
// 9 --# #
// 10 --# ####
// 11 --# ##--
// 12 --# ## #--
// 13 --#### ##-
// 14 ------# #-
// 15 ------# #-
// 16 ------## ##-
// 17 --------#---
// 000000000011
// 012345678901
const char chr252[] PROGMEM = {0x55,0x55,0x55,0x50,0x55,0x55,0x52,0x15,0x55,0x52,0x85,0x55,0x52,0xa1,0x55,0x52,0xa8,0x55,0x52,0xaa,0x15,0x52,0xaa,0x85,0x52,0xaa,0xa1,0x52,0xaa,0xa8,0x52,0xaa,0x00,0x52,0xaa,0x05,0x52,0x0a,0x85,0x50,0x0a,0x81,0x55,0x52,0xa1,0x55,0x52,0xa1,0x55,0x50,0x81,0x55,0x55,0x15};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 --##--#---#-
// 8 -# ## #-# #
// 9 # ## # # #
// 10 # ## # # # #
// 11 # ## # # # #
// 12 # # ### #
// 13 # ## # #-# #
// 14 # ## # #-# #
// 15 # ## # #-# #
// 16 # ## # #-# #
// 17 -#--#-#---#-
// 000000000011
// 012345678901
const char chr253[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x50,0x51,0x51,0x4a,0x08,0x48,0x20,0x8a,0x28,0x20,0x88,0x88,0x20,0x88,0x88,0x2a,0x88,0x08,0x20,0x88,0x48,0x20,0x88,0x48,0x20,0x88,0x48,0x20,0x88,0x48,0x45,0x11,0x51};
 
 
// 0 ------------
// 1 ------------
// 2 ------------
// 3 ------------
// 4 ------------
// 5 ------------
// 6 ------------
// 7 -###--#---#-
// 8 # ## #-# #
// 9 # ## # # #
// 10 # ## # # # #
// 11 # ## # # # #
// 12 # ## ### #
// 13 # ##-# #-# #
// 14 # #--# #-# #
// 15 # #--# #-# #
// 16 # #--# #-# #
// 17 -#----#---#-
// 000000000011
// 012345678901
const char chr254[] PROGMEM = {0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x40,0x51,0x51,0x2a,0x08,0x48,0x20,0x8a,0x28,0x20,0x88,0x88,0x20,0x88,0x88,0x2a,0x08,0x08,0x20,0x48,0x48,0x21,0x48,0x48,0x21,0x48,0x48,0x21,0x48,0x48,0x45,0x51,0x51};
 
 
// 0
// 1
// 2
// 3
// 4
// 5
// 6
// 7
// 8
// 9
// 10
// 11
// 12
// 13
// 14
// 15
// 16
// 17
// 000000000011
// 012345678901
const char chr255[] PROGMEM = {0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
 
 
 
 
 
 
 
 
 
const char *chars[] PROGMEM = { chr0, chr1, chr2, chr3, chr4, chr5, chr6, chr7, chr8, chr9, chr10, chr11, chr12, chr13, chr14, chr15, chr16, chr17, chr18, chr19, chr20, chr21, chr22, chr23, chr24, chr25, chr26, chr27, chr28, chr29, chr30, chr31, chr32, chr33, chr34, chr35, chr36, chr37, chr38, chr39, chr40, chr41, chr42, chr43, chr44, chr45, chr46, chr47, chr48, chr49, chr50, chr51, chr52, chr53, chr54, chr55, chr56, chr57, chr58, chr59, chr60, chr61, chr62, chr63, chr64, chr65, chr66, chr67, chr68, chr69, chr70, chr71, chr72, chr73, chr74, chr75, chr76, chr77, chr78, chr79, chr80, chr81, chr82, chr83, chr84, chr85, chr86, chr87, chr88, chr89, chr90, chr91, chr92, chr93, chr94, chr95, chr96, chr97, chr98, chr99, chr100, chr101, chr102, chr103, chr104, chr105, chr106, chr107, chr108, chr109, chr110, chr111, chr112, chr113, chr114, chr115, chr116, chr117, chr118, chr119, chr120, chr121, chr122, chr123, chr124, chr125, chr126, chr127, chr128, chr129, chr130, chr131, chr132, chr133, chr134, chr135, chr136, chr137, chr138, chr139, chr140, chr141, chr142, chr143, chr144, chr145, chr146, chr147, chr148, chr149, chr150, chr151, chr152, chr153, chr154, chr155, chr156, chr157, chr158, chr159, chr160, chr161, chr162, chr163, chr164, chr165, chr166, chr167, chr168, chr169, chr170, chr171, chr172, chr173, chr174, chr175, chr176, chr177, chr178, chr179, chr180, chr181, chr182, chr183, chr184, chr185, chr186, chr187, chr188, chr189, chr190, chr191, chr192, chr193, chr194, chr195, chr196, chr197, chr198, chr199, chr200, chr201, chr202, chr203, chr204, chr205, chr206, chr207, chr208, chr209, chr210, chr211, chr212, chr213, chr214, chr215, chr216, chr217, chr218, chr219, chr220, chr221, chr222, chr223, chr224, chr225, chr226, chr227, chr228, chr229, chr230, chr231, chr232, chr233, chr234, chr235, chr236, chr237, chr238, chr239, chr240, chr241, chr242, chr243, chr244, chr245, chr246, chr247, chr248, chr249, chr250, chr251, chr252, chr253, chr254, chr255};
 
 
 
/**
* put the above chars in the memory of the MAX7456
* TODO: read out character, compare and write only if different
*/
void learn_all_chars_pgm(void) {
char *pointer;
for (uint16_t c = 0; c < 256; c++) {
LED3_ON
// select character to write (CMAH)
spi_send_byte(0x09, c);
 
_delay_ms(1);
 
pointer = (char*) pgm_read_word(&chars[c]);
for (uint8_t i = 0; i < 54; i++) {
// select 4pixel byte of char (CMAL)
spi_send_byte(0x0A, i);
 
_delay_ms(1);
 
// write 4pixel byte of char (CMDI)
spi_send_byte(0x0B, pgm_read_byte(pointer++));
_delay_ms(1);
}
 
// write to the NVM array from the shadow RAM (CMM)
spi_send_byte(0x08, 0b10100000);
 
LED3_OFF
// according to maxim writing to nvram takes about 12ms, lets wait longer
_delay_ms(50);
}
}
 
 
 
#endif
/C-OSD/trunk/C-OSD AGRESSiVA mod/characters.h
0,0 → 1,24
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
/**
* put the above chars in the memory of the MAX7456
*/
void learn_all_chars_pgm(void);
/C-OSD/trunk/C-OSD AGRESSiVA mod/config.c
0,0 → 1,369
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "max7456_software_spi.h"
#include "config.h"
#include "main.h"
#include "buttons.h"
#include "usart1.h"
 
uint8_t EEMEM ee_checkbyte1 = CHECKBYTE1;
uint8_t EEMEM ee_checkbyte2 = CHECKBYTE2;
uint8_t EEMEM ee_COSD_FLAGS_MODES = 0;
uint8_t EEMEM ee_COSD_FLAGS_CONFIG = 0;
uint8_t EEMEM ee_COSD_DISPLAYMODE = 0;
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
// video modes
const char VM_PAL[] PROGMEM = "PAL ";
const char VM_NTSC[] PROGMEM = "NTSC";
 
 
const displaymode_t * mode;
 
#endif
 
const char ee_message0[] PROGMEM = "Loading Data from EEPROM";
const char ee_message1[] PROGMEM = "No saved Data in EEPROM";
const char* ee_msg[] PROGMEM = {ee_message0, ee_message1};
 
/**
* read data saved in eeprom, print out message if <verbose> is set
*/
void get_eeprom(uint8_t verbose) {
if (eeprom_read_byte(&ee_checkbyte1) == CHECKBYTE1 && eeprom_read_byte(&ee_checkbyte2) == CHECKBYTE2) {
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
if (verbose) write_ascii_string_pgm(2, 9, ee_msg[0]); // Loading data
#endif
COSD_FLAGS_MODES = eeprom_read_byte(&ee_COSD_FLAGS_MODES);
COSD_FLAGS_CONFIG = eeprom_read_byte(&ee_COSD_FLAGS_CONFIG);
COSD_DISPLAYMODE = eeprom_read_byte(&ee_COSD_DISPLAYMODE);
//if (verbose) write_ndigit_number_u(23, 11, COSD_DISPLAYMODE, 2, 0);
} else {
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
if (verbose) write_ascii_string_pgm(2, 9, ee_msg[1]); // Loading data
#endif
}
}
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
/**
* save data to eeprom
*/
void save_eeprom() {
eeprom_write_byte(&ee_checkbyte1, CHECKBYTE1);
eeprom_write_byte(&ee_checkbyte2, CHECKBYTE2);
eeprom_write_byte(&ee_COSD_FLAGS_MODES, COSD_FLAGS_MODES);
eeprom_write_byte(&ee_COSD_FLAGS_CONFIG, COSD_FLAGS_CONFIG);
eeprom_write_byte(&ee_COSD_DISPLAYMODE, COSD_DISPLAYMODE);
}
 
/**
* auto config some stuff on startup, currently only battery cells
* TODO: this is testing stuff, strings should go progmem and so on...
*/
void init_cosd(uint8_t UBat) {
clear();
write_ascii_string_pgm(2, 1, PSTR("C-OSD AGRESSiVA MOD")); // C-OSD Initialisation
#if FCONLY
write_ascii_string_pgm(2, 2, PSTR("FC only Mode")); // FC only mode
#else
write_ascii_string_pgm(2, 2, PSTR("NaviCtrl Mode")); // NaviCtrl Mode
#endif
write_ascii_string_pgm(2, 3, PSTR(BUILDDATE));
uint8_t cellnum = 0;
if (CELL_NUM == -1) {
write_ascii_string_pgm(2, 4, PSTR("Guessing Number of Cells")); // Guessing Number of Cells
do {
cellnum++;
} while (UBat > ((cellnum * CELL_VOLT_MAX) + 23));
} else {
cellnum = CELL_NUM;
}
min_voltage = cellnum * CELL_VOLT_MIN;
max_voltage = cellnum * CELL_VOLT_MAX;
write_ascii_string_pgm(2, 5, PSTR("Number of Cells:")); // Number of Cells
write_ndigit_number_u(21, 5, cellnum, 1, 0);
write_ascii_string_pgm(2, 6, PSTR("Warn Voltage :")); // Warn Voltage
write_ndigit_number_s_10th(20, 6, min_voltage, 3, 0);
write_ascii_string_pgm(2, 7, PSTR("Max Voltage :")); // Max Voltage
write_ndigit_number_s_10th(20, 7, max_voltage, 3, 0);
 
get_eeprom(1);
 
//write_ascii_string_pgm(23, 2, vm[COSD_FLAGS & COSD_FLAG_NTSC]);
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
write_ascii_string_pgm(23, 2, VM_NTSC);
} else {
write_ascii_string_pgm(23, 2, VM_PAL);
}
 
// request version from board
rxd_buffer_locked = 0;
usart1_EnableTXD();
#if FCONLY
//usart1_request_mk_data(0, 'v', 0);
write_ascii_string_pgm(2, 11, PSTR("FC VERSION: ........"));
usart1_puts_pgm(PSTR(REQUEST_FC_VERSION));
#else
//usart1_request_mk_data(1, 'v', 0);
usart1_puts_pgm(PSTR(REQUEST_NC_VERSION));
write_ascii_string_pgm(2, 11, PSTR("NC VERSION: ........"));
#endif
usart1_DisableTXD();
// wait for response
while (rxd_buffer_locked == 0) {
asm("nop");
}
Decode64();
str_VersionInfo VersionInfo;
VersionInfo = *((str_VersionInfo*) pRxData);
write_ndigit_number_u(14, 11, VersionInfo.SWMajor, 3, 1);
write_ndigit_number_u(18, 11, VersionInfo.SWMinor, 3, 1);
write_ascii_char(22 + 11*30, 'a' + VersionInfo.SWPatch);
// end version request
 
 
#if FCONLY
COSD_DISPLAYMODE %= (sizeof(fcdisplaymodes) / sizeof(displaymode_t));
mode = fcdisplaymodes;
mode += COSD_DISPLAYMODE;
osd_fcmode = (int(*)(void)) pgm_read_word(&mode->dfun);
// re-request data ever 100ms from FC;
//usart1_request_mk_data(0, 'd', 100);
#else
COSD_DISPLAYMODE %= (sizeof(ncdisplaymodes) / sizeof(displaymode_t));
mode = ncdisplaymodes;
mode += COSD_DISPLAYMODE;
osd_ncmode = (int(*)(void)) pgm_read_word(&mode->dfun);
// re-request OSD Data from NC every 100ms
//usart1_request_mk_data(1, 'o', 100);
#endif
 
_delay_ms(3000);
clear();
// update flags to paint display again because of clear
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
}
 
/* ##########################################################################
* A simple config menu for the flags
* ##########################################################################*/
 
/**
* helper function for flag display
*/
void onoff(uint8_t line, uint8_t onoff) {
if (onoff) {
write_ascii_string_pgm(23, line, PSTR("ON "));
} else {
write_ascii_string_pgm(23, line, PSTR("OFF"));
}
}
 
/**
* helper function for menu updating
*/
void config_menu_drawings(uint8_t chosen) {
uint8_t line = 2;
 
// clear prevoius _cursor_
//write_char_xy(3, line + ((chosen + 11) % 12), 0x00);
for (uint8_t x = 2; x < 28; x++) {
write_char_att_xy(x, line + ((chosen + 11) % 12), 0);
write_char_att_xy(x, line + chosen, BLACKBG | INVERT);
};
// draw current _cursor_
//write_char_xy(3, line + chosen, 0xD9);
 
write_ascii_string_pgm(4, line, PSTR("Video Mode"));
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
write_ascii_string_pgm(23, line, VM_NTSC);
} else {
write_ascii_string_pgm(23, line, VM_PAL);
}
write_ascii_string_pgm(4, ++line, PSTR("Full HUD"));
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_HUD);
write_ascii_string_pgm(4, ++line, PSTR("Art Horizon in HUD"));
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON);
write_ascii_string_pgm(4, ++line, PSTR("Big Vario bar"));
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO);
 
write_ascii_string_pgm(4, ++line, PSTR("Statistics"));
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_STATS);
 
write_ascii_string_pgm(4, ++line, PSTR("Current by FC"));
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT);
 
write_ascii_string_pgm(4, ++line, PSTR("Voltage by C-Strom"));
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT);
 
write_ascii_string_pgm(4, ++line, PSTR("Reset uptime"));
write_ascii_string_pgm(4, ++line, PSTR("Display Mode"));
write_ascii_string_pgm(18, line, (const char *) (pgm_read_word(&(mode->desc))));
write_ascii_string_pgm(4, ++line, PSTR("Height by"));
if (COSD_FLAGS_CONFIG & COSD_FLAG_GPSHEIGHT) {
write_ascii_string_pgm(20, line, PSTR(" GPS"));
} else {
write_ascii_string_pgm(20, line, PSTR("BARO"));
}
 
write_ascii_string_pgm(4, ++line, PSTR("Save config"));
write_ascii_string_pgm(4, ++line, PSTR("EXIT"));
}
 
/**
* some sort of clicking response in the menu
*/
void config_menu_doclick(uint8_t chosen) {
write_ascii_string_pgm(4, chosen + 2, PSTR("DONE "));
_delay_ms(500);
config_menu_drawings(chosen);
}
 
/**
* a simple config menu tryout
*/
void config_menu(void) {
// disable interrupts (makes the menu more smoothely)
cli();
 
// clear screen
clear();
 
uint8_t chosen = 0;
uint8_t inmenu = 1;
write_ascii_string_pgm(6, 1, PSTR("C-OSD Config Menu"));
 
// wait a bit before doing stuff so user has chance to release button
_delay_ms(250);
 
config_menu_drawings(chosen);
 
while (inmenu) {
if (s2_pressed()) {
chosen = (chosen + 1) % 12;
config_menu_drawings(chosen);
_delay_ms(500);
} else if (s1_pressed()) {
switch (chosen) {
case 0: // NTSC or PAL
COSD_FLAGS_CONFIG ^= COSD_FLAG_NTSC;
// Setup Video Mode
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
// NTSC + enable display immediately (VM0)
spi_send_byte(0x00, 0b00001000);
 
bottom_line = 12;
} else {
// PAL + enable display immediately (VM0)
spi_send_byte(0x00, 0b01001000);
 
bottom_line = 14;
}
config_menu_drawings(chosen);
break;
case 1: // full HUD
COSD_FLAGS_MODES ^= COSD_FLAG_HUD;
config_menu_drawings(chosen);
break;
case 2: // art horizon
COSD_FLAGS_MODES ^= COSD_FLAG_ARTHORIZON;
config_menu_drawings(chosen);
break;
case 3: // big vario
COSD_FLAGS_MODES ^= COSD_FLAG_BIGVARIO;
config_menu_drawings(chosen);
break;
case 4: // statistics
COSD_FLAGS_MODES ^= COSD_FLAG_STATS;
config_menu_drawings(chosen);
break;
/*case 5: // warnings
COSD_FLAGS_MODES ^= COSD_FLAG_WARNINGS;
config_menu_drawings(chosen);
break;*/
case 5: // current by fc
COSD_FLAGS_MODES ^= COSD_FLAG_FCCURRENT;
config_menu_drawings(chosen);
break;
case 6: // 2nd voltage by c-strom
COSD_FLAGS_MODES ^= COSD_FLAG_STROMVOLT;
config_menu_drawings(chosen);
break;
case 7: // reset uptime
uptime = 0;
config_menu_doclick(chosen);
break;
case 8: // change mode
#if FCONLY
COSD_DISPLAYMODE = (COSD_DISPLAYMODE + 1) % (sizeof(fcdisplaymodes) / sizeof(displaymode_t));
mode = fcdisplaymodes;
mode += COSD_DISPLAYMODE;
osd_fcmode = (int(*)(void)) pgm_read_word(&mode->dfun);
#else
COSD_DISPLAYMODE = (COSD_DISPLAYMODE + 1) % (sizeof(ncdisplaymodes) / sizeof(displaymode_t));
mode = ncdisplaymodes;
mode += COSD_DISPLAYMODE;
osd_ncmode = (int(*)(void)) pgm_read_word(&mode->dfun);
#endif
config_menu_drawings(chosen);
break;
case 9: // GPS or BARO height
COSD_FLAGS_CONFIG ^= COSD_FLAG_GPSHEIGHT;
config_menu_drawings(chosen);
break;
case 10: // save
save_eeprom();
config_menu_doclick(chosen);
break;
case 11: // exit
inmenu = 0;
break;
}
_delay_ms(250);
}
}
 
// clear screen up again
clear();
 
// update flags to paint display again if needed
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
 
// enable interrupts again
sei();
}
 
#endif
/C-OSD/trunk/C-OSD AGRESSiVA mod/config.h
0,0 → 1,45
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#define CHECKBYTE1 46
#define CHECKBYTE2 23
 
extern uint8_t COSD_FLAGS_MODES, COSD_FLAGS_CONFIG, COSD_FLAGS_RUNTIME, COSD_DISPLAYMODE;
extern uint8_t min_voltage;
extern uint8_t max_voltage;
extern uint8_t bottom_line;
 
extern volatile uint16_t uptime;
 
/**
* read data saved in eeprom, print out message if <verbose> is set
*/
void init_cosd(uint8_t);
 
/**
* a simple config menu tryout
*/
void config_menu(void);
 
/**
* read data saved in eeprom, print out message if <verbose> is set
*/
void get_eeprom(uint8_t);
 
/C-OSD/trunk/C-OSD AGRESSiVA mod/main.c
0,0 → 1,431
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* MOD By Eduardo R Lavratti - aKKa AGRESSiVA *
*
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* *
* Credits to: *
* Holger Buss & Ingo Busker from mikrokopter.de for the MK project + SVN *
* Gregor "killagreg" Stobrawa for making the MK code readable *
* Klaus "akku" Buettner for the hardware *
* Manuel "KeyOz" Schrape for explaining the MK protocol to me *
****************************************************************************/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "main.h"
#include "max7456_software_spi.h"
#include "usart1.h"
#include "osd_helpers.h"
#include "config.h"
#include "spi.h"
#include "buttons.h"
#include "ppm.h"
#include "osd_ncmode_default.h"
#include "osd_ncmode_minimal.h"
#include "osd_fcmode_default.h"
#include "osd_fcmode_jopl.h"
 
#if WRITECHARS != -1
#include "characters.h"
#endif
 
/* TODO:
* - verifiy correctness of values
* - clean up code :)
*/
 
 
/* ##########################################################################
* global definitions and global vars
* ##########################################################################*/
 
volatile NaviData_t naviData;
volatile DebugOut_t debugData;
 
// cache old vars for blinking attribute, checkup is faster than full
// attribute write each time
volatile uint8_t last_UBat = 255;
volatile uint8_t last_RC_Quality = 255;
 
// 16bit should be enough, normal LiPos don't last that long
volatile uint16_t uptime = 0;
volatile uint16_t timer = 0;
volatile uint16_t flytime_fc = 0;
 
// remember last time data was received
volatile uint8_t seconds_since_last_data = 0;
 
// general PAL|NTSC distingiusch stuff
uint8_t top_line = 1;
uint8_t bottom_line = 14;
 
// battery voltages
uint8_t min_voltage = 0;
uint8_t max_voltage = 0;
 
// Flags
uint8_t COSD_FLAGS_MODES = 0, COSD_FLAGS_CONFIG = 0, COSD_FLAGS_RUNTIME = 0, COSD_DISPLAYMODE = 0;
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
// stats for after flight
int16_t max_Altimeter = 0;
uint8_t min_UBat = 255;
uint16_t max_GroundSpeed = 0;
int16_t max_Distance = 0;
uint16_t max_FlyingTime = 0;
 
// flags from last round to check for changes
uint8_t old_MKFlags = 0;
 
// store stats description in progmem to save space
const char stats_item_0[] PROGMEM = "max Altitude:";
const char stats_item_1[] PROGMEM = "max Speed :";
const char stats_item_2[] PROGMEM = "max Distance:";
const char stats_item_3[] PROGMEM = "min Voltage :";
const char stats_item_4[] PROGMEM = "max Time :";
const char stats_item_5[] PROGMEM = "longitude :";
const char stats_item_6[] PROGMEM = "latitude :";
const char stats_item_7[] PROGMEM = "max current :";
const char *stats_item_pointers[8] PROGMEM = {stats_item_0, stats_item_1, stats_item_2,
stats_item_3, stats_item_4, stats_item_5, stats_item_6, stats_item_7};
 
//char* directions[8] = {"NE", "E ", "SE", "S ", "SW", "W ", "NW", "N "};
//char arrowdir[8] = {218, 217, 224, 223, 222, 221, 220, 219};
const char str_NE[] PROGMEM = "NE";
const char str_E[] PROGMEM = "E ";
const char str_SE[] PROGMEM = "SE";
const char str_S[] PROGMEM = "S ";
const char str_SW[] PROGMEM = "SW";
const char str_W[] PROGMEM = "W ";
const char str_NW[] PROGMEM = "NW";
const char str_N[] PROGMEM = "N ";
const char *directions[8] PROGMEM = {
str_NE,
str_E,
str_SE,
str_S,
str_SW,
str_W,
str_NW,
str_N};
 
/* ##########################################################################
* Different display mode function pointers
* ##########################################################################*/
const char str_1[] PROGMEM = "default";
const char str_2[] PROGMEM = "minimal";
const char str_3[] PROGMEM = " jopl";
 
const displaymode_t ncdisplaymodes[] PROGMEM = {
{ osd_ncmode_default, (char *)str_1 },
{ osd_ncmode_minimal, (char *)str_2 }
};
 
const displaymode_t fcdisplaymodes[] PROGMEM = {
{ osd_fcmode_default, (char *)str_1 },
{ osd_fcmode_jopl, (char *)str_3 }
};
 
int (*osd_ncmode)(void) = (int(*)(void)) &osd_ncmode_default;
int (*osd_fcmode)(void) = (int(*)(void)) &osd_fcmode_default;
#endif
 
/* ##########################################################################
* Interrupt handler
* ##########################################################################*/
 
/**
* handler for undefined Interrupts
* if not defined AVR will reset in case any unhandled interrupts occur
*/
ISR(__vector_default) {
asm("nop");
}
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
/* ##########################################################################
* timer stuff
* ##########################################################################*/
 
static uint8_t delay_spi = 0;
 
/**
* timer kicks in every 1000uS ^= 1ms
*/
ISR(TIMER0_COMP_vect) {
if (!timer--) {
uptime++;
 
#if FCONLY
if (debugData.Analog[12]>10) {
flytime_fc++;
}
#endif
 
timer = 999;
seconds_since_last_data++;
}
// in case there is still some spi data to send do it now
// delay to give the slave some time to compute values
if (spi_ready && icnt) {
if (!delay_spi--) {
delay_spi = 8;
spi_send_next();
}
}
}
#endif // ends !(ALLCHARSDEBUG|(WRITECHARS != -1))#endif // ends !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
/* ##########################################################################
* MAIN
* ##########################################################################*/
int main(void) {
// set up FLAGS
COSD_FLAGS_MODES = 0, COSD_FLAGS_CONFIG = 0, COSD_FLAGS_RUNTIME = 0;
#if NTSC
COSD_FLAGS_CONFIG |= COSD_FLAG_NTSC;
#endif
#if HUD
COSD_FLAGS_MODES |= COSD_FLAG_HUD;
#endif
#if ARTHORIZON
COSD_FLAGS_MODES |= COSD_FLAG_ARTHORIZON;
#endif
#if BIGVARIO
COSD_FLAGS_MODES |= COSD_FLAG_BIGARIO;
#endif
#if STATS
COSD_FLAGS_MODES |= COSD_FLAG_STATS;
#endif
#if WARNINGS
COSD_FLAGS_MODES |= COSD_FLAG_WARNINGS;
#endif
#if FCONLY
COSD_FLAGS_CONFIG |= COSD_FLAG_FCMODE;
#endif
 
 
// set up Atmega162 Ports
DDRA |= (1 << PA1); // PA1 output (/CS)
MAX_CS_HIGH
DDRA |= (1 << PA2); // PA2 output (SDIN)
MAX_SDIN_LOW
DDRA |= (1 << PA3); // PA3 output (SCLK)
MAX_SCLK_LOW
DDRA |= (1 << PA5); // PA5 output (RESET)
MAX_RESET_HIGH
 
DDRC |= (1 << PC0); // PC0 output (LED1 gn)
LED1_OFF
DDRC |= (1 << PC1); // PC1 output (LED2 rt)
LED2_OFF
DDRC |= (1 << PC2); // PC2 output (LED3 gn)
LED3_OFF
DDRC |= (1 << PC3); // PC3 output (LED4 rt)
LED4_OFF
 
DDRC &= ~(1 << PC4); // PC4 input (MODE)
PORTC |= (1 << PC4); // pullup
DDRC &= ~(1 << PC5); // PC5 input (SET)
PORTC |= (1 << PC5); // pullup
 
// reset the MAX7456 to be sure any undefined states do no harm
MAX_RESET_LOW
MAX_RESET_HIGH
 
// give the FC/NC and the maxim time to come up
LED4_ON
_delay_ms(1000);
LED4_OFF
 
//Pushing NEW chars to the MAX7456
#if (WRITECHARS != -1)
// DISABLE display (VM0)
spi_send_byte(0x00, 0b00000000);
learn_all_chars_pgm();
#else
// read out config for NTSC/PAL distinguishing
get_eeprom(0);
#endif
 
// Setup Video Mode
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
// NTSC + enable display immediately (VM0)
spi_send_byte(0x00, 0b00001000);
 
bottom_line = 12;
} else {
// PAL + enable display immediately (VM0)
spi_send_byte(0x00, 0b01001000);
 
bottom_line = 14;
}
 
/*// clear all display-mem (DMM)
spi_send_byte(0x04, 0b00000100);
 
// clearing takes 12uS according to maxim so lets wait longer
_delay_us(120);
 
// 8bit mode
spi_send_byte(0x04, 0b01000000);*/
 
// clear display memory and set to 8bit mode
clear();
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
// init usart
usart1_init();
 
// keep serial port clean
usart1_DisableTXD();
 
// set up timer
// CTC, Prescaler /64
TCCR0 = (1 << WGM01) | (0 << WGM00) | (0 << CS02) | (1 << CS01) | (1 << CS00);
 
TCNT0 = 0;
OCR0 = 250;
 
// enable timer output compare interrupt
TIMSK &= ~(1 << TOIE0);
TIMSK |= (1 << OCIE0);
 
// SPI setup
DDRD |= (1 << PD2); // PD2 output (INT0)
SpiMasterInit();
 
// PPM detection setup
ppm_init();
 
// enable interrupts
sei();
#endif
 
write_ascii_string(2, 5, " AGRESSiVA MOD");
write_ascii_string(2, 7, " EPi OSD Firmware");
write_ascii_string(2, 9, " WAiTiNG for Controller");
// we are ready
LED3_ON
 
#if ALLCHARSDEBUG | (WRITECHARS != -1)
clear();
write_all_chars();
LED1_ON
LED2_ON
LED3_ON
LED4_ON
#else
 
// clear serial screen
//usart1_puts("\x1B[2J\x1B[H");
//usart1_puts("hello world!123\r\n");
 
while (1) {
// in case SPI is ready and there is nothing to send right now
if (!icnt && spi_ready) {
// correct transfer ends with d (done)
if (SPI_buffer.buffer.chk == 'd') {
ampere = SPI_buffer.data.ampere;
ampere_wasted = SPI_buffer.data.mah;
s_volt = SPI_buffer.data.volt;
 
// if this is the first receival we should print the small A
if (!(COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC)) {
clear();
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
// update this flag
COSD_FLAGS_RUNTIME |= COSD_FLAG_STROMREC;
}
} else {
// update flags
COSD_FLAGS_RUNTIME &= ~COSD_FLAG_STROMREC;
}
StartTransfer(9);
}
if (rxd_buffer_locked) {
#if FCONLY
if (rxd_buffer[2] == 'D') { // FC Data
Decode64();
debugData = *((DebugOut_t*) pRxData);
 
// init on first data retrival, distinguished by last battery :)
if (last_UBat == 255) {
if (debugData.Analog[9] > 40) {
// fix for min_UBat
min_UBat = debugData.Analog[9];
last_UBat = debugData.Analog[9];
init_cosd(last_UBat);
}
} else {
osd_fcmode();
}
seconds_since_last_data = 0;
}
#else
if (rxd_buffer[2] == 'O') { // NC OSD Data
Decode64();
naviData = *((NaviData_t*) pRxData);
 
// init on first data retrival, distinguished by last battery :)
if (last_UBat == 255) {
if (naviData.UBat > 40) {
// fix for min_UBat
min_UBat = naviData.UBat;
last_UBat = naviData.UBat;
init_cosd(last_UBat);
}
} else {
osd_ncmode();
}
//seconds_since_last_data = 0;
}
#endif
rxd_buffer_locked = 0;
}
// handle keypress
if (s1_pressed()) {
config_menu();
}
if (seconds_since_last_data > 0) {
usart1_EnableTXD();
//usart1_puts_pgm(PSTR("zu alt\r\n"));
#if FCONLY
// request data ever 100ms from FC;
//usart1_request_mk_data(0, 'd', 100);
usart1_puts_pgm(PSTR(REQUEST_DBG_DATA));
#else
// request OSD Data from NC every 100ms
//usart1_request_mk_data(1, 'o', 100);
usart1_puts_pgm(PSTR(REQUEST_OSD_DATA));
 
// and disable debug...
//usart1_request_mk_data(0, 'd', 0);
#endif
// reset last time counter
seconds_since_last_data = 0;
usart1_DisableTXD();
}
}
#endif
return 0;
}
/C-OSD/trunk/C-OSD AGRESSiVA mod/main.h
0,0 → 1,175
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include <avr/pgmspace.h>
#include "mk-data-structs.h"
 
/* ##########################################################################
* Debugging and general purpose definitions
* ##########################################################################*/
#ifndef BUILDDATE
#define BUILDDATE "DEVEL-BUILD" // build date, this is testing...
#endif
 
#define ALLCHARSDEBUG 0 // set to 1 and flash firmware to see all chars
 
#ifndef WRITECHARS // if WRITECHARS not set via makefile
#define WRITECHARS -1 // set to 1 and flash firmware to write all chars
#endif
 
#define NEW_ARTHORIZON 1 // set to 1 for full artificial horizon (agr type)
 
#ifndef NTSC // if NTSC is not thet via makefile
#define NTSC 0 // set to 1 for NTSC mode + lifts the bottom line
#endif
 
#ifndef FCONLY
#define FCONLY 0 // set to 1 if you do NOT have a NaviCtrl and the OSD is
#endif // connected to the FC directly
 
#define HUD 1 // set to 0 to disable HUD by default
#define ARTHORIZON 0 // set to 1 to enable roll&nick artificial horizon by default
#define BIGVARIO 0 // set to 1 to enable the big vario bar on right side
#define STATS 1 // set to 1 to enable statistics during motor off by default
#define WARNINGS 1 // set to 1 to display battery+rc warning even if HUD is disabled
 
//#define UBAT_WRN 94 // voltage for blinking warning, like FC settings (deprecated)
//#define UBAT_MAX 114 // maximal battery voltage for battery-sign (deprecated)
#define CELL_VOLT_MAX 37 // max voltage per battery cell (37 for LiPo)
#define CELL_VOLT_MIN 32 // min voltage per battery cell (maybe 32 for LiPo?)
#define CELL_NUM -1 // -1 for auto, 3 for 3s1p and 4 for 4s1p
#define RCLVL_WRN 100 // make the RC level blink if below this number
 
// ### read datasheet before changing stuff below this line :)
#define BLINK 0b01001111 // attribute byte for blinking characters
#define INVERT 0b00101111 // attribute byte for inverted characters
#define BLACKBG 0b10001111 // attribute byte for _black background_ on characters
 
/* ##########################################################################
* FLAGS usable during runtime that get saved
* ##########################################################################*/
#define COSD_FLAG_HUD 1
#define COSD_FLAG_ARTHORIZON 2
#define COSD_FLAG_BIGVARIO 4
#define COSD_FLAG_STATS 8
#define COSD_FLAG_WARNINGS 16
#define COSD_FLAG_STROMVOLT 32
#define COSD_FLAG_FCCURRENT 64
 
 
#define COSD_FLAG_NTSC 1
#define COSD_FLAG_GPSHEIGHT 2
#define COSD_FLAG_FCMODE 4
 
/* ##########################################################################
* FLAGS only usable during runtime (not saved)
* ##########################################################################*/
#define COSD_FLAG_STROMREC 1
#define COSD_ICONS_WRITTEN 2
#define COSD_WASFLYING 4
 
/* ##########################################################################
* LED controll
* ##########################################################################*/
#define LED1_ON PORTC |= (1 << PC0);
#define LED1_OFF PORTC &= ~(1 << PC0);
#define LED2_ON PORTC |= (1 << PC1);
#define LED2_OFF PORTC &= ~(1 << PC1);
#define LED3_ON PORTC |= (1 << PC2);
#define LED3_OFF PORTC &= ~(1 << PC2);
#define LED4_ON PORTC |= (1 << PC3);
#define LED4_OFF PORTC &= ~(1 << PC3);
 
/* ##########################################################################
* switch controll
* ##########################################################################*/
#define S1_PRESSED !(PINC & (1<<PC5))
#define S2_PRESSED !(PINC & (1<<PC4))
 
/* ##########################################################################
* extern spi controlled vars
* ##########################################################################*/
extern volatile uint16_t icnt;
extern volatile unsigned char * iptr;
extern volatile uint8_t spi_cmd_buffer[];
extern volatile uint8_t spi_ready;
extern int16_t ampere, max_ampere, s_volt;
extern int32_t ampere_wasted;
 
/* ##########################################################################
* struct for displaymodes
* ##########################################################################*/
typedef struct {
int (*dfun)(void); // function pointer
char *desc; // description text
} displaymode_t;
 
const displaymode_t ncdisplaymodes[2];
const displaymode_t fcdisplaymodes[2];
 
int (*osd_ncmode)(void);
int (*osd_fcmode)(void);
 
/* ##########################################################################
* vars used by other parts as well
* ##########################################################################*/
volatile uint16_t setsReceived;
 
volatile NaviData_t naviData;
volatile DebugOut_t debugData;
 
// cache old vars for blinking attribute, checkup is faster than full
// attribute write each time
volatile uint8_t last_UBat;
volatile uint8_t last_RC_Quality;
 
// 16bit should be enough, normal LiPos don't last that long
volatile uint16_t uptime;
volatile uint16_t timer;
volatile uint16_t flytime_fc;
volatile uint16_t wasted_ampere_offset;
 
// remember last time data was received
volatile uint8_t seconds_since_last_data;
 
// general PAL|NTSC distingiusch stuff
uint8_t top_line;
uint8_t bottom_line;
 
// battery voltages
uint8_t min_voltage;
uint8_t max_voltage;
 
// Flags
uint8_t COSD_FLAGS_MODES, COSD_FLAGS_CONFIG, COSD_FLAGS_RUNTIME, COSD_DISPLAYMODE;
 
// stats for after flight
int16_t max_Altimeter, altimeter_offset;
uint8_t min_UBat;
 
uint16_t max_GroundSpeed;
int16_t max_Distance;
uint16_t max_FlyingTime;
 
// flags from last round to check for changes
uint8_t old_MKFlags;
 
const char *directions[8];
const char *stats_item_pointers[8];
/C-OSD/trunk/C-OSD AGRESSiVA mod/max7456_software_spi.c
0,0 → 1,330
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include <avr/io.h>
 
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <string.h>
#include <stdlib.h>
#include "main.h"
#include "max7456_software_spi.h"
 
 
char conv_array[7]; // general array for number -> char conversation
 
/* ##########################################################################
* MAX7456 SPI & Display stuff
* ##########################################################################*/
 
/**
* Send a byte through SPI
* inline because it increases the codesize currenlty 'only' by 110byte but saves
* the context-change on every char and attribute which is at least done twice
* (address and data byte), a significant speed-bost we do not want to miss :)
*/
inline void spi_send(uint8_t byte) {
for (int8_t i = 7; i >= 0; i--) {
if (((byte >> i) & 1)) {
MAX_SDIN_HIGH
} else {
MAX_SDIN_LOW
}
MAX_SCLK_HIGH
MAX_SCLK_LOW
}
}
 
/**
* Send <byte> to <address> of MAX7456
*/
void spi_send_byte(uint8_t address, uint8_t byte) {
// start sending
MAX_CS_LOW
 
spi_send(address);
spi_send(byte);
 
// end sending
MAX_CS_HIGH
}
 
 
/**
* write a <character> to <address> of MAX7456 display memory
*/
void write_char(uint16_t address, char character) {
spi_send_byte(0x05, (address & 0xFF00) >> 8); // DMAH
spi_send_byte(0x06, (address & 0x00FF)); // DMAL
spi_send_byte(0x07, character); // DMDI
}
 
 
/**
* clear display memory
* (also sets 8bit mode)
*/
void clear(void) {
/*uint16_t memory_address = 0;
for (unsigned int a = 0; a < 480; a++) {
write_char(memory_address++, 0);
}*/
// clear all display-mem (DMM)
spi_send_byte(0x04, 0b01000100);
 
// clearing takes 12uS according to maxim so lets wait longer
_delay_us(20);
}
 
 
#if (ALLCHARSDEBUG|(WRITECHARS != -1))
/**
* for testing write all chars to screen
*/
void write_all_chars() {
uint16_t x = 3, y = 2, t = 0;
while (t < 256) {
write_char(x++ + y*30, t++);
if (x > 25) {
y++;
x = 3;
}
}
}
 
/**
* let the MAX7456 learn a new character at <number>
* with <data>.
*/
void learn_char(uint8_t number, unsigned char* data) {
// select character to write (CMAH)
spi_send_byte(0x09, number);
 
for (uint8_t i = 0; i < 54; i++) {
// select 4pixel byte of char (CMAL)
spi_send_byte(0x0A, i);
 
// write 4pixel byte of char (CMDI)
spi_send_byte(0x0B, data[i]);
}
 
// write to the NVM array from the shadow RAM (CMM)
spi_send_byte(0x08, 0b10100000);
 
// according to maxim writing to nvram takes about 12ms, lets wait longer
_delay_ms(120);
}
#endif
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
/**
* write a character <attribute> to <address> of MAX7456 display memory
*/
void write_char_att(uint16_t address, char attribute) {
// the only important part is that the DMAH[1] is set
// so we add 2 which binary is the 2nd lowest byte
spi_send_byte(0x05, ((address & 0xFF00) >> 8) | 2); // DMAH
spi_send_byte(0x06, (address & 0x00FF)); // DMAL
spi_send_byte(0x07, attribute); // DMDI
}
 
/**
* write a <character> at <x>/<y> to MAX7456 display memory
*/
void write_char_xy(uint8_t x, uint8_t y, char character) {
uint16_t address = y * 30 + x;
write_char(address, character);
}
 
/**
* write a character <attribute> at <x>/<y> to MAX7456 display memory
*/
void write_char_att_xy(uint8_t x, uint8_t y, char attribute) {
uint16_t address = y * 30 + x;
write_char_att(address, attribute);
}
 
/**
* write an ascii <character> to <address> of MAX7456 display memory
*/
void write_ascii_char(uint16_t address, char c) {
if (c == 32) c = 0; // remap space
else if (c > 48 && c <= 57) c -= 48; // remap numbers
else if (c == '0') c = 10; // remap zero
else if (c >= 65 && c <= 90) c -= 54; // remap big letters
else if (c >= 97 && c <= 122) c -= 60; // remap small letters
else if (c == '(') c = 63; // remap
else if (c == ')') c = 64; // remap
else if (c == '.') c = 65; // remap
else if (c == '-') c = 73; // remap minus
else if (c == ';') c = 67; // remap
else if (c == ':') c = 68; // remap
else if (c == ',') c = 69; // remap
// else if (c == '?') c = 66; // remap
// else if (c == '\'') c = 70; // remap
// else if (c == '/') c = 71; // remap
// else if (c == '"') c = 72; // remap
// else if (c == '<') c = 74; // remap
// else if (c == '>') c = 75; // remap
// else if (c == '@') c = 76; // remap
write_char(address, c);
}
 
/**
* write an ascii <string> at <x>/<y> to MAX7456 display memory
*/
void write_ascii_string(uint8_t x, uint8_t y, char *string) {
while (*string) {
write_ascii_char(((x++)+(y * 30)), *string);
string++;
}
}
 
/**
* write an ascii <string> from progmen at <x>/<y> to MAX7456 display memory
*/
void write_ascii_string_pgm(uint8_t x, uint8_t y, const char *string) {
while (pgm_read_byte(string) != 0x00)
write_ascii_char(((x++)+(y * 30)), pgm_read_byte(string++));
}
 
/**
* write an <string> from progmen at <x>/<y> downwards to MAX7456 display memory
*/
void write_string_pgm_down(uint8_t x, uint8_t y, const char *string, uint8_t length) {
while (length--)
write_char((x+(y++ * 30)), pgm_read_byte(string++));
}
 
/**
* Write a unsigned <number> at <x>/<y> to MAX7456 display memory
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u(uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
for (uint8_t i = 0; i < length - strlen(conv_array); i++) {
if (pad) write_char((x++)+(y * 30), 10);
else write_ascii_char((x++)+(y * 30), 0);
}
write_ascii_string(x, y, conv_array);
}
 
/**
* Write a signed <number> at <x>/<y> to MAX7456 display memory
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s(uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
for (uint8_t i = 0; i < length - strlen(conv_array); i++) {
if (pad) write_char((x++)+(y * 30), 10);
else write_ascii_char((x++)+(y * 30), 0);
}
write_ascii_string(x, y, conv_array);
}
 
/**
* Write a unsigned <number> at <x>/<y> to MAX7456 display memory as /10th of value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u_10th(uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
uint8_t len = strlen(conv_array);
for (uint8_t i = 0; i < length - len; i++) {
if (pad) write_char((x++)+(y * 30), 10); // zero
else write_char((x++)+(y * 30), 0); // blank
}
char rest = conv_array[len - 1];
conv_array[len - 1] = 0;
if (len == 1) {
write_char((x-1)+(y * 30), 10); // zero
} else if (len == 2 && conv_array[0] == '-') {
write_char((x-1)+(y * 30), 0x49); // minus
write_char((x)+(y * 30), 10); // zero
} else {
write_ascii_string(x, y, conv_array);
}
x += len - 1;
write_char((x++)+(y * 30), 65); // decimal point
write_ascii_char((x++)+(y * 30), rest); // after dot
}
 
/**
* Write a signed <number> at <x>/<y> to MAX7456 display memory as /10th of value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s_10th(uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
uint8_t len = strlen(conv_array);
for (uint8_t i = 0; i < length - len; i++) {
if (pad) write_char((x++)+(y * 30), 10); // zero
else write_char((x++)+(y * 30), 0); // blank
}
char rest = conv_array[len - 1];
conv_array[len - 1] = 0;
if (len == 1) {
write_char((x-1)+(y * 30), 10); // zero
} else if (len == 2 && conv_array[0] == '-') {
write_char((x-1)+(y * 30), 0x49); // minus
write_char((x)+(y * 30), 10); // zero
} else {
write_ascii_string(x, y, conv_array);
}
x += len - 1;
write_char((x++)+(y * 30), 65); // decimal point
write_ascii_char((x++)+(y * 30), rest); // after dot
}
 
/**
* write <seconds> as human readable time at <x>/<y> to MAX7456 display mem
*/
void write_time(uint8_t x, uint8_t y, uint16_t seconds) {
uint16_t min = seconds / 60;
seconds -= min * 60;
write_ndigit_number_u(x, y, min, 3, 0);
write_char_xy(x + 3, y, 68);
write_ndigit_number_u(x + 4, y, seconds, 2, 1);
}
 
/**
* wirte a <position> at <x>/<y> assuming it is a gps position for long-/latitude
*/
void write_gps_pos(uint8_t x, uint8_t y, int32_t position) {
if (position < 0) {
position ^= ~0;
position++;
write_char_xy(x++, y, 0x49); // minus
} else {
write_char_xy(x++, y, 0); // clear ('+' would be nice, maybe later)
}
write_ndigit_number_u(x, y, (uint16_t) (position / (int32_t) 10000000), 3, 1);
write_char_xy(x + 3, y, 65); // decimal point
position = position - ((position / (int32_t) 10000000) * (int32_t) 10000000);
write_ndigit_number_u(x + 4, y, (uint16_t) (position / (int32_t) 1000), 4, 1);
position = position - ((uint16_t) (position / (int32_t) 1000) * (int32_t) 1000);
write_ndigit_number_u(x + 8, y, (uint16_t) position, 3, 1);
write_char_xy(x + 11, y, 0xD0); // degree symbol
}
 
#endif
/C-OSD/trunk/C-OSD AGRESSiVA mod/max7456_software_spi.h
0,0 → 1,141
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
/* ##########################################################################
* Software SPI to communicate with MAX7456
* ##########################################################################*/
#define MAX_CS_HIGH PORTA |= (1 << PA1);
#define MAX_CS_LOW PORTA &= ~(1 << PA1);
#define MAX_SDIN_HIGH PORTA |= (1 << PA2);
#define MAX_SDIN_LOW PORTA &= ~(1 << PA2);
#define MAX_SCLK_HIGH PORTA |= (1 << PA3);
#define MAX_SCLK_LOW PORTA &= ~(1 << PA3);
#define MAX_RESET_HIGH PORTA |= (1 << PA5);
#define MAX_RESET_LOW PORTA &= ~(1 << PA5);
 
 
/* ##########################################################################
* MAX7456 SPI & Display stuff
* ##########################################################################*/
 
/**
* Send a byte through SPI
*/
void spi_send(uint8_t);
 
/**
* Send <byte> to <address> of MAX7456
*/
void spi_send_byte(uint8_t, uint8_t);
 
/**
* write a <character> to <address> of MAX7456 display memory
*/
void write_char(uint16_t, char);
 
/**
* write a character <attribute> to <address> of MAX7456 display memory
*/
void write_char_att(uint16_t, char);
/**
* write a <character> at <x>/<y> to MAX7456 display memory
*/
void write_char_xy(uint8_t, uint8_t, char);
/**
* write a character <attribute> at <x>/<y> to MAX7456 display memory
*/
void write_char_att_xy(uint8_t, uint8_t, char attribute);
 
/**
* clear display memory
* (also sets 8bit mode)
*/
void clear(void);
 
/**
* write an ascii <character> to <address> of MAX7456 display memory
*/
void write_ascii_char(uint16_t, char);
 
/**
* write an ascii <string> at <x>/<y> to MAX7456 display memory
*/
void write_ascii_string(uint8_t, uint8_t, char*);
 
/**
* write an ascii <string> from progmen at <x>/<y> to MAX7456 display memory
*/
void write_ascii_string_pgm(uint8_t, uint8_t, const char*);
 
/**
* write an <string> from progmen at <x>/<y> downwards to MAX7456 display memory
*/
void write_string_pgm_down(uint8_t, uint8_t, const char*, uint8_t);
 
/**
* Write a unsigned <number> at <x>/<y> to MAX7456 display memory
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u(uint8_t, uint8_t, uint16_t, int16_t, uint8_t);
 
/**
* Write a signed <number> at <x>/<y> to MAX7456 display memory
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s(uint8_t, uint8_t, int16_t, int16_t, uint8_t);
 
/**
* Write a unsigned <number> at <x>/<y> to MAX7456 display memory as /10th of value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u_10th(uint8_t, uint8_t, uint16_t, int16_t, uint8_t);
 
/**
* Write a signed <number> at <x>/<y> to MAX7456 display memory as /10th of value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s_10th(uint8_t, uint8_t, int16_t, int16_t, uint8_t);
 
/**
* write <seconds> as human readable time at <x>/<y> to MAX7456 display mem
*/
void write_time(uint8_t, uint8_t, uint16_t);
 
#if (ALLCHARSDEBUG|(WRITECHARS != -1))
/**
* for testing write all chars to screen
*/
void write_all_chars();
 
/**
* let the MAX7456 learn a new character at <number>
* with <data>.
*/
void learn_char(uint8_t, unsigned char*);
#endif
 
/**
* wirte a <position> at <x>/<y> assuming it is a gps position for long-/latitude
*/
void write_gps_pos(uint8_t, uint8_t, int32_t);
/C-OSD/trunk/C-OSD AGRESSiVA mod/mk-data-structs.h
0,0 → 1,141
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
/* ##########################################################################
* gain some fake arm compat :)
* ##########################################################################*/
#define u8 uint8_t
#define s8 int8_t
#define u16 uint16_t
#define s16 int16_t
#define u32 uint32_t
#define s32 int32_t
 
/*
* FC Debug Struct
* portions taken and adapted from
* http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.72p%2Fuart.h
*/
typedef struct {
uint8_t Digital[2];
uint16_t Analog[32]; // Debugvalues
} __attribute__((packed)) DebugOut_t;
 
 
typedef struct {
unsigned char SWMajor;
unsigned char SWMinor;
unsigned char ProtoMajor;
unsigned char ProtoMinor;
unsigned char SWPatch;
unsigned char Reserved[5];
} str_VersionInfo;
 
 
/*
* NaviCtrl OSD Structs
* portions taken and adapted from
* http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.18c%2Fuart1.h
*/
typedef struct {
s32 Longitude; // in 1E-7 deg
s32 Latitude; // in 1E-7 deg
s32 Altitude; // in mm
u8 Status; // validity of data
} __attribute__((packed)) GPS_Pos_t;
#define INVALID 0x00
#define NEWDATA 0x01
#define PROCESSED 0x02
 
 
+ u16 Distance; // distance to target in cm
+ s16 Bearing; // course to target in deg
+} __attribute__((packed)) GPS_PosDev_t;
+
+typedef struct {
+ u8 Version; // version of the data structure
+ GPS_Pos_t CurrentPosition; // see ubx.h for details
+ GPS_Pos_t TargetPosition;
+ GPS_PosDev_t TargetPositionDeviation;
+ GPS_Pos_t HomePosition;
+ GPS_PosDev_t HomePositionDeviation;
+ u8 WaypointIndex; // index of current waypoints running from 0 to WaypointNumber-1
+ u8 WaypointNumber; // number of stored waypoints
+ u8 SatsInUse; // number of satellites used for position solution
+ s16 Altimeter; // hight according to air pressure
+ s16 Variometer; // climb(+) and sink(-) rate
+ u16 FlyingTime; // in seconds
+ u8 UBat; // Battery Voltage in 0.1 Volts
+ u16 GroundSpeed; // speed over ground in cm/s (2D)
+ s16 Heading; // current flight direction in � as angle to north
+ s16 CompassHeading; // current compass value in �
+ s8 AngleNick; // current Nick angle in 1�
+ s8 AngleRoll; // current Rick angle in 1�
+ u8 RC_Quality; // RC_Quality
+ u8 FCFlags; // Flags from FC
+ u8 NCFlags; // Flags from NC
+ u8 Errorcode; // 0 --> okay
+ u8 OperatingRadius; // current operation radius around the Home Position in m
+ s16 TopSpeed; // velocity in vertical direction in cm/s
+ u8 TargetHoldTime; // time in s to stay at the given target, counts down to 0 if target has been reached
+ u8 RC_RSSI; // Receiver signal strength (since version 2 added)
+ s16 SetpointAltitude; // setpoint for altitude
+ u8 Gas; // for future use
+ u16 Current; // actual current in 0.1A steps
+ u16 UsedCapacity; // used capacity in mAh
+} __attribute__((packed)) NaviData_t;
+
+
+/*
+ * MikroKopter Flags
+ * taken from
+ * http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.78b%2Ffc.h
+ */
+#define FCFLAG_MOTOR_RUN 0x01
+#define FCFLAG_FLY 0x02
+#define FCFLAG_CALIBRATE 0x04
+#define FCFLAG_START 0x08
+#define FCFLAG_NOTLANDUNG 0x10
+#define FCFLAG_LOWBAT 0x20
+#define FCFLAG_SPI_RX_ERR 0x40
+#define FCFLAG_I2CERR 0x80
+
+// backward compat
+#define FLAG_MOTOR_RUN FCFLAG_MOTOR_RUN
+#define FLAG_FLY FCFLAG_FLY
+#define FLAG_CALIBRATE FCFLAG_CALIBRATE
+#define FLAG_START FCFLAG_START
+
+/*
+ * NaviCtrl Flags
+ * taken from
+ * http://mikrocontroller.cco-ev.de/mikrowebsvn/filedetails.php?repname=NaviCtrl&path=%2Ftags%2FV0.17e%2Fuart1.h
+ */
+#define NC_FLAG_FREE 0x01
+#define NC_FLAG_PH 0x02
+#define NC_FLAG_CH 0x04
+#define NC_FLAG_RANGE_LIMIT 0x08
+#define NC_FLAG_NOSERIALLINK 0x10
+#define NC_FLAG_TARGET_REACHED 0x20
+#define NC_FLAG_MANUAL_CONTROL 0x40
+#define NC_FLAG_8 0x80
+
+
/C-OSD/trunk/C-OSD AGRESSiVA mod/osd_fcmode_default.c
0,0 → 1,104
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include "main.h"
#include "max7456_software_spi.h"
#include "osd_helpers.h"
#include "osd_fcmode_default.h"
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
int osd_fcmode_default() {
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
write_char_xy(10, top_line, 0xCA); // RC-transmitter
write_char_xy(27, top_line, 0xCC); // small meters m height
write_char_xy(7, bottom_line, 0x9E); // small v
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
write_char_xy(7, bottom_line - 1, 0x9F); // small A
write_char_xy(14, bottom_line - 1, 0xB5); // mah
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_char_xy(21, bottom_line - 1, 0x9E); // small V
}
}
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (debugData.Analog[10] > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, 0);
}
if (debugData.Analog[5] > 300 || debugData.Analog[5] < -300) {
// above 10m only write full meters
write_ndigit_number_s(23, top_line, debugData.Analog[5] / 30, 4, 0);
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(23, top_line, debugData.Analog[5] / 3, 3, 0);
}
if (debugData.Analog[5] > max_Altimeter) max_Altimeter = debugData.Analog[5];
 
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
draw_artificial_horizon(top_line + 2, bottom_line - 1, debugData.Analog[0], debugData.Analog[1]);
}
 
// pre-bottom line
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
//write_ndigit_number_s(3, bottom_line - 1, ampere, 4, 0);
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 3, 0);
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_ndigit_number_u_10th(17, bottom_line - 1, s_volt, 3, 0);
}
}
 
draw_battery(2, bottom_line, min_voltage, debugData.Analog[9], max_voltage);
write_ndigit_number_u_10th(3, bottom_line, debugData.Analog[9], 3, 0);
if (debugData.Analog[9] <= min_voltage && last_UBat > min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
} else if (debugData.Analog[9] > min_voltage && last_UBat < min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, 0);
}
}
// remember last values
last_UBat = debugData.Analog[9];
last_RC_Quality = debugData.Analog[10];
 
/*
debugData.Analog[0]); // AngleNick
debugData.Analog[1]); // AngleRoll
debugData.Analog[5]); // Height
debugData.Analog[9]); // Voltage
debugData.Analog[10]);// RC Signal
debugData.Analog[11]);// Gyro compass
*/
seconds_since_last_data = 0;
 
return 0;
}
 
#endif
/C-OSD/trunk/C-OSD AGRESSiVA mod/osd_fcmode_default.h
0,0 → 1,21
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
int osd_fcmode_default(void);
/C-OSD/trunk/C-OSD AGRESSiVA mod/osd_fcmode_jopl.c
0,0 → 1,176
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* This is an alternative FC-mode contributed by Josef "jopl" Plasil *
* who is using the FC with an MK3Mag and the OSD *
****************************************************************************/
 
#include "main.h"
#include "max7456_software_spi.h"
#include "osd_helpers.h"
#include "osd_fcmode_default.h"
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
// jopl Vario
static int16_t last_Altimeter = 0;
static int16_t Vario = 0;
 
int osd_fcmode_jopl() {
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
write_char_xy(10, top_line, 0xCA); // RC-transmitter
 
// jopl ... compass
write_char_xy(16, top_line, 0xD0); // degree symbol
// end jopl
 
write_char_xy(26, top_line, 0xCC); // small meters m height
write_char_xy(7, bottom_line, 0x9E); // small v
 
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
write_char_xy(7, bottom_line - 1, 0x9F); // small A
write_char_xy(14, bottom_line - 1, 0xB5); // mah
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_char_xy(21, bottom_line - 1, 0x9E); // small V
}
}
 
// jopl ... Times
write_char_xy(14, bottom_line, 0xD1); // on clock
write_char_xy(21, bottom_line, 0xD2); // fly clock
// end jopl
 
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (debugData.Analog[10] > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, 0);
}
 
// jopl ... compass
write_ndigit_number_u(13, top_line, debugData.Analog[8], 3, 0);
write_ascii_string_pgm(17, top_line, (const char *) (pgm_read_word(&(directions[heading_conv(debugData.Analog[8])]))));
// end jopl
 
// jopl Altimeter modification
if ((debugData.Analog[5] > 100) || (debugData.Analog[5] < -100)) {
// above 10m only write full meters
write_ndigit_number_s(22, top_line, debugData.Analog[5] / 10, 4, 0);
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(22, top_line, debugData.Analog[5], 3, 0);
}
Vario = debugData.Analog[5] - last_Altimeter;
draw_variometer(27, top_line, Vario);
if (COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO) {
draw_big_variometer(27, 8, Vario);
}
last_Altimeter = debugData.Analog[5];
// end jopl
 
if (debugData.Analog[5] > max_Altimeter) max_Altimeter = debugData.Analog[5];
 
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
draw_artificial_horizon(top_line + 2, bottom_line - 1, debugData.Analog[0], debugData.Analog[1]);
}
 
// jopl ... compass heading
// seccond line
draw_compass(11, top_line + 1, debugData.Analog[8]);
// end jopl
 
// pre-bottom line
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
//write_ndigit_number_s(3, bottom_line - 1, ampere, 4, 0);
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 3, 0);
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_ndigit_number_u_10th(17, bottom_line - 1, s_volt, 3, 0);
}
}
 
draw_battery(2, bottom_line, min_voltage, debugData.Analog[9], max_voltage);
write_ndigit_number_u_10th(3, bottom_line, debugData.Analog[9], 3, 0);
if (debugData.Analog[9] <= min_voltage && last_UBat > min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
} else if (debugData.Analog[9] > min_voltage && last_UBat < min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, 0);
}
 
// jopl ... Times
write_time(8, bottom_line, uptime);
write_time(15, bottom_line, flytime_fc);
// Test ... show Gas value
// write_ndigit_number_s(22, bottom_line, debugData.Analog[5], 5, 0);
// end jopl
 
}
// remember last values
last_UBat = debugData.Analog[9];
last_RC_Quality = debugData.Analog[10];
 
/*
debugData.Analog[0]); // AngleNick
debugData.Analog[1]); // AngleRoll
debugData.Analog[2]); // AccNick
debugData.Analog[3]); // AccRoll
debugData.Analog[4]); // GyroGier
debugData.Analog[5]); // Height Value
debugData.Analog[6]); // AccZ
debugData.Analog[7]); // Throttle
debugData.Analog[8]); // Compass Value
debugData.Analog[9]); // Voltage
debugData.Analog[10]);// RC Signal
debugData.Analog[11]);// Gyro compass
debugData.Analog[12]);// Motor Front
debugData.Analog[13]);// Motor Rear
debugData.Analog[14]);// Motor Left
debugData.Analog[15]);// Motor Right
debugData.Analog[16]);//
debugData.Analog[17]);//
debugData.Analog[18]);//
debugData.Analog[19]);// MK3Mag CalState
debugData.Analog[20]);// Servo
debugData.Analog[21]);//
debugData.Analog[22]);//
debugData.Analog[23]);//
debugData.Analog[24]);//
debugData.Analog[25]);//
debugData.Analog[26]);//
debugData.Analog[27]);// Kalman_MaxDrift
debugData.Analog[28]);//
debugData.Analog[29]);//
debugData.Analog[30]);// GPS_Nick
debugData.Analog[31]);// GPS_Roll
*/
seconds_since_last_data = 0;
 
return 0;
}
 
#endif
/C-OSD/trunk/C-OSD AGRESSiVA mod/osd_fcmode_jopl.h
0,0 → 1,21
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
int osd_fcmode_jopl(void);
/C-OSD/trunk/C-OSD AGRESSiVA mod/osd_helpers.c
0,0 → 1,320
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include <avr/pgmspace.h>
#include "main.h"
#include "osd_helpers.h"
#include "max7456_software_spi.h"
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
/* ##########################################################################
* compass stuff
* ##########################################################################*/
 
/**
* convert the <heading> gotton from NC into an index
*/
uint8_t heading_conv(uint16_t heading) {
if (heading > 23 && heading < 68) {
//direction = "NE";
return 0;
} else if (heading > 67 && heading < 113) {
//direction = "E ";
return 1;
} else if (heading > 112 && heading < 158) {
//direction = "SE";
return 2;
} else if (heading > 157 && heading < 203) {
//direction = "S ";
return 3;
} else if (heading > 202 && heading < 248) {
//direction = "SW";
return 4;
} else if (heading > 247 && heading < 293) {
//direction = "W ";
return 5;
} else if (heading > 292 && heading < 338) {
//direction = "NW";
return 6;
}
//direction = "N ";
return 7;
}
 
/**
* convert the <heading> gotton from NC into a more
* precise index
*/
uint8_t heading_fine_conv(uint16_t heading) {
heading = ((heading * 10) + 113) % 3600;
return (heading / 225);
}
 
/**
* draw a compass rose at <x>/<y> for <heading>
*/
void draw_compass(uint8_t x, uint8_t y, uint16_t heading) {
//char* rose = "---N---O---S---W---N---O---S---W---N---O---S---W";
static char rose[48] PROGMEM = {216, 215, 216, 211, 216, 215, 216, 213, 216, 215, 216, 212,
216, 215, 216, 214, 216, 215, 216, 211, 216, 215, 216, 213,
216, 215, 216, 212, 216, 215, 216, 214, 216, 215, 216, 211,
216, 215, 216, 213, 216, 215, 216, 212, 216, 215, 216, 214};
// the center is char 19 (north), we add the current heading in 8th
// which would be 22.5 degrees, but float would bloat up the code
// and *10 / 225 would take ages... so we take the uncorrect way
uint8_t front = 19 + (heading / 22);
for (uint8_t i = 0; i < 9; i++) {
write_char_xy(x++, y, pgm_read_byte(&rose[front - 4 + i]));
}
}
 
/* ##########################################################################
* battery index
* ##########################################################################*/
/**
* draw a battery symbol at <x>/<y> according to <voltage>
*/
void draw_battery(uint8_t x, uint8_t y, uint8_t min_voltage, uint8_t voltage, uint8_t max_voltage) {
uint8_t percent = (100* (voltage - min_voltage) / (max_voltage - min_voltage));
if (percent > 100) percent = 100;
if (voltage < min_voltage) percent = 0;
write_char_xy(x, y, 0x9d - (percent * 13 / 100));
//write_ndigit_number_u(x, y-1, percent * 13 / 100, 100, 0);
}
 
/* ##########################################################################
* variometer
* ##########################################################################*/
/**
* draw variometer arrows at <x>/<y> according to <variometer>
*/
void draw_variometer(uint8_t x, uint8_t y, int16_t variometer) {
if (variometer == 0) {
write_char_xy(x, y, 0xbb); // plain line
} else if (variometer > 0) { // gain height
switch (variometer / 5){
case 0:
//write_char_xy(x, y, 0xba); // smallest arrow up
write_char_xy(x, y, 0x70); // one arrow up
break;
case 1:
//write_char_xy(x, y, 0xb9); // small arrow up
write_char_xy(x, y, 0x71); // two arrows up
break;
case 2:
//write_char_xy(x, y, 0xb8); // large arrow up
write_char_xy(x, y, 0x72); // three arrows up
break;
default:
//write_char_xy(x, y, 0xb7); // largest arrow up
write_char_xy(x, y, 0x73); // three black arrows up
}
} else { // sink
switch (variometer / -5){
case 0:
//write_char_xy(x, y, 0xbc); // smallest arrow down
write_char_xy(x, y, 0x77); // one arrow down
break;
case 1:
//write_char_xy(x, y, 0xbd); // small arrow down
write_char_xy(x, y, 0x76); // two arrows down
break;
case 2:
//write_char_xy(x, y, 0xbe); // large arrow down
write_char_xy(x, y, 0x75); // three arrows down
break;
default:
//write_char_xy(x, y, 0xbf); // largest arrow down
write_char_xy(x, y, 0x74); // three black arrows down
}
}
}
 
// big vario arrays
const char vario_00[5] PROGMEM = {0x00, 0x00, 0xc2, 0xff, 0xff};
const char vario_01[5] PROGMEM = {0x00, 0x00, 0xc2, 0xff, 0xc0};
const char vario_02[5] PROGMEM = {0x00, 0x00, 0xc2, 0xff, 0xc1};
const char vario_03[5] PROGMEM = {0x00, 0x00, 0xc2, 0xff, 0x00};
const char vario_04[5] PROGMEM = {0x00, 0x00, 0xc2, 0xc0, 0x00};
const char vario_05[5] PROGMEM = {0x00, 0x00, 0xc2, 0xc1, 0x00};
const char vario_06[5] PROGMEM = {0x00, 0x00, 0xc2, 0x00, 0x00};
const char vario_07[5] PROGMEM = {0x00, 0x00, 0xbb, 0x00, 0x00};
const char vario_08[5] PROGMEM = {0x00, 0x00, 0xc3, 0x00, 0x00};
const char vario_09[5] PROGMEM = {0x00, 0xc4, 0xc3, 0x00, 0x00};
const char vario_10[5] PROGMEM = {0x00, 0xc5, 0xc3, 0x00, 0x00};
const char vario_11[5] PROGMEM = {0x00, 0xff, 0xc3, 0x00, 0x00};
const char vario_12[5] PROGMEM = {0xc4, 0xff, 0xc3, 0x00, 0x00};
const char vario_13[5] PROGMEM = {0xc5, 0xff, 0xc3, 0x00, 0x00};
const char vario_14[5] PROGMEM = {0xff, 0xff, 0xc3, 0x00, 0x00};
const char* vario_pnt[15] PROGMEM = {vario_00, vario_01, vario_02, vario_03, vario_04,
vario_05, vario_06, vario_07, vario_08,
vario_09, vario_10, vario_11, vario_12,
vario_13, vario_14};
 
/**
* draw a bigger vario with middle at <x>/<y> acording to <variometer>
*/
void draw_big_variometer(uint8_t x, uint8_t y, int16_t variometer) {
int16_t index = 7 + variometer;
if (index > 14) index = 14;
else if (index < 0) index = 0;
write_string_pgm_down(x, y-2, (const char *) (pgm_read_word ( &(vario_pnt[index]))), 5);
}
 
#if (NEW_ARTHORIZON == 1)
/* ##########################################################################
* NEW artificial horizon By AGRESSiVA --=-- COPTERTRONiC
* ##########################################################################*/
// draw routine
int draw_noodles(int8_t pos_x, int8_t pos_y, int8_t num, int8_t old_num) {
char noodle[5] = {225, 226, 227, 228, 229};
int8_t line,car;
line = num / 5;
car = num - (line * 5);
if (num != old_num) {
write_char_xy(15 - pos_x , pos_y + (old_num), 0);
}
 
if (num < 0) {car = -1* car; car = 4 - car; line--; num = num - 5;}
write_char_xy(15 - pos_x , pos_y + line, noodle[car]);
 
return line;
}
 
/**
* calculate the rails of artificial horizon
* receive <nick> and <roll> values
*/
void draw_artificial_horizon(uint8_t firstline, uint8_t lastline, int16_t nick, int16_t roll) {
static int8_t old_ticy = 1,old_ticx = 0;
static int8_t old1 = 0,old2 = 0,old3 = 0,old4, old5 = 0, old6 = 0,old7 = 0,old8 = 0;
int8_t ticy = 0, ticx = 0;
uint8_t center_x = 15;
uint8_t center_y = lastline - firstline;
center_y = 7;
write_char_xy(center_x - 7 ,center_y,226);
write_char_xy(center_x + 6 ,center_y,226);
 
 
#if FCONLY
ticy = -1*(roll / 10); // rescale roll from FC debug data
ticx = -1*(nick * 10); // rescale nick from FC debug data
#else
ticy = -1*(roll / 2);
ticx = -1*(nick / 1);
#endif
 
if (ticy >= 30) ticy = 30; // limit y
if (ticx >= 30) ticx = 30; // limit x
 
//write_ndigit_number_u (0 , 5 , ticy ,3, 1);
//write_ndigit_number_u (0 , 6 , ticx ,3, 1);
 
if ((ticy != old_ticy) || (ticx != old_ticx)) {
old1 = draw_noodles( 4, 3, (ticy / 2) + 20 + ticx, old1);
old2 = draw_noodles( 3, 3, (ticy / 3) + 20 + ticx, old2);
old3 = draw_noodles( 2, 3, (ticy / 6) + 20 + ticx, old3);
old4 = draw_noodles( 1, 3, (ticy / 14) + 20 + ticx, old4);
old5 = draw_noodles( - 3, 3, -(ticy / 2) + 20 + ticx, old5);
old6 = draw_noodles( - 2, 3, -(ticy / 3) + 20 + ticx, old6);
old7 = draw_noodles( - 1, 3, -(ticy / 6) + 20 + ticx, old7);
old8 = draw_noodles( 0, 3, -(ticy / 14) + 20 + ticx, old8);
}
// update old vars
old_ticy = ticy;
old_ticx = ticx;
}
// end NEW ARTiFiCiAL HORiZON
#else
 
/* ##########################################################################
* OLD artificial horizon
* ##########################################################################*/
// remember last time displayed values
int8_t old_af_x = -1, old_af_y = -1;
 
/**
* draw roll und nick indicators (could be enhanced to full artificial horizon)
* from line <firstline> to <listlines> for given <nick> and <roll> values
*/
 
 
void draw_artificial_horizon(uint8_t firstline, uint8_t lastline, int16_t nick, int16_t roll) {
char noodle[5] = {225, 225, 226, 227, 227};
uint8_t center_x = 15;
uint8_t center_y = lastline - firstline;
center_y = 7;
write_char_xy(center_x,center_y,228);
uint8_t cpos, nicky, rollx;
// which line
int8_t ypos = nick / 20;
// which character from the array?
if (nick < 0) {
cpos = -1*((nick - (ypos * 20))/4);
ypos--;
} else cpos = 4-((nick - (ypos * 20))/4);
if (cpos > 4) cpos = 4;
 
nicky = center_y - ypos;
if (nicky > lastline) nicky = lastline;
else if (nicky < firstline) nicky = firstline;
 
// ensure roll-borders
rollx = (roll / 8)+15;
if (rollx < 2) rollx = 2;
else if (rollx > 28) rollx = 28;
 
 
// clear roll
if (old_af_x != rollx && old_af_x >= 0) {
write_char_xy(old_af_x, lastline, 0);
}
 
// clear nick
if (old_af_y != nicky && old_af_y >= 0) {
write_char_xy(center_x-1, old_af_y, 0);
write_char_xy(center_x+1, old_af_y, 0);
}
 
 
// draw nick
write_char_xy(center_x-1, nicky, noodle[cpos]);
write_char_xy(center_x+1, nicky, noodle[cpos]);
 
// draw roll
write_char_xy(rollx, lastline, 229);
 
// update old vars
old_af_x = rollx;
old_af_y = nicky;
 
// debug numbers
//write_3digit_number_u(20,6,cpos);
//write_number_s(20,7,ypos);
//write_number_s(0,7,nick);
//write_number_s(18,11,roll);
}
#endif //old artificial horizon
 
#endif // debug
/C-OSD/trunk/C-OSD AGRESSiVA mod/osd_helpers.h
0,0 → 1,69
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
/* ##########################################################################
* compass stuff
* ##########################################################################*/
 
/**
* convert the <heading> gotton from NC into an index
*/
uint8_t heading_conv(uint16_t);
 
/**
* convert the <heading> gotton from NC into a more
* precise index
*/
uint8_t heading_fine_conv(uint16_t );
 
/**
* draw a compass rose at <x>/<y> for <heading>
*/
void draw_compass(uint8_t, uint8_t, uint16_t);
 
/* ##########################################################################
* battery index
* ##########################################################################*/
/**
* draw a battery symbol at <x>/<y> according to <voltage>
*/
void draw_battery(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t);
 
/* ##########################################################################
* variometer
* ##########################################################################*/
/**
* draw variometer arrows at <x>/<y> according to <variometer>
*/
void draw_variometer(uint8_t, uint8_t, int16_t);
 
/**
* draw a bigger vario with middle at <x>/<y> acording to <variometer>
*/
void draw_big_variometer(uint8_t, uint8_t, int16_t);
 
/* ##########################################################################
* artificial horizon
* ##########################################################################*/
/**
* draw roll und nick indicators (could be enhanced to full artificial horizon)
* from line <firstline> to <listlines> for given <nick> and <roll> values
*/
void draw_artificial_horizon(uint8_t, uint8_t, int16_t, int16_t);
/C-OSD/trunk/C-OSD AGRESSiVA mod/osd_ncmode_default.c
0,0 → 1,262
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include "main.h"
#include "max7456_software_spi.h"
#include "osd_helpers.h"
#include "osd_ncmode_default.h"
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
int osd_ncmode_default() {
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
write_char_xy(5, top_line, 0xCB); // km/h
write_char_xy(10, top_line, 0xCA); // RC-transmitter
write_char_xy(16, top_line, 0xD0); // degree symbol
write_char_xy(27, top_line, 0xCC); // small meters m height
write_char_xy(20, top_line + 1, 0xB0); // left circle
write_char_xy(22, top_line + 1, 0xB2); // right circle
write_char_xy(27, top_line + 1, 0xCC); // small meters m home
write_char_xy(7, bottom_line, 0x9E); // small V
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) || (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
write_char_xy(7, bottom_line - 1, 0x9F); // small A
write_char_xy(14, bottom_line - 1, 0xB5); // mah
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_char_xy(21, bottom_line - 1, 0x9E); // small V
}
}
write_char_xy(14, bottom_line, 0xD1); // on clock
write_char_xy(21, bottom_line, 0xD2); // fly clock
write_char_xy(26, bottom_line, 0xC8); // sat1
write_char_xy(27, bottom_line, 0xC9); // sat2
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
// first line
write_ndigit_number_u(2, top_line, (uint16_t) (((uint32_t) naviData.GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
 
write_ndigit_number_u(7, top_line, naviData.RC_Quality, 3, 0);
if (naviData.RC_Quality <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (naviData.RC_Quality > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, 0);
}
 
if (naviData.NCFlags & NC_FLAG_NOSERIALLINK) {
write_char_xy(11, top_line, 0); // clear
} else {
write_char_xy(11, top_line, 0xC6); // PC icon
}
 
write_ndigit_number_u(13, top_line, naviData.CompassHeading, 3, 0);
 
write_ascii_string_pgm(17, top_line, (const char *) (pgm_read_word ( &(directions[heading_conv(naviData.CompassHeading)]))));
 
draw_variometer(21, top_line, naviData.Variometer);
 
if (COSD_FLAGS_CONFIG & COSD_FLAG_GPSHEIGHT) {
if (naviData.CurrentPosition.Altitude / 1000 - altimeter_offset > 10 || naviData.CurrentPosition.Altitude / 1000 - altimeter_offset < -10) {
// above 10m only write full meters
write_ndigit_number_s(23, top_line, (int16_t) (naviData.CurrentPosition.Altitude / 1000 - altimeter_offset), 4, 0); // GPS
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(23, top_line, (int16_t) (naviData.CurrentPosition.Altitude / 100 - altimeter_offset * 10), 3, 0); // GPS
}
} else {
//note:lephisto:according to several sources it's /30
if (naviData.Altimeter > 300 || naviData.Altimeter < -300) {
// above 10m only write full meters
write_ndigit_number_s(23, top_line, naviData.Altimeter / 30, 4, 0); // BARO
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(23, top_line, naviData.Altimeter / 3, 3, 0); // BARO
}
}
+
+ // seccond line
+ draw_compass(11, top_line + 1, naviData.CompassHeading);
+
+ // TODO: verify correctness
+ uint16_t heading_home = (naviData.HomePositionDeviation.Bearing + 360 - naviData.CompassHeading) % 360;
+ //write_char_xy(21, top_line + 1, arrowdir[heading_conv(heading_home)]);
+ // finer resolution, 0xa0 is first character and we add the index 0 <= index < 16
+ write_char_xy(21, top_line + 1, 0xa0 + heading_fine_conv(heading_home));
+
+ write_ndigit_number_u(24, top_line + 1, naviData.HomePositionDeviation.Distance / 10, 3, 0);
+
+ // center
+ if (naviData.FCFlags & FLAG_MOTOR_RUN) { // should be engines running
+ if (!(old_MKFlags & FLAG_MOTOR_RUN)) { // motors just started, clear middle
+ clear();
+ // remember current heigth for gps offset
+ altimeter_offset = naviData.CurrentPosition.Altitude / 1000;
+ // set wasted counter to current offset
+ if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
+ wasted_ampere_offset = ampere_wasted / 10;
+ } else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
+ wasted_ampere_offset = naviData.UsedCapacity;
+ }
+ // update flags to paint display again if needed
+ COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
+ }
+ if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
+ if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
+ draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
+ } else {
+ draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
+ }
+ }
+ // motors are on, assume we were/are flying
+ COSD_FLAGS_RUNTIME |= COSD_WASFLYING;
+ } else {
+ // stats
+ if ((COSD_FLAGS_RUNTIME & COSD_WASFLYING) && (COSD_FLAGS_MODES & COSD_FLAG_STATS)) {
+ uint8_t line = 3;
+ write_ascii_string_pgm(1, line, (const char *) (pgm_read_word(&(stats_item_pointers[0])))); // max Altitude
+ write_ndigit_number_s(16, line, max_Altimeter, 4, 0);
+ write_char_xy(20, line, 204); // small meters m
+ write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[1])))); // max Speed
+ write_ndigit_number_u(17, line, (uint16_t) (((uint32_t) max_GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
+ write_char_xy(20, line, 203); // km/h
+ write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[2])))); // max Distance
+ write_ndigit_number_u(17, line, max_Distance / 10, 3, 0);
+ write_char_xy(20, line, 204); // small meters m
+ write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[3])))); // min voltage
+ write_ndigit_number_u_10th(16, line, min_UBat, 3, 0);
+ write_char_xy(20, line, 0x9E); // small V
+ if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) || (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
+ write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[7])))); // ampere
+ write_ndigit_number_u_10th(16, line, max_ampere / 10, 3, 0);
+ write_char_xy(20, line, 0x9F); // small A
+
+ // wasted mampere in this flight (will count up after landing)
+ if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
+ write_ndigit_number_u(21, line, (ampere_wasted / 10) - wasted_ampere_offset, 5, 0);
+ } else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
+
+ write_ndigit_number_u(21, line, naviData.UsedCapacity - wasted_ampere_offset, 5, 0);
+ }
+
+ write_char_xy(26, line, 0xB5); // mah
+ }
+ write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[4])))); // max time
+ write_time(14, line, max_FlyingTime);
+ write_char_xy(20, line, 210); // fly clock
+ write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[5])))); // longitude
+ write_gps_pos(14, line, naviData.CurrentPosition.Longitude);
+ write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[6])))); // latitude
+ write_gps_pos(14, line, naviData.CurrentPosition.Latitude);
+ } else if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) { // if no stats there is space horizon
+ if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) || (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
+ draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
+ } else {
+ draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
+ }
+ }
+ }
+ if (COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO) {
+ draw_big_variometer(27, 8, naviData.Variometer);
+ }
+
+ // pre-bottom line
+ if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
+ //write_ndigit_number_s(3, bottom_line - 1, ampere, 4, 0);
+ write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 3, 0);
+ write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
+ if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
+ write_ndigit_number_u_10th(17, bottom_line - 1, s_volt, 3, 0);
+ }
+ } else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
+ write_ndigit_number_u_10th(3, bottom_line - 1, naviData.Current, 3, 0);
+ write_ndigit_number_u(10, bottom_line - 1, naviData.UsedCapacity, 4, 0);
+ }
+
+ //DEBUGwrite_ndigit_number_u(1, 5, COSD_FLAGS_MODES, 3, 0);
+
+ // bottom line
+ draw_battery(2, bottom_line, min_voltage, naviData.UBat, max_voltage);
+ write_ndigit_number_u_10th(3, bottom_line, naviData.UBat, 3, 0);
+ if (naviData.UBat <= min_voltage && last_UBat > min_voltage) {
+ for (uint8_t x = 2; x < 8; x++)
+ write_char_att_xy(x, bottom_line, BLINK);
+ } else if (naviData.UBat > min_voltage && last_UBat < min_voltage) {
+ for (uint8_t x = 2; x < 8; x++)
+ write_char_att_xy(x, bottom_line, 0);
+ }
+
+ write_time(8, bottom_line, uptime);
+ write_time(15, bottom_line, naviData.FlyingTime);
+
+ write_ndigit_number_u(24, bottom_line, naviData.SatsInUse, 2, 0);
+
+ if (naviData.NCFlags & NC_FLAG_MANUAL_CONTROL) {
+ write_char_xy(23, bottom_line, 0xB3); // rc transmitter
+ } else {
+ write_char_xy(23, bottom_line, 0); // clear
+ }
+
+ if (naviData.NCFlags & NC_FLAG_CH) {
+ write_char_xy(27, bottom_line, 231); // gps ch
+ } else if (naviData.NCFlags & NC_FLAG_PH) {
+ write_char_xy(27, bottom_line, 230); // gps ph
+ } else { // (naviData.NCFlags & NC_FLAG_FREE)
+ write_char_xy(27, bottom_line, 201); // sat2 (free)
+ }
+ }
+
+ //write_number_s(8, 5, RxDataLen);
+ //write_number_s(16, 5, setsReceived++);
+
+ // remember statistics (only when engines running)
+ if (naviData.FCFlags & FLAG_MOTOR_RUN) {
+ if (COSD_FLAGS_CONFIG & COSD_FLAG_GPSHEIGHT) {
+ if (naviData.CurrentPosition.Altitude / 1000 - altimeter_offset > max_Altimeter) max_Altimeter = naviData.CurrentPosition.Altitude / 1000;
+ } else {
+ if (naviData.Altimeter / 30 > max_Altimeter) max_Altimeter = naviData.Altimeter / 30;
+ }
+ if (naviData.GroundSpeed > max_GroundSpeed) max_GroundSpeed = naviData.GroundSpeed;
+ if (naviData.HomePositionDeviation.Distance > max_Distance) {
+ max_Distance = naviData.HomePositionDeviation.Distance;
+ }
+ if (naviData.UBat < min_UBat) min_UBat = naviData.UBat;
+ if (naviData.FlyingTime > max_FlyingTime) max_FlyingTime = naviData.FlyingTime;
+ if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
+ if (ampere > max_ampere) max_ampere = ampere;
+ } else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
+ if (naviData.Current * 10 > max_ampere) max_ampere = naviData.Current * 10;
+ }
+ }
+
+ // remember last values
+ last_RC_Quality = naviData.RC_Quality;
+ last_UBat = naviData.UBat;
+ old_MKFlags = naviData.FCFlags;
+ seconds_since_last_data = 0;
+
+ return 0;
+}
+
+#endif
/C-OSD/trunk/C-OSD AGRESSiVA mod/osd_ncmode_default.h
0,0 → 1,21
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
int osd_ncmode_default(void);
/C-OSD/trunk/C-OSD AGRESSiVA mod/osd_ncmode_minimal.c
0,0 → 1,171
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include "main.h"
#include "max7456_software_spi.h"
#include "osd_helpers.h"
#include "osd_ncmode_default.h"
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
int osd_ncmode_minimal() {
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
write_char_xy(4, top_line, 0xCB); // km/h
write_char_xy(15, top_line, 0xCC); // small meters m height
write_char_xy(26, top_line, 0xCC); // small meters m height
write_char_xy(16, top_line, 0xB0); // left circle
write_char_xy(18, top_line, 0xB2); // right circle
write_char_xy(7, bottom_line, 0x9E); // small V
write_char_xy(17, bottom_line, 0xD2); // fly clock
write_char_xy(26, bottom_line, 0xC8); // sat1
write_char_xy(27, bottom_line, 0xC9); // sat2
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
// first line
write_ndigit_number_u(1, top_line, (uint16_t) (((uint32_t) naviData.GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
 
write_ndigit_number_u(12, top_line, naviData.HomePositionDeviation.Distance / 10, 3, 0);
 
uint16_t heading_home = (naviData.HomePositionDeviation.Bearing + 360 - naviData.CompassHeading) % 360;
write_char_xy(17, top_line, 0xa0 + heading_fine_conv(heading_home));
 
if (naviData.Altimeter > 300 || naviData.Altimeter < -300) {
// above 10m only write full meters
write_ndigit_number_s(22, top_line, naviData.Altimeter / 30, 4, 0);
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(22, top_line, naviData.Altimeter / 3, 3, 0);
}
 
draw_variometer(27, top_line, naviData.Variometer);
 
 
// center
if (naviData.FCFlags & FLAG_MOTOR_RUN) { // should be engines running
if (!(old_MKFlags & FLAG_MOTOR_RUN)) { // motors just started, clear middle
clear();
// update flags to paint display again if needed
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
}
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
}
}
// motors are on, assume we were/are flying
COSD_FLAGS_RUNTIME |= COSD_WASFLYING;
} else {
// stats
if ((COSD_FLAGS_RUNTIME & COSD_WASFLYING) && (COSD_FLAGS_MODES & COSD_FLAG_STATS)) {
uint8_t line = 3;
write_ascii_string_pgm(2, line, (const char *) (pgm_read_word(&(stats_item_pointers[0])))); // max Altitude
write_ndigit_number_s(18, line, max_Altimeter / 30, 4, 0);
write_char_xy(22, line, 204); // small meters m
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[1])))); // max Speed
write_ndigit_number_u(19, line, (uint16_t) (((uint32_t) max_GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
write_char_xy(22, line, 203); // km/h
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[2])))); // max Distance
write_ndigit_number_u(19, line, max_Distance / 10, 3, 0);
write_char_xy(22, line, 204); // small meters m
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[3])))); // min voltage
write_ndigit_number_u_10th(18, line, min_UBat, 3, 0);
write_char_xy(22, line, 0x9E); // small V
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[7])))); // ampere
write_ndigit_number_u_10th(18, line, max_ampere / 10, 3, 0);
write_char_xy(22, line, 0x9F); // small A
}
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[4])))); // max time
write_time(16, line, max_FlyingTime);
write_char_xy(22, line, 210); // fly clock
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[5])))); // longitude
write_gps_pos(15, line, naviData.CurrentPosition.Longitude);
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[6])))); // latitude
write_gps_pos(15, line, naviData.CurrentPosition.Latitude);
} else if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) { // if no stats there is space horizon
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
}
}
}
if (COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO) {
draw_big_variometer(27, 8, naviData.Variometer);
}
 
// pre-bottom line
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
//write_ndigit_number_s(3, bottom_line - 1, ampere, 4, 0);
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 3, 0);
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
}
 
// bottom line
draw_battery(2, bottom_line, min_voltage, naviData.UBat, max_voltage);
write_ndigit_number_u_10th(3, bottom_line, naviData.UBat, 3, 0);
if (naviData.UBat <= min_voltage && last_UBat > min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
} else if (naviData.UBat > min_voltage && last_UBat < min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, 0);
}
 
write_time(11, bottom_line, naviData.FlyingTime);
 
write_ndigit_number_u(24, bottom_line, naviData.SatsInUse, 2, 0);
 
if (naviData.NCFlags & NC_FLAG_CH) {
write_char_xy(27, bottom_line, 231); // gps ch
} else if (naviData.NCFlags & NC_FLAG_PH) {
write_char_xy(27, bottom_line, 230); // gps ph
} else { // (naviData.NCFlags & NC_FLAG_FREE)
write_char_xy(27, bottom_line, 201); // sat2 (free)
}
}
 
// remember statistics (only when engines running)
if (naviData.FCFlags & FLAG_MOTOR_RUN) {
if (naviData.Altimeter > max_Altimeter) max_Altimeter = naviData.Altimeter;
if (naviData.GroundSpeed > max_GroundSpeed) max_GroundSpeed = naviData.GroundSpeed;
if (naviData.HomePositionDeviation.Distance > max_Distance) {
max_Distance = naviData.HomePositionDeviation.Distance;
}
if (naviData.UBat < min_UBat) min_UBat = naviData.UBat;
if (naviData.FlyingTime > max_FlyingTime) max_FlyingTime = naviData.FlyingTime;
if (ampere > max_ampere) max_ampere = ampere;
}
 
// remember last values
last_RC_Quality = naviData.RC_Quality;
last_UBat = naviData.UBat;
old_MKFlags = naviData.FCFlags;
seconds_since_last_data = 0;
 
return 0;
}
 
#endif
/C-OSD/trunk/C-OSD AGRESSiVA mod/osd_ncmode_minimal.h
0,0 → 1,21
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
int osd_ncmode_minimal(void);
/C-OSD/trunk/C-OSD AGRESSiVA mod/ppm.c
0,0 → 1,72
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include "ppm.h"
#include "main.h"
#include "max7456_software_spi.h" // clearing
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
volatile uint16_t old_timer1 = 0, ppm = 0;
 
/**
* init ppm, including timer1 for measurement
*/
void ppm_init() {
PORTE |= (1 << PORTE0); // enable pullup on INT0 pin
GICR |= (1<<INT2); // External Interrupt Request 2 Enable
EMCUCR |= (1<<ISC2); // a rising edge on INT2 activates the interrupt
TCCR1B |= (0<<CS12)|(1<<CS10)|(1<<CS11); // timer1 up with prescaler 64
}
 
/**
* Handle INT2 interrupts that occur on changing edges of ppm signal
*/
ISR(INT2_vect) {
// since the pin might get bogus reads we wait for 123 signals
static uint8_t valid_ppm_to_go = 123;
if (EMCUCR & (1<<ISC2)) { // rising
old_timer1 = TCNT1;
EMCUCR &= ~(1<<ISC2); // next one is falling
} else {
if (valid_ppm_to_go) {
valid_ppm_to_go--;
} else {
ppm = TCNT1 - old_timer1;
ppm -= 256;
if (ppm < 128) { // we want HUD
COSD_FLAGS_CONFIG |= COSD_FLAG_HUD;
} else { // we do not want hud
if (COSD_FLAGS_CONFIG & COSD_FLAG_HUD) {
clear();
}
COSD_FLAGS_CONFIG &= ~COSD_FLAG_HUD;
}
}
EMCUCR |= (1<<ISC2); // next one is rising
}
//write_ndigit_number_u(2, 2, ppm, 1000, 0); // debug
//write_ndigit_number_u(2, 3, valid_ppm_to_go, 100, 0); // debug
//write_ndigit_number_u(2, 4, COSD_FLAGS, 100, 0); // debug
}
 
#endif
/C-OSD/trunk/C-OSD AGRESSiVA mod/ppm.h
0,0 → 1,31
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
extern uint8_t COSD_FLAGS, COSD_FLAGS2;
 
/**
* init ppm, including timer1 for measurement
*/
void ppm_init();
 
/**
* Handle INT2 interrupts that occur on changing edges of ppm signal
*/
ISR(INT2_vect);
/C-OSD/trunk/C-OSD AGRESSiVA mod/spi.c
0,0 → 1,103
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include "spi.h"
#include "main.h"
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
volatile uint16_t icnt = 0;
volatile uint8_t request_count = 0;
volatile uint8_t spi_ready = 1;
volatile union SPI_buffer_t SPI_buffer;
int16_t ampere = 0, max_ampere = 0, s_volt;
int32_t ampere_wasted = 0;
 
#define INT0_HIGH PORTD |= (1 << PD2);
#define INT0_LOW PORTD &= ~(1 << PD2);
 
/**
* init the SPI as master
*/
void SpiMasterInit(void) {
volatile char IOReg;
// set PB4(/SS), PB5(MOSI), PB7(SCK) as output
DDRB = (1 << PB4) | (1 << PB5) | (1 << PB7);
PORTB |= (1 << PB4); // pullup SS
// enable SPI Interrupt and SPI in Master Mode with SCK = CK/128
SPCR = (1 << SPIE) | (1 << SPE) | (1 << MSTR) | (1 << SPR0) | (1 << SPR1);
IOReg = SPSR; // clear SPIF bit in SPSR
IOReg = SPDR;
//sei(); // we do it later
}
 
 
/**
* SPI interrupt handler
*/
ISR(SPI_STC_vect) {
if (request_count == 0) {
SPI_buffer.buffer.chk = SPDR; // firs char received is check byte from last transfer
} else {
SPI_buffer.buffer.c[request_count - 1] = SPDR; // safe received byte to buffer
}
request_count++;
if (--icnt) {
//SPDR = *iptr; // send next byte
spi_ready = 1; // we _should_ send later because the slave needs more time
} else {
SPCR &= ~_BV(SPIE); // deactivate interrupt
INT0_HIGH // transfer is done, slave does not need to listen
}
}
 
/**
* check if SPI transfer is still busy
*/
int TransferIsBusy(void) {
return SPCR & _BV(SPIE);
}
 
/**
* start a new transfer with length <len>
*/
void StartTransfer(uint16_t len) {
INT0_LOW // /SS LOW ^= SS HIGH ^= slave should listen
 
// this is a new request
request_count = 0;
 
// set up pointer and length for interrupt handler
icnt = len;
 
SPCR |= _BV(SPIE); // enable spi interrupt
SPDR = 'A'; // start transfer by first command char
}
 
/**
* send next command through spi
*/
void spi_send_next() {
SPDR = 'A' + request_count;
}
 
#endif
/C-OSD/trunk/C-OSD AGRESSiVA mod/spi.h
0,0 → 1,65
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
/*
* structs 'n union for easy SPI transfer
*/
typedef struct {
int16_t ampere;
int32_t mah;
int16_t volt;
} __attribute__((packed)) SPI_strom_data_t;
 
typedef struct {
uint8_t c[10];
uint8_t chk;
} __attribute__((packed)) SPI_char_buffer_t;
 
union SPI_buffer_t {
SPI_strom_data_t data;
SPI_char_buffer_t buffer;
};
 
volatile union SPI_buffer_t SPI_buffer;
 
/**
* SPI interrupt handler
*/
ISR(SPI_STC_vect);
 
/**
* init the SPI as master
*/
void SpiMasterInit(void);
 
/**
* check if SPI transfer is still busy
*/
int TransferIsBusy(void);
 
/**
* start a new transfer with length <len>
*/
void StartTransfer(uint16_t);
 
/**
* send next command through spi
*/
void spi_send_next();
/C-OSD/trunk/C-OSD AGRESSiVA mod/usart1.c
0,0 → 1,279
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "main.h"
#include "usart1.h"
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
volatile uint8_t rxd_buffer_locked = 0;
volatile uint8_t rxd_buffer[RXD_BUFFER_LEN];
volatile uint8_t txd_buffer[TXD_BUFFER_LEN];
volatile uint8_t ReceivedBytes = 0;
volatile uint8_t *pRxData = 0;
volatile uint8_t RxDataLen = 0;
 
/* ##########################################################################
* USART stuff
* ##########################################################################*/
 
/**
* init usart1
*/
void usart1_init() {
UBRR1H = ((F_CPU / (16UL * baud)) - 1) >> 8;
UBRR1L = (F_CPU / (16UL * baud)) - 1;
 
// Enable receiver and transmitter; enable RX interrupt
UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);
 
//asynchronous 8N1
UCSR1C = (1 << URSEL1) | (3 << UCSZ10);
}
 
/**
* disable the txd pin of usart1
*/
void usart1_DisableTXD(void) {
UCSR1B &= ~(1 << TXCIE1); // disable TX-Interrupt
UCSR1B &= ~(1 << TXEN1); // disable TX in USART
DDRB &= ~(1 << DDB3); // set TXD pin as input
PORTB &= ~(1 << PORTB3); // disable pullup on TXD pin
}
 
/**
* enable the txd pin of usart1
*/
void usart1_EnableTXD(void) {
DDRB |= (1 << DDB3); // set TXD pin as output
PORTB &= ~(1 << PORTB3); // disable pullup on TXD pin
UCSR1B |= (1 << TXEN1); // enable TX in USART
UCSR1B |= (1 << TXCIE1); // enable TX-Interrupt
}
 
/**
* send a single <character> through usart1
*/
void usart1_putc(unsigned char character) {
// wait until UDR ready
while (!(UCSR1A & (1 << UDRE1)));
UDR1 = character;
}
 
/**
* send a <string> throught usart1
*/
/*void usart1_puts(char *s) {
while (*s) {
usart1_putc(*s);
s++;
}
}*/
 
 
/**
* send a PGM<string> throught usart1
*/
void usart1_puts_pgm(const char* string) {
while (pgm_read_byte(string) != 0x00)
usart1_putc(pgm_read_byte(string++));
}
 
/**
* transmit interrupt handler
* unused
*/
ISR(SIG_USART1_DATA) {
}
 
/*
* receive data through usart1
* portions taken and adapted from
* http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Fbranches%2FV0.72p+Code+Redesign+killagreg%2Fuart0.c
*/
ISR(SIG_USART1_RECV) {
uint8_t c;
// catch the received byte
c = UDR1;
if (rxd_buffer_locked) return; // if rxd buffer is locked immediately return
static uint16_t crc;
static uint8_t ptr_rxd_buffer = 0;
static uint8_t c1 = 0;
static uint8_t c2 = 0;
static uint8_t usart_rx_ok = 0;
uint8_t crc1, crc2;
// the rxd buffer is unlocked
if (usart_rx_ok == 0) {
// if ((c2 == '#') && (c1 == 'b' || c1 == 'c') && (c == 'D' || c == 'V' || c == 'O')) {
if ((c2 == '#') && (c1 == 'b' || c1 == 'c') &&
#if FCONLY
(c == 'V' || c == 'D')) { // version and debug
#else
(c == 'V' || c == 'O')) { // version and OSD
#endif
usart_rx_ok = 1;
rxd_buffer[ptr_rxd_buffer++] = c2;
crc = c2;
rxd_buffer[ptr_rxd_buffer++] = c1;
crc += c1;
rxd_buffer[ptr_rxd_buffer++] = c;
crc += c;
c2 = 0;
c1 = 0;
LED1_ON
LED2_OFF
} else {
c2 = c1;
c1 = c;
}
} else if (ptr_rxd_buffer < RXD_BUFFER_LEN) { // collect incomming bytes
if (c != '\r') { // no termination character
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
crc += c; // update crc
} else { // termination character was received
// the last 2 bytes are no subject for checksum calculation
// they are the checksum itself
crc -= rxd_buffer[ptr_rxd_buffer - 2];
crc -= rxd_buffer[ptr_rxd_buffer - 1];
// calculate checksum from transmitted data
crc %= 4096;
crc1 = '=' + crc / 64;
crc2 = '=' + crc % 64;
// compare checksum to transmitted checksum bytes
if ((crc1 == rxd_buffer[ptr_rxd_buffer - 2]) && (crc2 == rxd_buffer[ptr_rxd_buffer - 1])) { // checksum valid
rxd_buffer[ptr_rxd_buffer] = '\r'; // set termination character
ReceivedBytes = ptr_rxd_buffer + 1; // store number of received bytes
rxd_buffer_locked = 1; // lock the rxd buffer
LED1_OFF
} else { // checksum invalid
rxd_buffer_locked = 0; // unlock rxd buffer
LED2_ON
}
ptr_rxd_buffer = 0; // reset rxd buffer pointer
usart_rx_ok = 0;
}
} else { // rxd buffer overrun
ptr_rxd_buffer = 0; // reset rxd buffer
rxd_buffer_locked = 0; // unlock rxd buffer
usart_rx_ok = 0;
LED2_ON
}
}
 
/**
* Decode the recevied Buffer
* portions taken and adapted from
* http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.72p%2Fuart.c
*/
void Decode64(void) {
uint8_t a, b, c, d;
uint8_t x, y, z;
uint8_t ptrIn = 3;
uint8_t ptrOut = 3;
uint8_t len = ReceivedBytes - 6;
 
while (len) {
a = rxd_buffer[ptrIn++] - '=';
b = rxd_buffer[ptrIn++] - '=';
c = rxd_buffer[ptrIn++] - '=';
d = rxd_buffer[ptrIn++] - '=';
 
x = (a << 2) | (b >> 4);
y = ((b & 0x0f) << 4) | (c >> 2);
z = ((c & 0x03) << 6) | d;
 
if (len--) rxd_buffer[ptrOut++] = x;
else break;
if (len--) rxd_buffer[ptrOut++] = y;
else break;
if (len--) rxd_buffer[ptrOut++] = z;
else break;
}
pRxData = &rxd_buffer[3];
RxDataLen = ptrOut - 3;
}
 
/**
* request Data through USART in special MK format by adding checksum and
* encode data in modified Base64
* portions taken and adapted from
* http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.72p%2Fuart.c
*/
/*void sendMKData(unsigned char cmd, unsigned char addr, unsigned char *snd, unsigned char len) {
unsigned int pt = 0;
unsigned char a, b, c;
unsigned char ptr = 0;
 
txd_buffer[pt++] = '#'; // Start-Byte
txd_buffer[pt++] = 'a' + addr; // Adress
txd_buffer[pt++] = cmd; // Command
while (len) {
if (len) {
a = snd[ptr++];
len--;
} else a = 0;
if (len) {
b = snd[ptr++];
len--;
} else b = 0;
if (len) {
c = snd[ptr++];
len--;
} else c = 0;
txd_buffer[pt++] = '=' + (a >> 2);
txd_buffer[pt++] = '=' + (((a & 0x03) << 4) | ((b & 0xf0) >> 4));
txd_buffer[pt++] = '=' + (((b & 0x0f) << 2) | ((c & 0xc0) >> 6));
txd_buffer[pt++] = '=' + (c & 0x3f);
}
 
// add crc
unsigned int tmpCRC = 0, i;
for (i = 0; i < pt; i++) {
tmpCRC += txd_buffer[i];
}
tmpCRC %= 4096;
txd_buffer[i++] = '=' + tmpCRC / 64;
txd_buffer[i++] = '=' + tmpCRC % 64;
txd_buffer[i++] = '\r';
 
usart1_puts((char*) txd_buffer);
}*/
 
/**
* short script to directly send a request thorugh usart including en- and disabling it
* where <address> is the address of the receipient, <label> is which data set to request
* and <ms> represents the milliseconds delay between data
*/
/*void usart1_request_mk_data(uint8_t address, char label, uint8_t ms) {
// re-enable TXD pin
usart1_EnableTXD();
 
unsigned char mstenth = ms / 10;
sendMKData(label, address, &mstenth, 1);
// wait until UDR ready
while (!(UCSR1A & (1 << UDRE1)));
// disable TXD pin again
usart1_DisableTXD();
}*/
 
#endif
/C-OSD/trunk/C-OSD AGRESSiVA mod/usart1.h
0,0 → 1,92
/****************************************************************************
* Copyright (C) 2009-2010 by Claas Anders "CaScAdE" Rathje *
* admiralcascade@gmail.com *
* Project-URL: http://www.mylifesucks.de/oss/c-osd/ *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
****************************************************************************/
 
#define baud 57600
 
#define RXD_BUFFER_LEN 150
#define TXD_BUFFER_LEN 20 // not so much needed
 
//#define REQUEST_OSD_DATA "#aoAm==EX\r"
#define REQUEST_OSD_DATA "#bo?]==EG\r"
#define REQUEST_DBG_DATA "#ad?]==D{\r"
#define REQUEST_FC_VERSION "#av====Dk\r"
#define REQUEST_NC_VERSION "#bv====Dl\r"
 
extern volatile uint8_t rxd_buffer_locked;
extern volatile uint8_t rxd_buffer[RXD_BUFFER_LEN];
extern volatile uint8_t txd_buffer[TXD_BUFFER_LEN];
extern volatile uint8_t ReceivedBytes;
extern volatile uint8_t *pRxData;
extern volatile uint8_t RxDataLen;
 
/**
* init usart1
*/
void usart1_init();
 
/**
* disable the txd pin of usart1
*/
void usart1_DisableTXD(void);
 
/**
* enable the txd pin of usart1
*/
void usart1_EnableTXD(void);
 
/**
* send a PGM<string> throught usart1
*/
void usart1_puts_pgm(const char*);
 
/**
* transmit interrupt handler
* unused
*/
ISR(SIG_USART1_DATA);
 
/**
* receive data through usart1
* portions taken and adapted from
* http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Fbranches%2FV0.72p+Code+Redesign+killagreg%2Fuart0.c
*/
ISR(SIG_USART1_RECV);
 
/**
* Decode the recevied Buffer
* portions taken and adapted from
* http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.72p%2Fuart.c
*/
void Decode64(void);
 
/**
* request Data through USART in special MK format by adding checksum and
* encode data in modified Base64
* portions taken and adapted from
* http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Ftags%2FV0.72p%2Fuart.c
*/
//void sendMKData(unsigned char, unsigned char, unsigned char*, unsigned char);
 
/**
* short script to directly send a request thorugh usart including en- and disabling it
* where <address> is the address of the receipient, <label> is which data set to request
* and <ms> represents the milliseconds delay between data
*/
//void usart1_request_mk_data(uint8_t, char, uint8_t);
/C-OSD/trunk/default/C-OSD.e2s
0,0 → 1,11
#------ START --------
#Programming sequence
SELECTDEVICE ATmega8
CLEARBUFFER
LOAD-PROG C-OSD.hex
 
 
#ERASE-ALL
WRITE&VERIFY-ALL
 
 
/C-OSD/trunk/default/C-OSD.eep
0,0 → 1,2
:050000002E17000000B6
:00000001FF
/C-OSD/trunk/default/C-OSD.elf
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/C-OSD/trunk/default/C-OSD.hex
0,0 → 1,934
:100000000C94C6010C94E3010C94E3010C94A30E30
:100010000C94E3010C94E3010C94E3010C94E301D0
:100020000C94E3010C94E3010C94E3010C94E301C0
:100030000C94E3010C94E3010C94E3010C94E301B0
:100040000C94D9020C94E3010C94070E0C94E30178
:100050000C9464030C94E3010C945A030C94E30194
:100060000C94E3010C94E3010C94E3010C94E30180
:100070006D617820416C7469747564653A006D61D6
:10008000782053706565642020203A006D617820E7
:1000900044697374616E63653A006D696E20566FD2
:1000A0006C74616765203A006D61782054696D65F4
:1000B000202020203A006C6F6E676974756465209B
:1000C00020203A006C6174697475646520202020DA
:1000D0003A006D61782063757272656E74203A0023
:1000E00070007E008C009A00A800B600C400D20008
:1000F0004E450045200053450053200053570057FC
:1001000020004E57004E2000F000F300F600F900EA
:10011000FC00FF000201050164656661756C7400F6
:100120006D696E696D616C002020206A6F706C00D3
:100130000C0F1801021520018A181801331A280122
:1001400023626F3F5D3D3D45470D000000C2FFFF4C
:100150000000C2FFC00000C2FFC10000C2FF0000DB
:1001600000C2C0000000C2C1000000C200000000C8
:10017000BB00000000C3000000C4C3000000C5C3F2
:10018000000000FFC30000C4FFC30000C5FFC300A0
:1001900000FFFFC300004B01500155015A015F01F0
:1001A000640169016E01730178017D01820187019B
:1001B0008C019101D8D7D8D3D8D7D8D5D8D7D8D40F
:1001C000D8D7D8D6D8D7D8D3D8D7D8D5D8D7D8D4C1
:1001D000D8D7D8D6D8D7D8D3D8D7D8D5D8D7D8D4B1
:1001E000D8D7D8D650414C20004E545343004C6FC2
:1001F0006164696E6720446174612066726F6D206E
:10020000454550524F4D004E6F2073617665642016
:100210004461746120696E20454550524F4D00EE97
:10022000010702432D4F534420436F6E66696720D8
:100230004D656E7500444F4E452020202020202023
:10024000202020202020200045584954005361766A
:100250006520636F6E666967004241524F00204718
:100260005053004865696768742062790044697377
:10027000706C6179204D6F64650052657365742000
:10028000757074696D6500566F6C74616765206286
:100290007920432D5374726F6D0043757272656ED1
:1002A00074206279204643005374617469737469E1
:1002B00063730042696720566172696F20626172E0
:1002C0000041727420486F72697A6F6E20696E20E7
:1002D0004855440046756C6C204855440056696486
:1002E000656F204D6F6465004F4646004F4E2000FD
:1002F0004E432056455253494F4E3A202E2E2E2E15
:100300002E2E2E2E002362763D3D3D3D446C0D0089
:100310004D617820566F6C74616765202020203A0B
:10032000005761726E20566F6C74616765202020E3
:100330003A004E756D626572206F662043656C6C85
:10034000733A004775657373696E67204E756D6209
:100350006572206F662043656C6C7300444556459A
:100360004C2D4255494C44004E6176694374726C81
:10037000204D6F646500432D4F534420496E6974CE
:1003800069616C69736174696F6E000011241FBE2E
:10039000CFEFD4E0DEBFCDBF11E0A0E0B1E0E8E2F6
:1003A000FAE302C005900D92A231B107D9F712E02D
:1003B000A2E1B1E001C01D92A13AB107E1F70E94AC
:1003C000F0010C94121D0C94E5011F920F920FB6D0
:1003D0000F92112400000F900FBE0F901F901895E0
:1003E00010921C0110921D0189E180931B01D19A8A
:1003F000D99AD29ADA98D39ADB98D59ADD9AA09AAC
:10040000A898A19AA998A29AAA98A39AAB98A498F6
:10041000AC9AA598AD9ADD98DD9AAB9A80E197E207
:1004200020E931E0F9013197F1F70197D9F7AB985D
:1004300080E00E94BD0C80911C0180FFB2C080E072
:1004400068E00E94AF048CE0809303010E9475086D
:100450000E9431030E9439038BE083BF12BE8AEFF2
:1004600081BF89B78D7F89BF89B7816089BF8A9A2B
:100470000E94F50D0E94980E7894AA9A04C080916B
:100480001801882361F58091340190913501892B01
:1004900091F480911001882371F080919501843648
:1004A00009F44CC080911D018E7F80931D0189E06D
:1004B00090E00E94480E80912901882331F08091BC
:1004C000EE018F34B9F0109229010E94580E892B49
:1004D000B1F20E949C0B809118018823A1F20E9426
:1004E0003E0380E491E00E944703109218010E94AD
:1004F0003903C9CF0E943004AAE9B1E080912B01F1
:1005000090912C019C01F90182E501900D9281509E
:10051000E1F7809100018F3FF1F58091D30189329D
:1005200090F28091D301809304018091D301809354
:100530000001809100010E94F10CC5CF80918B01D8
:1005400090918C01909338018093370180918D01B7
:1005500090918E01A0918F01B091900180933B0109
:1005600090933C01A0933D01B0933E018091910195
:10057000909192019093A00280939F0280911D011F
:1005800080FD95CF0E94750880911D018D7F81604F
:1005900080931D018CCFE0910501F0910601099532
:1005A00092CF80E068E40E94AF048EE08093030164
:1005B0004DCF1F920F920FB60F9211242F933F939E
:1005C0004F935F936F937F938F939F93AF93BF935B
:1005D000EF93FF93809114019091150101979093EF
:1005E0001501809314010196A1F48091120190915C
:1005F00013010196909313018093120187EE93E00B
:100600009093150180931401809118018F5F80935E
:10061000180180911001882369F080913401909134
:100620003501892B39F08091280181508093280170
:100630008F5F89F0FF91EF91BF91AF919F918F9163
:100640007F916F915F914F913F912F910F900FBECE
:100650000F901F90189588E0809328010E94530EF8
:10066000E9CF1CBE80E180B988E981B986E88CBFFA
:1006700008950E980B98BB98C3980895BB9AC39899
:100680000B9A0E9A0895159BFECF83B90895AC017D
:100690009A01FA018491882361F04F5F5F4FF9015D
:1006A0008491159BFECF83B99A01FA018491882326
:1006B000A1F708951F920F920FB60F9211240F9079
:1006C0000FBE0F901F9018951F920F920FB60F92AA
:1006D00011242F933F934F935F936F938F939F9327
:1006E000AF93BF93CF93DF93EF93FF9363B1809169
:1006F0002901882371F480912E018823E1F48091EF
:100700002F018332D1F12091300120932F0160938A
:100710003001FF91EF91DF91CF91BF91AF919F9108
:100720008F916F915F914F913F912F910F900FBEDD
:100730000F901F901895309131013639B0F46D301B
:1007400009F450C0E32FF0E0E451FE4F60833F5FB7
:10075000309331018091320190913301860F911DC8
:100760009093330180933201D4CF109231011092D3
:10077000290110922E01A99ACCCF20913001822F0D
:100780008256823010F6663519F06F3409F0BDCF0D
:1007900081E080932E0180913101E82FF0E0E45157
:1007A000FE4F93E290838F5FE82FF0E0E451FE4F1D
:1007B00020838F5FE82FF0E0E451FE4F60838F5F6E
:1007C00080933101862F90E0820F911D8396909344
:1007D00033018093320110922F0110923001A89AB8
:1007E000A99897CFA32FB0E0FD01E651FE4F90816D
:1007F000ED01C551DE4F88814091320150913301A6
:10080000491B5109481B51095F70509333014093B4
:1008100032012081CA010024880F991F001C880F13
:10082000991F001C892F902D835C281741F010928E
:100830002901A99A1092310110922E016ACF988154
:10084000842F8F73835C981791F7A451BE4F6C93DC
:100850003F5F30932A0181E080932901A898EACF75
:1008600050912A01565009F457C033E043E01EC0AE
:10087000972F9D53F0E02295207F892F86958695AE
:10088000282BE451FE4F2083E42FEE5F5230C1F15C
:100890005350F0E09295990F990F907C6D53962BE1
:1008A000E451FE4F90834D5F5523A1F1E32FF0E01B
:1008B000E451FE4F80813F5FE32FF0E0E451FE4FB3
:1008C00020812D533F5FE32FF0E0E451FE4F708114
:1008D0003F5FE32FF0E0E451FE4F60813F5F922FD6
:1008E00092959F708D53880F880F892BE42FF0E02D
:1008F000E451FE4F8083E42FEF5F513009F0B8CF11
:10090000E3508FEE91E090932C0180932B01E093C4
:100910002D010895E42FF4CFE0E0F3CF482F50E00D
:1009200027E030E009C0DA9ADB9ADB9821503040AA
:100930008FEF2F3F380791F0CA01022E02C0959524
:1009400087950A94E2F780FDEECFDA98DB9ADB9880
:10095000215030408FEF2F3F380771F70895D99815
:10096000482F50E027E030E009C0DA9ADB9ADB98A4
:10097000215030408FEF2F3F380791F0CA01022EEF
:1009800002C0959587950A94E2F780FDEECFDA983C
:10099000DB9ADB98215030408FEF2F3F380771F7FB
:1009A00070E027E030E009C0DA9ADB9ADB9821504A
:1009B00030408FEF2F3F380791F0CB01022E02C05D
:1009C000959587950A94E2F780FDEECFDA98DB9A49
:1009D000DB98215030408FEF2F3F380771F7D99ABD
:1009E00008950F931F93182F062F85E0692F0E94FB
:1009F000AF0486E0612F0E94AF0487E0602F0E9461
:100A0000AF041F910F9108959EE1699FB0011124D9
:100A10009B01280F311DC901642F0E94F104089524
:100A20009C01603219F1862F81538930D0F06033F8
:100A300039F1862F81548A31F0F0862F81568A3120
:100A400020F1683231F1693211F16E3221F16D32EB
:100A500021F16B3321F16A3321F16C3219F465E431
:100A600001C06053C9010E94F104089560E0C9010A
:100A70000E94F10408956653C9010E94F10408958B
:100A80006AE0C9010E94F10408956C53EBCF60E461
:100A9000E9CF6FE3E7CF61E4E5CF69E4E3CF63E457
:100AA000E1CF64E4DFCFFF920F931F93CF93DF93E7
:100AB000F82EEA0148814423D9F0262F30E0C901FD
:100AC000880F991F820F931F8C01000F111F000FB9
:100AD000111F080F191F000F111FC8018F0D911D45
:100AE000F394642F0E941005219648814423A9F7AE
:100AF000DF91CF911F910F91FF900895FF920F9377
:100B00001F93CF93DF93F82EEA01FE01849188238F
:100B1000F1F0262F30E0C901880F991F820F931F33
:100B20008C01000F111F000F111F080F191F000F5C
:100B3000111FC8018F0D911DF3942196FA01649144
:100B40000E941005AE01FE018491882391F7DF9188
:100B5000CF911F910F91FF900895DF92EF92FF9236
:100B60000F931F93CF93DF93062FEA01122F2223B7
:100B700091F0E82EFF24FEE1DF2E0D9DC00111242F
:100B80000F5FFE012196E4918E0D9F1D6E2F0E9436
:100B9000F104115091F7DF91CF911F910F91FF90C8
:100BA000EF90DF9008958F929F92AF92BF92CF9275
:100BB000DF92EF92FF920F931F93CF93DF93D82E84
:100BC000862ECA01E901C02E06E912E0B8014AE00A
:100BD00050E00E94CC1CF80101900020E9F78F0141
:100BE0000150104006591240902EA02EBB24CA1965
:100BF000DB091C161D060CF074C08EE1889E700186
:100C00001124D39410E010C09701280F311DC901A1
:100C10006AE00E94F1041F5F2D2D2F5F812F90E06D
:100C20008C179D07A4F4D22E8D2D8150CC2061F716
:100C3000F701E80FF11DCF0160E00E94F1041F5F92
:100C40002D2D2F5F812F90E08C179D0764F3F50108
:100C5000EB56FD4FC0801082F1E09F16D1F122E0EB
:100C6000921619F18D2D682D46E952E00E94530528
:100C7000192D11501D0DC701810F911D61E40E94B6
:100C8000F1041F5FC701810F911D6C2D0E9410059B
:100C9000DF91CF911F910F91FF90EF90DF90CF9058
:100CA000BF90AF909F908F900895809196028D3263
:100CB000C9F60D2D10E0C7010197800F911F69E45F
:100CC0000E94F104C8018E0D9F1D6AE00E94F1048C
:100CD000CFCFC70101978D0D911D6AE00E94F104ED
:100CE000C7CF8EE1889E70011124B1CF8F929F9261
:100CF000AF92BF92CF92DF92EF92FF920F931F932A
:100D0000CF93DF93D82E862ECA01E901C02E06E9C3
:100D100012E0B8014AE050E00E94CC1CF8010190BA
:100D20000020E9F78F010150104006591240902E23
:100D3000A02EBB24CA19DB091C161D060CF074C0BA
:100D40008EE1889E70011124D39410E010C09701A9
:100D5000280F311DC9016AE00E94F1041F5F2D2D8B
:100D60002F5F812F90E08C179D07A4F4D22E8D2D3C
:100D70008150CC2061F7F701E80FF11DCF0160E051
:100D80000E94F1041F5F2D2D2F5F812F90E08C17A3
:100D90009D0764F3F501EB56FD4FC0801082F1E032
:100DA0009F16D1F122E0921619F18D2D682D46E99A
:100DB00052E00E945305192D11501D0DC701810FDE
:100DC000911D61E40E94F1041F5FC701810F911D15
:100DD0006C2D0E941005DF91CF911F910F91FF9014
:100DE000EF90DF90CF90BF90AF909F908F9008953D
:100DF000809196028D32C9F60D2D10E0C701019742
:100E0000800F911F69E40E94F104C8018E0D9F1D9F
:100E10006AE00E94F104CFCFC70101978D0D911DAB
:100E20006AE00E94F104C7CF8EE1889E7001112410
:100E3000B1CFAF92BF92CF92DF92EF92FF920F931A
:100E40001F93CF93DF93B82EA62ECA01122FF32E35
:100E5000A6E9CA2EA2E0DA2EB6014AE050E00E94CE
:100E6000CC1CC12FDF2D8EE1A89E7001112410E053
:100E7000412F4B0DF60101900020E9F7CE018E1BAA
:100E80009F0B212F30E089569D4F2817390790F48A
:100E9000002341F0C701840F911D6AE00E94F10414
:100EA0001F5FE6CFC701840F911D60E00E9410050F
:100EB0001F5FDECF842F6A2D46E952E00E94530562
:100EC000DF91CF911F910F91FF90EF90DF90CF9026
:100ED000BF90AF900895AF92BF92CF92DF92EF9202
:100EE000FF920F931F93CF93DF93B82EA62ECA01C4
:100EF000122FF32EB6E9CB2EB2E0DB2EB6014AE07C
:100F000050E00E94CC1CC12FDF2D8EE1A89E700105
:100F1000112410E0412F4B0DF60101900020E9F75C
:100F2000CE018E1B9F0B212F30E089569D4F281735
:100F3000390790F4002341F0C701840F911D6AE046
:100F40000E94F1041F5FE6CFC701840F911D60E08E
:100F50000E9410051F5FDECF842F6A2D46E952E004
:100F60000E945305DF91CF911F910F91FF90EF9059
:100F7000DF90CF90BF90AF9008957F928F929F9215
:100F8000AF92BF92CF92DF92EF92FF920F931F9397
:100F9000162F69017A0157FD5EC0782E739440E0E8
:100FA0000E940405C701B60120E836E948E950E08F
:100FB0000E94B11C872D612FA90123E030E001E0E0
:100FC0000E946B07872D8D5F612F41E40E9404050D
:100FD000C701B60120E836E948E950E00E94B11C9B
:100FE0006B017C01C701B60128EE33E040E050E020
:100FF0000E94B11C4901872D8C5F612FA90124E05B
:1010000030E00E946B07AA24BB24C501B40128E18B
:101010003CEF4FEF5FEF0E94491CC60ED71EE81E43
:10102000F91E872D885F612FA60123E030E00E9422
:101030006B07872D855F612F40ED0E9404051F918E
:101040000F91FF90EF90DF90CF90BF90AF909F9067
:101050008F907F900895C094D094E094F094089479
:10106000C11CD11CE11CF11C782E739449E40E9430
:10107000040598CFBF92CF92DF92EF92FF920F9329
:101080001F93182FB62E6A01CA016CE370E00E940C
:10109000681C7B01812F6B2DA70123E030E000E06D
:1010A0000E946B07812F8D5F6B2D44E40E94040525
:1010B0008CE390E09C01E29EC001E39E900DF29EC5
:1010C000900D1124C81AD90A812F8C5F6B2DA601AF
:1010D00022E030E001E00E946B071F910F91FF902A
:1010E000EF90DF90CF90BF90089584E064E40E9479
:1010F000AF048AE68A95F1F708950F931F93182F8E
:10110000062F926085E0692F0E94AF0486E0612F70
:101110000E94AF0487E0602F0E94AF041F910F91DF
:1011200008959EE1699FB00111249B01280F311D94
:10113000C901642F0E947D0808959C0148978C97EF
:1011400000F1C901845490408D97E8F0C90181579E
:1011500090408D97E0F0C9018E5990408D97A8F08E
:10116000C9018B5C90408D97A0F0C901885F9040C9
:101170008D9798F0255231402D32310560F087E08F
:10118000089580E0089581E0089583E0089582E065
:10119000089584E0089586E0089585E008959C010F
:1011A000880F991F880F991F880F991F220F331FCF
:1011B000820F931F8F589F4F60E17EE00E94681C52
:1011C00061EE70E00E94681C862F0895AF92BF9276
:1011D000CF92DF92EF92FF920F931F93DF93CF9303
:1011E00000D000D00F92CDB7DEB7A82EC62E8A0150
:1011F000D22EB32E7E010894E11CF11CD701EBE046
:10120000F1E085E001900D928150E1F78FE067E019
:1012100044EE0E940405C80164E170E00E947C1C59
:10122000262F17FD82C08CEE6802C0011124800FAA
:10123000911F97FDA2C09595879595958795909557
:1012400081959F4F182F1C5F67E0621BC61608F040
:1012500080C00C2D8D2D9B2D9C0137FD84C03595B4
:1012600027953595279535952795822F815F823073
:1012700008F47CC0D82E8CE18D1510F46CE1D62ECC
:101280004D2D50E0BD2C20910901822F992787FD1B
:1012900090958417950739F027FD05C0822F6C2D96
:1012A00040E00E94040560910A01262F332727FDA4
:1012B0003095802F90E02817390761F067FD0AC04C
:1012C0008EE040E00E94040580E160910A0140E068
:1012D0000E940405812F153008F084E0E80EF11C0F
:1012E000F70110818EE0602F412F0E94040580E1FC
:1012F000602F412F0E9404058D2D6C2D45EE0E941C
:101300000405B092090100930A010F900F900F900D
:101310000F900F90CF91DF911F910F91FF90EF9061
:10132000DF90CF90BF90AF9008958CEE6802C0011F
:101330001124800F911F97FD22C095958795959553
:101340008795182F1195215067E0621BC61608F487
:1013500080CF062F6A1508F07DCF0A2D8D2D9B2D8D
:101360009C0137FF7CCF295F3F4F79CFE2E0DE2E33
:1013700042E050E072E0B72E86CF03965CCF039632
:10138000DCCF282F362F41155105B1F01416150664
:10139000BCF4CA0165E070E00E947C1C61307105FC
:1013A00011F16230710589F1672B19F5822F632FD6
:1013B00040E70E94040508954BEB0E940405089540
:1013C000CA016BEF7FEF0E947C1C61307105B9F0A0
:1013D0006230710531F1672BF1F4822F632F47E7FB
:1013E0000E9404050895822F632F41E70E9404059F
:1013F0000895822F632F43E70E9404050895822FEA
:10140000632F46E70E9404050895822F632F42E769
:101410000E9404050895822F632F44E70E9404056B
:101420000895822F632F45E70E94040508950F93C6
:10143000E82FF62F241738F44DE98E2F6F2F0E94D6
:1014400004050F910895842F90E030E0281B390B9C
:10145000602F70E0681B790B84E690E0AC01249F5C
:10146000C001259F900D349F900D11240E947C1C7B
:10147000653608F064E6862F90E09C01220F331F4A
:10148000280F391F220F331F220F331F280F391F38
:10149000C9016CE97FEF0E947C1C462F43568E2FBA
:1014A0006F2F0E9404050F910895EF92FF920F9302
:1014B0001F93CF93DF93282F062FCA0166E170E0B8
:1014C0000E94681C6D5E70E0EB01C055DE4F55E078
:1014D000E52EF12CE60EF71E84EB91E0E80EF91EE6
:1014E000122F1F5FFE014491822F602F0E9404057E
:1014F0002196212FCE15DF0599F7DF91CF911F910E
:101500000F91FF90EF900895495F5F4F57FD11C015
:101510004F30510514F04EE050E0FA01EE0FFF1F7E
:10152000EA56FE4F45915491625025E00E94AD0568
:10153000089540E050E0ECCF982F662339F487E11E
:10154000692F48EE52E00E947E05089587E1692FD9
:101550004CEE52E00E947E050895FF920F931F9378
:10156000282F90E00B966CE070E00E947C1C92E0CB
:10157000F92EF80E022F0E5F12E0812F6F2D40E042
:101580000E949108812F602F4FEA0E9491081F5FEF
:101590001C3199F784E062E04DED52E00E947E0537
:1015A00080911C0180FF85C087E162E049EE51E037
:1015B0000E947E0584E063E044ED52E00E947E05D7
:1015C00060911B01617083E00E949C0A84E064E0EA
:1015D00041EC52E00E947E0560911B01627084E044
:1015E0000E949C0A84E065E043EB52E00E947E0585
:1015F00060911B01647085E00E949C0A84E066E0B3
:1016000048EA52E00E947E0560911B01687086E006
:101610000E949C0A84E067E04AE952E00E947E054D
:1016200060911B01607487E00E949C0A84E068E07E
:1016300047E852E00E947E0560911B01607288E0DD
:101640000E949C0A84E069E04AE752E00E947E051D
:1016500084E06AE04DE652E00E947E05E0919D0242
:10166000F0919E0232964591549182E16AE00E9487
:101670007E0584E06BE043E652E00E947E058091A7
:101680001C0181FD1DC084E16BE049E552E00E9430
:101690007E0584E06CE04DE452E00E947E0584E02B
:1016A0006DE048E452E00E947E051F910F91FF908B
:1016B000089587E162E044EE51E00E947E057ACF12
:1016C00084E16BE04EE552E00E947E05E2CF1F937D
:1016D000182F682F6E5F84E045E352E00E947E057C
:1016E00028E833E140E951E0CA010197F1F72150C0
:1016F0003040D1F7812F0E94AD0A1F91089580E0FC
:1017000090E06EE20E94F51C81E090E067E10E94AB
:10171000F51C82E090E060911B010E94F51C83E0C3
:1017200090E060911C010E94F51C84E090E06091C3
:101730001E010E94F51C0895AF92BF92CF92DF92D6
:10174000EF92FF920F931F93CF93DF93F8940E9431
:10175000750886E061E043E252E00E947E0524ECD9
:1017600039E040E951E0CA010197F1F721503040DA
:10177000D1F780E00E94AD0A10E0C0E9D1E000E4BA
:10178000FF24F39472E0E72E60E2D62E54E0C52EDB
:101790004EE0B42E3CE0A32E0E94790E892BB1F0CE
:1017A000812F90E001966CE070E00E947C1C182F65
:1017B0000E94AD0A28E833E1CE010197F1F72150EC
:1017C0003040D1F70E94790E892B51F70E94580EB4
:1017D000892B11F3153009F4BFC0163058F51230BB
:1017E00009F4B0C0133008F441C0133009F462C0EA
:1017F000143009F454C041E024EC39E0CE010197E3
:10180000F1F721503040D1F7442309F0C5CF0E94B1
:10181000750880911D018D7F80931D017894DF9163
:10182000CF911F910F91FF90EF90DF90CF90BF90DD
:10183000AF900895183009F463C0193048F01A3099
:1018400009F47AC01A3008F11B30A9F640E0D4CF71
:10185000163009F44BC0173071F610921301109234
:10186000120187E00E94670B41E0C6CF112361F1AE
:10187000113009F0C0CF80911B01812780931B019B
:1018800081E00E94AD0A41E0B7CF80911C018E2516
:1018900080931C0189E00E94AD0A41E0ADCF8091A8
:1018A0001B0198E0892780931B0184E00E94AD0A08
:1018B00041E0A2CF80911B018C2580931B0183E026
:1018C0000E94AD0A41E098CF80911C018F25809342
:1018D0001C0180FD4BC080E068E40E94AF04B09220
:1018E000030180E00E94AD0A41E086CF80911B0198
:1018F0008D2580931B0186E00E94AD0A41E07CCFDC
:10190000E0911E01EF5FE170E0931E01F0E0EE0F49
:10191000FF1FEE0FFF1FE05DFE4FF0939E02E0936E
:101920009D0285919491909306018093050188E032
:101930000E94AD0A41E060CF0E947F0B8AE00E94C6
:10194000670B59CF80911B01812780931B0182E097
:101950000E94AD0A41E050CF80911B018027809307
:101960001B0185E00E94AD0A41E046CF80E068E0BF
:101970000E94AF04A0920301B4CF1F93182F80E000
:1019800090E00E94ED1C8E3251F0112331F082E084
:1019900069E047E052E00E947E051F91089581E0D2
:1019A00090E00E94ED1C873181F7112399F482E0C9
:1019B00090E00E94ED1C80931B0183E090E00E9468
:1019C000ED1C80931C0184E090E00E94ED1C80934C
:1019D0001E01E3CF82E069E04EEE51E00E947E05F9
:1019E000E6CFFF920F931F93DF93CF93CDB7DEB770
:1019F0002A970FB6F894DEBF0FBECDBF182F0E94F6
:101A0000750882E061E046E753E00E947E0582E0CF
:101A100062E048E653E00E947E0582E063E04CE528
:101A200053E00E947E0582E064E043E453E00E94BC
:101A30007E05612F70E000E00F5F402F50E0CA018B
:101A4000880F991F880F991F9C01220F331F220FA7
:101A5000331F220F331F280F391F240F351FC901D1
:101A600047968617970744F3440F551F42955295A2
:101A7000507F5427407F54274093190120931A0127
:101A800082E065E042E353E00E947E0585E165E087
:101A9000402F50E021E030E000E00E946B0782E040
:101AA00066E041E253E00E947E054091190184E125
:101AB00066E050E023E030E00E94D30582E067E07A
:101AC00040E153E00E947E0540911A0184E167E005
:101AD00050E023E030E00E94D30581E00E94BD0C7D
:101AE00080911C0180FF7AC087E162E049EE51E0FD
:101AF0000E947E05109229010E943E0385E093E03A
:101B00000E94470382E06BE040EF52E00E947E05B6
:101B10000E94390380912901882329F400008091D3
:101B200029018823D9F30E943004DE0111968091A7
:101B30002B0190912C019C01F9018AE001900D92FA
:101B40008150E1F7FA801D8149818EE06BE050E021
:101B500023E030E001E00E946B0782E16BE04F2D53
:101B600050E023E030E00E946B071F5980E691E0CF
:101B7000612F0E941005E0911E01E170E0931E01AB
:101B8000F0E0EE0FFF1FEE0FFF1FE05DFE4FF09342
:101B90009E02E0939D02859194919093060180931B
:101BA000050120E335E740E951E0CA010197F1F76B
:101BB00021503040D1F70E94750880911D018D7F22
:101BC00080931D012A960FB6F894DEBF0FBECDBFDD
:101BD000CF91DF911F910F91FF90089587E162E00F
:101BE00044EE51E00E947E0585CFDF93CF930F92A4
:101BF000CDB7DEB780EB87BBC49A83ED8DB98EB1CC
:101C000089838FB189830F90CF91DF9108951F92BF
:101C10000F920FB60F9211248F939F93EF93FF9320
:101C200080913601882311F58FB1809395018091C1
:101C300036018F5F80933601809134019091350198
:101C400001979093350180933401809134019091F4
:101C50003501892B99F46F98929AFF91EF919F919A
:101C60008F910F900FBE0F901F901895E091360145
:101C7000F0E08FB1E657FE4F8083D9CF81E08093AB
:101C80001001EBCF2DB130E020783070C9010895FC
:101C900092981092360190933501809334016F9A97
:101CA00081E48FB90895809136018F5B8FB90895D3
:101CB0009D9B04C020E030E0C90108952AEF30E088
:101CC00040E951E0CA010197F1F721503040D1F7C6
:101CD00083B3282F30E036952795329522952F70C3
:101CE00023273F7023272095309521703070C9013C
:101CF00008959C9B04C020E030E0C90108952AEFBC
:101D000030E040E951E0CA010197F1F7215030403D
:101D1000D1F783B3282F30E0329522952F702327F7
:101D20003F7023272095309521703070C9010895A8
:101D3000389A8BB780628BBF86B7816086BF8EB5BD
:101D400083608EBD08951F920F920FB60F921124DB
:101D50002F933F934F935F936F937F938F939F93B3
:101D6000AF93BF93EF93FF9306B600FC40C0809102
:101D700011018823B9F081508093110186B78160E9
:101D800086BFFF91EF91BF91AF919F918F917F910E
:101D90006F915F914F913F912F910F900FBE0F90D8
:101DA0001F9018958CB59DB520913F013091400151
:101DB000821B930B909342018093410180914101DA
:101DC0009091420180509140909342018093410153
:101DD00080914101909142018038910590F080916D
:101DE0001C0180FD14C08E7F80931C01C7CF8CB571
:101DF0009DB59093400180933F0186B78E7F86BF4B
:101E0000C0CF80911C01816080931C01B7CF0E94DC
:101E1000750880911C01E7CFEF92FF920F931F93FB
:101E2000CF93DF9380911B0180FFE5C180911D015D
:101E300081FFF4C22091D4013091D50140E050E0FF
:101E4000CA01B901660F771F881F991F660F771F98
:101E5000881F991F660F771F881F991F620F731FB6
:101E6000841F951F2AEF30E040E050E00E948F1C55
:101E700082E060910201A90123E030E000E00E94CD
:101E80006B074091DC0187E06091020150E023E0A4
:101E900030E00E946B078091DC01853608F469C24E
:101EA0008091DC01853608F0A9C28091DE0184FFB3
:101EB00073C28BE06091020140E00E9404054091F2
:101EC000D8015091D9018DE06091020123E030E00A
:101ED00000E00E946B07109102018091D80190915F
:101EE000D9010E949D08E82FF0E0EE0FFF1FE85F88
:101EF000FE4F4591549181E1612F0E947E054091F2
:101F0000CF015091D00185E1609102010E94C10989
:101F100080911C0181FF52C06091A3017091A401C6
:101F20008091A5019091A601C0919801D09199014D
:101F30007E010027F7FC0095102F28EE33E040E0EB
:101F400050E00E94B11C2E193F09400B510B2B3061
:101F5000310541055105C4F46091A3017091A401BC
:101F60008091A5019091A60128EE33E040E050E079
:101F70000E94B11C2E193F09400B510B265F3F4FA9
:101F80004F4F5F4F0CF083C46091A3017091A40187
:101F90008091A5019091A60128EE33E040E050E049
:101FA0000E94B11C2C1B3D0B87E160910201A9012D
:101FB00024E030E000E00E94190720C08091CD01AC
:101FC0009091CE018D52914044F48091CD01909139
:101FD000CE01845D9E4F0CF082C48091CD01909122
:101FE000CE016EE170E00E947C1CAB0187E1609144
:101FF000020124E030E000E00E9419074091D8017E
:102000005091D901609102016F5F8BE00E94550AE7
:102010008091C8019091C9012091D8013091D901D6
:10202000109102011F5F88599E4F821B930B68E637
:1020300071E00E947C1C0E94CF08482F405685E129
:10204000612F0E9404058091C6019091C7012091E3
:1020500002012F5F6AE070E00E94681CAB0188E11A
:10206000622F23E030E000E00E946B078091DD01E9
:1020700080FF84C28091270180FF91C310911B01D2
:1020800000911D0111FF18C000FFF7C34091DA0154
:102090002091DB018091020160910301625055277C
:1020A00047FD5095332727FD30958E5F0E94E60847
:1020B00010911B0100911D01046000931D0112FD90
:1020C0007FC280911D0180FF56C216FF9AC34091C6
:1020D000E8015091E90160910301615083E023E040
:1020E00030E000E00E9476064091EA015091EB0159
:1020F0006091030161508AE024E030E00E946B07A8
:102100002091D30182E06091030140911901009177
:102110001A010E94170A4091D30183E060910301E4
:1021200050E023E030E000E00E9476068091D30189
:1021300090911901981708F4EFC180910001981748
:1021400008F0EAC182E0609103014FE40E94910827
:1021500083E0609103014FE40E94910884E0609164
:1021600003014FE40E94910885E0609103014FE470
:102170000E94910886E0609103014FE40E9491085B
:1021800087E0609103014FE40E94910840911201A1
:102190005091130188E0609103010E943A08409138
:1021A000D1015091D2018FE0609103010E943A0861
:1021B0004091CC0188E16091030150E022E030E0E1
:1021C00000E00E946B078091DE0186FF04C287E178
:1021D0006091030143EB0E9404058091DE0182FDC2
:1021E00004C28091DE0181FF07C28BE1609103018F
:1021F00046EE0E9404058091DD0180FF86C080913B
:102200001C0181FF99C06091A3017091A40180918C
:10221000A5019091A60128EE33E040E050E00E9435
:10222000B11C8091980190919901AA2797FDA095E2
:10223000BA2F281B390B4A0B5B0B80911F01909121
:102240002001AA2797FDA095BA2F82179307A4070C
:10225000B5070CF44EC12091D4013091D501809185
:102260002101909122018217930740F48091D401BB
:102270009091D50190932201809321012091C60174
:102280003091C70180912301909124018217930717
:1022900040F48091C6019091C701909324018093EE
:1022A00023019091D30180910401981720F480912B
:1022B000D301809304012091D1013091D20180910A
:1022C0002501909126018217930740F48091D10156
:1022D0009091D201909326018093250180911D0158
:1022E00080FF61C080911B0186FD61C02091370194
:1022F000309138018091390190913A01821793070A
:1023000024F430933A01209339018091DC018093C9
:1023100001018091D301809300018091DD018093C0
:1023200027011092180180E090E0DF91CF911F917A
:102330000F91FF90EF9008958091CD019091CE0183
:102340006EE170E00E947C1C80911F019091200141
:10235000861797070CF07FCF8091CD019091CE0129
:102360006EE170E00E947C1C7093200160931F015D
:1023700072CF80910101853608F492CD17E0812F4C
:10238000609102014FE40E9491081F5F1B30B9F772
:102390008091DE0184FD8DCD8BE06091020146ECE1
:1023A0000E9404058CCD80911B0186FFAECF8091E9
:1023B000E8019091E9019C01220F331F220F331F86
:1023C000220F331F880F991F280F391F8091390161
:1023D00090913A018217930708F097CF8091E80116
:1023E0009091E9019C01220F331F220F331F220F0E
:1023F000331F880F991F280F391F83CF8091010148
:10240000853608F052CD17E0812F6091020140E03F
:102410000E9491081F5F1B30B9F747CD85E060919E
:1024200002014BEC0E9404058AE0609102014AEC33
:102430000E94040580E16091020140ED0E940405C4
:102440008BE1609102014CEC0E9404056091020155
:102450006F5F84E140EB0E940405609102016F5FB1
:1024600086E142EB0E940405609102016F5F8BE1FF
:102470004CEC0E94040587E0609103014EE90E9444
:10248000040580911D0180FD04C080911B0186FF21
:1024900012C060910301615087E04FE90E9404057A
:1024A0006091030161508EE045EB0E94040580912C
:1024B0001B0185FD33C28EE06091030141ED0E9456
:1024C000040585E16091030142ED0E9404058AE163
:1024D0006091030148EC0E9404058BE160910301C7
:1024E00049EC0E94040580911D01826080931D01CA
:1024F000A1CC6091A3017091A4018091A50190915C
:10250000A60128EE33E040E050E00E94B11C309379
:10251000200120931F019FCE8091D301981708F0CE
:1025200035CE80910001891708F030CE82E06091AD
:10253000030140E00E94910883E06091030140E0C4
:102540000E94910884E06091030140E00E9491089C
:1025500085E06091030140E00E94910886E060916F
:10256000030140E00E94910887E06091030140E090
:102570000E9491080BCE16FFC3CDA9CD80911D01FD
:1025800082FD41C010911B0111FF99CD80FD02C059
:1025900016FF0CC24091DA012091DB01809102010B
:1025A000609103016250552747FD5095332727FD61
:1025B00030958E5F0E94E60810911B0112FF81CDBD
:1025C0004091CF015091D0018BE168E00E94840AD4
:1025D00010911B0176CD87E16091030140E00E94DC
:1025E00004058091DE0182FFFCCD8BE16091030147
:1025F00047EE0E940405FFCD8BE16091030149EC99
:102600000E940405F8CD10911B0113FFBDCFE0EE31
:10261000F0E04591549181E063E00E947E05409195
:102620001F015091200180E163E024E030E000E0F0
:102630000E94190784E163E04CEC0E940405E2EE7D
:10264000F0E04591549181E064E00E947E05209184
:1026500021013091220140E050E0CA01B901660F2A
:10266000771F881F991F660F771F881F991F660F96
:10267000771F881F991F620F731F841F951F2AEFF2
:1026800030E040E050E00E948F1C81E164E0A9014D
:1026900023E030E00E946B0784E164E04BEC0E9491
:1026A0000405E4EEF0E04591549181E065E00E947C
:1026B0007E0580912301909124016AE070E00E94E0
:1026C0007C1CAB0181E165E023E030E00E946B07F8
:1026D00084E165E04CEC0E940405E6EEF0E04591F3
:1026E000549181E066E00E947E054091040180E102
:1026F00066E050E023E030E00E94760684E166E088
:102700004EE90E94040580911D0180FD0FC180915A
:102710001B0186FD0BC117E008E0F9E0FF2EE8EE93
:10272000F0E04591549181E0612F0E947E05409137
:102730002501509126018EE0612F0E943A0884E124
:10274000612F42ED0E940405EAEEF0E045915491BC
:1027500081E0602F0E947E0520919B0130919C01B9
:1027600040919D0150919E018EE0602F0E94BD0717
:10277000ECEEF0E04591549181E06F2D0E947E05D2
:1027800020919F013091A0014091A1015091A2019F
:102790008EE06F2D0E94BD0710911B0190CC0E940E
:1027A00075086091A3017091A4018091A501909199
:1027B000A60128EE33E040E050E00E94B11C3093C7
:1027C00099012093980100911D0100FF9AC010917A
:1027D0001B0116FD9AC060913B0170913C018091F4
:1027E0003D0190913E012AE030E040E050E00E943F
:1027F000B11C30934801209347010D7F00931D01C8
:1028000041CC2091030121508091370190913801F2
:102810006AE070E00E947C1CAB0183E0622F23E041
:1028200030E000E00E9476061091030111506091A3
:102830003B0170913C0180913D0190913E012AE065
:1028400030E040E050E00E94B11C8AE0612FA90115
:1028500024E030E00E94190780911B0185FF50CCD5
:1028600060910301615040919F025091A00281E16B
:1028700023E030E00E94760643CC4091DA012091BB
:10288000DB018091020160910301615008CC6091ED
:10289000A3017091A4018091A5019091A6018E01E0
:1028A000000F111F000F111F000F111FCC0FDD1F94
:1028B0000C0F1D1F109501951F4F24E630E040E0DE
:1028C00050E00E94B11C020F131F87E160910201CA
:1028D000A80123E030E000E00E94D3058FCB809177
:1028E000CD019091CE0163E070E00E947C1CAB01B1
:1028F00087E16091020123E030E000E00E94D3050F
:102900007DCB10911B0116FF78CF8091EA01909149
:10291000EB0190934801809347016FCF60910301D1
:10292000615085E14EE90E940405C5CDEEEEF0E070
:102930004591549181E067E00E947E0580913901C4
:1029400090913A016AE070E00E947C1CAB0180E14A
:1029500067E023E030E000E00E94760684E167E073
:102960004FE90E94040580911D0180FF29C08091DC
:102970001B0186FF2AC04091EA015091EB01809132
:10298000470190914801481B590B85E167E025E01C
:1029900030E000E00E946B078AE167E045EB0E94AF
:1029A000040518E009E0EAE0FE2EB9CE4091DA0114
:1029B0002091DB0180910201609103016150F3CD10
:1029C00080911B0186FFE8CFD6CF0091470110917F
:1029D000480160913B0170913C0180913D019091D3
:1029E0003E012AE030E040E050E00E94B11C201B94
:1029F000310B85E167E0A90125E030E000E00E94AD
:102A00006B07CACFFF920F931F9380911B0180FF2A
:102A100015C180911D0181FFE8C12091D401309141
:102A2000D50140E050E0CA01B901660F771F881F49
:102A3000991F660F771F881F991F660F771F881FC2
:102A4000991F620F731F841F951F2AEF30E040E02B
:102A500050E00E948F1C81E060910201A90123E0F7
:102A600030E000E00E946B078091C6019091C701A1
:102A70006AE070E00E94681CAB018CE0609102018A
:102A800023E030E00E946B078091C8019091C9015A
:102A90002091D8013091D9011091020188599E4F9F
:102AA000821B930B68E671E00E947C1C0E94CF0899
:102AB000482F405681E1612F0E9404058091CD018D
:102AC0009091CE018D52914044F48091CD0190912E
:102AD000CE01845D9E4F0CF00CC28091CD0190918F
:102AE000CE016EE170E00E947C1CAB0186E160913A
:102AF000020124E030E000E00E9419074091CF017C
:102B00005091D0018BE1609102010E94C109809136
:102B1000DD0180FF10C18091270180FFA5C1809158
:102B20001D0190911B0191FF18C080FFF4C14091DD
:102B3000DA012091DB018091020160910301625072
:102B4000552747FD5095332727FD30958E5F0E940E
:102B5000E60890911B0180911D01846080931D0106
:102B600092FD0BC180911D0180FD13C12091D30105
:102B700082E0609103014091190100911A010E94C5
:102B8000170A4091D30183E06091030150E023E0F4
:102B900030E000E00E9476068091D3019091190107
:102BA000981708F469C180910001981708F064C172
:102BB00082E0609103014FE40E94910883E06091FC
:102BC00003014FE40E94910884E0609103014FE407
:102BD0000E94910885E0609103014FE40E949108F2
:102BE00086E0609103014FE40E94910887E06091C4
:102BF00003014FE40E9491084091D1015091D2010C
:102C00008BE0609103010E943A084091CC0188E179
:102C10006091030150E022E030E000E00E946B0789
:102C20008091DE0182FD5EC18091DE0181FF53C192
:102C30008BE16091030146EE0E9404058091DD0165
:102C400080FF65C02091CD013091CE0180911F01A0
:102C5000909120018217930744F48091CD019091C7
:102C6000CE019093200180931F012091D4013091D7
:102C7000D50180912101909122018217930740F4A0
:102C80008091D4019091D5019093220180932101EC
:102C90002091C6013091C7018091230190912401B8
:102CA0008217930740F48091C6019091C7019093D9
:102CB0002401809323019091D301809104019817FE
:102CC00020F48091D301809304012091D1013091AF
:102CD000D20180912501909126018217930740F43B
:102CE0008091D1019091D20190932601809325018A
:102CF00020913701309138018091390190913A014A
:102D00008217930724F430933A012093390180917C
:102D1000DC01809301018091D301809300018091B7
:102D2000DD01809327011092180180E090E01F914F
:102D30000F91FF90089580911D0182FF92C09091A4
:102D40001B0193FDFCC091FF0BCF80FFEEC04091B3
:102D5000DA012091DB018091020160910301625050
:102D6000552747FD5095332727FD30958E5F0E94EC
:102D7000E60890911B0192FFF5CE4091CF01509152
:102D8000D0018BE168E00E94840A80911D0180FFE0
:102D9000EDCE2091030121508091370190913801AF
:102DA0006AE070E00E947C1CAB0183E0622F23E0AC
:102DB00030E000E00E94760610910301115060910E
:102DC0003B0170913C0180913D0190913E012AE0D0
:102DD00030E040E050E00E94B11C8AE0612FA90180
:102DE00024E030E00E941907C1CE84E06091020126
:102DF0004BEC0E9404058FE0609102014CEC0E94B4
:102E000004058AE1609102014CEC0E94040580E116
:102E10006091020140EB0E94040582E16091020191
:102E200042EB0E94040587E0609103014EE90E9495
:102E3000040581E16091030142ED0E9404058AE1ED
:102E40006091030148EC0E9404058BE1609103014D
:102E500049EC0E94040580911D01826080931D0150
:102E6000DCCD90911B016FCF0E94750880911D01F0
:102E70008D7F80931D0155CE8091D301981708F066
:102E8000BBCE80910001891708F0B6CE82E0609138
:102E9000030140E00E94910883E06091030140E05B
:102EA0000E94910884E06091030140E00E94910833
:102EB00085E06091030140E00E94910886E0609106
:102EC000030140E00E94910887E06091030140E027
:102ED0000E94910891CE8BE16091030149EC0E9420
:102EE0000405ACCE8BE16091030147EE0E9404051E
:102EF000A5CE8091CD019091CE0163E070E00E945B
:102F00007C1CAB0186E16091020123E030E000E02F
:102F10000E94D305F3CD4091DA012091DB0180912D
:102F200002016091030161500BCE4091DA012091C2
:102F3000DB018091020160910301615011CFE0EE4D
:102F4000F0E04591549182E063E00E947E0580911B
:102F50001F01909120016EE170E00E947C1CAB018A
:102F600082E163E024E030E000E00E94190786E19E
:102F700063E04CEC0E940405E2EEF0E045915491D0
:102F800082E064E00E947E052091210130912201BF
:102F900040E050E0CA01B901660F771F881F991FF2
:102FA000660F771F881F991F660F771F881F991F4D
:102FB000620F731F841F951F2AEF30E040E050E03E
:102FC0000E948F1C83E164E0A90123E030E00E94AD
:102FD0006B0786E164E04BEC0E940405E4EEF0E050
:102FE0004591549182E065E00E947E058091230125
:102FF000909124016AE070E00E947C1CAB0183E1A7
:1030000065E023E030E00E946B0786E165E04CEC70
:103010000E940405E6EEF0E04591549182E066E0FE
:103020000E947E054091040182E166E050E023E0C9
:1030300030E00E94760686E166E04EE90E940405D3
:1030400080911D0180FD44C017E008E099E0F92E51
:10305000E8EEF0E04591549182E0612F0E947E05F8
:10306000409125015091260180E1612F0E943A088C
:1030700086E1612F42ED0E940405EAEEF0E0459101
:10308000549182E0602F0E947E0520919B01309137
:103090009C0140919D0150919E018FE0602F0E9404
:1030A000BD07ECEEF0E04591549182E06F2D0E9457
:1030B0007E0520919F013091A0014091A101509186
:1030C000A2018FE06F2D0E94BD0790911B0148CD9A
:1030D000EEEEF0E04591549182E067E00E947E05BB
:1030E0008091390190913A016AE070E00E947C1C65
:1030F000AB0182E167E023E030E000E00E94760669
:1031000086E167E04FE90E94040518E009E08AE0E3
:10311000F82E9ECF0F931F9380911B0180FFB7C0A5
:1031200080911D0181FFD6C040915F0150916001E7
:1031300087E06091020123E030E000E00E946B072D
:1031400080915F01909160018536910508F4B2C0CD
:1031500080915F01909160018536910528F0809102
:103160000101853608F4F5C0809155019091560112
:103170008D52914040F48091550190915601845DAB
:103180009E4F08F041C180915501909156016EE12A
:1031900070E00E94681CAB0187E16091020124E0AD
:1031A00030E000E00E94190720915501309156014E
:1031B00080911F01909120018217930740F4809124
:1031C0005501909156019093200180931F018091A9
:1031D0001B0181FDC9C080911D0180FDD9C02091D6
:1031E0005D0130915E0182E060910301409119011F
:1031F00000911A010E94170A40915D0150915E01F1
:1032000083E06091030123E030E000E00E94760655
:1032100080915D0190915E0140911901242F30E071
:103220002817390728F080910001481708F46CC06E
:1032300080915D0190915E012817390740F58091DA
:103240000001841720F582E06091030140E00E94B4
:10325000910883E06091030140E00E94910884E0BE
:103260006091030140E00E94910885E060910301B4
:1032700040E00E94910886E06091030140E00E94D6
:10328000910887E06091030140E00E9491088091DD
:103290005D0190915E018093000180915F019091AA
:1032A0006001809301011092180180E090E01F916D
:1032B0000F91089580910101853608F449CF17E0F8
:1032C000812F609102014FE40E9491081F5F1B3023
:1032D000B9F74ACF8AE0609102014AEC0E940405E6
:1032E0008BE1609102014CEC0E94040587E0609143
:1032F00003014EE90E94040580911D0180FD96C0E6
:10330000826080931D0110CF82E0609103014FE441
:103310000E94910883E0609103014FE40E949108AC
:1033200084E0609103014FE40E94910885E0609180
:1033300003014FE40E94910886E0609103014FE48D
:103340000E94910887E0609103014FE40E94910878
:103350009ECF17E0812F6091020140E00E9491080A
:103360001F5F1B30B9F700CF40914B0150914C01CA
:1033700020914D0130914E01809102016091030135
:1033800061508E5F0E94E60880911D0180FF27CF6B
:1033900020910301215080913701909138016AE01A
:1033A00070E00E947C1CAB0183E0622F23E030E0E0
:1033B00000E00E94760610910301115060913B01DC
:1033C00070913C0180913D0190913E012AE030E0F6
:1033D00040E050E00E94B11C8AE0612FA90124E086
:1033E00030E00E94190780911B0185FFF8CE6091A3
:1033F0000301615040919F025091A00281E123E0BE
:1034000030E00E947606EBCE8091550190915601F6
:1034100063E070E00E94681CAB0187E160910201EB
:1034200023E030E000E00E94D305BECE60910301AE
:10343000615087E04FE90E940405609103016150EB
:103440008EE045EB0E94040580911B0185FD03C0C1
:1034500080911D0155CF60910301615085E14EE9D6
:103460000E940405F5CF0F931F9380911B0180FFED
:1034700010C180911D0181FF2FC140915F015091CA
:10348000600187E06091020123E030E000E00E94EB
:103490006B0780915F01909160018536910508F47A
:1034A0000BC180915F01909160018536910528F0F4
:1034B00080910101853608F462C140915B01509111
:1034C0005C018DE06091020123E030E000E00E94A9
:1034D0006B071091020180915B0190915C010E9449
:1034E0009D08E82FF0E0EE0FFF1FE85FFE4F4591CB
:1034F000549181E1612F0E947E0580915501909148
:1035000056018536910540F4809155019091560100
:103510008C599F4F08F096C18091550190915601AA
:103520006AE070E00E94681CAB0186E160910201D4
:1035300024E030E000E00E941907409155015091CD
:1035400056018091430190914401481B590B5093BF
:103550004601409345018BE1609102010E94C1093F
:1035600040911B0142FD63C180915501909156012C
:10357000909344018093430120915501309156016D
:1035800080911F01909120018217930740F4809150
:103590005501909156019093200180931F0141FDA8
:1035A00035C140915B0150915C01609102016F5FF8
:1035B0008BE00E94550A80911D0180FDEBC0209197
:1035C0005D0130915E0182E060910301409119013B
:1035D00000911A010E94170A40915D0150915E010D
:1035E00083E06091030123E030E000E00E94760672
:1035F00080915D0190915E0140911901242F30E08E
:103600002817390728F080910001481708F492C064
:1036100080915D0190915E012817390740F58091F6
:103620000001841720F582E06091030140E00E94D0
:10363000910883E06091030140E00E94910884E0DA
:103640006091030140E00E94910885E060910301D0
:1036500040E00E94910886E06091030140E00E94F2
:10366000910887E06091030140E00E949108409139
:1036700012015091130188E0609103010E943A0801
:1036800040911601509117018FE0609103010E9453
:103690003A0880915D0190915E01809300018091D4
:1036A0005F0190916001809301011092180180E008
:1036B00090E01F910F91089580910101853608F4E3
:1036C000F0CE17E0812F609102014FE40E94910833
:1036D0001F5F1B30B9F7F1CE8AE0609102014AEC1E
:1036E0000E94040580E16091020140ED0E94040502
:1036F0008AE1609102014CEC0E94040587E0609130
:1037000003014EE90E94040580911D0180FDA7C0C0
:103710008EE06091030141ED0E94040585E1609116
:10372000030142ED0E94040580911D018260809397
:103730001D01A3CE82E0609103014FE40E94910835
:1037400083E0609103014FE40E94910884E060915E
:1037500003014FE40E94910885E0609103014FE46A
:103760000E94910886E0609103014FE40E94910855
:1037700087E0609103014FE40E94910878CF17E041
:10378000812F6091020140E00E9491081F5F1B3071
:10379000B9F793CE20910301215080913701909188
:1037A00038016AE070E00E947C1CAB0183E0622F6C
:1037B00023E030E000E00E947606109103011150F2
:1037C00060913B0170913C0180913D0190913E01DF
:1037D0002AE030E040E050E00E94B11C8AE0612F16
:1037E000A90124E030E00E94190780911B0185FFA8
:1037F000E6CE60910301615040919F025091A0027A
:1038000081E123E030E00E947606D9CE40914B0161
:1038100050914C0120914D0130914E018091020157
:103820006091030161508E5F0E94E608BACE40911C
:103830004501509146018BE168E00E94840A409165
:103840001B0192CE409155015091560186E1609145
:10385000020123E030E000E00E94D3056ECE6091CB
:103860000301615087E04FE90E9404056091030164
:1038700061508EE045EB0E94040580911B0185FF9D
:1038800047CF60910301615085E14EE90E94040534
:103890003FCF629FD001739FF001829FE00DF11D29
:1038A000649FE00DF11D929FF00D839FF00D749FBA
:1038B000F00D659FF00D9927729FB00DE11DF91F66
:1038C000639FB00DE11DF91FBD01CF0111240895C3
:1038D000AA1BBB1B51E107C0AA1FBB1FA617B70736
:1038E00010F0A61BB70B881F991F5A95A9F7809552
:1038F0009095BC01CD01089597FB092E07260AD0AB
:1039000077FD04D0E5DF06D000201AF470956195AC
:103910007F4F0895F6F7909581959F4F0895A1E206
:103920001A2EAA1BBB1BFD010DC0AA1FBB1FEE1F39
:10393000FF1FA217B307E407F50720F0A21BB30B84
:10394000E40BF50B661F771F881F991F1A9469F700
:1039500060957095809590959B01AC01BD01CF015C
:10396000089597FB092E05260ED057FD04D0D7DF0A
:103970000AD0001C38F450954095309521953F4F62
:103980004F4F5F4F0895F6F790958095709561952C
:103990007F4F8F4F9F4F0895FB019F01E894423066
:1039A000C4F04532B4F44A3029F497FB1EF49095E4
:1039B00081959F4F642F77270E94681C805D8A3312
:1039C0000CF0895D8193CB010097A1F716F45DE2BD
:1039D00051931082C9010C94021DE199FECF9FBB47
:1039E0008EBBE09A99278DB30895262FE199FECFDB
:1039F0009FBB8EBB2DBB0FB6F894E29AE19A0FBE27
:103A000001960895DC01FC01672F71917723E1F79E
:103A1000329704C07C916D9370836291AE17BF079B
:083A2000C8F30895F894FFCFEC
:103A2800FFFF010EFF0C0F8A18FFFFE1E1E2E3E35D
:023A3800017B10
:00000001FF
/C-OSD/trunk/default/C-OSD.lss
0,0 → 1,9113
 
C-OSD.elf: file format elf32-avr
 
Sections:
Idx Name Size VMA LMA File off Algn
0 .data 00000012 00800100 00003a28 00003adc 2**0
CONTENTS, ALLOC, LOAD, DATA
1 .text 00003a28 00000000 00000000 000000b4 2**1
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .bss 0000018f 00800112 00800112 00003aee 2**0
ALLOC
3 .eeprom 00000005 00810000 00810000 00003aee 2**0
CONTENTS, ALLOC, LOAD, DATA
4 .debug_aranges 00000180 00000000 00000000 00003af3 2**0
CONTENTS, READONLY, DEBUGGING
5 .debug_pubnames 0000245b 00000000 00000000 00003c73 2**0
CONTENTS, READONLY, DEBUGGING
6 .debug_info 000070a3 00000000 00000000 000060ce 2**0
CONTENTS, READONLY, DEBUGGING
7 .debug_abbrev 0000113c 00000000 00000000 0000d171 2**0
CONTENTS, READONLY, DEBUGGING
8 .debug_line 00002b13 00000000 00000000 0000e2ad 2**0
CONTENTS, READONLY, DEBUGGING
9 .debug_frame 00000430 00000000 00000000 00010dc0 2**2
CONTENTS, READONLY, DEBUGGING
10 .debug_str 00000c43 00000000 00000000 000111f0 2**0
CONTENTS, READONLY, DEBUGGING
11 .debug_loc 00001c20 00000000 00000000 00011e33 2**0
CONTENTS, READONLY, DEBUGGING
12 .debug_ranges 00000138 00000000 00000000 00013a53 2**0
CONTENTS, READONLY, DEBUGGING
 
Disassembly of section .text:
 
00000000 <__vectors>:
0: 0c 94 c6 01 jmp 0x38c ; 0x38c <__ctors_end>
4: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
8: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
c: 0c 94 a3 0e jmp 0x1d46 ; 0x1d46 <__vector_3>
10: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
14: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
18: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
1c: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
20: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
24: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
28: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
2c: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
30: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
34: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
38: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
3c: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
40: 0c 94 d9 02 jmp 0x5b2 ; 0x5b2 <__vector_16>
44: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
48: 0c 94 07 0e jmp 0x1c0e ; 0x1c0e <__vector_18>
4c: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
50: 0c 94 64 03 jmp 0x6c8 ; 0x6c8 <__vector_20>
54: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
58: 0c 94 5a 03 jmp 0x6b4 ; 0x6b4 <__vector_22>
5c: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
60: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
64: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
68: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
6c: 0c 94 e3 01 jmp 0x3c6 ; 0x3c6 <__bad_interrupt>
 
00000070 <stats_item_0>:
70: 6d 61 78 20 41 6c 74 69 74 75 64 65 3a 00 max Altitude:.
 
0000007e <stats_item_1>:
7e: 6d 61 78 20 53 70 65 65 64 20 20 20 3a 00 max Speed :.
 
0000008c <stats_item_2>:
8c: 6d 61 78 20 44 69 73 74 61 6e 63 65 3a 00 max Distance:.
 
0000009a <stats_item_3>:
9a: 6d 69 6e 20 56 6f 6c 74 61 67 65 20 3a 00 min Voltage :.
 
000000a8 <stats_item_4>:
a8: 6d 61 78 20 54 69 6d 65 20 20 20 20 3a 00 max Time :.
 
000000b6 <stats_item_5>:
b6: 6c 6f 6e 67 69 74 75 64 65 20 20 20 3a 00 longitude :.
 
000000c4 <stats_item_6>:
c4: 6c 61 74 69 74 75 64 65 20 20 20 20 3a 00 latitude :.
 
000000d2 <stats_item_7>:
d2: 6d 61 78 20 63 75 72 72 65 6e 74 20 3a 00 max current :.
 
000000e0 <stats_item_pointers>:
e0: 70 00 7e 00 8c 00 9a 00 a8 00 b6 00 c4 00 d2 00 p.~.............
 
000000f0 <str_NE>:
f0: 4e 45 00 NE.
 
000000f3 <str_E>:
f3: 45 20 00 E .
 
000000f6 <str_SE>:
f6: 53 45 00 SE.
 
000000f9 <str_S>:
f9: 53 20 00 S .
 
000000fc <str_SW>:
fc: 53 57 00 SW.
 
000000ff <str_W>:
ff: 57 20 00 W .
 
00000102 <str_NW>:
102: 4e 57 00 NW.
 
00000105 <str_N>:
105: 4e 20 00 N .
 
00000108 <directions>:
108: f0 00 f3 00 f6 00 f9 00 fc 00 ff 00 02 01 05 01 ................
 
00000118 <str_1>:
118: 64 65 66 61 75 6c 74 00 default.
 
00000120 <str_2>:
120: 6d 69 6e 69 6d 61 6c 00 minimal.
 
00000128 <str_3>:
128: 20 20 20 6a 6f 70 6c 00 jopl.
 
00000130 <ncdisplaymodes>:
130: 0c 0f 18 01 02 15 20 01 ...... .
 
00000138 <fcdisplaymodes>:
138: 8a 18 18 01 33 1a 28 01 ....3.(.
 
00000140 <__c.1706>:
140: 23 62 6f 3f 5d 3d 3d 45 47 0d 00 #bo?]==EG..
 
0000014b <vario_00>:
14b: 00 00 c2 ff ff .....
 
00000150 <vario_01>:
150: 00 00 c2 ff c0 .....
 
00000155 <vario_02>:
155: 00 00 c2 ff c1 .....
 
0000015a <vario_03>:
15a: 00 00 c2 ff 00 .....
 
0000015f <vario_04>:
15f: 00 00 c2 c0 00 .....
 
00000164 <vario_05>:
164: 00 00 c2 c1 00 .....
 
00000169 <vario_06>:
169: 00 00 c2 00 00 .....
 
0000016e <vario_07>:
16e: 00 00 bb 00 00 .....
 
00000173 <vario_08>:
173: 00 00 c3 00 00 .....
 
00000178 <vario_09>:
178: 00 c4 c3 00 00 .....
 
0000017d <vario_10>:
17d: 00 c5 c3 00 00 .....
 
00000182 <vario_11>:
182: 00 ff c3 00 00 .....
 
00000187 <vario_12>:
187: c4 ff c3 00 00 .....
 
0000018c <vario_13>:
18c: c5 ff c3 00 00 .....
 
00000191 <vario_14>:
191: ff ff c3 00 00 .....
 
00000196 <vario_pnt>:
196: 4b 01 50 01 55 01 5a 01 5f 01 64 01 69 01 6e 01 K.P.U.Z._.d.i.n.
1a6: 73 01 78 01 7d 01 82 01 87 01 8c 01 91 01 s.x.}.........
 
000001b4 <rose.1545>:
1b4: d8 d7 d8 d3 d8 d7 d8 d5 d8 d7 d8 d4 d8 d7 d8 d6 ................
1c4: d8 d7 d8 d3 d8 d7 d8 d5 d8 d7 d8 d4 d8 d7 d8 d6 ................
1d4: d8 d7 d8 d3 d8 d7 d8 d5 d8 d7 d8 d4 d8 d7 d8 d6 ................
 
000001e4 <VM_PAL>:
1e4: 50 41 4c 20 00 PAL .
 
000001e9 <VM_NTSC>:
1e9: 4e 54 53 43 00 NTSC.
 
000001ee <ee_message0>:
1ee: 4c 6f 61 64 69 6e 67 20 44 61 74 61 20 66 72 6f Loading Data fro
1fe: 6d 20 45 45 50 52 4f 4d 00 m EEPROM.
 
00000207 <ee_message1>:
207: 4e 6f 20 73 61 76 65 64 20 44 61 74 61 20 69 6e No saved Data in
217: 20 45 45 50 52 4f 4d 00 EEPROM.
 
0000021f <ee_msg>:
21f: ee 01 07 02 ....
 
00000223 <__c.1787>:
223: 43 2d 4f 53 44 20 43 6f 6e 66 69 67 20 4d 65 6e C-OSD Config Men
233: 75 00 u.
 
00000235 <__c.1779>:
235: 44 4f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 DONE
245: 20 20 00 .
 
00000248 <__c.1753>:
248: 45 58 49 54 00 EXIT.
 
0000024d <__c.1751>:
24d: 53 61 76 65 20 63 6f 6e 66 69 67 00 Save config.
 
00000259 <__c.1749>:
259: 42 41 52 4f 00 BARO.
 
0000025e <__c.1747>:
25e: 20 47 50 53 00 GPS.
 
00000263 <__c.1745>:
263: 48 65 69 67 68 74 20 62 79 00 Height by.
 
0000026d <__c.1740>:
26d: 44 69 73 70 6c 61 79 20 4d 6f 64 65 00 Display Mode.
 
0000027a <__c.1738>:
27a: 52 65 73 65 74 20 75 70 74 69 6d 65 00 Reset uptime.
 
00000287 <__c.1736>:
287: 56 6f 6c 74 61 67 65 20 62 79 20 43 2d 53 74 72 Voltage by C-Str
297: 6f 6d 00 om.
 
0000029a <__c.1734>:
29a: 43 75 72 72 65 6e 74 20 62 79 20 46 43 00 Current by FC.
 
000002a8 <__c.1732>:
2a8: 53 74 61 74 69 73 74 69 63 73 00 Statistics.
 
000002b3 <__c.1730>:
2b3: 42 69 67 20 56 61 72 69 6f 20 62 61 72 00 Big Vario bar.
 
000002c1 <__c.1728>:
2c1: 41 72 74 20 48 6f 72 69 7a 6f 6e 20 69 6e 20 48 Art Horizon in H
2d1: 55 44 00 UD.
 
000002d4 <__c.1726>:
2d4: 46 75 6c 6c 20 48 55 44 00 Full HUD.
 
000002dd <__c.1724>:
2dd: 56 69 64 65 6f 20 4d 6f 64 65 00 Video Mode.
 
000002e8 <__c.1714>:
2e8: 4f 46 46 00 OFF.
 
000002ec <__c.1712>:
2ec: 4f 4e 20 00 ON .
 
000002f0 <__c.1663>:
2f0: 4e 43 20 56 45 52 53 49 4f 4e 3a 20 2e 2e 2e 2e NC VERSION: ....
300: 2e 2e 2e 2e 00 .....
 
00000305 <__c.1661>:
305: 23 62 76 3d 3d 3d 3d 44 6c 0d 00 #bv====Dl..
 
00000310 <__c.1659>:
310: 4d 61 78 20 56 6f 6c 74 61 67 65 20 20 20 20 3a Max Voltage :
...
 
00000321 <__c.1657>:
321: 57 61 72 6e 20 56 6f 6c 74 61 67 65 20 20 20 3a Warn Voltage :
...
 
00000332 <__c.1655>:
332: 4e 75 6d 62 65 72 20 6f 66 20 43 65 6c 6c 73 3a Number of Cells:
...
 
00000343 <__c.1651>:
343: 47 75 65 73 73 69 6e 67 20 4e 75 6d 62 65 72 20 Guessing Number
353: 6f 66 20 43 65 6c 6c 73 00 of Cells.
 
0000035c <__c.1648>:
35c: 44 45 56 45 4c 2d 42 55 49 4c 44 00 DEVEL-BUILD.
 
00000368 <__c.1646>:
368: 4e 61 76 69 43 74 72 6c 20 4d 6f 64 65 00 NaviCtrl Mode.
 
00000376 <__c.1644>:
376: 43 2d 4f 53 44 20 49 6e 69 74 69 61 6c 69 73 61 C-OSD Initialisa
386: 74 69 6f 6e 00 00 tion..
 
0000038c <__ctors_end>:
38c: 11 24 eor r1, r1
38e: 1f be out 0x3f, r1 ; 63
390: cf ef ldi r28, 0xFF ; 255
392: d4 e0 ldi r29, 0x04 ; 4
394: de bf out 0x3e, r29 ; 62
396: cd bf out 0x3d, r28 ; 61
 
00000398 <__do_copy_data>:
398: 11 e0 ldi r17, 0x01 ; 1
39a: a0 e0 ldi r26, 0x00 ; 0
39c: b1 e0 ldi r27, 0x01 ; 1
39e: e8 e2 ldi r30, 0x28 ; 40
3a0: fa e3 ldi r31, 0x3A ; 58
3a2: 02 c0 rjmp .+4 ; 0x3a8 <.do_copy_data_start>
 
000003a4 <.do_copy_data_loop>:
3a4: 05 90 lpm r0, Z+
3a6: 0d 92 st X+, r0
 
000003a8 <.do_copy_data_start>:
3a8: a2 31 cpi r26, 0x12 ; 18
3aa: b1 07 cpc r27, r17
3ac: d9 f7 brne .-10 ; 0x3a4 <.do_copy_data_loop>
 
000003ae <__do_clear_bss>:
3ae: 12 e0 ldi r17, 0x02 ; 2
3b0: a2 e1 ldi r26, 0x12 ; 18
3b2: b1 e0 ldi r27, 0x01 ; 1
3b4: 01 c0 rjmp .+2 ; 0x3b8 <.do_clear_bss_start>
 
000003b6 <.do_clear_bss_loop>:
3b6: 1d 92 st X+, r1
 
000003b8 <.do_clear_bss_start>:
3b8: a1 3a cpi r26, 0xA1 ; 161
3ba: b1 07 cpc r27, r17
3bc: e1 f7 brne .-8 ; 0x3b6 <.do_clear_bss_loop>
3be: 0e 94 f0 01 call 0x3e0 ; 0x3e0 <main>
3c2: 0c 94 12 1d jmp 0x3a24 ; 0x3a24 <_exit>
 
000003c6 <__bad_interrupt>:
3c6: 0c 94 e5 01 jmp 0x3ca ; 0x3ca <__vector_default>
 
000003ca <__vector_default>:
 
/**
* handler for undefined Interrupts
* if not defined AVR will reset in case any unhandled interrupts occur
*/
ISR(__vector_default) {
3ca: 1f 92 push r1
3cc: 0f 92 push r0
3ce: 0f b6 in r0, 0x3f ; 63
3d0: 0f 92 push r0
3d2: 11 24 eor r1, r1
asm("nop");
3d4: 00 00 nop
}
3d6: 0f 90 pop r0
3d8: 0f be out 0x3f, r0 ; 63
3da: 0f 90 pop r0
3dc: 1f 90 pop r1
3de: 18 95 reti
 
000003e0 <main>:
/* ##########################################################################
* MAIN
* ##########################################################################*/
int main(void) {
// set up FLAGS
COSD_FLAGS_MODES = 0, COSD_FLAGS_CONFIG = 0, COSD_FLAGS_RUNTIME = 0;
3e0: 10 92 1c 01 sts 0x011C, r1
3e4: 10 92 1d 01 sts 0x011D, r1
#endif
#if STATS
COSD_FLAGS_MODES |= COSD_FLAG_STATS;
#endif
#if WARNINGS
COSD_FLAGS_MODES |= COSD_FLAG_WARNINGS;
3e8: 89 e1 ldi r24, 0x19 ; 25
3ea: 80 93 1b 01 sts 0x011B, r24
COSD_FLAGS_CONFIG |= COSD_FLAG_FCMODE;
#endif
 
 
// set up Atmega162 Ports
DDRA |= (1 << PA1); // PA1 output (/CS)
3ee: d1 9a sbi 0x1a, 1 ; 26
MAX_CS_HIGH
3f0: d9 9a sbi 0x1b, 1 ; 27
DDRA |= (1 << PA2); // PA2 output (SDIN)
3f2: d2 9a sbi 0x1a, 2 ; 26
MAX_SDIN_LOW
3f4: da 98 cbi 0x1b, 2 ; 27
DDRA |= (1 << PA3); // PA3 output (SCLK)
3f6: d3 9a sbi 0x1a, 3 ; 26
MAX_SCLK_LOW
3f8: db 98 cbi 0x1b, 3 ; 27
DDRA |= (1 << PA5); // PA5 output (RESET)
3fa: d5 9a sbi 0x1a, 5 ; 26
MAX_RESET_HIGH
3fc: dd 9a sbi 0x1b, 5 ; 27
 
DDRC |= (1 << PC0); // PC0 output (LED1 gn)
3fe: a0 9a sbi 0x14, 0 ; 20
LED1_OFF
400: a8 98 cbi 0x15, 0 ; 21
DDRC |= (1 << PC1); // PC1 output (LED2 rt)
402: a1 9a sbi 0x14, 1 ; 20
LED2_OFF
404: a9 98 cbi 0x15, 1 ; 21
DDRC |= (1 << PC2); // PC2 output (LED3 gn)
406: a2 9a sbi 0x14, 2 ; 20
LED3_OFF
408: aa 98 cbi 0x15, 2 ; 21
DDRC |= (1 << PC3); // PC3 output (LED4 rt)
40a: a3 9a sbi 0x14, 3 ; 20
LED4_OFF
40c: ab 98 cbi 0x15, 3 ; 21
 
DDRC &= ~(1 << PC4); // PC4 input (MODE)
40e: a4 98 cbi 0x14, 4 ; 20
PORTC |= (1 << PC4); // pullup
410: ac 9a sbi 0x15, 4 ; 21
DDRC &= ~(1 << PC5); // PC5 input (SET)
412: a5 98 cbi 0x14, 5 ; 20
PORTC |= (1 << PC5); // pullup
414: ad 9a sbi 0x15, 5 ; 21
 
// reset the MAX7456 to be sure any undefined states do no harm
MAX_RESET_LOW
416: dd 98 cbi 0x1b, 5 ; 27
MAX_RESET_HIGH
418: dd 9a sbi 0x1b, 5 ; 27
 
// give the FC/NC and the maxim time to come up
LED4_ON
41a: ab 9a sbi 0x15, 3 ; 21
41c: 80 e1 ldi r24, 0x10 ; 16
41e: 97 e2 ldi r25, 0x27 ; 39
milliseconds can be achieved.
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
420: 20 e9 ldi r18, 0x90 ; 144
422: 31 e0 ldi r19, 0x01 ; 1
424: f9 01 movw r30, r18
426: 31 97 sbiw r30, 0x01 ; 1
428: f1 f7 brne .-4 ; 0x426 <main+0x46>
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
42a: 01 97 sbiw r24, 0x01 ; 1
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
42c: d9 f7 brne .-10 ; 0x424 <main+0x44>
_delay_ms(1000);
LED4_OFF
42e: ab 98 cbi 0x15, 3 ; 21
// DISABLE display (VM0)
spi_send_byte(0x00, 0b00000000);
learn_all_chars_pgm();
#else
// read out config for NTSC/PAL distinguishing
get_eeprom(0);
430: 80 e0 ldi r24, 0x00 ; 0
432: 0e 94 bd 0c call 0x197a ; 0x197a <get_eeprom>
#endif
 
// Setup Video Mode
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
436: 80 91 1c 01 lds r24, 0x011C
43a: 80 ff sbrs r24, 0
43c: b2 c0 rjmp .+356 ; 0x5a2 <__stack+0xa3>
// NTSC + enable display immediately (VM0)
spi_send_byte(0x00, 0b00001000);
43e: 80 e0 ldi r24, 0x00 ; 0
440: 68 e0 ldi r22, 0x08 ; 8
442: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
 
bottom_line = 12;
446: 8c e0 ldi r24, 0x0C ; 12
448: 80 93 03 01 sts 0x0103, r24
 
// 8bit mode
spi_send_byte(0x04, 0b01000000);*/
 
// clear display memory and set to 8bit mode
clear();
44c: 0e 94 75 08 call 0x10ea ; 0x10ea <clear>
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
// init usart
usart1_init();
450: 0e 94 31 03 call 0x662 ; 0x662 <usart1_init>
 
// keep serial port clean
usart1_DisableTXD();
454: 0e 94 39 03 call 0x672 ; 0x672 <usart1_DisableTXD>
 
// set up timer
// CTC, Prescaler /64
TCCR0 = (1 << WGM01) | (0 << WGM00) | (0 << CS02) | (1 << CS01) | (1 << CS00);
458: 8b e0 ldi r24, 0x0B ; 11
45a: 83 bf out 0x33, r24 ; 51
 
TCNT0 = 0;
45c: 12 be out 0x32, r1 ; 50
OCR0 = 250;
45e: 8a ef ldi r24, 0xFA ; 250
460: 81 bf out 0x31, r24 ; 49
 
// enable timer output compare interrupt
TIMSK &= ~(1 << TOIE0);
462: 89 b7 in r24, 0x39 ; 57
464: 8d 7f andi r24, 0xFD ; 253
466: 89 bf out 0x39, r24 ; 57
TIMSK |= (1 << OCIE0);
468: 89 b7 in r24, 0x39 ; 57
46a: 81 60 ori r24, 0x01 ; 1
46c: 89 bf out 0x39, r24 ; 57
 
// SPI setup
DDRD |= (1 << PD2); // PD2 output (INT0)
46e: 8a 9a sbi 0x11, 2 ; 17
SpiMasterInit();
470: 0e 94 f5 0d call 0x1bea ; 0x1bea <SpiMasterInit>
 
// PPM detection setup
ppm_init();
474: 0e 94 98 0e call 0x1d30 ; 0x1d30 <ppm_init>
 
// enable interrupts
sei();
478: 78 94 sei
//write_ascii_string(2, 7, " CaScAdE ");
//write_ascii_string(2, 8, "is TESTING his open source");
//write_ascii_string(2, 9, " EPi OSD Firmware");
 
// we are ready
LED3_ON
47a: aa 9a sbi 0x15, 2 ; 21
47c: 04 c0 rjmp .+8 ; 0x486 <main+0xa6>
}
// handle keypress
if (s1_pressed()) {
config_menu();
}
if (seconds_since_last_data > 0) {
47e: 80 91 18 01 lds r24, 0x0118
482: 88 23 and r24, r24
484: 61 f5 brne .+88 ; 0x4de <main+0xfe>
//usart1_puts("\x1B[2J\x1B[H");
//usart1_puts("hello world!123\r\n");
 
while (1) {
// in case SPI is ready and there is nothing to send right now
if (!icnt && spi_ready) {
486: 80 91 34 01 lds r24, 0x0134
48a: 90 91 35 01 lds r25, 0x0135
48e: 89 2b or r24, r25
490: 91 f4 brne .+36 ; 0x4b6 <main+0xd6>
492: 80 91 10 01 lds r24, 0x0110
496: 88 23 and r24, r24
498: 71 f0 breq .+28 ; 0x4b6 <main+0xd6>
// correct transfer ends with d (done)
if (SPI_buffer.buffer.chk == 'd') {
49a: 80 91 95 01 lds r24, 0x0195
49e: 84 36 cpi r24, 0x64 ; 100
4a0: 09 f4 brne .+2 ; 0x4a4 <main+0xc4>
4a2: 4c c0 rjmp .+152 ; 0x53c <__stack+0x3d>
// update this flag
COSD_FLAGS_RUNTIME |= COSD_FLAG_STROMREC;
}
} else {
// update flags
COSD_FLAGS_RUNTIME &= ~COSD_FLAG_STROMREC;
4a4: 80 91 1d 01 lds r24, 0x011D
4a8: 8e 7f andi r24, 0xFE ; 254
4aa: 80 93 1d 01 sts 0x011D, r24
}
StartTransfer(9);
4ae: 89 e0 ldi r24, 0x09 ; 9
4b0: 90 e0 ldi r25, 0x00 ; 0
4b2: 0e 94 48 0e call 0x1c90 ; 0x1c90 <StartTransfer>
}
if (rxd_buffer_locked) {
4b6: 80 91 29 01 lds r24, 0x0129
4ba: 88 23 and r24, r24
4bc: 31 f0 breq .+12 ; 0x4ca <main+0xea>
osd_fcmode();
}
seconds_since_last_data = 0;
}
#else
if (rxd_buffer[2] == 'O') { // NC OSD Data
4be: 80 91 ee 01 lds r24, 0x01EE
4c2: 8f 34 cpi r24, 0x4F ; 79
4c4: b9 f0 breq .+46 ; 0x4f4 <main+0x114>
osd_ncmode();
}
//seconds_since_last_data = 0;
}
#endif
rxd_buffer_locked = 0;
4c6: 10 92 29 01 sts 0x0129, r1
}
// handle keypress
if (s1_pressed()) {
4ca: 0e 94 58 0e call 0x1cb0 ; 0x1cb0 <s1_pressed>
4ce: 89 2b or r24, r25
4d0: b1 f2 breq .-84 ; 0x47e <main+0x9e>
config_menu();
4d2: 0e 94 9c 0b call 0x1738 ; 0x1738 <config_menu>
}
if (seconds_since_last_data > 0) {
4d6: 80 91 18 01 lds r24, 0x0118
4da: 88 23 and r24, r24
4dc: a1 f2 breq .-88 ; 0x486 <main+0xa6>
usart1_EnableTXD();
4de: 0e 94 3e 03 call 0x67c ; 0x67c <usart1_EnableTXD>
//usart1_request_mk_data(0, 'd', 100);
usart1_puts_pgm(PSTR(REQUEST_DBG_DATA));
#else
// request OSD Data from NC every 100ms
//usart1_request_mk_data(1, 'o', 100);
usart1_puts_pgm(PSTR(REQUEST_OSD_DATA));
4e2: 80 e4 ldi r24, 0x40 ; 64
4e4: 91 e0 ldi r25, 0x01 ; 1
4e6: 0e 94 47 03 call 0x68e ; 0x68e <usart1_puts_pgm>
 
// and disable debug...
//usart1_request_mk_data(0, 'd', 0);
#endif
// reset last time counter
seconds_since_last_data = 0;
4ea: 10 92 18 01 sts 0x0118, r1
usart1_DisableTXD();
4ee: 0e 94 39 03 call 0x672 ; 0x672 <usart1_DisableTXD>
4f2: c9 cf rjmp .-110 ; 0x486 <main+0xa6>
}
seconds_since_last_data = 0;
}
#else
if (rxd_buffer[2] == 'O') { // NC OSD Data
Decode64();
4f4: 0e 94 30 04 call 0x860 ; 0x860 <Decode64>
naviData = *((NaviData_t*) pRxData);
4f8: aa e9 ldi r26, 0x9A ; 154
4fa: b1 e0 ldi r27, 0x01 ; 1
4fc: 80 91 2b 01 lds r24, 0x012B
500: 90 91 2c 01 lds r25, 0x012C
504: 9c 01 movw r18, r24
506: f9 01 movw r30, r18
508: 82 e5 ldi r24, 0x52 ; 82
50a: 01 90 ld r0, Z+
50c: 0d 92 st X+, r0
50e: 81 50 subi r24, 0x01 ; 1
510: e1 f7 brne .-8 ; 0x50a <__stack+0xb>
 
// init on first data retrival, distinguished by last battery :)
if (last_UBat == 255) {
512: 80 91 00 01 lds r24, 0x0100
516: 8f 3f cpi r24, 0xFF ; 255
518: f1 f5 brne .+124 ; 0x596 <__stack+0x97>
if (naviData.UBat > 40) {
51a: 80 91 d3 01 lds r24, 0x01D3
51e: 89 32 cpi r24, 0x29 ; 41
520: 90 f2 brcs .-92 ; 0x4c6 <main+0xe6>
// fix for min_UBat
min_UBat = naviData.UBat;
522: 80 91 d3 01 lds r24, 0x01D3
526: 80 93 04 01 sts 0x0104, r24
last_UBat = naviData.UBat;
52a: 80 91 d3 01 lds r24, 0x01D3
52e: 80 93 00 01 sts 0x0100, r24
init_cosd(last_UBat);
532: 80 91 00 01 lds r24, 0x0100
536: 0e 94 f1 0c call 0x19e2 ; 0x19e2 <init_cosd>
53a: c5 cf rjmp .-118 ; 0x4c6 <main+0xe6>
while (1) {
// in case SPI is ready and there is nothing to send right now
if (!icnt && spi_ready) {
// correct transfer ends with d (done)
if (SPI_buffer.buffer.chk == 'd') {
ampere = SPI_buffer.data.ampere;
53c: 80 91 8b 01 lds r24, 0x018B
540: 90 91 8c 01 lds r25, 0x018C
544: 90 93 38 01 sts 0x0138, r25
548: 80 93 37 01 sts 0x0137, r24
ampere_wasted = SPI_buffer.data.mah;
54c: 80 91 8d 01 lds r24, 0x018D
550: 90 91 8e 01 lds r25, 0x018E
554: a0 91 8f 01 lds r26, 0x018F
558: b0 91 90 01 lds r27, 0x0190
55c: 80 93 3b 01 sts 0x013B, r24
560: 90 93 3c 01 sts 0x013C, r25
564: a0 93 3d 01 sts 0x013D, r26
568: b0 93 3e 01 sts 0x013E, r27
s_volt = SPI_buffer.data.volt;
56c: 80 91 91 01 lds r24, 0x0191
570: 90 91 92 01 lds r25, 0x0192
574: 90 93 a0 02 sts 0x02A0, r25
578: 80 93 9f 02 sts 0x029F, r24
 
// if this is the first receival we should print the small A
if (!(COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC)) {
57c: 80 91 1d 01 lds r24, 0x011D
580: 80 fd sbrc r24, 0
582: 95 cf rjmp .-214 ; 0x4ae <main+0xce>
clear();
584: 0e 94 75 08 call 0x10ea ; 0x10ea <clear>
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
588: 80 91 1d 01 lds r24, 0x011D
58c: 8d 7f andi r24, 0xFD ; 253
// update this flag
COSD_FLAGS_RUNTIME |= COSD_FLAG_STROMREC;
58e: 81 60 ori r24, 0x01 ; 1
590: 80 93 1d 01 sts 0x011D, r24
594: 8c cf rjmp .-232 ; 0x4ae <main+0xce>
min_UBat = naviData.UBat;
last_UBat = naviData.UBat;
init_cosd(last_UBat);
}
} else {
osd_ncmode();
596: e0 91 05 01 lds r30, 0x0105
59a: f0 91 06 01 lds r31, 0x0106
59e: 09 95 icall
5a0: 92 cf rjmp .-220 ; 0x4c6 <main+0xe6>
spi_send_byte(0x00, 0b00001000);
 
bottom_line = 12;
} else {
// PAL + enable display immediately (VM0)
spi_send_byte(0x00, 0b01001000);
5a2: 80 e0 ldi r24, 0x00 ; 0
5a4: 68 e4 ldi r22, 0x48 ; 72
5a6: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
 
bottom_line = 14;
5aa: 8e e0 ldi r24, 0x0E ; 14
5ac: 80 93 03 01 sts 0x0103, r24
5b0: 4d cf rjmp .-358 ; 0x44c <main+0x6c>
 
000005b2 <__vector_16>:
static uint8_t delay_spi = 0;
 
/**
* timer kicks in every 1000uS ^= 1ms
*/
ISR(TIMER0_COMP_vect) {
5b2: 1f 92 push r1
5b4: 0f 92 push r0
5b6: 0f b6 in r0, 0x3f ; 63
5b8: 0f 92 push r0
5ba: 11 24 eor r1, r1
5bc: 2f 93 push r18
5be: 3f 93 push r19
5c0: 4f 93 push r20
5c2: 5f 93 push r21
5c4: 6f 93 push r22
5c6: 7f 93 push r23
5c8: 8f 93 push r24
5ca: 9f 93 push r25
5cc: af 93 push r26
5ce: bf 93 push r27
5d0: ef 93 push r30
5d2: ff 93 push r31
if (!timer--) {
5d4: 80 91 14 01 lds r24, 0x0114
5d8: 90 91 15 01 lds r25, 0x0115
5dc: 01 97 sbiw r24, 0x01 ; 1
5de: 90 93 15 01 sts 0x0115, r25
5e2: 80 93 14 01 sts 0x0114, r24
5e6: 01 96 adiw r24, 0x01 ; 1
5e8: a1 f4 brne .+40 ; 0x612 <__vector_16+0x60>
uptime++;
5ea: 80 91 12 01 lds r24, 0x0112
5ee: 90 91 13 01 lds r25, 0x0113
5f2: 01 96 adiw r24, 0x01 ; 1
5f4: 90 93 13 01 sts 0x0113, r25
5f8: 80 93 12 01 sts 0x0112, r24
if (debugData.Analog[12]>10) {
flytime_fc++;
}
#endif
 
timer = 999;
5fc: 87 ee ldi r24, 0xE7 ; 231
5fe: 93 e0 ldi r25, 0x03 ; 3
600: 90 93 15 01 sts 0x0115, r25
604: 80 93 14 01 sts 0x0114, r24
seconds_since_last_data++;
608: 80 91 18 01 lds r24, 0x0118
60c: 8f 5f subi r24, 0xFF ; 255
60e: 80 93 18 01 sts 0x0118, r24
}
// in case there is still some spi data to send do it now
// delay to give the slave some time to compute values
if (spi_ready && icnt) {
612: 80 91 10 01 lds r24, 0x0110
616: 88 23 and r24, r24
618: 69 f0 breq .+26 ; 0x634 <__vector_16+0x82>
61a: 80 91 34 01 lds r24, 0x0134
61e: 90 91 35 01 lds r25, 0x0135
622: 89 2b or r24, r25
624: 39 f0 breq .+14 ; 0x634 <__vector_16+0x82>
if (!delay_spi--) {
626: 80 91 28 01 lds r24, 0x0128
62a: 81 50 subi r24, 0x01 ; 1
62c: 80 93 28 01 sts 0x0128, r24
630: 8f 5f subi r24, 0xFF ; 255
632: 89 f0 breq .+34 ; 0x656 <__vector_16+0xa4>
delay_spi = 8;
spi_send_next();
}
}
}
634: ff 91 pop r31
636: ef 91 pop r30
638: bf 91 pop r27
63a: af 91 pop r26
63c: 9f 91 pop r25
63e: 8f 91 pop r24
640: 7f 91 pop r23
642: 6f 91 pop r22
644: 5f 91 pop r21
646: 4f 91 pop r20
648: 3f 91 pop r19
64a: 2f 91 pop r18
64c: 0f 90 pop r0
64e: 0f be out 0x3f, r0 ; 63
650: 0f 90 pop r0
652: 1f 90 pop r1
654: 18 95 reti
}
// in case there is still some spi data to send do it now
// delay to give the slave some time to compute values
if (spi_ready && icnt) {
if (!delay_spi--) {
delay_spi = 8;
656: 88 e0 ldi r24, 0x08 ; 8
658: 80 93 28 01 sts 0x0128, r24
spi_send_next();
65c: 0e 94 53 0e call 0x1ca6 ; 0x1ca6 <spi_send_next>
660: e9 cf rjmp .-46 ; 0x634 <__vector_16+0x82>
 
00000662 <usart1_init>:
 
/**
* init usart1
*/
void usart1_init() {
UBRR1H = ((F_CPU / (16UL * baud)) - 1) >> 8;
662: 1c be out 0x3c, r1 ; 60
UBRR1L = (F_CPU / (16UL * baud)) - 1;
664: 80 e1 ldi r24, 0x10 ; 16
666: 80 b9 out 0x00, r24 ; 0
 
// Enable receiver and transmitter; enable RX interrupt
UCSR1B = (1 << RXEN1) | (1 << TXEN1) | (1 << RXCIE1);
668: 88 e9 ldi r24, 0x98 ; 152
66a: 81 b9 out 0x01, r24 ; 1
 
//asynchronous 8N1
UCSR1C = (1 << URSEL1) | (3 << UCSZ10);
66c: 86 e8 ldi r24, 0x86 ; 134
66e: 8c bf out 0x3c, r24 ; 60
}
670: 08 95 ret
 
00000672 <usart1_DisableTXD>:
 
/**
* disable the txd pin of usart1
*/
void usart1_DisableTXD(void) {
UCSR1B &= ~(1 << TXCIE1); // disable TX-Interrupt
672: 0e 98 cbi 0x01, 6 ; 1
UCSR1B &= ~(1 << TXEN1); // disable TX in USART
674: 0b 98 cbi 0x01, 3 ; 1
DDRB &= ~(1 << DDB3); // set TXD pin as input
676: bb 98 cbi 0x17, 3 ; 23
PORTB &= ~(1 << PORTB3); // disable pullup on TXD pin
678: c3 98 cbi 0x18, 3 ; 24
}
67a: 08 95 ret
 
0000067c <usart1_EnableTXD>:
 
/**
* enable the txd pin of usart1
*/
void usart1_EnableTXD(void) {
DDRB |= (1 << DDB3); // set TXD pin as output
67c: bb 9a sbi 0x17, 3 ; 23
PORTB &= ~(1 << PORTB3); // disable pullup on TXD pin
67e: c3 98 cbi 0x18, 3 ; 24
UCSR1B |= (1 << TXEN1); // enable TX in USART
680: 0b 9a sbi 0x01, 3 ; 1
UCSR1B |= (1 << TXCIE1); // enable TX-Interrupt
682: 0e 9a sbi 0x01, 6 ; 1
}
684: 08 95 ret
 
00000686 <usart1_putc>:
/**
* send a single <character> through usart1
*/
void usart1_putc(unsigned char character) {
// wait until UDR ready
while (!(UCSR1A & (1 << UDRE1)));
686: 15 9b sbis 0x02, 5 ; 2
688: fe cf rjmp .-4 ; 0x686 <usart1_putc>
UDR1 = character;
68a: 83 b9 out 0x03, r24 ; 3
}
68c: 08 95 ret
 
0000068e <usart1_puts_pgm>:
 
 
/**
* send a PGM<string> throught usart1
*/
void usart1_puts_pgm(const char* string) {
68e: ac 01 movw r20, r24
while (pgm_read_byte(string) != 0x00)
690: 9a 01 movw r18, r20
692: fa 01 movw r30, r20
694: 84 91 lpm r24, Z+
696: 88 23 and r24, r24
698: 61 f0 breq .+24 ; 0x6b2 <usart1_puts_pgm+0x24>
usart1_putc(pgm_read_byte(string++));
69a: 4f 5f subi r20, 0xFF ; 255
69c: 5f 4f sbci r21, 0xFF ; 255
69e: f9 01 movw r30, r18
6a0: 84 91 lpm r24, Z+
/**
* send a single <character> through usart1
*/
void usart1_putc(unsigned char character) {
// wait until UDR ready
while (!(UCSR1A & (1 << UDRE1)));
6a2: 15 9b sbis 0x02, 5 ; 2
6a4: fe cf rjmp .-4 ; 0x6a2 <usart1_puts_pgm+0x14>
UDR1 = character;
6a6: 83 b9 out 0x03, r24 ; 3
 
/**
* send a PGM<string> throught usart1
*/
void usart1_puts_pgm(const char* string) {
while (pgm_read_byte(string) != 0x00)
6a8: 9a 01 movw r18, r20
6aa: fa 01 movw r30, r20
6ac: 84 91 lpm r24, Z+
6ae: 88 23 and r24, r24
6b0: a1 f7 brne .-24 ; 0x69a <usart1_puts_pgm+0xc>
6b2: 08 95 ret
 
000006b4 <__vector_22>:
 
/**
* transmit interrupt handler
* unused
*/
ISR(SIG_USART1_DATA) {
6b4: 1f 92 push r1
6b6: 0f 92 push r0
6b8: 0f b6 in r0, 0x3f ; 63
6ba: 0f 92 push r0
6bc: 11 24 eor r1, r1
}
6be: 0f 90 pop r0
6c0: 0f be out 0x3f, r0 ; 63
6c2: 0f 90 pop r0
6c4: 1f 90 pop r1
6c6: 18 95 reti
 
000006c8 <__vector_20>:
/*
* receive data through usart1
* portions taken and adapted from
* http://svn.mikrokopter.de/mikrowebsvn/filedetails.php?repname=FlightCtrl&path=%2Fbranches%2FV0.72p+Code+Redesign+killagreg%2Fuart0.c
*/
ISR(SIG_USART1_RECV) {
6c8: 1f 92 push r1
6ca: 0f 92 push r0
6cc: 0f b6 in r0, 0x3f ; 63
6ce: 0f 92 push r0
6d0: 11 24 eor r1, r1
6d2: 2f 93 push r18
6d4: 3f 93 push r19
6d6: 4f 93 push r20
6d8: 5f 93 push r21
6da: 6f 93 push r22
6dc: 8f 93 push r24
6de: 9f 93 push r25
6e0: af 93 push r26
6e2: bf 93 push r27
6e4: cf 93 push r28
6e6: df 93 push r29
6e8: ef 93 push r30
6ea: ff 93 push r31
uint8_t c;
// catch the received byte
c = UDR1;
6ec: 63 b1 in r22, 0x03 ; 3
if (rxd_buffer_locked) return; // if rxd buffer is locked immediately return
6ee: 80 91 29 01 lds r24, 0x0129
6f2: 88 23 and r24, r24
6f4: 71 f4 brne .+28 ; 0x712 <__vector_20+0x4a>
static uint8_t c1 = 0;
static uint8_t c2 = 0;
static uint8_t usart_rx_ok = 0;
uint8_t crc1, crc2;
// the rxd buffer is unlocked
if (usart_rx_ok == 0) {
6f6: 80 91 2e 01 lds r24, 0x012E
6fa: 88 23 and r24, r24
6fc: e1 f4 brne .+56 ; 0x736 <__vector_20+0x6e>
// if ((c2 == '#') && (c1 == 'b' || c1 == 'c') && (c == 'D' || c == 'V' || c == 'O')) {
if ((c2 == '#') && (c1 == 'b' || c1 == 'c') &&
6fe: 80 91 2f 01 lds r24, 0x012F
702: 83 32 cpi r24, 0x23 ; 35
704: d1 f1 breq .+116 ; 0x77a <__vector_20+0xb2>
706: 20 91 30 01 lds r18, 0x0130
c2 = 0;
c1 = 0;
LED1_ON
LED2_OFF
} else {
c2 = c1;
70a: 20 93 2f 01 sts 0x012F, r18
c1 = c;
70e: 60 93 30 01 sts 0x0130, r22
ptr_rxd_buffer = 0; // reset rxd buffer
rxd_buffer_locked = 0; // unlock rxd buffer
usart_rx_ok = 0;
LED2_ON
}
}
712: ff 91 pop r31
714: ef 91 pop r30
716: df 91 pop r29
718: cf 91 pop r28
71a: bf 91 pop r27
71c: af 91 pop r26
71e: 9f 91 pop r25
720: 8f 91 pop r24
722: 6f 91 pop r22
724: 5f 91 pop r21
726: 4f 91 pop r20
728: 3f 91 pop r19
72a: 2f 91 pop r18
72c: 0f 90 pop r0
72e: 0f be out 0x3f, r0 ; 63
730: 0f 90 pop r0
732: 1f 90 pop r1
734: 18 95 reti
LED2_OFF
} else {
c2 = c1;
c1 = c;
}
} else if (ptr_rxd_buffer < RXD_BUFFER_LEN) { // collect incomming bytes
736: 30 91 31 01 lds r19, 0x0131
73a: 36 39 cpi r19, 0x96 ; 150
73c: b0 f4 brcc .+44 ; 0x76a <__vector_20+0xa2>
if (c != '\r') { // no termination character
73e: 6d 30 cpi r22, 0x0D ; 13
740: 09 f4 brne .+2 ; 0x744 <__vector_20+0x7c>
742: 50 c0 rjmp .+160 ; 0x7e4 <__vector_20+0x11c>
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
744: e3 2f mov r30, r19
746: f0 e0 ldi r31, 0x00 ; 0
748: e4 51 subi r30, 0x14 ; 20
74a: fe 4f sbci r31, 0xFE ; 254
74c: 60 83 st Z, r22
74e: 3f 5f subi r19, 0xFF ; 255
750: 30 93 31 01 sts 0x0131, r19
crc += c; // update crc
754: 80 91 32 01 lds r24, 0x0132
758: 90 91 33 01 lds r25, 0x0133
75c: 86 0f add r24, r22
75e: 91 1d adc r25, r1
760: 90 93 33 01 sts 0x0133, r25
764: 80 93 32 01 sts 0x0132, r24
768: d4 cf rjmp .-88 ; 0x712 <__vector_20+0x4a>
}
ptr_rxd_buffer = 0; // reset rxd buffer pointer
usart_rx_ok = 0;
}
} else { // rxd buffer overrun
ptr_rxd_buffer = 0; // reset rxd buffer
76a: 10 92 31 01 sts 0x0131, r1
rxd_buffer_locked = 0; // unlock rxd buffer
76e: 10 92 29 01 sts 0x0129, r1
usart_rx_ok = 0;
772: 10 92 2e 01 sts 0x012E, r1
LED2_ON
776: a9 9a sbi 0x15, 1 ; 21
778: cc cf rjmp .-104 ; 0x712 <__vector_20+0x4a>
static uint8_t usart_rx_ok = 0;
uint8_t crc1, crc2;
// the rxd buffer is unlocked
if (usart_rx_ok == 0) {
// if ((c2 == '#') && (c1 == 'b' || c1 == 'c') && (c == 'D' || c == 'V' || c == 'O')) {
if ((c2 == '#') && (c1 == 'b' || c1 == 'c') &&
77a: 20 91 30 01 lds r18, 0x0130
77e: 82 2f mov r24, r18
780: 82 56 subi r24, 0x62 ; 98
782: 82 30 cpi r24, 0x02 ; 2
784: 10 f6 brcc .-124 ; 0x70a <__vector_20+0x42>
786: 66 35 cpi r22, 0x56 ; 86
788: 19 f0 breq .+6 ; 0x790 <__vector_20+0xc8>
78a: 6f 34 cpi r22, 0x4F ; 79
78c: 09 f0 breq .+2 ; 0x790 <__vector_20+0xc8>
78e: bd cf rjmp .-134 ; 0x70a <__vector_20+0x42>
#if FCONLY
(c == 'V' || c == 'D')) { // version and debug
#else
(c == 'V' || c == 'O')) { // version and OSD
#endif
usart_rx_ok = 1;
790: 81 e0 ldi r24, 0x01 ; 1
792: 80 93 2e 01 sts 0x012E, r24
rxd_buffer[ptr_rxd_buffer++] = c2;
796: 80 91 31 01 lds r24, 0x0131
79a: e8 2f mov r30, r24
79c: f0 e0 ldi r31, 0x00 ; 0
79e: e4 51 subi r30, 0x14 ; 20
7a0: fe 4f sbci r31, 0xFE ; 254
7a2: 93 e2 ldi r25, 0x23 ; 35
7a4: 90 83 st Z, r25
7a6: 8f 5f subi r24, 0xFF ; 255
crc = c2;
rxd_buffer[ptr_rxd_buffer++] = c1;
7a8: e8 2f mov r30, r24
7aa: f0 e0 ldi r31, 0x00 ; 0
7ac: e4 51 subi r30, 0x14 ; 20
7ae: fe 4f sbci r31, 0xFE ; 254
7b0: 20 83 st Z, r18
7b2: 8f 5f subi r24, 0xFF ; 255
crc += c1;
rxd_buffer[ptr_rxd_buffer++] = c;
7b4: e8 2f mov r30, r24
7b6: f0 e0 ldi r31, 0x00 ; 0
7b8: e4 51 subi r30, 0x14 ; 20
7ba: fe 4f sbci r31, 0xFE ; 254
7bc: 60 83 st Z, r22
7be: 8f 5f subi r24, 0xFF ; 255
7c0: 80 93 31 01 sts 0x0131, r24
crc += c;
7c4: 86 2f mov r24, r22
7c6: 90 e0 ldi r25, 0x00 ; 0
7c8: 82 0f add r24, r18
7ca: 91 1d adc r25, r1
7cc: 83 96 adiw r24, 0x23 ; 35
7ce: 90 93 33 01 sts 0x0133, r25
7d2: 80 93 32 01 sts 0x0132, r24
c2 = 0;
7d6: 10 92 2f 01 sts 0x012F, r1
c1 = 0;
7da: 10 92 30 01 sts 0x0130, r1
LED1_ON
7de: a8 9a sbi 0x15, 0 ; 21
LED2_OFF
7e0: a9 98 cbi 0x15, 1 ; 21
7e2: 97 cf rjmp .-210 ; 0x712 <__vector_20+0x4a>
rxd_buffer[ptr_rxd_buffer++] = c; // copy byte to rxd buffer
crc += c; // update crc
} else { // termination character was received
// the last 2 bytes are no subject for checksum calculation
// they are the checksum itself
crc -= rxd_buffer[ptr_rxd_buffer - 2];
7e4: a3 2f mov r26, r19
7e6: b0 e0 ldi r27, 0x00 ; 0
7e8: fd 01 movw r30, r26
7ea: e6 51 subi r30, 0x16 ; 22
7ec: fe 4f sbci r31, 0xFE ; 254
7ee: 90 81 ld r25, Z
crc -= rxd_buffer[ptr_rxd_buffer - 1];
7f0: ed 01 movw r28, r26
7f2: c5 51 subi r28, 0x15 ; 21
7f4: de 4f sbci r29, 0xFE ; 254
7f6: 88 81 ld r24, Y
// calculate checksum from transmitted data
crc %= 4096;
7f8: 40 91 32 01 lds r20, 0x0132
7fc: 50 91 33 01 lds r21, 0x0133
800: 49 1b sub r20, r25
802: 51 09 sbc r21, r1
804: 48 1b sub r20, r24
806: 51 09 sbc r21, r1
808: 5f 70 andi r21, 0x0F ; 15
80a: 50 93 33 01 sts 0x0133, r21
80e: 40 93 32 01 sts 0x0132, r20
crc1 = '=' + crc / 64;
crc2 = '=' + crc % 64;
// compare checksum to transmitted checksum bytes
if ((crc1 == rxd_buffer[ptr_rxd_buffer - 2]) && (crc2 == rxd_buffer[ptr_rxd_buffer - 1])) { // checksum valid
812: 20 81 ld r18, Z
814: ca 01 movw r24, r20
816: 00 24 eor r0, r0
818: 88 0f add r24, r24
81a: 99 1f adc r25, r25
81c: 00 1c adc r0, r0
81e: 88 0f add r24, r24
820: 99 1f adc r25, r25
822: 00 1c adc r0, r0
824: 89 2f mov r24, r25
826: 90 2d mov r25, r0
828: 83 5c subi r24, 0xC3 ; 195
82a: 28 17 cp r18, r24
82c: 41 f0 breq .+16 ; 0x83e <__vector_20+0x176>
rxd_buffer[ptr_rxd_buffer] = '\r'; // set termination character
ReceivedBytes = ptr_rxd_buffer + 1; // store number of received bytes
rxd_buffer_locked = 1; // lock the rxd buffer
LED1_OFF
} else { // checksum invalid
rxd_buffer_locked = 0; // unlock rxd buffer
82e: 10 92 29 01 sts 0x0129, r1
LED2_ON
832: a9 9a sbi 0x15, 1 ; 21
}
ptr_rxd_buffer = 0; // reset rxd buffer pointer
834: 10 92 31 01 sts 0x0131, r1
usart_rx_ok = 0;
838: 10 92 2e 01 sts 0x012E, r1
83c: 6a cf rjmp .-300 ; 0x712 <__vector_20+0x4a>
// calculate checksum from transmitted data
crc %= 4096;
crc1 = '=' + crc / 64;
crc2 = '=' + crc % 64;
// compare checksum to transmitted checksum bytes
if ((crc1 == rxd_buffer[ptr_rxd_buffer - 2]) && (crc2 == rxd_buffer[ptr_rxd_buffer - 1])) { // checksum valid
83e: 98 81 ld r25, Y
840: 84 2f mov r24, r20
842: 8f 73 andi r24, 0x3F ; 63
844: 83 5c subi r24, 0xC3 ; 195
846: 98 17 cp r25, r24
848: 91 f7 brne .-28 ; 0x82e <__vector_20+0x166>
rxd_buffer[ptr_rxd_buffer] = '\r'; // set termination character
84a: a4 51 subi r26, 0x14 ; 20
84c: be 4f sbci r27, 0xFE ; 254
84e: 6c 93 st X, r22
ReceivedBytes = ptr_rxd_buffer + 1; // store number of received bytes
850: 3f 5f subi r19, 0xFF ; 255
852: 30 93 2a 01 sts 0x012A, r19
rxd_buffer_locked = 1; // lock the rxd buffer
856: 81 e0 ldi r24, 0x01 ; 1
858: 80 93 29 01 sts 0x0129, r24
LED1_OFF
85c: a8 98 cbi 0x15, 0 ; 21
85e: ea cf rjmp .-44 ; 0x834 <__vector_20+0x16c>
 
00000860 <Decode64>:
void Decode64(void) {
uint8_t a, b, c, d;
uint8_t x, y, z;
uint8_t ptrIn = 3;
uint8_t ptrOut = 3;
uint8_t len = ReceivedBytes - 6;
860: 50 91 2a 01 lds r21, 0x012A
864: 56 50 subi r21, 0x06 ; 6
 
while (len) {
866: 09 f4 brne .+2 ; 0x86a <Decode64+0xa>
868: 57 c0 rjmp .+174 ; 0x918 <Decode64+0xb8>
86a: 33 e0 ldi r19, 0x03 ; 3
86c: 43 e0 ldi r20, 0x03 ; 3
86e: 1e c0 rjmp .+60 ; 0x8ac <Decode64+0x4c>
a = rxd_buffer[ptrIn++] - '=';
b = rxd_buffer[ptrIn++] - '=';
c = rxd_buffer[ptrIn++] - '=';
870: 97 2f mov r25, r23
872: 9d 53 subi r25, 0x3D ; 61
y = ((b & 0x0f) << 4) | (c >> 2);
z = ((c & 0x03) << 6) | d;
 
if (len--) rxd_buffer[ptrOut++] = x;
else break;
if (len--) rxd_buffer[ptrOut++] = y;
874: f0 e0 ldi r31, 0x00 ; 0
b = rxd_buffer[ptrIn++] - '=';
c = rxd_buffer[ptrIn++] - '=';
d = rxd_buffer[ptrIn++] - '=';
 
x = (a << 2) | (b >> 4);
y = ((b & 0x0f) << 4) | (c >> 2);
876: 22 95 swap r18
878: 20 7f andi r18, 0xF0 ; 240
87a: 89 2f mov r24, r25
87c: 86 95 lsr r24
87e: 86 95 lsr r24
880: 28 2b or r18, r24
z = ((c & 0x03) << 6) | d;
 
if (len--) rxd_buffer[ptrOut++] = x;
else break;
if (len--) rxd_buffer[ptrOut++] = y;
882: e4 51 subi r30, 0x14 ; 20
884: fe 4f sbci r31, 0xFE ; 254
886: 20 83 st Z, r18
888: e4 2f mov r30, r20
88a: ee 5f subi r30, 0xFE ; 254
else break;
if (len--) rxd_buffer[ptrOut++] = z;
88c: 52 30 cpi r21, 0x02 ; 2
88e: c1 f1 breq .+112 ; 0x900 <Decode64+0xa0>
890: 53 50 subi r21, 0x03 ; 3
892: f0 e0 ldi r31, 0x00 ; 0
c = rxd_buffer[ptrIn++] - '=';
d = rxd_buffer[ptrIn++] - '=';
 
x = (a << 2) | (b >> 4);
y = ((b & 0x0f) << 4) | (c >> 2);
z = ((c & 0x03) << 6) | d;
894: 92 95 swap r25
896: 99 0f add r25, r25
898: 99 0f add r25, r25
89a: 90 7c andi r25, 0xC0 ; 192
89c: 6d 53 subi r22, 0x3D ; 61
89e: 96 2b or r25, r22
 
if (len--) rxd_buffer[ptrOut++] = x;
else break;
if (len--) rxd_buffer[ptrOut++] = y;
else break;
if (len--) rxd_buffer[ptrOut++] = z;
8a0: e4 51 subi r30, 0x14 ; 20
8a2: fe 4f sbci r31, 0xFE ; 254
8a4: 90 83 st Z, r25
8a6: 4d 5f subi r20, 0xFD ; 253
uint8_t x, y, z;
uint8_t ptrIn = 3;
uint8_t ptrOut = 3;
uint8_t len = ReceivedBytes - 6;
 
while (len) {
8a8: 55 23 and r21, r21
8aa: a1 f1 breq .+104 ; 0x914 <Decode64+0xb4>
a = rxd_buffer[ptrIn++] - '=';
8ac: e3 2f mov r30, r19
8ae: f0 e0 ldi r31, 0x00 ; 0
8b0: e4 51 subi r30, 0x14 ; 20
8b2: fe 4f sbci r31, 0xFE ; 254
8b4: 80 81 ld r24, Z
b = rxd_buffer[ptrIn++] - '=';
8b6: 3f 5f subi r19, 0xFF ; 255
8b8: e3 2f mov r30, r19
8ba: f0 e0 ldi r31, 0x00 ; 0
8bc: e4 51 subi r30, 0x14 ; 20
8be: fe 4f sbci r31, 0xFE ; 254
8c0: 20 81 ld r18, Z
8c2: 2d 53 subi r18, 0x3D ; 61
c = rxd_buffer[ptrIn++] - '=';
8c4: 3f 5f subi r19, 0xFF ; 255
8c6: e3 2f mov r30, r19
8c8: f0 e0 ldi r31, 0x00 ; 0
8ca: e4 51 subi r30, 0x14 ; 20
8cc: fe 4f sbci r31, 0xFE ; 254
8ce: 70 81 ld r23, Z
d = rxd_buffer[ptrIn++] - '=';
8d0: 3f 5f subi r19, 0xFF ; 255
8d2: e3 2f mov r30, r19
8d4: f0 e0 ldi r31, 0x00 ; 0
8d6: e4 51 subi r30, 0x14 ; 20
8d8: fe 4f sbci r31, 0xFE ; 254
8da: 60 81 ld r22, Z
8dc: 3f 5f subi r19, 0xFF ; 255
 
x = (a << 2) | (b >> 4);
8de: 92 2f mov r25, r18
8e0: 92 95 swap r25
8e2: 9f 70 andi r25, 0x0F ; 15
8e4: 8d 53 subi r24, 0x3D ; 61
8e6: 88 0f add r24, r24
8e8: 88 0f add r24, r24
8ea: 89 2b or r24, r25
y = ((b & 0x0f) << 4) | (c >> 2);
z = ((c & 0x03) << 6) | d;
 
if (len--) rxd_buffer[ptrOut++] = x;
8ec: e4 2f mov r30, r20
8ee: f0 e0 ldi r31, 0x00 ; 0
8f0: e4 51 subi r30, 0x14 ; 20
8f2: fe 4f sbci r31, 0xFE ; 254
8f4: 80 83 st Z, r24
8f6: e4 2f mov r30, r20
8f8: ef 5f subi r30, 0xFF ; 255
else break;
if (len--) rxd_buffer[ptrOut++] = y;
8fa: 51 30 cpi r21, 0x01 ; 1
8fc: 09 f0 breq .+2 ; 0x900 <Decode64+0xa0>
8fe: b8 cf rjmp .-144 ; 0x870 <Decode64+0x10>
uint8_t x, y, z;
uint8_t ptrIn = 3;
uint8_t ptrOut = 3;
uint8_t len = ReceivedBytes - 6;
 
while (len) {
900: e3 50 subi r30, 0x03 ; 3
if (len--) rxd_buffer[ptrOut++] = y;
else break;
if (len--) rxd_buffer[ptrOut++] = z;
else break;
}
pRxData = &rxd_buffer[3];
902: 8f ee ldi r24, 0xEF ; 239
904: 91 e0 ldi r25, 0x01 ; 1
906: 90 93 2c 01 sts 0x012C, r25
90a: 80 93 2b 01 sts 0x012B, r24
RxDataLen = ptrOut - 3;
90e: e0 93 2d 01 sts 0x012D, r30
}
912: 08 95 ret
uint8_t x, y, z;
uint8_t ptrIn = 3;
uint8_t ptrOut = 3;
uint8_t len = ReceivedBytes - 6;
 
while (len) {
914: e4 2f mov r30, r20
916: f4 cf rjmp .-24 ; 0x900 <Decode64+0xa0>
918: e0 e0 ldi r30, 0x00 ; 0
91a: f3 cf rjmp .-26 ; 0x902 <Decode64+0xa2>
 
0000091c <spi_send>:
* Send a byte through SPI
* inline because it increases the codesize currenlty 'only' by 110byte but saves
* the context-change on every char and attribute which is at least done twice
* (address and data byte), a significant speed-bost we do not want to miss :)
*/
inline void spi_send(uint8_t byte) {
91c: 48 2f mov r20, r24
91e: 50 e0 ldi r21, 0x00 ; 0
920: 27 e0 ldi r18, 0x07 ; 7
922: 30 e0 ldi r19, 0x00 ; 0
924: 09 c0 rjmp .+18 ; 0x938 <spi_send+0x1c>
for (int8_t i = 7; i >= 0; i--) {
if (((byte >> i) & 1)) {
MAX_SDIN_HIGH
926: da 9a sbi 0x1b, 2 ; 27
} else {
MAX_SDIN_LOW
}
MAX_SCLK_HIGH
928: db 9a sbi 0x1b, 3 ; 27
MAX_SCLK_LOW
92a: db 98 cbi 0x1b, 3 ; 27
92c: 21 50 subi r18, 0x01 ; 1
92e: 30 40 sbci r19, 0x00 ; 0
* inline because it increases the codesize currenlty 'only' by 110byte but saves
* the context-change on every char and attribute which is at least done twice
* (address and data byte), a significant speed-bost we do not want to miss :)
*/
inline void spi_send(uint8_t byte) {
for (int8_t i = 7; i >= 0; i--) {
930: 8f ef ldi r24, 0xFF ; 255
932: 2f 3f cpi r18, 0xFF ; 255
934: 38 07 cpc r19, r24
936: 91 f0 breq .+36 ; 0x95c <spi_send+0x40>
if (((byte >> i) & 1)) {
938: ca 01 movw r24, r20
93a: 02 2e mov r0, r18
93c: 02 c0 rjmp .+4 ; 0x942 <spi_send+0x26>
93e: 95 95 asr r25
940: 87 95 ror r24
942: 0a 94 dec r0
944: e2 f7 brpl .-8 ; 0x93e <spi_send+0x22>
946: 80 fd sbrc r24, 0
948: ee cf rjmp .-36 ; 0x926 <spi_send+0xa>
MAX_SDIN_HIGH
} else {
MAX_SDIN_LOW
94a: da 98 cbi 0x1b, 2 ; 27
}
MAX_SCLK_HIGH
94c: db 9a sbi 0x1b, 3 ; 27
MAX_SCLK_LOW
94e: db 98 cbi 0x1b, 3 ; 27
950: 21 50 subi r18, 0x01 ; 1
952: 30 40 sbci r19, 0x00 ; 0
* inline because it increases the codesize currenlty 'only' by 110byte but saves
* the context-change on every char and attribute which is at least done twice
* (address and data byte), a significant speed-bost we do not want to miss :)
*/
inline void spi_send(uint8_t byte) {
for (int8_t i = 7; i >= 0; i--) {
954: 8f ef ldi r24, 0xFF ; 255
956: 2f 3f cpi r18, 0xFF ; 255
958: 38 07 cpc r19, r24
95a: 71 f7 brne .-36 ; 0x938 <spi_send+0x1c>
MAX_SDIN_LOW
}
MAX_SCLK_HIGH
MAX_SCLK_LOW
}
}
95c: 08 95 ret
 
0000095e <spi_send_byte>:
/**
* Send <byte> to <address> of MAX7456
*/
void spi_send_byte(uint8_t address, uint8_t byte) {
// start sending
MAX_CS_LOW
95e: d9 98 cbi 0x1b, 1 ; 27
960: 48 2f mov r20, r24
962: 50 e0 ldi r21, 0x00 ; 0
964: 27 e0 ldi r18, 0x07 ; 7
966: 30 e0 ldi r19, 0x00 ; 0
968: 09 c0 rjmp .+18 ; 0x97c <spi_send_byte+0x1e>
* (address and data byte), a significant speed-bost we do not want to miss :)
*/
inline void spi_send(uint8_t byte) {
for (int8_t i = 7; i >= 0; i--) {
if (((byte >> i) & 1)) {
MAX_SDIN_HIGH
96a: da 9a sbi 0x1b, 2 ; 27
} else {
MAX_SDIN_LOW
}
MAX_SCLK_HIGH
96c: db 9a sbi 0x1b, 3 ; 27
MAX_SCLK_LOW
96e: db 98 cbi 0x1b, 3 ; 27
970: 21 50 subi r18, 0x01 ; 1
972: 30 40 sbci r19, 0x00 ; 0
* inline because it increases the codesize currenlty 'only' by 110byte but saves
* the context-change on every char and attribute which is at least done twice
* (address and data byte), a significant speed-bost we do not want to miss :)
*/
inline void spi_send(uint8_t byte) {
for (int8_t i = 7; i >= 0; i--) {
974: 8f ef ldi r24, 0xFF ; 255
976: 2f 3f cpi r18, 0xFF ; 255
978: 38 07 cpc r19, r24
97a: 91 f0 breq .+36 ; 0x9a0 <spi_send_byte+0x42>
if (((byte >> i) & 1)) {
97c: ca 01 movw r24, r20
97e: 02 2e mov r0, r18
980: 02 c0 rjmp .+4 ; 0x986 <spi_send_byte+0x28>
982: 95 95 asr r25
984: 87 95 ror r24
986: 0a 94 dec r0
988: e2 f7 brpl .-8 ; 0x982 <spi_send_byte+0x24>
98a: 80 fd sbrc r24, 0
98c: ee cf rjmp .-36 ; 0x96a <spi_send_byte+0xc>
MAX_SDIN_HIGH
} else {
MAX_SDIN_LOW
98e: da 98 cbi 0x1b, 2 ; 27
}
MAX_SCLK_HIGH
990: db 9a sbi 0x1b, 3 ; 27
MAX_SCLK_LOW
992: db 98 cbi 0x1b, 3 ; 27
994: 21 50 subi r18, 0x01 ; 1
996: 30 40 sbci r19, 0x00 ; 0
* inline because it increases the codesize currenlty 'only' by 110byte but saves
* the context-change on every char and attribute which is at least done twice
* (address and data byte), a significant speed-bost we do not want to miss :)
*/
inline void spi_send(uint8_t byte) {
for (int8_t i = 7; i >= 0; i--) {
998: 8f ef ldi r24, 0xFF ; 255
99a: 2f 3f cpi r18, 0xFF ; 255
99c: 38 07 cpc r19, r24
99e: 71 f7 brne .-36 ; 0x97c <spi_send_byte+0x1e>
9a0: 70 e0 ldi r23, 0x00 ; 0
9a2: 27 e0 ldi r18, 0x07 ; 7
9a4: 30 e0 ldi r19, 0x00 ; 0
9a6: 09 c0 rjmp .+18 ; 0x9ba <spi_send_byte+0x5c>
if (((byte >> i) & 1)) {
MAX_SDIN_HIGH
9a8: da 9a sbi 0x1b, 2 ; 27
} else {
MAX_SDIN_LOW
}
MAX_SCLK_HIGH
9aa: db 9a sbi 0x1b, 3 ; 27
MAX_SCLK_LOW
9ac: db 98 cbi 0x1b, 3 ; 27
9ae: 21 50 subi r18, 0x01 ; 1
9b0: 30 40 sbci r19, 0x00 ; 0
* inline because it increases the codesize currenlty 'only' by 110byte but saves
* the context-change on every char and attribute which is at least done twice
* (address and data byte), a significant speed-bost we do not want to miss :)
*/
inline void spi_send(uint8_t byte) {
for (int8_t i = 7; i >= 0; i--) {
9b2: 8f ef ldi r24, 0xFF ; 255
9b4: 2f 3f cpi r18, 0xFF ; 255
9b6: 38 07 cpc r19, r24
9b8: 91 f0 breq .+36 ; 0x9de <spi_send_byte+0x80>
if (((byte >> i) & 1)) {
9ba: cb 01 movw r24, r22
9bc: 02 2e mov r0, r18
9be: 02 c0 rjmp .+4 ; 0x9c4 <spi_send_byte+0x66>
9c0: 95 95 asr r25
9c2: 87 95 ror r24
9c4: 0a 94 dec r0
9c6: e2 f7 brpl .-8 ; 0x9c0 <spi_send_byte+0x62>
9c8: 80 fd sbrc r24, 0
9ca: ee cf rjmp .-36 ; 0x9a8 <spi_send_byte+0x4a>
MAX_SDIN_HIGH
} else {
MAX_SDIN_LOW
9cc: da 98 cbi 0x1b, 2 ; 27
}
MAX_SCLK_HIGH
9ce: db 9a sbi 0x1b, 3 ; 27
MAX_SCLK_LOW
9d0: db 98 cbi 0x1b, 3 ; 27
9d2: 21 50 subi r18, 0x01 ; 1
9d4: 30 40 sbci r19, 0x00 ; 0
* inline because it increases the codesize currenlty 'only' by 110byte but saves
* the context-change on every char and attribute which is at least done twice
* (address and data byte), a significant speed-bost we do not want to miss :)
*/
inline void spi_send(uint8_t byte) {
for (int8_t i = 7; i >= 0; i--) {
9d6: 8f ef ldi r24, 0xFF ; 255
9d8: 2f 3f cpi r18, 0xFF ; 255
9da: 38 07 cpc r19, r24
9dc: 71 f7 brne .-36 ; 0x9ba <spi_send_byte+0x5c>
 
spi_send(address);
spi_send(byte);
 
// end sending
MAX_CS_HIGH
9de: d9 9a sbi 0x1b, 1 ; 27
}
9e0: 08 95 ret
 
000009e2 <write_char>:
 
 
/**
* write a <character> to <address> of MAX7456 display memory
*/
void write_char(uint16_t address, char character) {
9e2: 0f 93 push r16
9e4: 1f 93 push r17
9e6: 18 2f mov r17, r24
9e8: 06 2f mov r16, r22
spi_send_byte(0x05, (address & 0xFF00) >> 8); // DMAH
9ea: 85 e0 ldi r24, 0x05 ; 5
9ec: 69 2f mov r22, r25
9ee: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
spi_send_byte(0x06, (address & 0x00FF)); // DMAL
9f2: 86 e0 ldi r24, 0x06 ; 6
9f4: 61 2f mov r22, r17
9f6: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
spi_send_byte(0x07, character); // DMDI
9fa: 87 e0 ldi r24, 0x07 ; 7
9fc: 60 2f mov r22, r16
9fe: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
}
a02: 1f 91 pop r17
a04: 0f 91 pop r16
a06: 08 95 ret
 
00000a08 <write_char_xy>:
/**
* write a <character> at <x>/<y> to MAX7456 display memory
*/
void write_char_xy(uint8_t x, uint8_t y, char character) {
uint16_t address = y * 30 + x;
write_char(address, character);
a08: 9e e1 ldi r25, 0x1E ; 30
a0a: 69 9f mul r22, r25
a0c: b0 01 movw r22, r0
a0e: 11 24 eor r1, r1
a10: 9b 01 movw r18, r22
a12: 28 0f add r18, r24
a14: 31 1d adc r19, r1
a16: c9 01 movw r24, r18
a18: 64 2f mov r22, r20
a1a: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
}
a1e: 08 95 ret
 
00000a20 <write_ascii_char>:
}
 
/**
* write an ascii <character> to <address> of MAX7456 display memory
*/
void write_ascii_char(uint16_t address, char c) {
a20: 9c 01 movw r18, r24
if (c == 32) c = 0; // remap space
a22: 60 32 cpi r22, 0x20 ; 32
a24: 19 f1 breq .+70 ; 0xa6c <write_ascii_char+0x4c>
else if (c > 48 && c <= 57) c -= 48; // remap numbers
a26: 86 2f mov r24, r22
a28: 81 53 subi r24, 0x31 ; 49
a2a: 89 30 cpi r24, 0x09 ; 9
a2c: d0 f0 brcs .+52 ; 0xa62 <write_ascii_char+0x42>
else if (c == '0') c = 10; // remap zero
a2e: 60 33 cpi r22, 0x30 ; 48
a30: 39 f1 breq .+78 ; 0xa80 <write_ascii_char+0x60>
else if (c >= 65 && c <= 90) c -= 54; // remap big letters
a32: 86 2f mov r24, r22
a34: 81 54 subi r24, 0x41 ; 65
a36: 8a 31 cpi r24, 0x1A ; 26
a38: f0 f0 brcs .+60 ; 0xa76 <write_ascii_char+0x56>
else if (c >= 97 && c <= 122) c -= 60; // remap small letters
a3a: 86 2f mov r24, r22
a3c: 81 56 subi r24, 0x61 ; 97
a3e: 8a 31 cpi r24, 0x1A ; 26
a40: 20 f1 brcs .+72 ; 0xa8a <write_ascii_char+0x6a>
else if (c == '(') c = 63; // remap
a42: 68 32 cpi r22, 0x28 ; 40
a44: 31 f1 breq .+76 ; 0xa92 <write_ascii_char+0x72>
else if (c == ')') c = 64; // remap
a46: 69 32 cpi r22, 0x29 ; 41
a48: 11 f1 breq .+68 ; 0xa8e <write_ascii_char+0x6e>
else if (c == '.') c = 65; // remap
a4a: 6e 32 cpi r22, 0x2E ; 46
a4c: 21 f1 breq .+72 ; 0xa96 <write_ascii_char+0x76>
else if (c == '-') c = 73; // remap minus
a4e: 6d 32 cpi r22, 0x2D ; 45
a50: 21 f1 breq .+72 ; 0xa9a <write_ascii_char+0x7a>
else if (c == ';') c = 67; // remap
a52: 6b 33 cpi r22, 0x3B ; 59
a54: 21 f1 breq .+72 ; 0xa9e <write_ascii_char+0x7e>
else if (c == ':') c = 68; // remap
a56: 6a 33 cpi r22, 0x3A ; 58
a58: 21 f1 breq .+72 ; 0xaa2 <write_ascii_char+0x82>
else if (c == ',') c = 69; // remap
a5a: 6c 32 cpi r22, 0x2C ; 44
a5c: 19 f4 brne .+6 ; 0xa64 <write_ascii_char+0x44>
a5e: 65 e4 ldi r22, 0x45 ; 69
a60: 01 c0 rjmp .+2 ; 0xa64 <write_ascii_char+0x44>
/**
* write an ascii <character> to <address> of MAX7456 display memory
*/
void write_ascii_char(uint16_t address, char c) {
if (c == 32) c = 0; // remap space
else if (c > 48 && c <= 57) c -= 48; // remap numbers
a62: 60 53 subi r22, 0x30 ; 48
// else if (c == '/') c = 71; // remap
// else if (c == '"') c = 72; // remap
// else if (c == '<') c = 74; // remap
// else if (c == '>') c = 75; // remap
// else if (c == '@') c = 76; // remap
write_char(address, c);
a64: c9 01 movw r24, r18
a66: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
}
a6a: 08 95 ret
 
/**
* write an ascii <character> to <address> of MAX7456 display memory
*/
void write_ascii_char(uint16_t address, char c) {
if (c == 32) c = 0; // remap space
a6c: 60 e0 ldi r22, 0x00 ; 0
// else if (c == '/') c = 71; // remap
// else if (c == '"') c = 72; // remap
// else if (c == '<') c = 74; // remap
// else if (c == '>') c = 75; // remap
// else if (c == '@') c = 76; // remap
write_char(address, c);
a6e: c9 01 movw r24, r18
a70: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
}
a74: 08 95 ret
*/
void write_ascii_char(uint16_t address, char c) {
if (c == 32) c = 0; // remap space
else if (c > 48 && c <= 57) c -= 48; // remap numbers
else if (c == '0') c = 10; // remap zero
else if (c >= 65 && c <= 90) c -= 54; // remap big letters
a76: 66 53 subi r22, 0x36 ; 54
// else if (c == '/') c = 71; // remap
// else if (c == '"') c = 72; // remap
// else if (c == '<') c = 74; // remap
// else if (c == '>') c = 75; // remap
// else if (c == '@') c = 76; // remap
write_char(address, c);
a78: c9 01 movw r24, r18
a7a: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
}
a7e: 08 95 ret
* write an ascii <character> to <address> of MAX7456 display memory
*/
void write_ascii_char(uint16_t address, char c) {
if (c == 32) c = 0; // remap space
else if (c > 48 && c <= 57) c -= 48; // remap numbers
else if (c == '0') c = 10; // remap zero
a80: 6a e0 ldi r22, 0x0A ; 10
// else if (c == '/') c = 71; // remap
// else if (c == '"') c = 72; // remap
// else if (c == '<') c = 74; // remap
// else if (c == '>') c = 75; // remap
// else if (c == '@') c = 76; // remap
write_char(address, c);
a82: c9 01 movw r24, r18
a84: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
}
a88: 08 95 ret
void write_ascii_char(uint16_t address, char c) {
if (c == 32) c = 0; // remap space
else if (c > 48 && c <= 57) c -= 48; // remap numbers
else if (c == '0') c = 10; // remap zero
else if (c >= 65 && c <= 90) c -= 54; // remap big letters
else if (c >= 97 && c <= 122) c -= 60; // remap small letters
a8a: 6c 53 subi r22, 0x3C ; 60
a8c: eb cf rjmp .-42 ; 0xa64 <write_ascii_char+0x44>
else if (c == '(') c = 63; // remap
else if (c == ')') c = 64; // remap
a8e: 60 e4 ldi r22, 0x40 ; 64
a90: e9 cf rjmp .-46 ; 0xa64 <write_ascii_char+0x44>
if (c == 32) c = 0; // remap space
else if (c > 48 && c <= 57) c -= 48; // remap numbers
else if (c == '0') c = 10; // remap zero
else if (c >= 65 && c <= 90) c -= 54; // remap big letters
else if (c >= 97 && c <= 122) c -= 60; // remap small letters
else if (c == '(') c = 63; // remap
a92: 6f e3 ldi r22, 0x3F ; 63
a94: e7 cf rjmp .-50 ; 0xa64 <write_ascii_char+0x44>
else if (c == ')') c = 64; // remap
else if (c == '.') c = 65; // remap
a96: 61 e4 ldi r22, 0x41 ; 65
a98: e5 cf rjmp .-54 ; 0xa64 <write_ascii_char+0x44>
else if (c == '-') c = 73; // remap minus
a9a: 69 e4 ldi r22, 0x49 ; 73
a9c: e3 cf rjmp .-58 ; 0xa64 <write_ascii_char+0x44>
else if (c == ';') c = 67; // remap
a9e: 63 e4 ldi r22, 0x43 ; 67
aa0: e1 cf rjmp .-62 ; 0xa64 <write_ascii_char+0x44>
else if (c == ':') c = 68; // remap
aa2: 64 e4 ldi r22, 0x44 ; 68
aa4: df cf rjmp .-66 ; 0xa64 <write_ascii_char+0x44>
 
00000aa6 <write_ascii_string>:
}
 
/**
* write an ascii <string> at <x>/<y> to MAX7456 display memory
*/
void write_ascii_string(uint8_t x, uint8_t y, char *string) {
aa6: ff 92 push r15
aa8: 0f 93 push r16
aaa: 1f 93 push r17
aac: cf 93 push r28
aae: df 93 push r29
ab0: f8 2e mov r15, r24
ab2: ea 01 movw r28, r20
while (*string) {
ab4: 48 81 ld r20, Y
ab6: 44 23 and r20, r20
ab8: d9 f0 breq .+54 ; 0xaf0 <write_ascii_string+0x4a>
aba: 26 2f mov r18, r22
abc: 30 e0 ldi r19, 0x00 ; 0
abe: c9 01 movw r24, r18
ac0: 88 0f add r24, r24
ac2: 99 1f adc r25, r25
ac4: 82 0f add r24, r18
ac6: 93 1f adc r25, r19
ac8: 8c 01 movw r16, r24
aca: 00 0f add r16, r16
acc: 11 1f adc r17, r17
ace: 00 0f add r16, r16
ad0: 11 1f adc r17, r17
ad2: 08 0f add r16, r24
ad4: 19 1f adc r17, r25
ad6: 00 0f add r16, r16
ad8: 11 1f adc r17, r17
write_ascii_char(((x++)+(y * 30)), *string);
ada: c8 01 movw r24, r16
adc: 8f 0d add r24, r15
ade: 91 1d adc r25, r1
ae0: f3 94 inc r15
ae2: 64 2f mov r22, r20
ae4: 0e 94 10 05 call 0xa20 ; 0xa20 <write_ascii_char>
string++;
ae8: 21 96 adiw r28, 0x01 ; 1
 
/**
* write an ascii <string> at <x>/<y> to MAX7456 display memory
*/
void write_ascii_string(uint8_t x, uint8_t y, char *string) {
while (*string) {
aea: 48 81 ld r20, Y
aec: 44 23 and r20, r20
aee: a9 f7 brne .-22 ; 0xada <write_ascii_string+0x34>
write_ascii_char(((x++)+(y * 30)), *string);
string++;
}
}
af0: df 91 pop r29
af2: cf 91 pop r28
af4: 1f 91 pop r17
af6: 0f 91 pop r16
af8: ff 90 pop r15
afa: 08 95 ret
 
00000afc <write_ascii_string_pgm>:
 
/**
* write an ascii <string> from progmen at <x>/<y> to MAX7456 display memory
*/
void write_ascii_string_pgm(uint8_t x, uint8_t y, const char *string) {
afc: ff 92 push r15
afe: 0f 93 push r16
b00: 1f 93 push r17
b02: cf 93 push r28
b04: df 93 push r29
b06: f8 2e mov r15, r24
b08: ea 01 movw r28, r20
while (pgm_read_byte(string) != 0x00)
b0a: fe 01 movw r30, r28
b0c: 84 91 lpm r24, Z+
b0e: 88 23 and r24, r24
b10: f1 f0 breq .+60 ; 0xb4e <write_ascii_string_pgm+0x52>
b12: 26 2f mov r18, r22
b14: 30 e0 ldi r19, 0x00 ; 0
b16: c9 01 movw r24, r18
b18: 88 0f add r24, r24
b1a: 99 1f adc r25, r25
b1c: 82 0f add r24, r18
b1e: 93 1f adc r25, r19
b20: 8c 01 movw r16, r24
b22: 00 0f add r16, r16
b24: 11 1f adc r17, r17
b26: 00 0f add r16, r16
b28: 11 1f adc r17, r17
b2a: 08 0f add r16, r24
b2c: 19 1f adc r17, r25
b2e: 00 0f add r16, r16
b30: 11 1f adc r17, r17
write_ascii_char(((x++)+(y * 30)), pgm_read_byte(string++));
b32: c8 01 movw r24, r16
b34: 8f 0d add r24, r15
b36: 91 1d adc r25, r1
b38: f3 94 inc r15
b3a: 21 96 adiw r28, 0x01 ; 1
b3c: fa 01 movw r30, r20
b3e: 64 91 lpm r22, Z+
b40: 0e 94 10 05 call 0xa20 ; 0xa20 <write_ascii_char>
b44: ae 01 movw r20, r28
 
/**
* write an ascii <string> from progmen at <x>/<y> to MAX7456 display memory
*/
void write_ascii_string_pgm(uint8_t x, uint8_t y, const char *string) {
while (pgm_read_byte(string) != 0x00)
b46: fe 01 movw r30, r28
b48: 84 91 lpm r24, Z+
b4a: 88 23 and r24, r24
b4c: 91 f7 brne .-28 ; 0xb32 <write_ascii_string_pgm+0x36>
write_ascii_char(((x++)+(y * 30)), pgm_read_byte(string++));
}
b4e: df 91 pop r29
b50: cf 91 pop r28
b52: 1f 91 pop r17
b54: 0f 91 pop r16
b56: ff 90 pop r15
b58: 08 95 ret
 
00000b5a <write_string_pgm_down>:
 
/**
* write an <string> from progmen at <x>/<y> downwards to MAX7456 display memory
*/
void write_string_pgm_down(uint8_t x, uint8_t y, const char *string, uint8_t length) {
b5a: df 92 push r13
b5c: ef 92 push r14
b5e: ff 92 push r15
b60: 0f 93 push r16
b62: 1f 93 push r17
b64: cf 93 push r28
b66: df 93 push r29
b68: 06 2f mov r16, r22
b6a: ea 01 movw r28, r20
b6c: 12 2f mov r17, r18
while (length--)
b6e: 22 23 and r18, r18
b70: 91 f0 breq .+36 ; 0xb96 <write_string_pgm_down+0x3c>
b72: e8 2e mov r14, r24
b74: ff 24 eor r15, r15
write_char((x+(y++ * 30)), pgm_read_byte(string++));
b76: fe e1 ldi r31, 0x1E ; 30
b78: df 2e mov r13, r31
b7a: 0d 9d mul r16, r13
b7c: c0 01 movw r24, r0
b7e: 11 24 eor r1, r1
b80: 0f 5f subi r16, 0xFF ; 255
b82: fe 01 movw r30, r28
b84: 21 96 adiw r28, 0x01 ; 1
b86: e4 91 lpm r30, Z+
b88: 8e 0d add r24, r14
b8a: 9f 1d adc r25, r15
b8c: 6e 2f mov r22, r30
b8e: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
b92: 11 50 subi r17, 0x01 ; 1
 
/**
* write an <string> from progmen at <x>/<y> downwards to MAX7456 display memory
*/
void write_string_pgm_down(uint8_t x, uint8_t y, const char *string, uint8_t length) {
while (length--)
b94: 91 f7 brne .-28 ; 0xb7a <write_string_pgm_down+0x20>
write_char((x+(y++ * 30)), pgm_read_byte(string++));
}
b96: df 91 pop r29
b98: cf 91 pop r28
b9a: 1f 91 pop r17
b9c: 0f 91 pop r16
b9e: ff 90 pop r15
ba0: ef 90 pop r14
ba2: df 90 pop r13
ba4: 08 95 ret
 
00000ba6 <write_ndigit_number_s_10th>:
/**
* Write a signed <number> at <x>/<y> to MAX7456 display memory as /10th of value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s_10th(uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad) {
ba6: 8f 92 push r8
ba8: 9f 92 push r9
baa: af 92 push r10
bac: bf 92 push r11
bae: cf 92 push r12
bb0: df 92 push r13
bb2: ef 92 push r14
bb4: ff 92 push r15
bb6: 0f 93 push r16
bb8: 1f 93 push r17
bba: cf 93 push r28
bbc: df 93 push r29
bbe: d8 2e mov r13, r24
bc0: 86 2e mov r8, r22
bc2: ca 01 movw r24, r20
bc4: e9 01 movw r28, r18
bc6: c0 2e mov r12, r16
itoa(number, conv_array, 10 );
bc8: 06 e9 ldi r16, 0x96 ; 150
bca: 12 e0 ldi r17, 0x02 ; 2
bcc: b8 01 movw r22, r16
bce: 4a e0 ldi r20, 0x0A ; 10
bd0: 50 e0 ldi r21, 0x00 ; 0
bd2: 0e 94 cc 1c call 0x3998 ; 0x3998 <itoa>
uint8_t len = strlen(conv_array);
bd6: f8 01 movw r30, r16
bd8: 01 90 ld r0, Z+
bda: 00 20 and r0, r0
bdc: e9 f7 brne .-6 ; 0xbd8 <write_ndigit_number_s_10th+0x32>
bde: 8f 01 movw r16, r30
be0: 01 50 subi r16, 0x01 ; 1
be2: 10 40 sbci r17, 0x00 ; 0
be4: 06 59 subi r16, 0x96 ; 150
be6: 12 40 sbci r17, 0x02 ; 2
be8: 90 2e mov r9, r16
for (uint8_t i = 0; i < length - len; i++) {
bea: a0 2e mov r10, r16
bec: bb 24 eor r11, r11
bee: ca 19 sub r28, r10
bf0: db 09 sbc r29, r11
bf2: 1c 16 cp r1, r28
bf4: 1d 06 cpc r1, r29
bf6: 0c f0 brlt .+2 ; 0xbfa <write_ndigit_number_s_10th+0x54>
bf8: 74 c0 rjmp .+232 ; 0xce2 <write_ndigit_number_s_10th+0x13c>
bfa: 8e e1 ldi r24, 0x1E ; 30
bfc: 88 9e mul r8, r24
bfe: 70 01 movw r14, r0
c00: 11 24 eor r1, r1
c02: d3 94 inc r13
c04: 10 e0 ldi r17, 0x00 ; 0
c06: 10 c0 rjmp .+32 ; 0xc28 <write_ndigit_number_s_10th+0x82>
if (pad) write_char((x++)+(y * 30), 10); // zero
c08: 97 01 movw r18, r14
c0a: 28 0f add r18, r24
c0c: 31 1d adc r19, r1
c0e: c9 01 movw r24, r18
c10: 6a e0 ldi r22, 0x0A ; 10
c12: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s_10th(uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
uint8_t len = strlen(conv_array);
for (uint8_t i = 0; i < length - len; i++) {
c16: 1f 5f subi r17, 0xFF ; 255
c18: 2d 2d mov r18, r13
c1a: 2f 5f subi r18, 0xFF ; 255
c1c: 81 2f mov r24, r17
c1e: 90 e0 ldi r25, 0x00 ; 0
c20: 8c 17 cp r24, r28
c22: 9d 07 cpc r25, r29
c24: a4 f4 brge .+40 ; 0xc4e <write_ndigit_number_s_10th+0xa8>
c26: d2 2e mov r13, r18
c28: 8d 2d mov r24, r13
c2a: 81 50 subi r24, 0x01 ; 1
if (pad) write_char((x++)+(y * 30), 10); // zero
c2c: cc 20 and r12, r12
c2e: 61 f7 brne .-40 ; 0xc08 <write_ndigit_number_s_10th+0x62>
else write_char((x++)+(y * 30), 0); // blank
c30: f7 01 movw r30, r14
c32: e8 0f add r30, r24
c34: f1 1d adc r31, r1
c36: cf 01 movw r24, r30
c38: 60 e0 ldi r22, 0x00 ; 0
c3a: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s_10th(uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
uint8_t len = strlen(conv_array);
for (uint8_t i = 0; i < length - len; i++) {
c3e: 1f 5f subi r17, 0xFF ; 255
c40: 2d 2d mov r18, r13
c42: 2f 5f subi r18, 0xFF ; 255
c44: 81 2f mov r24, r17
c46: 90 e0 ldi r25, 0x00 ; 0
c48: 8c 17 cp r24, r28
c4a: 9d 07 cpc r25, r29
c4c: 64 f3 brlt .-40 ; 0xc26 <write_ndigit_number_s_10th+0x80>
if (pad) write_char((x++)+(y * 30), 10); // zero
else write_char((x++)+(y * 30), 0); // blank
}
char rest = conv_array[len - 1];
c4e: f5 01 movw r30, r10
c50: eb 56 subi r30, 0x6B ; 107
c52: fd 4f sbci r31, 0xFD ; 253
c54: c0 80 ld r12, Z
conv_array[len - 1] = 0;
c56: 10 82 st Z, r1
if (len == 1) {
c58: f1 e0 ldi r31, 0x01 ; 1
c5a: 9f 16 cp r9, r31
c5c: d1 f1 breq .+116 ; 0xcd2 <write_ndigit_number_s_10th+0x12c>
write_char((x-1)+(y * 30), 10); // zero
} else if (len == 2 && conv_array[0] == '-') {
c5e: 22 e0 ldi r18, 0x02 ; 2
c60: 92 16 cp r9, r18
c62: 19 f1 breq .+70 ; 0xcaa <write_ndigit_number_s_10th+0x104>
write_char((x-1)+(y * 30), 0x49); // minus
write_char((x)+(y * 30), 10); // zero
} else {
write_ascii_string(x, y, conv_array);
c64: 8d 2d mov r24, r13
c66: 68 2d mov r22, r8
c68: 46 e9 ldi r20, 0x96 ; 150
c6a: 52 e0 ldi r21, 0x02 ; 2
c6c: 0e 94 53 05 call 0xaa6 ; 0xaa6 <write_ascii_string>
}
x += len - 1;
c70: 19 2d mov r17, r9
c72: 11 50 subi r17, 0x01 ; 1
c74: 1d 0d add r17, r13
write_char((x++)+(y * 30), 65); // decimal point
c76: c7 01 movw r24, r14
c78: 81 0f add r24, r17
c7a: 91 1d adc r25, r1
c7c: 61 e4 ldi r22, 0x41 ; 65
c7e: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
write_ascii_char((x++)+(y * 30), rest); // after dot
c82: 1f 5f subi r17, 0xFF ; 255
c84: c7 01 movw r24, r14
c86: 81 0f add r24, r17
c88: 91 1d adc r25, r1
c8a: 6c 2d mov r22, r12
c8c: 0e 94 10 05 call 0xa20 ; 0xa20 <write_ascii_char>
}
c90: df 91 pop r29
c92: cf 91 pop r28
c94: 1f 91 pop r17
c96: 0f 91 pop r16
c98: ff 90 pop r15
c9a: ef 90 pop r14
c9c: df 90 pop r13
c9e: cf 90 pop r12
ca0: bf 90 pop r11
ca2: af 90 pop r10
ca4: 9f 90 pop r9
ca6: 8f 90 pop r8
ca8: 08 95 ret
}
char rest = conv_array[len - 1];
conv_array[len - 1] = 0;
if (len == 1) {
write_char((x-1)+(y * 30), 10); // zero
} else if (len == 2 && conv_array[0] == '-') {
caa: 80 91 96 02 lds r24, 0x0296
cae: 8d 32 cpi r24, 0x2D ; 45
cb0: c9 f6 brne .-78 ; 0xc64 <write_ndigit_number_s_10th+0xbe>
write_char((x-1)+(y * 30), 0x49); // minus
cb2: 0d 2d mov r16, r13
cb4: 10 e0 ldi r17, 0x00 ; 0
cb6: c7 01 movw r24, r14
cb8: 01 97 sbiw r24, 0x01 ; 1
cba: 80 0f add r24, r16
cbc: 91 1f adc r25, r17
cbe: 69 e4 ldi r22, 0x49 ; 73
cc0: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
write_char((x)+(y * 30), 10); // zero
cc4: c8 01 movw r24, r16
cc6: 8e 0d add r24, r14
cc8: 9f 1d adc r25, r15
cca: 6a e0 ldi r22, 0x0A ; 10
ccc: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
cd0: cf cf rjmp .-98 ; 0xc70 <write_ndigit_number_s_10th+0xca>
else write_char((x++)+(y * 30), 0); // blank
}
char rest = conv_array[len - 1];
conv_array[len - 1] = 0;
if (len == 1) {
write_char((x-1)+(y * 30), 10); // zero
cd2: c7 01 movw r24, r14
cd4: 01 97 sbiw r24, 0x01 ; 1
cd6: 8d 0d add r24, r13
cd8: 91 1d adc r25, r1
cda: 6a e0 ldi r22, 0x0A ; 10
cdc: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
ce0: c7 cf rjmp .-114 ; 0xc70 <write_ndigit_number_s_10th+0xca>
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s_10th(uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
uint8_t len = strlen(conv_array);
for (uint8_t i = 0; i < length - len; i++) {
ce2: 8e e1 ldi r24, 0x1E ; 30
ce4: 88 9e mul r8, r24
ce6: 70 01 movw r14, r0
ce8: 11 24 eor r1, r1
cea: b1 cf rjmp .-158 ; 0xc4e <write_ndigit_number_s_10th+0xa8>
 
00000cec <write_ndigit_number_u_10th>:
/**
* Write a unsigned <number> at <x>/<y> to MAX7456 display memory as /10th of value
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u_10th(uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad) {
cec: 8f 92 push r8
cee: 9f 92 push r9
cf0: af 92 push r10
cf2: bf 92 push r11
cf4: cf 92 push r12
cf6: df 92 push r13
cf8: ef 92 push r14
cfa: ff 92 push r15
cfc: 0f 93 push r16
cfe: 1f 93 push r17
d00: cf 93 push r28
d02: df 93 push r29
d04: d8 2e mov r13, r24
d06: 86 2e mov r8, r22
d08: ca 01 movw r24, r20
d0a: e9 01 movw r28, r18
d0c: c0 2e mov r12, r16
itoa(number, conv_array, 10 );
d0e: 06 e9 ldi r16, 0x96 ; 150
d10: 12 e0 ldi r17, 0x02 ; 2
d12: b8 01 movw r22, r16
d14: 4a e0 ldi r20, 0x0A ; 10
d16: 50 e0 ldi r21, 0x00 ; 0
d18: 0e 94 cc 1c call 0x3998 ; 0x3998 <itoa>
uint8_t len = strlen(conv_array);
d1c: f8 01 movw r30, r16
d1e: 01 90 ld r0, Z+
d20: 00 20 and r0, r0
d22: e9 f7 brne .-6 ; 0xd1e <write_ndigit_number_u_10th+0x32>
d24: 8f 01 movw r16, r30
d26: 01 50 subi r16, 0x01 ; 1
d28: 10 40 sbci r17, 0x00 ; 0
d2a: 06 59 subi r16, 0x96 ; 150
d2c: 12 40 sbci r17, 0x02 ; 2
d2e: 90 2e mov r9, r16
for (uint8_t i = 0; i < length - len; i++) {
d30: a0 2e mov r10, r16
d32: bb 24 eor r11, r11
d34: ca 19 sub r28, r10
d36: db 09 sbc r29, r11
d38: 1c 16 cp r1, r28
d3a: 1d 06 cpc r1, r29
d3c: 0c f0 brlt .+2 ; 0xd40 <write_ndigit_number_u_10th+0x54>
d3e: 74 c0 rjmp .+232 ; 0xe28 <write_ndigit_number_u_10th+0x13c>
d40: 8e e1 ldi r24, 0x1E ; 30
d42: 88 9e mul r8, r24
d44: 70 01 movw r14, r0
d46: 11 24 eor r1, r1
d48: d3 94 inc r13
d4a: 10 e0 ldi r17, 0x00 ; 0
d4c: 10 c0 rjmp .+32 ; 0xd6e <write_ndigit_number_u_10th+0x82>
if (pad) write_char((x++)+(y * 30), 10); // zero
d4e: 97 01 movw r18, r14
d50: 28 0f add r18, r24
d52: 31 1d adc r19, r1
d54: c9 01 movw r24, r18
d56: 6a e0 ldi r22, 0x0A ; 10
d58: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u_10th(uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
uint8_t len = strlen(conv_array);
for (uint8_t i = 0; i < length - len; i++) {
d5c: 1f 5f subi r17, 0xFF ; 255
d5e: 2d 2d mov r18, r13
d60: 2f 5f subi r18, 0xFF ; 255
d62: 81 2f mov r24, r17
d64: 90 e0 ldi r25, 0x00 ; 0
d66: 8c 17 cp r24, r28
d68: 9d 07 cpc r25, r29
d6a: a4 f4 brge .+40 ; 0xd94 <write_ndigit_number_u_10th+0xa8>
d6c: d2 2e mov r13, r18
d6e: 8d 2d mov r24, r13
d70: 81 50 subi r24, 0x01 ; 1
if (pad) write_char((x++)+(y * 30), 10); // zero
d72: cc 20 and r12, r12
d74: 61 f7 brne .-40 ; 0xd4e <write_ndigit_number_u_10th+0x62>
else write_char((x++)+(y * 30), 0); // blank
d76: f7 01 movw r30, r14
d78: e8 0f add r30, r24
d7a: f1 1d adc r31, r1
d7c: cf 01 movw r24, r30
d7e: 60 e0 ldi r22, 0x00 ; 0
d80: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u_10th(uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
uint8_t len = strlen(conv_array);
for (uint8_t i = 0; i < length - len; i++) {
d84: 1f 5f subi r17, 0xFF ; 255
d86: 2d 2d mov r18, r13
d88: 2f 5f subi r18, 0xFF ; 255
d8a: 81 2f mov r24, r17
d8c: 90 e0 ldi r25, 0x00 ; 0
d8e: 8c 17 cp r24, r28
d90: 9d 07 cpc r25, r29
d92: 64 f3 brlt .-40 ; 0xd6c <write_ndigit_number_u_10th+0x80>
if (pad) write_char((x++)+(y * 30), 10); // zero
else write_char((x++)+(y * 30), 0); // blank
}
char rest = conv_array[len - 1];
d94: f5 01 movw r30, r10
d96: eb 56 subi r30, 0x6B ; 107
d98: fd 4f sbci r31, 0xFD ; 253
d9a: c0 80 ld r12, Z
conv_array[len - 1] = 0;
d9c: 10 82 st Z, r1
if (len == 1) {
d9e: f1 e0 ldi r31, 0x01 ; 1
da0: 9f 16 cp r9, r31
da2: d1 f1 breq .+116 ; 0xe18 <write_ndigit_number_u_10th+0x12c>
write_char((x-1)+(y * 30), 10); // zero
} else if (len == 2 && conv_array[0] == '-') {
da4: 22 e0 ldi r18, 0x02 ; 2
da6: 92 16 cp r9, r18
da8: 19 f1 breq .+70 ; 0xdf0 <write_ndigit_number_u_10th+0x104>
write_char((x-1)+(y * 30), 0x49); // minus
write_char((x)+(y * 30), 10); // zero
} else {
write_ascii_string(x, y, conv_array);
daa: 8d 2d mov r24, r13
dac: 68 2d mov r22, r8
dae: 46 e9 ldi r20, 0x96 ; 150
db0: 52 e0 ldi r21, 0x02 ; 2
db2: 0e 94 53 05 call 0xaa6 ; 0xaa6 <write_ascii_string>
}
x += len - 1;
db6: 19 2d mov r17, r9
db8: 11 50 subi r17, 0x01 ; 1
dba: 1d 0d add r17, r13
write_char((x++)+(y * 30), 65); // decimal point
dbc: c7 01 movw r24, r14
dbe: 81 0f add r24, r17
dc0: 91 1d adc r25, r1
dc2: 61 e4 ldi r22, 0x41 ; 65
dc4: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
write_ascii_char((x++)+(y * 30), rest); // after dot
dc8: 1f 5f subi r17, 0xFF ; 255
dca: c7 01 movw r24, r14
dcc: 81 0f add r24, r17
dce: 91 1d adc r25, r1
dd0: 6c 2d mov r22, r12
dd2: 0e 94 10 05 call 0xa20 ; 0xa20 <write_ascii_char>
}
dd6: df 91 pop r29
dd8: cf 91 pop r28
dda: 1f 91 pop r17
ddc: 0f 91 pop r16
dde: ff 90 pop r15
de0: ef 90 pop r14
de2: df 90 pop r13
de4: cf 90 pop r12
de6: bf 90 pop r11
de8: af 90 pop r10
dea: 9f 90 pop r9
dec: 8f 90 pop r8
dee: 08 95 ret
}
char rest = conv_array[len - 1];
conv_array[len - 1] = 0;
if (len == 1) {
write_char((x-1)+(y * 30), 10); // zero
} else if (len == 2 && conv_array[0] == '-') {
df0: 80 91 96 02 lds r24, 0x0296
df4: 8d 32 cpi r24, 0x2D ; 45
df6: c9 f6 brne .-78 ; 0xdaa <write_ndigit_number_u_10th+0xbe>
write_char((x-1)+(y * 30), 0x49); // minus
df8: 0d 2d mov r16, r13
dfa: 10 e0 ldi r17, 0x00 ; 0
dfc: c7 01 movw r24, r14
dfe: 01 97 sbiw r24, 0x01 ; 1
e00: 80 0f add r24, r16
e02: 91 1f adc r25, r17
e04: 69 e4 ldi r22, 0x49 ; 73
e06: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
write_char((x)+(y * 30), 10); // zero
e0a: c8 01 movw r24, r16
e0c: 8e 0d add r24, r14
e0e: 9f 1d adc r25, r15
e10: 6a e0 ldi r22, 0x0A ; 10
e12: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
e16: cf cf rjmp .-98 ; 0xdb6 <write_ndigit_number_u_10th+0xca>
else write_char((x++)+(y * 30), 0); // blank
}
char rest = conv_array[len - 1];
conv_array[len - 1] = 0;
if (len == 1) {
write_char((x-1)+(y * 30), 10); // zero
e18: c7 01 movw r24, r14
e1a: 01 97 sbiw r24, 0x01 ; 1
e1c: 8d 0d add r24, r13
e1e: 91 1d adc r25, r1
e20: 6a e0 ldi r22, 0x0A ; 10
e22: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
e26: c7 cf rjmp .-114 ; 0xdb6 <write_ndigit_number_u_10th+0xca>
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u_10th(uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
uint8_t len = strlen(conv_array);
for (uint8_t i = 0; i < length - len; i++) {
e28: 8e e1 ldi r24, 0x1E ; 30
e2a: 88 9e mul r8, r24
e2c: 70 01 movw r14, r0
e2e: 11 24 eor r1, r1
e30: b1 cf rjmp .-158 ; 0xd94 <write_ndigit_number_u_10th+0xa8>
 
00000e32 <write_ndigit_number_s>:
/**
* Write a signed <number> at <x>/<y> to MAX7456 display memory
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s(uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad) {
e32: af 92 push r10
e34: bf 92 push r11
e36: cf 92 push r12
e38: df 92 push r13
e3a: ef 92 push r14
e3c: ff 92 push r15
e3e: 0f 93 push r16
e40: 1f 93 push r17
e42: cf 93 push r28
e44: df 93 push r29
e46: b8 2e mov r11, r24
e48: a6 2e mov r10, r22
e4a: ca 01 movw r24, r20
e4c: 12 2f mov r17, r18
e4e: f3 2e mov r15, r19
itoa(number, conv_array, 10 );
e50: a6 e9 ldi r26, 0x96 ; 150
e52: ca 2e mov r12, r26
e54: a2 e0 ldi r26, 0x02 ; 2
e56: da 2e mov r13, r26
e58: b6 01 movw r22, r12
e5a: 4a e0 ldi r20, 0x0A ; 10
e5c: 50 e0 ldi r21, 0x00 ; 0
e5e: 0e 94 cc 1c call 0x3998 ; 0x3998 <itoa>
e62: c1 2f mov r28, r17
e64: df 2d mov r29, r15
for (uint8_t i = 0; i < length - strlen(conv_array); i++) {
if (pad) write_char((x++)+(y * 30), 10);
e66: 8e e1 ldi r24, 0x1E ; 30
e68: a8 9e mul r10, r24
e6a: 70 01 movw r14, r0
e6c: 11 24 eor r1, r1
e6e: 10 e0 ldi r17, 0x00 ; 0
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s(uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
for (uint8_t i = 0; i < length - strlen(conv_array); i++) {
e70: 41 2f mov r20, r17
e72: 4b 0d add r20, r11
e74: f6 01 movw r30, r12
e76: 01 90 ld r0, Z+
e78: 00 20 and r0, r0
e7a: e9 f7 brne .-6 ; 0xe76 <write_ndigit_number_s+0x44>
e7c: ce 01 movw r24, r28
e7e: 8e 1b sub r24, r30
e80: 9f 0b sbc r25, r31
e82: 21 2f mov r18, r17
e84: 30 e0 ldi r19, 0x00 ; 0
e86: 89 56 subi r24, 0x69 ; 105
e88: 9d 4f sbci r25, 0xFD ; 253
e8a: 28 17 cp r18, r24
e8c: 39 07 cpc r19, r25
e8e: 90 f4 brcc .+36 ; 0xeb4 <write_ndigit_number_s+0x82>
if (pad) write_char((x++)+(y * 30), 10);
e90: 00 23 and r16, r16
e92: 41 f0 breq .+16 ; 0xea4 <write_ndigit_number_s+0x72>
e94: c7 01 movw r24, r14
e96: 84 0f add r24, r20
e98: 91 1d adc r25, r1
e9a: 6a e0 ldi r22, 0x0A ; 10
e9c: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s(uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
for (uint8_t i = 0; i < length - strlen(conv_array); i++) {
ea0: 1f 5f subi r17, 0xFF ; 255
ea2: e6 cf rjmp .-52 ; 0xe70 <write_ndigit_number_s+0x3e>
if (pad) write_char((x++)+(y * 30), 10);
else write_ascii_char((x++)+(y * 30), 0);
ea4: c7 01 movw r24, r14
ea6: 84 0f add r24, r20
ea8: 91 1d adc r25, r1
eaa: 60 e0 ldi r22, 0x00 ; 0
eac: 0e 94 10 05 call 0xa20 ; 0xa20 <write_ascii_char>
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_s(uint8_t x, uint8_t y, int16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
for (uint8_t i = 0; i < length - strlen(conv_array); i++) {
eb0: 1f 5f subi r17, 0xFF ; 255
eb2: de cf rjmp .-68 ; 0xe70 <write_ndigit_number_s+0x3e>
if (pad) write_char((x++)+(y * 30), 10);
else write_ascii_char((x++)+(y * 30), 0);
}
write_ascii_string(x, y, conv_array);
eb4: 84 2f mov r24, r20
eb6: 6a 2d mov r22, r10
eb8: 46 e9 ldi r20, 0x96 ; 150
eba: 52 e0 ldi r21, 0x02 ; 2
ebc: 0e 94 53 05 call 0xaa6 ; 0xaa6 <write_ascii_string>
}
ec0: df 91 pop r29
ec2: cf 91 pop r28
ec4: 1f 91 pop r17
ec6: 0f 91 pop r16
ec8: ff 90 pop r15
eca: ef 90 pop r14
ecc: df 90 pop r13
ece: cf 90 pop r12
ed0: bf 90 pop r11
ed2: af 90 pop r10
ed4: 08 95 ret
 
00000ed6 <write_ndigit_number_u>:
/**
* Write a unsigned <number> at <x>/<y> to MAX7456 display memory
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u(uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad) {
ed6: af 92 push r10
ed8: bf 92 push r11
eda: cf 92 push r12
edc: df 92 push r13
ede: ef 92 push r14
ee0: ff 92 push r15
ee2: 0f 93 push r16
ee4: 1f 93 push r17
ee6: cf 93 push r28
ee8: df 93 push r29
eea: b8 2e mov r11, r24
eec: a6 2e mov r10, r22
eee: ca 01 movw r24, r20
ef0: 12 2f mov r17, r18
ef2: f3 2e mov r15, r19
itoa(number, conv_array, 10 );
ef4: b6 e9 ldi r27, 0x96 ; 150
ef6: cb 2e mov r12, r27
ef8: b2 e0 ldi r27, 0x02 ; 2
efa: db 2e mov r13, r27
efc: b6 01 movw r22, r12
efe: 4a e0 ldi r20, 0x0A ; 10
f00: 50 e0 ldi r21, 0x00 ; 0
f02: 0e 94 cc 1c call 0x3998 ; 0x3998 <itoa>
f06: c1 2f mov r28, r17
f08: df 2d mov r29, r15
for (uint8_t i = 0; i < length - strlen(conv_array); i++) {
if (pad) write_char((x++)+(y * 30), 10);
f0a: 8e e1 ldi r24, 0x1E ; 30
f0c: a8 9e mul r10, r24
f0e: 70 01 movw r14, r0
f10: 11 24 eor r1, r1
f12: 10 e0 ldi r17, 0x00 ; 0
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u(uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
for (uint8_t i = 0; i < length - strlen(conv_array); i++) {
f14: 41 2f mov r20, r17
f16: 4b 0d add r20, r11
f18: f6 01 movw r30, r12
f1a: 01 90 ld r0, Z+
f1c: 00 20 and r0, r0
f1e: e9 f7 brne .-6 ; 0xf1a <write_ndigit_number_u+0x44>
f20: ce 01 movw r24, r28
f22: 8e 1b sub r24, r30
f24: 9f 0b sbc r25, r31
f26: 21 2f mov r18, r17
f28: 30 e0 ldi r19, 0x00 ; 0
f2a: 89 56 subi r24, 0x69 ; 105
f2c: 9d 4f sbci r25, 0xFD ; 253
f2e: 28 17 cp r18, r24
f30: 39 07 cpc r19, r25
f32: 90 f4 brcc .+36 ; 0xf58 <write_ndigit_number_u+0x82>
if (pad) write_char((x++)+(y * 30), 10);
f34: 00 23 and r16, r16
f36: 41 f0 breq .+16 ; 0xf48 <write_ndigit_number_u+0x72>
f38: c7 01 movw r24, r14
f3a: 84 0f add r24, r20
f3c: 91 1d adc r25, r1
f3e: 6a e0 ldi r22, 0x0A ; 10
f40: 0e 94 f1 04 call 0x9e2 ; 0x9e2 <write_char>
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u(uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
for (uint8_t i = 0; i < length - strlen(conv_array); i++) {
f44: 1f 5f subi r17, 0xFF ; 255
f46: e6 cf rjmp .-52 ; 0xf14 <write_ndigit_number_u+0x3e>
if (pad) write_char((x++)+(y * 30), 10);
else write_ascii_char((x++)+(y * 30), 0);
f48: c7 01 movw r24, r14
f4a: 84 0f add r24, r20
f4c: 91 1d adc r25, r1
f4e: 60 e0 ldi r22, 0x00 ; 0
f50: 0e 94 10 05 call 0xa20 ; 0xa20 <write_ascii_char>
* <length> represents the length to rightbound the number
* <pad> = 1 will cause blank spaced to be filled up with zeros e.g. 007 instead of 7
*/
void write_ndigit_number_u(uint8_t x, uint8_t y, uint16_t number, int16_t length, uint8_t pad) {
itoa(number, conv_array, 10 );
for (uint8_t i = 0; i < length - strlen(conv_array); i++) {
f54: 1f 5f subi r17, 0xFF ; 255
f56: de cf rjmp .-68 ; 0xf14 <write_ndigit_number_u+0x3e>
if (pad) write_char((x++)+(y * 30), 10);
else write_ascii_char((x++)+(y * 30), 0);
}
write_ascii_string(x, y, conv_array);
f58: 84 2f mov r24, r20
f5a: 6a 2d mov r22, r10
f5c: 46 e9 ldi r20, 0x96 ; 150
f5e: 52 e0 ldi r21, 0x02 ; 2
f60: 0e 94 53 05 call 0xaa6 ; 0xaa6 <write_ascii_string>
}
f64: df 91 pop r29
f66: cf 91 pop r28
f68: 1f 91 pop r17
f6a: 0f 91 pop r16
f6c: ff 90 pop r15
f6e: ef 90 pop r14
f70: df 90 pop r13
f72: cf 90 pop r12
f74: bf 90 pop r11
f76: af 90 pop r10
f78: 08 95 ret
 
00000f7a <write_gps_pos>:
}
 
/**
* wirte a <position> at <x>/<y> assuming it is a gps position for long-/latitude
*/
void write_gps_pos(uint8_t x, uint8_t y, int32_t position) {
f7a: 7f 92 push r7
f7c: 8f 92 push r8
f7e: 9f 92 push r9
f80: af 92 push r10
f82: bf 92 push r11
f84: cf 92 push r12
f86: df 92 push r13
f88: ef 92 push r14
f8a: ff 92 push r15
f8c: 0f 93 push r16
f8e: 1f 93 push r17
f90: 16 2f mov r17, r22
f92: 69 01 movw r12, r18
f94: 7a 01 movw r14, r20
if (position < 0) {
f96: 57 fd sbrc r21, 7
f98: 5e c0 rjmp .+188 ; 0x1056 <write_gps_pos+0xdc>
position ^= ~0;
position++;
write_char_xy(x++, y, 0x49); // minus
} else {
write_char_xy(x++, y, 0); // clear ('+' would be nice, maybe later)
f9a: 78 2e mov r7, r24
f9c: 73 94 inc r7
f9e: 40 e0 ldi r20, 0x00 ; 0
fa0: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
}
write_ndigit_number_u(x, y, (uint16_t) (position / (int32_t) 10000000), 3, 1);
fa4: c7 01 movw r24, r14
fa6: b6 01 movw r22, r12
fa8: 20 e8 ldi r18, 0x80 ; 128
faa: 36 e9 ldi r19, 0x96 ; 150
fac: 48 e9 ldi r20, 0x98 ; 152
fae: 50 e0 ldi r21, 0x00 ; 0
fb0: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
fb4: 87 2d mov r24, r7
fb6: 61 2f mov r22, r17
fb8: a9 01 movw r20, r18
fba: 23 e0 ldi r18, 0x03 ; 3
fbc: 30 e0 ldi r19, 0x00 ; 0
fbe: 01 e0 ldi r16, 0x01 ; 1
fc0: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_char_xy(x + 3, y, 65); // decimal point
fc4: 87 2d mov r24, r7
fc6: 8d 5f subi r24, 0xFD ; 253
fc8: 61 2f mov r22, r17
fca: 41 e4 ldi r20, 0x41 ; 65
fcc: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
position = position - ((position / (int32_t) 10000000) * (int32_t) 10000000);
fd0: c7 01 movw r24, r14
fd2: b6 01 movw r22, r12
fd4: 20 e8 ldi r18, 0x80 ; 128
fd6: 36 e9 ldi r19, 0x96 ; 150
fd8: 48 e9 ldi r20, 0x98 ; 152
fda: 50 e0 ldi r21, 0x00 ; 0
fdc: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
fe0: 6b 01 movw r12, r22
fe2: 7c 01 movw r14, r24
write_ndigit_number_u(x + 4, y, (uint16_t) (position / (int32_t) 1000), 4, 1);
fe4: c7 01 movw r24, r14
fe6: b6 01 movw r22, r12
fe8: 28 ee ldi r18, 0xE8 ; 232
fea: 33 e0 ldi r19, 0x03 ; 3
fec: 40 e0 ldi r20, 0x00 ; 0
fee: 50 e0 ldi r21, 0x00 ; 0
ff0: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
ff4: 49 01 movw r8, r18
ff6: 87 2d mov r24, r7
ff8: 8c 5f subi r24, 0xFC ; 252
ffa: 61 2f mov r22, r17
ffc: a9 01 movw r20, r18
ffe: 24 e0 ldi r18, 0x04 ; 4
1000: 30 e0 ldi r19, 0x00 ; 0
1002: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
position = position - ((uint16_t) (position / (int32_t) 1000) * (int32_t) 1000);
write_ndigit_number_u(x + 8, y, (uint16_t) position, 3, 1);
1006: aa 24 eor r10, r10
1008: bb 24 eor r11, r11
100a: c5 01 movw r24, r10
100c: b4 01 movw r22, r8
100e: 28 e1 ldi r18, 0x18 ; 24
1010: 3c ef ldi r19, 0xFC ; 252
1012: 4f ef ldi r20, 0xFF ; 255
1014: 5f ef ldi r21, 0xFF ; 255
1016: 0e 94 49 1c call 0x3892 ; 0x3892 <__mulsi3>
101a: c6 0e add r12, r22
101c: d7 1e adc r13, r23
101e: e8 1e adc r14, r24
1020: f9 1e adc r15, r25
1022: 87 2d mov r24, r7
1024: 88 5f subi r24, 0xF8 ; 248
1026: 61 2f mov r22, r17
1028: a6 01 movw r20, r12
102a: 23 e0 ldi r18, 0x03 ; 3
102c: 30 e0 ldi r19, 0x00 ; 0
102e: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_char_xy(x + 11, y, 0xD0); // degree symbol
1032: 87 2d mov r24, r7
1034: 85 5f subi r24, 0xF5 ; 245
1036: 61 2f mov r22, r17
1038: 40 ed ldi r20, 0xD0 ; 208
103a: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
}
103e: 1f 91 pop r17
1040: 0f 91 pop r16
1042: ff 90 pop r15
1044: ef 90 pop r14
1046: df 90 pop r13
1048: cf 90 pop r12
104a: bf 90 pop r11
104c: af 90 pop r10
104e: 9f 90 pop r9
1050: 8f 90 pop r8
1052: 7f 90 pop r7
1054: 08 95 ret
/**
* wirte a <position> at <x>/<y> assuming it is a gps position for long-/latitude
*/
void write_gps_pos(uint8_t x, uint8_t y, int32_t position) {
if (position < 0) {
position ^= ~0;
1056: c0 94 com r12
1058: d0 94 com r13
105a: e0 94 com r14
105c: f0 94 com r15
position++;
105e: 08 94 sec
1060: c1 1c adc r12, r1
1062: d1 1c adc r13, r1
1064: e1 1c adc r14, r1
1066: f1 1c adc r15, r1
write_char_xy(x++, y, 0x49); // minus
1068: 78 2e mov r7, r24
106a: 73 94 inc r7
106c: 49 e4 ldi r20, 0x49 ; 73
106e: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
1072: 98 cf rjmp .-208 ; 0xfa4 <write_gps_pos+0x2a>
 
00001074 <write_time>:
}
 
/**
* write <seconds> as human readable time at <x>/<y> to MAX7456 display mem
*/
void write_time(uint8_t x, uint8_t y, uint16_t seconds) {
1074: bf 92 push r11
1076: cf 92 push r12
1078: df 92 push r13
107a: ef 92 push r14
107c: ff 92 push r15
107e: 0f 93 push r16
1080: 1f 93 push r17
1082: 18 2f mov r17, r24
1084: b6 2e mov r11, r22
1086: 6a 01 movw r12, r20
uint16_t min = seconds / 60;
1088: ca 01 movw r24, r20
108a: 6c e3 ldi r22, 0x3C ; 60
108c: 70 e0 ldi r23, 0x00 ; 0
108e: 0e 94 68 1c call 0x38d0 ; 0x38d0 <__udivmodhi4>
1092: 7b 01 movw r14, r22
seconds -= min * 60;
write_ndigit_number_u(x, y, min, 3, 0);
1094: 81 2f mov r24, r17
1096: 6b 2d mov r22, r11
1098: a7 01 movw r20, r14
109a: 23 e0 ldi r18, 0x03 ; 3
109c: 30 e0 ldi r19, 0x00 ; 0
109e: 00 e0 ldi r16, 0x00 ; 0
10a0: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_char_xy(x + 3, y, 68);
10a4: 81 2f mov r24, r17
10a6: 8d 5f subi r24, 0xFD ; 253
10a8: 6b 2d mov r22, r11
10aa: 44 e4 ldi r20, 0x44 ; 68
10ac: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_ndigit_number_u(x + 4, y, seconds, 2, 1);
10b0: 8c e3 ldi r24, 0x3C ; 60
10b2: 90 e0 ldi r25, 0x00 ; 0
10b4: 9c 01 movw r18, r24
10b6: e2 9e mul r14, r18
10b8: c0 01 movw r24, r0
10ba: e3 9e mul r14, r19
10bc: 90 0d add r25, r0
10be: f2 9e mul r15, r18
10c0: 90 0d add r25, r0
10c2: 11 24 eor r1, r1
10c4: c8 1a sub r12, r24
10c6: d9 0a sbc r13, r25
10c8: 81 2f mov r24, r17
10ca: 8c 5f subi r24, 0xFC ; 252
10cc: 6b 2d mov r22, r11
10ce: a6 01 movw r20, r12
10d0: 22 e0 ldi r18, 0x02 ; 2
10d2: 30 e0 ldi r19, 0x00 ; 0
10d4: 01 e0 ldi r16, 0x01 ; 1
10d6: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
}
10da: 1f 91 pop r17
10dc: 0f 91 pop r16
10de: ff 90 pop r15
10e0: ef 90 pop r14
10e2: df 90 pop r13
10e4: cf 90 pop r12
10e6: bf 90 pop r11
10e8: 08 95 ret
 
000010ea <clear>:
/*uint16_t memory_address = 0;
for (unsigned int a = 0; a < 480; a++) {
write_char(memory_address++, 0);
}*/
// clear all display-mem (DMM)
spi_send_byte(0x04, 0b01000100);
10ea: 84 e0 ldi r24, 0x04 ; 4
10ec: 64 e4 ldi r22, 0x44 ; 68
10ee: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
can be achieved.
*/
void
_delay_loop_1(uint8_t __count)
{
__asm__ volatile (
10f2: 8a e6 ldi r24, 0x6A ; 106
10f4: 8a 95 dec r24
10f6: f1 f7 brne .-4 ; 0x10f4 <clear+0xa>
 
// clearing takes 12uS according to maxim so lets wait longer
_delay_us(20);
}
10f8: 08 95 ret
 
000010fa <write_char_att>:
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
/**
* write a character <attribute> to <address> of MAX7456 display memory
*/
void write_char_att(uint16_t address, char attribute) {
10fa: 0f 93 push r16
10fc: 1f 93 push r17
10fe: 18 2f mov r17, r24
1100: 06 2f mov r16, r22
// the only important part is that the DMAH[1] is set
// so we add 2 which binary is the 2nd lowest byte
spi_send_byte(0x05, ((address & 0xFF00) >> 8) | 2); // DMAH
1102: 92 60 ori r25, 0x02 ; 2
1104: 85 e0 ldi r24, 0x05 ; 5
1106: 69 2f mov r22, r25
1108: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
spi_send_byte(0x06, (address & 0x00FF)); // DMAL
110c: 86 e0 ldi r24, 0x06 ; 6
110e: 61 2f mov r22, r17
1110: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
spi_send_byte(0x07, attribute); // DMDI
1114: 87 e0 ldi r24, 0x07 ; 7
1116: 60 2f mov r22, r16
1118: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
}
111c: 1f 91 pop r17
111e: 0f 91 pop r16
1120: 08 95 ret
 
00001122 <write_char_att_xy>:
/**
* write a character <attribute> at <x>/<y> to MAX7456 display memory
*/
void write_char_att_xy(uint8_t x, uint8_t y, char attribute) {
uint16_t address = y * 30 + x;
write_char_att(address, attribute);
1122: 9e e1 ldi r25, 0x1E ; 30
1124: 69 9f mul r22, r25
1126: b0 01 movw r22, r0
1128: 11 24 eor r1, r1
112a: 9b 01 movw r18, r22
112c: 28 0f add r18, r24
112e: 31 1d adc r19, r1
1130: c9 01 movw r24, r18
1132: 64 2f mov r22, r20
1134: 0e 94 7d 08 call 0x10fa ; 0x10fa <write_char_att>
}
1138: 08 95 ret
 
0000113a <heading_conv>:
* ##########################################################################*/
 
/**
* convert the <heading> gotton from NC into an index
*/
uint8_t heading_conv(uint16_t heading) {
113a: 9c 01 movw r18, r24
if (heading > 23 && heading < 68) {
113c: 48 97 sbiw r24, 0x18 ; 24
113e: 8c 97 sbiw r24, 0x2c ; 44
1140: 00 f1 brcs .+64 ; 0x1182 <heading_conv+0x48>
//direction = "NE";
return 0;
} else if (heading > 67 && heading < 113) {
1142: c9 01 movw r24, r18
1144: 84 54 subi r24, 0x44 ; 68
1146: 90 40 sbci r25, 0x00 ; 0
1148: 8d 97 sbiw r24, 0x2d ; 45
114a: e8 f0 brcs .+58 ; 0x1186 <heading_conv+0x4c>
//direction = "E ";
return 1;
} else if (heading > 112 && heading < 158) {
114c: c9 01 movw r24, r18
114e: 81 57 subi r24, 0x71 ; 113
1150: 90 40 sbci r25, 0x00 ; 0
1152: 8d 97 sbiw r24, 0x2d ; 45
1154: e0 f0 brcs .+56 ; 0x118e <heading_conv+0x54>
//direction = "SE";
return 2;
} else if (heading > 157 && heading < 203) {
1156: c9 01 movw r24, r18
1158: 8e 59 subi r24, 0x9E ; 158
115a: 90 40 sbci r25, 0x00 ; 0
115c: 8d 97 sbiw r24, 0x2d ; 45
115e: a8 f0 brcs .+42 ; 0x118a <heading_conv+0x50>
//direction = "S ";
return 3;
} else if (heading > 202 && heading < 248) {
1160: c9 01 movw r24, r18
1162: 8b 5c subi r24, 0xCB ; 203
1164: 90 40 sbci r25, 0x00 ; 0
1166: 8d 97 sbiw r24, 0x2d ; 45
1168: a0 f0 brcs .+40 ; 0x1192 <heading_conv+0x58>
//direction = "SW";
return 4;
} else if (heading > 247 && heading < 293) {
116a: c9 01 movw r24, r18
116c: 88 5f subi r24, 0xF8 ; 248
116e: 90 40 sbci r25, 0x00 ; 0
1170: 8d 97 sbiw r24, 0x2d ; 45
1172: 98 f0 brcs .+38 ; 0x119a <heading_conv+0x60>
//direction = "W ";
return 5;
} else if (heading > 292 && heading < 338) {
1174: 25 52 subi r18, 0x25 ; 37
1176: 31 40 sbci r19, 0x01 ; 1
1178: 2d 32 cpi r18, 0x2D ; 45
117a: 31 05 cpc r19, r1
117c: 60 f0 brcs .+24 ; 0x1196 <heading_conv+0x5c>
117e: 87 e0 ldi r24, 0x07 ; 7
1180: 08 95 ret
 
/**
* convert the <heading> gotton from NC into an index
*/
uint8_t heading_conv(uint16_t heading) {
if (heading > 23 && heading < 68) {
1182: 80 e0 ldi r24, 0x00 ; 0
1184: 08 95 ret
//direction = "NE";
return 0;
} else if (heading > 67 && heading < 113) {
1186: 81 e0 ldi r24, 0x01 ; 1
1188: 08 95 ret
//direction = "E ";
return 1;
} else if (heading > 112 && heading < 158) {
//direction = "SE";
return 2;
} else if (heading > 157 && heading < 203) {
118a: 83 e0 ldi r24, 0x03 ; 3
118c: 08 95 ret
//direction = "NE";
return 0;
} else if (heading > 67 && heading < 113) {
//direction = "E ";
return 1;
} else if (heading > 112 && heading < 158) {
118e: 82 e0 ldi r24, 0x02 ; 2
1190: 08 95 ret
//direction = "SE";
return 2;
} else if (heading > 157 && heading < 203) {
//direction = "S ";
return 3;
} else if (heading > 202 && heading < 248) {
1192: 84 e0 ldi r24, 0x04 ; 4
1194: 08 95 ret
//direction = "SW";
return 4;
} else if (heading > 247 && heading < 293) {
//direction = "W ";
return 5;
} else if (heading > 292 && heading < 338) {
1196: 86 e0 ldi r24, 0x06 ; 6
//direction = "NW";
return 6;
}
//direction = "N ";
return 7;
}
1198: 08 95 ret
//direction = "S ";
return 3;
} else if (heading > 202 && heading < 248) {
//direction = "SW";
return 4;
} else if (heading > 247 && heading < 293) {
119a: 85 e0 ldi r24, 0x05 ; 5
119c: 08 95 ret
 
0000119e <heading_fine_conv>:
/**
* convert the <heading> gotton from NC into a more
* precise index
*/
uint8_t heading_fine_conv(uint16_t heading) {
heading = ((heading * 10) + 113) % 3600;
119e: 9c 01 movw r18, r24
11a0: 88 0f add r24, r24
11a2: 99 1f adc r25, r25
11a4: 88 0f add r24, r24
11a6: 99 1f adc r25, r25
11a8: 88 0f add r24, r24
11aa: 99 1f adc r25, r25
11ac: 22 0f add r18, r18
11ae: 33 1f adc r19, r19
11b0: 82 0f add r24, r18
11b2: 93 1f adc r25, r19
11b4: 8f 58 subi r24, 0x8F ; 143
11b6: 9f 4f sbci r25, 0xFF ; 255
11b8: 60 e1 ldi r22, 0x10 ; 16
11ba: 7e e0 ldi r23, 0x0E ; 14
11bc: 0e 94 68 1c call 0x38d0 ; 0x38d0 <__udivmodhi4>
11c0: 61 ee ldi r22, 0xE1 ; 225
11c2: 70 e0 ldi r23, 0x00 ; 0
11c4: 0e 94 68 1c call 0x38d0 ; 0x38d0 <__udivmodhi4>
11c8: 86 2f mov r24, r22
return (heading / 225);
}
11ca: 08 95 ret
 
000011cc <draw_artificial_horizon>:
 
/**
* draw roll und nick indicators (could be enhanced to full artificial horizon)
* from line <firstline> to <listlines> for given <nick> and <roll> values
*/
void draw_artificial_horizon(uint8_t firstline, uint8_t lastline, int16_t nick, int16_t roll) {
11cc: af 92 push r10
11ce: bf 92 push r11
11d0: cf 92 push r12
11d2: df 92 push r13
11d4: ef 92 push r14
11d6: ff 92 push r15
11d8: 0f 93 push r16
11da: 1f 93 push r17
11dc: df 93 push r29
11de: cf 93 push r28
11e0: 00 d0 rcall .+0 ; 0x11e2 <draw_artificial_horizon+0x16>
11e2: 00 d0 rcall .+0 ; 0x11e4 <draw_artificial_horizon+0x18>
11e4: 0f 92 push r0
11e6: cd b7 in r28, 0x3d ; 61
11e8: de b7 in r29, 0x3e ; 62
11ea: a8 2e mov r10, r24
11ec: c6 2e mov r12, r22
11ee: 8a 01 movw r16, r20
11f0: d2 2e mov r13, r18
11f2: b3 2e mov r11, r19
char noodle[5] = {225, 225, 226, 227, 227};
11f4: 7e 01 movw r14, r28
11f6: 08 94 sec
11f8: e1 1c adc r14, r1
11fa: f1 1c adc r15, r1
11fc: d7 01 movw r26, r14
11fe: eb e0 ldi r30, 0x0B ; 11
1200: f1 e0 ldi r31, 0x01 ; 1
1202: 85 e0 ldi r24, 0x05 ; 5
1204: 01 90 ld r0, Z+
1206: 0d 92 st X+, r0
1208: 81 50 subi r24, 0x01 ; 1
120a: e1 f7 brne .-8 ; 0x1204 <draw_artificial_horizon+0x38>
uint8_t center_x = 15;
uint8_t center_y = lastline - firstline;
center_y = 7;
write_char_xy(center_x,center_y,228);
120c: 8f e0 ldi r24, 0x0F ; 15
120e: 67 e0 ldi r22, 0x07 ; 7
1210: 44 ee ldi r20, 0xE4 ; 228
1212: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
uint8_t cpos, nicky, rollx;
// which line
int8_t ypos = nick / 20;
1216: c8 01 movw r24, r16
1218: 64 e1 ldi r22, 0x14 ; 20
121a: 70 e0 ldi r23, 0x00 ; 0
121c: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
1220: 26 2f mov r18, r22
// which character from the array?
if (nick < 0) {
1222: 17 fd sbrc r17, 7
1224: 82 c0 rjmp .+260 ; 0x132a <draw_artificial_horizon+0x15e>
cpos = -1*((nick - (ypos * 20))/4);
ypos--;
} else cpos = 4-((nick - (ypos * 20))/4);
1226: 8c ee ldi r24, 0xEC ; 236
1228: 68 02 muls r22, r24
122a: c0 01 movw r24, r0
122c: 11 24 eor r1, r1
122e: 80 0f add r24, r16
1230: 91 1f adc r25, r17
1232: 97 fd sbrc r25, 7
1234: a2 c0 rjmp .+324 ; 0x137a <draw_artificial_horizon+0x1ae>
1236: 95 95 asr r25
1238: 87 95 ror r24
123a: 95 95 asr r25
123c: 87 95 ror r24
123e: 90 95 com r25
1240: 81 95 neg r24
1242: 9f 4f sbci r25, 0xFF ; 255
1244: 18 2f mov r17, r24
1246: 1c 5f subi r17, 0xFC ; 252
if (cpos > 4) cpos = 4;
 
nicky = center_y - ypos;
1248: 67 e0 ldi r22, 0x07 ; 7
124a: 62 1b sub r22, r18
if (nicky > lastline) nicky = lastline;
124c: c6 16 cp r12, r22
124e: 08 f0 brcs .+2 ; 0x1252 <draw_artificial_horizon+0x86>
1250: 80 c0 rjmp .+256 ; 0x1352 <draw_artificial_horizon+0x186>
1252: 0c 2d mov r16, r12
else if (nicky < firstline) nicky = firstline;
 
// ensure roll-borders
rollx = (roll / 8)+15;
1254: 8d 2d mov r24, r13
1256: 9b 2d mov r25, r11
1258: 9c 01 movw r18, r24
125a: 37 fd sbrc r19, 7
125c: 84 c0 rjmp .+264 ; 0x1366 <draw_artificial_horizon+0x19a>
125e: 35 95 asr r19
1260: 27 95 ror r18
1262: 35 95 asr r19
1264: 27 95 ror r18
1266: 35 95 asr r19
1268: 27 95 ror r18
126a: 82 2f mov r24, r18
126c: 81 5f subi r24, 0xF1 ; 241
if (rollx < 2) rollx = 2;
126e: 82 30 cpi r24, 0x02 ; 2
1270: 08 f4 brcc .+2 ; 0x1274 <draw_artificial_horizon+0xa8>
1272: 7c c0 rjmp .+248 ; 0x136c <draw_artificial_horizon+0x1a0>
1274: d8 2e mov r13, r24
1276: 8c e1 ldi r24, 0x1C ; 28
1278: 8d 15 cp r24, r13
127a: 10 f4 brcc .+4 ; 0x1280 <draw_artificial_horizon+0xb4>
127c: 6c e1 ldi r22, 0x1C ; 28
127e: d6 2e mov r13, r22
1280: 4d 2d mov r20, r13
1282: 50 e0 ldi r21, 0x00 ; 0
1284: bd 2c mov r11, r13
else if (rollx > 28) rollx = 28;
 
 
// clear roll
if (old_af_x != rollx && old_af_x >= 0) {
1286: 20 91 09 01 lds r18, 0x0109
128a: 82 2f mov r24, r18
128c: 99 27 eor r25, r25
128e: 87 fd sbrc r24, 7
1290: 90 95 com r25
1292: 84 17 cp r24, r20
1294: 95 07 cpc r25, r21
1296: 39 f0 breq .+14 ; 0x12a6 <draw_artificial_horizon+0xda>
1298: 27 fd sbrc r18, 7
129a: 05 c0 rjmp .+10 ; 0x12a6 <draw_artificial_horizon+0xda>
write_char_xy(old_af_x, lastline, 0);
129c: 82 2f mov r24, r18
129e: 6c 2d mov r22, r12
12a0: 40 e0 ldi r20, 0x00 ; 0
12a2: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
}
 
// clear nick
if (old_af_y != nicky && old_af_y >= 0) {
12a6: 60 91 0a 01 lds r22, 0x010A
12aa: 26 2f mov r18, r22
12ac: 33 27 eor r19, r19
12ae: 27 fd sbrc r18, 7
12b0: 30 95 com r19
12b2: 80 2f mov r24, r16
12b4: 90 e0 ldi r25, 0x00 ; 0
12b6: 28 17 cp r18, r24
12b8: 39 07 cpc r19, r25
12ba: 61 f0 breq .+24 ; 0x12d4 <draw_artificial_horizon+0x108>
12bc: 67 fd sbrc r22, 7
12be: 0a c0 rjmp .+20 ; 0x12d4 <draw_artificial_horizon+0x108>
write_char_xy(center_x-1, old_af_y, 0);
12c0: 8e e0 ldi r24, 0x0E ; 14
12c2: 40 e0 ldi r20, 0x00 ; 0
12c4: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(center_x+1, old_af_y, 0);
12c8: 80 e1 ldi r24, 0x10 ; 16
12ca: 60 91 0a 01 lds r22, 0x010A
12ce: 40 e0 ldi r20, 0x00 ; 0
12d0: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
}
 
 
// draw nick
write_char_xy(center_x-1, nicky, noodle[cpos]);
12d4: 81 2f mov r24, r17
12d6: 15 30 cpi r17, 0x05 ; 5
12d8: 08 f0 brcs .+2 ; 0x12dc <draw_artificial_horizon+0x110>
12da: 84 e0 ldi r24, 0x04 ; 4
12dc: e8 0e add r14, r24
12de: f1 1c adc r15, r1
12e0: f7 01 movw r30, r14
12e2: 10 81 ld r17, Z
12e4: 8e e0 ldi r24, 0x0E ; 14
12e6: 60 2f mov r22, r16
12e8: 41 2f mov r20, r17
12ea: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(center_x+1, nicky, noodle[cpos]);
12ee: 80 e1 ldi r24, 0x10 ; 16
12f0: 60 2f mov r22, r16
12f2: 41 2f mov r20, r17
12f4: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
 
// draw roll
write_char_xy(rollx, lastline, 229);
12f8: 8d 2d mov r24, r13
12fa: 6c 2d mov r22, r12
12fc: 45 ee ldi r20, 0xE5 ; 229
12fe: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
 
// update old vars
old_af_x = rollx;
1302: b0 92 09 01 sts 0x0109, r11
old_af_y = nicky;
1306: 00 93 0a 01 sts 0x010A, r16
// debug numbers
//write_3digit_number_u(20,6,cpos);
//write_number_s(20,7,ypos);
//write_number_s(0,7,nick);
//write_number_s(18,11,roll);
}
130a: 0f 90 pop r0
130c: 0f 90 pop r0
130e: 0f 90 pop r0
1310: 0f 90 pop r0
1312: 0f 90 pop r0
1314: cf 91 pop r28
1316: df 91 pop r29
1318: 1f 91 pop r17
131a: 0f 91 pop r16
131c: ff 90 pop r15
131e: ef 90 pop r14
1320: df 90 pop r13
1322: cf 90 pop r12
1324: bf 90 pop r11
1326: af 90 pop r10
1328: 08 95 ret
// which line
int8_t ypos = nick / 20;
// which character from the array?
if (nick < 0) {
cpos = -1*((nick - (ypos * 20))/4);
132a: 8c ee ldi r24, 0xEC ; 236
132c: 68 02 muls r22, r24
132e: c0 01 movw r24, r0
1330: 11 24 eor r1, r1
1332: 80 0f add r24, r16
1334: 91 1f adc r25, r17
1336: 97 fd sbrc r25, 7
1338: 22 c0 rjmp .+68 ; 0x137e <draw_artificial_horizon+0x1b2>
133a: 95 95 asr r25
133c: 87 95 ror r24
133e: 95 95 asr r25
1340: 87 95 ror r24
1342: 18 2f mov r17, r24
1344: 11 95 neg r17
ypos--;
1346: 21 50 subi r18, 0x01 ; 1
} else cpos = 4-((nick - (ypos * 20))/4);
if (cpos > 4) cpos = 4;
 
nicky = center_y - ypos;
1348: 67 e0 ldi r22, 0x07 ; 7
134a: 62 1b sub r22, r18
if (nicky > lastline) nicky = lastline;
134c: c6 16 cp r12, r22
134e: 08 f4 brcc .+2 ; 0x1352 <draw_artificial_horizon+0x186>
1350: 80 cf rjmp .-256 ; 0x1252 <draw_artificial_horizon+0x86>
1352: 06 2f mov r16, r22
1354: 6a 15 cp r22, r10
1356: 08 f0 brcs .+2 ; 0x135a <draw_artificial_horizon+0x18e>
1358: 7d cf rjmp .-262 ; 0x1254 <draw_artificial_horizon+0x88>
135a: 0a 2d mov r16, r10
else if (nicky < firstline) nicky = firstline;
 
// ensure roll-borders
rollx = (roll / 8)+15;
135c: 8d 2d mov r24, r13
135e: 9b 2d mov r25, r11
1360: 9c 01 movw r18, r24
1362: 37 ff sbrs r19, 7
1364: 7c cf rjmp .-264 ; 0x125e <draw_artificial_horizon+0x92>
1366: 29 5f subi r18, 0xF9 ; 249
1368: 3f 4f sbci r19, 0xFF ; 255
136a: 79 cf rjmp .-270 ; 0x125e <draw_artificial_horizon+0x92>
if (rollx < 2) rollx = 2;
136c: e2 e0 ldi r30, 0x02 ; 2
136e: de 2e mov r13, r30
1370: 42 e0 ldi r20, 0x02 ; 2
1372: 50 e0 ldi r21, 0x00 ; 0
1374: 72 e0 ldi r23, 0x02 ; 2
1376: b7 2e mov r11, r23
1378: 86 cf rjmp .-244 ; 0x1286 <draw_artificial_horizon+0xba>
int8_t ypos = nick / 20;
// which character from the array?
if (nick < 0) {
cpos = -1*((nick - (ypos * 20))/4);
ypos--;
} else cpos = 4-((nick - (ypos * 20))/4);
137a: 03 96 adiw r24, 0x03 ; 3
137c: 5c cf rjmp .-328 ; 0x1236 <draw_artificial_horizon+0x6a>
// which line
int8_t ypos = nick / 20;
// which character from the array?
if (nick < 0) {
cpos = -1*((nick - (ypos * 20))/4);
137e: 03 96 adiw r24, 0x03 ; 3
1380: dc cf rjmp .-72 ; 0x133a <draw_artificial_horizon+0x16e>
 
00001382 <draw_variometer>:
* variometer
* ##########################################################################*/
/**
* draw variometer arrows at <x>/<y> according to <variometer>
*/
void draw_variometer(uint8_t x, uint8_t y, int16_t variometer) {
1382: 28 2f mov r18, r24
1384: 36 2f mov r19, r22
if (variometer == 0) {
1386: 41 15 cp r20, r1
1388: 51 05 cpc r21, r1
138a: b1 f0 breq .+44 ; 0x13b8 <draw_variometer+0x36>
write_char_xy(x, y, 0xbb); // plain line
} else if (variometer > 0) { // gain height
138c: 14 16 cp r1, r20
138e: 15 06 cpc r1, r21
1390: bc f4 brge .+46 ; 0x13c0 <draw_variometer+0x3e>
switch (variometer / 5){
1392: ca 01 movw r24, r20
1394: 65 e0 ldi r22, 0x05 ; 5
1396: 70 e0 ldi r23, 0x00 ; 0
1398: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
139c: 61 30 cpi r22, 0x01 ; 1
139e: 71 05 cpc r23, r1
13a0: 11 f1 breq .+68 ; 0x13e6 <draw_variometer+0x64>
13a2: 62 30 cpi r22, 0x02 ; 2
13a4: 71 05 cpc r23, r1
13a6: 89 f1 breq .+98 ; 0x140a <draw_variometer+0x88>
13a8: 67 2b or r22, r23
13aa: 19 f5 brne .+70 ; 0x13f2 <draw_variometer+0x70>
case 0:
//write_char_xy(x, y, 0xba); // smallest arrow up
write_char_xy(x, y, 0x70); // one arrow up
13ac: 82 2f mov r24, r18
13ae: 63 2f mov r22, r19
13b0: 40 e7 ldi r20, 0x70 ; 112
13b2: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
13b6: 08 95 ret
/**
* draw variometer arrows at <x>/<y> according to <variometer>
*/
void draw_variometer(uint8_t x, uint8_t y, int16_t variometer) {
if (variometer == 0) {
write_char_xy(x, y, 0xbb); // plain line
13b8: 4b eb ldi r20, 0xBB ; 187
13ba: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
13be: 08 95 ret
default:
//write_char_xy(x, y, 0xb7); // largest arrow up
write_char_xy(x, y, 0x73); // three black arrows up
}
} else { // sink
switch (variometer / -5){
13c0: ca 01 movw r24, r20
13c2: 6b ef ldi r22, 0xFB ; 251
13c4: 7f ef ldi r23, 0xFF ; 255
13c6: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
13ca: 61 30 cpi r22, 0x01 ; 1
13cc: 71 05 cpc r23, r1
13ce: b9 f0 breq .+46 ; 0x13fe <draw_variometer+0x7c>
13d0: 62 30 cpi r22, 0x02 ; 2
13d2: 71 05 cpc r23, r1
13d4: 31 f1 breq .+76 ; 0x1422 <draw_variometer+0xa0>
13d6: 67 2b or r22, r23
13d8: f1 f4 brne .+60 ; 0x1416 <draw_variometer+0x94>
case 0:
//write_char_xy(x, y, 0xbc); // smallest arrow down
write_char_xy(x, y, 0x77); // one arrow down
13da: 82 2f mov r24, r18
13dc: 63 2f mov r22, r19
13de: 47 e7 ldi r20, 0x77 ; 119
13e0: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
13e4: 08 95 ret
//write_char_xy(x, y, 0xba); // smallest arrow up
write_char_xy(x, y, 0x70); // one arrow up
break;
case 1:
//write_char_xy(x, y, 0xb9); // small arrow up
write_char_xy(x, y, 0x71); // two arrows up
13e6: 82 2f mov r24, r18
13e8: 63 2f mov r22, r19
13ea: 41 e7 ldi r20, 0x71 ; 113
13ec: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
13f0: 08 95 ret
//write_char_xy(x, y, 0xb8); // large arrow up
write_char_xy(x, y, 0x72); // three arrows up
break;
default:
//write_char_xy(x, y, 0xb7); // largest arrow up
write_char_xy(x, y, 0x73); // three black arrows up
13f2: 82 2f mov r24, r18
13f4: 63 2f mov r22, r19
13f6: 43 e7 ldi r20, 0x73 ; 115
13f8: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
13fc: 08 95 ret
//write_char_xy(x, y, 0xbc); // smallest arrow down
write_char_xy(x, y, 0x77); // one arrow down
break;
case 1:
//write_char_xy(x, y, 0xbd); // small arrow down
write_char_xy(x, y, 0x76); // two arrows down
13fe: 82 2f mov r24, r18
1400: 63 2f mov r22, r19
1402: 46 e7 ldi r20, 0x76 ; 118
1404: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
1408: 08 95 ret
//write_char_xy(x, y, 0xb9); // small arrow up
write_char_xy(x, y, 0x71); // two arrows up
break;
case 2:
//write_char_xy(x, y, 0xb8); // large arrow up
write_char_xy(x, y, 0x72); // three arrows up
140a: 82 2f mov r24, r18
140c: 63 2f mov r22, r19
140e: 42 e7 ldi r20, 0x72 ; 114
1410: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
1414: 08 95 ret
//write_char_xy(x, y, 0xbe); // large arrow down
write_char_xy(x, y, 0x75); // three arrows down
break;
default:
//write_char_xy(x, y, 0xbf); // largest arrow down
write_char_xy(x, y, 0x74); // three black arrows down
1416: 82 2f mov r24, r18
1418: 63 2f mov r22, r19
141a: 44 e7 ldi r20, 0x74 ; 116
141c: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
1420: 08 95 ret
//write_char_xy(x, y, 0xbd); // small arrow down
write_char_xy(x, y, 0x76); // two arrows down
break;
case 2:
//write_char_xy(x, y, 0xbe); // large arrow down
write_char_xy(x, y, 0x75); // three arrows down
1422: 82 2f mov r24, r18
1424: 63 2f mov r22, r19
1426: 45 e7 ldi r20, 0x75 ; 117
1428: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
142c: 08 95 ret
 
0000142e <draw_battery>:
* battery index
* ##########################################################################*/
/**
* draw a battery symbol at <x>/<y> according to <voltage>
*/
void draw_battery(uint8_t x, uint8_t y, uint8_t min_voltage, uint8_t voltage, uint8_t max_voltage) {
142e: 0f 93 push r16
1430: e8 2f mov r30, r24
1432: f6 2f mov r31, r22
uint8_t percent = (100* (voltage - min_voltage) / (max_voltage - min_voltage));
if (percent > 100) percent = 100;
if (voltage < min_voltage) percent = 0;
1434: 24 17 cp r18, r20
1436: 38 f4 brcc .+14 ; 0x1446 <draw_battery+0x18>
1438: 4d e9 ldi r20, 0x9D ; 157
write_char_xy(x, y, 0x9d - (percent * 13 / 100));
143a: 8e 2f mov r24, r30
143c: 6f 2f mov r22, r31
143e: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
//write_ndigit_number_u(x, y-1, percent * 13 / 100, 100, 0);
}
1442: 0f 91 pop r16
1444: 08 95 ret
* ##########################################################################*/
/**
* draw a battery symbol at <x>/<y> according to <voltage>
*/
void draw_battery(uint8_t x, uint8_t y, uint8_t min_voltage, uint8_t voltage, uint8_t max_voltage) {
uint8_t percent = (100* (voltage - min_voltage) / (max_voltage - min_voltage));
1446: 84 2f mov r24, r20
1448: 90 e0 ldi r25, 0x00 ; 0
144a: 30 e0 ldi r19, 0x00 ; 0
144c: 28 1b sub r18, r24
144e: 39 0b sbc r19, r25
1450: 60 2f mov r22, r16
1452: 70 e0 ldi r23, 0x00 ; 0
1454: 68 1b sub r22, r24
1456: 79 0b sbc r23, r25
1458: 84 e6 ldi r24, 0x64 ; 100
145a: 90 e0 ldi r25, 0x00 ; 0
145c: ac 01 movw r20, r24
145e: 24 9f mul r18, r20
1460: c0 01 movw r24, r0
1462: 25 9f mul r18, r21
1464: 90 0d add r25, r0
1466: 34 9f mul r19, r20
1468: 90 0d add r25, r0
146a: 11 24 eor r1, r1
146c: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
1470: 65 36 cpi r22, 0x65 ; 101
1472: 08 f0 brcs .+2 ; 0x1476 <draw_battery+0x48>
1474: 64 e6 ldi r22, 0x64 ; 100
1476: 86 2f mov r24, r22
1478: 90 e0 ldi r25, 0x00 ; 0
147a: 9c 01 movw r18, r24
147c: 22 0f add r18, r18
147e: 33 1f adc r19, r19
1480: 28 0f add r18, r24
1482: 39 1f adc r19, r25
1484: 22 0f add r18, r18
1486: 33 1f adc r19, r19
1488: 22 0f add r18, r18
148a: 33 1f adc r19, r19
148c: 28 0f add r18, r24
148e: 39 1f adc r19, r25
1490: c9 01 movw r24, r18
1492: 6c e9 ldi r22, 0x9C ; 156
1494: 7f ef ldi r23, 0xFF ; 255
1496: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
149a: 46 2f mov r20, r22
149c: 43 56 subi r20, 0x63 ; 99
if (percent > 100) percent = 100;
if (voltage < min_voltage) percent = 0;
write_char_xy(x, y, 0x9d - (percent * 13 / 100));
149e: 8e 2f mov r24, r30
14a0: 6f 2f mov r22, r31
14a2: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
//write_ndigit_number_u(x, y-1, percent * 13 / 100, 100, 0);
}
14a6: 0f 91 pop r16
14a8: 08 95 ret
 
000014aa <draw_compass>:
}
 
/**
* draw a compass rose at <x>/<y> for <heading>
*/
void draw_compass(uint8_t x, uint8_t y, uint16_t heading) {
14aa: ef 92 push r14
14ac: ff 92 push r15
14ae: 0f 93 push r16
14b0: 1f 93 push r17
14b2: cf 93 push r28
14b4: df 93 push r29
14b6: 28 2f mov r18, r24
14b8: 06 2f mov r16, r22
14ba: ca 01 movw r24, r20
216, 215, 216, 212, 216, 215, 216, 214, 216, 215, 216, 211,
216, 215, 216, 213, 216, 215, 216, 212, 216, 215, 216, 214};
// the center is char 19 (north), we add the current heading in 8th
// which would be 22.5 degrees, but float would bloat up the code
// and *10 / 225 would take ages... so we take the uncorrect way
uint8_t front = 19 + (heading / 22);
14bc: 66 e1 ldi r22, 0x16 ; 22
14be: 70 e0 ldi r23, 0x00 ; 0
14c0: 0e 94 68 1c call 0x38d0 ; 0x38d0 <__udivmodhi4>
14c4: 6d 5e subi r22, 0xED ; 237
14c6: 70 e0 ldi r23, 0x00 ; 0
14c8: eb 01 movw r28, r22
14ca: c0 55 subi r28, 0x50 ; 80
14cc: de 4f sbci r29, 0xFE ; 254
for (uint8_t i = 0; i < 9; i++) {
14ce: 55 e0 ldi r21, 0x05 ; 5
14d0: e5 2e mov r14, r21
14d2: f1 2c mov r15, r1
14d4: e6 0e add r14, r22
14d6: f7 1e adc r15, r23
14d8: 84 eb ldi r24, 0xB4 ; 180
14da: 91 e0 ldi r25, 0x01 ; 1
14dc: e8 0e add r14, r24
14de: f9 1e adc r15, r25
write_char_xy(x++, y, pgm_read_byte(&rose[front - 4 + i]));
14e0: 12 2f mov r17, r18
14e2: 1f 5f subi r17, 0xFF ; 255
14e4: fe 01 movw r30, r28
14e6: 44 91 lpm r20, Z+
14e8: 82 2f mov r24, r18
14ea: 60 2f mov r22, r16
14ec: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
14f0: 21 96 adiw r28, 0x01 ; 1
14f2: 21 2f mov r18, r17
216, 215, 216, 213, 216, 215, 216, 212, 216, 215, 216, 214};
// the center is char 19 (north), we add the current heading in 8th
// which would be 22.5 degrees, but float would bloat up the code
// and *10 / 225 would take ages... so we take the uncorrect way
uint8_t front = 19 + (heading / 22);
for (uint8_t i = 0; i < 9; i++) {
14f4: ce 15 cp r28, r14
14f6: df 05 cpc r29, r15
14f8: 99 f7 brne .-26 ; 0x14e0 <draw_compass+0x36>
write_char_xy(x++, y, pgm_read_byte(&rose[front - 4 + i]));
}
}
14fa: df 91 pop r29
14fc: cf 91 pop r28
14fe: 1f 91 pop r17
1500: 0f 91 pop r16
1502: ff 90 pop r15
1504: ef 90 pop r14
1506: 08 95 ret
 
00001508 <draw_big_variometer>:
 
/**
* draw a bigger vario with middle at <x>/<y> acording to <variometer>
*/
void draw_big_variometer(uint8_t x, uint8_t y, int16_t variometer) {
int16_t index = 7 + variometer;
1508: 49 5f subi r20, 0xF9 ; 249
150a: 5f 4f sbci r21, 0xFF ; 255
150c: 57 fd sbrc r21, 7
150e: 11 c0 rjmp .+34 ; 0x1532 <draw_big_variometer+0x2a>
if (index > 14) index = 14;
else if (index < 0) index = 0;
write_string_pgm_down(x, y-2, (const char *) (pgm_read_word ( &(vario_pnt[index]))), 5);
1510: 4f 30 cpi r20, 0x0F ; 15
1512: 51 05 cpc r21, r1
1514: 14 f0 brlt .+4 ; 0x151a <draw_big_variometer+0x12>
1516: 4e e0 ldi r20, 0x0E ; 14
1518: 50 e0 ldi r21, 0x00 ; 0
151a: fa 01 movw r30, r20
151c: ee 0f add r30, r30
151e: ff 1f adc r31, r31
1520: ea 56 subi r30, 0x6A ; 106
1522: fe 4f sbci r31, 0xFE ; 254
1524: 45 91 lpm r20, Z+
1526: 54 91 lpm r21, Z+
1528: 62 50 subi r22, 0x02 ; 2
152a: 25 e0 ldi r18, 0x05 ; 5
152c: 0e 94 ad 05 call 0xb5a ; 0xb5a <write_string_pgm_down>
}
1530: 08 95 ret
 
/**
* draw a bigger vario with middle at <x>/<y> acording to <variometer>
*/
void draw_big_variometer(uint8_t x, uint8_t y, int16_t variometer) {
int16_t index = 7 + variometer;
1532: 40 e0 ldi r20, 0x00 ; 0
1534: 50 e0 ldi r21, 0x00 ; 0
1536: ec cf rjmp .-40 ; 0x1510 <draw_big_variometer+0x8>
 
00001538 <onoff>:
* ##########################################################################*/
 
/**
* helper function for flag display
*/
void onoff(uint8_t line, uint8_t onoff) {
1538: 98 2f mov r25, r24
if (onoff) {
153a: 66 23 and r22, r22
153c: 39 f4 brne .+14 ; 0x154c <onoff+0x14>
write_ascii_string_pgm(23, line, PSTR("ON "));
} else {
write_ascii_string_pgm(23, line, PSTR("OFF"));
153e: 87 e1 ldi r24, 0x17 ; 23
1540: 69 2f mov r22, r25
1542: 48 ee ldi r20, 0xE8 ; 232
1544: 52 e0 ldi r21, 0x02 ; 2
1546: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
154a: 08 95 ret
/**
* helper function for flag display
*/
void onoff(uint8_t line, uint8_t onoff) {
if (onoff) {
write_ascii_string_pgm(23, line, PSTR("ON "));
154c: 87 e1 ldi r24, 0x17 ; 23
154e: 69 2f mov r22, r25
1550: 4c ee ldi r20, 0xEC ; 236
1552: 52 e0 ldi r21, 0x02 ; 2
1554: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
1558: 08 95 ret
 
0000155a <config_menu_drawings>:
}
 
/**
* helper function for menu updating
*/
void config_menu_drawings(uint8_t chosen) {
155a: ff 92 push r15
155c: 0f 93 push r16
155e: 1f 93 push r17
1560: 28 2f mov r18, r24
1562: 90 e0 ldi r25, 0x00 ; 0
1564: 0b 96 adiw r24, 0x0b ; 11
1566: 6c e0 ldi r22, 0x0C ; 12
1568: 70 e0 ldi r23, 0x00 ; 0
156a: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
156e: 92 e0 ldi r25, 0x02 ; 2
1570: f9 2e mov r15, r25
1572: f8 0e add r15, r24
1574: 02 2f mov r16, r18
1576: 0e 5f subi r16, 0xFE ; 254
1578: 12 e0 ldi r17, 0x02 ; 2
uint8_t line = 2;
 
// clear prevoius _cursor_
//write_char_xy(3, line + ((chosen + 11) % 12), 0x00);
for (uint8_t x = 2; x < 28; x++) {
write_char_att_xy(x, line + ((chosen + 11) % 12), 0);
157a: 81 2f mov r24, r17
157c: 6f 2d mov r22, r15
157e: 40 e0 ldi r20, 0x00 ; 0
1580: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
write_char_att_xy(x, line + chosen, BLACKBG | INVERT);
1584: 81 2f mov r24, r17
1586: 60 2f mov r22, r16
1588: 4f ea ldi r20, 0xAF ; 175
158a: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
void config_menu_drawings(uint8_t chosen) {
uint8_t line = 2;
 
// clear prevoius _cursor_
//write_char_xy(3, line + ((chosen + 11) % 12), 0x00);
for (uint8_t x = 2; x < 28; x++) {
158e: 1f 5f subi r17, 0xFF ; 255
1590: 1c 31 cpi r17, 0x1C ; 28
1592: 99 f7 brne .-26 ; 0x157a <config_menu_drawings+0x20>
};
// draw current _cursor_
//write_char_xy(3, line + chosen, 0xD9);
 
write_ascii_string_pgm(4, line, PSTR("Video Mode"));
1594: 84 e0 ldi r24, 0x04 ; 4
1596: 62 e0 ldi r22, 0x02 ; 2
1598: 4d ed ldi r20, 0xDD ; 221
159a: 52 e0 ldi r21, 0x02 ; 2
159c: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
15a0: 80 91 1c 01 lds r24, 0x011C
15a4: 80 ff sbrs r24, 0
15a6: 85 c0 rjmp .+266 ; 0x16b2 <config_menu_drawings+0x158>
write_ascii_string_pgm(23, line, VM_NTSC);
15a8: 87 e1 ldi r24, 0x17 ; 23
15aa: 62 e0 ldi r22, 0x02 ; 2
15ac: 49 ee ldi r20, 0xE9 ; 233
15ae: 51 e0 ldi r21, 0x01 ; 1
15b0: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
} else {
write_ascii_string_pgm(23, line, VM_PAL);
}
write_ascii_string_pgm(4, ++line, PSTR("Full HUD"));
15b4: 84 e0 ldi r24, 0x04 ; 4
15b6: 63 e0 ldi r22, 0x03 ; 3
15b8: 44 ed ldi r20, 0xD4 ; 212
15ba: 52 e0 ldi r21, 0x02 ; 2
15bc: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_HUD);
15c0: 60 91 1b 01 lds r22, 0x011B
15c4: 61 70 andi r22, 0x01 ; 1
15c6: 83 e0 ldi r24, 0x03 ; 3
15c8: 0e 94 9c 0a call 0x1538 ; 0x1538 <onoff>
write_ascii_string_pgm(4, ++line, PSTR("Art Horizon in HUD"));
15cc: 84 e0 ldi r24, 0x04 ; 4
15ce: 64 e0 ldi r22, 0x04 ; 4
15d0: 41 ec ldi r20, 0xC1 ; 193
15d2: 52 e0 ldi r21, 0x02 ; 2
15d4: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON);
15d8: 60 91 1b 01 lds r22, 0x011B
15dc: 62 70 andi r22, 0x02 ; 2
15de: 84 e0 ldi r24, 0x04 ; 4
15e0: 0e 94 9c 0a call 0x1538 ; 0x1538 <onoff>
write_ascii_string_pgm(4, ++line, PSTR("Big Vario bar"));
15e4: 84 e0 ldi r24, 0x04 ; 4
15e6: 65 e0 ldi r22, 0x05 ; 5
15e8: 43 eb ldi r20, 0xB3 ; 179
15ea: 52 e0 ldi r21, 0x02 ; 2
15ec: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO);
15f0: 60 91 1b 01 lds r22, 0x011B
15f4: 64 70 andi r22, 0x04 ; 4
15f6: 85 e0 ldi r24, 0x05 ; 5
15f8: 0e 94 9c 0a call 0x1538 ; 0x1538 <onoff>
 
write_ascii_string_pgm(4, ++line, PSTR("Statistics"));
15fc: 84 e0 ldi r24, 0x04 ; 4
15fe: 66 e0 ldi r22, 0x06 ; 6
1600: 48 ea ldi r20, 0xA8 ; 168
1602: 52 e0 ldi r21, 0x02 ; 2
1604: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_STATS);
1608: 60 91 1b 01 lds r22, 0x011B
160c: 68 70 andi r22, 0x08 ; 8
160e: 86 e0 ldi r24, 0x06 ; 6
1610: 0e 94 9c 0a call 0x1538 ; 0x1538 <onoff>
 
write_ascii_string_pgm(4, ++line, PSTR("Current by FC"));
1614: 84 e0 ldi r24, 0x04 ; 4
1616: 67 e0 ldi r22, 0x07 ; 7
1618: 4a e9 ldi r20, 0x9A ; 154
161a: 52 e0 ldi r21, 0x02 ; 2
161c: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT);
1620: 60 91 1b 01 lds r22, 0x011B
1624: 60 74 andi r22, 0x40 ; 64
1626: 87 e0 ldi r24, 0x07 ; 7
1628: 0e 94 9c 0a call 0x1538 ; 0x1538 <onoff>
 
write_ascii_string_pgm(4, ++line, PSTR("Voltage by C-Strom"));
162c: 84 e0 ldi r24, 0x04 ; 4
162e: 68 e0 ldi r22, 0x08 ; 8
1630: 47 e8 ldi r20, 0x87 ; 135
1632: 52 e0 ldi r21, 0x02 ; 2
1634: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
onoff(line, COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT);
1638: 60 91 1b 01 lds r22, 0x011B
163c: 60 72 andi r22, 0x20 ; 32
163e: 88 e0 ldi r24, 0x08 ; 8
1640: 0e 94 9c 0a call 0x1538 ; 0x1538 <onoff>
 
write_ascii_string_pgm(4, ++line, PSTR("Reset uptime"));
1644: 84 e0 ldi r24, 0x04 ; 4
1646: 69 e0 ldi r22, 0x09 ; 9
1648: 4a e7 ldi r20, 0x7A ; 122
164a: 52 e0 ldi r21, 0x02 ; 2
164c: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ascii_string_pgm(4, ++line, PSTR("Display Mode"));
1650: 84 e0 ldi r24, 0x04 ; 4
1652: 6a e0 ldi r22, 0x0A ; 10
1654: 4d e6 ldi r20, 0x6D ; 109
1656: 52 e0 ldi r21, 0x02 ; 2
1658: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ascii_string_pgm(18, line, (const char *) (pgm_read_word(&(mode->desc))));
165c: e0 91 9d 02 lds r30, 0x029D
1660: f0 91 9e 02 lds r31, 0x029E
1664: 32 96 adiw r30, 0x02 ; 2
1666: 45 91 lpm r20, Z+
1668: 54 91 lpm r21, Z+
166a: 82 e1 ldi r24, 0x12 ; 18
166c: 6a e0 ldi r22, 0x0A ; 10
166e: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ascii_string_pgm(4, ++line, PSTR("Height by"));
1672: 84 e0 ldi r24, 0x04 ; 4
1674: 6b e0 ldi r22, 0x0B ; 11
1676: 43 e6 ldi r20, 0x63 ; 99
1678: 52 e0 ldi r21, 0x02 ; 2
167a: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
if (COSD_FLAGS_CONFIG & COSD_FLAG_GPSHEIGHT) {
167e: 80 91 1c 01 lds r24, 0x011C
1682: 81 fd sbrc r24, 1
1684: 1d c0 rjmp .+58 ; 0x16c0 <config_menu_drawings+0x166>
write_ascii_string_pgm(20, line, PSTR(" GPS"));
} else {
write_ascii_string_pgm(20, line, PSTR("BARO"));
1686: 84 e1 ldi r24, 0x14 ; 20
1688: 6b e0 ldi r22, 0x0B ; 11
168a: 49 e5 ldi r20, 0x59 ; 89
168c: 52 e0 ldi r21, 0x02 ; 2
168e: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
}
 
write_ascii_string_pgm(4, ++line, PSTR("Save config"));
1692: 84 e0 ldi r24, 0x04 ; 4
1694: 6c e0 ldi r22, 0x0C ; 12
1696: 4d e4 ldi r20, 0x4D ; 77
1698: 52 e0 ldi r21, 0x02 ; 2
169a: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ascii_string_pgm(4, ++line, PSTR("EXIT"));
169e: 84 e0 ldi r24, 0x04 ; 4
16a0: 6d e0 ldi r22, 0x0D ; 13
16a2: 48 e4 ldi r20, 0x48 ; 72
16a4: 52 e0 ldi r21, 0x02 ; 2
16a6: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
}
16aa: 1f 91 pop r17
16ac: 0f 91 pop r16
16ae: ff 90 pop r15
16b0: 08 95 ret
 
write_ascii_string_pgm(4, line, PSTR("Video Mode"));
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
write_ascii_string_pgm(23, line, VM_NTSC);
} else {
write_ascii_string_pgm(23, line, VM_PAL);
16b2: 87 e1 ldi r24, 0x17 ; 23
16b4: 62 e0 ldi r22, 0x02 ; 2
16b6: 44 ee ldi r20, 0xE4 ; 228
16b8: 51 e0 ldi r21, 0x01 ; 1
16ba: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
16be: 7a cf rjmp .-268 ; 0x15b4 <config_menu_drawings+0x5a>
write_ascii_string_pgm(4, ++line, PSTR("Display Mode"));
write_ascii_string_pgm(18, line, (const char *) (pgm_read_word(&(mode->desc))));
write_ascii_string_pgm(4, ++line, PSTR("Height by"));
if (COSD_FLAGS_CONFIG & COSD_FLAG_GPSHEIGHT) {
write_ascii_string_pgm(20, line, PSTR(" GPS"));
16c0: 84 e1 ldi r24, 0x14 ; 20
16c2: 6b e0 ldi r22, 0x0B ; 11
16c4: 4e e5 ldi r20, 0x5E ; 94
16c6: 52 e0 ldi r21, 0x02 ; 2
16c8: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
16cc: e2 cf rjmp .-60 ; 0x1692 <config_menu_drawings+0x138>
 
000016ce <config_menu_doclick>:
}
 
/**
* some sort of clicking response in the menu
*/
void config_menu_doclick(uint8_t chosen) {
16ce: 1f 93 push r17
16d0: 18 2f mov r17, r24
write_ascii_string_pgm(4, chosen + 2, PSTR("DONE "));
16d2: 68 2f mov r22, r24
16d4: 6e 5f subi r22, 0xFE ; 254
16d6: 84 e0 ldi r24, 0x04 ; 4
16d8: 45 e3 ldi r20, 0x35 ; 53
16da: 52 e0 ldi r21, 0x02 ; 2
16dc: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
16e0: 28 e8 ldi r18, 0x88 ; 136
16e2: 33 e1 ldi r19, 0x13 ; 19
milliseconds can be achieved.
*/
void
_delay_loop_2(uint16_t __count)
{
__asm__ volatile (
16e4: 40 e9 ldi r20, 0x90 ; 144
16e6: 51 e0 ldi r21, 0x01 ; 1
16e8: ca 01 movw r24, r20
16ea: 01 97 sbiw r24, 0x01 ; 1
16ec: f1 f7 brne .-4 ; 0x16ea <config_menu_doclick+0x1c>
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
16ee: 21 50 subi r18, 0x01 ; 1
16f0: 30 40 sbci r19, 0x00 ; 0
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
16f2: d1 f7 brne .-12 ; 0x16e8 <config_menu_doclick+0x1a>
_delay_ms(500);
config_menu_drawings(chosen);
16f4: 81 2f mov r24, r17
16f6: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
}
16fa: 1f 91 pop r17
16fc: 08 95 ret
 
000016fe <save_eeprom>:
 
/**
* save data to eeprom
*/
void save_eeprom() {
eeprom_write_byte(&ee_checkbyte1, CHECKBYTE1);
16fe: 80 e0 ldi r24, 0x00 ; 0
1700: 90 e0 ldi r25, 0x00 ; 0
1702: 6e e2 ldi r22, 0x2E ; 46
1704: 0e 94 f5 1c call 0x39ea ; 0x39ea <__eewr_byte_m162>
eeprom_write_byte(&ee_checkbyte2, CHECKBYTE2);
1708: 81 e0 ldi r24, 0x01 ; 1
170a: 90 e0 ldi r25, 0x00 ; 0
170c: 67 e1 ldi r22, 0x17 ; 23
170e: 0e 94 f5 1c call 0x39ea ; 0x39ea <__eewr_byte_m162>
eeprom_write_byte(&ee_COSD_FLAGS_MODES, COSD_FLAGS_MODES);
1712: 82 e0 ldi r24, 0x02 ; 2
1714: 90 e0 ldi r25, 0x00 ; 0
1716: 60 91 1b 01 lds r22, 0x011B
171a: 0e 94 f5 1c call 0x39ea ; 0x39ea <__eewr_byte_m162>
eeprom_write_byte(&ee_COSD_FLAGS_CONFIG, COSD_FLAGS_CONFIG);
171e: 83 e0 ldi r24, 0x03 ; 3
1720: 90 e0 ldi r25, 0x00 ; 0
1722: 60 91 1c 01 lds r22, 0x011C
1726: 0e 94 f5 1c call 0x39ea ; 0x39ea <__eewr_byte_m162>
eeprom_write_byte(&ee_COSD_DISPLAYMODE, COSD_DISPLAYMODE);
172a: 84 e0 ldi r24, 0x04 ; 4
172c: 90 e0 ldi r25, 0x00 ; 0
172e: 60 91 1e 01 lds r22, 0x011E
1732: 0e 94 f5 1c call 0x39ea ; 0x39ea <__eewr_byte_m162>
}
1736: 08 95 ret
 
00001738 <config_menu>:
}
 
/**
* a simple config menu tryout
*/
void config_menu(void) {
1738: af 92 push r10
173a: bf 92 push r11
173c: cf 92 push r12
173e: df 92 push r13
1740: ef 92 push r14
1742: ff 92 push r15
1744: 0f 93 push r16
1746: 1f 93 push r17
1748: cf 93 push r28
174a: df 93 push r29
// disable interrupts (makes the menu more smoothely)
cli();
174c: f8 94 cli
 
// clear screen
clear();
174e: 0e 94 75 08 call 0x10ea ; 0x10ea <clear>
 
uint8_t chosen = 0;
uint8_t inmenu = 1;
write_ascii_string_pgm(6, 1, PSTR("C-OSD Config Menu"));
1752: 86 e0 ldi r24, 0x06 ; 6
1754: 61 e0 ldi r22, 0x01 ; 1
1756: 43 e2 ldi r20, 0x23 ; 35
1758: 52 e0 ldi r21, 0x02 ; 2
175a: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
175e: 24 ec ldi r18, 0xC4 ; 196
1760: 39 e0 ldi r19, 0x09 ; 9
1762: 40 e9 ldi r20, 0x90 ; 144
1764: 51 e0 ldi r21, 0x01 ; 1
1766: ca 01 movw r24, r20
1768: 01 97 sbiw r24, 0x01 ; 1
176a: f1 f7 brne .-4 ; 0x1768 <config_menu+0x30>
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
176c: 21 50 subi r18, 0x01 ; 1
176e: 30 40 sbci r19, 0x00 ; 0
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
1770: d1 f7 brne .-12 ; 0x1766 <config_menu+0x2e>
 
// wait a bit before doing stuff so user has chance to release button
_delay_ms(250);
 
config_menu_drawings(chosen);
1772: 80 e0 ldi r24, 0x00 ; 0
1774: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
1778: 10 e0 ldi r17, 0x00 ; 0
177a: c0 e9 ldi r28, 0x90 ; 144
177c: d1 e0 ldi r29, 0x01 ; 1
/*case 5: // warnings
COSD_FLAGS_MODES ^= COSD_FLAG_WARNINGS;
config_menu_drawings(chosen);
break;*/
case 5: // current by fc
COSD_FLAGS_MODES ^= COSD_FLAG_FCCURRENT;
177e: 00 e4 ldi r16, 0x40 ; 64
config_menu_drawings(chosen);
1780: ff 24 eor r15, r15
1782: f3 94 inc r15
osd_ncmode = (int(*)(void)) pgm_read_word(&mode->dfun);
#endif
config_menu_drawings(chosen);
break;
case 9: // GPS or BARO height
COSD_FLAGS_CONFIG ^= COSD_FLAG_GPSHEIGHT;
1784: 72 e0 ldi r23, 0x02 ; 2
1786: e7 2e mov r14, r23
case 5: // current by fc
COSD_FLAGS_MODES ^= COSD_FLAG_FCCURRENT;
config_menu_drawings(chosen);
break;
case 6: // 2nd voltage by c-strom
COSD_FLAGS_MODES ^= COSD_FLAG_STROMVOLT;
1788: 60 e2 ldi r22, 0x20 ; 32
178a: d6 2e mov r13, r22
case 2: // art horizon
COSD_FLAGS_MODES ^= COSD_FLAG_ARTHORIZON;
config_menu_drawings(chosen);
break;
case 3: // big vario
COSD_FLAGS_MODES ^= COSD_FLAG_BIGVARIO;
178c: 54 e0 ldi r21, 0x04 ; 4
178e: c5 2e mov r12, r21
bottom_line = 12;
} else {
// PAL + enable display immediately (VM0)
spi_send_byte(0x00, 0b01001000);
 
bottom_line = 14;
1790: 4e e0 ldi r20, 0x0E ; 14
1792: b4 2e mov r11, r20
// Setup Video Mode
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
// NTSC + enable display immediately (VM0)
spi_send_byte(0x00, 0b00001000);
 
bottom_line = 12;
1794: 3c e0 ldi r19, 0x0C ; 12
1796: a3 2e mov r10, r19
_delay_ms(250);
 
config_menu_drawings(chosen);
 
while (inmenu) {
if (s2_pressed()) {
1798: 0e 94 79 0e call 0x1cf2 ; 0x1cf2 <s2_pressed>
179c: 89 2b or r24, r25
179e: b1 f0 breq .+44 ; 0x17cc <config_menu+0x94>
chosen = (chosen + 1) % 12;
17a0: 81 2f mov r24, r17
17a2: 90 e0 ldi r25, 0x00 ; 0
17a4: 01 96 adiw r24, 0x01 ; 1
17a6: 6c e0 ldi r22, 0x0C ; 12
17a8: 70 e0 ldi r23, 0x00 ; 0
17aa: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
17ae: 18 2f mov r17, r24
config_menu_drawings(chosen);
17b0: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
17b4: 28 e8 ldi r18, 0x88 ; 136
17b6: 33 e1 ldi r19, 0x13 ; 19
17b8: ce 01 movw r24, r28
17ba: 01 97 sbiw r24, 0x01 ; 1
17bc: f1 f7 brne .-4 ; 0x17ba <config_menu+0x82>
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
17be: 21 50 subi r18, 0x01 ; 1
17c0: 30 40 sbci r19, 0x00 ; 0
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
17c2: d1 f7 brne .-12 ; 0x17b8 <config_menu+0x80>
_delay_ms(250);
 
config_menu_drawings(chosen);
 
while (inmenu) {
if (s2_pressed()) {
17c4: 0e 94 79 0e call 0x1cf2 ; 0x1cf2 <s2_pressed>
17c8: 89 2b or r24, r25
17ca: 51 f7 brne .-44 ; 0x17a0 <config_menu+0x68>
chosen = (chosen + 1) % 12;
config_menu_drawings(chosen);
_delay_ms(500);
} else if (s1_pressed()) {
17cc: 0e 94 58 0e call 0x1cb0 ; 0x1cb0 <s1_pressed>
17d0: 89 2b or r24, r25
17d2: 11 f3 breq .-60 ; 0x1798 <config_menu+0x60>
switch (chosen) {
17d4: 15 30 cpi r17, 0x05 ; 5
17d6: 09 f4 brne .+2 ; 0x17da <config_menu+0xa2>
17d8: bf c0 rjmp .+382 ; 0x1958 <config_menu+0x220>
17da: 16 30 cpi r17, 0x06 ; 6
17dc: 58 f5 brcc .+86 ; 0x1834 <config_menu+0xfc>
17de: 12 30 cpi r17, 0x02 ; 2
17e0: 09 f4 brne .+2 ; 0x17e4 <config_menu+0xac>
17e2: b0 c0 rjmp .+352 ; 0x1944 <config_menu+0x20c>
17e4: 13 30 cpi r17, 0x03 ; 3
17e6: 08 f4 brcc .+2 ; 0x17ea <config_menu+0xb2>
17e8: 41 c0 rjmp .+130 ; 0x186c <config_menu+0x134>
17ea: 13 30 cpi r17, 0x03 ; 3
17ec: 09 f4 brne .+2 ; 0x17f0 <config_menu+0xb8>
17ee: 62 c0 rjmp .+196 ; 0x18b4 <config_menu+0x17c>
17f0: 14 30 cpi r17, 0x04 ; 4
17f2: 09 f4 brne .+2 ; 0x17f6 <config_menu+0xbe>
17f4: 54 c0 rjmp .+168 ; 0x189e <config_menu+0x166>
COSD_FLAGS_CONFIG ^= COSD_FLAG_GPSHEIGHT;
config_menu_drawings(chosen);
break;
case 10: // save
save_eeprom();
config_menu_doclick(chosen);
17f6: 41 e0 ldi r20, 0x01 ; 1
17f8: 24 ec ldi r18, 0xC4 ; 196
17fa: 39 e0 ldi r19, 0x09 ; 9
17fc: ce 01 movw r24, r28
17fe: 01 97 sbiw r24, 0x01 ; 1
1800: f1 f7 brne .-4 ; 0x17fe <config_menu+0xc6>
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
1802: 21 50 subi r18, 0x01 ; 1
1804: 30 40 sbci r19, 0x00 ; 0
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
1806: d1 f7 brne .-12 ; 0x17fc <config_menu+0xc4>
// wait a bit before doing stuff so user has chance to release button
_delay_ms(250);
 
config_menu_drawings(chosen);
 
while (inmenu) {
1808: 44 23 and r20, r20
180a: 09 f0 breq .+2 ; 0x180e <config_menu+0xd6>
180c: c5 cf rjmp .-118 ; 0x1798 <config_menu+0x60>
_delay_ms(250);
}
}
 
// clear screen up again
clear();
180e: 0e 94 75 08 call 0x10ea ; 0x10ea <clear>
 
// update flags to paint display again if needed
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
1812: 80 91 1d 01 lds r24, 0x011D
1816: 8d 7f andi r24, 0xFD ; 253
1818: 80 93 1d 01 sts 0x011D, r24
 
// enable interrupts again
sei();
181c: 78 94 sei
}
181e: df 91 pop r29
1820: cf 91 pop r28
1822: 1f 91 pop r17
1824: 0f 91 pop r16
1826: ff 90 pop r15
1828: ef 90 pop r14
182a: df 90 pop r13
182c: cf 90 pop r12
182e: bf 90 pop r11
1830: af 90 pop r10
1832: 08 95 ret
if (s2_pressed()) {
chosen = (chosen + 1) % 12;
config_menu_drawings(chosen);
_delay_ms(500);
} else if (s1_pressed()) {
switch (chosen) {
1834: 18 30 cpi r17, 0x08 ; 8
1836: 09 f4 brne .+2 ; 0x183a <config_menu+0x102>
1838: 63 c0 rjmp .+198 ; 0x1900 <config_menu+0x1c8>
183a: 19 30 cpi r17, 0x09 ; 9
183c: 48 f0 brcs .+18 ; 0x1850 <config_menu+0x118>
183e: 1a 30 cpi r17, 0x0A ; 10
1840: 09 f4 brne .+2 ; 0x1844 <config_menu+0x10c>
1842: 7a c0 rjmp .+244 ; 0x1938 <config_menu+0x200>
1844: 1a 30 cpi r17, 0x0A ; 10
1846: 08 f1 brcs .+66 ; 0x188a <config_menu+0x152>
1848: 1b 30 cpi r17, 0x0B ; 11
184a: a9 f6 brne .-86 ; 0x17f6 <config_menu+0xbe>
184c: 40 e0 ldi r20, 0x00 ; 0
184e: d4 cf rjmp .-88 ; 0x17f8 <config_menu+0xc0>
1850: 16 30 cpi r17, 0x06 ; 6
1852: 09 f4 brne .+2 ; 0x1856 <config_menu+0x11e>
1854: 4b c0 rjmp .+150 ; 0x18ec <config_menu+0x1b4>
1856: 17 30 cpi r17, 0x07 ; 7
1858: 71 f6 brne .-100 ; 0x17f6 <config_menu+0xbe>
case 6: // 2nd voltage by c-strom
COSD_FLAGS_MODES ^= COSD_FLAG_STROMVOLT;
config_menu_drawings(chosen);
break;
case 7: // reset uptime
uptime = 0;
185a: 10 92 13 01 sts 0x0113, r1
185e: 10 92 12 01 sts 0x0112, r1
config_menu_doclick(chosen);
1862: 87 e0 ldi r24, 0x07 ; 7
1864: 0e 94 67 0b call 0x16ce ; 0x16ce <config_menu_doclick>
1868: 41 e0 ldi r20, 0x01 ; 1
186a: c6 cf rjmp .-116 ; 0x17f8 <config_menu+0xc0>
if (s2_pressed()) {
chosen = (chosen + 1) % 12;
config_menu_drawings(chosen);
_delay_ms(500);
} else if (s1_pressed()) {
switch (chosen) {
186c: 11 23 and r17, r17
186e: 61 f1 breq .+88 ; 0x18c8 <config_menu+0x190>
1870: 11 30 cpi r17, 0x01 ; 1
1872: 09 f0 breq .+2 ; 0x1876 <config_menu+0x13e>
1874: c0 cf rjmp .-128 ; 0x17f6 <config_menu+0xbe>
bottom_line = 14;
}
config_menu_drawings(chosen);
break;
case 1: // full HUD
COSD_FLAGS_MODES ^= COSD_FLAG_HUD;
1876: 80 91 1b 01 lds r24, 0x011B
187a: 81 27 eor r24, r17
187c: 80 93 1b 01 sts 0x011B, r24
config_menu_drawings(chosen);
1880: 81 e0 ldi r24, 0x01 ; 1
1882: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
1886: 41 e0 ldi r20, 0x01 ; 1
1888: b7 cf rjmp .-146 ; 0x17f8 <config_menu+0xc0>
osd_ncmode = (int(*)(void)) pgm_read_word(&mode->dfun);
#endif
config_menu_drawings(chosen);
break;
case 9: // GPS or BARO height
COSD_FLAGS_CONFIG ^= COSD_FLAG_GPSHEIGHT;
188a: 80 91 1c 01 lds r24, 0x011C
188e: 8e 25 eor r24, r14
1890: 80 93 1c 01 sts 0x011C, r24
config_menu_drawings(chosen);
1894: 89 e0 ldi r24, 0x09 ; 9
1896: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
189a: 41 e0 ldi r20, 0x01 ; 1
189c: ad cf rjmp .-166 ; 0x17f8 <config_menu+0xc0>
case 3: // big vario
COSD_FLAGS_MODES ^= COSD_FLAG_BIGVARIO;
config_menu_drawings(chosen);
break;
case 4: // statistics
COSD_FLAGS_MODES ^= COSD_FLAG_STATS;
189e: 80 91 1b 01 lds r24, 0x011B
18a2: 98 e0 ldi r25, 0x08 ; 8
18a4: 89 27 eor r24, r25
18a6: 80 93 1b 01 sts 0x011B, r24
config_menu_drawings(chosen);
18aa: 84 e0 ldi r24, 0x04 ; 4
18ac: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
18b0: 41 e0 ldi r20, 0x01 ; 1
18b2: a2 cf rjmp .-188 ; 0x17f8 <config_menu+0xc0>
case 2: // art horizon
COSD_FLAGS_MODES ^= COSD_FLAG_ARTHORIZON;
config_menu_drawings(chosen);
break;
case 3: // big vario
COSD_FLAGS_MODES ^= COSD_FLAG_BIGVARIO;
18b4: 80 91 1b 01 lds r24, 0x011B
18b8: 8c 25 eor r24, r12
18ba: 80 93 1b 01 sts 0x011B, r24
config_menu_drawings(chosen);
18be: 83 e0 ldi r24, 0x03 ; 3
18c0: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
18c4: 41 e0 ldi r20, 0x01 ; 1
18c6: 98 cf rjmp .-208 ; 0x17f8 <config_menu+0xc0>
config_menu_drawings(chosen);
_delay_ms(500);
} else if (s1_pressed()) {
switch (chosen) {
case 0: // NTSC or PAL
COSD_FLAGS_CONFIG ^= COSD_FLAG_NTSC;
18c8: 80 91 1c 01 lds r24, 0x011C
18cc: 8f 25 eor r24, r15
18ce: 80 93 1c 01 sts 0x011C, r24
// Setup Video Mode
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
18d2: 80 fd sbrc r24, 0
18d4: 4b c0 rjmp .+150 ; 0x196c <config_menu+0x234>
spi_send_byte(0x00, 0b00001000);
 
bottom_line = 12;
} else {
// PAL + enable display immediately (VM0)
spi_send_byte(0x00, 0b01001000);
18d6: 80 e0 ldi r24, 0x00 ; 0
18d8: 68 e4 ldi r22, 0x48 ; 72
18da: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
 
bottom_line = 14;
18de: b0 92 03 01 sts 0x0103, r11
}
config_menu_drawings(chosen);
18e2: 80 e0 ldi r24, 0x00 ; 0
18e4: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
18e8: 41 e0 ldi r20, 0x01 ; 1
18ea: 86 cf rjmp .-244 ; 0x17f8 <config_menu+0xc0>
case 5: // current by fc
COSD_FLAGS_MODES ^= COSD_FLAG_FCCURRENT;
config_menu_drawings(chosen);
break;
case 6: // 2nd voltage by c-strom
COSD_FLAGS_MODES ^= COSD_FLAG_STROMVOLT;
18ec: 80 91 1b 01 lds r24, 0x011B
18f0: 8d 25 eor r24, r13
18f2: 80 93 1b 01 sts 0x011B, r24
config_menu_drawings(chosen);
18f6: 86 e0 ldi r24, 0x06 ; 6
18f8: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
18fc: 41 e0 ldi r20, 0x01 ; 1
18fe: 7c cf rjmp .-264 ; 0x17f8 <config_menu+0xc0>
COSD_DISPLAYMODE = (COSD_DISPLAYMODE + 1) % (sizeof(fcdisplaymodes) / sizeof(displaymode_t));
mode = fcdisplaymodes;
mode += COSD_DISPLAYMODE;
osd_fcmode = (int(*)(void)) pgm_read_word(&mode->dfun);
#else
COSD_DISPLAYMODE = (COSD_DISPLAYMODE + 1) % (sizeof(ncdisplaymodes) / sizeof(displaymode_t));
1900: e0 91 1e 01 lds r30, 0x011E
1904: ef 5f subi r30, 0xFF ; 255
1906: e1 70 andi r30, 0x01 ; 1
1908: e0 93 1e 01 sts 0x011E, r30
mode = ncdisplaymodes;
mode += COSD_DISPLAYMODE;
190c: f0 e0 ldi r31, 0x00 ; 0
190e: ee 0f add r30, r30
1910: ff 1f adc r31, r31
1912: ee 0f add r30, r30
1914: ff 1f adc r31, r31
1916: e0 5d subi r30, 0xD0 ; 208
1918: fe 4f sbci r31, 0xFE ; 254
191a: f0 93 9e 02 sts 0x029E, r31
191e: e0 93 9d 02 sts 0x029D, r30
osd_ncmode = (int(*)(void)) pgm_read_word(&mode->dfun);
1922: 85 91 lpm r24, Z+
1924: 94 91 lpm r25, Z+
1926: 90 93 06 01 sts 0x0106, r25
192a: 80 93 05 01 sts 0x0105, r24
#endif
config_menu_drawings(chosen);
192e: 88 e0 ldi r24, 0x08 ; 8
1930: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
1934: 41 e0 ldi r20, 0x01 ; 1
1936: 60 cf rjmp .-320 ; 0x17f8 <config_menu+0xc0>
case 9: // GPS or BARO height
COSD_FLAGS_CONFIG ^= COSD_FLAG_GPSHEIGHT;
config_menu_drawings(chosen);
break;
case 10: // save
save_eeprom();
1938: 0e 94 7f 0b call 0x16fe ; 0x16fe <save_eeprom>
config_menu_doclick(chosen);
193c: 8a e0 ldi r24, 0x0A ; 10
193e: 0e 94 67 0b call 0x16ce ; 0x16ce <config_menu_doclick>
1942: 59 cf rjmp .-334 ; 0x17f6 <config_menu+0xbe>
case 1: // full HUD
COSD_FLAGS_MODES ^= COSD_FLAG_HUD;
config_menu_drawings(chosen);
break;
case 2: // art horizon
COSD_FLAGS_MODES ^= COSD_FLAG_ARTHORIZON;
1944: 80 91 1b 01 lds r24, 0x011B
1948: 81 27 eor r24, r17
194a: 80 93 1b 01 sts 0x011B, r24
config_menu_drawings(chosen);
194e: 82 e0 ldi r24, 0x02 ; 2
1950: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
1954: 41 e0 ldi r20, 0x01 ; 1
1956: 50 cf rjmp .-352 ; 0x17f8 <config_menu+0xc0>
/*case 5: // warnings
COSD_FLAGS_MODES ^= COSD_FLAG_WARNINGS;
config_menu_drawings(chosen);
break;*/
case 5: // current by fc
COSD_FLAGS_MODES ^= COSD_FLAG_FCCURRENT;
1958: 80 91 1b 01 lds r24, 0x011B
195c: 80 27 eor r24, r16
195e: 80 93 1b 01 sts 0x011B, r24
config_menu_drawings(chosen);
1962: 85 e0 ldi r24, 0x05 ; 5
1964: 0e 94 ad 0a call 0x155a ; 0x155a <config_menu_drawings>
1968: 41 e0 ldi r20, 0x01 ; 1
196a: 46 cf rjmp .-372 ; 0x17f8 <config_menu+0xc0>
case 0: // NTSC or PAL
COSD_FLAGS_CONFIG ^= COSD_FLAG_NTSC;
// Setup Video Mode
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
// NTSC + enable display immediately (VM0)
spi_send_byte(0x00, 0b00001000);
196c: 80 e0 ldi r24, 0x00 ; 0
196e: 68 e0 ldi r22, 0x08 ; 8
1970: 0e 94 af 04 call 0x95e ; 0x95e <spi_send_byte>
 
bottom_line = 12;
1974: a0 92 03 01 sts 0x0103, r10
1978: b4 cf rjmp .-152 ; 0x18e2 <config_menu+0x1aa>
 
0000197a <get_eeprom>:
const char* ee_msg[] PROGMEM = {ee_message0, ee_message1};
 
/**
* read data saved in eeprom, print out message if <verbose> is set
*/
void get_eeprom(uint8_t verbose) {
197a: 1f 93 push r17
197c: 18 2f mov r17, r24
if (eeprom_read_byte(&ee_checkbyte1) == CHECKBYTE1 && eeprom_read_byte(&ee_checkbyte2) == CHECKBYTE2) {
197e: 80 e0 ldi r24, 0x00 ; 0
1980: 90 e0 ldi r25, 0x00 ; 0
1982: 0e 94 ed 1c call 0x39da ; 0x39da <__eerd_byte_m162>
1986: 8e 32 cpi r24, 0x2E ; 46
1988: 51 f0 breq .+20 ; 0x199e <get_eeprom+0x24>
COSD_FLAGS_CONFIG = eeprom_read_byte(&ee_COSD_FLAGS_CONFIG);
COSD_DISPLAYMODE = eeprom_read_byte(&ee_COSD_DISPLAYMODE);
//if (verbose) write_ndigit_number_u(23, 11, COSD_DISPLAYMODE, 2, 0);
} else {
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
if (verbose) write_ascii_string_pgm(2, 9, ee_msg[1]); // Loading data
198a: 11 23 and r17, r17
198c: 31 f0 breq .+12 ; 0x199a <get_eeprom+0x20>
198e: 82 e0 ldi r24, 0x02 ; 2
1990: 69 e0 ldi r22, 0x09 ; 9
1992: 47 e0 ldi r20, 0x07 ; 7
1994: 52 e0 ldi r21, 0x02 ; 2
1996: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
#endif
}
}
199a: 1f 91 pop r17
199c: 08 95 ret
 
/**
* read data saved in eeprom, print out message if <verbose> is set
*/
void get_eeprom(uint8_t verbose) {
if (eeprom_read_byte(&ee_checkbyte1) == CHECKBYTE1 && eeprom_read_byte(&ee_checkbyte2) == CHECKBYTE2) {
199e: 81 e0 ldi r24, 0x01 ; 1
19a0: 90 e0 ldi r25, 0x00 ; 0
19a2: 0e 94 ed 1c call 0x39da ; 0x39da <__eerd_byte_m162>
19a6: 87 31 cpi r24, 0x17 ; 23
19a8: 81 f7 brne .-32 ; 0x198a <get_eeprom+0x10>
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
if (verbose) write_ascii_string_pgm(2, 9, ee_msg[0]); // Loading data
19aa: 11 23 and r17, r17
19ac: 99 f4 brne .+38 ; 0x19d4 <get_eeprom+0x5a>
#endif
COSD_FLAGS_MODES = eeprom_read_byte(&ee_COSD_FLAGS_MODES);
19ae: 82 e0 ldi r24, 0x02 ; 2
19b0: 90 e0 ldi r25, 0x00 ; 0
19b2: 0e 94 ed 1c call 0x39da ; 0x39da <__eerd_byte_m162>
19b6: 80 93 1b 01 sts 0x011B, r24
COSD_FLAGS_CONFIG = eeprom_read_byte(&ee_COSD_FLAGS_CONFIG);
19ba: 83 e0 ldi r24, 0x03 ; 3
19bc: 90 e0 ldi r25, 0x00 ; 0
19be: 0e 94 ed 1c call 0x39da ; 0x39da <__eerd_byte_m162>
19c2: 80 93 1c 01 sts 0x011C, r24
COSD_DISPLAYMODE = eeprom_read_byte(&ee_COSD_DISPLAYMODE);
19c6: 84 e0 ldi r24, 0x04 ; 4
19c8: 90 e0 ldi r25, 0x00 ; 0
19ca: 0e 94 ed 1c call 0x39da ; 0x39da <__eerd_byte_m162>
19ce: 80 93 1e 01 sts 0x011E, r24
19d2: e3 cf rjmp .-58 ; 0x199a <get_eeprom+0x20>
* read data saved in eeprom, print out message if <verbose> is set
*/
void get_eeprom(uint8_t verbose) {
if (eeprom_read_byte(&ee_checkbyte1) == CHECKBYTE1 && eeprom_read_byte(&ee_checkbyte2) == CHECKBYTE2) {
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
if (verbose) write_ascii_string_pgm(2, 9, ee_msg[0]); // Loading data
19d4: 82 e0 ldi r24, 0x02 ; 2
19d6: 69 e0 ldi r22, 0x09 ; 9
19d8: 4e ee ldi r20, 0xEE ; 238
19da: 51 e0 ldi r21, 0x01 ; 1
19dc: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
19e0: e6 cf rjmp .-52 ; 0x19ae <get_eeprom+0x34>
 
000019e2 <init_cosd>:
 
/**
* auto config some stuff on startup, currently only battery cells
* TODO: this is testing stuff, strings should go progmem and so on...
*/
void init_cosd(uint8_t UBat) {
19e2: ff 92 push r15
19e4: 0f 93 push r16
19e6: 1f 93 push r17
19e8: df 93 push r29
19ea: cf 93 push r28
19ec: cd b7 in r28, 0x3d ; 61
19ee: de b7 in r29, 0x3e ; 62
19f0: 2a 97 sbiw r28, 0x0a ; 10
19f2: 0f b6 in r0, 0x3f ; 63
19f4: f8 94 cli
19f6: de bf out 0x3e, r29 ; 62
19f8: 0f be out 0x3f, r0 ; 63
19fa: cd bf out 0x3d, r28 ; 61
19fc: 18 2f mov r17, r24
clear();
19fe: 0e 94 75 08 call 0x10ea ; 0x10ea <clear>
write_ascii_string_pgm(2, 1, PSTR("C-OSD Initialisation")); // C-OSD Initialisation
1a02: 82 e0 ldi r24, 0x02 ; 2
1a04: 61 e0 ldi r22, 0x01 ; 1
1a06: 46 e7 ldi r20, 0x76 ; 118
1a08: 53 e0 ldi r21, 0x03 ; 3
1a0a: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
#if FCONLY
write_ascii_string_pgm(2, 2, PSTR("FC only Mode")); // FC only mode
#else
write_ascii_string_pgm(2, 2, PSTR("NaviCtrl Mode")); // NaviCtrl Mode
1a0e: 82 e0 ldi r24, 0x02 ; 2
1a10: 62 e0 ldi r22, 0x02 ; 2
1a12: 48 e6 ldi r20, 0x68 ; 104
1a14: 53 e0 ldi r21, 0x03 ; 3
1a16: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
#endif
write_ascii_string_pgm(2, 3, PSTR(BUILDDATE));
1a1a: 82 e0 ldi r24, 0x02 ; 2
1a1c: 63 e0 ldi r22, 0x03 ; 3
1a1e: 4c e5 ldi r20, 0x5C ; 92
1a20: 53 e0 ldi r21, 0x03 ; 3
1a22: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
uint8_t cellnum = 0;
if (CELL_NUM == -1) {
write_ascii_string_pgm(2, 4, PSTR("Guessing Number of Cells")); // Guessing Number of Cells
1a26: 82 e0 ldi r24, 0x02 ; 2
1a28: 64 e0 ldi r22, 0x04 ; 4
1a2a: 43 e4 ldi r20, 0x43 ; 67
1a2c: 53 e0 ldi r21, 0x03 ; 3
1a2e: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
1a32: 61 2f mov r22, r17
1a34: 70 e0 ldi r23, 0x00 ; 0
1a36: 00 e0 ldi r16, 0x00 ; 0
do {
cellnum++;
1a38: 0f 5f subi r16, 0xFF ; 255
} while (UBat > ((cellnum * CELL_VOLT_MAX) + 23));
1a3a: 40 2f mov r20, r16
1a3c: 50 e0 ldi r21, 0x00 ; 0
1a3e: ca 01 movw r24, r20
1a40: 88 0f add r24, r24
1a42: 99 1f adc r25, r25
1a44: 88 0f add r24, r24
1a46: 99 1f adc r25, r25
1a48: 9c 01 movw r18, r24
1a4a: 22 0f add r18, r18
1a4c: 33 1f adc r19, r19
1a4e: 22 0f add r18, r18
1a50: 33 1f adc r19, r19
1a52: 22 0f add r18, r18
1a54: 33 1f adc r19, r19
1a56: 28 0f add r18, r24
1a58: 39 1f adc r19, r25
1a5a: 24 0f add r18, r20
1a5c: 35 1f adc r19, r21
1a5e: c9 01 movw r24, r18
1a60: 47 96 adiw r24, 0x17 ; 23
1a62: 86 17 cp r24, r22
1a64: 97 07 cpc r25, r23
1a66: 44 f3 brlt .-48 ; 0x1a38 <init_cosd+0x56>
} else {
cellnum = CELL_NUM;
}
min_voltage = cellnum * CELL_VOLT_MIN;
1a68: 44 0f add r20, r20
1a6a: 55 1f adc r21, r21
1a6c: 42 95 swap r20
1a6e: 52 95 swap r21
1a70: 50 7f andi r21, 0xF0 ; 240
1a72: 54 27 eor r21, r20
1a74: 40 7f andi r20, 0xF0 ; 240
1a76: 54 27 eor r21, r20
1a78: 40 93 19 01 sts 0x0119, r20
max_voltage = cellnum * CELL_VOLT_MAX;
1a7c: 20 93 1a 01 sts 0x011A, r18
write_ascii_string_pgm(2, 5, PSTR("Number of Cells:")); // Number of Cells
1a80: 82 e0 ldi r24, 0x02 ; 2
1a82: 65 e0 ldi r22, 0x05 ; 5
1a84: 42 e3 ldi r20, 0x32 ; 50
1a86: 53 e0 ldi r21, 0x03 ; 3
1a88: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_u(21, 5, cellnum, 1, 0);
1a8c: 85 e1 ldi r24, 0x15 ; 21
1a8e: 65 e0 ldi r22, 0x05 ; 5
1a90: 40 2f mov r20, r16
1a92: 50 e0 ldi r21, 0x00 ; 0
1a94: 21 e0 ldi r18, 0x01 ; 1
1a96: 30 e0 ldi r19, 0x00 ; 0
1a98: 00 e0 ldi r16, 0x00 ; 0
1a9a: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_ascii_string_pgm(2, 6, PSTR("Warn Voltage :")); // Warn Voltage
1a9e: 82 e0 ldi r24, 0x02 ; 2
1aa0: 66 e0 ldi r22, 0x06 ; 6
1aa2: 41 e2 ldi r20, 0x21 ; 33
1aa4: 53 e0 ldi r21, 0x03 ; 3
1aa6: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_s_10th(20, 6, min_voltage, 3, 0);
1aaa: 40 91 19 01 lds r20, 0x0119
1aae: 84 e1 ldi r24, 0x14 ; 20
1ab0: 66 e0 ldi r22, 0x06 ; 6
1ab2: 50 e0 ldi r21, 0x00 ; 0
1ab4: 23 e0 ldi r18, 0x03 ; 3
1ab6: 30 e0 ldi r19, 0x00 ; 0
1ab8: 0e 94 d3 05 call 0xba6 ; 0xba6 <write_ndigit_number_s_10th>
write_ascii_string_pgm(2, 7, PSTR("Max Voltage :")); // Max Voltage
1abc: 82 e0 ldi r24, 0x02 ; 2
1abe: 67 e0 ldi r22, 0x07 ; 7
1ac0: 40 e1 ldi r20, 0x10 ; 16
1ac2: 53 e0 ldi r21, 0x03 ; 3
1ac4: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_s_10th(20, 7, max_voltage, 3, 0);
1ac8: 40 91 1a 01 lds r20, 0x011A
1acc: 84 e1 ldi r24, 0x14 ; 20
1ace: 67 e0 ldi r22, 0x07 ; 7
1ad0: 50 e0 ldi r21, 0x00 ; 0
1ad2: 23 e0 ldi r18, 0x03 ; 3
1ad4: 30 e0 ldi r19, 0x00 ; 0
1ad6: 0e 94 d3 05 call 0xba6 ; 0xba6 <write_ndigit_number_s_10th>
 
get_eeprom(1);
1ada: 81 e0 ldi r24, 0x01 ; 1
1adc: 0e 94 bd 0c call 0x197a ; 0x197a <get_eeprom>
 
//write_ascii_string_pgm(23, 2, vm[COSD_FLAGS & COSD_FLAG_NTSC]);
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
1ae0: 80 91 1c 01 lds r24, 0x011C
1ae4: 80 ff sbrs r24, 0
1ae6: 7a c0 rjmp .+244 ; 0x1bdc <init_cosd+0x1fa>
write_ascii_string_pgm(23, 2, VM_NTSC);
1ae8: 87 e1 ldi r24, 0x17 ; 23
1aea: 62 e0 ldi r22, 0x02 ; 2
1aec: 49 ee ldi r20, 0xE9 ; 233
1aee: 51 e0 ldi r21, 0x01 ; 1
1af0: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
} else {
write_ascii_string_pgm(23, 2, VM_PAL);
}
 
// request version from board
rxd_buffer_locked = 0;
1af4: 10 92 29 01 sts 0x0129, r1
usart1_EnableTXD();
1af8: 0e 94 3e 03 call 0x67c ; 0x67c <usart1_EnableTXD>
//usart1_request_mk_data(0, 'v', 0);
write_ascii_string_pgm(2, 11, PSTR("FC VERSION: ........"));
usart1_puts_pgm(PSTR(REQUEST_FC_VERSION));
#else
//usart1_request_mk_data(1, 'v', 0);
usart1_puts_pgm(PSTR(REQUEST_NC_VERSION));
1afc: 85 e0 ldi r24, 0x05 ; 5
1afe: 93 e0 ldi r25, 0x03 ; 3
1b00: 0e 94 47 03 call 0x68e ; 0x68e <usart1_puts_pgm>
write_ascii_string_pgm(2, 11, PSTR("NC VERSION: ........"));
1b04: 82 e0 ldi r24, 0x02 ; 2
1b06: 6b e0 ldi r22, 0x0B ; 11
1b08: 40 ef ldi r20, 0xF0 ; 240
1b0a: 52 e0 ldi r21, 0x02 ; 2
1b0c: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
#endif
usart1_DisableTXD();
1b10: 0e 94 39 03 call 0x672 ; 0x672 <usart1_DisableTXD>
// wait for response
while (rxd_buffer_locked == 0) {
1b14: 80 91 29 01 lds r24, 0x0129
1b18: 88 23 and r24, r24
1b1a: 29 f4 brne .+10 ; 0x1b26 <init_cosd+0x144>
asm("nop");
1b1c: 00 00 nop
usart1_puts_pgm(PSTR(REQUEST_NC_VERSION));
write_ascii_string_pgm(2, 11, PSTR("NC VERSION: ........"));
#endif
usart1_DisableTXD();
// wait for response
while (rxd_buffer_locked == 0) {
1b1e: 80 91 29 01 lds r24, 0x0129
1b22: 88 23 and r24, r24
1b24: d9 f3 breq .-10 ; 0x1b1c <init_cosd+0x13a>
asm("nop");
}
Decode64();
1b26: 0e 94 30 04 call 0x860 ; 0x860 <Decode64>
str_VersionInfo VersionInfo;
VersionInfo = *((str_VersionInfo*) pRxData);
1b2a: de 01 movw r26, r28
1b2c: 11 96 adiw r26, 0x01 ; 1
1b2e: 80 91 2b 01 lds r24, 0x012B
1b32: 90 91 2c 01 lds r25, 0x012C
1b36: 9c 01 movw r18, r24
1b38: f9 01 movw r30, r18
1b3a: 8a e0 ldi r24, 0x0A ; 10
1b3c: 01 90 ld r0, Z+
1b3e: 0d 92 st X+, r0
1b40: 81 50 subi r24, 0x01 ; 1
1b42: e1 f7 brne .-8 ; 0x1b3c <init_cosd+0x15a>
1b44: fa 80 ldd r15, Y+2 ; 0x02
1b46: 1d 81 ldd r17, Y+5 ; 0x05
write_ndigit_number_u(14, 11, VersionInfo.SWMajor, 3, 1);
1b48: 49 81 ldd r20, Y+1 ; 0x01
1b4a: 8e e0 ldi r24, 0x0E ; 14
1b4c: 6b e0 ldi r22, 0x0B ; 11
1b4e: 50 e0 ldi r21, 0x00 ; 0
1b50: 23 e0 ldi r18, 0x03 ; 3
1b52: 30 e0 ldi r19, 0x00 ; 0
1b54: 01 e0 ldi r16, 0x01 ; 1
1b56: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_ndigit_number_u(18, 11, VersionInfo.SWMinor, 3, 1);
1b5a: 82 e1 ldi r24, 0x12 ; 18
1b5c: 6b e0 ldi r22, 0x0B ; 11
1b5e: 4f 2d mov r20, r15
1b60: 50 e0 ldi r21, 0x00 ; 0
1b62: 23 e0 ldi r18, 0x03 ; 3
1b64: 30 e0 ldi r19, 0x00 ; 0
1b66: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_ascii_char(22 + 11*30, 'a' + VersionInfo.SWPatch);
1b6a: 1f 59 subi r17, 0x9F ; 159
1b6c: 80 e6 ldi r24, 0x60 ; 96
1b6e: 91 e0 ldi r25, 0x01 ; 1
1b70: 61 2f mov r22, r17
1b72: 0e 94 10 05 call 0xa20 ; 0xa20 <write_ascii_char>
mode += COSD_DISPLAYMODE;
osd_fcmode = (int(*)(void)) pgm_read_word(&mode->dfun);
// re-request data ever 100ms from FC;
//usart1_request_mk_data(0, 'd', 100);
#else
COSD_DISPLAYMODE %= (sizeof(ncdisplaymodes) / sizeof(displaymode_t));
1b76: e0 91 1e 01 lds r30, 0x011E
1b7a: e1 70 andi r30, 0x01 ; 1
1b7c: e0 93 1e 01 sts 0x011E, r30
mode = ncdisplaymodes;
mode += COSD_DISPLAYMODE;
1b80: f0 e0 ldi r31, 0x00 ; 0
1b82: ee 0f add r30, r30
1b84: ff 1f adc r31, r31
1b86: ee 0f add r30, r30
1b88: ff 1f adc r31, r31
1b8a: e0 5d subi r30, 0xD0 ; 208
1b8c: fe 4f sbci r31, 0xFE ; 254
1b8e: f0 93 9e 02 sts 0x029E, r31
1b92: e0 93 9d 02 sts 0x029D, r30
osd_ncmode = (int(*)(void)) pgm_read_word(&mode->dfun);
1b96: 85 91 lpm r24, Z+
1b98: 94 91 lpm r25, Z+
1b9a: 90 93 06 01 sts 0x0106, r25
1b9e: 80 93 05 01 sts 0x0105, r24
1ba2: 20 e3 ldi r18, 0x30 ; 48
1ba4: 35 e7 ldi r19, 0x75 ; 117
1ba6: 40 e9 ldi r20, 0x90 ; 144
1ba8: 51 e0 ldi r21, 0x01 ; 1
1baa: ca 01 movw r24, r20
1bac: 01 97 sbiw r24, 0x01 ; 1
1bae: f1 f7 brne .-4 ; 0x1bac <init_cosd+0x1ca>
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
1bb0: 21 50 subi r18, 0x01 ; 1
1bb2: 30 40 sbci r19, 0x00 ; 0
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
1bb4: d1 f7 brne .-12 ; 0x1baa <init_cosd+0x1c8>
// re-request OSD Data from NC every 100ms
//usart1_request_mk_data(1, 'o', 100);
#endif
 
_delay_ms(3000);
clear();
1bb6: 0e 94 75 08 call 0x10ea ; 0x10ea <clear>
// update flags to paint display again because of clear
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
1bba: 80 91 1d 01 lds r24, 0x011D
1bbe: 8d 7f andi r24, 0xFD ; 253
1bc0: 80 93 1d 01 sts 0x011D, r24
}
1bc4: 2a 96 adiw r28, 0x0a ; 10
1bc6: 0f b6 in r0, 0x3f ; 63
1bc8: f8 94 cli
1bca: de bf out 0x3e, r29 ; 62
1bcc: 0f be out 0x3f, r0 ; 63
1bce: cd bf out 0x3d, r28 ; 61
1bd0: cf 91 pop r28
1bd2: df 91 pop r29
1bd4: 1f 91 pop r17
1bd6: 0f 91 pop r16
1bd8: ff 90 pop r15
1bda: 08 95 ret
 
//write_ascii_string_pgm(23, 2, vm[COSD_FLAGS & COSD_FLAG_NTSC]);
if (COSD_FLAGS_CONFIG & COSD_FLAG_NTSC) {
write_ascii_string_pgm(23, 2, VM_NTSC);
} else {
write_ascii_string_pgm(23, 2, VM_PAL);
1bdc: 87 e1 ldi r24, 0x17 ; 23
1bde: 62 e0 ldi r22, 0x02 ; 2
1be0: 44 ee ldi r20, 0xE4 ; 228
1be2: 51 e0 ldi r21, 0x01 ; 1
1be4: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
1be8: 85 cf rjmp .-246 ; 0x1af4 <init_cosd+0x112>
 
00001bea <SpiMasterInit>:
#define INT0_LOW PORTD &= ~(1 << PD2);
 
/**
* init the SPI as master
*/
void SpiMasterInit(void) {
1bea: df 93 push r29
1bec: cf 93 push r28
1bee: 0f 92 push r0
1bf0: cd b7 in r28, 0x3d ; 61
1bf2: de b7 in r29, 0x3e ; 62
volatile char IOReg;
// set PB4(/SS), PB5(MOSI), PB7(SCK) as output
DDRB = (1 << PB4) | (1 << PB5) | (1 << PB7);
1bf4: 80 eb ldi r24, 0xB0 ; 176
1bf6: 87 bb out 0x17, r24 ; 23
PORTB |= (1 << PB4); // pullup SS
1bf8: c4 9a sbi 0x18, 4 ; 24
// enable SPI Interrupt and SPI in Master Mode with SCK = CK/128
SPCR = (1 << SPIE) | (1 << SPE) | (1 << MSTR) | (1 << SPR0) | (1 << SPR1);
1bfa: 83 ed ldi r24, 0xD3 ; 211
1bfc: 8d b9 out 0x0d, r24 ; 13
IOReg = SPSR; // clear SPIF bit in SPSR
1bfe: 8e b1 in r24, 0x0e ; 14
1c00: 89 83 std Y+1, r24 ; 0x01
IOReg = SPDR;
1c02: 8f b1 in r24, 0x0f ; 15
1c04: 89 83 std Y+1, r24 ; 0x01
//sei(); // we do it later
}
1c06: 0f 90 pop r0
1c08: cf 91 pop r28
1c0a: df 91 pop r29
1c0c: 08 95 ret
 
00001c0e <__vector_18>:
 
 
/**
* SPI interrupt handler
*/
ISR(SPI_STC_vect) {
1c0e: 1f 92 push r1
1c10: 0f 92 push r0
1c12: 0f b6 in r0, 0x3f ; 63
1c14: 0f 92 push r0
1c16: 11 24 eor r1, r1
1c18: 8f 93 push r24
1c1a: 9f 93 push r25
1c1c: ef 93 push r30
1c1e: ff 93 push r31
if (request_count == 0) {
1c20: 80 91 36 01 lds r24, 0x0136
1c24: 88 23 and r24, r24
1c26: 11 f5 brne .+68 ; 0x1c6c <__vector_18+0x5e>
SPI_buffer.buffer.chk = SPDR; // firs char received is check byte from last transfer
1c28: 8f b1 in r24, 0x0f ; 15
1c2a: 80 93 95 01 sts 0x0195, r24
} else {
SPI_buffer.buffer.c[request_count - 1] = SPDR; // safe received byte to buffer
}
request_count++;
1c2e: 80 91 36 01 lds r24, 0x0136
1c32: 8f 5f subi r24, 0xFF ; 255
1c34: 80 93 36 01 sts 0x0136, r24
if (--icnt) {
1c38: 80 91 34 01 lds r24, 0x0134
1c3c: 90 91 35 01 lds r25, 0x0135
1c40: 01 97 sbiw r24, 0x01 ; 1
1c42: 90 93 35 01 sts 0x0135, r25
1c46: 80 93 34 01 sts 0x0134, r24
1c4a: 80 91 34 01 lds r24, 0x0134
1c4e: 90 91 35 01 lds r25, 0x0135
1c52: 89 2b or r24, r25
1c54: 99 f4 brne .+38 ; 0x1c7c <__vector_18+0x6e>
//SPDR = *iptr; // send next byte
spi_ready = 1; // we _should_ send later because the slave needs more time
} else {
SPCR &= ~_BV(SPIE); // deactivate interrupt
1c56: 6f 98 cbi 0x0d, 7 ; 13
INT0_HIGH // transfer is done, slave does not need to listen
1c58: 92 9a sbi 0x12, 2 ; 18
}
}
1c5a: ff 91 pop r31
1c5c: ef 91 pop r30
1c5e: 9f 91 pop r25
1c60: 8f 91 pop r24
1c62: 0f 90 pop r0
1c64: 0f be out 0x3f, r0 ; 63
1c66: 0f 90 pop r0
1c68: 1f 90 pop r1
1c6a: 18 95 reti
*/
ISR(SPI_STC_vect) {
if (request_count == 0) {
SPI_buffer.buffer.chk = SPDR; // firs char received is check byte from last transfer
} else {
SPI_buffer.buffer.c[request_count - 1] = SPDR; // safe received byte to buffer
1c6c: e0 91 36 01 lds r30, 0x0136
1c70: f0 e0 ldi r31, 0x00 ; 0
1c72: 8f b1 in r24, 0x0f ; 15
1c74: e6 57 subi r30, 0x76 ; 118
1c76: fe 4f sbci r31, 0xFE ; 254
1c78: 80 83 st Z, r24
1c7a: d9 cf rjmp .-78 ; 0x1c2e <__vector_18+0x20>
}
request_count++;
if (--icnt) {
//SPDR = *iptr; // send next byte
spi_ready = 1; // we _should_ send later because the slave needs more time
1c7c: 81 e0 ldi r24, 0x01 ; 1
1c7e: 80 93 10 01 sts 0x0110, r24
1c82: eb cf rjmp .-42 ; 0x1c5a <__vector_18+0x4c>
 
00001c84 <TransferIsBusy>:
 
/**
* check if SPI transfer is still busy
*/
int TransferIsBusy(void) {
return SPCR & _BV(SPIE);
1c84: 2d b1 in r18, 0x0d ; 13
1c86: 30 e0 ldi r19, 0x00 ; 0
1c88: 20 78 andi r18, 0x80 ; 128
1c8a: 30 70 andi r19, 0x00 ; 0
}
1c8c: c9 01 movw r24, r18
1c8e: 08 95 ret
 
00001c90 <StartTransfer>:
 
/**
* start a new transfer with length <len>
*/
void StartTransfer(uint16_t len) {
INT0_LOW // /SS LOW ^= SS HIGH ^= slave should listen
1c90: 92 98 cbi 0x12, 2 ; 18
 
// this is a new request
request_count = 0;
1c92: 10 92 36 01 sts 0x0136, r1
 
// set up pointer and length for interrupt handler
icnt = len;
1c96: 90 93 35 01 sts 0x0135, r25
1c9a: 80 93 34 01 sts 0x0134, r24
 
SPCR |= _BV(SPIE); // enable spi interrupt
1c9e: 6f 9a sbi 0x0d, 7 ; 13
SPDR = 'A'; // start transfer by first command char
1ca0: 81 e4 ldi r24, 0x41 ; 65
1ca2: 8f b9 out 0x0f, r24 ; 15
}
1ca4: 08 95 ret
 
00001ca6 <spi_send_next>:
 
/**
* send next command through spi
*/
void spi_send_next() {
SPDR = 'A' + request_count;
1ca6: 80 91 36 01 lds r24, 0x0136
1caa: 8f 5b subi r24, 0xBF ; 191
1cac: 8f b9 out 0x0f, r24 ; 15
}
1cae: 08 95 ret
 
00001cb0 <s1_pressed>:
 
/* ##########################################################################
* debounce buttons
* ##########################################################################*/
int s1_pressed() {
if (S1_PRESSED) {
1cb0: 9d 9b sbis 0x13, 5 ; 19
1cb2: 04 c0 rjmp .+8 ; 0x1cbc <s1_pressed+0xc>
1cb4: 20 e0 ldi r18, 0x00 ; 0
1cb6: 30 e0 ldi r19, 0x00 ; 0
_delay_ms(25);
if (S1_PRESSED) return 1;
}
return 0;
}
1cb8: c9 01 movw r24, r18
1cba: 08 95 ret
 
/* ##########################################################################
* debounce buttons
* ##########################################################################*/
int s1_pressed() {
if (S1_PRESSED) {
1cbc: 2a ef ldi r18, 0xFA ; 250
1cbe: 30 e0 ldi r19, 0x00 ; 0
1cc0: 40 e9 ldi r20, 0x90 ; 144
1cc2: 51 e0 ldi r21, 0x01 ; 1
1cc4: ca 01 movw r24, r20
1cc6: 01 97 sbiw r24, 0x01 ; 1
1cc8: f1 f7 brne .-4 ; 0x1cc6 <s1_pressed+0x16>
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
1cca: 21 50 subi r18, 0x01 ; 1
1ccc: 30 40 sbci r19, 0x00 ; 0
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
1cce: d1 f7 brne .-12 ; 0x1cc4 <s1_pressed+0x14>
_delay_ms(25);
if (S1_PRESSED) return 1;
1cd0: 83 b3 in r24, 0x13 ; 19
1cd2: 28 2f mov r18, r24
1cd4: 30 e0 ldi r19, 0x00 ; 0
1cd6: 36 95 lsr r19
1cd8: 27 95 ror r18
1cda: 32 95 swap r19
1cdc: 22 95 swap r18
1cde: 2f 70 andi r18, 0x0F ; 15
1ce0: 23 27 eor r18, r19
1ce2: 3f 70 andi r19, 0x0F ; 15
1ce4: 23 27 eor r18, r19
1ce6: 20 95 com r18
1ce8: 30 95 com r19
1cea: 21 70 andi r18, 0x01 ; 1
1cec: 30 70 andi r19, 0x00 ; 0
}
return 0;
}
1cee: c9 01 movw r24, r18
1cf0: 08 95 ret
 
00001cf2 <s2_pressed>:
 
int s2_pressed() {
if (S2_PRESSED) {
1cf2: 9c 9b sbis 0x13, 4 ; 19
1cf4: 04 c0 rjmp .+8 ; 0x1cfe <s2_pressed+0xc>
1cf6: 20 e0 ldi r18, 0x00 ; 0
1cf8: 30 e0 ldi r19, 0x00 ; 0
_delay_ms(25);
if (S2_PRESSED) return 1;
}
return 0;
}
1cfa: c9 01 movw r24, r18
1cfc: 08 95 ret
}
return 0;
}
 
int s2_pressed() {
if (S2_PRESSED) {
1cfe: 2a ef ldi r18, 0xFA ; 250
1d00: 30 e0 ldi r19, 0x00 ; 0
1d02: 40 e9 ldi r20, 0x90 ; 144
1d04: 51 e0 ldi r21, 0x01 ; 1
1d06: ca 01 movw r24, r20
1d08: 01 97 sbiw r24, 0x01 ; 1
1d0a: f1 f7 brne .-4 ; 0x1d08 <s2_pressed+0x16>
{
// wait 1/10 ms
_delay_loop_2(((F_CPU) / 4e3) / 10);
__ticks --;
1d0c: 21 50 subi r18, 0x01 ; 1
1d0e: 30 40 sbci r19, 0x00 ; 0
__ticks = 1;
else if (__tmp > 65535)
{
// __ticks = requested delay in 1/10 ms
__ticks = (uint16_t) (__ms * 10.0);
while(__ticks)
1d10: d1 f7 brne .-12 ; 0x1d06 <s2_pressed+0x14>
_delay_ms(25);
if (S2_PRESSED) return 1;
1d12: 83 b3 in r24, 0x13 ; 19
1d14: 28 2f mov r18, r24
1d16: 30 e0 ldi r19, 0x00 ; 0
1d18: 32 95 swap r19
1d1a: 22 95 swap r18
1d1c: 2f 70 andi r18, 0x0F ; 15
1d1e: 23 27 eor r18, r19
1d20: 3f 70 andi r19, 0x0F ; 15
1d22: 23 27 eor r18, r19
1d24: 20 95 com r18
1d26: 30 95 com r19
1d28: 21 70 andi r18, 0x01 ; 1
1d2a: 30 70 andi r19, 0x00 ; 0
}
return 0;
}
1d2c: c9 01 movw r24, r18
1d2e: 08 95 ret
 
00001d30 <ppm_init>:
 
/**
* init ppm, including timer1 for measurement
*/
void ppm_init() {
PORTE |= (1 << PORTE0); // enable pullup on INT0 pin
1d30: 38 9a sbi 0x07, 0 ; 7
GICR |= (1<<INT2); // External Interrupt Request 2 Enable
1d32: 8b b7 in r24, 0x3b ; 59
1d34: 80 62 ori r24, 0x20 ; 32
1d36: 8b bf out 0x3b, r24 ; 59
EMCUCR |= (1<<ISC2); // a rising edge on INT2 activates the interrupt
1d38: 86 b7 in r24, 0x36 ; 54
1d3a: 81 60 ori r24, 0x01 ; 1
1d3c: 86 bf out 0x36, r24 ; 54
TCCR1B |= (0<<CS12)|(1<<CS10)|(1<<CS11); // timer1 up with prescaler 64
1d3e: 8e b5 in r24, 0x2e ; 46
1d40: 83 60 ori r24, 0x03 ; 3
1d42: 8e bd out 0x2e, r24 ; 46
}
1d44: 08 95 ret
 
00001d46 <__vector_3>:
 
/**
* Handle INT2 interrupts that occur on changing edges of ppm signal
*/
ISR(INT2_vect) {
1d46: 1f 92 push r1
1d48: 0f 92 push r0
1d4a: 0f b6 in r0, 0x3f ; 63
1d4c: 0f 92 push r0
1d4e: 11 24 eor r1, r1
1d50: 2f 93 push r18
1d52: 3f 93 push r19
1d54: 4f 93 push r20
1d56: 5f 93 push r21
1d58: 6f 93 push r22
1d5a: 7f 93 push r23
1d5c: 8f 93 push r24
1d5e: 9f 93 push r25
1d60: af 93 push r26
1d62: bf 93 push r27
1d64: ef 93 push r30
1d66: ff 93 push r31
// since the pin might get bogus reads we wait for 123 signals
static uint8_t valid_ppm_to_go = 123;
if (EMCUCR & (1<<ISC2)) { // rising
1d68: 06 b6 in r0, 0x36 ; 54
1d6a: 00 fc sbrc r0, 0
1d6c: 40 c0 rjmp .+128 ; 0x1dee <__vector_3+0xa8>
old_timer1 = TCNT1;
EMCUCR &= ~(1<<ISC2); // next one is falling
} else {
if (valid_ppm_to_go) {
1d6e: 80 91 11 01 lds r24, 0x0111
1d72: 88 23 and r24, r24
1d74: b9 f0 breq .+46 ; 0x1da4 <__vector_3+0x5e>
valid_ppm_to_go--;
1d76: 81 50 subi r24, 0x01 ; 1
1d78: 80 93 11 01 sts 0x0111, r24
clear();
}
COSD_FLAGS_CONFIG &= ~COSD_FLAG_HUD;
}
}
EMCUCR |= (1<<ISC2); // next one is rising
1d7c: 86 b7 in r24, 0x36 ; 54
1d7e: 81 60 ori r24, 0x01 ; 1
1d80: 86 bf out 0x36, r24 ; 54
}
//write_ndigit_number_u(2, 2, ppm, 1000, 0); // debug
//write_ndigit_number_u(2, 3, valid_ppm_to_go, 100, 0); // debug
//write_ndigit_number_u(2, 4, COSD_FLAGS, 100, 0); // debug
}
1d82: ff 91 pop r31
1d84: ef 91 pop r30
1d86: bf 91 pop r27
1d88: af 91 pop r26
1d8a: 9f 91 pop r25
1d8c: 8f 91 pop r24
1d8e: 7f 91 pop r23
1d90: 6f 91 pop r22
1d92: 5f 91 pop r21
1d94: 4f 91 pop r20
1d96: 3f 91 pop r19
1d98: 2f 91 pop r18
1d9a: 0f 90 pop r0
1d9c: 0f be out 0x3f, r0 ; 63
1d9e: 0f 90 pop r0
1da0: 1f 90 pop r1
1da2: 18 95 reti
EMCUCR &= ~(1<<ISC2); // next one is falling
} else {
if (valid_ppm_to_go) {
valid_ppm_to_go--;
} else {
ppm = TCNT1 - old_timer1;
1da4: 8c b5 in r24, 0x2c ; 44
1da6: 9d b5 in r25, 0x2d ; 45
1da8: 20 91 3f 01 lds r18, 0x013F
1dac: 30 91 40 01 lds r19, 0x0140
1db0: 82 1b sub r24, r18
1db2: 93 0b sbc r25, r19
1db4: 90 93 42 01 sts 0x0142, r25
1db8: 80 93 41 01 sts 0x0141, r24
ppm -= 256;
1dbc: 80 91 41 01 lds r24, 0x0141
1dc0: 90 91 42 01 lds r25, 0x0142
1dc4: 80 50 subi r24, 0x00 ; 0
1dc6: 91 40 sbci r25, 0x01 ; 1
1dc8: 90 93 42 01 sts 0x0142, r25
1dcc: 80 93 41 01 sts 0x0141, r24
if (ppm < 128) { // we want HUD
1dd0: 80 91 41 01 lds r24, 0x0141
1dd4: 90 91 42 01 lds r25, 0x0142
1dd8: 80 38 cpi r24, 0x80 ; 128
1dda: 91 05 cpc r25, r1
1ddc: 90 f0 brcs .+36 ; 0x1e02 <__vector_3+0xbc>
COSD_FLAGS_CONFIG |= COSD_FLAG_HUD;
} else { // we do not want hud
if (COSD_FLAGS_CONFIG & COSD_FLAG_HUD) {
1dde: 80 91 1c 01 lds r24, 0x011C
1de2: 80 fd sbrc r24, 0
1de4: 14 c0 rjmp .+40 ; 0x1e0e <__vector_3+0xc8>
clear();
}
COSD_FLAGS_CONFIG &= ~COSD_FLAG_HUD;
1de6: 8e 7f andi r24, 0xFE ; 254
1de8: 80 93 1c 01 sts 0x011C, r24
1dec: c7 cf rjmp .-114 ; 0x1d7c <__vector_3+0x36>
*/
ISR(INT2_vect) {
// since the pin might get bogus reads we wait for 123 signals
static uint8_t valid_ppm_to_go = 123;
if (EMCUCR & (1<<ISC2)) { // rising
old_timer1 = TCNT1;
1dee: 8c b5 in r24, 0x2c ; 44
1df0: 9d b5 in r25, 0x2d ; 45
1df2: 90 93 40 01 sts 0x0140, r25
1df6: 80 93 3f 01 sts 0x013F, r24
EMCUCR &= ~(1<<ISC2); // next one is falling
1dfa: 86 b7 in r24, 0x36 ; 54
1dfc: 8e 7f andi r24, 0xFE ; 254
1dfe: 86 bf out 0x36, r24 ; 54
1e00: c0 cf rjmp .-128 ; 0x1d82 <__vector_3+0x3c>
valid_ppm_to_go--;
} else {
ppm = TCNT1 - old_timer1;
ppm -= 256;
if (ppm < 128) { // we want HUD
COSD_FLAGS_CONFIG |= COSD_FLAG_HUD;
1e02: 80 91 1c 01 lds r24, 0x011C
1e06: 81 60 ori r24, 0x01 ; 1
1e08: 80 93 1c 01 sts 0x011C, r24
1e0c: b7 cf rjmp .-146 ; 0x1d7c <__vector_3+0x36>
} else { // we do not want hud
if (COSD_FLAGS_CONFIG & COSD_FLAG_HUD) {
clear();
1e0e: 0e 94 75 08 call 0x10ea ; 0x10ea <clear>
1e12: 80 91 1c 01 lds r24, 0x011C
1e16: e7 cf rjmp .-50 ; 0x1de6 <__vector_3+0xa0>
 
00001e18 <osd_ncmode_default>:
#include "osd_helpers.h"
#include "osd_ncmode_default.h"
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
int osd_ncmode_default() {
1e18: ef 92 push r14
1e1a: ff 92 push r15
1e1c: 0f 93 push r16
1e1e: 1f 93 push r17
1e20: cf 93 push r28
1e22: df 93 push r29
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
1e24: 80 91 1b 01 lds r24, 0x011B
1e28: 80 ff sbrs r24, 0
1e2a: e5 c1 rjmp .+970 ; 0x21f6 <osd_ncmode_default+0x3de>
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
1e2c: 80 91 1d 01 lds r24, 0x011D
1e30: 81 ff sbrs r24, 1
1e32: f4 c2 rjmp .+1512 ; 0x241c <osd_ncmode_default+0x604>
write_char_xy(27, bottom_line, 0xC9); // sat2
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
// first line
write_ndigit_number_u(2, top_line, (uint16_t) (((uint32_t) naviData.GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
1e34: 20 91 d4 01 lds r18, 0x01D4
1e38: 30 91 d5 01 lds r19, 0x01D5
1e3c: 40 e0 ldi r20, 0x00 ; 0
1e3e: 50 e0 ldi r21, 0x00 ; 0
1e40: ca 01 movw r24, r20
1e42: b9 01 movw r22, r18
1e44: 66 0f add r22, r22
1e46: 77 1f adc r23, r23
1e48: 88 1f adc r24, r24
1e4a: 99 1f adc r25, r25
1e4c: 66 0f add r22, r22
1e4e: 77 1f adc r23, r23
1e50: 88 1f adc r24, r24
1e52: 99 1f adc r25, r25
1e54: 66 0f add r22, r22
1e56: 77 1f adc r23, r23
1e58: 88 1f adc r24, r24
1e5a: 99 1f adc r25, r25
1e5c: 62 0f add r22, r18
1e5e: 73 1f adc r23, r19
1e60: 84 1f adc r24, r20
1e62: 95 1f adc r25, r21
1e64: 2a ef ldi r18, 0xFA ; 250
1e66: 30 e0 ldi r19, 0x00 ; 0
1e68: 40 e0 ldi r20, 0x00 ; 0
1e6a: 50 e0 ldi r21, 0x00 ; 0
1e6c: 0e 94 8f 1c call 0x391e ; 0x391e <__udivmodsi4>
1e70: 82 e0 ldi r24, 0x02 ; 2
1e72: 60 91 02 01 lds r22, 0x0102
1e76: a9 01 movw r20, r18
1e78: 23 e0 ldi r18, 0x03 ; 3
1e7a: 30 e0 ldi r19, 0x00 ; 0
1e7c: 00 e0 ldi r16, 0x00 ; 0
1e7e: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
 
write_ndigit_number_u(7, top_line, naviData.RC_Quality, 3, 0);
1e82: 40 91 dc 01 lds r20, 0x01DC
1e86: 87 e0 ldi r24, 0x07 ; 7
1e88: 60 91 02 01 lds r22, 0x0102
1e8c: 50 e0 ldi r21, 0x00 ; 0
1e8e: 23 e0 ldi r18, 0x03 ; 3
1e90: 30 e0 ldi r19, 0x00 ; 0
1e92: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
if (naviData.RC_Quality <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
1e96: 80 91 dc 01 lds r24, 0x01DC
1e9a: 85 36 cpi r24, 0x65 ; 101
1e9c: 08 f4 brcc .+2 ; 0x1ea0 <osd_ncmode_default+0x88>
1e9e: 69 c2 rjmp .+1234 ; 0x2372 <osd_ncmode_default+0x55a>
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (naviData.RC_Quality > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
1ea0: 80 91 dc 01 lds r24, 0x01DC
1ea4: 85 36 cpi r24, 0x65 ; 101
1ea6: 08 f0 brcs .+2 ; 0x1eaa <osd_ncmode_default+0x92>
1ea8: a9 c2 rjmp .+1362 ; 0x23fc <osd_ncmode_default+0x5e4>
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, 0);
}
 
if (naviData.NCFlags & NC_FLAG_NOSERIALLINK) {
1eaa: 80 91 de 01 lds r24, 0x01DE
1eae: 84 ff sbrs r24, 4
1eb0: 73 c2 rjmp .+1254 ; 0x2398 <osd_ncmode_default+0x580>
write_char_xy(11, top_line, 0); // clear
1eb2: 8b e0 ldi r24, 0x0B ; 11
1eb4: 60 91 02 01 lds r22, 0x0102
1eb8: 40 e0 ldi r20, 0x00 ; 0
1eba: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
} else {
write_char_xy(11, top_line, 0xC6); // PC icon
}
 
write_ndigit_number_u(13, top_line, naviData.CompassHeading, 3, 0);
1ebe: 40 91 d8 01 lds r20, 0x01D8
1ec2: 50 91 d9 01 lds r21, 0x01D9
1ec6: 8d e0 ldi r24, 0x0D ; 13
1ec8: 60 91 02 01 lds r22, 0x0102
1ecc: 23 e0 ldi r18, 0x03 ; 3
1ece: 30 e0 ldi r19, 0x00 ; 0
1ed0: 00 e0 ldi r16, 0x00 ; 0
1ed2: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
 
write_ascii_string_pgm(17, top_line, (const char *) (pgm_read_word ( &(directions[heading_conv(naviData.CompassHeading)]))));
1ed6: 10 91 02 01 lds r17, 0x0102
1eda: 80 91 d8 01 lds r24, 0x01D8
1ede: 90 91 d9 01 lds r25, 0x01D9
1ee2: 0e 94 9d 08 call 0x113a ; 0x113a <heading_conv>
1ee6: e8 2f mov r30, r24
1ee8: f0 e0 ldi r31, 0x00 ; 0
1eea: ee 0f add r30, r30
1eec: ff 1f adc r31, r31
1eee: e8 5f subi r30, 0xF8 ; 248
1ef0: fe 4f sbci r31, 0xFE ; 254
1ef2: 45 91 lpm r20, Z+
1ef4: 54 91 lpm r21, Z+
1ef6: 81 e1 ldi r24, 0x11 ; 17
1ef8: 61 2f mov r22, r17
1efa: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
 
draw_variometer(21, top_line, naviData.Variometer);
1efe: 40 91 cf 01 lds r20, 0x01CF
1f02: 50 91 d0 01 lds r21, 0x01D0
1f06: 85 e1 ldi r24, 0x15 ; 21
1f08: 60 91 02 01 lds r22, 0x0102
1f0c: 0e 94 c1 09 call 0x1382 ; 0x1382 <draw_variometer>
 
if (COSD_FLAGS_CONFIG & COSD_FLAG_GPSHEIGHT) {
1f10: 80 91 1c 01 lds r24, 0x011C
1f14: 81 ff sbrs r24, 1
1f16: 52 c0 rjmp .+164 ; 0x1fbc <osd_ncmode_default+0x1a4>
if (naviData.CurrentPosition.Altitude / 1000 - altimeter_offset > 10 || naviData.CurrentPosition.Altitude / 1000 - altimeter_offset < -10) {
1f18: 60 91 a3 01 lds r22, 0x01A3
1f1c: 70 91 a4 01 lds r23, 0x01A4
1f20: 80 91 a5 01 lds r24, 0x01A5
1f24: 90 91 a6 01 lds r25, 0x01A6
1f28: c0 91 98 01 lds r28, 0x0198
1f2c: d0 91 99 01 lds r29, 0x0199
1f30: 7e 01 movw r14, r28
1f32: 00 27 eor r16, r16
1f34: f7 fc sbrc r15, 7
1f36: 00 95 com r16
1f38: 10 2f mov r17, r16
1f3a: 28 ee ldi r18, 0xE8 ; 232
1f3c: 33 e0 ldi r19, 0x03 ; 3
1f3e: 40 e0 ldi r20, 0x00 ; 0
1f40: 50 e0 ldi r21, 0x00 ; 0
1f42: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
1f46: 2e 19 sub r18, r14
1f48: 3f 09 sbc r19, r15
1f4a: 40 0b sbc r20, r16
1f4c: 51 0b sbc r21, r17
1f4e: 2b 30 cpi r18, 0x0B ; 11
1f50: 31 05 cpc r19, r1
1f52: 41 05 cpc r20, r1
1f54: 51 05 cpc r21, r1
1f56: c4 f4 brge .+48 ; 0x1f88 <osd_ncmode_default+0x170>
1f58: 60 91 a3 01 lds r22, 0x01A3
1f5c: 70 91 a4 01 lds r23, 0x01A4
1f60: 80 91 a5 01 lds r24, 0x01A5
1f64: 90 91 a6 01 lds r25, 0x01A6
1f68: 28 ee ldi r18, 0xE8 ; 232
1f6a: 33 e0 ldi r19, 0x03 ; 3
1f6c: 40 e0 ldi r20, 0x00 ; 0
1f6e: 50 e0 ldi r21, 0x00 ; 0
1f70: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
1f74: 2e 19 sub r18, r14
1f76: 3f 09 sbc r19, r15
1f78: 40 0b sbc r20, r16
1f7a: 51 0b sbc r21, r17
1f7c: 26 5f subi r18, 0xF6 ; 246
1f7e: 3f 4f sbci r19, 0xFF ; 255
1f80: 4f 4f sbci r20, 0xFF ; 255
1f82: 5f 4f sbci r21, 0xFF ; 255
1f84: 0c f0 brlt .+2 ; 0x1f88 <osd_ncmode_default+0x170>
1f86: 83 c4 rjmp .+2310 ; 0x288e <osd_ncmode_default+0xa76>
// above 10m only write full meters
write_ndigit_number_s(23, top_line, (int16_t) (naviData.CurrentPosition.Altitude / 1000 - altimeter_offset), 4, 0); // GPS
1f88: 60 91 a3 01 lds r22, 0x01A3
1f8c: 70 91 a4 01 lds r23, 0x01A4
1f90: 80 91 a5 01 lds r24, 0x01A5
1f94: 90 91 a6 01 lds r25, 0x01A6
1f98: 28 ee ldi r18, 0xE8 ; 232
1f9a: 33 e0 ldi r19, 0x03 ; 3
1f9c: 40 e0 ldi r20, 0x00 ; 0
1f9e: 50 e0 ldi r21, 0x00 ; 0
1fa0: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
1fa4: 2c 1b sub r18, r28
1fa6: 3d 0b sbc r19, r29
1fa8: 87 e1 ldi r24, 0x17 ; 23
1faa: 60 91 02 01 lds r22, 0x0102
1fae: a9 01 movw r20, r18
1fb0: 24 e0 ldi r18, 0x04 ; 4
1fb2: 30 e0 ldi r19, 0x00 ; 0
1fb4: 00 e0 ldi r16, 0x00 ; 0
1fb6: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
1fba: 20 c0 rjmp .+64 ; 0x1ffc <osd_ncmode_default+0x1e4>
// up to 10m write meters.dm
write_ndigit_number_s_10th(23, top_line, (int16_t) (naviData.CurrentPosition.Altitude / 100 - altimeter_offset * 10), 3, 0); // GPS
}
} else {
//note:lephisto:according to several sources it's /30
if (naviData.Altimeter > 300 || naviData.Altimeter < -300) {
1fbc: 80 91 cd 01 lds r24, 0x01CD
1fc0: 90 91 ce 01 lds r25, 0x01CE
1fc4: 8d 52 subi r24, 0x2D ; 45
1fc6: 91 40 sbci r25, 0x01 ; 1
1fc8: 44 f4 brge .+16 ; 0x1fda <osd_ncmode_default+0x1c2>
1fca: 80 91 cd 01 lds r24, 0x01CD
1fce: 90 91 ce 01 lds r25, 0x01CE
1fd2: 84 5d subi r24, 0xD4 ; 212
1fd4: 9e 4f sbci r25, 0xFE ; 254
1fd6: 0c f0 brlt .+2 ; 0x1fda <osd_ncmode_default+0x1c2>
1fd8: 82 c4 rjmp .+2308 ; 0x28de <osd_ncmode_default+0xac6>
// above 10m only write full meters
write_ndigit_number_s(23, top_line, naviData.Altimeter / 30, 4, 0); // BARO
1fda: 80 91 cd 01 lds r24, 0x01CD
1fde: 90 91 ce 01 lds r25, 0x01CE
1fe2: 6e e1 ldi r22, 0x1E ; 30
1fe4: 70 e0 ldi r23, 0x00 ; 0
1fe6: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
1fea: ab 01 movw r20, r22
1fec: 87 e1 ldi r24, 0x17 ; 23
1fee: 60 91 02 01 lds r22, 0x0102
1ff2: 24 e0 ldi r18, 0x04 ; 4
1ff4: 30 e0 ldi r19, 0x00 ; 0
1ff6: 00 e0 ldi r16, 0x00 ; 0
1ff8: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
}
}
 
 
// seccond line
draw_compass(11, top_line + 1, naviData.CompassHeading);
1ffc: 40 91 d8 01 lds r20, 0x01D8
2000: 50 91 d9 01 lds r21, 0x01D9
2004: 60 91 02 01 lds r22, 0x0102
2008: 6f 5f subi r22, 0xFF ; 255
200a: 8b e0 ldi r24, 0x0B ; 11
200c: 0e 94 55 0a call 0x14aa ; 0x14aa <draw_compass>
 
// TODO: verify correctness
uint16_t heading_home = (naviData.HomePositionDeviation.Bearing + 360 - naviData.CompassHeading) % 360;
2010: 80 91 c8 01 lds r24, 0x01C8
2014: 90 91 c9 01 lds r25, 0x01C9
2018: 20 91 d8 01 lds r18, 0x01D8
201c: 30 91 d9 01 lds r19, 0x01D9
//write_char_xy(21, top_line + 1, arrowdir[heading_conv(heading_home)]);
// finer resolution, 0xa0 is first character and we add the index 0 <= index < 16
write_char_xy(21, top_line + 1, 0xa0 + heading_fine_conv(heading_home));
2020: 10 91 02 01 lds r17, 0x0102
2024: 1f 5f subi r17, 0xFF ; 255
2026: 88 59 subi r24, 0x98 ; 152
2028: 9e 4f sbci r25, 0xFE ; 254
202a: 82 1b sub r24, r18
202c: 93 0b sbc r25, r19
202e: 68 e6 ldi r22, 0x68 ; 104
2030: 71 e0 ldi r23, 0x01 ; 1
2032: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
2036: 0e 94 cf 08 call 0x119e ; 0x119e <heading_fine_conv>
203a: 48 2f mov r20, r24
203c: 40 56 subi r20, 0x60 ; 96
203e: 85 e1 ldi r24, 0x15 ; 21
2040: 61 2f mov r22, r17
2042: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
 
write_ndigit_number_u(24, top_line + 1, naviData.HomePositionDeviation.Distance / 10, 3, 0);
2046: 80 91 c6 01 lds r24, 0x01C6
204a: 90 91 c7 01 lds r25, 0x01C7
204e: 20 91 02 01 lds r18, 0x0102
2052: 2f 5f subi r18, 0xFF ; 255
2054: 6a e0 ldi r22, 0x0A ; 10
2056: 70 e0 ldi r23, 0x00 ; 0
2058: 0e 94 68 1c call 0x38d0 ; 0x38d0 <__udivmodhi4>
205c: ab 01 movw r20, r22
205e: 88 e1 ldi r24, 0x18 ; 24
2060: 62 2f mov r22, r18
2062: 23 e0 ldi r18, 0x03 ; 3
2064: 30 e0 ldi r19, 0x00 ; 0
2066: 00 e0 ldi r16, 0x00 ; 0
2068: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
// center
if (naviData.FCFlags & FLAG_MOTOR_RUN) { // should be engines running
206c: 80 91 dd 01 lds r24, 0x01DD
2070: 80 ff sbrs r24, 0
2072: 84 c2 rjmp .+1288 ; 0x257c <osd_ncmode_default+0x764>
if (!(old_MKFlags & FLAG_MOTOR_RUN)) { // motors just started, clear middle
2074: 80 91 27 01 lds r24, 0x0127
2078: 80 ff sbrs r24, 0
207a: 91 c3 rjmp .+1826 ; 0x279e <osd_ncmode_default+0x986>
207c: 10 91 1b 01 lds r17, 0x011B
2080: 00 91 1d 01 lds r16, 0x011D
wasted_ampere_offset = naviData.UsedCapacity;
}
// update flags to paint display again if needed
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
}
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
2084: 11 ff sbrs r17, 1
2086: 18 c0 rjmp .+48 ; 0x20b8 <osd_ncmode_default+0x2a0>
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
2088: 00 ff sbrs r16, 0
208a: f7 c3 rjmp .+2030 ; 0x287a <osd_ncmode_default+0xa62>
draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
208c: 40 91 da 01 lds r20, 0x01DA
2090: 20 91 db 01 lds r18, 0x01DB
2094: 80 91 02 01 lds r24, 0x0102
2098: 60 91 03 01 lds r22, 0x0103
209c: 62 50 subi r22, 0x02 ; 2
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
209e: 55 27 eor r21, r21
20a0: 47 fd sbrc r20, 7
20a2: 50 95 com r21
20a4: 33 27 eor r19, r19
20a6: 27 fd sbrc r18, 7
20a8: 30 95 com r19
20aa: 8e 5f subi r24, 0xFE ; 254
20ac: 0e 94 e6 08 call 0x11cc ; 0x11cc <draw_artificial_horizon>
20b0: 10 91 1b 01 lds r17, 0x011B
20b4: 00 91 1d 01 lds r16, 0x011D
}
}
// motors are on, assume we were/are flying
COSD_FLAGS_RUNTIME |= COSD_WASFLYING;
20b8: 04 60 ori r16, 0x04 ; 4
20ba: 00 93 1d 01 sts 0x011D, r16
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
}
}
}
if (COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO) {
20be: 12 fd sbrc r17, 2
20c0: 7f c2 rjmp .+1278 ; 0x25c0 <osd_ncmode_default+0x7a8>
draw_big_variometer(27, 8, naviData.Variometer);
}
 
// pre-bottom line
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
20c2: 80 91 1d 01 lds r24, 0x011D
20c6: 80 ff sbrs r24, 0
20c8: 56 c2 rjmp .+1196 ; 0x2576 <osd_ncmode_default+0x75e>
20ca: 16 ff sbrs r17, 6
20cc: 9a c3 rjmp .+1844 ; 0x2802 <osd_ncmode_default+0x9ea>
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_ndigit_number_u_10th(17, bottom_line - 1, s_volt, 3, 0);
}
} else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
write_ndigit_number_u_10th(3, bottom_line - 1, naviData.Current, 3, 0);
20ce: 40 91 e8 01 lds r20, 0x01E8
20d2: 50 91 e9 01 lds r21, 0x01E9
20d6: 60 91 03 01 lds r22, 0x0103
20da: 61 50 subi r22, 0x01 ; 1
20dc: 83 e0 ldi r24, 0x03 ; 3
20de: 23 e0 ldi r18, 0x03 ; 3
20e0: 30 e0 ldi r19, 0x00 ; 0
20e2: 00 e0 ldi r16, 0x00 ; 0
20e4: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
write_ndigit_number_u(10, bottom_line - 1, naviData.UsedCapacity, 4, 0);
20e8: 40 91 ea 01 lds r20, 0x01EA
20ec: 50 91 eb 01 lds r21, 0x01EB
20f0: 60 91 03 01 lds r22, 0x0103
20f4: 61 50 subi r22, 0x01 ; 1
20f6: 8a e0 ldi r24, 0x0A ; 10
20f8: 24 e0 ldi r18, 0x04 ; 4
20fa: 30 e0 ldi r19, 0x00 ; 0
20fc: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
}
 
//DEBUGwrite_ndigit_number_u(1, 5, COSD_FLAGS_MODES, 3, 0);
 
// bottom line
draw_battery(2, bottom_line, min_voltage, naviData.UBat, max_voltage);
2100: 20 91 d3 01 lds r18, 0x01D3
2104: 82 e0 ldi r24, 0x02 ; 2
2106: 60 91 03 01 lds r22, 0x0103
210a: 40 91 19 01 lds r20, 0x0119
210e: 00 91 1a 01 lds r16, 0x011A
2112: 0e 94 17 0a call 0x142e ; 0x142e <draw_battery>
write_ndigit_number_u_10th(3, bottom_line, naviData.UBat, 3, 0);
2116: 40 91 d3 01 lds r20, 0x01D3
211a: 83 e0 ldi r24, 0x03 ; 3
211c: 60 91 03 01 lds r22, 0x0103
2120: 50 e0 ldi r21, 0x00 ; 0
2122: 23 e0 ldi r18, 0x03 ; 3
2124: 30 e0 ldi r19, 0x00 ; 0
2126: 00 e0 ldi r16, 0x00 ; 0
2128: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
if (naviData.UBat <= min_voltage && last_UBat > min_voltage) {
212c: 80 91 d3 01 lds r24, 0x01D3
2130: 90 91 19 01 lds r25, 0x0119
2134: 98 17 cp r25, r24
2136: 08 f4 brcc .+2 ; 0x213a <osd_ncmode_default+0x322>
2138: ef c1 rjmp .+990 ; 0x2518 <osd_ncmode_default+0x700>
213a: 80 91 00 01 lds r24, 0x0100
213e: 98 17 cp r25, r24
2140: 08 f0 brcs .+2 ; 0x2144 <osd_ncmode_default+0x32c>
2142: ea c1 rjmp .+980 ; 0x2518 <osd_ncmode_default+0x700>
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
2144: 82 e0 ldi r24, 0x02 ; 2
2146: 60 91 03 01 lds r22, 0x0103
214a: 4f e4 ldi r20, 0x4F ; 79
214c: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2150: 83 e0 ldi r24, 0x03 ; 3
2152: 60 91 03 01 lds r22, 0x0103
2156: 4f e4 ldi r20, 0x4F ; 79
2158: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
215c: 84 e0 ldi r24, 0x04 ; 4
215e: 60 91 03 01 lds r22, 0x0103
2162: 4f e4 ldi r20, 0x4F ; 79
2164: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2168: 85 e0 ldi r24, 0x05 ; 5
216a: 60 91 03 01 lds r22, 0x0103
216e: 4f e4 ldi r20, 0x4F ; 79
2170: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2174: 86 e0 ldi r24, 0x06 ; 6
2176: 60 91 03 01 lds r22, 0x0103
217a: 4f e4 ldi r20, 0x4F ; 79
217c: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2180: 87 e0 ldi r24, 0x07 ; 7
2182: 60 91 03 01 lds r22, 0x0103
2186: 4f e4 ldi r20, 0x4F ; 79
2188: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
} else if (naviData.UBat > min_voltage && last_UBat < min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, 0);
}
 
write_time(8, bottom_line, uptime);
218c: 40 91 12 01 lds r20, 0x0112
2190: 50 91 13 01 lds r21, 0x0113
2194: 88 e0 ldi r24, 0x08 ; 8
2196: 60 91 03 01 lds r22, 0x0103
219a: 0e 94 3a 08 call 0x1074 ; 0x1074 <write_time>
write_time(15, bottom_line, naviData.FlyingTime);
219e: 40 91 d1 01 lds r20, 0x01D1
21a2: 50 91 d2 01 lds r21, 0x01D2
21a6: 8f e0 ldi r24, 0x0F ; 15
21a8: 60 91 03 01 lds r22, 0x0103
21ac: 0e 94 3a 08 call 0x1074 ; 0x1074 <write_time>
 
write_ndigit_number_u(24, bottom_line, naviData.SatsInUse, 2, 0);
21b0: 40 91 cc 01 lds r20, 0x01CC
21b4: 88 e1 ldi r24, 0x18 ; 24
21b6: 60 91 03 01 lds r22, 0x0103
21ba: 50 e0 ldi r21, 0x00 ; 0
21bc: 22 e0 ldi r18, 0x02 ; 2
21be: 30 e0 ldi r19, 0x00 ; 0
21c0: 00 e0 ldi r16, 0x00 ; 0
21c2: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
 
if (naviData.NCFlags & NC_FLAG_MANUAL_CONTROL) {
21c6: 80 91 de 01 lds r24, 0x01DE
21ca: 86 ff sbrs r24, 6
21cc: 04 c2 rjmp .+1032 ; 0x25d6 <osd_ncmode_default+0x7be>
write_char_xy(23, bottom_line, 0xB3); // rc transmitter
21ce: 87 e1 ldi r24, 0x17 ; 23
21d0: 60 91 03 01 lds r22, 0x0103
21d4: 43 eb ldi r20, 0xB3 ; 179
21d6: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
} else {
write_char_xy(23, bottom_line, 0); // clear
}
 
if (naviData.NCFlags & NC_FLAG_CH) {
21da: 80 91 de 01 lds r24, 0x01DE
21de: 82 fd sbrc r24, 2
21e0: 04 c2 rjmp .+1032 ; 0x25ea <osd_ncmode_default+0x7d2>
write_char_xy(27, bottom_line, 231); // gps ch
} else if (naviData.NCFlags & NC_FLAG_PH) {
21e2: 80 91 de 01 lds r24, 0x01DE
21e6: 81 ff sbrs r24, 1
21e8: 07 c2 rjmp .+1038 ; 0x25f8 <osd_ncmode_default+0x7e0>
write_char_xy(27, bottom_line, 230); // gps ph
21ea: 8b e1 ldi r24, 0x1B ; 27
21ec: 60 91 03 01 lds r22, 0x0103
21f0: 46 ee ldi r20, 0xE6 ; 230
21f2: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
 
//write_number_s(8, 5, RxDataLen);
//write_number_s(16, 5, setsReceived++);
 
// remember statistics (only when engines running)
if (naviData.FCFlags & FLAG_MOTOR_RUN) {
21f6: 80 91 dd 01 lds r24, 0x01DD
21fa: 80 ff sbrs r24, 0
21fc: 86 c0 rjmp .+268 ; 0x230a <osd_ncmode_default+0x4f2>
if (COSD_FLAGS_CONFIG & COSD_FLAG_GPSHEIGHT) {
21fe: 80 91 1c 01 lds r24, 0x011C
2202: 81 ff sbrs r24, 1
2204: 99 c0 rjmp .+306 ; 0x2338 <osd_ncmode_default+0x520>
if (naviData.CurrentPosition.Altitude / 1000 - altimeter_offset > max_Altimeter) max_Altimeter = naviData.CurrentPosition.Altitude / 1000;
2206: 60 91 a3 01 lds r22, 0x01A3
220a: 70 91 a4 01 lds r23, 0x01A4
220e: 80 91 a5 01 lds r24, 0x01A5
2212: 90 91 a6 01 lds r25, 0x01A6
2216: 28 ee ldi r18, 0xE8 ; 232
2218: 33 e0 ldi r19, 0x03 ; 3
221a: 40 e0 ldi r20, 0x00 ; 0
221c: 50 e0 ldi r21, 0x00 ; 0
221e: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
2222: 80 91 98 01 lds r24, 0x0198
2226: 90 91 99 01 lds r25, 0x0199
222a: aa 27 eor r26, r26
222c: 97 fd sbrc r25, 7
222e: a0 95 com r26
2230: ba 2f mov r27, r26
2232: 28 1b sub r18, r24
2234: 39 0b sbc r19, r25
2236: 4a 0b sbc r20, r26
2238: 5b 0b sbc r21, r27
223a: 80 91 1f 01 lds r24, 0x011F
223e: 90 91 20 01 lds r25, 0x0120
2242: aa 27 eor r26, r26
2244: 97 fd sbrc r25, 7
2246: a0 95 com r26
2248: ba 2f mov r27, r26
224a: 82 17 cp r24, r18
224c: 93 07 cpc r25, r19
224e: a4 07 cpc r26, r20
2250: b5 07 cpc r27, r21
2252: 0c f4 brge .+2 ; 0x2256 <osd_ncmode_default+0x43e>
2254: 4e c1 rjmp .+668 ; 0x24f2 <osd_ncmode_default+0x6da>
} else {
if (naviData.Altimeter / 30 > max_Altimeter) max_Altimeter = naviData.Altimeter / 30;
}
if (naviData.GroundSpeed > max_GroundSpeed) max_GroundSpeed = naviData.GroundSpeed;
2256: 20 91 d4 01 lds r18, 0x01D4
225a: 30 91 d5 01 lds r19, 0x01D5
225e: 80 91 21 01 lds r24, 0x0121
2262: 90 91 22 01 lds r25, 0x0122
2266: 82 17 cp r24, r18
2268: 93 07 cpc r25, r19
226a: 40 f4 brcc .+16 ; 0x227c <osd_ncmode_default+0x464>
226c: 80 91 d4 01 lds r24, 0x01D4
2270: 90 91 d5 01 lds r25, 0x01D5
2274: 90 93 22 01 sts 0x0122, r25
2278: 80 93 21 01 sts 0x0121, r24
if (naviData.HomePositionDeviation.Distance > max_Distance) {
227c: 20 91 c6 01 lds r18, 0x01C6
2280: 30 91 c7 01 lds r19, 0x01C7
2284: 80 91 23 01 lds r24, 0x0123
2288: 90 91 24 01 lds r25, 0x0124
228c: 82 17 cp r24, r18
228e: 93 07 cpc r25, r19
2290: 40 f4 brcc .+16 ; 0x22a2 <osd_ncmode_default+0x48a>
max_Distance = naviData.HomePositionDeviation.Distance;
2292: 80 91 c6 01 lds r24, 0x01C6
2296: 90 91 c7 01 lds r25, 0x01C7
229a: 90 93 24 01 sts 0x0124, r25
229e: 80 93 23 01 sts 0x0123, r24
}
if (naviData.UBat < min_UBat) min_UBat = naviData.UBat;
22a2: 90 91 d3 01 lds r25, 0x01D3
22a6: 80 91 04 01 lds r24, 0x0104
22aa: 98 17 cp r25, r24
22ac: 20 f4 brcc .+8 ; 0x22b6 <osd_ncmode_default+0x49e>
22ae: 80 91 d3 01 lds r24, 0x01D3
22b2: 80 93 04 01 sts 0x0104, r24
if (naviData.FlyingTime > max_FlyingTime) max_FlyingTime = naviData.FlyingTime;
22b6: 20 91 d1 01 lds r18, 0x01D1
22ba: 30 91 d2 01 lds r19, 0x01D2
22be: 80 91 25 01 lds r24, 0x0125
22c2: 90 91 26 01 lds r25, 0x0126
22c6: 82 17 cp r24, r18
22c8: 93 07 cpc r25, r19
22ca: 40 f4 brcc .+16 ; 0x22dc <osd_ncmode_default+0x4c4>
22cc: 80 91 d1 01 lds r24, 0x01D1
22d0: 90 91 d2 01 lds r25, 0x01D2
22d4: 90 93 26 01 sts 0x0126, r25
22d8: 80 93 25 01 sts 0x0125, r24
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
22dc: 80 91 1d 01 lds r24, 0x011D
22e0: 80 ff sbrs r24, 0
22e2: 61 c0 rjmp .+194 ; 0x23a6 <osd_ncmode_default+0x58e>
22e4: 80 91 1b 01 lds r24, 0x011B
22e8: 86 fd sbrc r24, 6
22ea: 61 c0 rjmp .+194 ; 0x23ae <osd_ncmode_default+0x596>
if (ampere > max_ampere) max_ampere = ampere;
22ec: 20 91 37 01 lds r18, 0x0137
22f0: 30 91 38 01 lds r19, 0x0138
22f4: 80 91 39 01 lds r24, 0x0139
22f8: 90 91 3a 01 lds r25, 0x013A
22fc: 82 17 cp r24, r18
22fe: 93 07 cpc r25, r19
2300: 24 f4 brge .+8 ; 0x230a <osd_ncmode_default+0x4f2>
} else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
if (naviData.Current * 10 > max_ampere) max_ampere = naviData.Current * 10;
2302: 30 93 3a 01 sts 0x013A, r19
2306: 20 93 39 01 sts 0x0139, r18
}
}
 
// remember last values
last_RC_Quality = naviData.RC_Quality;
230a: 80 91 dc 01 lds r24, 0x01DC
230e: 80 93 01 01 sts 0x0101, r24
last_UBat = naviData.UBat;
2312: 80 91 d3 01 lds r24, 0x01D3
2316: 80 93 00 01 sts 0x0100, r24
old_MKFlags = naviData.FCFlags;
231a: 80 91 dd 01 lds r24, 0x01DD
231e: 80 93 27 01 sts 0x0127, r24
seconds_since_last_data = 0;
2322: 10 92 18 01 sts 0x0118, r1
 
return 0;
}
2326: 80 e0 ldi r24, 0x00 ; 0
2328: 90 e0 ldi r25, 0x00 ; 0
232a: df 91 pop r29
232c: cf 91 pop r28
232e: 1f 91 pop r17
2330: 0f 91 pop r16
2332: ff 90 pop r15
2334: ef 90 pop r14
2336: 08 95 ret
// remember statistics (only when engines running)
if (naviData.FCFlags & FLAG_MOTOR_RUN) {
if (COSD_FLAGS_CONFIG & COSD_FLAG_GPSHEIGHT) {
if (naviData.CurrentPosition.Altitude / 1000 - altimeter_offset > max_Altimeter) max_Altimeter = naviData.CurrentPosition.Altitude / 1000;
} else {
if (naviData.Altimeter / 30 > max_Altimeter) max_Altimeter = naviData.Altimeter / 30;
2338: 80 91 cd 01 lds r24, 0x01CD
233c: 90 91 ce 01 lds r25, 0x01CE
2340: 6e e1 ldi r22, 0x1E ; 30
2342: 70 e0 ldi r23, 0x00 ; 0
2344: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
2348: 80 91 1f 01 lds r24, 0x011F
234c: 90 91 20 01 lds r25, 0x0120
2350: 86 17 cp r24, r22
2352: 97 07 cpc r25, r23
2354: 0c f0 brlt .+2 ; 0x2358 <osd_ncmode_default+0x540>
2356: 7f cf rjmp .-258 ; 0x2256 <osd_ncmode_default+0x43e>
2358: 80 91 cd 01 lds r24, 0x01CD
235c: 90 91 ce 01 lds r25, 0x01CE
2360: 6e e1 ldi r22, 0x1E ; 30
2362: 70 e0 ldi r23, 0x00 ; 0
2364: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
2368: 70 93 20 01 sts 0x0120, r23
236c: 60 93 1f 01 sts 0x011F, r22
2370: 72 cf rjmp .-284 ; 0x2256 <osd_ncmode_default+0x43e>
 
// first line
write_ndigit_number_u(2, top_line, (uint16_t) (((uint32_t) naviData.GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
 
write_ndigit_number_u(7, top_line, naviData.RC_Quality, 3, 0);
if (naviData.RC_Quality <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
2372: 80 91 01 01 lds r24, 0x0101
2376: 85 36 cpi r24, 0x65 ; 101
2378: 08 f4 brcc .+2 ; 0x237c <osd_ncmode_default+0x564>
237a: 92 cd rjmp .-1244 ; 0x1ea0 <osd_ncmode_default+0x88>
237c: 17 e0 ldi r17, 0x07 ; 7
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
237e: 81 2f mov r24, r17
2380: 60 91 02 01 lds r22, 0x0102
2384: 4f e4 ldi r20, 0x4F ; 79
2386: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
238a: 1f 5f subi r17, 0xFF ; 255
// first line
write_ndigit_number_u(2, top_line, (uint16_t) (((uint32_t) naviData.GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
 
write_ndigit_number_u(7, top_line, naviData.RC_Quality, 3, 0);
if (naviData.RC_Quality <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
238c: 1b 30 cpi r17, 0x0B ; 11
238e: b9 f7 brne .-18 ; 0x237e <osd_ncmode_default+0x566>
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, 0);
}
 
if (naviData.NCFlags & NC_FLAG_NOSERIALLINK) {
2390: 80 91 de 01 lds r24, 0x01DE
2394: 84 fd sbrc r24, 4
2396: 8d cd rjmp .-1254 ; 0x1eb2 <osd_ncmode_default+0x9a>
write_char_xy(11, top_line, 0); // clear
} else {
write_char_xy(11, top_line, 0xC6); // PC icon
2398: 8b e0 ldi r24, 0x0B ; 11
239a: 60 91 02 01 lds r22, 0x0102
239e: 46 ec ldi r20, 0xC6 ; 198
23a0: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
23a4: 8c cd rjmp .-1256 ; 0x1ebe <osd_ncmode_default+0xa6>
}
if (naviData.UBat < min_UBat) min_UBat = naviData.UBat;
if (naviData.FlyingTime > max_FlyingTime) max_FlyingTime = naviData.FlyingTime;
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
if (ampere > max_ampere) max_ampere = ampere;
} else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
23a6: 80 91 1b 01 lds r24, 0x011B
23aa: 86 ff sbrs r24, 6
23ac: ae cf rjmp .-164 ; 0x230a <osd_ncmode_default+0x4f2>
if (naviData.Current * 10 > max_ampere) max_ampere = naviData.Current * 10;
23ae: 80 91 e8 01 lds r24, 0x01E8
23b2: 90 91 e9 01 lds r25, 0x01E9
23b6: 9c 01 movw r18, r24
23b8: 22 0f add r18, r18
23ba: 33 1f adc r19, r19
23bc: 22 0f add r18, r18
23be: 33 1f adc r19, r19
23c0: 22 0f add r18, r18
23c2: 33 1f adc r19, r19
23c4: 88 0f add r24, r24
23c6: 99 1f adc r25, r25
23c8: 28 0f add r18, r24
23ca: 39 1f adc r19, r25
23cc: 80 91 39 01 lds r24, 0x0139
23d0: 90 91 3a 01 lds r25, 0x013A
23d4: 82 17 cp r24, r18
23d6: 93 07 cpc r25, r19
23d8: 08 f0 brcs .+2 ; 0x23dc <osd_ncmode_default+0x5c4>
23da: 97 cf rjmp .-210 ; 0x230a <osd_ncmode_default+0x4f2>
23dc: 80 91 e8 01 lds r24, 0x01E8
23e0: 90 91 e9 01 lds r25, 0x01E9
23e4: 9c 01 movw r18, r24
23e6: 22 0f add r18, r18
23e8: 33 1f adc r19, r19
23ea: 22 0f add r18, r18
23ec: 33 1f adc r19, r19
23ee: 22 0f add r18, r18
23f0: 33 1f adc r19, r19
23f2: 88 0f add r24, r24
23f4: 99 1f adc r25, r25
23f6: 28 0f add r18, r24
23f8: 39 1f adc r19, r25
23fa: 83 cf rjmp .-250 ; 0x2302 <osd_ncmode_default+0x4ea>
 
write_ndigit_number_u(7, top_line, naviData.RC_Quality, 3, 0);
if (naviData.RC_Quality <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (naviData.RC_Quality > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
23fc: 80 91 01 01 lds r24, 0x0101
2400: 85 36 cpi r24, 0x65 ; 101
2402: 08 f0 brcs .+2 ; 0x2406 <osd_ncmode_default+0x5ee>
2404: 52 cd rjmp .-1372 ; 0x1eaa <osd_ncmode_default+0x92>
2406: 17 e0 ldi r17, 0x07 ; 7
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, 0);
2408: 81 2f mov r24, r17
240a: 60 91 02 01 lds r22, 0x0102
240e: 40 e0 ldi r20, 0x00 ; 0
2410: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2414: 1f 5f subi r17, 0xFF ; 255
write_ndigit_number_u(7, top_line, naviData.RC_Quality, 3, 0);
if (naviData.RC_Quality <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (naviData.RC_Quality > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
2416: 1b 30 cpi r17, 0x0B ; 11
2418: b9 f7 brne .-18 ; 0x2408 <osd_ncmode_default+0x5f0>
241a: 47 cd rjmp .-1394 ; 0x1eaa <osd_ncmode_default+0x92>
 
int osd_ncmode_default() {
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
write_char_xy(5, top_line, 0xCB); // km/h
241c: 85 e0 ldi r24, 0x05 ; 5
241e: 60 91 02 01 lds r22, 0x0102
2422: 4b ec ldi r20, 0xCB ; 203
2424: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(10, top_line, 0xCA); // RC-transmitter
2428: 8a e0 ldi r24, 0x0A ; 10
242a: 60 91 02 01 lds r22, 0x0102
242e: 4a ec ldi r20, 0xCA ; 202
2430: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(16, top_line, 0xD0); // degree symbol
2434: 80 e1 ldi r24, 0x10 ; 16
2436: 60 91 02 01 lds r22, 0x0102
243a: 40 ed ldi r20, 0xD0 ; 208
243c: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(27, top_line, 0xCC); // small meters m height
2440: 8b e1 ldi r24, 0x1B ; 27
2442: 60 91 02 01 lds r22, 0x0102
2446: 4c ec ldi r20, 0xCC ; 204
2448: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(20, top_line + 1, 0xB0); // left circle
244c: 60 91 02 01 lds r22, 0x0102
2450: 6f 5f subi r22, 0xFF ; 255
2452: 84 e1 ldi r24, 0x14 ; 20
2454: 40 eb ldi r20, 0xB0 ; 176
2456: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(22, top_line + 1, 0xB2); // right circle
245a: 60 91 02 01 lds r22, 0x0102
245e: 6f 5f subi r22, 0xFF ; 255
2460: 86 e1 ldi r24, 0x16 ; 22
2462: 42 eb ldi r20, 0xB2 ; 178
2464: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(27, top_line + 1, 0xCC); // small meters m home
2468: 60 91 02 01 lds r22, 0x0102
246c: 6f 5f subi r22, 0xFF ; 255
246e: 8b e1 ldi r24, 0x1B ; 27
2470: 4c ec ldi r20, 0xCC ; 204
2472: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(7, bottom_line, 0x9E); // small V
2476: 87 e0 ldi r24, 0x07 ; 7
2478: 60 91 03 01 lds r22, 0x0103
247c: 4e e9 ldi r20, 0x9E ; 158
247e: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) || (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
2482: 80 91 1d 01 lds r24, 0x011D
2486: 80 fd sbrc r24, 0
2488: 04 c0 rjmp .+8 ; 0x2492 <osd_ncmode_default+0x67a>
248a: 80 91 1b 01 lds r24, 0x011B
248e: 86 ff sbrs r24, 6
2490: 12 c0 rjmp .+36 ; 0x24b6 <osd_ncmode_default+0x69e>
write_char_xy(7, bottom_line - 1, 0x9F); // small A
2492: 60 91 03 01 lds r22, 0x0103
2496: 61 50 subi r22, 0x01 ; 1
2498: 87 e0 ldi r24, 0x07 ; 7
249a: 4f e9 ldi r20, 0x9F ; 159
249c: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(14, bottom_line - 1, 0xB5); // mah
24a0: 60 91 03 01 lds r22, 0x0103
24a4: 61 50 subi r22, 0x01 ; 1
24a6: 8e e0 ldi r24, 0x0E ; 14
24a8: 45 eb ldi r20, 0xB5 ; 181
24aa: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
24ae: 80 91 1b 01 lds r24, 0x011B
24b2: 85 fd sbrc r24, 5
24b4: 33 c2 rjmp .+1126 ; 0x291c <osd_ncmode_default+0xb04>
write_char_xy(21, bottom_line - 1, 0x9E); // small V
}
}
write_char_xy(14, bottom_line, 0xD1); // on clock
24b6: 8e e0 ldi r24, 0x0E ; 14
24b8: 60 91 03 01 lds r22, 0x0103
24bc: 41 ed ldi r20, 0xD1 ; 209
24be: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(21, bottom_line, 0xD2); // fly clock
24c2: 85 e1 ldi r24, 0x15 ; 21
24c4: 60 91 03 01 lds r22, 0x0103
24c8: 42 ed ldi r20, 0xD2 ; 210
24ca: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(26, bottom_line, 0xC8); // sat1
24ce: 8a e1 ldi r24, 0x1A ; 26
24d0: 60 91 03 01 lds r22, 0x0103
24d4: 48 ec ldi r20, 0xC8 ; 200
24d6: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(27, bottom_line, 0xC9); // sat2
24da: 8b e1 ldi r24, 0x1B ; 27
24dc: 60 91 03 01 lds r22, 0x0103
24e0: 49 ec ldi r20, 0xC9 ; 201
24e2: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
24e6: 80 91 1d 01 lds r24, 0x011D
24ea: 82 60 ori r24, 0x02 ; 2
24ec: 80 93 1d 01 sts 0x011D, r24
24f0: a1 cc rjmp .-1726 ; 0x1e34 <osd_ncmode_default+0x1c>
//write_number_s(16, 5, setsReceived++);
 
// remember statistics (only when engines running)
if (naviData.FCFlags & FLAG_MOTOR_RUN) {
if (COSD_FLAGS_CONFIG & COSD_FLAG_GPSHEIGHT) {
if (naviData.CurrentPosition.Altitude / 1000 - altimeter_offset > max_Altimeter) max_Altimeter = naviData.CurrentPosition.Altitude / 1000;
24f2: 60 91 a3 01 lds r22, 0x01A3
24f6: 70 91 a4 01 lds r23, 0x01A4
24fa: 80 91 a5 01 lds r24, 0x01A5
24fe: 90 91 a6 01 lds r25, 0x01A6
2502: 28 ee ldi r18, 0xE8 ; 232
2504: 33 e0 ldi r19, 0x03 ; 3
2506: 40 e0 ldi r20, 0x00 ; 0
2508: 50 e0 ldi r21, 0x00 ; 0
250a: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
250e: 30 93 20 01 sts 0x0120, r19
2512: 20 93 1f 01 sts 0x011F, r18
2516: 9f ce rjmp .-706 ; 0x2256 <osd_ncmode_default+0x43e>
draw_battery(2, bottom_line, min_voltage, naviData.UBat, max_voltage);
write_ndigit_number_u_10th(3, bottom_line, naviData.UBat, 3, 0);
if (naviData.UBat <= min_voltage && last_UBat > min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
} else if (naviData.UBat > min_voltage && last_UBat < min_voltage) {
2518: 80 91 d3 01 lds r24, 0x01D3
251c: 98 17 cp r25, r24
251e: 08 f0 brcs .+2 ; 0x2522 <osd_ncmode_default+0x70a>
2520: 35 ce rjmp .-918 ; 0x218c <osd_ncmode_default+0x374>
2522: 80 91 00 01 lds r24, 0x0100
2526: 89 17 cp r24, r25
2528: 08 f0 brcs .+2 ; 0x252c <osd_ncmode_default+0x714>
252a: 30 ce rjmp .-928 ; 0x218c <osd_ncmode_default+0x374>
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, 0);
252c: 82 e0 ldi r24, 0x02 ; 2
252e: 60 91 03 01 lds r22, 0x0103
2532: 40 e0 ldi r20, 0x00 ; 0
2534: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2538: 83 e0 ldi r24, 0x03 ; 3
253a: 60 91 03 01 lds r22, 0x0103
253e: 40 e0 ldi r20, 0x00 ; 0
2540: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2544: 84 e0 ldi r24, 0x04 ; 4
2546: 60 91 03 01 lds r22, 0x0103
254a: 40 e0 ldi r20, 0x00 ; 0
254c: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2550: 85 e0 ldi r24, 0x05 ; 5
2552: 60 91 03 01 lds r22, 0x0103
2556: 40 e0 ldi r20, 0x00 ; 0
2558: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
255c: 86 e0 ldi r24, 0x06 ; 6
255e: 60 91 03 01 lds r22, 0x0103
2562: 40 e0 ldi r20, 0x00 ; 0
2564: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2568: 87 e0 ldi r24, 0x07 ; 7
256a: 60 91 03 01 lds r22, 0x0103
256e: 40 e0 ldi r20, 0x00 ; 0
2570: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2574: 0b ce rjmp .-1002 ; 0x218c <osd_ncmode_default+0x374>
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 3, 0);
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_ndigit_number_u_10th(17, bottom_line - 1, s_volt, 3, 0);
}
} else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
2576: 16 ff sbrs r17, 6
2578: c3 cd rjmp .-1146 ; 0x2100 <osd_ncmode_default+0x2e8>
257a: a9 cd rjmp .-1198 ; 0x20ce <osd_ncmode_default+0x2b6>
}
// motors are on, assume we were/are flying
COSD_FLAGS_RUNTIME |= COSD_WASFLYING;
} else {
// stats
if ((COSD_FLAGS_RUNTIME & COSD_WASFLYING) && (COSD_FLAGS_MODES & COSD_FLAG_STATS)) {
257c: 80 91 1d 01 lds r24, 0x011D
2580: 82 fd sbrc r24, 2
2582: 41 c0 rjmp .+130 ; 0x2606 <osd_ncmode_default+0x7ee>
2584: 10 91 1b 01 lds r17, 0x011B
write_char_xy(20, line, 210); // fly clock
write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[5])))); // longitude
write_gps_pos(14, line, naviData.CurrentPosition.Longitude);
write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[6])))); // latitude
write_gps_pos(14, line, naviData.CurrentPosition.Latitude);
} else if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) { // if no stats there is space horizon
2588: 11 ff sbrs r17, 1
258a: 99 cd rjmp .-1230 ; 0x20be <osd_ncmode_default+0x2a6>
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) || (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
258c: 80 fd sbrc r24, 0
258e: 02 c0 rjmp .+4 ; 0x2594 <osd_ncmode_default+0x77c>
2590: 16 ff sbrs r17, 6
2592: 0c c2 rjmp .+1048 ; 0x29ac <osd_ncmode_default+0xb94>
draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
2594: 40 91 da 01 lds r20, 0x01DA
2598: 20 91 db 01 lds r18, 0x01DB
259c: 80 91 02 01 lds r24, 0x0102
25a0: 60 91 03 01 lds r22, 0x0103
25a4: 62 50 subi r22, 0x02 ; 2
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
25a6: 55 27 eor r21, r21
25a8: 47 fd sbrc r20, 7
25aa: 50 95 com r21
25ac: 33 27 eor r19, r19
25ae: 27 fd sbrc r18, 7
25b0: 30 95 com r19
25b2: 8e 5f subi r24, 0xFE ; 254
25b4: 0e 94 e6 08 call 0x11cc ; 0x11cc <draw_artificial_horizon>
25b8: 10 91 1b 01 lds r17, 0x011B
}
}
}
if (COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO) {
25bc: 12 ff sbrs r17, 2
25be: 81 cd rjmp .-1278 ; 0x20c2 <osd_ncmode_default+0x2aa>
draw_big_variometer(27, 8, naviData.Variometer);
25c0: 40 91 cf 01 lds r20, 0x01CF
25c4: 50 91 d0 01 lds r21, 0x01D0
25c8: 8b e1 ldi r24, 0x1B ; 27
25ca: 68 e0 ldi r22, 0x08 ; 8
25cc: 0e 94 84 0a call 0x1508 ; 0x1508 <draw_big_variometer>
25d0: 10 91 1b 01 lds r17, 0x011B
25d4: 76 cd rjmp .-1300 ; 0x20c2 <osd_ncmode_default+0x2aa>
write_ndigit_number_u(24, bottom_line, naviData.SatsInUse, 2, 0);
 
if (naviData.NCFlags & NC_FLAG_MANUAL_CONTROL) {
write_char_xy(23, bottom_line, 0xB3); // rc transmitter
} else {
write_char_xy(23, bottom_line, 0); // clear
25d6: 87 e1 ldi r24, 0x17 ; 23
25d8: 60 91 03 01 lds r22, 0x0103
25dc: 40 e0 ldi r20, 0x00 ; 0
25de: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
}
 
if (naviData.NCFlags & NC_FLAG_CH) {
25e2: 80 91 de 01 lds r24, 0x01DE
25e6: 82 ff sbrs r24, 2
25e8: fc cd rjmp .-1032 ; 0x21e2 <osd_ncmode_default+0x3ca>
write_char_xy(27, bottom_line, 231); // gps ch
25ea: 8b e1 ldi r24, 0x1B ; 27
25ec: 60 91 03 01 lds r22, 0x0103
25f0: 47 ee ldi r20, 0xE7 ; 231
25f2: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
25f6: ff cd rjmp .-1026 ; 0x21f6 <osd_ncmode_default+0x3de>
} else if (naviData.NCFlags & NC_FLAG_PH) {
write_char_xy(27, bottom_line, 230); // gps ph
} else { // (naviData.NCFlags & NC_FLAG_FREE)
write_char_xy(27, bottom_line, 201); // sat2 (free)
25f8: 8b e1 ldi r24, 0x1B ; 27
25fa: 60 91 03 01 lds r22, 0x0103
25fe: 49 ec ldi r20, 0xC9 ; 201
2600: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
2604: f8 cd rjmp .-1040 ; 0x21f6 <osd_ncmode_default+0x3de>
}
// motors are on, assume we were/are flying
COSD_FLAGS_RUNTIME |= COSD_WASFLYING;
} else {
// stats
if ((COSD_FLAGS_RUNTIME & COSD_WASFLYING) && (COSD_FLAGS_MODES & COSD_FLAG_STATS)) {
2606: 10 91 1b 01 lds r17, 0x011B
260a: 13 ff sbrs r17, 3
260c: bd cf rjmp .-134 ; 0x2588 <osd_ncmode_default+0x770>
uint8_t line = 3;
write_ascii_string_pgm(1, line, (const char *) (pgm_read_word(&(stats_item_pointers[0])))); // max Altitude
260e: e0 ee ldi r30, 0xE0 ; 224
2610: f0 e0 ldi r31, 0x00 ; 0
2612: 45 91 lpm r20, Z+
2614: 54 91 lpm r21, Z+
2616: 81 e0 ldi r24, 0x01 ; 1
2618: 63 e0 ldi r22, 0x03 ; 3
261a: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_s(16, line, max_Altimeter, 4, 0);
261e: 40 91 1f 01 lds r20, 0x011F
2622: 50 91 20 01 lds r21, 0x0120
2626: 80 e1 ldi r24, 0x10 ; 16
2628: 63 e0 ldi r22, 0x03 ; 3
262a: 24 e0 ldi r18, 0x04 ; 4
262c: 30 e0 ldi r19, 0x00 ; 0
262e: 00 e0 ldi r16, 0x00 ; 0
2630: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
write_char_xy(20, line, 204); // small meters m
2634: 84 e1 ldi r24, 0x14 ; 20
2636: 63 e0 ldi r22, 0x03 ; 3
2638: 4c ec ldi r20, 0xCC ; 204
263a: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[1])))); // max Speed
263e: e2 ee ldi r30, 0xE2 ; 226
2640: f0 e0 ldi r31, 0x00 ; 0
2642: 45 91 lpm r20, Z+
2644: 54 91 lpm r21, Z+
2646: 81 e0 ldi r24, 0x01 ; 1
2648: 64 e0 ldi r22, 0x04 ; 4
264a: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_u(17, line, (uint16_t) (((uint32_t) max_GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
264e: 20 91 21 01 lds r18, 0x0121
2652: 30 91 22 01 lds r19, 0x0122
2656: 40 e0 ldi r20, 0x00 ; 0
2658: 50 e0 ldi r21, 0x00 ; 0
265a: ca 01 movw r24, r20
265c: b9 01 movw r22, r18
265e: 66 0f add r22, r22
2660: 77 1f adc r23, r23
2662: 88 1f adc r24, r24
2664: 99 1f adc r25, r25
2666: 66 0f add r22, r22
2668: 77 1f adc r23, r23
266a: 88 1f adc r24, r24
266c: 99 1f adc r25, r25
266e: 66 0f add r22, r22
2670: 77 1f adc r23, r23
2672: 88 1f adc r24, r24
2674: 99 1f adc r25, r25
2676: 62 0f add r22, r18
2678: 73 1f adc r23, r19
267a: 84 1f adc r24, r20
267c: 95 1f adc r25, r21
267e: 2a ef ldi r18, 0xFA ; 250
2680: 30 e0 ldi r19, 0x00 ; 0
2682: 40 e0 ldi r20, 0x00 ; 0
2684: 50 e0 ldi r21, 0x00 ; 0
2686: 0e 94 8f 1c call 0x391e ; 0x391e <__udivmodsi4>
268a: 81 e1 ldi r24, 0x11 ; 17
268c: 64 e0 ldi r22, 0x04 ; 4
268e: a9 01 movw r20, r18
2690: 23 e0 ldi r18, 0x03 ; 3
2692: 30 e0 ldi r19, 0x00 ; 0
2694: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_char_xy(20, line, 203); // km/h
2698: 84 e1 ldi r24, 0x14 ; 20
269a: 64 e0 ldi r22, 0x04 ; 4
269c: 4b ec ldi r20, 0xCB ; 203
269e: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[2])))); // max Distance
26a2: e4 ee ldi r30, 0xE4 ; 228
26a4: f0 e0 ldi r31, 0x00 ; 0
26a6: 45 91 lpm r20, Z+
26a8: 54 91 lpm r21, Z+
26aa: 81 e0 ldi r24, 0x01 ; 1
26ac: 65 e0 ldi r22, 0x05 ; 5
26ae: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_u(17, line, max_Distance / 10, 3, 0);
26b2: 80 91 23 01 lds r24, 0x0123
26b6: 90 91 24 01 lds r25, 0x0124
26ba: 6a e0 ldi r22, 0x0A ; 10
26bc: 70 e0 ldi r23, 0x00 ; 0
26be: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
26c2: ab 01 movw r20, r22
26c4: 81 e1 ldi r24, 0x11 ; 17
26c6: 65 e0 ldi r22, 0x05 ; 5
26c8: 23 e0 ldi r18, 0x03 ; 3
26ca: 30 e0 ldi r19, 0x00 ; 0
26cc: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_char_xy(20, line, 204); // small meters m
26d0: 84 e1 ldi r24, 0x14 ; 20
26d2: 65 e0 ldi r22, 0x05 ; 5
26d4: 4c ec ldi r20, 0xCC ; 204
26d6: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[3])))); // min voltage
26da: e6 ee ldi r30, 0xE6 ; 230
26dc: f0 e0 ldi r31, 0x00 ; 0
26de: 45 91 lpm r20, Z+
26e0: 54 91 lpm r21, Z+
26e2: 81 e0 ldi r24, 0x01 ; 1
26e4: 66 e0 ldi r22, 0x06 ; 6
26e6: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_u_10th(16, line, min_UBat, 3, 0);
26ea: 40 91 04 01 lds r20, 0x0104
26ee: 80 e1 ldi r24, 0x10 ; 16
26f0: 66 e0 ldi r22, 0x06 ; 6
26f2: 50 e0 ldi r21, 0x00 ; 0
26f4: 23 e0 ldi r18, 0x03 ; 3
26f6: 30 e0 ldi r19, 0x00 ; 0
26f8: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
write_char_xy(20, line, 0x9E); // small V
26fc: 84 e1 ldi r24, 0x14 ; 20
26fe: 66 e0 ldi r22, 0x06 ; 6
2700: 4e e9 ldi r20, 0x9E ; 158
2702: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) || (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
2706: 80 91 1d 01 lds r24, 0x011D
270a: 80 fd sbrc r24, 0
270c: 0f c1 rjmp .+542 ; 0x292c <osd_ncmode_default+0xb14>
270e: 80 91 1b 01 lds r24, 0x011B
2712: 86 fd sbrc r24, 6
2714: 0b c1 rjmp .+534 ; 0x292c <osd_ncmode_default+0xb14>
2716: 17 e0 ldi r17, 0x07 ; 7
2718: 08 e0 ldi r16, 0x08 ; 8
271a: f9 e0 ldi r31, 0x09 ; 9
271c: ff 2e mov r15, r31
write_ndigit_number_u(21, line, naviData.UsedCapacity - wasted_ampere_offset, 5, 0);
}
write_char_xy(26, line, 0xB5); // mah
}
write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[4])))); // max time
271e: e8 ee ldi r30, 0xE8 ; 232
2720: f0 e0 ldi r31, 0x00 ; 0
2722: 45 91 lpm r20, Z+
2724: 54 91 lpm r21, Z+
2726: 81 e0 ldi r24, 0x01 ; 1
2728: 61 2f mov r22, r17
272a: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_time(14, line, max_FlyingTime);
272e: 40 91 25 01 lds r20, 0x0125
2732: 50 91 26 01 lds r21, 0x0126
2736: 8e e0 ldi r24, 0x0E ; 14
2738: 61 2f mov r22, r17
273a: 0e 94 3a 08 call 0x1074 ; 0x1074 <write_time>
write_char_xy(20, line, 210); // fly clock
273e: 84 e1 ldi r24, 0x14 ; 20
2740: 61 2f mov r22, r17
2742: 42 ed ldi r20, 0xD2 ; 210
2744: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[5])))); // longitude
2748: ea ee ldi r30, 0xEA ; 234
274a: f0 e0 ldi r31, 0x00 ; 0
274c: 45 91 lpm r20, Z+
274e: 54 91 lpm r21, Z+
2750: 81 e0 ldi r24, 0x01 ; 1
2752: 60 2f mov r22, r16
2754: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_gps_pos(14, line, naviData.CurrentPosition.Longitude);
2758: 20 91 9b 01 lds r18, 0x019B
275c: 30 91 9c 01 lds r19, 0x019C
2760: 40 91 9d 01 lds r20, 0x019D
2764: 50 91 9e 01 lds r21, 0x019E
2768: 8e e0 ldi r24, 0x0E ; 14
276a: 60 2f mov r22, r16
276c: 0e 94 bd 07 call 0xf7a ; 0xf7a <write_gps_pos>
write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[6])))); // latitude
2770: ec ee ldi r30, 0xEC ; 236
2772: f0 e0 ldi r31, 0x00 ; 0
2774: 45 91 lpm r20, Z+
2776: 54 91 lpm r21, Z+
2778: 81 e0 ldi r24, 0x01 ; 1
277a: 6f 2d mov r22, r15
277c: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_gps_pos(14, line, naviData.CurrentPosition.Latitude);
2780: 20 91 9f 01 lds r18, 0x019F
2784: 30 91 a0 01 lds r19, 0x01A0
2788: 40 91 a1 01 lds r20, 0x01A1
278c: 50 91 a2 01 lds r21, 0x01A2
2790: 8e e0 ldi r24, 0x0E ; 14
2792: 6f 2d mov r22, r15
2794: 0e 94 bd 07 call 0xf7a ; 0xf7a <write_gps_pos>
2798: 10 91 1b 01 lds r17, 0x011B
279c: 90 cc rjmp .-1760 ; 0x20be <osd_ncmode_default+0x2a6>
write_ndigit_number_u(24, top_line + 1, naviData.HomePositionDeviation.Distance / 10, 3, 0);
// center
if (naviData.FCFlags & FLAG_MOTOR_RUN) { // should be engines running
if (!(old_MKFlags & FLAG_MOTOR_RUN)) { // motors just started, clear middle
clear();
279e: 0e 94 75 08 call 0x10ea ; 0x10ea <clear>
// remember current heigth for gps offset
altimeter_offset = naviData.CurrentPosition.Altitude / 1000;
27a2: 60 91 a3 01 lds r22, 0x01A3
27a6: 70 91 a4 01 lds r23, 0x01A4
27aa: 80 91 a5 01 lds r24, 0x01A5
27ae: 90 91 a6 01 lds r25, 0x01A6
27b2: 28 ee ldi r18, 0xE8 ; 232
27b4: 33 e0 ldi r19, 0x03 ; 3
27b6: 40 e0 ldi r20, 0x00 ; 0
27b8: 50 e0 ldi r21, 0x00 ; 0
27ba: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
27be: 30 93 99 01 sts 0x0199, r19
27c2: 20 93 98 01 sts 0x0198, r18
// set wasted counter to current offset
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
27c6: 00 91 1d 01 lds r16, 0x011D
27ca: 00 ff sbrs r16, 0
27cc: 9a c0 rjmp .+308 ; 0x2902 <osd_ncmode_default+0xaea>
27ce: 10 91 1b 01 lds r17, 0x011B
27d2: 16 fd sbrc r17, 6
27d4: 9a c0 rjmp .+308 ; 0x290a <osd_ncmode_default+0xaf2>
wasted_ampere_offset = ampere_wasted / 10;
27d6: 60 91 3b 01 lds r22, 0x013B
27da: 70 91 3c 01 lds r23, 0x013C
27de: 80 91 3d 01 lds r24, 0x013D
27e2: 90 91 3e 01 lds r25, 0x013E
27e6: 2a e0 ldi r18, 0x0A ; 10
27e8: 30 e0 ldi r19, 0x00 ; 0
27ea: 40 e0 ldi r20, 0x00 ; 0
27ec: 50 e0 ldi r21, 0x00 ; 0
27ee: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
27f2: 30 93 48 01 sts 0x0148, r19
27f6: 20 93 47 01 sts 0x0147, r18
} else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
wasted_ampere_offset = naviData.UsedCapacity;
}
// update flags to paint display again if needed
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
27fa: 0d 7f andi r16, 0xFD ; 253
27fc: 00 93 1d 01 sts 0x011D, r16
2800: 41 cc rjmp .-1918 ; 0x2084 <osd_ncmode_default+0x26c>
}
 
// pre-bottom line
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
//write_ndigit_number_s(3, bottom_line - 1, ampere, 4, 0);
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 3, 0);
2802: 20 91 03 01 lds r18, 0x0103
2806: 21 50 subi r18, 0x01 ; 1
2808: 80 91 37 01 lds r24, 0x0137
280c: 90 91 38 01 lds r25, 0x0138
2810: 6a e0 ldi r22, 0x0A ; 10
2812: 70 e0 ldi r23, 0x00 ; 0
2814: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
2818: ab 01 movw r20, r22
281a: 83 e0 ldi r24, 0x03 ; 3
281c: 62 2f mov r22, r18
281e: 23 e0 ldi r18, 0x03 ; 3
2820: 30 e0 ldi r19, 0x00 ; 0
2822: 00 e0 ldi r16, 0x00 ; 0
2824: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
2828: 10 91 03 01 lds r17, 0x0103
282c: 11 50 subi r17, 0x01 ; 1
282e: 60 91 3b 01 lds r22, 0x013B
2832: 70 91 3c 01 lds r23, 0x013C
2836: 80 91 3d 01 lds r24, 0x013D
283a: 90 91 3e 01 lds r25, 0x013E
283e: 2a e0 ldi r18, 0x0A ; 10
2840: 30 e0 ldi r19, 0x00 ; 0
2842: 40 e0 ldi r20, 0x00 ; 0
2844: 50 e0 ldi r21, 0x00 ; 0
2846: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
284a: 8a e0 ldi r24, 0x0A ; 10
284c: 61 2f mov r22, r17
284e: a9 01 movw r20, r18
2850: 24 e0 ldi r18, 0x04 ; 4
2852: 30 e0 ldi r19, 0x00 ; 0
2854: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
2858: 80 91 1b 01 lds r24, 0x011B
285c: 85 ff sbrs r24, 5
285e: 50 cc rjmp .-1888 ; 0x2100 <osd_ncmode_default+0x2e8>
write_ndigit_number_u_10th(17, bottom_line - 1, s_volt, 3, 0);
2860: 60 91 03 01 lds r22, 0x0103
2864: 61 50 subi r22, 0x01 ; 1
2866: 40 91 9f 02 lds r20, 0x029F
286a: 50 91 a0 02 lds r21, 0x02A0
286e: 81 e1 ldi r24, 0x11 ; 17
2870: 23 e0 ldi r18, 0x03 ; 3
2872: 30 e0 ldi r19, 0x00 ; 0
2874: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
2878: 43 cc rjmp .-1914 ; 0x2100 <osd_ncmode_default+0x2e8>
}
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
287a: 40 91 da 01 lds r20, 0x01DA
287e: 20 91 db 01 lds r18, 0x01DB
2882: 80 91 02 01 lds r24, 0x0102
2886: 60 91 03 01 lds r22, 0x0103
288a: 61 50 subi r22, 0x01 ; 1
288c: 08 cc rjmp .-2032 ; 0x209e <osd_ncmode_default+0x286>
if (naviData.CurrentPosition.Altitude / 1000 - altimeter_offset > 10 || naviData.CurrentPosition.Altitude / 1000 - altimeter_offset < -10) {
// above 10m only write full meters
write_ndigit_number_s(23, top_line, (int16_t) (naviData.CurrentPosition.Altitude / 1000 - altimeter_offset), 4, 0); // GPS
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(23, top_line, (int16_t) (naviData.CurrentPosition.Altitude / 100 - altimeter_offset * 10), 3, 0); // GPS
288e: 60 91 a3 01 lds r22, 0x01A3
2892: 70 91 a4 01 lds r23, 0x01A4
2896: 80 91 a5 01 lds r24, 0x01A5
289a: 90 91 a6 01 lds r25, 0x01A6
289e: 8e 01 movw r16, r28
28a0: 00 0f add r16, r16
28a2: 11 1f adc r17, r17
28a4: 00 0f add r16, r16
28a6: 11 1f adc r17, r17
28a8: 00 0f add r16, r16
28aa: 11 1f adc r17, r17
28ac: cc 0f add r28, r28
28ae: dd 1f adc r29, r29
28b0: 0c 0f add r16, r28
28b2: 1d 1f adc r17, r29
28b4: 10 95 com r17
28b6: 01 95 neg r16
28b8: 1f 4f sbci r17, 0xFF ; 255
28ba: 24 e6 ldi r18, 0x64 ; 100
28bc: 30 e0 ldi r19, 0x00 ; 0
28be: 40 e0 ldi r20, 0x00 ; 0
28c0: 50 e0 ldi r21, 0x00 ; 0
28c2: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
28c6: 02 0f add r16, r18
28c8: 13 1f adc r17, r19
28ca: 87 e1 ldi r24, 0x17 ; 23
28cc: 60 91 02 01 lds r22, 0x0102
28d0: a8 01 movw r20, r16
28d2: 23 e0 ldi r18, 0x03 ; 3
28d4: 30 e0 ldi r19, 0x00 ; 0
28d6: 00 e0 ldi r16, 0x00 ; 0
28d8: 0e 94 d3 05 call 0xba6 ; 0xba6 <write_ndigit_number_s_10th>
28dc: 8f cb rjmp .-2274 ; 0x1ffc <osd_ncmode_default+0x1e4>
if (naviData.Altimeter > 300 || naviData.Altimeter < -300) {
// above 10m only write full meters
write_ndigit_number_s(23, top_line, naviData.Altimeter / 30, 4, 0); // BARO
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(23, top_line, naviData.Altimeter / 3, 3, 0); // BARO
28de: 80 91 cd 01 lds r24, 0x01CD
28e2: 90 91 ce 01 lds r25, 0x01CE
28e6: 63 e0 ldi r22, 0x03 ; 3
28e8: 70 e0 ldi r23, 0x00 ; 0
28ea: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
28ee: ab 01 movw r20, r22
28f0: 87 e1 ldi r24, 0x17 ; 23
28f2: 60 91 02 01 lds r22, 0x0102
28f6: 23 e0 ldi r18, 0x03 ; 3
28f8: 30 e0 ldi r19, 0x00 ; 0
28fa: 00 e0 ldi r16, 0x00 ; 0
28fc: 0e 94 d3 05 call 0xba6 ; 0xba6 <write_ndigit_number_s_10th>
2900: 7d cb rjmp .-2310 ; 0x1ffc <osd_ncmode_default+0x1e4>
// remember current heigth for gps offset
altimeter_offset = naviData.CurrentPosition.Altitude / 1000;
// set wasted counter to current offset
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
wasted_ampere_offset = ampere_wasted / 10;
} else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
2902: 10 91 1b 01 lds r17, 0x011B
2906: 16 ff sbrs r17, 6
2908: 78 cf rjmp .-272 ; 0x27fa <osd_ncmode_default+0x9e2>
wasted_ampere_offset = naviData.UsedCapacity;
290a: 80 91 ea 01 lds r24, 0x01EA
290e: 90 91 eb 01 lds r25, 0x01EB
2912: 90 93 48 01 sts 0x0148, r25
2916: 80 93 47 01 sts 0x0147, r24
291a: 6f cf rjmp .-290 ; 0x27fa <osd_ncmode_default+0x9e2>
write_char_xy(7, bottom_line, 0x9E); // small V
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) || (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
write_char_xy(7, bottom_line - 1, 0x9F); // small A
write_char_xy(14, bottom_line - 1, 0xB5); // mah
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_char_xy(21, bottom_line - 1, 0x9E); // small V
291c: 60 91 03 01 lds r22, 0x0103
2920: 61 50 subi r22, 0x01 ; 1
2922: 85 e1 ldi r24, 0x15 ; 21
2924: 4e e9 ldi r20, 0x9E ; 158
2926: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
292a: c5 cd rjmp .-1142 ; 0x24b6 <osd_ncmode_default+0x69e>
write_char_xy(20, line, 204); // small meters m
write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[3])))); // min voltage
write_ndigit_number_u_10th(16, line, min_UBat, 3, 0);
write_char_xy(20, line, 0x9E); // small V
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) || (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
write_ascii_string_pgm(1, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[7])))); // ampere
292c: ee ee ldi r30, 0xEE ; 238
292e: f0 e0 ldi r31, 0x00 ; 0
2930: 45 91 lpm r20, Z+
2932: 54 91 lpm r21, Z+
2934: 81 e0 ldi r24, 0x01 ; 1
2936: 67 e0 ldi r22, 0x07 ; 7
2938: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_u_10th(16, line, max_ampere / 10, 3, 0);
293c: 80 91 39 01 lds r24, 0x0139
2940: 90 91 3a 01 lds r25, 0x013A
2944: 6a e0 ldi r22, 0x0A ; 10
2946: 70 e0 ldi r23, 0x00 ; 0
2948: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
294c: ab 01 movw r20, r22
294e: 80 e1 ldi r24, 0x10 ; 16
2950: 67 e0 ldi r22, 0x07 ; 7
2952: 23 e0 ldi r18, 0x03 ; 3
2954: 30 e0 ldi r19, 0x00 ; 0
2956: 00 e0 ldi r16, 0x00 ; 0
2958: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
write_char_xy(20, line, 0x9F); // small A
295c: 84 e1 ldi r24, 0x14 ; 20
295e: 67 e0 ldi r22, 0x07 ; 7
2960: 4f e9 ldi r20, 0x9F ; 159
2962: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
// wasted mampere in this flight (will count up after landing)
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
2966: 80 91 1d 01 lds r24, 0x011D
296a: 80 ff sbrs r24, 0
296c: 29 c0 rjmp .+82 ; 0x29c0 <osd_ncmode_default+0xba8>
296e: 80 91 1b 01 lds r24, 0x011B
2972: 86 ff sbrs r24, 6
2974: 2a c0 rjmp .+84 ; 0x29ca <osd_ncmode_default+0xbb2>
write_ndigit_number_u(21, line, (ampere_wasted / 10) - wasted_ampere_offset, 5, 0);
} else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
write_ndigit_number_u(21, line, naviData.UsedCapacity - wasted_ampere_offset, 5, 0);
2976: 40 91 ea 01 lds r20, 0x01EA
297a: 50 91 eb 01 lds r21, 0x01EB
297e: 80 91 47 01 lds r24, 0x0147
2982: 90 91 48 01 lds r25, 0x0148
2986: 48 1b sub r20, r24
2988: 59 0b sbc r21, r25
298a: 85 e1 ldi r24, 0x15 ; 21
298c: 67 e0 ldi r22, 0x07 ; 7
298e: 25 e0 ldi r18, 0x05 ; 5
2990: 30 e0 ldi r19, 0x00 ; 0
2992: 00 e0 ldi r16, 0x00 ; 0
2994: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
}
write_char_xy(26, line, 0xB5); // mah
2998: 8a e1 ldi r24, 0x1A ; 26
299a: 67 e0 ldi r22, 0x07 ; 7
299c: 45 eb ldi r20, 0xB5 ; 181
299e: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
29a2: 18 e0 ldi r17, 0x08 ; 8
29a4: 09 e0 ldi r16, 0x09 ; 9
29a6: ea e0 ldi r30, 0x0A ; 10
29a8: fe 2e mov r15, r30
29aa: b9 ce rjmp .-654 ; 0x271e <osd_ncmode_default+0x906>
write_gps_pos(14, line, naviData.CurrentPosition.Latitude);
} else if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) { // if no stats there is space horizon
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) || (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
29ac: 40 91 da 01 lds r20, 0x01DA
29b0: 20 91 db 01 lds r18, 0x01DB
29b4: 80 91 02 01 lds r24, 0x0102
29b8: 60 91 03 01 lds r22, 0x0103
29bc: 61 50 subi r22, 0x01 ; 1
29be: f3 cd rjmp .-1050 ; 0x25a6 <osd_ncmode_default+0x78e>
write_char_xy(20, line, 0x9F); // small A
// wasted mampere in this flight (will count up after landing)
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
write_ndigit_number_u(21, line, (ampere_wasted / 10) - wasted_ampere_offset, 5, 0);
} else if (COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT) {
29c0: 80 91 1b 01 lds r24, 0x011B
29c4: 86 ff sbrs r24, 6
29c6: e8 cf rjmp .-48 ; 0x2998 <osd_ncmode_default+0xb80>
29c8: d6 cf rjmp .-84 ; 0x2976 <osd_ncmode_default+0xb5e>
write_ndigit_number_u_10th(16, line, max_ampere / 10, 3, 0);
write_char_xy(20, line, 0x9F); // small A
// wasted mampere in this flight (will count up after landing)
if ((COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) && !(COSD_FLAGS_MODES & COSD_FLAG_FCCURRENT)) {
write_ndigit_number_u(21, line, (ampere_wasted / 10) - wasted_ampere_offset, 5, 0);
29ca: 00 91 47 01 lds r16, 0x0147
29ce: 10 91 48 01 lds r17, 0x0148
29d2: 60 91 3b 01 lds r22, 0x013B
29d6: 70 91 3c 01 lds r23, 0x013C
29da: 80 91 3d 01 lds r24, 0x013D
29de: 90 91 3e 01 lds r25, 0x013E
29e2: 2a e0 ldi r18, 0x0A ; 10
29e4: 30 e0 ldi r19, 0x00 ; 0
29e6: 40 e0 ldi r20, 0x00 ; 0
29e8: 50 e0 ldi r21, 0x00 ; 0
29ea: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
29ee: 20 1b sub r18, r16
29f0: 31 0b sbc r19, r17
29f2: 85 e1 ldi r24, 0x15 ; 21
29f4: 67 e0 ldi r22, 0x07 ; 7
29f6: a9 01 movw r20, r18
29f8: 25 e0 ldi r18, 0x05 ; 5
29fa: 30 e0 ldi r19, 0x00 ; 0
29fc: 00 e0 ldi r16, 0x00 ; 0
29fe: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
2a02: ca cf rjmp .-108 ; 0x2998 <osd_ncmode_default+0xb80>
 
00002a04 <osd_ncmode_minimal>:
#include "osd_helpers.h"
#include "osd_ncmode_default.h"
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
int osd_ncmode_minimal() {
2a04: ff 92 push r15
2a06: 0f 93 push r16
2a08: 1f 93 push r17
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
2a0a: 80 91 1b 01 lds r24, 0x011B
2a0e: 80 ff sbrs r24, 0
2a10: 15 c1 rjmp .+554 ; 0x2c3c <osd_ncmode_minimal+0x238>
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
2a12: 80 91 1d 01 lds r24, 0x011D
2a16: 81 ff sbrs r24, 1
2a18: e8 c1 rjmp .+976 ; 0x2dea <osd_ncmode_minimal+0x3e6>
write_char_xy(27, bottom_line, 0xC9); // sat2
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
// first line
write_ndigit_number_u(1, top_line, (uint16_t) (((uint32_t) naviData.GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
2a1a: 20 91 d4 01 lds r18, 0x01D4
2a1e: 30 91 d5 01 lds r19, 0x01D5
2a22: 40 e0 ldi r20, 0x00 ; 0
2a24: 50 e0 ldi r21, 0x00 ; 0
2a26: ca 01 movw r24, r20
2a28: b9 01 movw r22, r18
2a2a: 66 0f add r22, r22
2a2c: 77 1f adc r23, r23
2a2e: 88 1f adc r24, r24
2a30: 99 1f adc r25, r25
2a32: 66 0f add r22, r22
2a34: 77 1f adc r23, r23
2a36: 88 1f adc r24, r24
2a38: 99 1f adc r25, r25
2a3a: 66 0f add r22, r22
2a3c: 77 1f adc r23, r23
2a3e: 88 1f adc r24, r24
2a40: 99 1f adc r25, r25
2a42: 62 0f add r22, r18
2a44: 73 1f adc r23, r19
2a46: 84 1f adc r24, r20
2a48: 95 1f adc r25, r21
2a4a: 2a ef ldi r18, 0xFA ; 250
2a4c: 30 e0 ldi r19, 0x00 ; 0
2a4e: 40 e0 ldi r20, 0x00 ; 0
2a50: 50 e0 ldi r21, 0x00 ; 0
2a52: 0e 94 8f 1c call 0x391e ; 0x391e <__udivmodsi4>
2a56: 81 e0 ldi r24, 0x01 ; 1
2a58: 60 91 02 01 lds r22, 0x0102
2a5c: a9 01 movw r20, r18
2a5e: 23 e0 ldi r18, 0x03 ; 3
2a60: 30 e0 ldi r19, 0x00 ; 0
2a62: 00 e0 ldi r16, 0x00 ; 0
2a64: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
 
write_ndigit_number_u(12, top_line, naviData.HomePositionDeviation.Distance / 10, 3, 0);
2a68: 80 91 c6 01 lds r24, 0x01C6
2a6c: 90 91 c7 01 lds r25, 0x01C7
2a70: 6a e0 ldi r22, 0x0A ; 10
2a72: 70 e0 ldi r23, 0x00 ; 0
2a74: 0e 94 68 1c call 0x38d0 ; 0x38d0 <__udivmodhi4>
2a78: ab 01 movw r20, r22
2a7a: 8c e0 ldi r24, 0x0C ; 12
2a7c: 60 91 02 01 lds r22, 0x0102
2a80: 23 e0 ldi r18, 0x03 ; 3
2a82: 30 e0 ldi r19, 0x00 ; 0
2a84: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
 
uint16_t heading_home = (naviData.HomePositionDeviation.Bearing + 360 - naviData.CompassHeading) % 360;
2a88: 80 91 c8 01 lds r24, 0x01C8
2a8c: 90 91 c9 01 lds r25, 0x01C9
2a90: 20 91 d8 01 lds r18, 0x01D8
2a94: 30 91 d9 01 lds r19, 0x01D9
write_char_xy(17, top_line, 0xa0 + heading_fine_conv(heading_home));
2a98: 10 91 02 01 lds r17, 0x0102
2a9c: 88 59 subi r24, 0x98 ; 152
2a9e: 9e 4f sbci r25, 0xFE ; 254
2aa0: 82 1b sub r24, r18
2aa2: 93 0b sbc r25, r19
2aa4: 68 e6 ldi r22, 0x68 ; 104
2aa6: 71 e0 ldi r23, 0x01 ; 1
2aa8: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
2aac: 0e 94 cf 08 call 0x119e ; 0x119e <heading_fine_conv>
2ab0: 48 2f mov r20, r24
2ab2: 40 56 subi r20, 0x60 ; 96
2ab4: 81 e1 ldi r24, 0x11 ; 17
2ab6: 61 2f mov r22, r17
2ab8: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
 
if (naviData.Altimeter > 300 || naviData.Altimeter < -300) {
2abc: 80 91 cd 01 lds r24, 0x01CD
2ac0: 90 91 ce 01 lds r25, 0x01CE
2ac4: 8d 52 subi r24, 0x2D ; 45
2ac6: 91 40 sbci r25, 0x01 ; 1
2ac8: 44 f4 brge .+16 ; 0x2ada <osd_ncmode_minimal+0xd6>
2aca: 80 91 cd 01 lds r24, 0x01CD
2ace: 90 91 ce 01 lds r25, 0x01CE
2ad2: 84 5d subi r24, 0xD4 ; 212
2ad4: 9e 4f sbci r25, 0xFE ; 254
2ad6: 0c f0 brlt .+2 ; 0x2ada <osd_ncmode_minimal+0xd6>
2ad8: 0c c2 rjmp .+1048 ; 0x2ef2 <osd_ncmode_minimal+0x4ee>
// above 10m only write full meters
write_ndigit_number_s(22, top_line, naviData.Altimeter / 30, 4, 0);
2ada: 80 91 cd 01 lds r24, 0x01CD
2ade: 90 91 ce 01 lds r25, 0x01CE
2ae2: 6e e1 ldi r22, 0x1E ; 30
2ae4: 70 e0 ldi r23, 0x00 ; 0
2ae6: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
2aea: ab 01 movw r20, r22
2aec: 86 e1 ldi r24, 0x16 ; 22
2aee: 60 91 02 01 lds r22, 0x0102
2af2: 24 e0 ldi r18, 0x04 ; 4
2af4: 30 e0 ldi r19, 0x00 ; 0
2af6: 00 e0 ldi r16, 0x00 ; 0
2af8: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(22, top_line, naviData.Altimeter / 3, 3, 0);
}
 
draw_variometer(27, top_line, naviData.Variometer);
2afc: 40 91 cf 01 lds r20, 0x01CF
2b00: 50 91 d0 01 lds r21, 0x01D0
2b04: 8b e1 ldi r24, 0x1B ; 27
2b06: 60 91 02 01 lds r22, 0x0102
2b0a: 0e 94 c1 09 call 0x1382 ; 0x1382 <draw_variometer>
 
 
// center
if (naviData.FCFlags & FLAG_MOTOR_RUN) { // should be engines running
2b0e: 80 91 dd 01 lds r24, 0x01DD
2b12: 80 ff sbrs r24, 0
2b14: 10 c1 rjmp .+544 ; 0x2d36 <osd_ncmode_minimal+0x332>
if (!(old_MKFlags & FLAG_MOTOR_RUN)) { // motors just started, clear middle
2b16: 80 91 27 01 lds r24, 0x0127
2b1a: 80 ff sbrs r24, 0
2b1c: a5 c1 rjmp .+842 ; 0x2e68 <osd_ncmode_minimal+0x464>
2b1e: 80 91 1d 01 lds r24, 0x011D
clear();
// update flags to paint display again if needed
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
}
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
2b22: 90 91 1b 01 lds r25, 0x011B
2b26: 91 ff sbrs r25, 1
2b28: 18 c0 rjmp .+48 ; 0x2b5a <osd_ncmode_minimal+0x156>
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
2b2a: 80 ff sbrs r24, 0
2b2c: f4 c1 rjmp .+1000 ; 0x2f16 <osd_ncmode_minimal+0x512>
draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
2b2e: 40 91 da 01 lds r20, 0x01DA
2b32: 20 91 db 01 lds r18, 0x01DB
2b36: 80 91 02 01 lds r24, 0x0102
2b3a: 60 91 03 01 lds r22, 0x0103
2b3e: 62 50 subi r22, 0x02 ; 2
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
2b40: 55 27 eor r21, r21
2b42: 47 fd sbrc r20, 7
2b44: 50 95 com r21
2b46: 33 27 eor r19, r19
2b48: 27 fd sbrc r18, 7
2b4a: 30 95 com r19
2b4c: 8e 5f subi r24, 0xFE ; 254
2b4e: 0e 94 e6 08 call 0x11cc ; 0x11cc <draw_artificial_horizon>
2b52: 90 91 1b 01 lds r25, 0x011B
2b56: 80 91 1d 01 lds r24, 0x011D
}
}
// motors are on, assume we were/are flying
COSD_FLAGS_RUNTIME |= COSD_WASFLYING;
2b5a: 84 60 ori r24, 0x04 ; 4
2b5c: 80 93 1d 01 sts 0x011D, r24
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
}
}
}
if (COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO) {
2b60: 92 fd sbrc r25, 2
2b62: 0b c1 rjmp .+534 ; 0x2d7a <osd_ncmode_minimal+0x376>
draw_big_variometer(27, 8, naviData.Variometer);
}
 
// pre-bottom line
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
2b64: 80 91 1d 01 lds r24, 0x011D
2b68: 80 fd sbrc r24, 0
2b6a: 13 c1 rjmp .+550 ; 0x2d92 <osd_ncmode_minimal+0x38e>
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 3, 0);
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
}
 
// bottom line
draw_battery(2, bottom_line, min_voltage, naviData.UBat, max_voltage);
2b6c: 20 91 d3 01 lds r18, 0x01D3
2b70: 82 e0 ldi r24, 0x02 ; 2
2b72: 60 91 03 01 lds r22, 0x0103
2b76: 40 91 19 01 lds r20, 0x0119
2b7a: 00 91 1a 01 lds r16, 0x011A
2b7e: 0e 94 17 0a call 0x142e ; 0x142e <draw_battery>
write_ndigit_number_u_10th(3, bottom_line, naviData.UBat, 3, 0);
2b82: 40 91 d3 01 lds r20, 0x01D3
2b86: 83 e0 ldi r24, 0x03 ; 3
2b88: 60 91 03 01 lds r22, 0x0103
2b8c: 50 e0 ldi r21, 0x00 ; 0
2b8e: 23 e0 ldi r18, 0x03 ; 3
2b90: 30 e0 ldi r19, 0x00 ; 0
2b92: 00 e0 ldi r16, 0x00 ; 0
2b94: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
if (naviData.UBat <= min_voltage && last_UBat > min_voltage) {
2b98: 80 91 d3 01 lds r24, 0x01D3
2b9c: 90 91 19 01 lds r25, 0x0119
2ba0: 98 17 cp r25, r24
2ba2: 08 f4 brcc .+2 ; 0x2ba6 <osd_ncmode_minimal+0x1a2>
2ba4: 69 c1 rjmp .+722 ; 0x2e78 <osd_ncmode_minimal+0x474>
2ba6: 80 91 00 01 lds r24, 0x0100
2baa: 98 17 cp r25, r24
2bac: 08 f0 brcs .+2 ; 0x2bb0 <osd_ncmode_minimal+0x1ac>
2bae: 64 c1 rjmp .+712 ; 0x2e78 <osd_ncmode_minimal+0x474>
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
2bb0: 82 e0 ldi r24, 0x02 ; 2
2bb2: 60 91 03 01 lds r22, 0x0103
2bb6: 4f e4 ldi r20, 0x4F ; 79
2bb8: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2bbc: 83 e0 ldi r24, 0x03 ; 3
2bbe: 60 91 03 01 lds r22, 0x0103
2bc2: 4f e4 ldi r20, 0x4F ; 79
2bc4: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2bc8: 84 e0 ldi r24, 0x04 ; 4
2bca: 60 91 03 01 lds r22, 0x0103
2bce: 4f e4 ldi r20, 0x4F ; 79
2bd0: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2bd4: 85 e0 ldi r24, 0x05 ; 5
2bd6: 60 91 03 01 lds r22, 0x0103
2bda: 4f e4 ldi r20, 0x4F ; 79
2bdc: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2be0: 86 e0 ldi r24, 0x06 ; 6
2be2: 60 91 03 01 lds r22, 0x0103
2be6: 4f e4 ldi r20, 0x4F ; 79
2be8: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2bec: 87 e0 ldi r24, 0x07 ; 7
2bee: 60 91 03 01 lds r22, 0x0103
2bf2: 4f e4 ldi r20, 0x4F ; 79
2bf4: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
} else if (naviData.UBat > min_voltage && last_UBat < min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, 0);
}
 
write_time(11, bottom_line, naviData.FlyingTime);
2bf8: 40 91 d1 01 lds r20, 0x01D1
2bfc: 50 91 d2 01 lds r21, 0x01D2
2c00: 8b e0 ldi r24, 0x0B ; 11
2c02: 60 91 03 01 lds r22, 0x0103
2c06: 0e 94 3a 08 call 0x1074 ; 0x1074 <write_time>
 
write_ndigit_number_u(24, bottom_line, naviData.SatsInUse, 2, 0);
2c0a: 40 91 cc 01 lds r20, 0x01CC
2c0e: 88 e1 ldi r24, 0x18 ; 24
2c10: 60 91 03 01 lds r22, 0x0103
2c14: 50 e0 ldi r21, 0x00 ; 0
2c16: 22 e0 ldi r18, 0x02 ; 2
2c18: 30 e0 ldi r19, 0x00 ; 0
2c1a: 00 e0 ldi r16, 0x00 ; 0
2c1c: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
 
if (naviData.NCFlags & NC_FLAG_CH) {
2c20: 80 91 de 01 lds r24, 0x01DE
2c24: 82 fd sbrc r24, 2
2c26: 5e c1 rjmp .+700 ; 0x2ee4 <osd_ncmode_minimal+0x4e0>
write_char_xy(27, bottom_line, 231); // gps ch
} else if (naviData.NCFlags & NC_FLAG_PH) {
2c28: 80 91 de 01 lds r24, 0x01DE
2c2c: 81 ff sbrs r24, 1
2c2e: 53 c1 rjmp .+678 ; 0x2ed6 <osd_ncmode_minimal+0x4d2>
write_char_xy(27, bottom_line, 230); // gps ph
2c30: 8b e1 ldi r24, 0x1B ; 27
2c32: 60 91 03 01 lds r22, 0x0103
2c36: 46 ee ldi r20, 0xE6 ; 230
2c38: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(27, bottom_line, 201); // sat2 (free)
}
}
 
// remember statistics (only when engines running)
if (naviData.FCFlags & FLAG_MOTOR_RUN) {
2c3c: 80 91 dd 01 lds r24, 0x01DD
2c40: 80 ff sbrs r24, 0
2c42: 65 c0 rjmp .+202 ; 0x2d0e <osd_ncmode_minimal+0x30a>
if (naviData.Altimeter > max_Altimeter) max_Altimeter = naviData.Altimeter;
2c44: 20 91 cd 01 lds r18, 0x01CD
2c48: 30 91 ce 01 lds r19, 0x01CE
2c4c: 80 91 1f 01 lds r24, 0x011F
2c50: 90 91 20 01 lds r25, 0x0120
2c54: 82 17 cp r24, r18
2c56: 93 07 cpc r25, r19
2c58: 44 f4 brge .+16 ; 0x2c6a <osd_ncmode_minimal+0x266>
2c5a: 80 91 cd 01 lds r24, 0x01CD
2c5e: 90 91 ce 01 lds r25, 0x01CE
2c62: 90 93 20 01 sts 0x0120, r25
2c66: 80 93 1f 01 sts 0x011F, r24
if (naviData.GroundSpeed > max_GroundSpeed) max_GroundSpeed = naviData.GroundSpeed;
2c6a: 20 91 d4 01 lds r18, 0x01D4
2c6e: 30 91 d5 01 lds r19, 0x01D5
2c72: 80 91 21 01 lds r24, 0x0121
2c76: 90 91 22 01 lds r25, 0x0122
2c7a: 82 17 cp r24, r18
2c7c: 93 07 cpc r25, r19
2c7e: 40 f4 brcc .+16 ; 0x2c90 <osd_ncmode_minimal+0x28c>
2c80: 80 91 d4 01 lds r24, 0x01D4
2c84: 90 91 d5 01 lds r25, 0x01D5
2c88: 90 93 22 01 sts 0x0122, r25
2c8c: 80 93 21 01 sts 0x0121, r24
if (naviData.HomePositionDeviation.Distance > max_Distance) {
2c90: 20 91 c6 01 lds r18, 0x01C6
2c94: 30 91 c7 01 lds r19, 0x01C7
2c98: 80 91 23 01 lds r24, 0x0123
2c9c: 90 91 24 01 lds r25, 0x0124
2ca0: 82 17 cp r24, r18
2ca2: 93 07 cpc r25, r19
2ca4: 40 f4 brcc .+16 ; 0x2cb6 <osd_ncmode_minimal+0x2b2>
max_Distance = naviData.HomePositionDeviation.Distance;
2ca6: 80 91 c6 01 lds r24, 0x01C6
2caa: 90 91 c7 01 lds r25, 0x01C7
2cae: 90 93 24 01 sts 0x0124, r25
2cb2: 80 93 23 01 sts 0x0123, r24
}
if (naviData.UBat < min_UBat) min_UBat = naviData.UBat;
2cb6: 90 91 d3 01 lds r25, 0x01D3
2cba: 80 91 04 01 lds r24, 0x0104
2cbe: 98 17 cp r25, r24
2cc0: 20 f4 brcc .+8 ; 0x2cca <osd_ncmode_minimal+0x2c6>
2cc2: 80 91 d3 01 lds r24, 0x01D3
2cc6: 80 93 04 01 sts 0x0104, r24
if (naviData.FlyingTime > max_FlyingTime) max_FlyingTime = naviData.FlyingTime;
2cca: 20 91 d1 01 lds r18, 0x01D1
2cce: 30 91 d2 01 lds r19, 0x01D2
2cd2: 80 91 25 01 lds r24, 0x0125
2cd6: 90 91 26 01 lds r25, 0x0126
2cda: 82 17 cp r24, r18
2cdc: 93 07 cpc r25, r19
2cde: 40 f4 brcc .+16 ; 0x2cf0 <osd_ncmode_minimal+0x2ec>
2ce0: 80 91 d1 01 lds r24, 0x01D1
2ce4: 90 91 d2 01 lds r25, 0x01D2
2ce8: 90 93 26 01 sts 0x0126, r25
2cec: 80 93 25 01 sts 0x0125, r24
if (ampere > max_ampere) max_ampere = ampere;
2cf0: 20 91 37 01 lds r18, 0x0137
2cf4: 30 91 38 01 lds r19, 0x0138
2cf8: 80 91 39 01 lds r24, 0x0139
2cfc: 90 91 3a 01 lds r25, 0x013A
2d00: 82 17 cp r24, r18
2d02: 93 07 cpc r25, r19
2d04: 24 f4 brge .+8 ; 0x2d0e <osd_ncmode_minimal+0x30a>
2d06: 30 93 3a 01 sts 0x013A, r19
2d0a: 20 93 39 01 sts 0x0139, r18
}
 
// remember last values
last_RC_Quality = naviData.RC_Quality;
2d0e: 80 91 dc 01 lds r24, 0x01DC
2d12: 80 93 01 01 sts 0x0101, r24
last_UBat = naviData.UBat;
2d16: 80 91 d3 01 lds r24, 0x01D3
2d1a: 80 93 00 01 sts 0x0100, r24
old_MKFlags = naviData.FCFlags;
2d1e: 80 91 dd 01 lds r24, 0x01DD
2d22: 80 93 27 01 sts 0x0127, r24
seconds_since_last_data = 0;
2d26: 10 92 18 01 sts 0x0118, r1
 
return 0;
}
2d2a: 80 e0 ldi r24, 0x00 ; 0
2d2c: 90 e0 ldi r25, 0x00 ; 0
2d2e: 1f 91 pop r17
2d30: 0f 91 pop r16
2d32: ff 90 pop r15
2d34: 08 95 ret
}
// motors are on, assume we were/are flying
COSD_FLAGS_RUNTIME |= COSD_WASFLYING;
} else {
// stats
if ((COSD_FLAGS_RUNTIME & COSD_WASFLYING) && (COSD_FLAGS_MODES & COSD_FLAG_STATS)) {
2d36: 80 91 1d 01 lds r24, 0x011D
2d3a: 82 ff sbrs r24, 2
2d3c: 92 c0 rjmp .+292 ; 0x2e62 <osd_ncmode_minimal+0x45e>
2d3e: 90 91 1b 01 lds r25, 0x011B
2d42: 93 fd sbrc r25, 3
2d44: fc c0 rjmp .+504 ; 0x2f3e <osd_ncmode_minimal+0x53a>
write_char_xy(22, line, 210); // fly clock
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[5])))); // longitude
write_gps_pos(15, line, naviData.CurrentPosition.Longitude);
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[6])))); // latitude
write_gps_pos(15, line, naviData.CurrentPosition.Latitude);
} else if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) { // if no stats there is space horizon
2d46: 91 ff sbrs r25, 1
2d48: 0b cf rjmp .-490 ; 0x2b60 <osd_ncmode_minimal+0x15c>
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
2d4a: 80 ff sbrs r24, 0
2d4c: ee c0 rjmp .+476 ; 0x2f2a <osd_ncmode_minimal+0x526>
draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
2d4e: 40 91 da 01 lds r20, 0x01DA
2d52: 20 91 db 01 lds r18, 0x01DB
2d56: 80 91 02 01 lds r24, 0x0102
2d5a: 60 91 03 01 lds r22, 0x0103
2d5e: 62 50 subi r22, 0x02 ; 2
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
2d60: 55 27 eor r21, r21
2d62: 47 fd sbrc r20, 7
2d64: 50 95 com r21
2d66: 33 27 eor r19, r19
2d68: 27 fd sbrc r18, 7
2d6a: 30 95 com r19
2d6c: 8e 5f subi r24, 0xFE ; 254
2d6e: 0e 94 e6 08 call 0x11cc ; 0x11cc <draw_artificial_horizon>
2d72: 90 91 1b 01 lds r25, 0x011B
}
}
}
if (COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO) {
2d76: 92 ff sbrs r25, 2
2d78: f5 ce rjmp .-534 ; 0x2b64 <osd_ncmode_minimal+0x160>
draw_big_variometer(27, 8, naviData.Variometer);
2d7a: 40 91 cf 01 lds r20, 0x01CF
2d7e: 50 91 d0 01 lds r21, 0x01D0
2d82: 8b e1 ldi r24, 0x1B ; 27
2d84: 68 e0 ldi r22, 0x08 ; 8
2d86: 0e 94 84 0a call 0x1508 ; 0x1508 <draw_big_variometer>
}
 
// pre-bottom line
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
2d8a: 80 91 1d 01 lds r24, 0x011D
2d8e: 80 ff sbrs r24, 0
2d90: ed ce rjmp .-550 ; 0x2b6c <osd_ncmode_minimal+0x168>
//write_ndigit_number_s(3, bottom_line - 1, ampere, 4, 0);
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 3, 0);
2d92: 20 91 03 01 lds r18, 0x0103
2d96: 21 50 subi r18, 0x01 ; 1
2d98: 80 91 37 01 lds r24, 0x0137
2d9c: 90 91 38 01 lds r25, 0x0138
2da0: 6a e0 ldi r22, 0x0A ; 10
2da2: 70 e0 ldi r23, 0x00 ; 0
2da4: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
2da8: ab 01 movw r20, r22
2daa: 83 e0 ldi r24, 0x03 ; 3
2dac: 62 2f mov r22, r18
2dae: 23 e0 ldi r18, 0x03 ; 3
2db0: 30 e0 ldi r19, 0x00 ; 0
2db2: 00 e0 ldi r16, 0x00 ; 0
2db4: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
2db8: 10 91 03 01 lds r17, 0x0103
2dbc: 11 50 subi r17, 0x01 ; 1
2dbe: 60 91 3b 01 lds r22, 0x013B
2dc2: 70 91 3c 01 lds r23, 0x013C
2dc6: 80 91 3d 01 lds r24, 0x013D
2dca: 90 91 3e 01 lds r25, 0x013E
2dce: 2a e0 ldi r18, 0x0A ; 10
2dd0: 30 e0 ldi r19, 0x00 ; 0
2dd2: 40 e0 ldi r20, 0x00 ; 0
2dd4: 50 e0 ldi r21, 0x00 ; 0
2dd6: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
2dda: 8a e0 ldi r24, 0x0A ; 10
2ddc: 61 2f mov r22, r17
2dde: a9 01 movw r20, r18
2de0: 24 e0 ldi r18, 0x04 ; 4
2de2: 30 e0 ldi r19, 0x00 ; 0
2de4: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
2de8: c1 ce rjmp .-638 ; 0x2b6c <osd_ncmode_minimal+0x168>
 
int osd_ncmode_minimal() {
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
write_char_xy(4, top_line, 0xCB); // km/h
2dea: 84 e0 ldi r24, 0x04 ; 4
2dec: 60 91 02 01 lds r22, 0x0102
2df0: 4b ec ldi r20, 0xCB ; 203
2df2: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(15, top_line, 0xCC); // small meters m height
2df6: 8f e0 ldi r24, 0x0F ; 15
2df8: 60 91 02 01 lds r22, 0x0102
2dfc: 4c ec ldi r20, 0xCC ; 204
2dfe: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(26, top_line, 0xCC); // small meters m height
2e02: 8a e1 ldi r24, 0x1A ; 26
2e04: 60 91 02 01 lds r22, 0x0102
2e08: 4c ec ldi r20, 0xCC ; 204
2e0a: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(16, top_line, 0xB0); // left circle
2e0e: 80 e1 ldi r24, 0x10 ; 16
2e10: 60 91 02 01 lds r22, 0x0102
2e14: 40 eb ldi r20, 0xB0 ; 176
2e16: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(18, top_line, 0xB2); // right circle
2e1a: 82 e1 ldi r24, 0x12 ; 18
2e1c: 60 91 02 01 lds r22, 0x0102
2e20: 42 eb ldi r20, 0xB2 ; 178
2e22: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(7, bottom_line, 0x9E); // small V
2e26: 87 e0 ldi r24, 0x07 ; 7
2e28: 60 91 03 01 lds r22, 0x0103
2e2c: 4e e9 ldi r20, 0x9E ; 158
2e2e: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(17, bottom_line, 0xD2); // fly clock
2e32: 81 e1 ldi r24, 0x11 ; 17
2e34: 60 91 03 01 lds r22, 0x0103
2e38: 42 ed ldi r20, 0xD2 ; 210
2e3a: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(26, bottom_line, 0xC8); // sat1
2e3e: 8a e1 ldi r24, 0x1A ; 26
2e40: 60 91 03 01 lds r22, 0x0103
2e44: 48 ec ldi r20, 0xC8 ; 200
2e46: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(27, bottom_line, 0xC9); // sat2
2e4a: 8b e1 ldi r24, 0x1B ; 27
2e4c: 60 91 03 01 lds r22, 0x0103
2e50: 49 ec ldi r20, 0xC9 ; 201
2e52: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
2e56: 80 91 1d 01 lds r24, 0x011D
2e5a: 82 60 ori r24, 0x02 ; 2
2e5c: 80 93 1d 01 sts 0x011D, r24
2e60: dc cd rjmp .-1096 ; 0x2a1a <osd_ncmode_minimal+0x16>
2e62: 90 91 1b 01 lds r25, 0x011B
2e66: 6f cf rjmp .-290 ; 0x2d46 <osd_ncmode_minimal+0x342>
 
 
// center
if (naviData.FCFlags & FLAG_MOTOR_RUN) { // should be engines running
if (!(old_MKFlags & FLAG_MOTOR_RUN)) { // motors just started, clear middle
clear();
2e68: 0e 94 75 08 call 0x10ea ; 0x10ea <clear>
// update flags to paint display again if needed
COSD_FLAGS_RUNTIME &= ~COSD_ICONS_WRITTEN;
2e6c: 80 91 1d 01 lds r24, 0x011D
2e70: 8d 7f andi r24, 0xFD ; 253
2e72: 80 93 1d 01 sts 0x011D, r24
2e76: 55 ce rjmp .-854 ; 0x2b22 <osd_ncmode_minimal+0x11e>
draw_battery(2, bottom_line, min_voltage, naviData.UBat, max_voltage);
write_ndigit_number_u_10th(3, bottom_line, naviData.UBat, 3, 0);
if (naviData.UBat <= min_voltage && last_UBat > min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
} else if (naviData.UBat > min_voltage && last_UBat < min_voltage) {
2e78: 80 91 d3 01 lds r24, 0x01D3
2e7c: 98 17 cp r25, r24
2e7e: 08 f0 brcs .+2 ; 0x2e82 <osd_ncmode_minimal+0x47e>
2e80: bb ce rjmp .-650 ; 0x2bf8 <osd_ncmode_minimal+0x1f4>
2e82: 80 91 00 01 lds r24, 0x0100
2e86: 89 17 cp r24, r25
2e88: 08 f0 brcs .+2 ; 0x2e8c <osd_ncmode_minimal+0x488>
2e8a: b6 ce rjmp .-660 ; 0x2bf8 <osd_ncmode_minimal+0x1f4>
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, 0);
2e8c: 82 e0 ldi r24, 0x02 ; 2
2e8e: 60 91 03 01 lds r22, 0x0103
2e92: 40 e0 ldi r20, 0x00 ; 0
2e94: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2e98: 83 e0 ldi r24, 0x03 ; 3
2e9a: 60 91 03 01 lds r22, 0x0103
2e9e: 40 e0 ldi r20, 0x00 ; 0
2ea0: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2ea4: 84 e0 ldi r24, 0x04 ; 4
2ea6: 60 91 03 01 lds r22, 0x0103
2eaa: 40 e0 ldi r20, 0x00 ; 0
2eac: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2eb0: 85 e0 ldi r24, 0x05 ; 5
2eb2: 60 91 03 01 lds r22, 0x0103
2eb6: 40 e0 ldi r20, 0x00 ; 0
2eb8: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2ebc: 86 e0 ldi r24, 0x06 ; 6
2ebe: 60 91 03 01 lds r22, 0x0103
2ec2: 40 e0 ldi r20, 0x00 ; 0
2ec4: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2ec8: 87 e0 ldi r24, 0x07 ; 7
2eca: 60 91 03 01 lds r22, 0x0103
2ece: 40 e0 ldi r20, 0x00 ; 0
2ed0: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
2ed4: 91 ce rjmp .-734 ; 0x2bf8 <osd_ncmode_minimal+0x1f4>
if (naviData.NCFlags & NC_FLAG_CH) {
write_char_xy(27, bottom_line, 231); // gps ch
} else if (naviData.NCFlags & NC_FLAG_PH) {
write_char_xy(27, bottom_line, 230); // gps ph
} else { // (naviData.NCFlags & NC_FLAG_FREE)
write_char_xy(27, bottom_line, 201); // sat2 (free)
2ed6: 8b e1 ldi r24, 0x1B ; 27
2ed8: 60 91 03 01 lds r22, 0x0103
2edc: 49 ec ldi r20, 0xC9 ; 201
2ede: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
2ee2: ac ce rjmp .-680 ; 0x2c3c <osd_ncmode_minimal+0x238>
write_time(11, bottom_line, naviData.FlyingTime);
 
write_ndigit_number_u(24, bottom_line, naviData.SatsInUse, 2, 0);
 
if (naviData.NCFlags & NC_FLAG_CH) {
write_char_xy(27, bottom_line, 231); // gps ch
2ee4: 8b e1 ldi r24, 0x1B ; 27
2ee6: 60 91 03 01 lds r22, 0x0103
2eea: 47 ee ldi r20, 0xE7 ; 231
2eec: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
2ef0: a5 ce rjmp .-694 ; 0x2c3c <osd_ncmode_minimal+0x238>
if (naviData.Altimeter > 300 || naviData.Altimeter < -300) {
// above 10m only write full meters
write_ndigit_number_s(22, top_line, naviData.Altimeter / 30, 4, 0);
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(22, top_line, naviData.Altimeter / 3, 3, 0);
2ef2: 80 91 cd 01 lds r24, 0x01CD
2ef6: 90 91 ce 01 lds r25, 0x01CE
2efa: 63 e0 ldi r22, 0x03 ; 3
2efc: 70 e0 ldi r23, 0x00 ; 0
2efe: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
2f02: ab 01 movw r20, r22
2f04: 86 e1 ldi r24, 0x16 ; 22
2f06: 60 91 02 01 lds r22, 0x0102
2f0a: 23 e0 ldi r18, 0x03 ; 3
2f0c: 30 e0 ldi r19, 0x00 ; 0
2f0e: 00 e0 ldi r16, 0x00 ; 0
2f10: 0e 94 d3 05 call 0xba6 ; 0xba6 <write_ndigit_number_s_10th>
2f14: f3 cd rjmp .-1050 ; 0x2afc <osd_ncmode_minimal+0xf8>
}
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
2f16: 40 91 da 01 lds r20, 0x01DA
2f1a: 20 91 db 01 lds r18, 0x01DB
2f1e: 80 91 02 01 lds r24, 0x0102
2f22: 60 91 03 01 lds r22, 0x0103
2f26: 61 50 subi r22, 0x01 ; 1
2f28: 0b ce rjmp .-1002 ; 0x2b40 <osd_ncmode_minimal+0x13c>
write_gps_pos(15, line, naviData.CurrentPosition.Latitude);
} else if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) { // if no stats there is space horizon
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
draw_artificial_horizon(top_line + 2, bottom_line - 2, naviData.AngleNick, naviData.AngleRoll);
} else {
draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
2f2a: 40 91 da 01 lds r20, 0x01DA
2f2e: 20 91 db 01 lds r18, 0x01DB
2f32: 80 91 02 01 lds r24, 0x0102
2f36: 60 91 03 01 lds r22, 0x0103
2f3a: 61 50 subi r22, 0x01 ; 1
2f3c: 11 cf rjmp .-478 ; 0x2d60 <osd_ncmode_minimal+0x35c>
COSD_FLAGS_RUNTIME |= COSD_WASFLYING;
} else {
// stats
if ((COSD_FLAGS_RUNTIME & COSD_WASFLYING) && (COSD_FLAGS_MODES & COSD_FLAG_STATS)) {
uint8_t line = 3;
write_ascii_string_pgm(2, line, (const char *) (pgm_read_word(&(stats_item_pointers[0])))); // max Altitude
2f3e: e0 ee ldi r30, 0xE0 ; 224
2f40: f0 e0 ldi r31, 0x00 ; 0
2f42: 45 91 lpm r20, Z+
2f44: 54 91 lpm r21, Z+
2f46: 82 e0 ldi r24, 0x02 ; 2
2f48: 63 e0 ldi r22, 0x03 ; 3
2f4a: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_s(18, line, max_Altimeter / 30, 4, 0);
2f4e: 80 91 1f 01 lds r24, 0x011F
2f52: 90 91 20 01 lds r25, 0x0120
2f56: 6e e1 ldi r22, 0x1E ; 30
2f58: 70 e0 ldi r23, 0x00 ; 0
2f5a: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
2f5e: ab 01 movw r20, r22
2f60: 82 e1 ldi r24, 0x12 ; 18
2f62: 63 e0 ldi r22, 0x03 ; 3
2f64: 24 e0 ldi r18, 0x04 ; 4
2f66: 30 e0 ldi r19, 0x00 ; 0
2f68: 00 e0 ldi r16, 0x00 ; 0
2f6a: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
write_char_xy(22, line, 204); // small meters m
2f6e: 86 e1 ldi r24, 0x16 ; 22
2f70: 63 e0 ldi r22, 0x03 ; 3
2f72: 4c ec ldi r20, 0xCC ; 204
2f74: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[1])))); // max Speed
2f78: e2 ee ldi r30, 0xE2 ; 226
2f7a: f0 e0 ldi r31, 0x00 ; 0
2f7c: 45 91 lpm r20, Z+
2f7e: 54 91 lpm r21, Z+
2f80: 82 e0 ldi r24, 0x02 ; 2
2f82: 64 e0 ldi r22, 0x04 ; 4
2f84: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_u(19, line, (uint16_t) (((uint32_t) max_GroundSpeed * (uint32_t) 9) / (uint32_t) 250), 3, 0);
2f88: 20 91 21 01 lds r18, 0x0121
2f8c: 30 91 22 01 lds r19, 0x0122
2f90: 40 e0 ldi r20, 0x00 ; 0
2f92: 50 e0 ldi r21, 0x00 ; 0
2f94: ca 01 movw r24, r20
2f96: b9 01 movw r22, r18
2f98: 66 0f add r22, r22
2f9a: 77 1f adc r23, r23
2f9c: 88 1f adc r24, r24
2f9e: 99 1f adc r25, r25
2fa0: 66 0f add r22, r22
2fa2: 77 1f adc r23, r23
2fa4: 88 1f adc r24, r24
2fa6: 99 1f adc r25, r25
2fa8: 66 0f add r22, r22
2faa: 77 1f adc r23, r23
2fac: 88 1f adc r24, r24
2fae: 99 1f adc r25, r25
2fb0: 62 0f add r22, r18
2fb2: 73 1f adc r23, r19
2fb4: 84 1f adc r24, r20
2fb6: 95 1f adc r25, r21
2fb8: 2a ef ldi r18, 0xFA ; 250
2fba: 30 e0 ldi r19, 0x00 ; 0
2fbc: 40 e0 ldi r20, 0x00 ; 0
2fbe: 50 e0 ldi r21, 0x00 ; 0
2fc0: 0e 94 8f 1c call 0x391e ; 0x391e <__udivmodsi4>
2fc4: 83 e1 ldi r24, 0x13 ; 19
2fc6: 64 e0 ldi r22, 0x04 ; 4
2fc8: a9 01 movw r20, r18
2fca: 23 e0 ldi r18, 0x03 ; 3
2fcc: 30 e0 ldi r19, 0x00 ; 0
2fce: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_char_xy(22, line, 203); // km/h
2fd2: 86 e1 ldi r24, 0x16 ; 22
2fd4: 64 e0 ldi r22, 0x04 ; 4
2fd6: 4b ec ldi r20, 0xCB ; 203
2fd8: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[2])))); // max Distance
2fdc: e4 ee ldi r30, 0xE4 ; 228
2fde: f0 e0 ldi r31, 0x00 ; 0
2fe0: 45 91 lpm r20, Z+
2fe2: 54 91 lpm r21, Z+
2fe4: 82 e0 ldi r24, 0x02 ; 2
2fe6: 65 e0 ldi r22, 0x05 ; 5
2fe8: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_u(19, line, max_Distance / 10, 3, 0);
2fec: 80 91 23 01 lds r24, 0x0123
2ff0: 90 91 24 01 lds r25, 0x0124
2ff4: 6a e0 ldi r22, 0x0A ; 10
2ff6: 70 e0 ldi r23, 0x00 ; 0
2ff8: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
2ffc: ab 01 movw r20, r22
2ffe: 83 e1 ldi r24, 0x13 ; 19
3000: 65 e0 ldi r22, 0x05 ; 5
3002: 23 e0 ldi r18, 0x03 ; 3
3004: 30 e0 ldi r19, 0x00 ; 0
3006: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_char_xy(22, line, 204); // small meters m
300a: 86 e1 ldi r24, 0x16 ; 22
300c: 65 e0 ldi r22, 0x05 ; 5
300e: 4c ec ldi r20, 0xCC ; 204
3010: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[3])))); // min voltage
3014: e6 ee ldi r30, 0xE6 ; 230
3016: f0 e0 ldi r31, 0x00 ; 0
3018: 45 91 lpm r20, Z+
301a: 54 91 lpm r21, Z+
301c: 82 e0 ldi r24, 0x02 ; 2
301e: 66 e0 ldi r22, 0x06 ; 6
3020: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_u_10th(18, line, min_UBat, 3, 0);
3024: 40 91 04 01 lds r20, 0x0104
3028: 82 e1 ldi r24, 0x12 ; 18
302a: 66 e0 ldi r22, 0x06 ; 6
302c: 50 e0 ldi r21, 0x00 ; 0
302e: 23 e0 ldi r18, 0x03 ; 3
3030: 30 e0 ldi r19, 0x00 ; 0
3032: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
write_char_xy(22, line, 0x9E); // small V
3036: 86 e1 ldi r24, 0x16 ; 22
3038: 66 e0 ldi r22, 0x06 ; 6
303a: 4e e9 ldi r20, 0x9E ; 158
303c: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
3040: 80 91 1d 01 lds r24, 0x011D
3044: 80 fd sbrc r24, 0
3046: 44 c0 rjmp .+136 ; 0x30d0 <osd_ncmode_minimal+0x6cc>
3048: 17 e0 ldi r17, 0x07 ; 7
304a: 08 e0 ldi r16, 0x08 ; 8
304c: 99 e0 ldi r25, 0x09 ; 9
304e: f9 2e mov r15, r25
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[7])))); // ampere
write_ndigit_number_u_10th(18, line, max_ampere / 10, 3, 0);
write_char_xy(22, line, 0x9F); // small A
}
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[4])))); // max time
3050: e8 ee ldi r30, 0xE8 ; 232
3052: f0 e0 ldi r31, 0x00 ; 0
3054: 45 91 lpm r20, Z+
3056: 54 91 lpm r21, Z+
3058: 82 e0 ldi r24, 0x02 ; 2
305a: 61 2f mov r22, r17
305c: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_time(16, line, max_FlyingTime);
3060: 40 91 25 01 lds r20, 0x0125
3064: 50 91 26 01 lds r21, 0x0126
3068: 80 e1 ldi r24, 0x10 ; 16
306a: 61 2f mov r22, r17
306c: 0e 94 3a 08 call 0x1074 ; 0x1074 <write_time>
write_char_xy(22, line, 210); // fly clock
3070: 86 e1 ldi r24, 0x16 ; 22
3072: 61 2f mov r22, r17
3074: 42 ed ldi r20, 0xD2 ; 210
3076: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[5])))); // longitude
307a: ea ee ldi r30, 0xEA ; 234
307c: f0 e0 ldi r31, 0x00 ; 0
307e: 45 91 lpm r20, Z+
3080: 54 91 lpm r21, Z+
3082: 82 e0 ldi r24, 0x02 ; 2
3084: 60 2f mov r22, r16
3086: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_gps_pos(15, line, naviData.CurrentPosition.Longitude);
308a: 20 91 9b 01 lds r18, 0x019B
308e: 30 91 9c 01 lds r19, 0x019C
3092: 40 91 9d 01 lds r20, 0x019D
3096: 50 91 9e 01 lds r21, 0x019E
309a: 8f e0 ldi r24, 0x0F ; 15
309c: 60 2f mov r22, r16
309e: 0e 94 bd 07 call 0xf7a ; 0xf7a <write_gps_pos>
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[6])))); // latitude
30a2: ec ee ldi r30, 0xEC ; 236
30a4: f0 e0 ldi r31, 0x00 ; 0
30a6: 45 91 lpm r20, Z+
30a8: 54 91 lpm r21, Z+
30aa: 82 e0 ldi r24, 0x02 ; 2
30ac: 6f 2d mov r22, r15
30ae: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_gps_pos(15, line, naviData.CurrentPosition.Latitude);
30b2: 20 91 9f 01 lds r18, 0x019F
30b6: 30 91 a0 01 lds r19, 0x01A0
30ba: 40 91 a1 01 lds r20, 0x01A1
30be: 50 91 a2 01 lds r21, 0x01A2
30c2: 8f e0 ldi r24, 0x0F ; 15
30c4: 6f 2d mov r22, r15
30c6: 0e 94 bd 07 call 0xf7a ; 0xf7a <write_gps_pos>
30ca: 90 91 1b 01 lds r25, 0x011B
30ce: 48 cd rjmp .-1392 ; 0x2b60 <osd_ncmode_minimal+0x15c>
write_char_xy(22, line, 204); // small meters m
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[3])))); // min voltage
write_ndigit_number_u_10th(18, line, min_UBat, 3, 0);
write_char_xy(22, line, 0x9E); // small V
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
write_ascii_string_pgm(2, ++line, (const char *) (pgm_read_word(&(stats_item_pointers[7])))); // ampere
30d0: ee ee ldi r30, 0xEE ; 238
30d2: f0 e0 ldi r31, 0x00 ; 0
30d4: 45 91 lpm r20, Z+
30d6: 54 91 lpm r21, Z+
30d8: 82 e0 ldi r24, 0x02 ; 2
30da: 67 e0 ldi r22, 0x07 ; 7
30dc: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
write_ndigit_number_u_10th(18, line, max_ampere / 10, 3, 0);
30e0: 80 91 39 01 lds r24, 0x0139
30e4: 90 91 3a 01 lds r25, 0x013A
30e8: 6a e0 ldi r22, 0x0A ; 10
30ea: 70 e0 ldi r23, 0x00 ; 0
30ec: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
30f0: ab 01 movw r20, r22
30f2: 82 e1 ldi r24, 0x12 ; 18
30f4: 67 e0 ldi r22, 0x07 ; 7
30f6: 23 e0 ldi r18, 0x03 ; 3
30f8: 30 e0 ldi r19, 0x00 ; 0
30fa: 00 e0 ldi r16, 0x00 ; 0
30fc: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
write_char_xy(22, line, 0x9F); // small A
3100: 86 e1 ldi r24, 0x16 ; 22
3102: 67 e0 ldi r22, 0x07 ; 7
3104: 4f e9 ldi r20, 0x9F ; 159
3106: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
310a: 18 e0 ldi r17, 0x08 ; 8
310c: 09 e0 ldi r16, 0x09 ; 9
310e: 8a e0 ldi r24, 0x0A ; 10
3110: f8 2e mov r15, r24
3112: 9e cf rjmp .-196 ; 0x3050 <osd_ncmode_minimal+0x64c>
 
00003114 <osd_fcmode_default>:
#include "osd_helpers.h"
#include "osd_fcmode_default.h"
 
#if !(ALLCHARSDEBUG|(WRITECHARS != -1))
 
int osd_fcmode_default() {
3114: 0f 93 push r16
3116: 1f 93 push r17
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
3118: 80 91 1b 01 lds r24, 0x011B
311c: 80 ff sbrs r24, 0
311e: b7 c0 rjmp .+366 ; 0x328e <osd_fcmode_default+0x17a>
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
3120: 80 91 1d 01 lds r24, 0x011D
3124: 81 ff sbrs r24, 1
3126: d6 c0 rjmp .+428 ; 0x32d4 <osd_fcmode_default+0x1c0>
}
}
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
3128: 40 91 5f 01 lds r20, 0x015F
312c: 50 91 60 01 lds r21, 0x0160
3130: 87 e0 ldi r24, 0x07 ; 7
3132: 60 91 02 01 lds r22, 0x0102
3136: 23 e0 ldi r18, 0x03 ; 3
3138: 30 e0 ldi r19, 0x00 ; 0
313a: 00 e0 ldi r16, 0x00 ; 0
313c: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
3140: 80 91 5f 01 lds r24, 0x015F
3144: 90 91 60 01 lds r25, 0x0160
3148: 85 36 cpi r24, 0x65 ; 101
314a: 91 05 cpc r25, r1
314c: 08 f4 brcc .+2 ; 0x3150 <osd_fcmode_default+0x3c>
314e: b2 c0 rjmp .+356 ; 0x32b4 <osd_fcmode_default+0x1a0>
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (debugData.Analog[10] > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
3150: 80 91 5f 01 lds r24, 0x015F
3154: 90 91 60 01 lds r25, 0x0160
3158: 85 36 cpi r24, 0x65 ; 101
315a: 91 05 cpc r25, r1
315c: 28 f0 brcs .+10 ; 0x3168 <osd_fcmode_default+0x54>
315e: 80 91 01 01 lds r24, 0x0101
3162: 85 36 cpi r24, 0x65 ; 101
3164: 08 f4 brcc .+2 ; 0x3168 <osd_fcmode_default+0x54>
3166: f5 c0 rjmp .+490 ; 0x3352 <osd_fcmode_default+0x23e>
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, 0);
}
if (debugData.Analog[5] > 300 || debugData.Analog[5] < -300) {
3168: 80 91 55 01 lds r24, 0x0155
316c: 90 91 56 01 lds r25, 0x0156
3170: 8d 52 subi r24, 0x2D ; 45
3172: 91 40 sbci r25, 0x01 ; 1
3174: 40 f4 brcc .+16 ; 0x3186 <osd_fcmode_default+0x72>
3176: 80 91 55 01 lds r24, 0x0155
317a: 90 91 56 01 lds r25, 0x0156
317e: 84 5d subi r24, 0xD4 ; 212
3180: 9e 4f sbci r25, 0xFE ; 254
3182: 08 f0 brcs .+2 ; 0x3186 <osd_fcmode_default+0x72>
3184: 41 c1 rjmp .+642 ; 0x3408 <osd_fcmode_default+0x2f4>
// above 10m only write full meters
write_ndigit_number_s(23, top_line, debugData.Analog[5] / 30, 4, 0);
3186: 80 91 55 01 lds r24, 0x0155
318a: 90 91 56 01 lds r25, 0x0156
318e: 6e e1 ldi r22, 0x1E ; 30
3190: 70 e0 ldi r23, 0x00 ; 0
3192: 0e 94 68 1c call 0x38d0 ; 0x38d0 <__udivmodhi4>
3196: ab 01 movw r20, r22
3198: 87 e1 ldi r24, 0x17 ; 23
319a: 60 91 02 01 lds r22, 0x0102
319e: 24 e0 ldi r18, 0x04 ; 4
31a0: 30 e0 ldi r19, 0x00 ; 0
31a2: 00 e0 ldi r16, 0x00 ; 0
31a4: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(23, top_line, debugData.Analog[5] / 3, 3, 0);
}
if (debugData.Analog[5] > max_Altimeter) max_Altimeter = debugData.Analog[5];
31a8: 20 91 55 01 lds r18, 0x0155
31ac: 30 91 56 01 lds r19, 0x0156
31b0: 80 91 1f 01 lds r24, 0x011F
31b4: 90 91 20 01 lds r25, 0x0120
31b8: 82 17 cp r24, r18
31ba: 93 07 cpc r25, r19
31bc: 40 f4 brcc .+16 ; 0x31ce <osd_fcmode_default+0xba>
31be: 80 91 55 01 lds r24, 0x0155
31c2: 90 91 56 01 lds r25, 0x0156
31c6: 90 93 20 01 sts 0x0120, r25
31ca: 80 93 1f 01 sts 0x011F, r24
 
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
31ce: 80 91 1b 01 lds r24, 0x011B
31d2: 81 fd sbrc r24, 1
31d4: c9 c0 rjmp .+402 ; 0x3368 <osd_fcmode_default+0x254>
draw_artificial_horizon(top_line + 2, bottom_line - 1, debugData.Analog[0], debugData.Analog[1]);
}
 
// pre-bottom line
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
31d6: 80 91 1d 01 lds r24, 0x011D
31da: 80 fd sbrc r24, 0
31dc: d9 c0 rjmp .+434 ; 0x3390 <osd_fcmode_default+0x27c>
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_ndigit_number_u_10th(17, bottom_line - 1, s_volt, 3, 0);
}
}
 
draw_battery(2, bottom_line, min_voltage, debugData.Analog[9], max_voltage);
31de: 20 91 5d 01 lds r18, 0x015D
31e2: 30 91 5e 01 lds r19, 0x015E
31e6: 82 e0 ldi r24, 0x02 ; 2
31e8: 60 91 03 01 lds r22, 0x0103
31ec: 40 91 19 01 lds r20, 0x0119
31f0: 00 91 1a 01 lds r16, 0x011A
31f4: 0e 94 17 0a call 0x142e ; 0x142e <draw_battery>
write_ndigit_number_u_10th(3, bottom_line, debugData.Analog[9], 3, 0);
31f8: 40 91 5d 01 lds r20, 0x015D
31fc: 50 91 5e 01 lds r21, 0x015E
3200: 83 e0 ldi r24, 0x03 ; 3
3202: 60 91 03 01 lds r22, 0x0103
3206: 23 e0 ldi r18, 0x03 ; 3
3208: 30 e0 ldi r19, 0x00 ; 0
320a: 00 e0 ldi r16, 0x00 ; 0
320c: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
if (debugData.Analog[9] <= min_voltage && last_UBat > min_voltage) {
3210: 80 91 5d 01 lds r24, 0x015D
3214: 90 91 5e 01 lds r25, 0x015E
3218: 40 91 19 01 lds r20, 0x0119
321c: 24 2f mov r18, r20
321e: 30 e0 ldi r19, 0x00 ; 0
3220: 28 17 cp r18, r24
3222: 39 07 cpc r19, r25
3224: 28 f0 brcs .+10 ; 0x3230 <osd_fcmode_default+0x11c>
3226: 80 91 00 01 lds r24, 0x0100
322a: 48 17 cp r20, r24
322c: 08 f4 brcc .+2 ; 0x3230 <osd_fcmode_default+0x11c>
322e: 6c c0 rjmp .+216 ; 0x3308 <osd_fcmode_default+0x1f4>
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
} else if (debugData.Analog[9] > min_voltage && last_UBat < min_voltage) {
3230: 80 91 5d 01 lds r24, 0x015D
3234: 90 91 5e 01 lds r25, 0x015E
3238: 28 17 cp r18, r24
323a: 39 07 cpc r19, r25
323c: 40 f5 brcc .+80 ; 0x328e <osd_fcmode_default+0x17a>
323e: 80 91 00 01 lds r24, 0x0100
3242: 84 17 cp r24, r20
3244: 20 f5 brcc .+72 ; 0x328e <osd_fcmode_default+0x17a>
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, 0);
3246: 82 e0 ldi r24, 0x02 ; 2
3248: 60 91 03 01 lds r22, 0x0103
324c: 40 e0 ldi r20, 0x00 ; 0
324e: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3252: 83 e0 ldi r24, 0x03 ; 3
3254: 60 91 03 01 lds r22, 0x0103
3258: 40 e0 ldi r20, 0x00 ; 0
325a: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
325e: 84 e0 ldi r24, 0x04 ; 4
3260: 60 91 03 01 lds r22, 0x0103
3264: 40 e0 ldi r20, 0x00 ; 0
3266: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
326a: 85 e0 ldi r24, 0x05 ; 5
326c: 60 91 03 01 lds r22, 0x0103
3270: 40 e0 ldi r20, 0x00 ; 0
3272: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3276: 86 e0 ldi r24, 0x06 ; 6
3278: 60 91 03 01 lds r22, 0x0103
327c: 40 e0 ldi r20, 0x00 ; 0
327e: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3282: 87 e0 ldi r24, 0x07 ; 7
3284: 60 91 03 01 lds r22, 0x0103
3288: 40 e0 ldi r20, 0x00 ; 0
328a: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
}
}
// remember last values
last_UBat = debugData.Analog[9];
328e: 80 91 5d 01 lds r24, 0x015D
3292: 90 91 5e 01 lds r25, 0x015E
3296: 80 93 00 01 sts 0x0100, r24
last_RC_Quality = debugData.Analog[10];
329a: 80 91 5f 01 lds r24, 0x015F
329e: 90 91 60 01 lds r25, 0x0160
32a2: 80 93 01 01 sts 0x0101, r24
debugData.Analog[5]); // Height
debugData.Analog[9]); // Voltage
debugData.Analog[10]);// RC Signal
debugData.Analog[11]);// Gyro compass
*/
seconds_since_last_data = 0;
32a6: 10 92 18 01 sts 0x0118, r1
 
return 0;
}
32aa: 80 e0 ldi r24, 0x00 ; 0
32ac: 90 e0 ldi r25, 0x00 ; 0
32ae: 1f 91 pop r17
32b0: 0f 91 pop r16
32b2: 08 95 ret
}
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
32b4: 80 91 01 01 lds r24, 0x0101
32b8: 85 36 cpi r24, 0x65 ; 101
32ba: 08 f4 brcc .+2 ; 0x32be <osd_fcmode_default+0x1aa>
32bc: 49 cf rjmp .-366 ; 0x3150 <osd_fcmode_default+0x3c>
32be: 17 e0 ldi r17, 0x07 ; 7
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
32c0: 81 2f mov r24, r17
32c2: 60 91 02 01 lds r22, 0x0102
32c6: 4f e4 ldi r20, 0x4F ; 79
32c8: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
32cc: 1f 5f subi r17, 0xFF ; 255
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
32ce: 1b 30 cpi r17, 0x0B ; 11
32d0: b9 f7 brne .-18 ; 0x32c0 <osd_fcmode_default+0x1ac>
32d2: 4a cf rjmp .-364 ; 0x3168 <osd_fcmode_default+0x54>
 
int osd_fcmode_default() {
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
write_char_xy(10, top_line, 0xCA); // RC-transmitter
32d4: 8a e0 ldi r24, 0x0A ; 10
32d6: 60 91 02 01 lds r22, 0x0102
32da: 4a ec ldi r20, 0xCA ; 202
32dc: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(27, top_line, 0xCC); // small meters m height
32e0: 8b e1 ldi r24, 0x1B ; 27
32e2: 60 91 02 01 lds r22, 0x0102
32e6: 4c ec ldi r20, 0xCC ; 204
32e8: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(7, bottom_line, 0x9E); // small v
32ec: 87 e0 ldi r24, 0x07 ; 7
32ee: 60 91 03 01 lds r22, 0x0103
32f2: 4e e9 ldi r20, 0x9E ; 158
32f4: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
32f8: 80 91 1d 01 lds r24, 0x011D
32fc: 80 fd sbrc r24, 0
32fe: 96 c0 rjmp .+300 ; 0x342c <osd_fcmode_default+0x318>
write_char_xy(14, bottom_line - 1, 0xB5); // mah
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_char_xy(21, bottom_line - 1, 0x9E); // small V
}
}
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
3300: 82 60 ori r24, 0x02 ; 2
3302: 80 93 1d 01 sts 0x011D, r24
3306: 10 cf rjmp .-480 ; 0x3128 <osd_fcmode_default+0x14>
 
draw_battery(2, bottom_line, min_voltage, debugData.Analog[9], max_voltage);
write_ndigit_number_u_10th(3, bottom_line, debugData.Analog[9], 3, 0);
if (debugData.Analog[9] <= min_voltage && last_UBat > min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
3308: 82 e0 ldi r24, 0x02 ; 2
330a: 60 91 03 01 lds r22, 0x0103
330e: 4f e4 ldi r20, 0x4F ; 79
3310: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3314: 83 e0 ldi r24, 0x03 ; 3
3316: 60 91 03 01 lds r22, 0x0103
331a: 4f e4 ldi r20, 0x4F ; 79
331c: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3320: 84 e0 ldi r24, 0x04 ; 4
3322: 60 91 03 01 lds r22, 0x0103
3326: 4f e4 ldi r20, 0x4F ; 79
3328: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
332c: 85 e0 ldi r24, 0x05 ; 5
332e: 60 91 03 01 lds r22, 0x0103
3332: 4f e4 ldi r20, 0x4F ; 79
3334: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3338: 86 e0 ldi r24, 0x06 ; 6
333a: 60 91 03 01 lds r22, 0x0103
333e: 4f e4 ldi r20, 0x4F ; 79
3340: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3344: 87 e0 ldi r24, 0x07 ; 7
3346: 60 91 03 01 lds r22, 0x0103
334a: 4f e4 ldi r20, 0x4F ; 79
334c: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3350: 9e cf rjmp .-196 ; 0x328e <osd_fcmode_default+0x17a>
 
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (debugData.Analog[10] > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
3352: 17 e0 ldi r17, 0x07 ; 7
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, 0);
3354: 81 2f mov r24, r17
3356: 60 91 02 01 lds r22, 0x0102
335a: 40 e0 ldi r20, 0x00 ; 0
335c: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3360: 1f 5f subi r17, 0xFF ; 255
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (debugData.Analog[10] > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
3362: 1b 30 cpi r17, 0x0B ; 11
3364: b9 f7 brne .-18 ; 0x3354 <osd_fcmode_default+0x240>
3366: 00 cf rjmp .-512 ; 0x3168 <osd_fcmode_default+0x54>
write_ndigit_number_s_10th(23, top_line, debugData.Analog[5] / 3, 3, 0);
}
if (debugData.Analog[5] > max_Altimeter) max_Altimeter = debugData.Analog[5];
 
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
draw_artificial_horizon(top_line + 2, bottom_line - 1, debugData.Analog[0], debugData.Analog[1]);
3368: 40 91 4b 01 lds r20, 0x014B
336c: 50 91 4c 01 lds r21, 0x014C
3370: 20 91 4d 01 lds r18, 0x014D
3374: 30 91 4e 01 lds r19, 0x014E
3378: 80 91 02 01 lds r24, 0x0102
337c: 60 91 03 01 lds r22, 0x0103
3380: 61 50 subi r22, 0x01 ; 1
3382: 8e 5f subi r24, 0xFE ; 254
3384: 0e 94 e6 08 call 0x11cc ; 0x11cc <draw_artificial_horizon>
}
 
// pre-bottom line
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
3388: 80 91 1d 01 lds r24, 0x011D
338c: 80 ff sbrs r24, 0
338e: 27 cf rjmp .-434 ; 0x31de <osd_fcmode_default+0xca>
//write_ndigit_number_s(3, bottom_line - 1, ampere, 4, 0);
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 3, 0);
3390: 20 91 03 01 lds r18, 0x0103
3394: 21 50 subi r18, 0x01 ; 1
3396: 80 91 37 01 lds r24, 0x0137
339a: 90 91 38 01 lds r25, 0x0138
339e: 6a e0 ldi r22, 0x0A ; 10
33a0: 70 e0 ldi r23, 0x00 ; 0
33a2: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
33a6: ab 01 movw r20, r22
33a8: 83 e0 ldi r24, 0x03 ; 3
33aa: 62 2f mov r22, r18
33ac: 23 e0 ldi r18, 0x03 ; 3
33ae: 30 e0 ldi r19, 0x00 ; 0
33b0: 00 e0 ldi r16, 0x00 ; 0
33b2: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
33b6: 10 91 03 01 lds r17, 0x0103
33ba: 11 50 subi r17, 0x01 ; 1
33bc: 60 91 3b 01 lds r22, 0x013B
33c0: 70 91 3c 01 lds r23, 0x013C
33c4: 80 91 3d 01 lds r24, 0x013D
33c8: 90 91 3e 01 lds r25, 0x013E
33cc: 2a e0 ldi r18, 0x0A ; 10
33ce: 30 e0 ldi r19, 0x00 ; 0
33d0: 40 e0 ldi r20, 0x00 ; 0
33d2: 50 e0 ldi r21, 0x00 ; 0
33d4: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
33d8: 8a e0 ldi r24, 0x0A ; 10
33da: 61 2f mov r22, r17
33dc: a9 01 movw r20, r18
33de: 24 e0 ldi r18, 0x04 ; 4
33e0: 30 e0 ldi r19, 0x00 ; 0
33e2: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
33e6: 80 91 1b 01 lds r24, 0x011B
33ea: 85 ff sbrs r24, 5
33ec: f8 ce rjmp .-528 ; 0x31de <osd_fcmode_default+0xca>
write_ndigit_number_u_10th(17, bottom_line - 1, s_volt, 3, 0);
33ee: 60 91 03 01 lds r22, 0x0103
33f2: 61 50 subi r22, 0x01 ; 1
33f4: 40 91 9f 02 lds r20, 0x029F
33f8: 50 91 a0 02 lds r21, 0x02A0
33fc: 81 e1 ldi r24, 0x11 ; 17
33fe: 23 e0 ldi r18, 0x03 ; 3
3400: 30 e0 ldi r19, 0x00 ; 0
3402: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
3406: eb ce rjmp .-554 ; 0x31de <osd_fcmode_default+0xca>
if (debugData.Analog[5] > 300 || debugData.Analog[5] < -300) {
// above 10m only write full meters
write_ndigit_number_s(23, top_line, debugData.Analog[5] / 30, 4, 0);
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(23, top_line, debugData.Analog[5] / 3, 3, 0);
3408: 80 91 55 01 lds r24, 0x0155
340c: 90 91 56 01 lds r25, 0x0156
3410: 63 e0 ldi r22, 0x03 ; 3
3412: 70 e0 ldi r23, 0x00 ; 0
3414: 0e 94 68 1c call 0x38d0 ; 0x38d0 <__udivmodhi4>
3418: ab 01 movw r20, r22
341a: 87 e1 ldi r24, 0x17 ; 23
341c: 60 91 02 01 lds r22, 0x0102
3420: 23 e0 ldi r18, 0x03 ; 3
3422: 30 e0 ldi r19, 0x00 ; 0
3424: 00 e0 ldi r16, 0x00 ; 0
3426: 0e 94 d3 05 call 0xba6 ; 0xba6 <write_ndigit_number_s_10th>
342a: be ce rjmp .-644 ; 0x31a8 <osd_fcmode_default+0x94>
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
write_char_xy(10, top_line, 0xCA); // RC-transmitter
write_char_xy(27, top_line, 0xCC); // small meters m height
write_char_xy(7, bottom_line, 0x9E); // small v
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
write_char_xy(7, bottom_line - 1, 0x9F); // small A
342c: 60 91 03 01 lds r22, 0x0103
3430: 61 50 subi r22, 0x01 ; 1
3432: 87 e0 ldi r24, 0x07 ; 7
3434: 4f e9 ldi r20, 0x9F ; 159
3436: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(14, bottom_line - 1, 0xB5); // mah
343a: 60 91 03 01 lds r22, 0x0103
343e: 61 50 subi r22, 0x01 ; 1
3440: 8e e0 ldi r24, 0x0E ; 14
3442: 45 eb ldi r20, 0xB5 ; 181
3444: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
3448: 80 91 1b 01 lds r24, 0x011B
344c: 85 fd sbrc r24, 5
344e: 03 c0 rjmp .+6 ; 0x3456 <osd_fcmode_default+0x342>
3450: 80 91 1d 01 lds r24, 0x011D
3454: 55 cf rjmp .-342 ; 0x3300 <osd_fcmode_default+0x1ec>
write_char_xy(21, bottom_line - 1, 0x9E); // small V
3456: 60 91 03 01 lds r22, 0x0103
345a: 61 50 subi r22, 0x01 ; 1
345c: 85 e1 ldi r24, 0x15 ; 21
345e: 4e e9 ldi r20, 0x9E ; 158
3460: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
3464: f5 cf rjmp .-22 ; 0x3450 <osd_fcmode_default+0x33c>
 
00003466 <osd_fcmode_jopl>:
 
// jopl Vario
static int16_t last_Altimeter = 0;
static int16_t Vario = 0;
 
int osd_fcmode_jopl() {
3466: 0f 93 push r16
3468: 1f 93 push r17
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
346a: 80 91 1b 01 lds r24, 0x011B
346e: 80 ff sbrs r24, 0
3470: 10 c1 rjmp .+544 ; 0x3692 <osd_fcmode_jopl+0x22c>
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
3472: 80 91 1d 01 lds r24, 0x011D
3476: 81 ff sbrs r24, 1
3478: 2f c1 rjmp .+606 ; 0x36d8 <osd_fcmode_jopl+0x272>
// end jopl
 
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
347a: 40 91 5f 01 lds r20, 0x015F
347e: 50 91 60 01 lds r21, 0x0160
3482: 87 e0 ldi r24, 0x07 ; 7
3484: 60 91 02 01 lds r22, 0x0102
3488: 23 e0 ldi r18, 0x03 ; 3
348a: 30 e0 ldi r19, 0x00 ; 0
348c: 00 e0 ldi r16, 0x00 ; 0
348e: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
3492: 80 91 5f 01 lds r24, 0x015F
3496: 90 91 60 01 lds r25, 0x0160
349a: 85 36 cpi r24, 0x65 ; 101
349c: 91 05 cpc r25, r1
349e: 08 f4 brcc .+2 ; 0x34a2 <osd_fcmode_jopl+0x3c>
34a0: 0b c1 rjmp .+534 ; 0x36b8 <osd_fcmode_jopl+0x252>
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (debugData.Analog[10] > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
34a2: 80 91 5f 01 lds r24, 0x015F
34a6: 90 91 60 01 lds r25, 0x0160
34aa: 85 36 cpi r24, 0x65 ; 101
34ac: 91 05 cpc r25, r1
34ae: 28 f0 brcs .+10 ; 0x34ba <osd_fcmode_jopl+0x54>
34b0: 80 91 01 01 lds r24, 0x0101
34b4: 85 36 cpi r24, 0x65 ; 101
34b6: 08 f4 brcc .+2 ; 0x34ba <osd_fcmode_jopl+0x54>
34b8: 62 c1 rjmp .+708 ; 0x377e <osd_fcmode_jopl+0x318>
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, 0);
}
 
// jopl ... compass
write_ndigit_number_u(13, top_line, debugData.Analog[8], 3, 0);
34ba: 40 91 5b 01 lds r20, 0x015B
34be: 50 91 5c 01 lds r21, 0x015C
34c2: 8d e0 ldi r24, 0x0D ; 13
34c4: 60 91 02 01 lds r22, 0x0102
34c8: 23 e0 ldi r18, 0x03 ; 3
34ca: 30 e0 ldi r19, 0x00 ; 0
34cc: 00 e0 ldi r16, 0x00 ; 0
34ce: 0e 94 6b 07 call 0xed6 ; 0xed6 <write_ndigit_number_u>
write_ascii_string_pgm(17, top_line, (const char *) (pgm_read_word(&(directions[heading_conv(debugData.Analog[8])]))));
34d2: 10 91 02 01 lds r17, 0x0102
34d6: 80 91 5b 01 lds r24, 0x015B
34da: 90 91 5c 01 lds r25, 0x015C
34de: 0e 94 9d 08 call 0x113a ; 0x113a <heading_conv>
34e2: e8 2f mov r30, r24
34e4: f0 e0 ldi r31, 0x00 ; 0
34e6: ee 0f add r30, r30
34e8: ff 1f adc r31, r31
34ea: e8 5f subi r30, 0xF8 ; 248
34ec: fe 4f sbci r31, 0xFE ; 254
34ee: 45 91 lpm r20, Z+
34f0: 54 91 lpm r21, Z+
34f2: 81 e1 ldi r24, 0x11 ; 17
34f4: 61 2f mov r22, r17
34f6: 0e 94 7e 05 call 0xafc ; 0xafc <write_ascii_string_pgm>
// end jopl
 
// jopl Altimeter modification
if ((debugData.Analog[5] > 100) || (debugData.Analog[5] < -100)) {
34fa: 80 91 55 01 lds r24, 0x0155
34fe: 90 91 56 01 lds r25, 0x0156
3502: 85 36 cpi r24, 0x65 ; 101
3504: 91 05 cpc r25, r1
3506: 40 f4 brcc .+16 ; 0x3518 <osd_fcmode_jopl+0xb2>
3508: 80 91 55 01 lds r24, 0x0155
350c: 90 91 56 01 lds r25, 0x0156
3510: 8c 59 subi r24, 0x9C ; 156
3512: 9f 4f sbci r25, 0xFF ; 255
3514: 08 f0 brcs .+2 ; 0x3518 <osd_fcmode_jopl+0xb2>
3516: 96 c1 rjmp .+812 ; 0x3844 <osd_fcmode_jopl+0x3de>
// above 10m only write full meters
write_ndigit_number_s(22, top_line, debugData.Analog[5] / 10, 4, 0);
3518: 80 91 55 01 lds r24, 0x0155
351c: 90 91 56 01 lds r25, 0x0156
3520: 6a e0 ldi r22, 0x0A ; 10
3522: 70 e0 ldi r23, 0x00 ; 0
3524: 0e 94 68 1c call 0x38d0 ; 0x38d0 <__udivmodhi4>
3528: ab 01 movw r20, r22
352a: 86 e1 ldi r24, 0x16 ; 22
352c: 60 91 02 01 lds r22, 0x0102
3530: 24 e0 ldi r18, 0x04 ; 4
3532: 30 e0 ldi r19, 0x00 ; 0
3534: 00 e0 ldi r16, 0x00 ; 0
3536: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(22, top_line, debugData.Analog[5], 3, 0);
}
Vario = debugData.Analog[5] - last_Altimeter;
353a: 40 91 55 01 lds r20, 0x0155
353e: 50 91 56 01 lds r21, 0x0156
3542: 80 91 43 01 lds r24, 0x0143
3546: 90 91 44 01 lds r25, 0x0144
354a: 48 1b sub r20, r24
354c: 59 0b sbc r21, r25
354e: 50 93 46 01 sts 0x0146, r21
3552: 40 93 45 01 sts 0x0145, r20
draw_variometer(27, top_line, Vario);
3556: 8b e1 ldi r24, 0x1B ; 27
3558: 60 91 02 01 lds r22, 0x0102
355c: 0e 94 c1 09 call 0x1382 ; 0x1382 <draw_variometer>
if (COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO) {
3560: 40 91 1b 01 lds r20, 0x011B
3564: 42 fd sbrc r20, 2
3566: 63 c1 rjmp .+710 ; 0x382e <osd_fcmode_jopl+0x3c8>
draw_big_variometer(27, 8, Vario);
}
last_Altimeter = debugData.Analog[5];
3568: 80 91 55 01 lds r24, 0x0155
356c: 90 91 56 01 lds r25, 0x0156
3570: 90 93 44 01 sts 0x0144, r25
3574: 80 93 43 01 sts 0x0143, r24
// end jopl
 
if (debugData.Analog[5] > max_Altimeter) max_Altimeter = debugData.Analog[5];
3578: 20 91 55 01 lds r18, 0x0155
357c: 30 91 56 01 lds r19, 0x0156
3580: 80 91 1f 01 lds r24, 0x011F
3584: 90 91 20 01 lds r25, 0x0120
3588: 82 17 cp r24, r18
358a: 93 07 cpc r25, r19
358c: 40 f4 brcc .+16 ; 0x359e <osd_fcmode_jopl+0x138>
358e: 80 91 55 01 lds r24, 0x0155
3592: 90 91 56 01 lds r25, 0x0156
3596: 90 93 20 01 sts 0x0120, r25
359a: 80 93 1f 01 sts 0x011F, r24
 
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
359e: 41 fd sbrc r20, 1
35a0: 35 c1 rjmp .+618 ; 0x380c <osd_fcmode_jopl+0x3a6>
draw_artificial_horizon(top_line + 2, bottom_line - 1, debugData.Analog[0], debugData.Analog[1]);
}
 
// jopl ... compass heading
// seccond line
draw_compass(11, top_line + 1, debugData.Analog[8]);
35a2: 40 91 5b 01 lds r20, 0x015B
35a6: 50 91 5c 01 lds r21, 0x015C
35aa: 60 91 02 01 lds r22, 0x0102
35ae: 6f 5f subi r22, 0xFF ; 255
35b0: 8b e0 ldi r24, 0x0B ; 11
35b2: 0e 94 55 0a call 0x14aa ; 0x14aa <draw_compass>
// end jopl
 
// pre-bottom line
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
35b6: 80 91 1d 01 lds r24, 0x011D
35ba: 80 fd sbrc r24, 0
35bc: eb c0 rjmp .+470 ; 0x3794 <osd_fcmode_jopl+0x32e>
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
write_ndigit_number_u_10th(17, bottom_line - 1, s_volt, 3, 0);
}
}
 
draw_battery(2, bottom_line, min_voltage, debugData.Analog[9], max_voltage);
35be: 20 91 5d 01 lds r18, 0x015D
35c2: 30 91 5e 01 lds r19, 0x015E
35c6: 82 e0 ldi r24, 0x02 ; 2
35c8: 60 91 03 01 lds r22, 0x0103
35cc: 40 91 19 01 lds r20, 0x0119
35d0: 00 91 1a 01 lds r16, 0x011A
35d4: 0e 94 17 0a call 0x142e ; 0x142e <draw_battery>
write_ndigit_number_u_10th(3, bottom_line, debugData.Analog[9], 3, 0);
35d8: 40 91 5d 01 lds r20, 0x015D
35dc: 50 91 5e 01 lds r21, 0x015E
35e0: 83 e0 ldi r24, 0x03 ; 3
35e2: 60 91 03 01 lds r22, 0x0103
35e6: 23 e0 ldi r18, 0x03 ; 3
35e8: 30 e0 ldi r19, 0x00 ; 0
35ea: 00 e0 ldi r16, 0x00 ; 0
35ec: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
if (debugData.Analog[9] <= min_voltage && last_UBat > min_voltage) {
35f0: 80 91 5d 01 lds r24, 0x015D
35f4: 90 91 5e 01 lds r25, 0x015E
35f8: 40 91 19 01 lds r20, 0x0119
35fc: 24 2f mov r18, r20
35fe: 30 e0 ldi r19, 0x00 ; 0
3600: 28 17 cp r18, r24
3602: 39 07 cpc r19, r25
3604: 28 f0 brcs .+10 ; 0x3610 <osd_fcmode_jopl+0x1aa>
3606: 80 91 00 01 lds r24, 0x0100
360a: 48 17 cp r20, r24
360c: 08 f4 brcc .+2 ; 0x3610 <osd_fcmode_jopl+0x1aa>
360e: 92 c0 rjmp .+292 ; 0x3734 <osd_fcmode_jopl+0x2ce>
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
} else if (debugData.Analog[9] > min_voltage && last_UBat < min_voltage) {
3610: 80 91 5d 01 lds r24, 0x015D
3614: 90 91 5e 01 lds r25, 0x015E
3618: 28 17 cp r18, r24
361a: 39 07 cpc r19, r25
361c: 40 f5 brcc .+80 ; 0x366e <osd_fcmode_jopl+0x208>
361e: 80 91 00 01 lds r24, 0x0100
3622: 84 17 cp r24, r20
3624: 20 f5 brcc .+72 ; 0x366e <osd_fcmode_jopl+0x208>
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, 0);
3626: 82 e0 ldi r24, 0x02 ; 2
3628: 60 91 03 01 lds r22, 0x0103
362c: 40 e0 ldi r20, 0x00 ; 0
362e: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3632: 83 e0 ldi r24, 0x03 ; 3
3634: 60 91 03 01 lds r22, 0x0103
3638: 40 e0 ldi r20, 0x00 ; 0
363a: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
363e: 84 e0 ldi r24, 0x04 ; 4
3640: 60 91 03 01 lds r22, 0x0103
3644: 40 e0 ldi r20, 0x00 ; 0
3646: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
364a: 85 e0 ldi r24, 0x05 ; 5
364c: 60 91 03 01 lds r22, 0x0103
3650: 40 e0 ldi r20, 0x00 ; 0
3652: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3656: 86 e0 ldi r24, 0x06 ; 6
3658: 60 91 03 01 lds r22, 0x0103
365c: 40 e0 ldi r20, 0x00 ; 0
365e: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3662: 87 e0 ldi r24, 0x07 ; 7
3664: 60 91 03 01 lds r22, 0x0103
3668: 40 e0 ldi r20, 0x00 ; 0
366a: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
}
 
// jopl ... Times
write_time(8, bottom_line, uptime);
366e: 40 91 12 01 lds r20, 0x0112
3672: 50 91 13 01 lds r21, 0x0113
3676: 88 e0 ldi r24, 0x08 ; 8
3678: 60 91 03 01 lds r22, 0x0103
367c: 0e 94 3a 08 call 0x1074 ; 0x1074 <write_time>
write_time(15, bottom_line, flytime_fc);
3680: 40 91 16 01 lds r20, 0x0116
3684: 50 91 17 01 lds r21, 0x0117
3688: 8f e0 ldi r24, 0x0F ; 15
368a: 60 91 03 01 lds r22, 0x0103
368e: 0e 94 3a 08 call 0x1074 ; 0x1074 <write_time>
// write_ndigit_number_s(22, bottom_line, debugData.Analog[5], 5, 0);
// end jopl
 
}
// remember last values
last_UBat = debugData.Analog[9];
3692: 80 91 5d 01 lds r24, 0x015D
3696: 90 91 5e 01 lds r25, 0x015E
369a: 80 93 00 01 sts 0x0100, r24
last_RC_Quality = debugData.Analog[10];
369e: 80 91 5f 01 lds r24, 0x015F
36a2: 90 91 60 01 lds r25, 0x0160
36a6: 80 93 01 01 sts 0x0101, r24
debugData.Analog[28]);//
debugData.Analog[29]);//
debugData.Analog[30]);// GPS_Nick
debugData.Analog[31]);// GPS_Roll
*/
seconds_since_last_data = 0;
36aa: 10 92 18 01 sts 0x0118, r1
 
return 0;
}
36ae: 80 e0 ldi r24, 0x00 ; 0
36b0: 90 e0 ldi r25, 0x00 ; 0
36b2: 1f 91 pop r17
36b4: 0f 91 pop r16
36b6: 08 95 ret
 
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
36b8: 80 91 01 01 lds r24, 0x0101
36bc: 85 36 cpi r24, 0x65 ; 101
36be: 08 f4 brcc .+2 ; 0x36c2 <osd_fcmode_jopl+0x25c>
36c0: f0 ce rjmp .-544 ; 0x34a2 <osd_fcmode_jopl+0x3c>
36c2: 17 e0 ldi r17, 0x07 ; 7
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
36c4: 81 2f mov r24, r17
36c6: 60 91 02 01 lds r22, 0x0102
36ca: 4f e4 ldi r20, 0x4F ; 79
36cc: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
36d0: 1f 5f subi r17, 0xFF ; 255
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
}
 
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
36d2: 1b 30 cpi r17, 0x0B ; 11
36d4: b9 f7 brne .-18 ; 0x36c4 <osd_fcmode_jopl+0x25e>
36d6: f1 ce rjmp .-542 ; 0x34ba <osd_fcmode_jopl+0x54>
 
int osd_fcmode_jopl() {
if (COSD_FLAGS_MODES & COSD_FLAG_HUD) {
// write icons at init or after menu/mode-switch
if (!(COSD_FLAGS_RUNTIME & COSD_ICONS_WRITTEN)) {
write_char_xy(10, top_line, 0xCA); // RC-transmitter
36d8: 8a e0 ldi r24, 0x0A ; 10
36da: 60 91 02 01 lds r22, 0x0102
36de: 4a ec ldi r20, 0xCA ; 202
36e0: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
 
// jopl ... compass
write_char_xy(16, top_line, 0xD0); // degree symbol
36e4: 80 e1 ldi r24, 0x10 ; 16
36e6: 60 91 02 01 lds r22, 0x0102
36ea: 40 ed ldi r20, 0xD0 ; 208
36ec: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
// end jopl
 
write_char_xy(26, top_line, 0xCC); // small meters m height
36f0: 8a e1 ldi r24, 0x1A ; 26
36f2: 60 91 02 01 lds r22, 0x0102
36f6: 4c ec ldi r20, 0xCC ; 204
36f8: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(7, bottom_line, 0x9E); // small v
36fc: 87 e0 ldi r24, 0x07 ; 7
36fe: 60 91 03 01 lds r22, 0x0103
3702: 4e e9 ldi r20, 0x9E ; 158
3704: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
 
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
3708: 80 91 1d 01 lds r24, 0x011D
370c: 80 fd sbrc r24, 0
370e: a7 c0 rjmp .+334 ; 0x385e <osd_fcmode_jopl+0x3f8>
write_char_xy(21, bottom_line - 1, 0x9E); // small V
}
}
 
// jopl ... Times
write_char_xy(14, bottom_line, 0xD1); // on clock
3710: 8e e0 ldi r24, 0x0E ; 14
3712: 60 91 03 01 lds r22, 0x0103
3716: 41 ed ldi r20, 0xD1 ; 209
3718: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(21, bottom_line, 0xD2); // fly clock
371c: 85 e1 ldi r24, 0x15 ; 21
371e: 60 91 03 01 lds r22, 0x0103
3722: 42 ed ldi r20, 0xD2 ; 210
3724: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
// end jopl
 
COSD_FLAGS_RUNTIME |= COSD_ICONS_WRITTEN;
3728: 80 91 1d 01 lds r24, 0x011D
372c: 82 60 ori r24, 0x02 ; 2
372e: 80 93 1d 01 sts 0x011D, r24
3732: a3 ce rjmp .-698 ; 0x347a <osd_fcmode_jopl+0x14>
 
draw_battery(2, bottom_line, min_voltage, debugData.Analog[9], max_voltage);
write_ndigit_number_u_10th(3, bottom_line, debugData.Analog[9], 3, 0);
if (debugData.Analog[9] <= min_voltage && last_UBat > min_voltage) {
for (uint8_t x = 2; x < 8; x++)
write_char_att_xy(x, bottom_line, BLINK);
3734: 82 e0 ldi r24, 0x02 ; 2
3736: 60 91 03 01 lds r22, 0x0103
373a: 4f e4 ldi r20, 0x4F ; 79
373c: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3740: 83 e0 ldi r24, 0x03 ; 3
3742: 60 91 03 01 lds r22, 0x0103
3746: 4f e4 ldi r20, 0x4F ; 79
3748: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
374c: 84 e0 ldi r24, 0x04 ; 4
374e: 60 91 03 01 lds r22, 0x0103
3752: 4f e4 ldi r20, 0x4F ; 79
3754: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3758: 85 e0 ldi r24, 0x05 ; 5
375a: 60 91 03 01 lds r22, 0x0103
375e: 4f e4 ldi r20, 0x4F ; 79
3760: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3764: 86 e0 ldi r24, 0x06 ; 6
3766: 60 91 03 01 lds r22, 0x0103
376a: 4f e4 ldi r20, 0x4F ; 79
376c: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
3770: 87 e0 ldi r24, 0x07 ; 7
3772: 60 91 03 01 lds r22, 0x0103
3776: 4f e4 ldi r20, 0x4F ; 79
3778: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
377c: 78 cf rjmp .-272 ; 0x366e <osd_fcmode_jopl+0x208>
 
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (debugData.Analog[10] > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
377e: 17 e0 ldi r17, 0x07 ; 7
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, 0);
3780: 81 2f mov r24, r17
3782: 60 91 02 01 lds r22, 0x0102
3786: 40 e0 ldi r20, 0x00 ; 0
3788: 0e 94 91 08 call 0x1122 ; 0x1122 <write_char_att_xy>
378c: 1f 5f subi r17, 0xFF ; 255
write_ndigit_number_u(7, top_line, debugData.Analog[10], 3, 0);
if (debugData.Analog[10] <= RCLVL_WRN && last_RC_Quality > RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
write_char_att_xy(7 + x, top_line, BLINK);
} else if (debugData.Analog[10] > RCLVL_WRN && last_RC_Quality <= RCLVL_WRN) {
for (uint8_t x = 0; x < 4; x++)
378e: 1b 30 cpi r17, 0x0B ; 11
3790: b9 f7 brne .-18 ; 0x3780 <osd_fcmode_jopl+0x31a>
3792: 93 ce rjmp .-730 ; 0x34ba <osd_fcmode_jopl+0x54>
// end jopl
 
// pre-bottom line
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
//write_ndigit_number_s(3, bottom_line - 1, ampere, 4, 0);
write_ndigit_number_u_10th(3, bottom_line - 1, ampere / 10, 3, 0);
3794: 20 91 03 01 lds r18, 0x0103
3798: 21 50 subi r18, 0x01 ; 1
379a: 80 91 37 01 lds r24, 0x0137
379e: 90 91 38 01 lds r25, 0x0138
37a2: 6a e0 ldi r22, 0x0A ; 10
37a4: 70 e0 ldi r23, 0x00 ; 0
37a6: 0e 94 7c 1c call 0x38f8 ; 0x38f8 <__divmodhi4>
37aa: ab 01 movw r20, r22
37ac: 83 e0 ldi r24, 0x03 ; 3
37ae: 62 2f mov r22, r18
37b0: 23 e0 ldi r18, 0x03 ; 3
37b2: 30 e0 ldi r19, 0x00 ; 0
37b4: 00 e0 ldi r16, 0x00 ; 0
37b6: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
write_ndigit_number_s(10, bottom_line - 1, ampere_wasted / 10, 4, 0);
37ba: 10 91 03 01 lds r17, 0x0103
37be: 11 50 subi r17, 0x01 ; 1
37c0: 60 91 3b 01 lds r22, 0x013B
37c4: 70 91 3c 01 lds r23, 0x013C
37c8: 80 91 3d 01 lds r24, 0x013D
37cc: 90 91 3e 01 lds r25, 0x013E
37d0: 2a e0 ldi r18, 0x0A ; 10
37d2: 30 e0 ldi r19, 0x00 ; 0
37d4: 40 e0 ldi r20, 0x00 ; 0
37d6: 50 e0 ldi r21, 0x00 ; 0
37d8: 0e 94 b1 1c call 0x3962 ; 0x3962 <__divmodsi4>
37dc: 8a e0 ldi r24, 0x0A ; 10
37de: 61 2f mov r22, r17
37e0: a9 01 movw r20, r18
37e2: 24 e0 ldi r18, 0x04 ; 4
37e4: 30 e0 ldi r19, 0x00 ; 0
37e6: 0e 94 19 07 call 0xe32 ; 0xe32 <write_ndigit_number_s>
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
37ea: 80 91 1b 01 lds r24, 0x011B
37ee: 85 ff sbrs r24, 5
37f0: e6 ce rjmp .-564 ; 0x35be <osd_fcmode_jopl+0x158>
write_ndigit_number_u_10th(17, bottom_line - 1, s_volt, 3, 0);
37f2: 60 91 03 01 lds r22, 0x0103
37f6: 61 50 subi r22, 0x01 ; 1
37f8: 40 91 9f 02 lds r20, 0x029F
37fc: 50 91 a0 02 lds r21, 0x02A0
3800: 81 e1 ldi r24, 0x11 ; 17
3802: 23 e0 ldi r18, 0x03 ; 3
3804: 30 e0 ldi r19, 0x00 ; 0
3806: 0e 94 76 06 call 0xcec ; 0xcec <write_ndigit_number_u_10th>
380a: d9 ce rjmp .-590 ; 0x35be <osd_fcmode_jopl+0x158>
// end jopl
 
if (debugData.Analog[5] > max_Altimeter) max_Altimeter = debugData.Analog[5];
 
if (COSD_FLAGS_MODES & COSD_FLAG_ARTHORIZON) {
draw_artificial_horizon(top_line + 2, bottom_line - 1, debugData.Analog[0], debugData.Analog[1]);
380c: 40 91 4b 01 lds r20, 0x014B
3810: 50 91 4c 01 lds r21, 0x014C
3814: 20 91 4d 01 lds r18, 0x014D
3818: 30 91 4e 01 lds r19, 0x014E
381c: 80 91 02 01 lds r24, 0x0102
3820: 60 91 03 01 lds r22, 0x0103
3824: 61 50 subi r22, 0x01 ; 1
3826: 8e 5f subi r24, 0xFE ; 254
3828: 0e 94 e6 08 call 0x11cc ; 0x11cc <draw_artificial_horizon>
382c: ba ce rjmp .-652 ; 0x35a2 <osd_fcmode_jopl+0x13c>
write_ndigit_number_s_10th(22, top_line, debugData.Analog[5], 3, 0);
}
Vario = debugData.Analog[5] - last_Altimeter;
draw_variometer(27, top_line, Vario);
if (COSD_FLAGS_MODES & COSD_FLAG_BIGVARIO) {
draw_big_variometer(27, 8, Vario);
382e: 40 91 45 01 lds r20, 0x0145
3832: 50 91 46 01 lds r21, 0x0146
3836: 8b e1 ldi r24, 0x1B ; 27
3838: 68 e0 ldi r22, 0x08 ; 8
383a: 0e 94 84 0a call 0x1508 ; 0x1508 <draw_big_variometer>
383e: 40 91 1b 01 lds r20, 0x011B
3842: 92 ce rjmp .-732 ; 0x3568 <osd_fcmode_jopl+0x102>
if ((debugData.Analog[5] > 100) || (debugData.Analog[5] < -100)) {
// above 10m only write full meters
write_ndigit_number_s(22, top_line, debugData.Analog[5] / 10, 4, 0);
} else {
// up to 10m write meters.dm
write_ndigit_number_s_10th(22, top_line, debugData.Analog[5], 3, 0);
3844: 40 91 55 01 lds r20, 0x0155
3848: 50 91 56 01 lds r21, 0x0156
384c: 86 e1 ldi r24, 0x16 ; 22
384e: 60 91 02 01 lds r22, 0x0102
3852: 23 e0 ldi r18, 0x03 ; 3
3854: 30 e0 ldi r19, 0x00 ; 0
3856: 00 e0 ldi r16, 0x00 ; 0
3858: 0e 94 d3 05 call 0xba6 ; 0xba6 <write_ndigit_number_s_10th>
385c: 6e ce rjmp .-804 ; 0x353a <osd_fcmode_jopl+0xd4>
 
write_char_xy(26, top_line, 0xCC); // small meters m height
write_char_xy(7, bottom_line, 0x9E); // small v
 
if (COSD_FLAGS_RUNTIME & COSD_FLAG_STROMREC) {
write_char_xy(7, bottom_line - 1, 0x9F); // small A
385e: 60 91 03 01 lds r22, 0x0103
3862: 61 50 subi r22, 0x01 ; 1
3864: 87 e0 ldi r24, 0x07 ; 7
3866: 4f e9 ldi r20, 0x9F ; 159
3868: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
write_char_xy(14, bottom_line - 1, 0xB5); // mah
386c: 60 91 03 01 lds r22, 0x0103
3870: 61 50 subi r22, 0x01 ; 1
3872: 8e e0 ldi r24, 0x0E ; 14
3874: 45 eb ldi r20, 0xB5 ; 181
3876: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
if (COSD_FLAGS_MODES & COSD_FLAG_STROMVOLT) {
387a: 80 91 1b 01 lds r24, 0x011B
387e: 85 ff sbrs r24, 5
3880: 47 cf rjmp .-370 ; 0x3710 <osd_fcmode_jopl+0x2aa>
write_char_xy(21, bottom_line - 1, 0x9E); // small V
3882: 60 91 03 01 lds r22, 0x0103
3886: 61 50 subi r22, 0x01 ; 1
3888: 85 e1 ldi r24, 0x15 ; 21
388a: 4e e9 ldi r20, 0x9E ; 158
388c: 0e 94 04 05 call 0xa08 ; 0xa08 <write_char_xy>
3890: 3f cf rjmp .-386 ; 0x3710 <osd_fcmode_jopl+0x2aa>
 
00003892 <__mulsi3>:
3892: 62 9f mul r22, r18
3894: d0 01 movw r26, r0
3896: 73 9f mul r23, r19
3898: f0 01 movw r30, r0
389a: 82 9f mul r24, r18
389c: e0 0d add r30, r0
389e: f1 1d adc r31, r1
38a0: 64 9f mul r22, r20
38a2: e0 0d add r30, r0
38a4: f1 1d adc r31, r1
38a6: 92 9f mul r25, r18
38a8: f0 0d add r31, r0
38aa: 83 9f mul r24, r19
38ac: f0 0d add r31, r0
38ae: 74 9f mul r23, r20
38b0: f0 0d add r31, r0
38b2: 65 9f mul r22, r21
38b4: f0 0d add r31, r0
38b6: 99 27 eor r25, r25
38b8: 72 9f mul r23, r18
38ba: b0 0d add r27, r0
38bc: e1 1d adc r30, r1
38be: f9 1f adc r31, r25
38c0: 63 9f mul r22, r19
38c2: b0 0d add r27, r0
38c4: e1 1d adc r30, r1
38c6: f9 1f adc r31, r25
38c8: bd 01 movw r22, r26
38ca: cf 01 movw r24, r30
38cc: 11 24 eor r1, r1
38ce: 08 95 ret
 
000038d0 <__udivmodhi4>:
38d0: aa 1b sub r26, r26
38d2: bb 1b sub r27, r27
38d4: 51 e1 ldi r21, 0x11 ; 17
38d6: 07 c0 rjmp .+14 ; 0x38e6 <__udivmodhi4_ep>
 
000038d8 <__udivmodhi4_loop>:
38d8: aa 1f adc r26, r26
38da: bb 1f adc r27, r27
38dc: a6 17 cp r26, r22
38de: b7 07 cpc r27, r23
38e0: 10 f0 brcs .+4 ; 0x38e6 <__udivmodhi4_ep>
38e2: a6 1b sub r26, r22
38e4: b7 0b sbc r27, r23
 
000038e6 <__udivmodhi4_ep>:
38e6: 88 1f adc r24, r24
38e8: 99 1f adc r25, r25
38ea: 5a 95 dec r21
38ec: a9 f7 brne .-22 ; 0x38d8 <__udivmodhi4_loop>
38ee: 80 95 com r24
38f0: 90 95 com r25
38f2: bc 01 movw r22, r24
38f4: cd 01 movw r24, r26
38f6: 08 95 ret
 
000038f8 <__divmodhi4>:
38f8: 97 fb bst r25, 7
38fa: 09 2e mov r0, r25
38fc: 07 26 eor r0, r23
38fe: 0a d0 rcall .+20 ; 0x3914 <__divmodhi4_neg1>
3900: 77 fd sbrc r23, 7
3902: 04 d0 rcall .+8 ; 0x390c <__divmodhi4_neg2>
3904: e5 df rcall .-54 ; 0x38d0 <__udivmodhi4>
3906: 06 d0 rcall .+12 ; 0x3914 <__divmodhi4_neg1>
3908: 00 20 and r0, r0
390a: 1a f4 brpl .+6 ; 0x3912 <__divmodhi4_exit>
 
0000390c <__divmodhi4_neg2>:
390c: 70 95 com r23
390e: 61 95 neg r22
3910: 7f 4f sbci r23, 0xFF ; 255
 
00003912 <__divmodhi4_exit>:
3912: 08 95 ret
 
00003914 <__divmodhi4_neg1>:
3914: f6 f7 brtc .-4 ; 0x3912 <__divmodhi4_exit>
3916: 90 95 com r25
3918: 81 95 neg r24
391a: 9f 4f sbci r25, 0xFF ; 255
391c: 08 95 ret
 
0000391e <__udivmodsi4>:
391e: a1 e2 ldi r26, 0x21 ; 33
3920: 1a 2e mov r1, r26
3922: aa 1b sub r26, r26
3924: bb 1b sub r27, r27
3926: fd 01 movw r30, r26
3928: 0d c0 rjmp .+26 ; 0x3944 <__udivmodsi4_ep>
 
0000392a <__udivmodsi4_loop>:
392a: aa 1f adc r26, r26
392c: bb 1f adc r27, r27
392e: ee 1f adc r30, r30
3930: ff 1f adc r31, r31
3932: a2 17 cp r26, r18
3934: b3 07 cpc r27, r19
3936: e4 07 cpc r30, r20
3938: f5 07 cpc r31, r21
393a: 20 f0 brcs .+8 ; 0x3944 <__udivmodsi4_ep>
393c: a2 1b sub r26, r18
393e: b3 0b sbc r27, r19
3940: e4 0b sbc r30, r20
3942: f5 0b sbc r31, r21
 
00003944 <__udivmodsi4_ep>:
3944: 66 1f adc r22, r22
3946: 77 1f adc r23, r23
3948: 88 1f adc r24, r24
394a: 99 1f adc r25, r25
394c: 1a 94 dec r1
394e: 69 f7 brne .-38 ; 0x392a <__udivmodsi4_loop>
3950: 60 95 com r22
3952: 70 95 com r23
3954: 80 95 com r24
3956: 90 95 com r25
3958: 9b 01 movw r18, r22
395a: ac 01 movw r20, r24
395c: bd 01 movw r22, r26
395e: cf 01 movw r24, r30
3960: 08 95 ret
 
00003962 <__divmodsi4>:
3962: 97 fb bst r25, 7
3964: 09 2e mov r0, r25
3966: 05 26 eor r0, r21
3968: 0e d0 rcall .+28 ; 0x3986 <__divmodsi4_neg1>
396a: 57 fd sbrc r21, 7
396c: 04 d0 rcall .+8 ; 0x3976 <__divmodsi4_neg2>
396e: d7 df rcall .-82 ; 0x391e <__udivmodsi4>
3970: 0a d0 rcall .+20 ; 0x3986 <__divmodsi4_neg1>
3972: 00 1c adc r0, r0
3974: 38 f4 brcc .+14 ; 0x3984 <__divmodsi4_exit>
 
00003976 <__divmodsi4_neg2>:
3976: 50 95 com r21
3978: 40 95 com r20
397a: 30 95 com r19
397c: 21 95 neg r18
397e: 3f 4f sbci r19, 0xFF ; 255
3980: 4f 4f sbci r20, 0xFF ; 255
3982: 5f 4f sbci r21, 0xFF ; 255
 
00003984 <__divmodsi4_exit>:
3984: 08 95 ret
 
00003986 <__divmodsi4_neg1>:
3986: f6 f7 brtc .-4 ; 0x3984 <__divmodsi4_exit>
3988: 90 95 com r25
398a: 80 95 com r24
398c: 70 95 com r23
398e: 61 95 neg r22
3990: 7f 4f sbci r23, 0xFF ; 255
3992: 8f 4f sbci r24, 0xFF ; 255
3994: 9f 4f sbci r25, 0xFF ; 255
3996: 08 95 ret
 
00003998 <itoa>:
3998: fb 01 movw r30, r22
399a: 9f 01 movw r18, r30
399c: e8 94 clt
399e: 42 30 cpi r20, 0x02 ; 2
39a0: c4 f0 brlt .+48 ; 0x39d2 <itoa+0x3a>
39a2: 45 32 cpi r20, 0x25 ; 37
39a4: b4 f4 brge .+44 ; 0x39d2 <itoa+0x3a>
39a6: 4a 30 cpi r20, 0x0A ; 10
39a8: 29 f4 brne .+10 ; 0x39b4 <itoa+0x1c>
39aa: 97 fb bst r25, 7
39ac: 1e f4 brtc .+6 ; 0x39b4 <itoa+0x1c>
39ae: 90 95 com r25
39b0: 81 95 neg r24
39b2: 9f 4f sbci r25, 0xFF ; 255
39b4: 64 2f mov r22, r20
39b6: 77 27 eor r23, r23
39b8: 0e 94 68 1c call 0x38d0 ; 0x38d0 <__udivmodhi4>
39bc: 80 5d subi r24, 0xD0 ; 208
39be: 8a 33 cpi r24, 0x3A ; 58
39c0: 0c f0 brlt .+2 ; 0x39c4 <itoa+0x2c>
39c2: 89 5d subi r24, 0xD9 ; 217
39c4: 81 93 st Z+, r24
39c6: cb 01 movw r24, r22
39c8: 00 97 sbiw r24, 0x00 ; 0
39ca: a1 f7 brne .-24 ; 0x39b4 <itoa+0x1c>
39cc: 16 f4 brtc .+4 ; 0x39d2 <itoa+0x3a>
39ce: 5d e2 ldi r21, 0x2D ; 45
39d0: 51 93 st Z+, r21
39d2: 10 82 st Z, r1
39d4: c9 01 movw r24, r18
39d6: 0c 94 02 1d jmp 0x3a04 ; 0x3a04 <strrev>
 
000039da <__eerd_byte_m162>:
39da: e1 99 sbic 0x1c, 1 ; 28
39dc: fe cf rjmp .-4 ; 0x39da <__eerd_byte_m162>
39de: 9f bb out 0x1f, r25 ; 31
39e0: 8e bb out 0x1e, r24 ; 30
39e2: e0 9a sbi 0x1c, 0 ; 28
39e4: 99 27 eor r25, r25
39e6: 8d b3 in r24, 0x1d ; 29
39e8: 08 95 ret
 
000039ea <__eewr_byte_m162>:
39ea: 26 2f mov r18, r22
 
000039ec <__eewr_r18_m162>:
39ec: e1 99 sbic 0x1c, 1 ; 28
39ee: fe cf rjmp .-4 ; 0x39ec <__eewr_r18_m162>
39f0: 9f bb out 0x1f, r25 ; 31
39f2: 8e bb out 0x1e, r24 ; 30
39f4: 2d bb out 0x1d, r18 ; 29
39f6: 0f b6 in r0, 0x3f ; 63
39f8: f8 94 cli
39fa: e2 9a sbi 0x1c, 2 ; 28
39fc: e1 9a sbi 0x1c, 1 ; 28
39fe: 0f be out 0x3f, r0 ; 63
3a00: 01 96 adiw r24, 0x01 ; 1
3a02: 08 95 ret
 
00003a04 <strrev>:
3a04: dc 01 movw r26, r24
3a06: fc 01 movw r30, r24
3a08: 67 2f mov r22, r23
3a0a: 71 91 ld r23, Z+
3a0c: 77 23 and r23, r23
3a0e: e1 f7 brne .-8 ; 0x3a08 <strrev+0x4>
3a10: 32 97 sbiw r30, 0x02 ; 2
3a12: 04 c0 rjmp .+8 ; 0x3a1c <strrev+0x18>
3a14: 7c 91 ld r23, X
3a16: 6d 93 st X+, r22
3a18: 70 83 st Z, r23
3a1a: 62 91 ld r22, -Z
3a1c: ae 17 cp r26, r30
3a1e: bf 07 cpc r27, r31
3a20: c8 f3 brcs .-14 ; 0x3a14 <strrev+0x10>
3a22: 08 95 ret
 
00003a24 <_exit>:
3a24: f8 94 cli
 
00003a26 <__stop_program>:
3a26: ff cf rjmp .-2 ; 0x3a26 <__stop_program>
/C-OSD/trunk/default/C-OSD.map
0,0 → 1,787
Archive member included because of file (symbol)
 
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_mulsi3.o)
max7456_software_spi.o (__mulsi3)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodhi4.o)
max7456_software_spi.o (__udivmodhi4)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_divmodhi4.o)
osd_helpers.o (__divmodhi4)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodsi4.o)
osd_ncmode_default.o (__udivmodsi4)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_divmodsi4.o)
max7456_software_spi.o (__divmodsi4)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_exit.o)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm162.o (exit)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_copy_data.o)
main.o (__do_copy_data)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_clear_bss.o)
main.o (__do_clear_bss)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(itoa.o)
max7456_software_spi.o (itoa)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(eerd_byte_atmega162.o)
config.o (__eerd_byte_m162)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(eewr_byte_atmega162.o)
config.o (__eewr_byte_m162)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(strrev.o)
c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(itoa.o) (strrev)
 
Allocating common symbols
Common symbol size file
 
rxd_buffer 0x96 usart1.o
wasted_ampere_offset
0x2 main.o
debugData 0x42 main.o
SPI_buffer 0xb main.o
mode 0x2 config.o
conv_array 0x7 max7456_software_spi.o
s_volt 0x2 spi.o
setsReceived 0x2 main.o
txd_buffer 0x14 usart1.o
altimeter_offset 0x2 main.o
naviData 0x52 main.o
 
Memory Configuration
 
Name Origin Length Attributes
text 0x00000000 0x00020000 xr
data 0x00800060 0x0000ffa0 rw !x
eeprom 0x00810000 0x00010000 rw !x
fuse 0x00820000 0x00000400 rw !x
lock 0x00830000 0x00000400 rw !x
signature 0x00840000 0x00000400 rw !x
*default* 0x00000000 0xffffffff
 
Linker script and memory map
 
Address of section .data set to 0x800100
LOAD c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm162.o
LOAD main.o
LOAD usart1.o
LOAD max7456_software_spi.o
LOAD osd_helpers.o
LOAD config.o
LOAD spi.o
LOAD buttons.o
LOAD ppm.o
LOAD osd_ncmode_default.o
LOAD osd_ncmode_minimal.o
LOAD osd_fcmode_default.o
LOAD osd_fcmode_jopl.o
LOAD characters.o
LOAD c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a
LOAD c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a
LOAD c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a
 
.hash
*(.hash)
 
.dynsym
*(.dynsym)
 
.dynstr
*(.dynstr)
 
.gnu.version
*(.gnu.version)
 
.gnu.version_d
*(.gnu.version_d)
 
.gnu.version_r
*(.gnu.version_r)
 
.rel.init
*(.rel.init)
 
.rela.init
*(.rela.init)
 
.rel.text
*(.rel.text)
*(.rel.text.*)
*(.rel.gnu.linkonce.t*)
 
.rela.text
*(.rela.text)
*(.rela.text.*)
*(.rela.gnu.linkonce.t*)
 
.rel.fini
*(.rel.fini)
 
.rela.fini
*(.rela.fini)
 
.rel.rodata
*(.rel.rodata)
*(.rel.rodata.*)
*(.rel.gnu.linkonce.r*)
 
.rela.rodata
*(.rela.rodata)
*(.rela.rodata.*)
*(.rela.gnu.linkonce.r*)
 
.rel.data
*(.rel.data)
*(.rel.data.*)
*(.rel.gnu.linkonce.d*)
 
.rela.data
*(.rela.data)
*(.rela.data.*)
*(.rela.gnu.linkonce.d*)
 
.rel.ctors
*(.rel.ctors)
 
.rela.ctors
*(.rela.ctors)
 
.rel.dtors
*(.rel.dtors)
 
.rela.dtors
*(.rela.dtors)
 
.rel.got
*(.rel.got)
 
.rela.got
*(.rela.got)
 
.rel.bss
*(.rel.bss)
 
.rela.bss
*(.rela.bss)
 
.rel.plt
*(.rel.plt)
 
.rela.plt
*(.rela.plt)
 
.text 0x00000000 0x3a28
*(.vectors)
.vectors 0x00000000 0x70 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm162.o
0x00000000 __vectors
*(.vectors)
*(.progmem.gcc*)
*(.progmem*)
.progmem.data 0x00000070 0xdb main.o
0x00000138 fcdisplaymodes
0x000000c4 stats_item_6
0x000000e0 stats_item_pointers
0x000000fc str_SW
0x0000009a stats_item_3
0x00000128 str_3
0x000000a8 stats_item_4
0x00000130 ncdisplaymodes
0x000000f9 str_S
0x00000070 stats_item_0
0x000000d2 stats_item_7
0x00000118 str_1
0x00000102 str_NW
0x000000f0 str_NE
0x00000120 str_2
0x000000f6 str_SE
0x00000105 str_N
0x00000108 directions
0x000000b6 stats_item_5
0x0000008c stats_item_2
0x0000007e stats_item_1
0x000000ff str_W
0x000000f3 str_E
.progmem.data 0x0000014b 0x99 osd_helpers.o
0x00000169 vario_06
0x0000015a vario_03
0x00000164 vario_05
0x00000182 vario_11
0x00000173 vario_08
0x00000191 vario_14
0x0000016e vario_07
0x0000014b vario_00
0x00000187 vario_12
0x00000178 vario_09
0x00000155 vario_02
0x0000015f vario_04
0x00000150 vario_01
0x0000018c vario_13
0x0000017d vario_10
0x00000196 vario_pnt
.progmem.data 0x000001e4 0x1a7 config.o
0x000001e4 VM_PAL
0x000001e9 VM_NTSC
0x0000021f ee_msg
0x000001ee ee_message0
0x00000207 ee_message1
0x0000038c . = ALIGN (0x2)
*fill* 0x0000038b 0x1 00
0x0000038c __trampolines_start = .
*(.trampolines)
.trampolines 0x0000038c 0x0 linker stubs
*(.trampolines*)
0x0000038c __trampolines_end = .
*(.jumptables)
*(.jumptables*)
*(.lowtext)
*(.lowtext*)
0x0000038c __ctors_start = .
*(.ctors)
0x0000038c __ctors_end = .
0x0000038c __dtors_start = .
*(.dtors)
0x0000038c __dtors_end = .
SORT(*)(.ctors)
SORT(*)(.dtors)
*(.init0)
.init0 0x0000038c 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm162.o
0x0000038c __init
*(.init0)
*(.init1)
*(.init1)
*(.init2)
.init2 0x0000038c 0xc c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm162.o
*(.init2)
*(.init3)
*(.init3)
*(.init4)
.init4 0x00000398 0x16 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_copy_data.o)
0x00000398 __do_copy_data
.init4 0x000003ae 0x10 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_clear_bss.o)
0x000003ae __do_clear_bss
*(.init4)
*(.init5)
*(.init5)
*(.init6)
*(.init6)
*(.init7)
*(.init7)
*(.init8)
*(.init8)
*(.init9)
.init9 0x000003be 0x8 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm162.o
*(.init9)
*(.text)
.text 0x000003c6 0x4 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm162.o
0x000003c6 __vector_1
0x000003c6 __vector_24
0x000003c6 __vector_12
0x000003c6 __bad_interrupt
0x000003c6 __vector_6
0x000003c6 __vector_23
0x000003c6 __vector_25
0x000003c6 __vector_11
0x000003c6 __vector_13
0x000003c6 __vector_17
0x000003c6 __vector_19
0x000003c6 __vector_7
0x000003c6 __vector_27
0x000003c6 __vector_5
0x000003c6 __vector_4
0x000003c6 __vector_9
0x000003c6 __vector_2
0x000003c6 __vector_21
0x000003c6 __vector_15
0x000003c6 __vector_8
0x000003c6 __vector_26
0x000003c6 __vector_14
0x000003c6 __vector_10
.text 0x000003ca 0x298 main.o
0x000003ca __vector_default
0x000003e0 main
0x000005b2 __vector_16
.text 0x00000662 0x2ba usart1.o
0x000006b4 __vector_22
0x0000067c usart1_EnableTXD
0x00000662 usart1_init
0x0000068e usart1_puts_pgm
0x00000672 usart1_DisableTXD
0x00000860 Decode64
0x00000686 usart1_putc
0x000006c8 __vector_20
.text 0x0000091c 0x81e max7456_software_spi.o
0x00000b5a write_string_pgm_down
0x0000091c spi_send
0x00000ba6 write_ndigit_number_s_10th
0x00000aa6 write_ascii_string
0x00001122 write_char_att_xy
0x000010fa write_char_att
0x00000cec write_ndigit_number_u_10th
0x00000afc write_ascii_string_pgm
0x000010ea clear
0x00001074 write_time
0x00000a20 write_ascii_char
0x00000a08 write_char_xy
0x00000f7a write_gps_pos
0x00000e32 write_ndigit_number_s
0x00000ed6 write_ndigit_number_u
0x000009e2 write_char
0x0000095e spi_send_byte
.text 0x0000113a 0x3fe osd_helpers.o
0x0000119e heading_fine_conv
0x0000113a heading_conv
0x000011cc draw_artificial_horizon
0x0000142e draw_battery
0x000014aa draw_compass
0x00001508 draw_big_variometer
0x00001382 draw_variometer
.text 0x00001538 0x6b2 config.o
0x000019e2 init_cosd
0x00001738 config_menu
0x0000155a config_menu_drawings
0x00001538 onoff
0x0000197a get_eeprom
0x000016ce config_menu_doclick
0x000016fe save_eeprom
.text 0x00001bea 0xc6 spi.o
0x00001ca6 spi_send_next
0x00001c90 StartTransfer
0x00001bea SpiMasterInit
0x00001c84 TransferIsBusy
0x00001c0e __vector_18
.text 0x00001cb0 0x80 buttons.o
0x00001cf2 s2_pressed
0x00001cb0 s1_pressed
.text 0x00001d30 0xe8 ppm.o
0x00001d46 __vector_3
0x00001d30 ppm_init
.text 0x00001e18 0xbec osd_ncmode_default.o
0x00001e18 osd_ncmode_default
.text 0x00002a04 0x710 osd_ncmode_minimal.o
0x00002a04 osd_ncmode_minimal
.text 0x00003114 0x352 osd_fcmode_default.o
0x00003114 osd_fcmode_default
.text 0x00003466 0x42c osd_fcmode_jopl.o
0x00003466 osd_fcmode_jopl
.text 0x00003892 0x0 characters.o
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_mulsi3.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodhi4.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_divmodhi4.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodsi4.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_divmodsi4.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_exit.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_copy_data.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_clear_bss.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(itoa.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(eerd_byte_atmega162.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(eewr_byte_atmega162.o)
.text 0x00003892 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(strrev.o)
0x00003892 . = ALIGN (0x2)
*(.text.*)
.text.libgcc 0x00003892 0x3e c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_mulsi3.o)
0x00003892 __mulsi3
.text.libgcc 0x000038d0 0x28 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodhi4.o)
0x000038d0 __udivmodhi4
.text.libgcc 0x000038f8 0x26 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_divmodhi4.o)
0x000038f8 __divmodhi4
0x000038f8 _div
.text.libgcc 0x0000391e 0x44 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodsi4.o)
0x0000391e __udivmodsi4
.text.libgcc 0x00003962 0x36 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_divmodsi4.o)
0x00003962 __divmodsi4
.text.libgcc 0x00003998 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_exit.o)
.text.libgcc 0x00003998 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_copy_data.o)
.text.libgcc 0x00003998 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_clear_bss.o)
.text.avr-libc
0x00003998 0x42 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(itoa.o)
0x00003998 itoa
.text.avr-libc
0x000039da 0x10 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(eerd_byte_atmega162.o)
0x000039da __eerd_byte_m162
.text.avr-libc
0x000039ea 0x1a c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(eewr_byte_atmega162.o)
0x000039ec __eewr_r18_m162
0x000039ea __eewr_byte_m162
.text.avr-libc
0x00003a04 0x20 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(strrev.o)
0x00003a04 strrev
0x00003a24 . = ALIGN (0x2)
*(.fini9)
.fini9 0x00003a24 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_exit.o)
0x00003a24 exit
0x00003a24 _exit
*(.fini9)
*(.fini8)
*(.fini8)
*(.fini7)
*(.fini7)
*(.fini6)
*(.fini6)
*(.fini5)
*(.fini5)
*(.fini4)
*(.fini4)
*(.fini3)
*(.fini3)
*(.fini2)
*(.fini2)
*(.fini1)
*(.fini1)
*(.fini0)
.fini0 0x00003a24 0x4 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_exit.o)
*(.fini0)
0x00003a28 _etext = .
 
.data 0x00800100 0x12 load address 0x00003a28
0x00800100 PROVIDE (__data_start, .)
*(.data)
.data 0x00800100 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm162.o
.data 0x00800100 0x9 main.o
0x00800103 bottom_line
0x00800104 min_UBat
0x00800102 top_line
0x00800100 last_UBat
0x00800107 osd_fcmode
0x00800101 last_RC_Quality
0x00800105 osd_ncmode
.data 0x00800109 0x0 usart1.o
.data 0x00800109 0x0 max7456_software_spi.o
.data 0x00800109 0x7 osd_helpers.o
0x0080010a old_af_y
0x00800109 old_af_x
.data 0x00800110 0x0 config.o
.data 0x00800110 0x1 spi.o
0x00800110 spi_ready
.data 0x00800111 0x0 buttons.o
.data 0x00800111 0x1 ppm.o
.data 0x00800112 0x0 osd_ncmode_default.o
.data 0x00800112 0x0 osd_ncmode_minimal.o
.data 0x00800112 0x0 osd_fcmode_default.o
.data 0x00800112 0x0 osd_fcmode_jopl.o
.data 0x00800112 0x0 characters.o
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_mulsi3.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodhi4.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_divmodhi4.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodsi4.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_divmodsi4.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_exit.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_copy_data.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_clear_bss.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(itoa.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(eerd_byte_atmega162.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(eewr_byte_atmega162.o)
.data 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(strrev.o)
*(.data*)
*(.rodata)
*(.rodata*)
*(.gnu.linkonce.d*)
0x00800112 . = ALIGN (0x2)
0x00800112 _edata = .
0x00800112 PROVIDE (__data_end, .)
 
.bss 0x00800112 0x18f
0x00800112 PROVIDE (__bss_start, .)
*(.bss)
.bss 0x00800112 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm162.o
.bss 0x00800112 0x17 main.o
0x00800114 timer
0x0080011c COSD_FLAGS_CONFIG
0x0080011e COSD_DISPLAYMODE
0x0080011b COSD_FLAGS_MODES
0x00800121 max_GroundSpeed
0x00800112 uptime
0x0080011f max_Altimeter
0x00800119 min_voltage
0x00800118 seconds_since_last_data
0x0080011a max_voltage
0x00800127 old_MKFlags
0x00800123 max_Distance
0x00800125 max_FlyingTime
0x0080011d COSD_FLAGS_RUNTIME
0x00800116 flytime_fc
.bss 0x00800129 0xb usart1.o
0x0080012a ReceivedBytes
0x00800129 rxd_buffer_locked
0x0080012b pRxData
0x0080012d RxDataLen
.bss 0x00800134 0x0 max7456_software_spi.o
.bss 0x00800134 0x0 osd_helpers.o
.bss 0x00800134 0x0 config.o
.bss 0x00800134 0xb spi.o
0x00800139 max_ampere
0x0080013b ampere_wasted
0x00800136 request_count
0x00800134 icnt
0x00800137 ampere
.bss 0x0080013f 0x0 buttons.o
.bss 0x0080013f 0x4 ppm.o
0x0080013f old_timer1
0x00800141 ppm
.bss 0x00800143 0x0 osd_ncmode_default.o
.bss 0x00800143 0x0 osd_ncmode_minimal.o
.bss 0x00800143 0x0 osd_fcmode_default.o
.bss 0x00800143 0x4 osd_fcmode_jopl.o
.bss 0x00800147 0x0 characters.o
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_mulsi3.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodhi4.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_divmodhi4.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodsi4.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_divmodsi4.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_exit.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_copy_data.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_clear_bss.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(itoa.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(eerd_byte_atmega162.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(eewr_byte_atmega162.o)
.bss 0x00800147 0x0 c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5\libc.a(strrev.o)
*(.bss*)
*(COMMON)
COMMON 0x00800147 0xa5 main.o
0x00800147 wasted_ampere_offset
0x00800149 debugData
0x0080018b SPI_buffer
0x00800196 setsReceived
0x00800198 altimeter_offset
0x0080019a naviData
COMMON 0x008001ec 0xaa usart1.o
0x008001ec rxd_buffer
0x00800282 txd_buffer
COMMON 0x00800296 0x7 max7456_software_spi.o
0x00800296 conv_array
COMMON 0x0080029d 0x2 config.o
0x0080029d mode
COMMON 0x0080029f 0x2 spi.o
0x0080029f s_volt
0x008002a1 PROVIDE (__bss_end, .)
0x00003a28 __data_load_start = LOADADDR (.data)
0x00003a3a __data_load_end = (__data_load_start + SIZEOF (.data))
 
.noinit 0x008002a1 0x0
0x008002a1 PROVIDE (__noinit_start, .)
*(.noinit*)
0x008002a1 PROVIDE (__noinit_end, .)
0x008002a1 _end = .
0x008002a1 PROVIDE (__heap_start, .)
 
.eeprom 0x00810000 0x5
*(.eeprom*)
.eeprom 0x00810000 0x5 config.o
0x00810001 ee_checkbyte2
0x00810002 ee_COSD_FLAGS_MODES
0x00810003 ee_COSD_FLAGS_CONFIG
0x00810000 ee_checkbyte1
0x00810004 ee_COSD_DISPLAYMODE
0x00810005 __eeprom_end = .
 
.fuse
*(.fuse)
*(.lfuse)
*(.hfuse)
*(.efuse)
 
.lock
*(.lock*)
 
.signature
*(.signature*)
 
.stab
*(.stab)
 
.stabstr
*(.stabstr)
 
.stab.excl
*(.stab.excl)
 
.stab.exclstr
*(.stab.exclstr)
 
.stab.index
*(.stab.index)
 
.stab.indexstr
*(.stab.indexstr)
 
.comment
*(.comment)
 
.debug
*(.debug)
 
.line
*(.line)
 
.debug_srcinfo
*(.debug_srcinfo)
 
.debug_sfnames
*(.debug_sfnames)
 
.debug_aranges 0x00000000 0x180
*(.debug_aranges)
.debug_aranges
0x00000000 0x20 main.o
.debug_aranges
0x00000020 0x20 usart1.o
.debug_aranges
0x00000040 0x20 max7456_software_spi.o
.debug_aranges
0x00000060 0x20 osd_helpers.o
.debug_aranges
0x00000080 0x20 config.o
.debug_aranges
0x000000a0 0x20 spi.o
.debug_aranges
0x000000c0 0x20 buttons.o
.debug_aranges
0x000000e0 0x20 ppm.o
.debug_aranges
0x00000100 0x20 osd_ncmode_default.o
.debug_aranges
0x00000120 0x20 osd_ncmode_minimal.o
.debug_aranges
0x00000140 0x20 osd_fcmode_default.o
.debug_aranges
0x00000160 0x20 osd_fcmode_jopl.o
 
.debug_pubnames
0x00000000 0x245b
*(.debug_pubnames)
.debug_pubnames
0x00000000 0x36b main.o
.debug_pubnames
0x0000036b 0x320 usart1.o
.debug_pubnames
0x0000068b 0x3aa max7456_software_spi.o
.debug_pubnames
0x00000a35 0x3b0 osd_helpers.o
.debug_pubnames
0x00000de5 0x364 config.o
.debug_pubnames
0x00001149 0x2fc spi.o
.debug_pubnames
0x00001445 0x252 buttons.o
.debug_pubnames
0x00001697 0x267 ppm.o
.debug_pubnames
0x000018fe 0x24b osd_ncmode_default.o
.debug_pubnames
0x00001b49 0x24b osd_ncmode_minimal.o
.debug_pubnames
0x00001d94 0x24b osd_fcmode_default.o
.debug_pubnames
0x00001fdf 0x248 osd_fcmode_jopl.o
.debug_pubnames
0x00002227 0x234 characters.o
 
.debug_info 0x00000000 0x70a3
*(.debug_info)
.debug_info 0x00000000 0xa24 main.o
.debug_info 0x00000a24 0x8aa usart1.o
.debug_info 0x000012ce 0xd07 max7456_software_spi.o
.debug_info 0x00001fd5 0xa7c osd_helpers.o
.debug_info 0x00002a51 0xe4b config.o
.debug_info 0x0000389c 0x7a9 spi.o
.debug_info 0x00004045 0x6f4 buttons.o
.debug_info 0x00004739 0x640 ppm.o
.debug_info 0x00004d79 0x836 osd_ncmode_default.o
.debug_info 0x000055af 0x7d2 osd_ncmode_minimal.o
.debug_info 0x00005d81 0x67b osd_fcmode_default.o
.debug_info 0x000063fc 0x6c8 osd_fcmode_jopl.o
.debug_info 0x00006ac4 0x5df characters.o
*(.gnu.linkonce.wi.*)
 
.debug_abbrev 0x00000000 0x113c
*(.debug_abbrev)
.debug_abbrev 0x00000000 0x1a9 main.o
.debug_abbrev 0x000001a9 0x1b4 usart1.o
.debug_abbrev 0x0000035d 0x218 max7456_software_spi.o
.debug_abbrev 0x00000575 0x148 osd_helpers.o
.debug_abbrev 0x000006bd 0x221 config.o
.debug_abbrev 0x000008de 0x147 spi.o
.debug_abbrev 0x00000a25 0x12d buttons.o
.debug_abbrev 0x00000b52 0xf8 ppm.o
.debug_abbrev 0x00000c4a 0x11c osd_ncmode_default.o
.debug_abbrev 0x00000d66 0x11a osd_ncmode_minimal.o
.debug_abbrev 0x00000e80 0xf9 osd_fcmode_default.o
.debug_abbrev 0x00000f79 0x115 osd_fcmode_jopl.o
.debug_abbrev 0x0000108e 0xae characters.o
 
.debug_line 0x00000000 0x2b13
*(.debug_line)
.debug_line 0x00000000 0x405 main.o
.debug_line 0x00000405 0x391 usart1.o
.debug_line 0x00000796 0x6fe max7456_software_spi.o
.debug_line 0x00000e94 0x339 osd_helpers.o
.debug_line 0x000011cd 0x68d config.o
.debug_line 0x0000185a 0x19b spi.o
.debug_line 0x000019f5 0x1a0 buttons.o
.debug_line 0x00001b95 0x14e ppm.o
.debug_line 0x00001ce3 0x56f osd_ncmode_default.o
.debug_line 0x00002252 0x3a4 osd_ncmode_minimal.o
.debug_line 0x000025f6 0x213 osd_fcmode_default.o
.debug_line 0x00002809 0x271 osd_fcmode_jopl.o
.debug_line 0x00002a7a 0x99 characters.o
 
.debug_frame 0x00000000 0x430
*(.debug_frame)
.debug_frame 0x00000000 0x40 main.o
.debug_frame 0x00000040 0x90 usart1.o
.debug_frame 0x000000d0 0x120 max7456_software_spi.o
.debug_frame 0x000001f0 0x80 osd_helpers.o
.debug_frame 0x00000270 0x80 config.o
.debug_frame 0x000002f0 0x60 spi.o
.debug_frame 0x00000350 0x30 buttons.o
.debug_frame 0x00000380 0x30 ppm.o
.debug_frame 0x000003b0 0x20 osd_ncmode_default.o
.debug_frame 0x000003d0 0x20 osd_ncmode_minimal.o
.debug_frame 0x000003f0 0x20 osd_fcmode_default.o
.debug_frame 0x00000410 0x20 osd_fcmode_jopl.o
 
.debug_str 0x00000000 0xc43
*(.debug_str)
.debug_str 0x00000000 0x535 main.o
0x61f (size before relaxing)
.debug_str 0x00000535 0xe9 usart1.o
0x57a (size before relaxing)
.debug_str 0x0000061e 0x19b max7456_software_spi.o
0x662 (size before relaxing)
.debug_str 0x000007b9 0x196 osd_helpers.o
0x620 (size before relaxing)
.debug_str 0x0000094f 0x154 config.o
0x635 (size before relaxing)
.debug_str 0x00000aa3 0x6d spi.o
0x549 (size before relaxing)
.debug_str 0x00000b10 0x23 buttons.o
0x4c2 (size before relaxing)
.debug_str 0x00000b33 0x38 ppm.o
0x49d (size before relaxing)
.debug_str 0x00000b6b 0x38 osd_ncmode_default.o
0x4db (size before relaxing)
.debug_str 0x00000ba3 0x2b osd_ncmode_minimal.o
0x4d4 (size before relaxing)
.debug_str 0x00000bce 0x2b osd_fcmode_default.o
0x4ac (size before relaxing)
.debug_str 0x00000bf9 0x3a osd_fcmode_jopl.o
0x4cd (size before relaxing)
.debug_str 0x00000c33 0x10 characters.o
0x475 (size before relaxing)
 
.debug_loc 0x00000000 0x1c20
*(.debug_loc)
.debug_loc 0x00000000 0x30 main.o
.debug_loc 0x00000030 0x146 usart1.o
.debug_loc 0x00000176 0xcb1 max7456_software_spi.o
.debug_loc 0x00000e27 0x632 osd_helpers.o
.debug_loc 0x00001459 0x3ef config.o
.debug_loc 0x00001848 0x18 spi.o
.debug_loc 0x00001860 0x60 buttons.o
.debug_loc 0x000018c0 0x1b0 osd_ncmode_default.o
.debug_loc 0x00001a70 0x180 osd_ncmode_minimal.o
.debug_loc 0x00001bf0 0x30 osd_fcmode_jopl.o
 
.debug_macinfo
*(.debug_macinfo)
OUTPUT(C-OSD.elf elf32-avr)
LOAD linker stubs
 
.debug_ranges 0x00000000 0x138
.debug_ranges 0x00000000 0x18 usart1.o
.debug_ranges 0x00000018 0x78 max7456_software_spi.o
.debug_ranges 0x00000090 0x48 config.o
.debug_ranges 0x000000d8 0x48 osd_ncmode_default.o
.debug_ranges 0x00000120 0x18 osd_ncmode_minimal.o
/C-OSD/trunk/default/dep/buttons.o.d
0,0 → 1,48
buttons.o: ../buttons.c \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h \
../main.h c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
../mk-data-structs.h
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h:
 
../main.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
../mk-data-structs.h:
/C-OSD/trunk/default/dep/characters.o.d
0,0 → 1,50
characters.o: ../characters.c \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h \
../main.h ../mk-data-structs.h ../max7456_software_spi.h
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h:
 
../main.h:
 
../mk-data-structs.h:
 
../max7456_software_spi.h:
/C-OSD/trunk/default/dep/config.o.d
0,0 → 1,63
config.o: ../config.c \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/eeprom.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/interrupt.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h \
../max7456_software_spi.h ../config.h ../main.h ../mk-data-structs.h \
../buttons.h ../usart1.h
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/eeprom.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/interrupt.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h:
 
../max7456_software_spi.h:
 
../config.h:
 
../main.h:
 
../mk-data-structs.h:
 
../buttons.h:
 
../usart1.h:
/C-OSD/trunk/default/dep/main.o.d
0,0 → 1,75
main.o: ../main.c c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/interrupt.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h ../main.h \
../mk-data-structs.h ../max7456_software_spi.h ../usart1.h \
../osd_helpers.h ../config.h ../spi.h ../buttons.h ../ppm.h \
../osd_ncmode_default.h ../osd_ncmode_minimal.h ../osd_fcmode_default.h \
../osd_fcmode_jopl.h
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/interrupt.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
../main.h:
 
../mk-data-structs.h:
 
../max7456_software_spi.h:
 
../usart1.h:
 
../osd_helpers.h:
 
../config.h:
 
../spi.h:
 
../buttons.h:
 
../ppm.h:
 
../osd_ncmode_default.h:
 
../osd_ncmode_minimal.h:
 
../osd_fcmode_default.h:
 
../osd_fcmode_jopl.h:
/C-OSD/trunk/default/dep/max7456_software_spi.o.d
0,0 → 1,56
max7456_software_spi.o: ../max7456_software_spi.c \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
c:/winavr-20100110/lib/gcc/../../avr/include/string.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdlib.h ../main.h \
../mk-data-structs.h ../max7456_software_spi.h
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/string.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdlib.h:
 
../main.h:
 
../mk-data-structs.h:
 
../max7456_software_spi.h:
/C-OSD/trunk/default/dep/osd_fcmode_default.o.d
0,0 → 1,49
osd_fcmode_default.o: ../osd_fcmode_default.c ../main.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
../mk-data-structs.h ../max7456_software_spi.h ../osd_helpers.h \
../osd_fcmode_default.h
 
../main.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
../mk-data-structs.h:
 
../max7456_software_spi.h:
 
../osd_helpers.h:
 
../osd_fcmode_default.h:
/C-OSD/trunk/default/dep/osd_fcmode_jopl.o.d
0,0 → 1,49
osd_fcmode_jopl.o: ../osd_fcmode_jopl.c ../main.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
../mk-data-structs.h ../max7456_software_spi.h ../osd_helpers.h \
../osd_fcmode_default.h
 
../main.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
../mk-data-structs.h:
 
../max7456_software_spi.h:
 
../osd_helpers.h:
 
../osd_fcmode_default.h:
/C-OSD/trunk/default/dep/osd_helpers.o.d
0,0 → 1,46
osd_helpers.o: ../osd_helpers.c \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h ../main.h \
../mk-data-structs.h ../osd_helpers.h ../max7456_software_spi.h
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
../main.h:
 
../mk-data-structs.h:
 
../osd_helpers.h:
 
../max7456_software_spi.h:
/C-OSD/trunk/default/dep/osd_ncmode_default.o.d
0,0 → 1,49
osd_ncmode_default.o: ../osd_ncmode_default.c ../main.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
../mk-data-structs.h ../max7456_software_spi.h ../osd_helpers.h \
../osd_ncmode_default.h
 
../main.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
../mk-data-structs.h:
 
../max7456_software_spi.h:
 
../osd_helpers.h:
 
../osd_ncmode_default.h:
/C-OSD/trunk/default/dep/osd_ncmode_minimal.o.d
0,0 → 1,49
osd_ncmode_minimal.o: ../osd_ncmode_minimal.c ../main.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
../mk-data-structs.h ../max7456_software_spi.h ../osd_helpers.h \
../osd_ncmode_default.h
 
../main.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
../mk-data-structs.h:
 
../max7456_software_spi.h:
 
../osd_helpers.h:
 
../osd_ncmode_default.h:
/C-OSD/trunk/default/dep/ppm.o.d
0,0 → 1,48
ppm.o: ../ppm.c c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/interrupt.h ../ppm.h \
../main.h c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
../mk-data-structs.h ../max7456_software_spi.h
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/interrupt.h:
 
../ppm.h:
 
../main.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
../mk-data-structs.h:
 
../max7456_software_spi.h:
/C-OSD/trunk/default/dep/spi.o.d
0,0 → 1,46
spi.o: ../spi.c c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/interrupt.h ../spi.h \
../main.h c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
../mk-data-structs.h
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/interrupt.h:
 
../spi.h:
 
../main.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
../mk-data-structs.h:
/C-OSD/trunk/default/dep/usart1.o.d
0,0 → 1,53
usart1.o: ../usart1.c \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h \
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h \
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h \
c:/winavr-20100110/lib/gcc/../../avr/include/avr/interrupt.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h \
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h \
../main.h c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h \
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h \
../mk-data-structs.h ../usart1.h
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/io.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/sfr_defs.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/inttypes.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/stdint.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/iom162.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/portpins.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/common.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/version.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/fuse.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/lock.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/interrupt.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/util/delay_basic.h:
 
../main.h:
 
c:/winavr-20100110/lib/gcc/../../avr/include/avr/pgmspace.h:
 
c:\winavr-20100110\bin\../lib/gcc/avr/4.3.3/include/stddef.h:
 
../mk-data-structs.h:
 
../usart1.h: